QuoteToRequestTransfer   A
last analyzed

Complexity

Total Complexity 25

Size/Duplication

Total Lines 303
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 25
eloc 94
dl 0
loc 303
rs 10
c 1
b 0
f 0

18 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A getGiftcards() 0 12 3
A getStringDecimalQuoteNetTotal() 0 7 1
A getStringDecimalItemGrossUnitPrice() 0 5 1
A buildCustomerRequestTransfer() 0 13 1
A buildOrderItemRequestTransfer() 0 10 1
A quoteToAvailablePaymentMethods() 0 8 1
A getStoreCountryIso2() 0 3 1
A buildOrderExpenseRequestTransfer() 0 8 1
A addExpensesToOrderRequestTransfer() 0 13 3
A getStringDecimalExpenseGrossUnitPrice() 0 5 1
A addGiftcardItems() 0 14 2
A getStringDecimalItemNetUnitPrice() 0 7 1
A getStringDecimalQuoteGrossTotal() 0 8 2
A getStringDecimalItemVatAmountPrice() 0 5 1
A buildOrderRequestTransfer() 0 17 2
A buildCustomerBillingAddressRequestTransfer() 0 10 1
A getStringDecimalExpenseNetUnitPrice() 0 7 1
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\Payment\Mapper;
9
10
use Generated\Shared\Transfer\AfterPayAvailablePaymentMethodsRequestTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...tMethodsRequestTransfer 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\AfterPayRequestAddressTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...yRequestAddressTransfer 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\AfterPayRequestCustomerTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...RequestCustomerTransfer 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\AfterPayRequestOrderItemTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...equestOrderItemTransfer 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\AfterPayRequestOrderTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...PayRequestOrderTransfer 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\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...
16
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...
17
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...
18
use SprykerEco\Shared\AfterPay\AfterPayConfig;
19
use SprykerEco\Zed\AfterPay\Dependency\Facade\AfterPayToMoneyFacadeInterface;
20
use SprykerEco\Zed\AfterPay\Dependency\Facade\AfterPayToStoreFacadeInterface;
21
22
class QuoteToRequestTransfer implements QuoteToRequestTransferInterface
23
{
24
    public const NEGATIVE_MULTIPLIER = -1;
25
26
    /**
27
     * @var string
28
     */
29
    public const GIFT_CARD_PROVIDER = 'GiftCard';
30
31
    /**
32
     * @var \SprykerEco\Zed\AfterPay\Dependency\Facade\AfterPayToMoneyFacadeInterface
33
     */
34
    protected $moneyFacade;
35
36
    /**
37
     * @var \SprykerEco\Zed\AfterPay\Dependency\Facade\AfterPayToStoreFacadeInterface
38
     */
39
    protected $storeFacade;
40
41
    /**
42
     * @param \SprykerEco\Zed\AfterPay\Dependency\Facade\AfterPayToMoneyFacadeInterface $moneyFacade
43
     * @param \SprykerEco\Zed\AfterPay\Dependency\Facade\AfterPayToStoreFacadeInterface $storeFacade
44
     */
45
    public function __construct(
46
        AfterPayToMoneyFacadeInterface $moneyFacade,
47
        AfterPayToStoreFacadeInterface $storeFacade
48
    ) {
49
        $this->moneyFacade = $moneyFacade;
50
        $this->storeFacade = $storeFacade;
51
    }
52
53
    /**
54
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
55
     *
56
     * @return \Generated\Shared\Transfer\AfterPayAvailablePaymentMethodsRequestTransfer
57
     */
58
    public function quoteToAvailablePaymentMethods(QuoteTransfer $quoteTransfer): AfterPayAvailablePaymentMethodsRequestTransfer
59
    {
60
        return (new AfterPayAvailablePaymentMethodsRequestTransfer())
61
            ->setCustomer(
62
                $this->buildCustomerRequestTransfer($quoteTransfer),
63
            )
64
            ->setOrder(
65
                $this->buildOrderRequestTransfer($quoteTransfer),
66
            );
67
    }
68
69
    /**
70
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
71
     *
72
     * @return \Generated\Shared\Transfer\AfterPayRequestCustomerTransfer
73
     */
74
    protected function buildCustomerRequestTransfer(QuoteTransfer $quoteTransfer): AfterPayRequestCustomerTransfer
75
    {
76
        $quoteBillingAddressTransfer = $quoteTransfer->getBillingAddress();
77
78
        return (new AfterPayRequestCustomerTransfer())
79
            ->setFirstName($quoteBillingAddressTransfer->getFirstName())
80
            ->setLastName($quoteBillingAddressTransfer->getLastName())
81
            ->setConversationalLanguage($this->getStoreCountryIso2())
82
            ->setCustomerCategory(AfterPayConfig::API_CUSTOMER_CATEGORY_PERSON)
83
            ->setSalutation($quoteBillingAddressTransfer->getSalutation())
84
            ->setEmail($quoteTransfer->getCustomer()->getEmail())
85
            ->setAddress(
86
                $this->buildCustomerBillingAddressRequestTransfer($quoteTransfer),
87
            );
88
    }
89
90
    /**
91
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
92
     *
93
     * @return \Generated\Shared\Transfer\AfterPayRequestOrderTransfer
94
     */
95
    protected function buildOrderRequestTransfer(QuoteTransfer $quoteTransfer): AfterPayRequestOrderTransfer
96
    {
97
        $orderRequestTransfer = (new AfterPayRequestOrderTransfer())
98
            ->setTotalGrossAmount($this->getStringDecimalQuoteGrossTotal($quoteTransfer))
99
            ->setCurrency($quoteTransfer->getCurrency()->getCode());
100
101
        foreach ($quoteTransfer->getItems() as $itemTransfer) {
102
            $orderRequestTransfer->addItem(
103
                $this->buildOrderItemRequestTransfer($itemTransfer),
104
            );
105
        }
106
107
        $orderRequestTransfer = $this->addExpensesToOrderRequestTransfer($orderRequestTransfer, $quoteTransfer);
108
109
        $this->addGiftcardItems($quoteTransfer, $orderRequestTransfer);
110
111
        return $orderRequestTransfer;
112
    }
113
114
    /**
115
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
116
     *
117
     * @return \Generated\Shared\Transfer\AfterPayRequestOrderItemTransfer
118
     */
119
    protected function buildOrderItemRequestTransfer(ItemTransfer $itemTransfer): AfterPayRequestOrderItemTransfer
120
    {
121
        return (new AfterPayRequestOrderItemTransfer())
122
            ->setProductId($itemTransfer->getSku())
123
            ->setDescription($itemTransfer->getName())
124
            ->setGrossUnitPrice($this->getStringDecimalItemGrossUnitPrice($itemTransfer))
125
            ->setQuantity($itemTransfer->getQuantity())
126
            ->setVatAmount($this->getStringDecimalItemVatAmountPrice($itemTransfer))
127
            ->setVatPercent($itemTransfer->getTaxRate())
128
            ->setGroupId($itemTransfer->getGroupKey());
129
    }
130
131
    /**
132
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
133
     *
134
     * @return \Generated\Shared\Transfer\AfterPayRequestAddressTransfer
135
     */
136
    protected function buildCustomerBillingAddressRequestTransfer(QuoteTransfer $quoteTransfer): AfterPayRequestAddressTransfer
137
    {
138
        $customerAddressTransfer = $quoteTransfer->getBillingAddress();
139
140
        return (new AfterPayRequestAddressTransfer())
141
            ->setCountryCode($customerAddressTransfer->getIso2Code())
142
            ->setStreet($customerAddressTransfer->getAddress1())
143
            ->setStreetNumber($customerAddressTransfer->getAddress2())
144
            ->setPostalCode($customerAddressTransfer->getZipCode())
145
            ->setPostalPlace($customerAddressTransfer->getCity());
146
    }
147
148
    /**
149
     * @return string
150
     */
151
    protected function getStoreCountryIso2(): string
152
    {
153
        return $this->storeFacade->getCurrentStore()->getName();
154
    }
155
156
    /**
157
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
158
     *
159
     * @return string
160
     */
161
    protected function getStringDecimalQuoteGrossTotal(QuoteTransfer $quoteTransfer): string
162
    {
163
        $quoteTotal = $quoteTransfer->getTotals()->getGrandTotal();
164
        if ($quoteTransfer->getTotals()->getPriceToPay()) {
165
            $quoteTotal = $quoteTransfer->getTotals()->getPriceToPay();
166
        }
167
168
        return (string)$this->moneyFacade->convertIntegerToDecimal($quoteTotal);
169
    }
170
171
    /**
172
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
173
     *
174
     * @return string
175
     */
176
    protected function getStringDecimalQuoteNetTotal(QuoteTransfer $quoteTransfer): string
177
    {
178
        $quoteGrossTotal = $quoteTransfer->getTotals()->getGrandTotal();
179
        $quoteTaxTotal = $quoteTransfer->getTotals()->getTaxTotal()->getAmount();
180
        $quoteNetTotal = $quoteGrossTotal - $quoteTaxTotal;
181
182
        return (string)$this->moneyFacade->convertIntegerToDecimal($quoteNetTotal);
183
    }
184
185
    /**
186
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
187
     *
188
     * @return string
189
     */
190
    protected function getStringDecimalItemGrossUnitPrice(ItemTransfer $itemTransfer): string
191
    {
192
        $itemUnitGrossPrice = $itemTransfer->getUnitPriceToPayAggregation();
193
194
        return (string)$this->moneyFacade->convertIntegerToDecimal($itemUnitGrossPrice);
195
    }
196
197
    /**
198
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
199
     *
200
     * @return string
201
     */
202
    protected function getStringDecimalItemNetUnitPrice(ItemTransfer $itemTransfer): string
203
    {
204
        $itemUnitGrossPriceAmount = $itemTransfer->getUnitPriceToPayAggregation();
205
        $itemUnitTaxAmount = $itemTransfer->getUnitTaxAmountFullAggregation();
206
        $itemUnitNetAmount = $itemUnitGrossPriceAmount - $itemUnitTaxAmount;
207
208
        return (string)$this->moneyFacade->convertIntegerToDecimal($itemUnitNetAmount);
209
    }
210
211
    /**
212
     * @param \Generated\Shared\Transfer\ItemTransfer $itemTransfer
213
     *
214
     * @return string
215
     */
216
    protected function getStringDecimalItemVatAmountPrice(ItemTransfer $itemTransfer): string
217
    {
218
        $itemVatAmountPrice = $itemTransfer->getUnitTaxAmountFullAggregation();
219
220
        return (string)$this->moneyFacade->convertIntegerToDecimal($itemVatAmountPrice);
221
    }
222
223
    /**
224
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
225
     * @param \Generated\Shared\Transfer\AfterPayRequestOrderTransfer $orderRequestTransfer
226
     *
227
     * @return void
228
     */
229
    protected function addGiftcardItems(
230
        QuoteTransfer $quoteTransfer,
231
        AfterPayRequestOrderTransfer $orderRequestTransfer
232
    ): void {
233
        foreach ($this->getGiftcards($quoteTransfer) as $index => $paymentTransfer) {
234
            $amount = (string)$this->moneyFacade->convertIntegerToDecimal(static::NEGATIVE_MULTIPLIER * $paymentTransfer->getAmount());
235
236
            $orderItemRequestTransfer = (new AfterPayRequestOrderItemTransfer())
237
                ->setProductId(static::GIFT_CARD_PROVIDER . $index)
238
                ->setDescription(static::GIFT_CARD_PROVIDER . $index)
239
                ->setGrossUnitPrice($amount)
240
                ->setQuantity(1);
241
242
            $orderRequestTransfer->addItem($orderItemRequestTransfer);
243
        }
244
    }
245
246
    /**
247
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
248
     *
249
     * @return array<\Generated\Shared\Transfer\PaymentTransfer>
250
     */
251
    protected function getGiftcards(QuoteTransfer $quoteTransfer): array
252
    {
253
        $giftCardPayments = [];
254
        foreach ($quoteTransfer->getPayments() as $paymentTransfer) {
255
            if ($paymentTransfer->getPaymentMethod() !== static::GIFT_CARD_PROVIDER) {
256
                continue;
257
            }
258
259
            $giftCardPayments[] = $paymentTransfer;
260
        }
261
262
        return $giftCardPayments;
263
    }
264
265
    /**
266
     * @param \Generated\Shared\Transfer\AfterPayRequestOrderTransfer $orderRequestTransfer
267
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
268
     *
269
     * @return \Generated\Shared\Transfer\AfterPayRequestOrderTransfer
270
     */
271
    protected function addExpensesToOrderRequestTransfer(
272
        AfterPayRequestOrderTransfer $orderRequestTransfer,
273
        QuoteTransfer $quoteTransfer
274
    ): AfterPayRequestOrderTransfer {
275
        foreach ($quoteTransfer->getExpenses() as $expenseTransfer) {
276
            if ($expenseTransfer->getSumPriceToPayAggregation() > 0) {
277
                $orderRequestTransfer->addItem(
278
                    $this->buildOrderExpenseRequestTransfer($expenseTransfer),
279
                );
280
            }
281
        }
282
283
        return $orderRequestTransfer;
284
    }
285
286
    /**
287
     * @param \Generated\Shared\Transfer\ExpenseTransfer $expenseTransfer
288
     *
289
     * @return \Generated\Shared\Transfer\AfterPayRequestOrderItemTransfer
290
     */
291
    protected function buildOrderExpenseRequestTransfer(ExpenseTransfer $expenseTransfer): AfterPayRequestOrderItemTransfer
292
    {
293
        return (new AfterPayRequestOrderItemTransfer())
294
            ->setProductId($expenseTransfer->getType())
295
            ->setDescription($expenseTransfer->getName())
296
            ->setGrossUnitPrice($this->getStringDecimalExpenseGrossUnitPrice($expenseTransfer))
297
            ->setNetUnitPrice($this->getStringDecimalExpenseNetUnitPrice($expenseTransfer))
298
            ->setQuantity($expenseTransfer->getQuantity());
299
    }
300
301
    /**
302
     * @param \Generated\Shared\Transfer\ExpenseTransfer $expenseTransfer
303
     *
304
     * @return string
305
     */
306
    protected function getStringDecimalExpenseGrossUnitPrice(ExpenseTransfer $expenseTransfer): string
307
    {
308
        $expenseUnitGrossPrice = $expenseTransfer->getUnitPriceToPayAggregation();
309
310
        return (string)$this->moneyFacade->convertIntegerToDecimal($expenseUnitGrossPrice);
311
    }
312
313
    /**
314
     * @param \Generated\Shared\Transfer\ExpenseTransfer $expenseTransfer
315
     *
316
     * @return string
317
     */
318
    protected function getStringDecimalExpenseNetUnitPrice(ExpenseTransfer $expenseTransfer): string
319
    {
320
        $expenseUnitGrossPriceAmount = $expenseTransfer->getUnitPriceToPayAggregation();
321
        $expenseUnitTaxAmount = $expenseTransfer->getUnitTaxAmount();
322
        $expenseUnitNetAmount = $expenseUnitGrossPriceAmount - $expenseUnitTaxAmount;
323
324
        return (string)$this->moneyFacade->convertIntegerToDecimal($expenseUnitNetAmount);
325
    }
326
}
327