Completed
Pull Request — master (#64)
by
unknown
06:13 queued 10s
created

preparePartialRefundExpenses()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 36
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 25
c 1
b 0
f 0
dl 0
loc 36
rs 9.52
cc 3
nc 3
nop 2
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\MethodSender;
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\RefundResponseMapper;
22
use SprykerEco\Zed\Payone\Business\Payment\DataMapper\StandartParameterMapperInterface;
23
use SprykerEco\Zed\Payone\Business\Payment\PaymentMapperReader;
24
use SprykerEco\Zed\Payone\Persistence\PayoneEntityManagerInterface;
25
use SprykerEco\Zed\Payone\Persistence\PayoneQueryContainerInterface;
26
use SprykerEco\Zed\Payone\Persistence\PayoneRepositoryInterface;
27
28
class PayonePartialRefundMethodSender extends AbstractPayoneMethodSender implements PayonePartialRefundMethodSenderInterface
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\Business\Payment\PaymentMethodMapperInterface[]
42
     */
43
    protected $registeredMethodMappers;
44
45
    /**
46
     * @var \SprykerEco\Zed\Payone\Persistence\PayoneRepositoryInterface
47
     */
48
    protected $payoneRepository;
49
50
    /**
51
     * @var \SprykerEco\Zed\Payone\Persistence\PayoneEntityManagerInterface
52
     */
53
    protected $payoneEntityManager;
54
55
    /**
56
     * @var \SprykerEco\Zed\Payone\Business\Payment\DataMapper\StandartParameterMapperInterface
57
     */
58
    protected $standartParameterMapper;
59
60
    /**
61
     * @param \SprykerEco\Zed\Payone\Business\Api\Adapter\AdapterInterface $executionAdapter
62
     * @param \SprykerEco\Zed\Payone\Persistence\PayoneQueryContainerInterface $queryContainer
63
     * @param \Generated\Shared\Transfer\PayoneStandardParameterTransfer $standardParameter
64
     * @param \SprykerEco\Zed\Payone\Persistence\PayoneRepositoryInterface $payoneRepository
65
     * @param \SprykerEco\Zed\Payone\Persistence\PayoneEntityManagerInterface $payoneEntityManager
66
     * @param \SprykerEco\Zed\Payone\Business\Payment\DataMapper\StandartParameterMapperInterface $standartParameterMapper
67
     * @param \SprykerEco\Zed\Payone\Business\Payment\PaymentMapperReader $paymentMapperReader
68
     */
69
    public function __construct(
70
        AdapterInterface $executionAdapter,
71
        PayoneQueryContainerInterface $queryContainer,
72
        PaymentMapperReader $paymentMapperReader,
0 ignored issues
show
Unused Code introduced by
The parameter $paymentMapperReader is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

72
        /** @scrutinizer ignore-unused */ PaymentMapperReader $paymentMapperReader,

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
73
        PayoneStandardParameterTransfer $standardParameter,
74
        PayoneRepositoryInterface $payoneRepository,
75
        PayoneEntityManagerInterface $payoneEntityManager,
76
        StandartParameterMapperInterface $standartParameterMapper
77
    ) {
78
        parent::__construct($queryContainer, $paymentMapperManager);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $paymentMapperManager does not exist. Did you maybe mean $paymentMapperReader?
Loading history...
79
        $this->executionAdapter = $executionAdapter;
80
        $this->standardParameter = $standardParameter;
81
        $this->payoneRepository = $payoneRepository;
82
        $this->payoneEntityManager = $payoneEntityManager;
83
        $this->standartParameterMapper = $standartParameterMapper;
84
    }
85
86
    /**
87
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
88
     *
89
     * @return \Generated\Shared\Transfer\RefundResponseTransfer
90
     */
91
    public function executePartialRefund(PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer): RefundResponseTransfer
92
    {
93
        $paymentEntity = $this->getPaymentEntity($payonePartialOperationRequestTransfer->getOrder()->getIdSalesOrder());
94
        $paymentMethodMapper = $this->getPaymentMethodMapper($paymentEntity);
95
        $requestContainer = $paymentMethodMapper->mapPaymentToRefund($paymentEntity);
96
97
        $requestContainer->setAmount($payonePartialOperationRequestTransfer->getRefund()->getAmount() * -1);
98
        $requestContainer = $this->preparePartialRefundOrderItems($payonePartialOperationRequestTransfer, $requestContainer);
99
        $requestContainer = $this->preparePartialRefundExpenses($payonePartialOperationRequestTransfer, $requestContainer);
100
        $this->standartParameterMapper->setStandardParameter($requestContainer, $this->standardParameter);
101
        $apiLogEntity = $this->initializeApiLog($paymentEntity, $requestContainer);
102
103
        $rawResponse = $this->executionAdapter->sendRequest($requestContainer);
104
        $responseContainer = new RefundResponseContainer($rawResponse);
105
106
        $this->updateApiLogAfterRefund($apiLogEntity, $responseContainer);
107
        $this->updatePaymentPayoneOrderItemsWithStatus(
108
            $payonePartialOperationRequestTransfer,
109
            $this->getPartialRefundStatus($responseContainer)
110
        );
111
112
        $responseMapper = new RefundResponseMapper();
113
114
        return $responseMapper->getRefundResponseTransfer($responseContainer);
115
    }
116
117
    /**
118
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
119
     * @param \SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer $container
120
     *
121
     * @return \SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer
122
     */
123
    protected function preparePartialRefundOrderItems(
124
        PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer,
125
        AbstractRequestContainer $container
126
    ): AbstractRequestContainer {
127
        $arrayIt = [];
128
        $arrayId = [];
129
        $arrayPr = [];
130
        $arrayNo = [];
131
        $arrayDe = [];
132
        $arrayVa = [];
133
134
        $key = 1;
135
136
        foreach ($payonePartialOperationRequestTransfer->getOrder()->getItems() as $itemTransfer) {
137
            if (!in_array($itemTransfer->getIdSalesOrderItem(), $payonePartialOperationRequestTransfer->getSalesOrderItemIds())) {
138
                continue;
139
            }
140
141
            $arrayIt[$key] = PayoneApiConstants::INVOICING_ITEM_TYPE_GOODS;
142
            $arrayId[$key] = $itemTransfer->getSku();
143
            $arrayPr[$key] = $itemTransfer->getRefundableAmount();
144
            $arrayNo[$key] = $itemTransfer->getQuantity();
145
            $arrayDe[$key] = $itemTransfer->getName();
146
            $arrayVa[$key] = (int)$itemTransfer->getTaxRate();
147
            $key++;
148
        }
149
150
        $container->setIt($arrayIt);
151
        $container->setId($arrayId);
152
        $container->setPr($arrayPr);
153
        $container->setNo($arrayNo);
154
        $container->setDe($arrayDe);
155
        $container->setVa($arrayVa);
156
157
        return $container;
158
    }
159
160
    /**
161
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
162
     * @param \SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer $container
163
     *
164
     * @return \SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer
165
     */
166
    protected function preparePartialRefundExpenses(
167
        PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer,
168
        AbstractRequestContainer $container
169
    ): AbstractRequestContainer {
170
        $arrayIt = $container->getIt() ?? [];
171
        $arrayId = $container->getId() ?? [];
172
        $arrayPr = $container->getPr() ?? [];
173
        $arrayNo = $container->getNo() ?? [];
174
        $arrayDe = $container->getDe() ?? [];
175
        $arrayVa = $container->getVa() ?? [];
176
177
        $key = count($arrayId) + 1;
178
179
        foreach ($payonePartialOperationRequestTransfer->getRefund()->getExpenses() as $expenseTransfer) {
180
            $expenseType = PayoneApiConstants::INVOICING_ITEM_TYPE_HANDLING;
181
            if ($expenseTransfer->getType() === ShipmentConfig::SHIPMENT_EXPENSE_TYPE) {
182
                $expenseType = PayoneApiConstants::INVOICING_ITEM_TYPE_SHIPMENT;
183
            }
184
185
            $arrayIt[$key] = $expenseType;
186
            $arrayId[$key] = $expenseType;
187
            $arrayPr[$key] = $expenseTransfer->getRefundableAmount();
188
            $arrayNo[$key] = $expenseTransfer->getQuantity();
189
            $arrayDe[$key] = $expenseTransfer->getName();
190
            $arrayVa[$key] = (int)$expenseTransfer->getTaxRate();
191
            $key++;
192
        }
193
194
        $container->setIt($arrayIt);
195
        $container->setId($arrayId);
196
        $container->setPr($arrayPr);
197
        $container->setNo($arrayNo);
198
        $container->setDe($arrayDe);
199
        $container->setVa($arrayVa);
200
201
        return $container;
202
    }
203
204
    /**
205
     * @param \Orm\Zed\Payone\Persistence\SpyPaymentPayoneApiLog $apiLogEntity
206
     * @param \SprykerEco\Zed\Payone\Business\Api\Response\Container\RefundResponseContainer $responseContainer
207
     *
208
     * @return void
209
     */
210
    protected function updateApiLogAfterRefund(SpyPaymentPayoneApiLog $apiLogEntity, RefundResponseContainer $responseContainer)
211
    {
212
        $apiLogEntity->setTransactionId($responseContainer->getTxid());
213
        $apiLogEntity->setStatus($responseContainer->getStatus());
214
        $apiLogEntity->setErrorMessageInternal($responseContainer->getErrormessage());
215
        $apiLogEntity->setErrorMessageUser($responseContainer->getCustomermessage());
216
        $apiLogEntity->setErrorCode($responseContainer->getErrorcode());
217
218
        $apiLogEntity->setRawResponse(json_encode($responseContainer->toArray()));
219
        $apiLogEntity->save();
220
    }
221
222
    /**
223
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
224
     * @param string $refundStatus
225
     *
226
     * @return void
227
     */
228
    protected function updatePaymentPayoneOrderItemsWithStatus(
229
        PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer,
230
        string $refundStatus
231
    ): void {
232
        $payoneOrderItemFilterTransfer = (new PayoneOrderItemFilterTransfer())
233
            ->setIdSalesOrder($payonePartialOperationRequestTransfer->getOrder()->getIdSalesOrder())
234
            ->setSalesOrderItemIds($payonePartialOperationRequestTransfer->getSalesOrderItemIds());
235
236
        $payoneOrderItemTransfers = $this->payoneRepository->findPaymentPayoneOrderItemByFilter($payoneOrderItemFilterTransfer);
237
238
        foreach ($payoneOrderItemTransfers as $payoneOrderItemTransfer) {
239
            $payoneOrderItemTransfer->setStatus($refundStatus);
240
            $this->payoneEntityManager->updatePaymentPayoneOrderItem($payoneOrderItemTransfer);
241
        }
242
    }
243
244
    /**
245
     * @param \SprykerEco\Zed\Payone\Business\Api\Response\Container\RefundResponseContainer $responseContainer
246
     *
247
     * @return string
248
     */
249
    protected function getPartialRefundStatus(RefundResponseContainer $responseContainer): string
250
    {
251
        if ($responseContainer->getStatus() === PayoneApiConstants::RESPONSE_TYPE_APPROVED) {
252
            return PayoneTransactionStatusConstants::STATUS_REFUND_APPROVED;
253
        }
254
255
        return PayoneTransactionStatusConstants::STATUS_REFUND_FAILED;
256
    }
257
}
258