PayonePartialRefundRequestSender::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 17
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 7
c 0
b 0
f 0
dl 0
loc 17
rs 10
cc 1
nc 1
nop 8

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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