Passed
Pull Request — master (#74)
by mark
13:30
created

PayoneHandler::setPayonePayment()   D

Complexity

Conditions 18
Paths 7

Size

Total Lines 55
Code Lines 46

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 2 Features 0
Metric Value
eloc 46
c 2
b 2
f 0
dl 0
loc 55
rs 4.8666
cc 18
nc 7
nop 3

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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\Yves\Payone\Handler;
9
10
use Generated\Shared\Transfer\PaymentDetailTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\PaymentDetailTransfer 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\PaymentTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\PaymentTransfer 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\PayonePaymentCreditCardTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...ymentCreditCardTransfer 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\PayonePaymentDirectDebitTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...mentDirectDebitTransfer 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\PayonePaymentEWalletTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...ePaymentEWalletTransfer 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\PayonePaymentOnlinetransferTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfe...tOnlinetransferTransfer 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\PayonePaymentTransfer;
0 ignored issues
show
Bug introduced by
The type Generated\Shared\Transfer\PayonePaymentTransfer 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 Spryker\Shared\Kernel\Store;
19
use SprykerEco\Shared\Payone\PayoneApiConstants;
20
use Symfony\Component\HttpFoundation\Request;
21
22
class PayoneHandler implements PayoneHandlerInterface
23
{
24
    /**
25
     * @var string
26
     */
27
    public const PAYMENT_PROVIDER = 'Payone';
28
29
    /**
30
     * @var string
31
     */
32
    public const CHECKOUT_INCLUDE_SUMMARY_PATH = 'Payone/partial/summary';
33
34
    /**
35
     * @var string
36
     */
37
    public const CHECKOUT_INCLUDE_SUCCESS_PATH = 'Payone/partial/success';
38
39
    /**
40
     * @var string
41
     */
42
    protected const PAYONE_PAYMENT_REFERENCE_PREFIX = 'TX1';
43
44
    /**
45
     * @var array
46
     */
47
    protected static $paymentMethods = [
48
        PaymentTransfer::PAYONE_CREDIT_CARD => 'credit_card',
49
        PaymentTransfer::PAYONE_E_WALLET => 'e_wallet',
50
        PaymentTransfer::PAYONE_DIRECT_DEBIT => 'direct_debit',
51
        PaymentTransfer::PAYONE_INSTANT_ONLINE_TRANSFER => 'instant_online_transfer',
52
        PaymentTransfer::PAYONE_EPS_ONLINE_TRANSFER => 'eps_online_transfer',
53
        PaymentTransfer::PAYONE_GIROPAY_ONLINE_TRANSFER => 'giropay_online_transfer',
54
        PaymentTransfer::PAYONE_IDEAL_ONLINE_TRANSFER => 'ideal_online_transfer',
55
        PaymentTransfer::PAYONE_POSTFINANCE_EFINANCE_ONLINE_TRANSFER => 'postfinance_efinance_online_transfer',
56
        PaymentTransfer::PAYONE_POSTFINANCE_CARD_ONLINE_TRANSFER => 'postfinance_card_online_transfer',
57
        PaymentTransfer::PAYONE_PRZELEWY24_ONLINE_TRANSFER => 'przelewy24_online_transfer',
58
        PaymentTransfer::PAYONE_BANCONTACT_ONLINE_TRANSFER => 'bancontact_online_transfer',
59
        PaymentTransfer::PAYONE_PRE_PAYMENT => 'prepayment',
60
        PaymentTransfer::PAYONE_INVOICE => 'invoice',
61
        PaymentTransfer::PAYONE_SECURITY_INVOICE => 'securityInvoice',
62
        PaymentTransfer::PAYONE_CASH_ON_DELIVERY => 'cashOnDelivery',
63
    ];
64
65
    /**
66
     * @var array
67
     */
68
    protected static $payonePaymentMethodMapper = [
69
        PaymentTransfer::PAYONE_CREDIT_CARD => PayoneApiConstants::PAYMENT_METHOD_CREDITCARD,
70
        PaymentTransfer::PAYONE_E_WALLET => PayoneApiConstants::PAYMENT_METHOD_E_WALLET,
71
        PaymentTransfer::PAYONE_DIRECT_DEBIT => PayoneApiConstants::PAYMENT_METHOD_DIRECT_DEBIT,
72
        PaymentTransfer::PAYONE_INSTANT_ONLINE_TRANSFER => PayoneApiConstants::PAYMENT_METHOD_ONLINE_BANK_TRANSFER,
73
        PaymentTransfer::PAYONE_EPS_ONLINE_TRANSFER => PayoneApiConstants::PAYMENT_METHOD_ONLINE_BANK_TRANSFER,
74
        PaymentTransfer::PAYONE_GIROPAY_ONLINE_TRANSFER => PayoneApiConstants::PAYMENT_METHOD_ONLINE_BANK_TRANSFER,
75
        PaymentTransfer::PAYONE_IDEAL_ONLINE_TRANSFER => PayoneApiConstants::PAYMENT_METHOD_ONLINE_BANK_TRANSFER,
76
        PaymentTransfer::PAYONE_POSTFINANCE_EFINANCE_ONLINE_TRANSFER => PayoneApiConstants::PAYMENT_METHOD_ONLINE_BANK_TRANSFER,
77
        PaymentTransfer::PAYONE_PRZELEWY24_ONLINE_TRANSFER => PayoneApiConstants::PAYMENT_METHOD_ONLINE_BANK_TRANSFER,
78
        PaymentTransfer::PAYONE_BANCONTACT_ONLINE_TRANSFER => PayoneApiConstants::PAYMENT_METHOD_ONLINE_BANK_TRANSFER,
79
        PaymentTransfer::PAYONE_PRE_PAYMENT => PayoneApiConstants::PAYMENT_METHOD_PREPAYMENT,
80
        PaymentTransfer::PAYONE_INVOICE => PayoneApiConstants::PAYMENT_METHOD_INVOICE,
81
        PaymentTransfer::PAYONE_SECURITY_INVOICE => PayoneApiConstants::PAYMENT_METHOD_SECURITY_INVOICE,
82
        PaymentTransfer::PAYONE_CASH_ON_DELIVERY => PayoneApiConstants::PAYMENT_METHOD_CASH_ON_DELIVERY,
83
        PaymentTransfer::PAYONE_KLARNA => PayoneApiConstants::PAYMENT_METHOD_KLARNA,
84
    ];
85
86
    /**
87
     * @var array
88
     */
89
    protected static $payoneGenderMapper = [
90
        'Mr' => 'Male',
91
        'Mrs' => 'Female',
92
    ];
93
94
    /**
95
     * @param \Symfony\Component\HttpFoundation\Request $request
96
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
97
     *
98
     * @return \Generated\Shared\Transfer\QuoteTransfer
99
     */
100
    public function addPaymentToQuote(Request $request, QuoteTransfer $quoteTransfer): QuoteTransfer
101
    {
102
        $paymentSelection = $quoteTransfer->getPayment()->getPaymentSelection();
103
104
        $this->setPaymentProviderAndMethod($quoteTransfer, $paymentSelection ?? '');
105
        $this->setPayonePayment($request, $quoteTransfer, $paymentSelection ?? '');
106
        $this->setPaymentSuccessIncludePath($quoteTransfer);
107
108
        return $quoteTransfer;
109
    }
110
111
    /**
112
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
113
     * @param string $paymentSelection
114
     *
115
     * @return void
116
     */
117
    protected function setPaymentProviderAndMethod(QuoteTransfer $quoteTransfer, string $paymentSelection): void
118
    {
119
        $quoteTransfer->getPayment()
120
            ->setPaymentProvider(static::PAYMENT_PROVIDER)
121
            ->setPaymentMethod(static::$payonePaymentMethodMapper[$paymentSelection]);
122
    }
123
124
    /**
125
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
126
     *
127
     * @return void
128
     */
129
    protected function setPaymentSuccessIncludePath(QuoteTransfer $quoteTransfer): void
130
    {
131
        $quoteTransfer->requirePayment()->getPayment()->setSummaryIncludePath(static::CHECKOUT_INCLUDE_SUMMARY_PATH);
132
        $quoteTransfer->requirePayment()->getPayment()->setSuccessIncludePath(static::CHECKOUT_INCLUDE_SUCCESS_PATH);
133
    }
134
135
    /**
136
     * @param \Symfony\Component\HttpFoundation\Request $request
137
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
138
     * @param string $paymentSelection
139
     *
140
     * @return void
141
     */
142
    protected function setPayonePayment(Request $request, QuoteTransfer $quoteTransfer, string $paymentSelection): void
143
    {
144
        $payonePaymentTransfer = $this->getPayonePaymentTransfer($quoteTransfer, $paymentSelection);
145
146
        $paymentDetailTransfer = new PaymentDetailTransfer();
147
        // get it from quotaTransfer
148
        $paymentDetailTransfer->setAmount($quoteTransfer->getTotals()->getGrandTotal());
149
        $paymentDetailTransfer->setCurrency($this->getCurrency());
150
        if ($payonePaymentTransfer instanceof PayonePaymentCreditCardTransfer && $paymentSelection === PaymentTransfer::PAYONE_CREDIT_CARD) {
151
            $paymentDetailTransfer->setPseudoCardPan($payonePaymentTransfer->getPseudocardpan());
152
        } elseif ($payonePaymentTransfer instanceof PayonePaymentEWalletTransfer && $paymentSelection === PaymentTransfer::PAYONE_E_WALLET) {
153
            $paymentDetailTransfer->setType($payonePaymentTransfer->getWallettype());
154
        } elseif ($payonePaymentTransfer instanceof PayonePaymentDirectDebitTransfer && $paymentSelection === PaymentTransfer::PAYONE_DIRECT_DEBIT) {
155
            $paymentDetailTransfer->setBankCountry($payonePaymentTransfer->getBankcountry());
156
            $paymentDetailTransfer->setBankAccount($payonePaymentTransfer->getBankaccount());
157
            $paymentDetailTransfer->setBankCode($payonePaymentTransfer->getBankcode());
158
            $paymentDetailTransfer->setBic($payonePaymentTransfer->getBic());
159
            $paymentDetailTransfer->setIban($payonePaymentTransfer->getIban());
160
            $paymentDetailTransfer->setMandateIdentification($payonePaymentTransfer->getMandateIdentification());
161
            $paymentDetailTransfer->setMandateText($payonePaymentTransfer->getMandateText());
162
        } elseif (
163
            $payonePaymentTransfer instanceof PayonePaymentOnlinetransferTransfer && (
164
                $paymentSelection === PaymentTransfer::PAYONE_EPS_ONLINE_TRANSFER
165
                || $paymentSelection === PaymentTransfer::PAYONE_INSTANT_ONLINE_TRANSFER
166
                || $paymentSelection === PaymentTransfer::PAYONE_GIROPAY_ONLINE_TRANSFER
167
                || $paymentSelection === PaymentTransfer::PAYONE_IDEAL_ONLINE_TRANSFER
168
                || $paymentSelection === PaymentTransfer::PAYONE_POSTFINANCE_EFINANCE_ONLINE_TRANSFER
169
                || $paymentSelection === PaymentTransfer::PAYONE_POSTFINANCE_CARD_ONLINE_TRANSFER
170
                || $paymentSelection === PaymentTransfer::PAYONE_PRZELEWY24_ONLINE_TRANSFER
171
                || $paymentSelection === PaymentTransfer::PAYONE_BANCONTACT_ONLINE_TRANSFER
172
            )
173
        ) {
174
            $paymentDetailTransfer->setType($payonePaymentTransfer->getOnlineBankTransferType());
175
            $paymentDetailTransfer->setBankCountry($payonePaymentTransfer->getBankCountry());
176
            if ($paymentSelection === PaymentTransfer::PAYONE_BANCONTACT_ONLINE_TRANSFER) {
177
                $paymentDetailTransfer->setBankCountry($quoteTransfer->getBillingAddress()->getIso2Code());
178
            }
179
            $paymentDetailTransfer->setBankAccount($payonePaymentTransfer->getBankAccount());
180
            $paymentDetailTransfer->setBankCode($payonePaymentTransfer->getBankCode());
181
            $paymentDetailTransfer->setBankBranchCode($payonePaymentTransfer->getBankBranchCode());
182
            $paymentDetailTransfer->setBankCheckDigit($payonePaymentTransfer->getBankCheckDigit());
183
            $paymentDetailTransfer->setBankGroupType($payonePaymentTransfer->getBankGroupType());
184
            $paymentDetailTransfer->setIban($payonePaymentTransfer->getIban());
185
            $paymentDetailTransfer->setBic($payonePaymentTransfer->getBic());
186
        } elseif ($paymentSelection == PaymentTransfer::PAYONE_CASH_ON_DELIVERY) {
187
            $shippingProvider = $quoteTransfer->getShipment()->getMethod()->getCarrierName();
188
            $paymentDetailTransfer->setShippingProvider($shippingProvider);
189
        }
190
191
        $payonePaymentTransfer = new PayonePaymentTransfer();
192
        $payonePaymentTransfer->setReference(uniqid(static::PAYONE_PAYMENT_REFERENCE_PREFIX));
193
        $payonePaymentTransfer->setPaymentDetail($paymentDetailTransfer);
194
        $paymentTransfer = $quoteTransfer->getPayment();
195
        $payonePaymentTransfer->setPaymentMethod($paymentTransfer->getPaymentMethod());
196
        $paymentTransfer->setPayone($payonePaymentTransfer);
197
    }
198
199
    /**
200
     * @return string
201
     */
202
    protected function getCurrency(): string
203
    {
204
        return Store::getInstance()->getCurrencyIsoCode();
205
    }
206
207
    /**
208
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
209
     * @param string $paymentSelection
210
     *
211
     * @return \Generated\Shared\Transfer\PayonePaymentTransfer|\Generated\Shared\Transfer\PayonePaymentCreditCardTransfer|\Generated\Shared\Transfer\PayonePaymentEWalletTransfer|\Generated\Shared\Transfer\PayonePaymentDirectDebitTransfer|\Generated\Shared\Transfer\PayonePaymentOnlinetransferTransfer
212
     */
213
    protected function getPayonePaymentTransfer(QuoteTransfer $quoteTransfer, string $paymentSelection)
214
    {
215
        $method = 'get' . ucfirst($paymentSelection);
216
        $payonePaymentTransfer = $quoteTransfer->getPayment()->$method();
217
218
        return $payonePaymentTransfer;
219
    }
220
}
221