CaptureTransactionHandler   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 205
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 47
dl 0
loc 205
rs 10
c 0
b 0
f 0
wmc 17

11 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 1
A buildExpensesCaptureRequest() 0 8 1
A isFirstItemToCapture() 0 3 1
A updatePaymentWithExpensesCaptureNumber() 0 11 2
A addExpensesToCaptureRequest() 0 5 1
A buildCaptureRequestForOrderItem() 0 11 2
A getPaymentTransferForItem() 0 3 1
A processExpensesCapture() 0 9 2
A capture() 0 15 3
A updateOrderPayment() 0 11 2
A updatePaymentOrderItem() 0 9 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\AfterPayCaptureRequestTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...yCaptureRequestTransfer 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\AfterPayCaptureResponseTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...CaptureResponseTransfer 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 Generated\Shared\Transfer\ItemTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\ItemTransfer 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...
15
use SprykerEco\Zed\AfterPay\Business\Payment\PaymentReaderInterface;
16
use SprykerEco\Zed\AfterPay\Business\Payment\PaymentWriterInterface;
17
use SprykerEco\Zed\AfterPay\Business\Payment\Transaction\Capture\CaptureRequestBuilderInterface;
18
use SprykerEco\Zed\AfterPay\Business\Payment\Transaction\CaptureTransactionInterface;
19
20
class CaptureTransactionHandler implements CaptureTransactionHandlerInterface
21
{
22
    /**
23
     * @var \SprykerEco\Zed\AfterPay\Business\Payment\Transaction\CaptureTransactionInterface
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\Capture\CaptureRequestBuilderInterface
34
     */
35
    protected $captureRequestBuilder;
36
37
    /**
38
     * @var \SprykerEco\Zed\AfterPay\Business\Payment\PaymentWriterInterface
39
     */
40
    protected $paymentWriter;
41
42
    /**
43
     * @param \SprykerEco\Zed\AfterPay\Business\Payment\Transaction\CaptureTransactionInterface $transaction
44
     * @param \SprykerEco\Zed\AfterPay\Business\Payment\PaymentReaderInterface $paymentReader
45
     * @param \SprykerEco\Zed\AfterPay\Business\Payment\PaymentWriterInterface $paymentWriter
46
     * @param \SprykerEco\Zed\AfterPay\Business\Payment\Transaction\Capture\CaptureRequestBuilderInterface $captureRequestBuilder
47
     */
48
    public function __construct(
49
        CaptureTransactionInterface $transaction,
50
        PaymentReaderInterface $paymentReader,
51
        PaymentWriterInterface $paymentWriter,
52
        CaptureRequestBuilderInterface $captureRequestBuilder
53
    ) {
54
        $this->transaction = $transaction;
55
        $this->paymentReader = $paymentReader;
56
        $this->captureRequestBuilder = $captureRequestBuilder;
57
        $this->paymentWriter = $paymentWriter;
58
    }
59
60
    /**
61
     * @param array<\Generated\Shared\Transfer\ItemTransfer> $items
62
     * @param \Generated\Shared\Transfer\AfterPayCallTransfer $afterPayCallTransfer
63
     *
64
     * @return void
65
     */
66
    public function capture(array $items, AfterPayCallTransfer $afterPayCallTransfer): void
67
    {
68
        $paymentTransfer = $this->getPaymentTransferForItem($afterPayCallTransfer);
69
        $captureRequestTransfer = $this->buildCaptureRequestForOrderItem($items, $afterPayCallTransfer);
70
71
        if ($paymentTransfer->getExpenseTotal()) {
72
            $this->processExpensesCapture($paymentTransfer, $afterPayCallTransfer);
73
        }
74
75
        $captureResponseTransfer = $this->transaction->executeTransaction($captureRequestTransfer);
76
77
        $this->updateOrderPayment($captureResponseTransfer, $afterPayCallTransfer->getIdSalesOrder());
78
79
        foreach ($items as $itemTransfer) {
80
            $this->updatePaymentOrderItem($captureResponseTransfer, $itemTransfer, $paymentTransfer);
81
        }
82
    }
83
84
    /**
85
     * @param \Generated\Shared\Transfer\AfterPayPaymentTransfer $paymentTransfer
86
     * @param \Generated\Shared\Transfer\AfterPayCallTransfer $afterPayCallTransfer
87
     *
88
     * @return void
89
     */
90
    protected function processExpensesCapture(AfterPayPaymentTransfer $paymentTransfer, AfterPayCallTransfer $afterPayCallTransfer): void
91
    {
92
        if (!$this->isFirstItemToCapture($paymentTransfer)) {
93
            return;
94
        }
95
        $shipmentCaptureRequestTransfer = $this->buildExpensesCaptureRequest($paymentTransfer, $afterPayCallTransfer);
96
        $shipmentCaptureResponseTransfer = $this->transaction->executeTransaction($shipmentCaptureRequestTransfer);
97
        $this->updateOrderPayment($shipmentCaptureResponseTransfer, $afterPayCallTransfer->getIdSalesOrder());
98
        $this->updatePaymentWithExpensesCaptureNumber($shipmentCaptureResponseTransfer, $afterPayCallTransfer->getIdSalesOrder());
99
    }
100
101
    /**
102
     * @param \Generated\Shared\Transfer\AfterPayPaymentTransfer $paymentTransfer
103
     * @param \Generated\Shared\Transfer\AfterPayCallTransfer $afterPayCallTransfer
104
     *
105
     * @return \Generated\Shared\Transfer\AfterPayCaptureRequestTransfer
106
     */
107
    protected function buildExpensesCaptureRequest(
108
        AfterPayPaymentTransfer $paymentTransfer,
109
        AfterPayCallTransfer $afterPayCallTransfer
110
    ): AfterPayCaptureRequestTransfer {
111
        $baseCaptureRequest = $this->captureRequestBuilder->buildBaseCaptureRequestForOrder($afterPayCallTransfer);
112
        $this->addExpensesToCaptureRequest($paymentTransfer->getExpenseTotal(), $baseCaptureRequest);
113
114
        return $baseCaptureRequest;
115
    }
116
117
    /**
118
     * @param array<\Generated\Shared\Transfer\ItemTransfer> $items
119
     * @param \Generated\Shared\Transfer\AfterPayCallTransfer $afterPayCallTransfer
120
     *
121
     * @return \Generated\Shared\Transfer\AfterPayCaptureRequestTransfer
122
     */
123
    protected function buildCaptureRequestForOrderItem(
124
        array $items,
125
        AfterPayCallTransfer $afterPayCallTransfer
126
    ): AfterPayCaptureRequestTransfer {
127
        $captureRequestTransfer = $this->captureRequestBuilder->buildBaseCaptureRequestForOrder($afterPayCallTransfer);
128
129
        foreach ($items as $itemTransfer) {
130
            $this->captureRequestBuilder->addOrderItemToCaptureRequest($itemTransfer, $captureRequestTransfer);
131
        }
132
133
        return $captureRequestTransfer;
134
    }
135
136
    /**
137
     * @param \Generated\Shared\Transfer\AfterPayPaymentTransfer $paymentTransfer
138
     *
139
     * @return bool
140
     */
141
    protected function isFirstItemToCapture(AfterPayPaymentTransfer $paymentTransfer): bool
142
    {
143
        return $paymentTransfer->getCapturedTotal() + $paymentTransfer->getRefundedTotal() === 0;
144
    }
145
146
    /**
147
     * @param int $expenseTotal
148
     * @param \Generated\Shared\Transfer\AfterPayCaptureRequestTransfer $captureRequestTransfer
149
     *
150
     * @return void
151
     */
152
    protected function addExpensesToCaptureRequest(
153
        int $expenseTotal,
154
        AfterPayCaptureRequestTransfer $captureRequestTransfer
155
    ): void {
156
        $this->captureRequestBuilder->addOrderExpenseToCaptureRequest($expenseTotal, $captureRequestTransfer);
157
    }
158
159
    /**
160
     * @param \Generated\Shared\Transfer\AfterPayCallTransfer $afterPayCallTransfer
161
     *
162
     * @return \Generated\Shared\Transfer\AfterPayPaymentTransfer
163
     */
164
    protected function getPaymentTransferForItem(AfterPayCallTransfer $afterPayCallTransfer): AfterPayPaymentTransfer
165
    {
166
        return $this->paymentReader->getPaymentByIdSalesOrder($afterPayCallTransfer->getIdSalesOrder());
167
    }
168
169
    /**
170
     * @param \Generated\Shared\Transfer\AfterPayCaptureResponseTransfer $capturedResponseTransfer
171
     * @param int $idSalesOrder
172
     *
173
     * @return void
174
     */
175
    protected function updateOrderPayment(
176
        AfterPayCaptureResponseTransfer $capturedResponseTransfer,
177
        int $idSalesOrder
178
    ): void {
179
        if (!$capturedResponseTransfer->getCapturedAmount()) {
180
            return;
181
        }
182
183
        $this->paymentWriter->increaseTotalCapturedAmountByIdSalesOrder(
184
            $capturedResponseTransfer->getCapturedAmount(),
185
            $idSalesOrder,
186
        );
187
    }
188
189
    /**
190
     * @param \Generated\Shared\Transfer\AfterPayCaptureResponseTransfer $capturedResponseTransfer
191
     * @param int $idSalesOrder
192
     *
193
     * @return void
194
     */
195
    protected function updatePaymentWithExpensesCaptureNumber(
196
        AfterPayCaptureResponseTransfer $capturedResponseTransfer,
197
        int $idSalesOrder
198
    ): void {
199
        if (!$capturedResponseTransfer->getCaptureNumber()) {
200
            return;
201
        }
202
203
        $this->paymentWriter->updateExpensesCaptureNumber(
204
            $capturedResponseTransfer->getCaptureNumber(),
205
            $idSalesOrder,
206
        );
207
    }
208
209
    /**
210
     * @param \Generated\Shared\Transfer\AfterPayCaptureResponseTransfer $captureResponseTransfer
211
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
212
     * @param \Generated\Shared\Transfer\AfterPayPaymentTransfer $paymentTransfer
213
     *
214
     * @return void
215
     */
216
    protected function updatePaymentOrderItem(
217
        AfterPayCaptureResponseTransfer $captureResponseTransfer,
218
        ItemTransfer $itemTransfer,
219
        AfterPayPaymentTransfer $paymentTransfer
220
    ): void {
221
        $this->paymentWriter->setCaptureNumberByIdSalesOrderItemAndIdPayment(
222
            $captureResponseTransfer->getCaptureNumber(),
223
            $itemTransfer->getIdSalesOrderItem(),
224
            $paymentTransfer->getIdPaymentAfterPay(),
225
        );
226
    }
227
}
228