getPaymentCrefoPayTransfer()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 29
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
cc 4
eloc 18
c 1
b 1
f 0
nc 4
nop 1
dl 0
loc 29
rs 9.6666
1
<?php
2
3
/**
4
 * MIT License
5
 * For full license information, please view the LICENSE file that was distributed with this source code.
6
 */
7
8
namespace SprykerEco\Zed\CrefoPay\Business\Oms\Command\Saver;
9
10
use ArrayObject;
11
use Generated\Shared\Transfer\CrefoPayOmsCommandTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...foPayOmsCommandTransfer 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\ExpenseTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\ExpenseTransfer 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\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...
14
use Generated\Shared\Transfer\PaymentCrefoPayOrderItemCollectionTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...rItemCollectionTransfer 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 Generated\Shared\Transfer\PaymentCrefoPayOrderItemTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...efoPayOrderItemTransfer 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 Generated\Shared\Transfer\PaymentCrefoPayTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\PaymentCrefoPayTransfer 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...
17
use SprykerEco\Zed\CrefoPay\Business\Mapper\OmsStatus\CrefoPayOmsStatusMapperInterface;
18
use SprykerEco\Zed\CrefoPay\Business\Reader\CrefoPayReaderInterface;
19
use SprykerEco\Zed\CrefoPay\Business\Writer\CrefoPayWriterInterface;
20
use SprykerEco\Zed\CrefoPay\CrefoPayConfig;
21
use SprykerEco\Zed\CrefoPay\Dependency\Facade\CrefoPayToOmsFacadeInterface;
22
23
class CaptureOmsCommandSaver implements CrefoPayOmsCommandSaverInterface
24
{
25
    /**
26
     * @var \SprykerEco\Zed\CrefoPay\Business\Reader\CrefoPayReaderInterface
27
     */
28
    protected $reader;
29
30
    /**
31
     * @var \SprykerEco\Zed\CrefoPay\Business\Writer\CrefoPayWriterInterface
32
     */
33
    protected $writer;
34
35
    /**
36
     * @var \SprykerEco\Zed\CrefoPay\CrefoPayConfig
37
     */
38
    protected $config;
39
40
    /**
41
     * @var \SprykerEco\Zed\CrefoPay\Dependency\Facade\CrefoPayToOmsFacadeInterface
42
     */
43
    protected $omsFacade;
44
45
    /**
46
     * @var \SprykerEco\Zed\CrefoPay\Business\Mapper\OmsStatus\CrefoPayOmsStatusMapperInterface
47
     */
48
    protected $statusMapper;
49
50
    /**
51
     * @param \SprykerEco\Zed\CrefoPay\Business\Reader\CrefoPayReaderInterface $reader
52
     * @param \SprykerEco\Zed\CrefoPay\Business\Writer\CrefoPayWriterInterface $writer
53
     * @param \SprykerEco\Zed\CrefoPay\CrefoPayConfig $config
54
     * @param \SprykerEco\Zed\CrefoPay\Dependency\Facade\CrefoPayToOmsFacadeInterface $omsFacade
55
     * @param \SprykerEco\Zed\CrefoPay\Business\Mapper\OmsStatus\CrefoPayOmsStatusMapperInterface $statusMapper
56
     */
57
    public function __construct(
58
        CrefoPayReaderInterface $reader,
59
        CrefoPayWriterInterface $writer,
60
        CrefoPayConfig $config,
61
        CrefoPayToOmsFacadeInterface $omsFacade,
62
        CrefoPayOmsStatusMapperInterface $statusMapper
63
    ) {
64
        $this->reader = $reader;
65
        $this->writer = $writer;
66
        $this->config = $config;
67
        $this->omsFacade = $omsFacade;
68
        $this->statusMapper = $statusMapper;
69
    }
70
71
    /**
72
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
73
     *
74
     * @return void
75
     */
76
    public function savePaymentEntities(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): void
77
    {
78
        if ($crefoPayOmsCommandTransfer->getResponse()->getIsSuccess() === false) {
79
            return;
80
        }
81
82
        $this->writer->updatePaymentEntities(
83
            $this->getPaymentCrefoPayOrderItemsToCapture($crefoPayOmsCommandTransfer),
84
            $this->getPaymentCrefoPayTransfer($crefoPayOmsCommandTransfer),
85
            $crefoPayOmsCommandTransfer->getResponse()->getCrefoPayApiLogId(),
86
        );
87
88
        $this->triggerRemainingOrderItems($crefoPayOmsCommandTransfer);
89
    }
90
91
    /**
92
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
93
     *
94
     * @return \Generated\Shared\Transfer\PaymentCrefoPayOrderItemCollectionTransfer
95
     */
96
    protected function getPaymentCrefoPayOrderItemsToCapture(
97
        CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
98
    ): PaymentCrefoPayOrderItemCollectionTransfer {
99
        $status = $this->statusMapper
100
            ->mapNotificationOrderStatusToOmsStatus(
101
                $crefoPayOmsCommandTransfer->getResponse()->getCaptureResponse()->getStatus(),
102
            );
103
        $captureId = $crefoPayOmsCommandTransfer->getRequest()->getCaptureRequest()->getCaptureID();
104
105
        $paymentCrefoPayOrderItems = array_map(
106
            function (PaymentCrefoPayOrderItemTransfer $paymentCrefoPayOrderItemTransfer) use ($status, $captureId) {
107
                return $paymentCrefoPayOrderItemTransfer
108
                    ->setStatus($status)
109
                    ->setCaptureId($captureId);
110
            },
111
            $crefoPayOmsCommandTransfer
112
                ->getPaymentCrefoPayOrderItemCollection()
113
                ->getCrefoPayOrderItems()
114
                ->getArrayCopy(),
115
        );
116
117
        return $crefoPayOmsCommandTransfer
118
            ->getPaymentCrefoPayOrderItemCollection()
119
            ->setCrefoPayOrderItems(
120
                new ArrayObject($paymentCrefoPayOrderItems),
121
            );
122
    }
123
124
    /**
125
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
126
     *
127
     * @return \Generated\Shared\Transfer\PaymentCrefoPayTransfer
128
     */
129
    protected function getPaymentCrefoPayTransfer(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): PaymentCrefoPayTransfer
130
    {
131
        $paymentCrefoPayTransfer = $crefoPayOmsCommandTransfer->getPaymentCrefoPay();
132
        $captureRequest = $crefoPayOmsCommandTransfer->getRequest()->getCaptureRequest();
133
        $capturedAmount = $paymentCrefoPayTransfer->getCapturedAmount();
134
135
        if ($this->isExpensesCaptureRequestPerformedSuccessfully($crefoPayOmsCommandTransfer)) {
136
            $expensesCaptureRequest = $crefoPayOmsCommandTransfer->getExpensesRequest()->getCaptureRequest();
137
            $paymentCrefoPayTransfer
138
                ->setExpensesCaptureId($expensesCaptureRequest->getCaptureID())
139
                ->setExpensesCapturedAmount($expensesCaptureRequest->getAmount()->getAmount());
140
141
            $capturedAmount += $expensesCaptureRequest->getAmount()->getAmount();
142
        }
143
144
        if ($capturedAmount === 0 && !$this->config->getCaptureExpensesSeparately()) {
145
            $paymentCrefoPayTransfer
146
                ->setExpensesCaptureId($captureRequest->getCaptureID())
147
                ->setExpensesCapturedAmount(
148
                    $this->calculateExpensesAmount(
149
                        $crefoPayOmsCommandTransfer->getOrder(),
150
                    ),
151
                );
152
        }
153
154
        $capturedAmount += $captureRequest->getAmount()->getAmount();
155
156
        return $paymentCrefoPayTransfer
157
            ->setCapturedAmount($capturedAmount);
158
    }
159
160
    /**
161
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
162
     *
163
     * @return void
164
     */
165
    protected function triggerRemainingOrderItems(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): void
166
    {
167
        $remainingOrderItems = $this->getRemainingOrderItems($crefoPayOmsCommandTransfer);
168
169
        if (count($remainingOrderItems) === 0) {
170
            return;
171
        }
172
173
        $affectedSalesOrderItemIds = array_map(
174
            function (PaymentCrefoPayOrderItemTransfer $paymentCrefoPayOrderItemTransfer) {
175
                return $paymentCrefoPayOrderItemTransfer->getIdSalesOrderItem();
176
            },
177
            $remainingOrderItems,
178
        );
179
180
        $this->omsFacade->triggerEventForOrderItems(
181
            $this->config->getOmsEventNoCancellation(),
182
            $affectedSalesOrderItemIds,
183
            [$this->config->getCrefoPayAutomaticOmsTrigger()],
184
        );
185
    }
186
187
    /**
188
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
189
     *
190
     * @return array<\Generated\Shared\Transfer\PaymentCrefoPayOrderItemTransfer>
191
     */
192
    protected function getRemainingOrderItems(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): array
193
    {
194
        $paymentCrefoPayOrderItemCollection = $this->reader
195
            ->getPaymentCrefoPayOrderItemCollectionByCrefoPayOrderId(
196
                $crefoPayOmsCommandTransfer->getPaymentCrefoPay()->getCrefoPayOrderId(),
197
            );
198
199
        return array_filter(
200
            $paymentCrefoPayOrderItemCollection->getCrefoPayOrderItems()->getArrayCopy(),
201
            function (PaymentCrefoPayOrderItemTransfer $paymentCrefoPayOrderItemTransfer) {
202
                return $paymentCrefoPayOrderItemTransfer->getStatus() === $this->config->getOmsStatusWaitingForCapture();
203
            },
204
        );
205
    }
206
207
    /**
208
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
209
     *
210
     * @return bool
211
     */
212
    protected function isExpensesCaptureRequestPerformedSuccessfully(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): bool
213
    {
214
        return $crefoPayOmsCommandTransfer->getExpensesResponse() !== null && $crefoPayOmsCommandTransfer->getExpensesResponse()->getIsSuccess();
215
    }
216
217
    /**
218
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
219
     *
220
     * @return int
221
     */
222
    protected function calculateExpensesAmount(OrderTransfer $orderTransfer): int
223
    {
224
        return (int)array_sum(
225
            array_map(
226
                function (ExpenseTransfer $expense) {
227
                    return $expense->getSumPriceToPayAggregation();
228
                },
229
                $orderTransfer->getExpenses()->getArrayCopy(),
230
            ),
231
        );
232
    }
233
}
234