Completed
Push — master ( c55f61...fd7370 )
by Joachim
16:23
created

PaymentHandler   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 105
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 10

Importance

Changes 0
Metric Value
wmc 14
c 0
b 0
f 0
lcom 1
cbo 10
dl 0
loc 105
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A capture() 0 15 3
C refund() 0 47 8
A updatePaymentFromTransactions() 0 11 2
1
<?php
2
3
namespace Loevgaard\DandomainAltapayBundle\Handler;
4
5
use Loevgaard\AltaPay\Client;
6
use Loevgaard\AltaPay\Entity\Transaction;
7
use Loevgaard\AltaPay\Payload\CaptureReservation as CaptureReservationPayload;
8
use Loevgaard\AltaPay\Payload\OrderLine;
9
use Loevgaard\AltaPay\Payload\RefundCapturedReservation as RefundCapturedReservationPayload;
10
use Loevgaard\AltaPay\Response\RefundCapturedReservation as RefundCapturedReservationResponse;
11
use Loevgaard\DandomainAltapayBundle\Entity\Payment;
12
use Loevgaard\DandomainAltapayBundle\Entity\PaymentLine;
13
use Loevgaard\DandomainAltapayBundle\Manager\PaymentManager;
14
15
class PaymentHandler
16
{
17
    /**
18
     * @var Client
19
     */
20
    private $altapayClient;
21
22
    /**
23
     * @var PaymentManager
24
     */
25
    private $paymentManager;
26
27
    public function __construct(Client $client, PaymentManager $paymentManager)
28
    {
29
        $this->altapayClient = $client;
30
        $this->paymentManager = $paymentManager;
31
    }
32
33
    public function capture(Payment $payment, float $amount = null)
34
    {
35
        $payload = new CaptureReservationPayload($payment->getAltapayId());
36
        if ($amount) {
37
            $payload->setAmount($amount);
38
        }
39
40
        $res = $this->altapayClient->captureReservation($payload);
41
42
        if ($res->isSuccessful()) {
43
            $this->updatePaymentFromTransactions($payment, $res->getTransactions());
44
        }
45
46
        return $res;
47
    }
48
49
    /**
50
     * @param Payment            $payment      The payment to refund
51
     * @param PaymentLine[]|null $paymentLines The payment lines to refund
52
     * @param float|null         $amount       The amount to refund
53
     *
54
     * @return RefundCapturedReservationResponse
55
     */
56
    public function refund(Payment $payment, array $paymentLines = null, float $amount = null)
57
    {
58
        $payload = new RefundCapturedReservationPayload($payment->getAltapayId());
59
60
        if ($amount) {
61
            $payload->setAmount($amount);
62
        }
63
64
        if ($paymentLines && count($paymentLines)) {
65
            $paymentLinesAmountInclVat = 0;
66
67
            foreach ($paymentLines as $paymentLine) {
68
                $orderLine = new OrderLine(
69
                    $paymentLine->getName(),
70
                    $paymentLine->getProductNumber(),
71
                    $paymentLine->getQuantity(),
72
                    $paymentLine->getPriceInclVat()
73
                );
74
                $orderLine->setTaxPercent($paymentLine->getVat());
75
76
                $payload->addOrderLine($orderLine);
77
78
                $paymentLinesAmountInclVat += $paymentLine->getPriceInclVat();
79
            }
80
81
            /*
82
             * If the amount is set, but does not match the payment lines amount we have to
83
             * make a 'good will' refund which according to Altapay is made by adding an order line
84
             * with goods type equals 'refund' and the amount has to equal the refund amount including vat
85
             */
86
            if ($amount && $amount !== $paymentLinesAmountInclVat) {
87
                $orderLine = new OrderLine('refund', 'refund', 1, $amount);
88
                $orderLine->setGoodsType(OrderLine::GOODS_TYPE_REFUND);
89
90
                // this effectively removes already added order lines and adds the 'refund' order line
91
                $payload->setOrderLines([$orderLine]);
92
            }
93
        }
94
95
        $res = $this->altapayClient->refundCapturedReservation($payload);
96
97
        if ($res->isSuccessful()) {
98
            $this->updatePaymentFromTransactions($payment, $res->getTransactions());
99
        }
100
101
        return $res;
102
    }
103
104
    /**
105
     * @param Payment       $payment
106
     * @param Transaction[] $transactions
107
     */
108
    private function updatePaymentFromTransactions(Payment $payment, array $transactions)
109
    {
110
        if (count($transactions)) {
111
            $transaction = $transactions[0];
112
113
            $payment->setCapturedAmount($transaction->getCapturedAmount());
114
            $payment->setRefundedAmount($transaction->getRefundedAmount());
115
116
            $this->paymentManager->update($payment);
117
        }
118
    }
119
}
120