Passed
Pull Request — master (#74)
by oleksandr
11:39
created

PayonePartialCaptureRequestSender::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 23
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 10
c 0
b 0
f 0
dl 0
loc 23
rs 9.9332
cc 1
nc 1
nop 11

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\CaptureResponseTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\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...
11
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...
12
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...
13
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...
14
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...
15
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...
16
use Spryker\Shared\Shipment\ShipmentConfig;
17
use SprykerEco\Shared\Payone\PayoneApiConstants;
18
use SprykerEco\Shared\Payone\PayoneTransactionStatusConstants;
19
use SprykerEco\Zed\Payone\Business\Api\Adapter\AdapterInterface;
20
use SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer;
21
use SprykerEco\Zed\Payone\Business\Api\Request\Container\Capture\BusinessContainer;
22
use SprykerEco\Zed\Payone\Business\Api\Response\Container\CaptureResponseContainer;
23
use SprykerEco\Zed\Payone\Business\Api\Response\Mapper\CaptureResponseMapperInterface;
24
use SprykerEco\Zed\Payone\Business\Distributor\OrderPriceDistributorInterface;
25
use SprykerEco\Zed\Payone\Business\Payment\DataMapper\ExpenseMapperInterface;
26
use SprykerEco\Zed\Payone\Business\Payment\DataMapper\ShipmentMapperInterface;
27
use SprykerEco\Zed\Payone\Business\Payment\DataMapper\StandartParameterMapperInterface;
28
use SprykerEco\Zed\Payone\Business\Payment\PaymentMapperReaderInterface;
29
use SprykerEco\Zed\Payone\Persistence\PayoneEntityManagerInterface;
30
use SprykerEco\Zed\Payone\Persistence\PayoneQueryContainerInterface;
31
use SprykerEco\Zed\Payone\Persistence\PayoneRepositoryInterface;
32
33
class PayonePartialCaptureRequestSender extends AbstractPayoneRequestSender implements PayonePartialCaptureRequestSenderInterface
34
{
35
    /**
36
     * @var string
37
     */
38
    protected const ITEM_STATE_SHIPPED = 'shipped';
39
40
    /**
41
     * @var \SprykerEco\Zed\Payone\Business\Api\Adapter\AdapterInterface
42
     */
43
    protected $executionAdapter;
44
45
    /**
46
     * @var \SprykerEco\Zed\Payone\Persistence\PayoneQueryContainerInterface
47
     */
48
    protected $queryContainer;
49
50
    /**
51
     * @var \Generated\Shared\Transfer\PayoneStandardParameterTransfer
52
     */
53
    protected $standardParameter;
54
55
    /**
56
     * @var \SprykerEco\Zed\Payone\Persistence\PayoneRepositoryInterface
57
     */
58
    protected $payoneRepository;
59
60
    /**
61
     * @var \SprykerEco\Zed\Payone\Persistence\PayoneEntityManagerInterface
62
     */
63
    protected $payoneEntityManager;
64
65
    /**
66
     * @var \SprykerEco\Zed\Payone\Business\Distributor\OrderPriceDistributorInterface
67
     */
68
    protected $orderPriceDistributor;
69
70
    /**
71
     * @var \SprykerEco\Zed\Payone\Business\Payment\DataMapper\StandartParameterMapperInterface
72
     */
73
    protected $standardParameterMapper;
74
75
    /**
76
     * @var \SprykerEco\Zed\Payone\Business\Payment\DataMapper\ShipmentMapperInterface
77
     */
78
    protected $shipmentMapper;
79
80
    /**
81
     * @var \SprykerEco\Zed\Payone\Business\Payment\PaymentMapperReaderInterface
82
     */
83
    protected $paymentMapperReader;
84
85
    /**
86
     * @var \SprykerEco\Zed\Payone\Business\Payment\DataMapper\ExpenseMapperInterface
87
     */
88
    protected $expenseMapper;
89
90
    /**
91
     * @var \SprykerEco\Zed\Payone\Business\Api\Response\Mapper\CaptureResponseMapperInterface
92
     */
93
    protected $captureResponseMapper;
94
95
    /**
96
     * @param \SprykerEco\Zed\Payone\Business\Api\Adapter\AdapterInterface $executionAdapter
97
     * @param \SprykerEco\Zed\Payone\Persistence\PayoneQueryContainerInterface $queryContainer
98
     * @param \SprykerEco\Zed\Payone\Business\Payment\PaymentMapperReaderInterface $paymentMapperReader
99
     * @param \SprykerEco\Zed\Payone\Business\Payment\DataMapper\ExpenseMapperInterface $expenseMapper
100
     * @param \Generated\Shared\Transfer\PayoneStandardParameterTransfer $standardParameter
101
     * @param \SprykerEco\Zed\Payone\Persistence\PayoneRepositoryInterface $payoneRepository
102
     * @param \SprykerEco\Zed\Payone\Persistence\PayoneEntityManagerInterface $payoneEntityManager
103
     * @param \SprykerEco\Zed\Payone\Business\Distributor\OrderPriceDistributorInterface $orderPriceDistributor
104
     * @param \SprykerEco\Zed\Payone\Business\Payment\DataMapper\StandartParameterMapperInterface $standardParameterMapper
105
     * @param \SprykerEco\Zed\Payone\Business\Payment\DataMapper\ShipmentMapperInterface $shipmentMapper
106
     * @param \SprykerEco\Zed\Payone\Business\Api\Response\Mapper\CaptureResponseMapperInterface $captureResponseMapper
107
     */
108
    public function __construct(
109
        AdapterInterface $executionAdapter,
110
        PayoneQueryContainerInterface $queryContainer,
111
        PaymentMapperReaderInterface $paymentMapperReader,
112
        ExpenseMapperInterface $expenseMapper,
113
        PayoneStandardParameterTransfer $standardParameter,
114
        PayoneRepositoryInterface $payoneRepository,
115
        PayoneEntityManagerInterface $payoneEntityManager,
116
        OrderPriceDistributorInterface $orderPriceDistributor,
117
        StandartParameterMapperInterface $standardParameterMapper,
118
        ShipmentMapperInterface $shipmentMapper,
119
        CaptureResponseMapperInterface $captureResponseMapper
120
    ) {
121
        parent::__construct($queryContainer, $paymentMapperReader);
122
        $this->executionAdapter = $executionAdapter;
123
        $this->standardParameter = $standardParameter;
124
        $this->payoneRepository = $payoneRepository;
125
        $this->payoneEntityManager = $payoneEntityManager;
126
        $this->orderPriceDistributor = $orderPriceDistributor;
127
        $this->standardParameterMapper = $standardParameterMapper;
128
        $this->shipmentMapper = $shipmentMapper;
129
        $this->expenseMapper = $expenseMapper;
130
        $this->captureResponseMapper = $captureResponseMapper;
131
    }
132
133
    /**
134
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
135
     *
136
     * @return \Generated\Shared\Transfer\CaptureResponseTransfer
137
     */
138
    public function executePartialCapture(
139
        PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
140
    ): CaptureResponseTransfer {
141
        $distributedPriceOrderTransfer = $this->orderPriceDistributor->distributeOrderPrice(
142
            $payonePartialOperationRequestTransfer->getOrderOrFail(),
143
        );
144
        $payonePartialOperationRequestTransfer->setOrder($distributedPriceOrderTransfer);
145
146
        $paymentPayoneEntity = $this->getPaymentEntity($payonePartialOperationRequestTransfer->getOrderOrFail()->getIdSalesOrderOrFail());
147
        $paymentMethodMapper = $this->getPaymentMethodMapper($paymentPayoneEntity);
148
149
        /** @var \SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer $requestContainer */
150
        $requestContainer = $paymentMethodMapper->mapPaymentToCapture($paymentPayoneEntity);
151
        $requestContainer = $this->preparePartialCaptureOrderItems($payonePartialOperationRequestTransfer, $requestContainer);
152
        $captureAmount = $this->calculatePartialCaptureItemsAmount($payonePartialOperationRequestTransfer);
153
154
        if ($this->checkThatDeliveryCostsAreRequired($payonePartialOperationRequestTransfer)) {
155
            $captureAmount += $this->getDeliveryCosts($payonePartialOperationRequestTransfer->getOrderOrFail());
156
            $requestContainer = $this->shipmentMapper->mapShipment($payonePartialOperationRequestTransfer->getOrder(), $requestContainer);
157
        }
158
159
        $captureAmount += $this->calculateExpensesCost($payonePartialOperationRequestTransfer->getOrderOrFail());
160
        /** @var \SprykerEco\Zed\Payone\Business\Api\Request\Container\CaptureContainer $requestContainer */
161
        $requestContainer = $this->expenseMapper->mapExpenses($payonePartialOperationRequestTransfer->getOrderOrFail(), $requestContainer);
162
        $businessContainer = new BusinessContainer();
163
        $businessContainer->setSettleAccount(PayoneApiConstants::SETTLE_ACCOUNT_YES);
164
        $requestContainer->setBusiness($businessContainer);
165
166
        $requestContainer->setAmount($captureAmount);
167
        $this->standardParameterMapper->setStandardParameter($requestContainer, $this->standardParameter);
168
169
        $apiLogEntity = $this->initializeApiLog($paymentPayoneEntity, $requestContainer);
170
171
        $rawResponse = $this->executionAdapter->sendRequest($requestContainer);
172
        $responseContainer = new CaptureResponseContainer($rawResponse);
173
174
        $this->updateApiLogAfterCapture($apiLogEntity, $responseContainer);
175
        $this->updatePaymentPayoneOrderItemsWithStatus(
176
            $payonePartialOperationRequestTransfer,
177
            $this->getPartialCaptureStatus($responseContainer),
178
        );
179
180
        return $this->captureResponseMapper->getCaptureResponseTransfer($responseContainer);
181
    }
182
183
    /**
184
     * @param \Orm\Zed\Payone\Persistence\SpyPaymentPayoneApiLog $apiLogEntity
185
     * @param \SprykerEco\Zed\Payone\Business\Api\Response\Container\CaptureResponseContainer $responseContainer
186
     *
187
     * @return void
188
     */
189
    protected function updateApiLogAfterCapture(SpyPaymentPayoneApiLog $apiLogEntity, CaptureResponseContainer $responseContainer): void
190
    {
191
        $apiLogEntity->setStatus($responseContainer->getStatus());
192
        $apiLogEntity->setTransactionId($responseContainer->getTxid());
193
        $apiLogEntity->setErrorMessageInternal($responseContainer->getErrormessage());
194
        $apiLogEntity->setErrorMessageUser($responseContainer->getCustomermessage());
195
        $apiLogEntity->setErrorCode($responseContainer->getErrorcode());
196
197
        $apiLogEntity->setRawResponse(json_encode($responseContainer->toArray()));
198
        $apiLogEntity->save();
199
    }
200
201
    /**
202
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
203
     * @param \SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer $container
204
     *
205
     * @return \SprykerEco\Zed\Payone\Business\Api\Request\Container\AbstractRequestContainer
206
     */
207
    protected function preparePartialCaptureOrderItems(
208
        PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer,
209
        AbstractRequestContainer $container
210
    ): AbstractRequestContainer {
211
        $arrayIt = [];
212
        $arrayId = [];
213
        $arrayPr = [];
214
        $arrayNo = [];
215
        $arrayDe = [];
216
        $arrayVa = [];
217
218
        $key = 1;
219
220
        foreach ($payonePartialOperationRequestTransfer->getOrder()->getItems() as $itemTransfer) {
221
            if (!in_array($itemTransfer->getIdSalesOrderItem(), $payonePartialOperationRequestTransfer->getSalesOrderItemIds())) {
222
                continue;
223
            }
224
225
            $arrayIt[$key] = PayoneApiConstants::INVOICING_ITEM_TYPE_GOODS;
226
            $arrayId[$key] = substr($itemTransfer->getSku(), 0, 32);
227
            $arrayPr[$key] = $itemTransfer->getUnitPriceToPayAggregation();
228
            $arrayNo[$key] = $itemTransfer->getQuantity();
229
            $arrayDe[$key] = $itemTransfer->getName();
230
            $arrayVa[$key] = (int)$itemTransfer->getTaxRate();
231
            $key++;
232
        }
233
234
        $container->setIt($arrayIt);
235
        $container->setId($arrayId);
236
        $container->setPr($arrayPr);
237
        $container->setNo($arrayNo);
238
        $container->setDe($arrayDe);
239
        $container->setVa($arrayVa);
240
241
        return $container;
242
    }
243
244
    /**
245
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
246
     *
247
     * @return int
248
     */
249
    protected function calculatePartialCaptureItemsAmount(PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer): int
250
    {
251
        $itemsAmount = 0;
252
        foreach ($payonePartialOperationRequestTransfer->getOrder()->getItems() as $itemTransfer) {
253
            if (in_array($itemTransfer->getIdSalesOrderItem(), $payonePartialOperationRequestTransfer->getSalesOrderItemIds())) {
254
                $itemsAmount += $itemTransfer->getSumPriceToPayAggregation();
255
            }
256
        }
257
258
        return $itemsAmount;
259
    }
260
261
    /**
262
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
263
     *
264
     * @return int
265
     */
266
    protected function getDeliveryCosts(OrderTransfer $orderTransfer): int
267
    {
268
        foreach ($orderTransfer->getExpenses() as $expense) {
269
            if ($expense->getType() === ShipmentConfig::SHIPMENT_EXPENSE_TYPE) {
270
                return $expense->getSumGrossPrice();
271
            }
272
        }
273
274
        return 0;
275
    }
276
277
    /**
278
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
279
     *
280
     * @return bool
281
     */
282
    protected function checkThatDeliveryCostsAreRequired(PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer): bool
283
    {
284
        foreach ($payonePartialOperationRequestTransfer->getOrder()->getItems() as $itemTransfer) {
285
            if (in_array($itemTransfer->getIdSalesOrderItem(), $payonePartialOperationRequestTransfer->getSalesOrderItemIds())) {
286
                continue;
287
            }
288
            foreach ($itemTransfer->getStateHistory() as $itemState) {
289
                if ($itemState->getName() === static::ITEM_STATE_SHIPPED) {
290
                    return false;
291
                }
292
            }
293
        }
294
295
        return true;
296
    }
297
298
    /**
299
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
300
     *
301
     * @return int
302
     */
303
    protected function calculateExpensesCost(OrderTransfer $orderTransfer): int
304
    {
305
        $expensesCostAmount = 0;
306
307
        foreach ($orderTransfer->getExpenses() as $expense) {
308
            if ($expense->getType() !== ShipmentConfig::SHIPMENT_EXPENSE_TYPE) {
309
                $expensesCostAmount += $expense->getSumGrossPrice();
310
            }
311
        }
312
313
        return $expensesCostAmount;
314
    }
315
316
    /**
317
     * @param \Generated\Shared\Transfer\PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer
318
     * @param string $refundStatus
319
     *
320
     * @return void
321
     */
322
    protected function updatePaymentPayoneOrderItemsWithStatus(
323
        PayonePartialOperationRequestTransfer $payonePartialOperationRequestTransfer,
324
        string $refundStatus
325
    ): void {
326
        $payoneOrderItemFilterTransfer = (new PayoneOrderItemFilterTransfer())
327
            ->setIdSalesOrder($payonePartialOperationRequestTransfer->getOrder()->getIdSalesOrder())
328
            ->setSalesOrderItemIds($payonePartialOperationRequestTransfer->getSalesOrderItemIds());
329
330
        $payoneOrderItemTransfers = $this->payoneRepository->findPaymentPayoneOrderItemByFilter($payoneOrderItemFilterTransfer);
331
332
        foreach ($payoneOrderItemTransfers as $payoneOrderItemTransfer) {
333
            $payoneOrderItemTransfer->setStatus($refundStatus);
334
            $this->payoneEntityManager->updatePaymentPayoneOrderItem($payoneOrderItemTransfer);
335
        }
336
    }
337
338
    /**
339
     * @param \SprykerEco\Zed\Payone\Business\Api\Response\Container\CaptureResponseContainer $responseContainer
340
     *
341
     * @return string
342
     */
343
    protected function getPartialCaptureStatus(CaptureResponseContainer $responseContainer): string
344
    {
345
        if ($responseContainer->getStatus() === PayoneApiConstants::RESPONSE_TYPE_APPROVED) {
346
            return PayoneTransactionStatusConstants::STATUS_CAPTURE_APPROVED;
347
        }
348
349
        return PayoneTransactionStatusConstants::STATUS_CAPTURE_FAILED;
350
    }
351
}
352