CancelTransactionHandler   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 152
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 37
c 1
b 0
f 1
dl 0
loc 152
rs 10
wmc 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 12 1
A cancel() 0 11 2
A buildCancelRequestForOrderItem() 0 13 2
A addExpensesToCancelRequest() 0 5 1
A getPaymentTransferForItem() 0 3 1
A updateOrderPayment() 0 13 2
A isExpenseShouldBeCancelled() 0 14 1
1
<?php
2
3
/**
4
 * MIT License
5
 * For full license information, please view the LICENSE file that was distributed with this source code.
6
 */
7
8
namespace SprykerEco\Zed\AfterPay\Business\Payment\Transaction\Handler;
9
10
use Generated\Shared\Transfer\AfterPayCallTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\AfterPayCallTransfer 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\AfterPayCancelRequestTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...ayCancelRequestTransfer 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\AfterPayCancelResponseTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...yCancelResponseTransfer 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\AfterPayPaymentTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\AfterPayPaymentTransfer 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 SprykerEco\Zed\AfterPay\Business\Payment\PaymentReaderInterface;
15
use SprykerEco\Zed\AfterPay\Business\Payment\PaymentWriterInterface;
16
use SprykerEco\Zed\AfterPay\Business\Payment\Transaction\Cancel\CancelRequestBuilderInterface;
17
use SprykerEco\Zed\AfterPay\Business\Payment\Transaction\CancelTransactionInterface;
18
use SprykerEco\Zed\AfterPay\Dependency\Facade\AfterPayToMoneyFacadeInterface;
19
20
class CancelTransactionHandler implements CancelTransactionHandlerInterface
21
{
22
    /**
23
     * @var \SprykerEco\Zed\AfterPay\Business\Payment\Transaction\CancelTransactionInterface
24
     */
25
    protected $transaction;
26
27
    /**
28
     * @var \SprykerEco\Zed\AfterPay\Business\Payment\PaymentReaderInterface
29
     */
30
    protected $paymentReader;
31
32
    /**
33
     * @var \SprykerEco\Zed\AfterPay\Business\Payment\Transaction\Cancel\CancelRequestBuilderInterface
34
     */
35
    protected $cancelRequestBuilder;
36
37
    /**
38
     * @var \SprykerEco\Zed\AfterPay\Business\Payment\PaymentWriterInterface
39
     */
40
    protected $paymentWriter;
41
42
    /**
43
     * @var \SprykerEco\Zed\AfterPay\Dependency\Facade\AfterPayToMoneyFacadeInterface
44
     */
45
    protected $money;
46
47
    /**
48
     * @param \SprykerEco\Zed\AfterPay\Business\Payment\Transaction\CancelTransactionInterface $transaction
49
     * @param \SprykerEco\Zed\AfterPay\Business\Payment\PaymentReaderInterface $paymentReader
50
     * @param \SprykerEco\Zed\AfterPay\Business\Payment\PaymentWriterInterface $paymentWriter
51
     * @param \SprykerEco\Zed\AfterPay\Dependency\Facade\AfterPayToMoneyFacadeInterface $money
52
     * @param \SprykerEco\Zed\AfterPay\Business\Payment\Transaction\Cancel\CancelRequestBuilderInterface $cancelRequestBuilder
53
     */
54
    public function __construct(
55
        CancelTransactionInterface $transaction,
56
        PaymentReaderInterface $paymentReader,
57
        PaymentWriterInterface $paymentWriter,
58
        AfterPayToMoneyFacadeInterface $money,
59
        CancelRequestBuilderInterface $cancelRequestBuilder
60
    ) {
61
        $this->transaction = $transaction;
62
        $this->paymentReader = $paymentReader;
63
        $this->cancelRequestBuilder = $cancelRequestBuilder;
64
        $this->paymentWriter = $paymentWriter;
65
        $this->money = $money;
66
    }
67
68
    /**
69
     * @param array<\Generated\Shared\Transfer\ItemTransfer> $items
70
     * @param \Generated\Shared\Transfer\AfterPayCallTransfer $afterPayCallTransfer
71
     *
72
     * @return void
73
     */
74
    public function cancel(array $items, AfterPayCallTransfer $afterPayCallTransfer): void
75
    {
76
        $paymentTransfer = $this->getPaymentTransferForItem($afterPayCallTransfer);
77
        $cancelRequestTransfer = $this->buildCancelRequestForOrderItem($items, $afterPayCallTransfer);
78
79
        if ($this->isExpenseShouldBeCancelled($cancelRequestTransfer, $paymentTransfer)) {
80
            $this->addExpensesToCancelRequest($paymentTransfer->getExpenseTotal(), $cancelRequestTransfer);
81
        }
82
83
        $cancelResponseTransfer = $this->transaction->executeTransaction($cancelRequestTransfer);
84
        $this->updateOrderPayment($cancelRequestTransfer, $cancelResponseTransfer);
85
    }
86
87
    /**
88
     * @param array<\Generated\Shared\Transfer\ItemTransfer> $items
89
     * @param \Generated\Shared\Transfer\AfterPayCallTransfer $afterPayCallTransfer
90
     *
91
     * @return \Generated\Shared\Transfer\AfterPayCancelRequestTransfer
92
     */
93
    protected function buildCancelRequestForOrderItem(
94
        array $items,
95
        AfterPayCallTransfer $afterPayCallTransfer
96
    ): AfterPayCancelRequestTransfer {
97
        $cancelRequestTransfer = $this->cancelRequestBuilder->buildBaseCancelRequestForOrder($afterPayCallTransfer);
98
99
        foreach ($items as $itemTransfer) {
100
            $this->cancelRequestBuilder->addOrderItemToCancelRequest($itemTransfer, $cancelRequestTransfer);
101
        }
102
103
        $cancelRequestTransfer->setIdSalesOrder($afterPayCallTransfer->getIdSalesOrder());
104
105
        return $cancelRequestTransfer;
106
    }
107
108
    /**
109
     * @param \Generated\Shared\Transfer\AfterPayCancelRequestTransfer $cancelRequestTransfer
110
     * @param \Generated\Shared\Transfer\AfterPayPaymentTransfer $paymentTransfer
111
     *
112
     * @return bool
113
     */
114
    protected function isExpenseShouldBeCancelled(
115
        AfterPayCancelRequestTransfer $cancelRequestTransfer,
116
        AfterPayPaymentTransfer $paymentTransfer
117
    ): bool {
118
        $amountAuthorized = $paymentTransfer->getAuthorizedTotal();
119
120
        $amountToCancel = $this->money->convertDecimalToInteger(
121
            (float)$cancelRequestTransfer->getCancellationDetails()->getTotalGrossAmount(),
122
        );
123
        $amountCancelled = $paymentTransfer->getCancelledTotal();
124
        $expenseTotal = $paymentTransfer->getExpenseTotal();
125
        $capturedTotal = $paymentTransfer->getCapturedTotal();
126
127
        return $amountToCancel + $amountCancelled + $expenseTotal + $capturedTotal === $amountAuthorized;
128
    }
129
130
    /**
131
     * @param int $expenseTotal
132
     * @param \Generated\Shared\Transfer\AfterPayCancelRequestTransfer $cancelRequestTransfer
133
     *
134
     * @return void
135
     */
136
    protected function addExpensesToCancelRequest(
137
        int $expenseTotal,
138
        AfterPayCancelRequestTransfer $cancelRequestTransfer
139
    ): void {
140
        $this->cancelRequestBuilder->addOrderExpenseToCancelRequest($expenseTotal, $cancelRequestTransfer);
141
    }
142
143
    /**
144
     * @param \Generated\Shared\Transfer\AfterPayCallTransfer $afterPayCallTransfer
145
     *
146
     * @return \Generated\Shared\Transfer\AfterPayPaymentTransfer
147
     */
148
    protected function getPaymentTransferForItem(AfterPayCallTransfer $afterPayCallTransfer): AfterPayPaymentTransfer
149
    {
150
        return $this->paymentReader->getPaymentByIdSalesOrder($afterPayCallTransfer->getIdSalesOrder());
151
    }
152
153
    /**
154
     * @param \Generated\Shared\Transfer\AfterPayCancelRequestTransfer $cancelRequestTransfer
155
     * @param \Generated\Shared\Transfer\AfterPayCancelResponseTransfer $cancelResponseTransfer
156
     *
157
     * @return void
158
     */
159
    protected function updateOrderPayment(
160
        AfterPayCancelRequestTransfer $cancelRequestTransfer,
161
        AfterPayCancelResponseTransfer $cancelResponseTransfer
162
    ): void {
163
        if (!$cancelResponseTransfer->getTotalAuthorizedAmount()) {
164
            return;
165
        }
166
167
        $amountToCancelDecimal = (float)$cancelRequestTransfer->getCancellationDetails()->getTotalGrossAmount();
168
        $amountToCancel = $this->money->convertDecimalToInteger($amountToCancelDecimal);
169
170
        $this->paymentWriter
171
            ->increaseTotalCancelledAmountByIdSalesOrder($amountToCancel, $cancelRequestTransfer->getIdSalesOrder());
172
    }
173
}
174