Issues (1369)

classes/Payment/PaymentsMethodsActive.php (1 issue)

Severity
1
<?php
2
/**
3
 * Created by Gorlum 22.08.2019 3:38
4
 */
5
6
namespace Payment;
7
8
9
use HelperArray;
10
use SN;
11
use sn_module_payment;
12
13
class PaymentsMethodsActive {
14
  const P_MODULES = 'modules';
15
16
  /**
17
   * List of installed payment modules
18
   *
19
   * @var sn_module_payment[] $modulesInstalled
20
   */
21
  protected $modulesInstalled = [];
22
23
  /**
24
   * Generated list of available payment methods and corresponding modules that supports this method
25
   *
26
   * @var sn_module_payment[][][] $methodsAvailableV2 [
27
   *                                  (int)$paymentMethodId => [
28
   *                                    self::P_MODULES => [(str)$moduleName => (sn_payment_module)$module, ...]
29
   *                                  ], ...
30
   *                                ]
31
   */
32
  protected $methodsAvailableV2 = [];
33
34
  public function __construct() {
35
    // А теперь из каждого модуля вытаскиваем методы, которые он поддерживает
36
    $paymentModuleList = SN::$gc->modules->getModulesInGroup('payment', true);
37
    foreach ($paymentModuleList as $module_name => $module) {
38
      /**
39
       * @var sn_module_payment $module
40
       */
41
      if (!is_object($module) || !$module instanceof sn_module_payment || !$module->isActive()) {
42
        continue;
43
      }
44
45
      lng_include($module_name, $module->getRootRelative());
46
47
      foreach (PaymentMethods::$payment_methods as $payment_type_id => $available_methods) {
48
        foreach ($available_methods as $payment_method => $payment_currency) {
49
          if ($module->isMethodSupported($payment_method)) {
50
            $this->registerModuleOnMethod($module, $payment_method);
51
          }
52
        }
53
      }
54
    }
55
  }
56
57
  /**
58
   * Register module to support payment method
59
   *
60
   * @param sn_module_payment $module
61
   * @param int               $paymentMethodId
62
   */
63
  public function registerModuleOnMethod($module, $paymentMethodId) {
64
    $module_name = $module->getFullName();
65
66
    $this->methodsAvailableV2[$paymentMethodId][self::P_MODULES][$module_name] = $module;
67
68
    $this->modulesInstalled[$module_name] = $module;
69
  }
70
71
  /**
72
   * @param $paymentMethodId
73
   *
74
   * @return sn_module_payment[]
75
   */
76
  public function getModulesOnMethod($paymentMethodId) {
77
    return
78
      is_array($this->methodsAvailableV2[$paymentMethodId][self::P_MODULES])
0 ignored issues
show
The condition is_array($this->methodsA...odId][self::P_MODULES]) is always true.
Loading history...
79
        ? $this->methodsAvailableV2[$paymentMethodId][self::P_MODULES]
80
        : [];
81
  }
82
83
  /**
84
   * Return count of registered modules for supplied payment method
85
   *
86
   * @param $paymentMethodId
87
   *
88
   * @return int
89
   */
90
  public function getModuleCount($paymentMethodId) {
91
    return count($this->getModulesOnMethod($paymentMethodId));
92
  }
93
94
  /**
95
   * @param $paymentMethodId
96
   *
97
   * @return mixed|null
98
   */
99
  public function getFirstModuleNameOnMethod($paymentMethodId) {
100
    return HelperArray::array_key_first($this->methodsAvailableV2[$paymentMethodId][self::P_MODULES]);
101
  }
102
103
  /**
104
   * @param $moduleName
105
   *
106
   * @return bool
107
   */
108
  public function isModuleInstalled($moduleName) {
109
    return in_array($moduleName, array_keys($this->modulesInstalled));
110
  }
111
112
  /**
113
   * @return int
114
   */
115
  public function getInstalledModuleCount() {
116
    return count($this->modulesInstalled);
117
  }
118
119
120
  /**
121
   * @return mixed
122
   */
123
  public function getFirstInstalledModuleName() {
124
    return HelperArray::array_key_first($this->modulesInstalled);
125
  }
126
127
128
  /**
129
   * Does module supports this payment method?
130
   *
131
   * @param string $moduleName
132
   * @param int    $paymentMethodId
133
   *
134
   * @return bool
135
   */
136
  public function isModuleSupportMethod($moduleName, $paymentMethodId) {
137
    return !empty($this->methodsAvailableV2[$paymentMethodId][self::P_MODULES][$moduleName]);
138
  }
139
140
  /**
141
   * Checks input params for validity
142
   *
143
   * @param string $moduleName
144
   * @param int    $paymentMethodId
145
   *
146
   * @return array
147
   */
148
  public function processInputParams($moduleName, $paymentMethodId) {
149
    $installedModulesCount = $this->getInstalledModuleCount();
150
    if (!$installedModulesCount) {
151
      // Если нет инсталлированных модулей - то как вообще мы тут оказались?
152
      $moduleName      = '';
153
      $paymentMethodId = 0;
154
    } elseif ($installedModulesCount == 1) {
155
      // Если у нас единственный модуль платежа - то только его можно и использовать
156
      $moduleName = $this->getFirstInstalledModuleName();
157
158
      // И если этот модуль не поддерживает выбранный метод платежа - значит метод платежа никуда не годится
159
      if (!$this->isModuleSupportMethod($moduleName, $paymentMethodId)) {
160
        $paymentMethodId = 0;
161
      }
162
163
      if(!$paymentMethodId) {
164
        $module = $this->modulesInstalled[$moduleName];
165
        $methodsOnModule = $module->getMethodList();
166
        if(count($methodsOnModule) == 1) {
167
          $paymentMethodId = HelperArray::array_key_first($methodsOnModule);
168
        }
169
      }
170
    } elseif (!$paymentMethodId) {
171
      // Если метод платежа не указан - то и модуль под него выбрать нельзя
172
      $moduleName = '';
173
    } else {
174
      // Если у нас всего модулей больше одного и метод платежа указан - то тут становится интереснее
175
176
      $modulesCount = $this->getModuleCount($paymentMethodId);
177
      if (!$modulesCount) {
178
        // Если метод не поддерживается ни одном модулем - значит левая фигня. Сбрасываем всё в ноль
179
        $moduleName      = '';
180
        $paymentMethodId = 0;
181
      } elseif ($modulesCount == 1) {
182
        // Если выбран метод платежа и у нас один-единственный модуль - то выбираем его в качестве активного
183
        $moduleName = $this->getFirstModuleNameOnMethod($paymentMethodId);
184
      } /** @noinspection PhpStatementHasEmptyBodyInspection */ else {
185
        // А тут ничего делать и не надо - у нас выбран метод платежа и модуль, который его поддерживает
186
      }
187
    }
188
189
    return [$moduleName, $paymentMethodId];
190
  }
191
192
}
193