Completed
Push — master ( df3805...a95f86 )
by Dmitry
14:05
created

PurchaseRequestCollection::createDefaultDepositRequest()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 7
ccs 0
cts 6
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 2
1
<?php
2
/**
3
 * Finance module for HiPanel
4
 *
5
 * @link      https://github.com/hiqdev/hipanel-module-finance
6
 * @package   hipanel-module-finance
7
 * @license   BSD-3-Clause
8
 * @copyright Copyright (c) 2015-2019, HiQDev (http://hiqdev.com/)
9
 */
10
11
namespace hipanel\modules\finance\merchant;
12
13
use hipanel\modules\finance\models\Merchant;
14
use hiqdev\hiart\ResponseErrorException;
15
use hiqdev\php\merchant\response\RedirectPurchaseResponse;
16
use hiqdev\yii2\merchant\Collection;
17
use hiqdev\yii2\merchant\models\DepositRequest;
18
use hiqdev\yii2\merchant\models\PurchaseRequest;
19
use Yii;
20
21
class PurchaseRequestCollection extends Collection
22
{
23
    public array $supportedSystems = [
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected T_ARRAY, expecting T_FUNCTION or T_CONST
Loading history...
24
        'webmoney' => 1,
25
        'paypal' => 1,
26
        'yandex' => 1,
27
        'yandexmoney' => 1,
28
        'interkassa' => 1,
29
        'paxum' => 1,
30
        'ecoin' => 1,
31
        'okpay' => 1,
32
        'robokassa' => 1,
33
        'freekassa' => 1,
34
        'bitpay' => 1,
35
        'epayservice' => 1,
36
        'twoco' => 1,
37
        'epayments' => 1,
38
        'ikajo' => 1,
39
        'coingate' => 1,
40
        'yandexkassa' => 1,
41
    ];
42
43
    public function init()
44
    {
45
        parent::init();
46
47
        if ($this->depositRequest === null) {
48
            $this->depositRequest = $this->createDefaultDepositRequest();
49
        }
50
51
        $this->loadMerchants($this->depositRequest);
52
53
        if ($this->module->cashewOnly) {
54
            $this->supportedSystems['cashew'] = 1;
55
        }
56
    }
57
58
    public function loadMerchants($depositRequest)
59
    {
60
        $this->addItems($this->fetchMerchants($depositRequest));
61
    }
62
63
    public function fetchMerchants(DepositRequest $depositRequest)
64
    {
65
        $params = [
66
            'transactionId' => $depositRequest->id,
67
            'sum' => (float)$depositRequest->amount,
68
            'currency' => $depositRequest->currency,
69
            'site' => Yii::$app->request->getHostInfo(),
70
        ];
71
72
        if (Yii::$app->user->getIsGuest()) {
73
            $params['seller'] = Yii::$app->params['user.seller'];
74
        } elseif ($depositRequest->username !== null) {
75
            $params['username'] = $depositRequest->username;
76
        }
77
78
        if ($depositRequest->merchant !== null) {
79
            // When the Request contains concrete merchant name,
80
            // parameters `finishUrl`, `cancelUrl`, `notifyUrl` contain
81
            // correct URLs, adjusted by [[hiqdev\yii2-merchant\Module::prepareRequestData()]]
82
            // and they must be used as success, failure and confirm URLs
83
            $params['success_url'] = $depositRequest->returnUrl;
84
            $params['failure_url'] = $depositRequest->cancelUrl;
85
            $params['confirm_url'] = $depositRequest->notifyUrl;
86
        }
87
88
        try {
89
            $merchants = $this->requestMerchants($params);
90
        } catch (ResponseErrorException $e) {
91
            if ($e->getResponse()->getData() === null) {
92
                Yii::info('No available payment methods found', 'hipanel:finance');
93
                $merchants = [];
94
            } else {
95
                throw $e;
96
            }
97
        }
98
99
        $result = [];
100
        foreach ($merchants as $name => $merchant) {
101
            if (!empty($this->supportedSystems[$merchant['system']])) {
102
                $result[$name] = $this->convertMerchant($merchant);
103
            }
104
        }
105
106
        return $result;
107
    }
108
109
    public function requestMerchants($params)
110
    {
111
        $userId = Yii::$app->user->getIsGuest() ? null : Yii::$app->user->identity->getId();
112
113
        return Yii::$app->getCache()->getOrSet([__METHOD__, $params, $userId], function () use ($params) {
114
            return Merchant::perform('prepare-info', $params, ['batch' => true]);
115
        }, 3600);
116
    }
117
118
    public function convertMerchant($data)
119
    {
120
        $request = new PurchaseRequest();
121
122
        $request->merchant_name = $data['name'];
123
        $request->system = $data['system'];
124
        $request->currency = strtoupper($data['currency']);
125
        $request->label = $data['label'];
126
        $request->fee = $data['fee'];
127
        $request->commission_fee = $data['commission_fee'];
128
        $request->id = $data['invoice_id'];
129
        $request->amount = $data['sum'];
130
        $request->form = (new RedirectPurchaseResponse($data['action'], $data['inputs']))->setMethod($data['method']);
131
        $request->disableReason = $data['disable_reason'] ?? null;
132
        $request->vat_rate = $data['vat_rate'] ?? null;
133
        $request->vat_sum = $data['vat_sum'] ?? null;
134
135
        return $request;
136
    }
137
138
    protected function createDefaultDepositRequest()
139
    {
140
        $request = new DepositRequest();
141
        $request->amount = 10;
142
143
        return $request;
144
    }
145
}
146