Passed
Push — feature/eco-574/eco-2266-check... ( efd21d )
by Aleksey
08:13
created

getPaymentTransferForItem()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
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\AfterpayPaymentOrderItemTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...aymentOrderItemTransfer 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\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...
12
use Generated\Shared\Transfer\AfterpayRefundRequestTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...ayRefundRequestTransfer 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\AfterpayRefundResponseTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...yRefundResponseTransfer 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 Generated\Shared\Transfer\OrderTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\OrderTransfer 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...
16
use SprykerEco\Zed\Afterpay\Business\Payment\PaymentReaderInterface;
17
use SprykerEco\Zed\Afterpay\Business\Payment\PaymentWriterInterface;
18
use SprykerEco\Zed\Afterpay\Business\Payment\Transaction\Refund\RefundRequestBuilderInterface;
19
use SprykerEco\Zed\Afterpay\Business\Payment\Transaction\RefundTransactionInterface;
20
use SprykerEco\Zed\Afterpay\Dependency\Facade\AfterpayToMoneyInterface;
21
22
class RefundTransactionHandler implements RefundTransactionHandlerInterface
23
{
24
    /**
25
     * @var \SprykerEco\Zed\Afterpay\Business\Payment\Transaction\RefundTransactionInterface
26
     */
27
    protected $transaction;
28
29
    /**
30
     * @var \SprykerEco\Zed\Afterpay\Business\Payment\PaymentReaderInterface
31
     */
32
    protected $paymentReader;
33
34
    /**
35
     * @var \SprykerEco\Zed\Afterpay\Business\Payment\Transaction\Refund\RefundRequestBuilderInterface
36
     */
37
    private $refundRequestBuilder;
38
39
    /**
40
     * @var \SprykerEco\Zed\Afterpay\Business\Payment\PaymentWriterInterface
41
     */
42
    private $paymentWriter;
43
44
    /**
45
     * @var \SprykerEco\Zed\Afterpay\Dependency\Facade\AfterpayToMoneyInterface
46
     */
47
    protected $moneyFacade;
48
49
    /**
50
     * @param \SprykerEco\Zed\Afterpay\Business\Payment\Transaction\RefundTransactionInterface $transaction
51
     * @param \SprykerEco\Zed\Afterpay\Business\Payment\PaymentReaderInterface $paymentReader
52
     * @param \SprykerEco\Zed\Afterpay\Business\Payment\PaymentWriterInterface $paymentWriter
53
     * @param \SprykerEco\Zed\Afterpay\Dependency\Facade\AfterpayToMoneyInterface $moneyFacade
54
     * @param \SprykerEco\Zed\Afterpay\Business\Payment\Transaction\Refund\RefundRequestBuilderInterface $refundRequestBuilder
55
     */
56
    public function __construct(
57
        RefundTransactionInterface $transaction,
58
        PaymentReaderInterface $paymentReader,
59
        PaymentWriterInterface $paymentWriter,
60
        AfterpayToMoneyInterface $moneyFacade,
61
        RefundRequestBuilderInterface $refundRequestBuilder
62
    ) {
63
        $this->transaction = $transaction;
64
        $this->paymentReader = $paymentReader;
65
        $this->refundRequestBuilder = $refundRequestBuilder;
66
        $this->moneyFacade = $moneyFacade;
67
        $this->paymentWriter = $paymentWriter;
68
    }
69
70
    /**
71
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
72
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
73
     *
74
     * @return void
75
     */
76
    public function refund(ItemTransfer $itemTransfer, OrderTransfer $orderTransfer): void
77
    {
78
        $refundRequestTransfer = $this->buildRefundRequestForOrderItem($itemTransfer, $orderTransfer);
79
        $paymentTransfer = $this->getPaymentTransferForItem($itemTransfer);
80
81
        $this->processExpensesRefund($itemTransfer, $paymentTransfer, $orderTransfer);
82
83
        $refundResponseTransfer = $this->transaction->executeTransaction($refundRequestTransfer);
84
85
        $this->updateOrderPayment(
86
            $refundResponseTransfer,
87
            $refundRequestTransfer,
88
            $orderTransfer->getIdSalesOrder()
89
        );
90
    }
91
92
    /**
93
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
94
     * @param \Generated\Shared\Transfer\AfterpayPaymentTransfer $paymentTransfer
95
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
96
     *
97
     * @return void
98
     */
99
    protected function processExpensesRefund(
100
        ItemTransfer $itemTransfer,
101
        AfterpayPaymentTransfer $paymentTransfer,
102
        OrderTransfer $orderTransfer
103
    ): void {
104
        if (!$this->isLastItemToRefund($itemTransfer, $paymentTransfer)) {
105
            return;
106
        }
107
        $expensesRefundRequest = $this->refundRequestBuilder
108
            ->buildBaseRefundRequestForOrder($orderTransfer);
109
        $this->addExpensesToRefundRequest($paymentTransfer->getExpenseTotal(), $expensesRefundRequest);
110
        $expensesRefundRequest->setCaptureNumber($paymentTransfer->getExpensesCaptureNumber());
111
        $expensesRefundResponse = $this->transaction->executeTransaction($expensesRefundRequest);
112
        $this->updateOrderPayment($expensesRefundResponse, $expensesRefundRequest, $orderTransfer->getIdSalesOrder());
113
    }
114
115
    /**
116
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
117
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
118
     *
119
     * @return \Generated\Shared\Transfer\AfterpayRefundRequestTransfer
120
     */
121
    protected function buildRefundRequestForOrderItem(
122
        ItemTransfer $itemTransfer,
123
        OrderTransfer $orderTransfer
124
    ): AfterpayRefundRequestTransfer {
125
        $refundRequestTransfer = $this->refundRequestBuilder
126
            ->buildBaseRefundRequestForOrder($orderTransfer);
127
        $this->refundRequestBuilder
128
            ->addOrderItemToRefundRequest(
129
                $itemTransfer,
130
                $refundRequestTransfer
131
            );
132
        $this->addCaptureNumberToRefundRequest($refundRequestTransfer, $itemTransfer);
133
134
        return $refundRequestTransfer;
135
    }
136
137
    /**
138
     * @param int $expenseTotal
139
     * @param \Generated\Shared\Transfer\AfterpayRefundRequestTransfer $refundRequestTransfer
140
     *
141
     * @return void
142
     */
143
    protected function addExpensesToRefundRequest(
144
        int $expenseTotal,
145
        AfterpayRefundRequestTransfer $refundRequestTransfer
146
    ): void {
147
        $this->refundRequestBuilder->addOrderExpenseToRefundRequest($expenseTotal, $refundRequestTransfer);
148
    }
149
150
    /**
151
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
152
     *
153
     * @return \Generated\Shared\Transfer\AfterpayPaymentTransfer
154
     */
155
    protected function getPaymentTransferForItem(ItemTransfer $itemTransfer): AfterpayPaymentTransfer
156
    {
157
        return $this->paymentReader->getPaymentByIdSalesOrder($itemTransfer->getFkSalesOrder());
158
    }
159
160
    /**
161
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
162
     *
163
     * @return \Generated\Shared\Transfer\AfterpayPaymentOrderItemTransfer
164
     */
165
    protected function getPaymentOrderItemTransferForItem(ItemTransfer $itemTransfer): AfterpayPaymentOrderItemTransfer
166
    {
167
        $paymentTransfer = $this->getPaymentTransferForItem($itemTransfer);
168
        return $this->paymentReader
169
            ->getPaymentOrderItemByIdSalesOrderItemAndIdPayment(
170
                $itemTransfer->getIdSalesOrderItem(),
171
                $paymentTransfer->getIdPaymentAfterpay()
172
            );
173
    }
174
175
    /**
176
     * @param \Generated\Shared\Transfer\AfterpayRefundResponseTransfer $refundResponseTransfer
177
     * @param \Generated\Shared\Transfer\AfterpayRefundRequestTransfer $refundRequestTransfer
178
     * @param int $idSalesOrder
179
     *
180
     * @return void
181
     */
182
    protected function updateOrderPayment(
183
        AfterpayRefundResponseTransfer $refundResponseTransfer,
184
        AfterpayRefundRequestTransfer $refundRequestTransfer,
185
        int $idSalesOrder
186
    ): void {
187
        if (!$refundResponseTransfer->getTotalCapturedAmount()) {
188
            return;
189
        }
190
191
        $refundedAmountDecimal = (float)0;
192
        $refundedAmountInt = $this->moneyFacade->convertDecimalToInteger($refundedAmountDecimal);
193
194
        foreach ($refundRequestTransfer->getOrderItems() as $item) {
195
            $itemGrossPriceDecimal = (float)$item->getGrossUnitPrice();
196
            $refundedAmountInt += $this->moneyFacade->convertDecimalToInteger($itemGrossPriceDecimal);
197
        }
198
199
        $this->paymentWriter->increaseRefundedTotalByIdSalesOrder(
200
            $refundedAmountInt,
201
            $idSalesOrder
202
        );
203
    }
204
205
    /**
206
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
207
     * @param \Generated\Shared\Transfer\AfterpayPaymentTransfer $paymentTransfer
208
     *
209
     * @return bool
210
     */
211
    protected function isLastItemToRefund(ItemTransfer $itemTransfer, AfterpayPaymentTransfer $paymentTransfer): bool
212
    {
213
        return $paymentTransfer->getAuthorizedTotal() -
214
            $paymentTransfer->getCancelledTotal() -
215
            $paymentTransfer->getRefundedTotal() -
216
            $paymentTransfer->getExpenseTotal() === $itemTransfer->getRefundableAmount();
217
    }
218
219
    /**
220
     * @param \Generated\Shared\Transfer\AfterpayRefundRequestTransfer $refundRequestTransfer
221
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
222
     *
223
     * @return void
224
     */
225
    protected function addCaptureNumberToRefundRequest(
226
        AfterpayRefundRequestTransfer $refundRequestTransfer,
227
        ItemTransfer $itemTransfer
228
    ): void {
229
        $paymentOrderItemTransfer = $this->getPaymentOrderItemTransferForItem($itemTransfer);
230
        $refundRequestTransfer->setCaptureNumber($paymentOrderItemTransfer->getCaptureNumber());
231
    }
232
}
233