ApplePayDirectApiOrderPaymentResolver   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 81
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 49
c 1
b 0
f 0
dl 0
loc 81
rs 10
wmc 7

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 1
B resolve() 0 55 6
1
<?php
2
3
/*
4
 * This file has been created by developers from BitBag.
5
 * Feel free to contact us once you face any issues or want to start
6
 * You can find more information about us on https://bitbag.io and write us
7
 * an email on [email protected].
8
 */
9
10
declare(strict_types=1);
11
12
namespace BitBag\SyliusMolliePlugin\Resolver\ApplePayDirect;
13
14
use BitBag\SyliusMolliePlugin\Client\MollieApiClient;
15
use BitBag\SyliusMolliePlugin\Entity\MollieGatewayConfigInterface;
16
use BitBag\SyliusMolliePlugin\Entity\OrderInterface;
17
use BitBag\SyliusMolliePlugin\Helper\ConvertOrderInterface;
18
use BitBag\SyliusMolliePlugin\Payments\PaymentTerms\Options;
19
use BitBag\SyliusMolliePlugin\Provider\Order\OrderPaymentApplePayDirectProvider;
20
use BitBag\SyliusMolliePlugin\Resolver\MollieApiClientKeyResolverInterface;
21
use Mollie\Api\Exceptions\ApiException;
22
use Mollie\Api\Types\OrderStatus;
23
use Mollie\Api\Types\PaymentMethod;
24
use Sylius\Component\Core\Model\PaymentInterface;
25
26
final class ApplePayDirectApiOrderPaymentResolver implements ApplePayDirectApiOrderPaymentResolverInterface
27
{
28
    /** @var MollieApiClient */
29
    private $mollieApiClient;
30
31
    /** @var MollieApiClientKeyResolverInterface */
32
    private $apiClientKeyResolver;
33
34
    /** @var ConvertOrderInterface */
35
    private $convertOrder;
36
37
    /** @var OrderPaymentApplePayDirectProvider */
38
    private $paymentApplePayDirectProvider;
39
40
    public function __construct(
41
        MollieApiClient $mollieApiClient,
42
        MollieApiClientKeyResolverInterface $apiClientKeyResolver,
43
        ConvertOrderInterface $convertOrder,
44
        OrderPaymentApplePayDirectProvider $paymentApplePayDirectProvider
45
    ) {
46
        $this->mollieApiClient = $mollieApiClient;
47
        $this->apiClientKeyResolver = $apiClientKeyResolver;
48
        $this->convertOrder = $convertOrder;
49
        $this->paymentApplePayDirectProvider = $paymentApplePayDirectProvider;
50
    }
51
52
    public function resolve(OrderInterface $order, MollieGatewayConfigInterface $mollieGatewayConfig, array $details): void
53
    {
54
        $this->apiClientKeyResolver->getClientWithKey();
55
        $details = $this->convertOrder->convert($order, $details, 100, $mollieGatewayConfig);
56
        $customer = $order->getCustomer();
57
58
        $orderExpiredTime = $mollieGatewayConfig->getOrderExpiration();
59
        if (null !== $orderExpiredTime) {
60
            $interval = new \DateInterval('P' . $orderExpiredTime . 'D');
61
            $dateExpired = new \DateTimeImmutable('now');
62
            $dateExpired = $dateExpired->add($interval);
63
        }
64
65
        /** @var PaymentInterface $payment */
66
        $payment = $order->getLastPayment();
67
        $refundToken = $payment->getDetails()['refund_token'];
68
69
        $metadata = [
70
            'order_id' => $order->getId(),
71
            'customer_id' => null !== $customer ? $customer->getId() : null,
72
            'molliePaymentMethods' => PaymentMethod::APPLEPAY,
73
            'refund_token' => $refundToken,
74
            'methodType' => Options::ORDER_API,
75
        ];
76
77
        try {
78
            $response = $this->mollieApiClient->orders->create(
79
                [
80
                    'method' => PaymentMethod::APPLEPAY,
81
                    'payment' => [
82
                        'applePayPaymentToken' => $details['applePayDirectToken'],
83
                    ],
84
                    'amount' => $details['amount'],
85
                    'billingAddress' => $details['billingAddress'],
86
                    'shippingAddress' => $details['shippingAddress'],
87
                    'locale' => $order->getLocaleCode(),
88
                    'orderNumber' => $details['orderNumber'],
89
                    'redirectUrl' => $details['backurl'],
90
                    'lines' => $details['lines'],
91
                    'metadata' => $metadata,
92
                    'expiresAt' => isset($dateExpired) ?
93
                        $dateExpired->format('Y-m-d') :
94
                        (new \DateTimeImmutable('now'))->format('Y-m-d'),
95
                ]
96
            );
97
            if ($response->status === OrderStatus::STATUS_PAID) {
98
                $this->paymentApplePayDirectProvider->applyRequiredTransition($payment, PaymentInterface::STATE_COMPLETED);
99
100
                $paymentDetails = $payment->getDetails();
101
                $paymentDetails['order_mollie_id'] = $response->id;
102
                $paymentDetails['metadata'] = $metadata;
103
                $payment->setDetails($paymentDetails);
104
            }
105
        } catch (ApiException $e) {
106
            throw new ApiException($e->getMessage());
107
        }
108
    }
109
}
110