Passed
Pull Request — master (#74)
by
unknown
10:50
created

isNeedToAddDeliveryCosts()   A

Complexity

Conditions 5
Paths 4

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

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