Completed
Push — master ( eaf845...272b76 )
by Oleksandr
13s queued 10s
created

getPaymentCrefoPayTransfer()   A

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
100
        $status = $this->statusMapper
101
            ->mapNotificationOrderStatusToOmsStatus(
102
                $crefoPayOmsCommandTransfer->getResponse()->getCaptureResponse()->getStatus()
103
            );
104
        $captureId = $crefoPayOmsCommandTransfer->getRequest()->getCaptureRequest()->getCaptureID();
105
106
        $paymentCrefoPayOrderItems = array_map(
107
            function (PaymentCrefoPayOrderItemTransfer $paymentCrefoPayOrderItemTransfer) use ($status, $captureId) {
108
                return $paymentCrefoPayOrderItemTransfer
109
                    ->setStatus($status)
110
                    ->setCaptureId($captureId);
111
            },
112
            $crefoPayOmsCommandTransfer
113
                ->getPaymentCrefoPayOrderItemCollection()
114
                ->getCrefoPayOrderItems()
115
                ->getArrayCopy()
116
        );
117
118
        return $crefoPayOmsCommandTransfer
119
            ->getPaymentCrefoPayOrderItemCollection()
120
            ->setCrefoPayOrderItems(
121
                new ArrayObject($paymentCrefoPayOrderItems)
122
            );
123
    }
124
125
    /**
126
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
127
     *
128
     * @return \Generated\Shared\Transfer\PaymentCrefoPayTransfer
129
     */
130
    protected function getPaymentCrefoPayTransfer(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): PaymentCrefoPayTransfer
131
    {
132
        $paymentCrefoPayTransfer = $crefoPayOmsCommandTransfer->getPaymentCrefoPay();
133
        $captureRequest = $crefoPayOmsCommandTransfer->getRequest()->getCaptureRequest();
134
        $capturedAmount = $paymentCrefoPayTransfer->getCapturedAmount();
135
136
        if ($this->isExpensesCaptureRequestPerformedSuccessfully($crefoPayOmsCommandTransfer)) {
137
            $expensesCaptureRequest = $crefoPayOmsCommandTransfer->getExpensesRequest()->getCaptureRequest();
138
            $paymentCrefoPayTransfer
139
                ->setExpensesCaptureId($expensesCaptureRequest->getCaptureID())
140
                ->setExpensesCapturedAmount($expensesCaptureRequest->getAmount()->getAmount());
141
142
            $capturedAmount += $expensesCaptureRequest->getAmount()->getAmount();
143
        }
144
145
        if ($capturedAmount === 0 && !$this->config->getCaptureExpensesSeparately()) {
146
            $paymentCrefoPayTransfer
147
                ->setExpensesCaptureId($captureRequest->getCaptureID())
148
                ->setExpensesCapturedAmount(
149
                    $this->calculateExpensesAmount(
150
                        $crefoPayOmsCommandTransfer->getOrder()
151
                    )
152
                );
153
        }
154
155
        $capturedAmount += $captureRequest->getAmount()->getAmount();
156
157
        return $paymentCrefoPayTransfer
158
            ->setCapturedAmount($capturedAmount);
159
    }
160
161
    /**
162
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
163
     *
164
     * @return void
165
     */
166
    protected function triggerRemainingOrderItems(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): void
167
    {
168
        $remainingOrderItems = $this->getRemainingOrderItems($crefoPayOmsCommandTransfer);
169
170
        if (count($remainingOrderItems) === 0) {
171
            return;
172
        }
173
174
        $affectedSalesOrderItemIds = array_map(
175
            function (PaymentCrefoPayOrderItemTransfer $paymentCrefoPayOrderItemTransfer) {
176
                return $paymentCrefoPayOrderItemTransfer->getIdSalesOrderItem();
177
            },
178
            $remainingOrderItems
179
        );
180
181
        $this->omsFacade->triggerEventForOrderItems(
182
            $this->config->getOmsEventNoCancellation(),
183
            $affectedSalesOrderItemIds,
184
            [$this->config->getCrefoPayAutomaticOmsTrigger()]
185
        );
186
    }
187
188
    /**
189
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
190
     *
191
     * @return \Generated\Shared\Transfer\PaymentCrefoPayOrderItemTransfer[]
192
     */
193
    protected function getRemainingOrderItems(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): array
194
    {
195
        $paymentCrefoPayOrderItemCollection = $this->reader
196
            ->getPaymentCrefoPayOrderItemCollectionByCrefoPayOrderId(
197
                $crefoPayOmsCommandTransfer->getPaymentCrefoPay()->getCrefoPayOrderId()
198
            );
199
200
        return array_filter(
201
            $paymentCrefoPayOrderItemCollection->getCrefoPayOrderItems()->getArrayCopy(),
202
            function (PaymentCrefoPayOrderItemTransfer $paymentCrefoPayOrderItemTransfer) {
203
                return $paymentCrefoPayOrderItemTransfer->getStatus() === $this->config->getOmsStatusWaitingForCapture();
204
            }
205
        );
206
    }
207
208
    /**
209
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
210
     *
211
     * @return bool
212
     */
213
    protected function isExpensesCaptureRequestPerformedSuccessfully(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): bool
214
    {
215
        return $crefoPayOmsCommandTransfer->getExpensesResponse() !== null && $crefoPayOmsCommandTransfer->getExpensesResponse()->getIsSuccess();
216
    }
217
218
    /**
219
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
220
     *
221
     * @return int
222
     */
223
    protected function calculateExpensesAmount(OrderTransfer $orderTransfer): int
224
    {
225
        return (int)array_sum(
226
            array_map(
227
                function (ExpenseTransfer $expense) {
228
                    return $expense->getSumPriceToPayAggregation();
229
                },
230
                $orderTransfer->getExpenses()->getArrayCopy()
231
            )
232
        );
233
    }
234
}
235