Passed
Pull Request — master (#4)
by Aleksey
11:47 queued 02:44
created

getAffectedSalesOrderItemIds()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 26
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 15
nc 2
nop 1
dl 0
loc 26
rs 9.7666
c 0
b 0
f 0
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\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...
13
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...
14
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...
15
use SprykerEco\Zed\CrefoPay\Business\Mapper\OmsStatus\CrefoPayOmsStatusMapperInterface;
16
use SprykerEco\Zed\CrefoPay\Business\Reader\CrefoPayReaderInterface;
17
use SprykerEco\Zed\CrefoPay\Business\Writer\CrefoPayWriterInterface;
18
use SprykerEco\Zed\CrefoPay\CrefoPayConfig;
19
use SprykerEco\Zed\CrefoPay\Dependency\Facade\CrefoPayToOmsFacadeInterface;
20
21
class CaptureOmsCommandSaver implements CrefoPayOmsCommandSaverInterface
22
{
23
    /**
24
     * @var \SprykerEco\Zed\CrefoPay\Business\Reader\CrefoPayReaderInterface
25
     */
26
    protected $reader;
27
28
    /**
29
     * @var \SprykerEco\Zed\CrefoPay\Business\Writer\CrefoPayWriterInterface
30
     */
31
    protected $writer;
32
33
    /**
34
     * @var \SprykerEco\Zed\CrefoPay\CrefoPayConfig
35
     */
36
    protected $config;
37
38
    /**
39
     * @var \SprykerEco\Zed\CrefoPay\Dependency\Facade\CrefoPayToOmsFacadeInterface
40
     */
41
    protected $omsFacade;
42
43
    /**
44
     * @var \SprykerEco\Zed\CrefoPay\Business\Mapper\OmsStatus\CrefoPayOmsStatusMapperInterface
45
     */
46
    protected $statusMapper;
47
48
    /**
49
     * @param \SprykerEco\Zed\CrefoPay\Business\Reader\CrefoPayReaderInterface $reader
50
     * @param \SprykerEco\Zed\CrefoPay\Business\Writer\CrefoPayWriterInterface $writer
51
     * @param \SprykerEco\Zed\CrefoPay\CrefoPayConfig $config
52
     * @param \SprykerEco\Zed\CrefoPay\Dependency\Facade\CrefoPayToOmsFacadeInterface $omsFacade
53
     * @param \SprykerEco\Zed\CrefoPay\Business\Mapper\OmsStatus\CrefoPayOmsStatusMapperInterface $statusMapper
54
     */
55
    public function __construct(
56
        CrefoPayReaderInterface $reader,
57
        CrefoPayWriterInterface $writer,
58
        CrefoPayConfig $config,
59
        CrefoPayToOmsFacadeInterface $omsFacade,
60
        CrefoPayOmsStatusMapperInterface $statusMapper
61
    ) {
62
        $this->reader = $reader;
63
        $this->writer = $writer;
64
        $this->config = $config;
65
        $this->omsFacade = $omsFacade;
66
        $this->statusMapper = $statusMapper;
67
    }
68
69
    /**
70
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
71
     *
72
     * @return void
73
     */
74
    public function savePaymentEntities(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): void
75
    {
76
        if ($crefoPayOmsCommandTransfer->getResponse()->getIsSuccess() === false) {
77
            return;
78
        }
79
80
        $isFirstCommandExecution = $this->isFirstCommandExecution($crefoPayOmsCommandTransfer);
81
82
        $this->writer->updatePaymentEntities(
83
            $this->getPaymentCrefoPayOrderItemsToCapture($crefoPayOmsCommandTransfer),
84
            $this->getPaymentCrefoPayTransfer($crefoPayOmsCommandTransfer),
85
            $crefoPayOmsCommandTransfer->getResponse()->getCrefoPayApiLogId()
86
        );
87
88
        if (!$this->isSingleOrderItemCommandExecution($crefoPayOmsCommandTransfer) || !$isFirstCommandExecution) {
89
            return;
90
        }
91
92
        $this->omsFacade->triggerEventForOrderItems(
93
            $this->config->getOmsEventNoCancellation(),
94
            $this->getAffectedSalesOrderItemIds($crefoPayOmsCommandTransfer),
95
            [$this->config->getCrefoPayAutomaticOmsTrigger()]
96
        );
97
    }
98
99
    /**
100
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
101
     *
102
     * @return \Generated\Shared\Transfer\PaymentCrefoPayOrderItemCollectionTransfer
103
     */
104
    protected function getPaymentCrefoPayOrderItemsToCapture(
105
        CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
106
    ): PaymentCrefoPayOrderItemCollectionTransfer {
107
108
        $status = $this->statusMapper
109
            ->mapNotificationOrderStatusToOmsStatus(
110
                $crefoPayOmsCommandTransfer->getResponse()->getCaptureResponse()->getStatus()
111
            );
112
        $captureId = $crefoPayOmsCommandTransfer->getRequest()->getCaptureRequest()->getCaptureID();
113
        $paymentCrefoPayOrderItemCollection = $crefoPayOmsCommandTransfer->getPaymentCrefoPayOrderItemCollection();
114
115
        $paymentCrefoPayOrderItems = array_map(
116
            function (PaymentCrefoPayOrderItemTransfer $paymentCrefoPayOrderItemTransfer) use ($status, $captureId) {
117
                return $paymentCrefoPayOrderItemTransfer
118
                    ->setStatus($status)
119
                    ->setCaptureId($captureId);
120
            },
121
            $paymentCrefoPayOrderItemCollection->getCrefoPayOrderItems()->getArrayCopy()
122
        );
123
124
        return $paymentCrefoPayOrderItemCollection
125
            ->setCrefoPayOrderItems(new ArrayObject($paymentCrefoPayOrderItems));
126
    }
127
128
    /**
129
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
130
     *
131
     * @return \Generated\Shared\Transfer\PaymentCrefoPayTransfer
132
     */
133
    protected function getPaymentCrefoPayTransfer(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): PaymentCrefoPayTransfer
134
    {
135
        $paymentCrefoPayTransfer = $crefoPayOmsCommandTransfer->getPaymentCrefoPay();
136
        $capturedAmount = $paymentCrefoPayTransfer->getCapturedAmount();
137
        $capturedAmount += $crefoPayOmsCommandTransfer->getRequest()->getCaptureRequest()->getAmount()->getAmount();
138
139
        if ($crefoPayOmsCommandTransfer->getExpensesResponse() && $crefoPayOmsCommandTransfer->getExpensesResponse()->getIsSuccess()) {
140
            $capturedAmount += $crefoPayOmsCommandTransfer->getExpensesRequest()->getCaptureRequest()->getAmount()->getAmount();
141
        }
142
143
        return $paymentCrefoPayTransfer
144
            ->setCapturedAmount($capturedAmount);
145
    }
146
147
    /**
148
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
149
     *
150
     * @return bool
151
     */
152
    protected function isSingleOrderItemCommandExecution(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): bool
153
    {
154
        $paymentCrefoPayOrderItemCollection = $crefoPayOmsCommandTransfer->getPaymentCrefoPayOrderItemCollection();
155
156
        return $paymentCrefoPayOrderItemCollection->getCrefoPayOrderItems()->count() === 1;
157
    }
158
159
    /**
160
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
161
     *
162
     * @return bool
163
     */
164
    protected function isFirstCommandExecution(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): bool
165
    {
166
        return $crefoPayOmsCommandTransfer->getPaymentCrefoPay()->getCapturedAmount() === 0;
167
    }
168
169
    /**
170
     * @param \Generated\Shared\Transfer\CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer
171
     *
172
     * @return int[]
173
     */
174
    protected function getAffectedSalesOrderItemIds(CrefoPayOmsCommandTransfer $crefoPayOmsCommandTransfer): array
175
    {
176
        $paymentCrefoPayOrderItemCollection = $this->reader
177
            ->findPaymentCrefoPayOrderItemsByCrefoPayOrderIdAndCaptureId(
178
                $crefoPayOmsCommandTransfer->getPaymentCrefoPay()->getCrefoPayOrderId()
179
            );
180
181
        /** @var \Generated\Shared\Transfer\PaymentCrefoPayOrderItemTransfer $paymentCrefoPayOrderItemTransfer */
182
        $paymentCrefoPayOrderItemTransfer = $crefoPayOmsCommandTransfer
183
            ->getPaymentCrefoPayOrderItemCollection()
184
            ->getCrefoPayOrderItems()
185
            ->offsetGet(0);
186
187
        $affectedSalesOrderItemIds = array_map(
188
            function (PaymentCrefoPayOrderItemTransfer $paymentCrefoPayOrderItemTransfer) {
189
                return $paymentCrefoPayOrderItemTransfer->getFkSalesOrderItem();
190
            },
191
            $paymentCrefoPayOrderItemCollection->getCrefoPayOrderItems()->getArrayCopy()
192
        );
193
194
        $key = array_search($paymentCrefoPayOrderItemTransfer->getFkSalesOrderItem(), $affectedSalesOrderItemIds);
195
        if ($key !== false) {
196
            unset($affectedSalesOrderItemIds[$key]);
197
        }
198
199
        return $affectedSalesOrderItemIds;
200
    }
201
}
202