getPartialRefundStatus()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
c 0
b 0
f 0
dl 0
loc 7
rs 10
cc 2
nc 2
nop 1
1
<?php
2
3
/**
4
 * MIT License
5
 * Use of this software requires acceptance of the Evaluation License Agreement. See LICENSE file.
6
 */
7
8
namespace SprykerEco\Zed\Payone\Business\Payment\RequestSender;
9
10
use Generated\Shared\Transfer\PayoneOrderItemFilterTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...OrderItemFilterTransfer 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\PayonePartialOperationRequestTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...perationRequestTransfer 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\PayoneStandardParameterTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...andardParameterTransfer 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\RefundResponseTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\RefundResponseTransfer 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 Orm\Zed\Payone\Persistence\SpyPaymentPayoneApiLog;
0 ignored issues
show
Bug introduced by
The type Orm\Zed\Payone\Persistence\SpyPaymentPayoneApiLog 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 Spryker\Shared\Shipment\ShipmentConfig;
16
use SprykerEco\Shared\Payone\PayoneApiConstants;
17
use SprykerEco\Shared\Payone\PayoneTransactionStatusConstants;
18
use SprykerEco\Zed\Payone\Business\Api\Adapter\AdapterInterface;
19
use SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer;
20
use SprykerEco\Zed\Payone\Business\Api\Response\Container\RefundResponseContainer;
21
use SprykerEco\Zed\Payone\Business\Api\Response\Mapper\RefundResponseMapperInterface;
22
use SprykerEco\Zed\Payone\Business\Payment\DataMapper\StandartParameterMapperInterface;
23
use SprykerEco\Zed\Payone\Business\Payment\PaymentMapperReaderInterface;
24
use SprykerEco\Zed\Payone\Persistence\PayoneEntityManagerInterface;
25
use SprykerEco\Zed\Payone\Persistence\PayoneQueryContainerInterface;
26
use SprykerEco\Zed\Payone\Persistence\PayoneRepositoryInterface;
27
28
class PayonePartialRefundRequestSender extends AbstractPayoneRequestSender implements PayonePartialRefundRequestSenderInterface
29
{
30
    /**
31
     * @var \SprykerEco\Zed\Payone\Business\Api\Adapter\AdapterInterface
32
     */
33
    protected $executionAdapter;
34
35
    /**
36
     * @var \Generated\Shared\Transfer\PayoneStandardParameterTransfer
37
     */
38
    protected $standardParameter;
39
40
    /**
41
     * @var \SprykerEco\Zed\Payone\Persistence\PayoneRepositoryInterface
42
     */
43
    protected $payoneRepository;
44
45
    /**
46
     * @var \SprykerEco\Zed\Payone\Persistence\PayoneEntityManagerInterface
47
     */
48
    protected $payoneEntityManager;
49
50
    /**
51
     * @var \SprykerEco\Zed\Payone\Business\Payment\DataMapper\StandartParameterMapperInterface
52
     */
53
    protected $standartParameterMapper;
54
55
    /**
56
     * @var \SprykerEco\Zed\Payone\Business\Api\Response\Mapper\RefundResponseMapperInterface
57
     */
58
    protected $refundResponseMapper;
59
60
    /**
61
     * @param \SprykerEco\Zed\Payone\Business\Api\Adapter\AdapterInterface $executionAdapter
62
     * @param \SprykerEco\Zed\Payone\Persistence\PayoneQueryContainerInterface $queryContainer
63
     * @param \SprykerEco\Zed\Payone\Business\Payment\PaymentMapperReaderInterface $paymentMapperReader
64
     * @param \Generated\Shared\Transfer\PayoneStandardParameterTransfer $standardParameter
65
     * @param \SprykerEco\Zed\Payone\Persistence\PayoneRepositoryInterface $payoneRepository
66
     * @param \SprykerEco\Zed\Payone\Persistence\PayoneEntityManagerInterface $payoneEntityManager
67
     * @param \SprykerEco\Zed\Payone\Business\Payment\DataMapper\StandartParameterMapperInterface $standartParameterMapper
68
     * @param \SprykerEco\Zed\Payone\Business\Api\Response\Mapper\RefundResponseMapperInterface $refundResponseMapper
69
     */
70
    public function __construct(
71
        AdapterInterface $executionAdapter,
72
        PayoneQueryContainerInterface $queryContainer,
73
        PaymentMapperReaderInterface $paymentMapperReader,
74
        PayoneStandardParameterTransfer $standardParameter,
75
        PayoneRepositoryInterface $payoneRepository,
76
        PayoneEntityManagerInterface $payoneEntityManager,
77
        StandartParameterMapperInterface $standartParameterMapper,
78
        RefundResponseMapperInterface $refundResponseMapper
79
    ) {
80
        parent::__construct($queryContainer, $paymentMapperReader);
81
        $this->executionAdapter = $executionAdapter;
82
        $this->standardParameter = $standardParameter;
83
        $this->payoneRepository = $payoneRepository;
84
        $this->payoneEntityManager = $payoneEntityManager;
85
        $this->standartParameterMapper = $standartParameterMapper;
86
        $this->refundResponseMapper = $refundResponseMapper;
87
    }
88
89
    /**
90
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
91
     *
92
     * @return \Generated\Shared\Transfer\RefundResponseTransfer
93
     */
94
    public function executePartialRefund(PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer): RefundResponseTransfer
95
    {
96
        $paymentEntity = $this->getPaymentEntity($payonePartialOperationRequestTransfer->getOrder()->getIdSalesOrder());
97
        $paymentMethodMapper = $this->getPaymentMethodMapper($paymentEntity);
98
        $requestContainer = $paymentMethodMapper->mapPaymentToRefund($paymentEntity);
99
100
        $requestContainer->setAmount($payonePartialOperationRequestTransfer->getRefund()->getAmount() * -1);
101
        $requestContainer = $this->preparePartialRefundOrderItems($payonePartialOperationRequestTransfer, $requestContainer);
102
        $requestContainer = $this->preparePartialRefundExpenses($payonePartialOperationRequestTransfer, $requestContainer);
103
        $this->standartParameterMapper->setStandardParameter($requestContainer, $this->standardParameter);
104
        $apiLogEntity = $this->initializeApiLog($paymentEntity, $requestContainer);
105
106
        $rawResponse = $this->executionAdapter->sendRequest($requestContainer);
107
        $responseContainer = new RefundResponseContainer($rawResponse);
108
109
        $this->updateApiLogAfterRefund($apiLogEntity, $responseContainer);
110
        $this->updatePaymentPayoneOrderItemsWithStatus(
111
            $payonePartialOperationRequestTransfer,
112
            $this->getPartialRefundStatus($responseContainer)
113
        );
114
115
        return $this->refundResponseMapper->getRefundResponseTransfer($responseContainer);
116
    }
117
118
    /**
119
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
120
     * @param \SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer $container
121
     *
122
     * @return \SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer
123
     */
124
    protected function preparePartialRefundOrderItems(
125
        PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer,
126
        AbstractRequestContainer $container
127
    ): AbstractRequestContainer {
128
        $arrayIt = [];
129
        $arrayId = [];
130
        $arrayPr = [];
131
        $arrayNo = [];
132
        $arrayDe = [];
133
        $arrayVa = [];
134
135
        $key = 1;
136
137
        foreach ($payonePartialOperationRequestTransfer->getOrder()->getItems() as $itemTransfer) {
138
            if (!in_array($itemTransfer->getIdSalesOrderItem(), $payonePartialOperationRequestTransfer->getSalesOrderItemIds())) {
139
                continue;
140
            }
141
142
            $arrayIt[$key] = PayoneApiConstants::INVOICING_ITEM_TYPE_GOODS;
143
            $arrayId[$key] = $itemTransfer->getSku();
144
            $arrayPr[$key] = $itemTransfer->getRefundableAmount();
145
            $arrayNo[$key] = $itemTransfer->getQuantity();
146
            $arrayDe[$key] = $itemTransfer->getName();
147
            $arrayVa[$key] = (int)$itemTransfer->getTaxRate();
148
            $key++;
149
        }
150
151
        $container->setIt($arrayIt);
152
        $container->setId($arrayId);
153
        $container->setPr($arrayPr);
154
        $container->setNo($arrayNo);
155
        $container->setDe($arrayDe);
156
        $container->setVa($arrayVa);
157
158
        return $container;
159
    }
160
161
    /**
162
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
163
     * @param \SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer $container
164
     *
165
     * @return \SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer
166
     */
167
    protected function preparePartialRefundExpenses(
168
        PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer,
169
        AbstractRequestContainer $container
170
    ): AbstractRequestContainer {
171
        $arrayIt = $container->getIt() ?? [];
172
        $arrayId = $container->getId() ?? [];
173
        $arrayPr = $container->getPr() ?? [];
174
        $arrayNo = $container->getNo() ?? [];
175
        $arrayDe = $container->getDe() ?? [];
176
        $arrayVa = $container->getVa() ?? [];
177
178
        $key = count($arrayId) + 1;
179
180
        foreach ($payonePartialOperationRequestTransfer->getRefund()->getExpenses() as $expenseTransfer) {
181
            $expenseType = PayoneApiConstants::INVOICING_ITEM_TYPE_HANDLING;
182
            if ($expenseTransfer->getType() === ShipmentConfig::SHIPMENT_EXPENSE_TYPE) {
183
                $expenseType = PayoneApiConstants::INVOICING_ITEM_TYPE_SHIPMENT;
184
            }
185
186
            $arrayIt[$key] = $expenseType;
187
            $arrayId[$key] = $expenseType;
188
            $arrayPr[$key] = $expenseTransfer->getRefundableAmount();
189
            $arrayNo[$key] = $expenseTransfer->getQuantity();
190
            $arrayDe[$key] = $expenseTransfer->getName();
191
            $arrayVa[$key] = (int)$expenseTransfer->getTaxRate();
192
            $key++;
193
        }
194
195
        $container->setIt($arrayIt);
196
        $container->setId($arrayId);
197
        $container->setPr($arrayPr);
198
        $container->setNo($arrayNo);
199
        $container->setDe($arrayDe);
200
        $container->setVa($arrayVa);
201
202
        return $container;
203
    }
204
205
    /**
206
     * @param \Orm\Zed\Payone\Persistence\SpyPaymentPayoneApiLog $apiLogEntity
207
     * @param \SprykerEco\Zed\Payone\Business\Api\Response\Container\RefundResponseContainer $responseContainer
208
     *
209
     * @return void
210
     */
211
    protected function updateApiLogAfterRefund(SpyPaymentPayoneApiLog $apiLogEntity, RefundResponseContainer $responseContainer): void
212
    {
213
        $apiLogEntity->setTransactionId($responseContainer->getTxid());
214
        $apiLogEntity->setStatus($responseContainer->getStatus());
215
        $apiLogEntity->setErrorMessageInternal($responseContainer->getErrormessage());
216
        $apiLogEntity->setErrorMessageUser($responseContainer->getCustomermessage());
217
        $apiLogEntity->setErrorCode($responseContainer->getErrorcode());
218
219
        $apiLogEntity->setRawResponse(json_encode($responseContainer->toArray()));
220
        $apiLogEntity->save();
221
    }
222
223
    /**
224
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
225
     * @param string $refundStatus
226
     *
227
     * @return void
228
     */
229
    protected function updatePaymentPayoneOrderItemsWithStatus(
230
        PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer,
231
        string $refundStatus
232
    ): void {
233
        $payoneOrderItemFilterTransfer = (new PayoneOrderItemFilterTransfer())
234
            ->setIdSalesOrder($payonePartialOperationRequestTransfer->getOrder()->getIdSalesOrder())
235
            ->setSalesOrderItemIds($payonePartialOperationRequestTransfer->getSalesOrderItemIds());
236
237
        $payoneOrderItemTransfers = $this->payoneRepository->findPaymentPayoneOrderItemByFilter($payoneOrderItemFilterTransfer);
238
239
        foreach ($payoneOrderItemTransfers as $payoneOrderItemTransfer) {
240
            $payoneOrderItemTransfer->setStatus($refundStatus);
241
            $this->payoneEntityManager->updatePaymentPayoneOrderItem($payoneOrderItemTransfer);
242
        }
243
    }
244
245
    /**
246
     * @param \SprykerEco\Zed\Payone\Business\Api\Response\Container\RefundResponseContainer $responseContainer
247
     *
248
     * @return string
249
     */
250
    protected function getPartialRefundStatus(RefundResponseContainer $responseContainer): string
251
    {
252
        if ($responseContainer->getStatus() === PayoneApiConstants::RESPONSE_TYPE_APPROVED) {
253
            return PayoneTransactionStatusConstants::STATUS_REFUND_APPROVED;
254
        }
255
256
        return PayoneTransactionStatusConstants::STATUS_REFUND_FAILED;
257
    }
258
}
259