AbstractMethod::loadOrderPaymentLogs()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 7
c 1
b 0
f 0
nc 2
nop 2
dl 0
loc 12
rs 10
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\Ratepay\Business\Request\Payment\Method;
9
10
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...
11
use Generated\Shared\Transfer\RatepayPaymentInitTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...epayPaymentInitTransfer 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\RatepayPaymentRequestTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...yPaymentRequestTransfer 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 SprykerEco\Zed\Ratepay\Business\Api\Constants;
14
use SprykerEco\Zed\Ratepay\Business\Api\Constants as ApiConstants;
15
use SprykerEco\Zed\Ratepay\Business\Api\Mapper\MapperFactory;
16
use SprykerEco\Zed\Ratepay\Business\Api\Model\RequestModelBuilderInterface;
17
use SprykerEco\Zed\Ratepay\Business\Request\RequestMethodInterface;
18
use SprykerEco\Zed\Ratepay\Persistence\RatepayQueryContainerInterface;
19
20
abstract class AbstractMethod implements MethodInterface, RequestMethodInterface
21
{
22
    /**
23
     * @var \SprykerEco\Zed\Ratepay\Business\Api\Adapter\AdapterInterface
24
     */
25
    protected $adapter;
26
27
    /**
28
     * @var \SprykerEco\Zed\Ratepay\Business\Api\Model\RequestModelBuilderInterface
29
     */
30
    protected $modelFactory;
31
32
    /**
33
     * @var \SprykerEco\Zed\Ratepay\Business\Api\Mapper\MapperFactory
34
     */
35
    protected $mapperFactory;
36
37
    /**
38
     * @var \SprykerEco\Zed\Ratepay\Persistence\RatepayQueryContainerInterface $ratepayQueryContainer
39
     */
40
    protected $ratepayQueryContainer;
41
42
    /**
43
     * @param \SprykerEco\Zed\Ratepay\Business\Api\Model\RequestModelBuilderInterface $modelFactory
44
     * @param \SprykerEco\Zed\Ratepay\Business\Api\Mapper\MapperFactory $mapperFactory
45
     * @param \SprykerEco\Zed\Ratepay\Persistence\RatepayQueryContainerInterface $ratepayQueryContainer
46
     */
47
    public function __construct(
48
        RequestModelBuilderInterface $modelFactory,
49
        MapperFactory $mapperFactory,
50
        RatepayQueryContainerInterface $ratepayQueryContainer
51
    ) {
52
        $this->modelFactory = $modelFactory;
53
        $this->mapperFactory = $mapperFactory;
54
        $this->ratepayQueryContainer = $ratepayQueryContainer;
55
    }
56
57
    /**
58
     * @param \Generated\Shared\Transfer\RatepayPaymentInitTransfer $ratepayPaymentInitTransfer
59
     *
60
     * @return \SprykerEco\Zed\Ratepay\Business\Api\Model\Payment\Init
61
     */
62
    public function paymentInit(RatepayPaymentInitTransfer $ratepayPaymentInitTransfer)
63
    {
64
        $request = $this->modelFactory->build(ApiConstants::REQUEST_MODEL_PAYMENT_INIT);
65
        $this->mapPaymentInitHeadData($ratepayPaymentInitTransfer);
66
67
        return $request;
68
    }
69
70
    /**
71
     * @param \Generated\Shared\Transfer\RatepayPaymentRequestTransfer $ratepayPaymentRequestTransfer
72
     *
73
     * @return \SprykerEco\Zed\Ratepay\Business\Api\Model\Payment\Request
74
     */
75
    public function paymentRequest(RatepayPaymentRequestTransfer $ratepayPaymentRequestTransfer)
76
    {
77
        /*
78
         * @var \SprykerEco\Zed\Ratepay\Business\Api\Model\Payment\Request $request
79
         */
80
        $request = $this->modelFactory->build(ApiConstants::REQUEST_MODEL_PAYMENT_REQUEST);
81
        $this->mapPaymentInitHeadData($ratepayPaymentRequestTransfer->getRatepayPaymentInit());
82
        $this->mapPaymentData($ratepayPaymentRequestTransfer);
83
84
        return $request;
85
    }
86
87
    /**
88
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
89
     *
90
     * @return \SprykerEco\Zed\Ratepay\Business\Api\Model\Payment\Confirm
91
     */
92
    public function paymentConfirm(OrderTransfer $orderTransfer)
93
    {
94
        $payment = $this->loadOrderPayment($orderTransfer);
95
96
        /*
97
         * @var \SprykerEco\Zed\Ratepay\Business\Api\Model\Payment\Confirm $request
98
         */
99
        $request = $this->modelFactory->build(ApiConstants::REQUEST_MODEL_PAYMENT_CONFIRM);
100
        $this->mapOrderHeadData($orderTransfer, $payment);
101
102
        return $request;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $request returns the type SprykerEco\Zed\Ratepay\B...i\Model\Payment\Confirm which is incompatible with the return type mandated by SprykerEco\Zed\Ratepay\B...rface::paymentConfirm() of SprykerEco\Zed\Ratepay\B...i\Model\Payment\Request.

In the issue above, the returned value is violating the contract defined by the mentioned interface.

Let's take a look at an example:

interface HasName {
    /** @return string */
    public function getName();
}

class Name {
    public $name;
}

class User implements HasName {
    /** @return string|Name */
    public function getName() {
        return new Name('foo'); // This is a violation of the ``HasName`` interface
                                // which only allows a string value to be returned.
    }
}
Loading history...
103
    }
104
105
    /**
106
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
107
     * @param \Generated\Shared\Transfer\OrderTransfer $partialOrderTransfer
108
     * @param \Generated\Shared\Transfer\ItemTransfer[] $orderItems
109
     *
110
     * @return \SprykerEco\Zed\Ratepay\Business\Api\Model\Payment\Request
111
     */
112
    public function deliveryConfirm(
113
        OrderTransfer $orderTransfer,
114
        OrderTransfer $partialOrderTransfer,
115
        array $orderItems
116
    ) {
117
        $payment = $this->loadOrderPayment($orderTransfer);
118
        $paymentLogs = $this->loadOrderPaymentLogs($orderTransfer, Constants::REQUEST_MODEL_DELIVER_CONFIRM);
119
        $paymentData = $this->getTransferObjectFromPayment($payment);
120
        $needToSendShipping = true;
121
        /** @var \Orm\Zed\Ratepay\Persistence\SpyPaymentRatepayLog $paymentLog */
122
        foreach ($paymentLogs as $paymentLog) {
123
            if (Constants::REQUEST_CODE_SUCCESS_MATRIX[Constants::REQUEST_MODEL_DELIVER_CONFIRM] == $paymentLog->getResponseResultCode()) {
124
                $needToSendShipping = false;
125
            }
126
        }
127
128
        /*
129
         * @var \SprykerEco\Zed\Ratepay\Business\Api\Model\Payment\Request $request
130
         */
131
        $request = $this->modelFactory->build(ApiConstants::REQUEST_MODEL_DELIVER_CONFIRM);
132
133
        $this->mapOrderHeadData($orderTransfer, $payment);
134
        $this->mapPartialShoppingBasketAndItems(
135
            $orderTransfer,
136
            $partialOrderTransfer,
137
            $paymentData,
138
            $orderItems,
139
            $needToSendShipping
140
        );
141
142
        return $request;
143
    }
144
145
    /**
146
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
147
     * @param \Generated\Shared\Transfer\OrderTransfer $partialOrderTransfer
148
     * @param \Generated\Shared\Transfer\ItemTransfer[] $orderItems
149
     *
150
     * @return \SprykerEco\Zed\Ratepay\Business\Api\Model\Payment\Request
151
     */
152
    public function paymentCancel(
153
        OrderTransfer $orderTransfer,
154
        OrderTransfer $partialOrderTransfer,
155
        array $orderItems
156
    ) {
157
        $payment = $this->loadOrderPayment($orderTransfer);
158
        $allOrderItems = $payment->getSpySalesOrder()->getItems();
159
        $paymentLogs = $this->loadOrderPaymentLogs($orderTransfer, Constants::REQUEST_MODEL_PAYMENT_CANCEL);
160
        $paymentData = $this->getTransferObjectFromPayment($payment);
161
        $canceledItemsCount = count($orderItems);
162
        /** @var \Orm\Zed\Ratepay\Persistence\SpyPaymentRatepayLog $paymentLog */
163
        foreach ($paymentLogs as $paymentLog) {
164
            if (Constants::REQUEST_CODE_SUCCESS_MATRIX[Constants::REQUEST_MODEL_PAYMENT_CANCEL] == $paymentLog->getResponseResultCode()) {
165
                $canceledItemsCount += $paymentLog->getItemCount();
166
            }
167
        }
168
        $needToSendShipping = (count($allOrderItems) == $canceledItemsCount);
169
170
        /*
171
         * @var \SprykerEco\Zed\Ratepay\Business\Api\Model\Payment\Request $request
172
         */
173
        $request = $this->modelFactory->build(ApiConstants::REQUEST_MODEL_PAYMENT_CANCEL);
174
175
        $this->mapOrderHeadData($orderTransfer, $payment);
176
        $this->mapPartialShoppingBasketAndItems(
177
            $orderTransfer,
178
            $partialOrderTransfer,
179
            $paymentData,
180
            $orderItems,
181
            $needToSendShipping
182
        );
183
184
        return $request;
185
    }
186
187
    /**
188
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
189
     * @param \Generated\Shared\Transfer\OrderTransfer $partialOrderTransfer
190
     * @param \Generated\Shared\Transfer\ItemTransfer[] $orderItems
191
     *
192
     * @return \SprykerEco\Zed\Ratepay\Business\Api\Model\Payment\Request
193
     */
194
    public function paymentRefund(
195
        OrderTransfer $orderTransfer,
196
        OrderTransfer $partialOrderTransfer,
197
        array $orderItems
198
    ) {
199
        $payment = $this->loadOrderPayment($orderTransfer);
200
        $allOrderItems = $payment->getSpySalesOrder()->getItems();
201
        $paymentLogs = $this->loadOrderPaymentLogs($orderTransfer, Constants::REQUEST_MODEL_PAYMENT_REFUND);
202
        $paymentData = $this->getTransferObjectFromPayment($payment);
203
        $refundedItemsCount = count($orderItems);
204
205
        foreach ($paymentLogs as $paymentLog) {
206
            if (Constants::REQUEST_CODE_SUCCESS_MATRIX[Constants::REQUEST_MODEL_PAYMENT_REFUND] == $paymentLog->getResponseResultCode()) {
207
                $refundedItemsCount += $paymentLog->getItemCount();
208
            }
209
        }
210
        $needToSendShipping = (count($allOrderItems) == $refundedItemsCount);
211
212
        $request = $this->buildRequest();
213
214
        $this->mapOrderHeadData($orderTransfer, $payment);
215
        $this->mapPartialShoppingBasketAndItems(
216
            $orderTransfer,
217
            $partialOrderTransfer,
218
            $paymentData,
219
            $orderItems,
220
            $needToSendShipping
221
        );
222
223
        return $request;
224
    }
225
226
    /**
227
     * @param \Orm\Zed\Ratepay\Persistence\SpyPaymentRatepay $payment
0 ignored issues
show
Bug introduced by
The type Orm\Zed\Ratepay\Persistence\SpyPaymentRatepay 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...
228
     *
229
     * @return \Spryker\Shared\Kernel\Transfer\AbstractTransfer
230
     */
231
    protected function getTransferObjectFromPayment($payment)
232
    {
233
        $paymentTransfer = $this->getPaymentTransferObject($payment);
234
        $paymentTransfer->fromArray($payment->toArray(), true);
235
236
        return $paymentTransfer;
237
    }
238
239
    /**
240
     * @param \Orm\Zed\Ratepay\Persistence\SpyPaymentRatepay $payment
241
     *
242
     * @return \Spryker\Shared\Kernel\Transfer\AbstractTransfer
243
     */
244
    abstract protected function getPaymentTransferObject($payment);
245
246
    /**
247
     * @param \Generated\Shared\Transfer\RatepayPaymentInitTransfer $ratepayPaymentInitTransfer
248
     *
249
     * @return void
250
     */
251
    protected function mapPaymentInitHeadData(RatepayPaymentInitTransfer $ratepayPaymentInitTransfer)
252
    {
253
        $this->mapperFactory
254
            ->createPaymentInitHeadMapper($ratepayPaymentInitTransfer)
255
            ->map();
256
    }
257
258
    /**
259
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
260
     * @param \Orm\Zed\Ratepay\Persistence\SpyPaymentRatepay $payment
261
     *
262
     * @return void
263
     */
264
    protected function mapOrderHeadData($orderTransfer, $payment)
265
    {
266
        $this->mapperFactory
267
            ->createOrderHeadMapper($orderTransfer, $payment)
268
            ->map();
269
    }
270
271
    /**
272
     * @param \Generated\Shared\Transfer\RatepayPaymentRequestTransfer $ratepayPaymentRequestTransfer
273
     *
274
     * @return void
275
     */
276
    protected function mapShoppingBasketAndItems(RatepayPaymentRequestTransfer $ratepayPaymentRequestTransfer)
277
    {
278
        $this->mapperFactory
279
            ->createBasketMapper($ratepayPaymentRequestTransfer)
280
            ->map();
281
282
        $basketItems = $ratepayPaymentRequestTransfer->getItems();
283
        foreach ($basketItems as $basketItem) {
284
            $this->mapperFactory
285
                ->createBasketItemMapper($basketItem)
286
                ->map();
287
        }
288
    }
289
290
    /**
291
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
292
     * @param \Generated\Shared\Transfer\OrderTransfer $partialOrderTransfer
293
     * @param \Spryker\Shared\Kernel\Transfer\TransferInterface $paymentData
294
     * @param \Generated\Shared\Transfer\ItemTransfer[] $orderItems
295
     * @param bool $needToSendShipping
296
     *
297
     * @return void
298
     */
299
    protected function mapPartialShoppingBasketAndItems(
300
        OrderTransfer $orderTransfer,
301
        OrderTransfer $partialOrderTransfer,
302
        $paymentData,
303
        array $orderItems,
304
        $needToSendShipping = false
305
    ) {
306
        $grouppedItems = [];
307
        foreach ($orderItems as $basketItem) {
308
            if (isset($grouppedItems[$basketItem->getGroupKey()])) {
309
                $grouppedItems[$basketItem->getGroupKey()]->setQuantity($grouppedItems[$basketItem->getGroupKey()]->getQuantity() + 1);
310
            } else {
311
                $grouppedItems[$basketItem->getGroupKey()] = clone $basketItem;
312
            }
313
        }
314
315
        $discountTaxRate = 0;
316
        foreach ($orderTransfer->getItems() as $basketItem) {
317
            if ($discountTaxRate < $basketItem->getTaxRate()) {
318
                $discountTaxRate = $basketItem->getTaxRate();
319
            }
320
        }
321
322
        foreach ($grouppedItems as $basketItem) {
323
            $this->mapperFactory
324
                ->createBasketItemMapper($basketItem)
325
                ->map();
326
        }
327
328
        $this->mapperFactory
329
            ->createPartialBasketMapper(
330
                $orderTransfer,
331
                $partialOrderTransfer,
332
                $paymentData,
333
                $needToSendShipping,
334
                $discountTaxRate
335
            )
336
            ->map();
337
    }
338
339
    /**
340
     * @param \Generated\Shared\Transfer\RatepayPaymentRequestTransfer $ratepayPaymentRequestTransfer
341
     *
342
     * @return void
343
     */
344
    protected function mapPaymentData(RatepayPaymentRequestTransfer $ratepayPaymentRequestTransfer)
345
    {
346
        $this->mapperFactory
347
            ->createPaymentMapper($ratepayPaymentRequestTransfer)
348
            ->map();
349
350
        $this->mapperFactory
351
            ->createCustomerMapper($ratepayPaymentRequestTransfer)
352
            ->map();
353
354
        $this->mapShoppingBasketAndItems($ratepayPaymentRequestTransfer);
355
    }
356
357
    /**
358
     * @param \Generated\Shared\Transfer\RatepayPaymentRequestTransfer $ratepayPaymentRequestTransfer
359
     *
360
     * @return void
361
     */
362
    protected function mapBankAccountData(RatepayPaymentRequestTransfer $ratepayPaymentRequestTransfer)
363
    {
364
        $this->mapperFactory
365
            ->createBankAccountMapper($ratepayPaymentRequestTransfer)
366
            ->map();
367
    }
368
369
    /**
370
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
371
     *
372
     * @return \Orm\Zed\Ratepay\Persistence\SpyPaymentRatepay
373
     */
374
    protected function loadOrderPayment(OrderTransfer $orderTransfer)
375
    {
376
        return $this->ratepayQueryContainer
377
            ->queryPayments()
378
            ->findByFkSalesOrder(
379
                $orderTransfer->requireIdSalesOrder()->getIdSalesOrder()
380
            )->getFirst();
381
    }
382
383
    /**
384
     * @param \Generated\Shared\Transfer\OrderTransfer $orderTransfer
385
     * @param string|null $type
386
     *
387
     * @return \Orm\Zed\Ratepay\Persistence\SpyPaymentRatepayLog[]
388
     */
389
    protected function loadOrderPaymentLogs(OrderTransfer $orderTransfer, $type = null)
390
    {
391
        $query = $this->ratepayQueryContainer
392
            ->queryPaymentLog();
393
        if ($type !== null) {
394
            $query = $query->filterByMessage($type);
395
        }
396
        $paymentLogCollection = $query->findByFkSalesOrder(
397
            $orderTransfer->requireIdSalesOrder()->getIdSalesOrder()
398
        );
399
400
        return $paymentLogCollection;
401
    }
402
403
    /**
404
     * @return \SprykerEco\Zed\Ratepay\Business\Api\Model\Payment\Request
405
     */
406
    protected function buildRequest()
407
    {
408
        return $this->modelFactory->build(ApiConstants::REQUEST_MODEL_PAYMENT_REFUND);
409
    }
410
}
411