Passed
Pull Request — master (#74)
by oleksandr
04:34
created

setPaymentDetailsFromPayonePaymentDirectDebitTransfer()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 7
c 0
b 0
f 0
dl 0
loc 11
rs 10
cc 1
nc 1
nop 2
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->getPaymentOrFail()->getPaymentSelectionOrFail();
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
            $this->setPaymentDetailsFromPayonePaymentDirectDebitTransfer($paymentDetailTransfer, $payonePaymentTransfer);
156
        } elseif ($payonePaymentTransfer instanceof PayonePaymentOnlinetransferTransfer && $this->isPaymentInList($paymentSelection)) {
157
            $this->setPaymentDetailsFromPayonePaymentOnlinetransferTransfer($paymentDetailTransfer, $payonePaymentTransfer, $quoteTransfer, $paymentSelection);
158
        } elseif ($paymentSelection == PaymentTransfer::PAYONE_CASH_ON_DELIVERY) {
159
            $shippingProvider = $quoteTransfer->getShipment()->getMethod()->getCarrierName();
160
            $paymentDetailTransfer->setShippingProvider($shippingProvider);
161
        }
162
163
        $payonePaymentTransfer = new PayonePaymentTransfer();
164
        $payonePaymentTransfer->setReference(uniqid(static::PAYONE_PAYMENT_REFERENCE_PREFIX));
165
        $payonePaymentTransfer->setPaymentDetail($paymentDetailTransfer);
166
        $paymentTransfer = $quoteTransfer->getPayment();
167
        $payonePaymentTransfer->setPaymentMethod($paymentTransfer->getPaymentMethod());
168
        $paymentTransfer->setPayone($payonePaymentTransfer);
169
    }
170
171
    /**
172
     * @param string $paymentSelection
173
     *
174
     * @return bool
175
     */
176
    protected function isPaymentInList(string $paymentSelection): bool
177
    {
178
        return in_array($paymentSelection, [
179
            PaymentTransfer::PAYONE_EPS_ONLINE_TRANSFER,
180
            PaymentTransfer::PAYONE_INSTANT_ONLINE_TRANSFER,
181
            PaymentTransfer::PAYONE_GIROPAY_ONLINE_TRANSFER,
182
            PaymentTransfer::PAYONE_IDEAL_ONLINE_TRANSFER,
183
            PaymentTransfer::PAYONE_POSTFINANCE_EFINANCE_ONLINE_TRANSFER,
184
            PaymentTransfer::PAYONE_POSTFINANCE_CARD_ONLINE_TRANSFER,
185
            PaymentTransfer::PAYONE_PRZELEWY24_ONLINE_TRANSFER,
186
            PaymentTransfer::PAYONE_BANCONTACT_ONLINE_TRANSFER,
187
        ]);
188
    }
189
190
    /**
191
     * @param \Generated\Shared\Transfer\PaymentDetailTransfer $paymentDetailTransfer
192
     * @param \Generated\Shared\Transfer\PayonePaymentOnlinetransferTransfer $payonePaymentTransfer
193
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
194
     * @param string $paymentSelection
195
     *
196
     * @return void
197
     */
198
    protected function setPaymentDetailsFromPayonePaymentOnlinetransferTransfer(
199
        PaymentDetailTransfer $paymentDetailTransfer,
200
        PayonePaymentOnlinetransferTransfer $payonePaymentTransfer,
201
        QuoteTransfer $quoteTransfer,
202
        string $paymentSelection
203
    ): void {
204
        $paymentDetailTransfer->setType($payonePaymentTransfer->getOnlineBankTransferType());
205
        $paymentDetailTransfer->setBankCountry($payonePaymentTransfer->getBankCountry());
206
        if ($paymentSelection === PaymentTransfer::PAYONE_BANCONTACT_ONLINE_TRANSFER) {
207
            $paymentDetailTransfer->setBankCountry($quoteTransfer->getBillingAddress()->getIso2Code());
208
        }
209
        $paymentDetailTransfer->setBankAccount($payonePaymentTransfer->getBankAccount());
210
        $paymentDetailTransfer->setBankCode($payonePaymentTransfer->getBankCode());
211
        $paymentDetailTransfer->setBankBranchCode($payonePaymentTransfer->getBankBranchCode());
212
        $paymentDetailTransfer->setBankCheckDigit($payonePaymentTransfer->getBankCheckDigit());
213
        $paymentDetailTransfer->setBankGroupType($payonePaymentTransfer->getBankGroupType());
214
        $paymentDetailTransfer->setIban($payonePaymentTransfer->getIban());
215
        $paymentDetailTransfer->setBic($payonePaymentTransfer->getBic());
216
    }
217
218
    /**
219
     * @param \Generated\Shared\Transfer\PaymentDetailTransfer $paymentDetailTransfer
220
     * @param \Generated\Shared\Transfer\PayonePaymentDirectDebitTransfer $payonePaymentTransfer
221
     *
222
     * @return void
223
     */
224
    protected function setPaymentDetailsFromPayonePaymentDirectDebitTransfer(
225
        PaymentDetailTransfer $paymentDetailTransfer,
226
        PayonePaymentDirectDebitTransfer $payonePaymentTransfer
227
    ): void {
228
        $paymentDetailTransfer->setBankCountry($payonePaymentTransfer->getBankcountry());
229
        $paymentDetailTransfer->setBankAccount($payonePaymentTransfer->getBankaccount());
230
        $paymentDetailTransfer->setBankCode($payonePaymentTransfer->getBankcode());
231
        $paymentDetailTransfer->setBic($payonePaymentTransfer->getBic());
232
        $paymentDetailTransfer->setIban($payonePaymentTransfer->getIban());
233
        $paymentDetailTransfer->setMandateIdentification($payonePaymentTransfer->getMandateIdentification());
234
        $paymentDetailTransfer->setMandateText($payonePaymentTransfer->getMandateText());
235
    }
236
237
    /**
238
     * @return string
239
     */
240
    protected function getCurrency(): string
241
    {
242
        return Store::getInstance()->getCurrencyIsoCode();
243
    }
244
245
    /**
246
     * @param \Generated\Shared\Transfer\QuoteTransfer $quoteTransfer
247
     * @param string $paymentSelection
248
     *
249
     * @return \Generated\Shared\Transfer\PayonePaymentTransfer|\Generated\Shared\Transfer\PayonePaymentCreditCardTransfer|\Generated\Shared\Transfer\PayonePaymentEWalletTransfer|\Generated\Shared\Transfer\PayonePaymentDirectDebitTransfer|\Generated\Shared\Transfer\PayonePaymentOnlinetransferTransfer
250
     */
251
    protected function getPayonePaymentTransfer(QuoteTransfer $quoteTransfer, string $paymentSelection)
252
    {
253
        $method = 'get' . ucfirst($paymentSelection);
254
        $payonePaymentTransfer = $quoteTransfer->getPayment()->$method();
255
256
        return $payonePaymentTransfer;
257
    }
258
}
259