Passed
Pull Request — feature/ECO-948-renaming-and-r... (#7)
by Andrey
04:36 queued 01:50
created

PaymentController::confirmPurchaseAction()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 32
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 17
nc 5
nop 1
dl 0
loc 32
rs 8.439
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;
11
use Generated\Shared\Transfer\QuoteTransfer;
12
use Spryker\Shared\Config\Config;
13
use Spryker\Yves\Kernel\Controller\AbstractController;
14
use SprykerEco\Shared\AmazonPay\AmazonPayConfig;
15
use SprykerEco\Shared\AmazonPay\AmazonPayConstants;
16
use SprykerEco\Yves\AmazonPay\Plugin\Provider\AmazonPayControllerProvider;
17
use Symfony\Component\HttpFoundation\JsonResponse;
18
use Symfony\Component\HttpFoundation\Request;
19
20
/**
21
 * @method \SprykerEco\Client\AmazonPay\AmazonPayClientInterface getClient()
22
 * @method \SprykerEco\Yves\AmazonPay\AmazonPayFactory getFactory()
23
 */
24
class PaymentController extends AbstractController
25
{
26
    const URL_PARAM_REFERENCE_ID = 'reference_id';
27
    const URL_PARAM_ACCESS_TOKEN = 'access_token';
28
    const URL_PARAM_SHIPMENT_METHOD_ID = 'shipment_method_id';
29
    const QUOTE_TRANSFER = 'quoteTransfer';
30
    const SHIPMENT_METHODS = 'shipmentMethods';
31
    const AMAZONPAY_CONFIG = 'amazonpayConfig';
32
    const IS_ASYNCHRONOUS = 'isAsynchronous';
33
    const CART_ITEMS = 'cartItems';
34
    const SUCCESS = 'success';
35
    const ERROR_AMAZONPAY_PAYMENT_FAILED = 'amazonpay.payment.failed';
36
37
    /**
38
     * @param \Symfony\Component\HttpFoundation\Request $request
39
     *
40
     * @return array|\Symfony\Component\HttpFoundation\Response
41
     */
42
    public function checkoutAction(Request $request)
43
    {
44
        $quoteTransfer = $this->getFactory()
45
            ->getQuoteClient()
46
            ->getQuote();
47
48
        if (!$this->isAllowedCheckout($quoteTransfer) || !$this->isRequestComplete($request)) {
49
            return $this->getFailedRedirectResponse();
50
        }
51
52
        $amazonPaymentTransfer = $this->buildAmazonPaymentTransfer($request);
53
54
        $quoteTransfer->setAmazonpayPayment($amazonPaymentTransfer);
55
        $quoteTransfer = $this->getClient()
56
            ->handleCartWithAmazonPay($quoteTransfer);
57
        $this->getFactory()
58
            ->getQuoteClient()
59
            ->setQuote($quoteTransfer);
60
61
        return [
62
            static::QUOTE_TRANSFER => $quoteTransfer,
63
            static::CART_ITEMS => $this->getCartItems($quoteTransfer),
64
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
65
        ];
66
    }
67
68
    /**
69
     * @param \Symfony\Component\HttpFoundation\Request $request
70
     *
71
     * @return \Symfony\Component\HttpFoundation\Response
72
     */
73
    public function setOrderReferenceAction(Request $request)
74
    {
75
        $quoteTransfer = $this->getFactory()
76
            ->getQuoteClient()
77
            ->getQuote();
78
79
        if (!$this->isAmazonPayment($quoteTransfer)) {
80
            return $this->getFailedRedirectResponse();
81
        }
82
83
        $quoteTransfer->getAmazonpayPayment()
84
            ->setOrderReferenceId(
85
                $request->request->get(static::URL_PARAM_REFERENCE_ID)
86
            );
87
88
        return new JsonResponse([static::SUCCESS => true]);
89
    }
90
91
    /**
92
     * @return array|\Symfony\Component\HttpFoundation\Response
93
     */
94
    public function getShipmentMethodsAction()
95
    {
96
        $quoteTransfer = $this->getFactory()
97
            ->getQuoteClient()
98
            ->getQuote();
99
100
        if (!$this->isAmazonPayment($quoteTransfer)) {
101
            return $this->getFailedRedirectResponse();
102
        }
103
104
        $quoteTransfer = $this->getClient()
105
            ->addSelectedAddressToQuote($quoteTransfer);
106
        $this->getFactory()
107
            ->getQuoteClient()
108
            ->setQuote($quoteTransfer);
109
        $shipmentMethods = $this->getFactory()
110
            ->getShipmentClient()
111
            ->getAvailableMethods($quoteTransfer);
112
113
        return [
114
            static::SHIPMENT_METHODS => $shipmentMethods->getMethods(),
115
        ];
116
    }
117
118
    /**
119
     * @param \Symfony\Component\HttpFoundation\Request $request
120
     *
121
     * @return array|\Symfony\Component\HttpFoundation\RedirectResponse
122
     */
123
    public function updateShipmentMethodAction(Request $request)
124
    {
125
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
126
127
        if (!$this->isAmazonPayment($quoteTransfer)) {
128
            return $this->getFailedRedirectResponse();
129
        }
130
131
        $quoteTransfer->getShipment()->setShipmentSelection(
132
            $request->request->get(static::URL_PARAM_SHIPMENT_METHOD_ID)
133
        );
134
        $quoteTransfer = $this->getClient()
135
            ->addSelectedShipmentMethodToQuote($quoteTransfer);
136
        $quoteTransfer = $this->getFactory()
137
            ->getCalculationClient()->recalculate($quoteTransfer);
138
        $this->getFactory()
139
            ->getQuoteClient()
140
            ->setQuote($quoteTransfer);
141
142
        return [
143
            static::QUOTE_TRANSFER => $quoteTransfer,
144
        ];
145
    }
146
147
    /**
148
     * @param \Symfony\Component\HttpFoundation\Request $request
149
     *
150
     * @return \Symfony\Component\HttpFoundation\Response
151
     */
152
    public function confirmPurchaseAction(Request $request)
153
    {
154
        $quoteTransfer = $this->getFactory()->getQuoteClient()->getQuote();
155
156
        if (!$this->isAmazonPayment($quoteTransfer)) {
157
            return $this->getFailedRedirectResponse();
158
        }
159
160
        $quoteTransfer = $this->getClient()->confirmPurchase($quoteTransfer);
161
162
        if ($quoteTransfer->getAmazonpayPayment()
163
            ->getAuthorizationDetails()
164
            ->getAuthorizationStatus()
165
            ->getState() === AmazonPayConfig::STATUS_PAYMENT_METHOD_INVALID
166
        ) {
167
            return $this->redirectResponseInternal(AmazonPayControllerProvider::CHECKOUT);
168
        }
169
170
        if (!$quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getIsSuccess()) {
171
            return $this->getRedirectForError($quoteTransfer, $request);
172
        }
173
174
        $quoteTransfer = $this->getFactory()->getCalculationClient()->recalculate($quoteTransfer);
175
        $this->getFactory()->getQuoteClient()->setQuote($quoteTransfer);
176
177
        $checkoutResponseTransfer = $this->getFactory()->getCheckoutClient()->placeOrder($quoteTransfer);
178
179
        if ($checkoutResponseTransfer->getIsSuccess()) {
180
            return $this->redirectResponseInternal(AmazonPayControllerProvider::SUCCESS);
181
        }
182
183
        return $this->getFailedRedirectResponse();
184
    }
185
186
    /**
187
     * @param \Symfony\Component\HttpFoundation\Request $request
188
     *
189
     * @return array
190
     */
191
    public function successAction(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

191
    public function successAction(/** @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...
192
    {
193
        $this->getFactory()->getQuoteClient()->clearQuote();
194
195
        return [
196
            static::IS_ASYNCHRONOUS => $this->isAsynchronous(),
197
            static::AMAZONPAY_CONFIG => $this->getAmazonPayConfig(),
198
        ];
199
    }
200
201
    /**
202
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
203
     *
204
     * @return \ArrayObject|\Generated\Shared\Transfer\ItemTransfer[]
205
     */
206
    protected function getCartItems(QuoteTransfer $quoteTransfer)
207
    {
208
        return $quoteTransfer->getItems();
209
    }
210
211
    /**
212
     * @param \Symfony\Component\HttpFoundation\Request $request
213
     *
214
     * @return bool
215
     */
216
    protected function isRequestComplete(Request $request)
217
    {
218
        return $request->query->get(static::URL_PARAM_REFERENCE_ID) !== null &&
219
        $request->query->get(static::URL_PARAM_ACCESS_TOKEN) !== null;
220
    }
221
222
    /**
223
     * @param \Symfony\Component\HttpFoundation\Request $request
224
     *
225
     * @return \Generated\Shared\Transfer\AmazonpayPaymentTransfer
226
     */
227
    protected function buildAmazonPaymentTransfer(Request $request)
228
    {
229
        $amazonPaymentTransfer = new AmazonpayPaymentTransfer();
230
        $amazonPaymentTransfer->setOrderReferenceId($request->query->get(static::URL_PARAM_REFERENCE_ID));
231
        $amazonPaymentTransfer->setAddressConsentToken($request->query->get(static::URL_PARAM_ACCESS_TOKEN));
232
233
        return $amazonPaymentTransfer;
234
    }
235
236
    /**
237
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
238
     *
239
     * @return bool
240
     */
241
    protected function isAllowedCheckout(QuoteTransfer $quoteTransfer)
242
    {
243
        return $quoteTransfer->getTotals() !== null;
244
    }
245
246
    /**
247
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
248
     * @param \Symfony\Component\HttpFoundation\Request $request
249
     *
250
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
251
     */
252
    protected function getRedirectForError(QuoteTransfer $quoteTransfer, Request $request)
253
    {
254
        $this->addErrorMessage(
255
            $this->getErrorMessageFromQuote($quoteTransfer)
256
        );
257
258
        return $this->redirectResponseExternal($request->headers->get('Referer'));
259
    }
260
261
    /**
262
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
263
     *
264
     * @return bool
265
     */
266
    protected function isAmazonPayment(QuoteTransfer $quoteTransfer)
267
    {
268
        return $quoteTransfer->getAmazonpayPayment() !== null;
269
    }
270
271
    /**
272
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
273
     *
274
     * @return string
275
     */
276
    protected function getErrorMessageFromQuote(QuoteTransfer $quoteTransfer)
277
    {
278
        return $quoteTransfer->getAmazonpayPayment()->getResponseHeader()->getErrorMessage()
279
                ?? static::ERROR_AMAZONPAY_PAYMENT_FAILED;
280
    }
281
282
    /**
283
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
284
     */
285
    protected function getFailedRedirectResponse()
286
    {
287
        $this->addErrorMessage(static::ERROR_AMAZONPAY_PAYMENT_FAILED);
288
289
        return $this->redirectResponseInternal($this->getPaymentRejectRoute());
290
    }
291
292
    /**
293
     * @return string
294
     */
295
    protected function getPaymentRejectRoute()
296
    {
297
        return Config::get(AmazonPayConstants::PAYMENT_REJECT_ROUTE);
298
    }
299
300
    protected function isAsynchronous()
301
    {
302
        return $this->getAmazonPayConfig()->getAuthTransactionTimeout() > 0
303
            && !$this->getAmazonPayConfig()->getCaptureNow();
304
    }
305
306
    /**
307
     * @return \SprykerEco\Shared\AmazonPay\AmazonPayConfigInterface
308
     */
309
    protected function getAmazonPayConfig()
310
    {
311
        return $this->getFactory()->createAmazonPayConfig();
312
    }
313
}
314