Passed
Push — feature/eco-574/eco-2266-check... ( efd21d )
by Aleksey
08:13
created

Saver::getPaymentPriceToPay()   A

Complexity

Conditions 6
Paths 4

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 7
nc 4
nop 1
dl 0
loc 14
rs 9.2222
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\Afterpay\Business\Order;
9
10
use Generated\Shared\Transfer\ItemTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\ItemTransfer 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\QuoteTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\QuoteTransfer 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\SaveOrderTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\SaveOrderTransfer 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 Orm\Zed\Afterpay\Persistence\SpyPaymentAfterpay;
0 ignored issues
show
Bug introduced by
The type Orm\Zed\Afterpay\Persistence\SpyPaymentAfterpay 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 Orm\Zed\Afterpay\Persistence\SpyPaymentAfterpayOrderItem;
0 ignored issues
show
Bug introduced by
The type Orm\Zed\Afterpay\Persist...aymentAfterpayOrderItem 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 Spryker\Zed\Kernel\Persistence\EntityManager\TransactionTrait;
16
use SprykerEco\Shared\Afterpay\AfterpayConfig as AfterpayConfig1;
17
use SprykerEco\Shared\Afterpay\AfterpayConstants;
18
use SprykerEco\Zed\Afterpay\AfterpayConfig;
19
20
class Saver implements SaverInterface
21
{
22
    use TransactionTrait;
23
24
    /**
25
     * @var \SprykerEco\Zed\Afterpay\AfterpayConfig
26
     */
27
    protected $config;
28
29
    /**
30
     * @param \SprykerEco\Zed\Afterpay\AfterpayConfig $config
31
     */
32
    public function __construct(AfterpayConfig $config)
33
    {
34
        $this->config = $config;
35
    }
36
37
    /**
38
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
39
     * @param \Generated\Shared\Transfer\SaveOrderTransfer $saveOrderTransfer
40
     *
41
     * @return void
42
     */
43
    public function saveOrderPayment(QuoteTransfer $quoteTransfer, SaveOrderTransfer $saveOrderTransfer): void
44
    {
45
        $this->getTransactionHandler()->handleTransaction(function () use ($quoteTransfer, $saveOrderTransfer) {
46
            $this->executeSavePaymentForOrderAndItemsTransaction($quoteTransfer, $saveOrderTransfer);
47
        });
48
    }
49
50
    /**
51
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
52
     * @param \Generated\Shared\Transfer\SaveOrderTransfer $saveOrderTransfer
53
     *
54
     * @return void
55
     */
56
    protected function executeSavePaymentForOrderAndItemsTransaction(
57
        QuoteTransfer $quoteTransfer,
58
        SaveOrderTransfer $saveOrderTransfer
59
    ): void {
60
61
        $paymentEntity = $this->buildPaymentEntity($quoteTransfer, $saveOrderTransfer);
62
        $paymentEntity->save();
63
64
        $idPayment = $paymentEntity->getIdPaymentAfterpay();
65
66
        foreach ($saveOrderTransfer->getOrderItems() as $orderItem) {
67
            $this->savePaymentForOrderItem($orderItem, $idPayment);
68
        }
69
    }
70
71
    /**
72
     * @param \Generated\Shared\Transfer\ItemTransfer $orderItemTransfer
73
     * @param int $idPayment
74
     *
75
     * @return void
76
     */
77
    protected function savePaymentForOrderItem(ItemTransfer $orderItemTransfer, int $idPayment): void
78
    {
79
        $paymentOrderItemEntity = new SpyPaymentAfterpayOrderItem();
80
        $paymentOrderItemEntity
81
            ->setFkPaymentAfterpay($idPayment)
82
            ->setFkSalesOrderItem($orderItemTransfer->getIdSalesOrderItem());
83
84
        $paymentOrderItemEntity->save();
85
    }
86
87
    /**
88
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
89
     * @param \Generated\Shared\Transfer\SaveOrderTransfer $saveOrderTransfer
90
     *
91
     * @return \Orm\Zed\Afterpay\Persistence\SpyPaymentAfterpay
92
     */
93
    protected function buildPaymentEntity(
94
        QuoteTransfer $quoteTransfer,
95
        SaveOrderTransfer $saveOrderTransfer
96
    ): SpyPaymentAfterpay {
97
        $paymentEntity = new SpyPaymentAfterpay();
98
99
        $paymentTransfer = $quoteTransfer->getPayment();
100
101
        $paymentEntity
102
            ->setFkSalesPayment($paymentTransfer->getIdSalesPayment())
103
            ->setPaymentMethod($paymentTransfer->getPaymentMethod())
104
            ->setFkSalesOrder($saveOrderTransfer->getIdSalesOrder())
105
            ->setIdCheckout($paymentTransfer->getAfterpayCheckoutId())
106
            ->setIdChannel($this->getIdChannel($paymentTransfer->getPaymentMethod()))
107
            ->setInfoscoreCustomerNumber($paymentTransfer->getAfterpayCustomerNumber())
108
            ->setExpenseTotal($quoteTransfer->getTotals()->getExpenseTotal())
109
            ->setGrandTotal($this->getPaymentPriceToPay($quoteTransfer));
110
111
        return $paymentEntity;
112
    }
113
114
    /**
115
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
116
     *
117
     * @return int
118
     */
119
    protected function getPaymentPriceToPay(QuoteTransfer $quoteTransfer): int
120
    {
121
        if ($quoteTransfer->getPayment() && $quoteTransfer->getPayment()->getAmount()) {
122
            return $quoteTransfer->getPayment()->getAmount();
123
        }
124
125
        foreach ($quoteTransfer->getPayments() as $paymentTransfer) {
126
            if ($paymentTransfer->getPaymentMethod() !== AfterpayConfig1::PROVIDER_NAME || !$paymentTransfer->getAmount()) {
127
                continue;
128
            }
129
            return $paymentTransfer->getAmount();
130
        }
131
132
        return $quoteTransfer->getTotals()->getGrandTotal();
133
    }
134
135
    /**
136
     * @param string $paymentMethod
137
     *
138
     * @return string
139
     */
140
    protected function getIdChannel(string $paymentMethod): string
141
    {
142
        return $this->config->getPaymentChannelId($paymentMethod);
143
    }
144
}
145