Provider::createBill()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 34
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 16
c 1
b 0
f 0
nc 1
nop 9
dl 0
loc 34
ccs 8
cts 8
cp 1
crap 1
rs 9.7333

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
declare(strict_types=1);
3
4
namespace B2Binpay;
5
6
use B2Binpay\v1\Api;
7
use B2Binpay\Exception\B2BinpayException;
8
use B2Binpay\Exception\IncorrectRatesException;
9
use GuzzleHttp\Client;
10
11
/**
12
 * B2BinPay payment provider
13
 *
14
 * @package B2Binpay
15
 */
16
class Provider
17
{
18
    /**
19
     * @var ApiInterface
20
     */
21
    private $api;
22
23
    /**
24
     * @var Currency
25
     */
26
    private $currency;
27
28
    /**
29
     * @var AmountFactory
30
     */
31
    private $amountFactory;
32
33
    /**
34
     * @param string $authKey
35
     * @param string $authSecret
36
     * @param bool|false $testing
37
     * @param Client|null $client
38
     * @param Currency|null $currency
39
     * @param AmountFactory|null $amountFactory
40 31
     * @param ApiInterface|null $api
41
     */
42
    public function __construct(
43
        string $authKey,
44
        string $authSecret,
45
        bool $testing = false,
46
        Client $client = null,
47
        Currency $currency = null,
48
        AmountFactory $amountFactory = null,
49 31
        ApiInterface $api = null
50 31
    )
51
    {
52 31
        $this->currency = $currency ?? new Currency();
53
        $this->amountFactory = $amountFactory ?? new AmountFactory($this->currency);
54 31
55 19
        $request = ($client) ? new Request($client) : null;
56 19
57 19
        $this->api = $api ?? new Api(
58 19
                $authKey,
59
                $authSecret,
60 31
                $request,
61
                $testing
62
            );
63
    }
64
65 2
    /**
66
     * @return string
67 2
     */
68
    public function getAuthorization(): string
69
    {
70
        return 'Basic ' . $this->api->genAuthBasic();
71
    }
72
73 2
    /**
74
     * @return string
75 2
     */
76
    public function getAuthToken(): string
77
    {
78
        return $this->api->getAccessToken();
79
    }
80
81
    /**
82
     * @param string $currency
83 2
     * @param string $rate_type = 'deposit' or 'withdraw'
84
     * @return mixed Rates
85 2
     * @throws B2BinpayException
86 2
     */
87 2
    public function getRates(string $currency = 'USD', string $rate_type = 'deposit')
88
    {
89 2
        $url = $this->api->getRatesUrl($rate_type) . strtolower($currency);
90
91 2
        $response = $this->api->sendRequest('get', $url);
92
93
        return $response->data;
94
    }
95
96
    /**
97
     * @param string $sum
98 2
     * @param string $currencyFrom
99
     * @param string $currencyTo
100 2
     * @param array|null $rates
101
     * @return string
102 2
     * @throws IncorrectRatesException
103
     */
104 2
    public function convertCurrency(
105
        string $sum,
106
        string $currencyFrom,
107
        string $currencyTo,
108
        array $rates = null
109
    ): string
110
    {
111
        $isoFrom = $this->currency->getIso($currencyFrom);
112 2
        $isoTo = $this->currency->getIso($currencyTo);
113
114 2
        $input = $this->amountFactory->create($sum, $isoFrom);
115
116 2
        if ($isoFrom === $isoTo) {
117
            return $input->getValue();
118 2
        }
119
120
        $rates = $rates ?? $this->getRates($currencyFrom);
121
122
        $rate = array_reduce(
123
            $rates,
124
            function ($carry, $item) use ($isoTo) {
125
                if ($item->to->iso === $isoTo) {
126
                    $carry = $this->amountFactory->create($item->rate, null, $item->pow);
127
                }
128
                return $carry;
129 9
            }
130
        );
131
132
        if (empty($rate)) {
133
            throw new IncorrectRatesException("Can't get rates to convert from $isoFrom to $isoTo");
134
        }
135 9
136 9
        $precision = $this->currency->getPrecision($isoTo);
137
138 9
        return $input->convert($rate, $precision)->getValue();
139
    }
140 9
141 2
    /**
142
     * @param string $sum
143
     * @param string $currency
144 7
     * @param int $percent
145
     * @return string
146 7
     */
147 7
    public function addMarkup(string $sum, string $currency, int $percent): string
148 7
    {
149 6
        $iso = $this->currency->getIso($currency);
150 6
151
        $amount = $this->amountFactory->create($sum, $iso);
152 6
153 7
        return $amount->percentage($percent)->getValue();
154 7
    }
155
156
    /**
157 7
     * @param int $walletId
158 1
     * @param string $amount
159
     * @param string $currency
160
     * @param int $lifetime
161 6
     * @param string|null $trackingId
162
     * @param string|null $callbackUrl
163 6
     * @param string|null $successUrl
164
     * @param string|null $errorUrl
165
     * @param string|null $address
166
     * @return mixed Bill
167
     */
168
    public function createBill(
169
        int $walletId,
170
        string $amount,
171
        string $currency,
172 6
        int $lifetime,
173
        string $trackingId = null,
174 6
        string $callbackUrl = null,
175
        string $successUrl = null,
176 6
        string $errorUrl = null,
177
        string $address = null
178 6
    )
179
    {
180
        $iso = $this->currency->getIso($currency);
181
        $url = $this->api->getNewBillUrl($currency);
182
183
        $amountFactory = $this->amountFactory->create($amount, $iso);
184
185
        $params = [
186
            'form_params' => [
187
                'amount' => $amountFactory->getPowered(),
188
                'wallet' => $walletId,
189
                'pow' => $amountFactory->getPrecision(),
190 2
                'lifetime' => $lifetime,
191
                'tracking_id' => $trackingId,
192
                'callback_url' => $callbackUrl,
193
                'success_url' => $successUrl,
194
                'error_url' => $errorUrl,
195
                'address' => $address
196
            ]
197
        ];
198 2
199 2
        $response = $this->api->sendRequest('post', $url, $params);
200
201 2
        return $response->data;
202
    }
203
204 2
    /**
205 2
     * @param array $params
206 2
     * @return mixed Bills list
207 2
     * @throws B2BinpayException
208 2
     */
209 2
    public function getBills(array $params = [])
210
    {
211
        $url = $this->api->getBillsUrl(null, $params);
0 ignored issues
show
Unused Code introduced by
The call to B2Binpay\ApiInterface::getBillsUrl() has too many arguments starting with $params. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

211
        /** @scrutinizer ignore-call */ 
212
        $url = $this->api->getBillsUrl(null, $params);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
212 2
213
        return $this->api->sendRequest('get', $url, $params);
214 2
    }
215
216
    /**
217
     * @param int $billId
218
     * @return mixed Bill
219
     * @throws B2BinpayException
220
     */
221
    public function getBill(int $billId)
222 2
    {
223
        $url = $this->api->getBillsUrl($billId);
224 2
225
        $response = $this->api->sendRequest('get', $url);
226 2
227
        return $response->data;
228 2
    }
229
230
    /**
231
     * @param array $params
232
     * @return mixed Transactions list
233
     * @throws B2BinpayException
234
     */
235
    public function getTransactions(array $params = [])
236 2
    {
237
        $url = $this->api->getTransactionsUrl(null, $params);
0 ignored issues
show
Unused Code introduced by
The call to B2Binpay\ApiInterface::getTransactionsUrl() has too many arguments starting with $params. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

237
        /** @scrutinizer ignore-call */ 
238
        $url = $this->api->getTransactionsUrl(null, $params);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
238 2
239
        return $this->api->sendRequest('get', $url, $params);
240 2
    }
241
242 2
    /**
243
     * @param int $transaction_id
244
     * @return mixed Transaction
245
     * @throws B2BinpayException
246
     */
247
    public function getTransaction(int $transaction_id)
248
    {
249
        $url = $this->api->getTransactionsUrl($transaction_id);
250
251
        $response = $this->api->sendRequest('get', $url);
252
253
        return $response->data;
254
    }
255
256
    /**
257
     * @param array $params
258
     * @return mixed VirtualWallets list
259
     * @throws B2BinpayException
260
     */
261
    public function getVirtualWallets(array $params = [])
262
    {
263
        $url = $this->api->getVirtualWalletsUrl(null, $params);
0 ignored issues
show
Unused Code introduced by
The call to B2Binpay\ApiInterface::getVirtualWalletsUrl() has too many arguments starting with $params. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

263
        /** @scrutinizer ignore-call */ 
264
        $url = $this->api->getVirtualWalletsUrl(null, $params);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
264
265
        return $this->api->sendRequest('get', $url, $params);
266
    }
267
268
    /**
269
     * @param int $virtual_wallet_id
270
     * @return mixed VirtualWallet
271
     * @throws B2BinpayException
272
     */
273
    public function getVirtualWallet(int $virtual_wallet_id)
274
    {
275
        $url = $this->api->getVirtualWalletsUrl($virtual_wallet_id);
276
277
        $response = $this->api->sendRequest('get', $url);
278
279
        return $response->data;
280
    }
281
282
    /**
283
     * @param int $virtual_wallet_id
284
     * @param string $amount
285
     * @param string $currency
286
     * @param string $address
287
     * @param int $uniqueId
288
     * @param string|null $trackingId
289
     * @param string|null $callbackUrl
290
     * @param string|null $message
291
     * @param boolean $with_fee
292
     * @return mixed Withdrawal
293
     */
294
    public function createWithdrawal(
295
        int $virtual_wallet_id,
296
        string $amount,
297
        string $currency,
298
        string $address,
299
        int $uniqueId,
300
        string $trackingId = null,
301
        string $callbackUrl = null,
302
        string $message = null,
303
        bool $with_fee = false
304
    )
305
    {
306
        $iso = $this->currency->getIso($currency);
307
        $url = $this->api->getNewWithdrawalUrl();
308
309
        $amountFactory = $this->amountFactory->create($amount, $iso);
310
311
        $params = [
312
            'form_params' => [
313
                'amount' => $amountFactory->getPowered(),
314
                'virtual_wallet_id' => $virtual_wallet_id,
315
                'address' => $address,
316
                'currency' => $iso,
317
                'unique_id' => $uniqueId,
318
                'tracking_id' => $trackingId,
319
                'pow' => $amountFactory->getPrecision(),
320
                'callback_url' => $callbackUrl,
321
                'message' => $message,
322
                'with_fee' => $with_fee
323
            ]
324
        ];
325
326
        $response = $this->api->sendRequest('post', $url, $params);
327
328
        return $response->data;
329
    }
330
331
    /**
332
     * @param array $params
333
     * @return mixed Withdrawals list
334
     * @throws B2BinpayException
335
     */
336
    public function getWithdrawals(array $params = [])
337
    {
338
        $url = $this->api->getWithdrawalsUrl(null, $params);
0 ignored issues
show
Unused Code introduced by
The call to B2Binpay\ApiInterface::getWithdrawalsUrl() has too many arguments starting with $params. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

338
        /** @scrutinizer ignore-call */ 
339
        $url = $this->api->getWithdrawalsUrl(null, $params);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
339
340
        return $this->api->sendRequest('get', $url, $params);
341
    }
342
343
    /**
344
     * @param int $withdrawal_id
345
     * @return mixed Withdrawal
346
     * @throws B2BinpayException
347
     */
348
    public function getWithdrawal(int $withdrawal_id)
349
    {
350
        $url = $this->api->getWithdrawalsUrl($withdrawal_id);
351
352
        $response = $this->api->sendRequest('get', $url);
353
354
        return $response->data;
355
    }
356
357
    /**
358
     * @param array $params
359
     * @return mixed Transfers list
360
     * @throws B2BinpayException
361
     */
362
    public function getTransfers(array $params = [])
363
    {
364
        $url = $this->api->getTransfersUrl(null, $params);
0 ignored issues
show
Unused Code introduced by
The call to B2Binpay\ApiInterface::getTransfersUrl() has too many arguments starting with $params. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

364
        /** @scrutinizer ignore-call */ 
365
        $url = $this->api->getTransfersUrl(null, $params);

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
365
366
        return $this->api->sendRequest('get', $url, $params);
367
    }
368
369
    /**
370
     * @param int $transfer_id
371
     * @return mixed Transfer
372
     * @throws B2BinpayException
373
     */
374
    public function getTransfer(int $transfer_id)
375
    {
376
        $url = $this->api->getTransfersUrl($transfer_id);
377
378
        $response = $this->api->sendRequest('get', $url);
379
380
        return $response->data;
381
    }
382
383
    /**
384
     * @param string $time
385
     * @param string $sign
386
     * @return boolean
387
     */
388
    public function verifySign(string $time, string $sign): bool
389
    {
390
        $verify = $this->api->genSignString($time);
391
392
        return password_verify($verify, $sign);
393
    }
394
395
}
396