Completed
Push — trunk ( d06df9...f48ee3 )
by SuperNova.WS
11:23
created

PaymentsMethodsActive::getInstalledModuleCount()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 2
rs 10
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 array $modulesInstalled
20
   */
21
  protected $modulesInstalled = [];
22
23
  /**
24
   * Generated list of available payment methods and corresponding modules that supports this method
25
   *
26
   * @var array $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])
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
  /**
105
   * @param $moduleName
106
   *
107
   * @return bool
108
   */
109
  public function isModuleInstalled($moduleName) {
110
    return in_array($moduleName, array_keys($this->modulesInstalled));
111
  }
112
113
  /**
114
   * @return int
115
   */
116
  public function getInstalledModuleCount() {
117
    return count($this->modulesInstalled);
118
  }
119
120
121
  /**
122
   * @return mixed
123
   */
124
  public function getFirstInstalledModuleName() {
125
    return HelperArray::array_key_first($this->modulesInstalled);
126
  }
127
128
129
  /**
130
   * Does module supports this payment method?
131
   *
132
   * @param string $moduleName
133
   * @param int    $paymentMethodId
134
   *
135
   * @return bool
136
   */
137
  public function isModuleSupportMethod($moduleName, $paymentMethodId) {
138
    return !empty($this->methodsAvailableV2[$paymentMethodId][self::P_MODULES][$moduleName]);
139
  }
140
141
  /**
142
   * Checks input params for validity
143
   *
144
   * @param string $moduleName
145
   * @param int    $paymentMethodId
146
   *
147
   * @return array
148
   */
149
  public function processInputParams($moduleName, $paymentMethodId) {
150
    $installedModulesCount = $this->getInstalledModuleCount();
151
    if (!$installedModulesCount) {
152
      // Если нет инсталлированных модулей - то как вообще мы тут оказались?
153
      $moduleName      = '';
154
      $paymentMethodId = 0;
155
    } elseif ($installedModulesCount == 1) {
156
      // Если у нас единственный модуль платежа - то только его можно и использовать
157
      $moduleName = $this->getFirstInstalledModuleName();
158
159
      // И если этот модуль не поддерживает выбранный метод платежа - значит метод платежа никуда не годится
160
      if (!$this->isModuleSupportMethod($moduleName, $paymentMethodId)) {
161
        $paymentMethodId = 0;
162
      }
163
    } elseif (!$paymentMethodId) {
164
      // Если метод платежа не указан - то и модуль под него выбрать нельзя
165
      $moduleName = '';
166
    } else {
167
      // Если у нас всего модулей больше одного и метод платежа указан - то тут становится интереснее
168
169
      $modulesCount = $this->getModuleCount($paymentMethodId);
170
      if (!$modulesCount) {
171
        // Если метод не поддерживается ни одном модулем - значит левая фигня. Сбрасываем всё в ноль
172
        $moduleName      = '';
173
        $paymentMethodId = 0;
174
      } elseif ($modulesCount == 1) {
175
        // Если выбран метод платежа и у нас один-единственный модуль - то выбираем его в качестве активного
176
        $moduleName = $this->getFirstModuleNameOnMethod($paymentMethodId);
177
      } /** @noinspection PhpStatementHasEmptyBodyInspection */ else {
178
        // А тут ничего делать и не надо - у нас выбран метод платежа и модуль, который его поддерживает
179
      }
180
    }
181
182
    return [$moduleName, $paymentMethodId];
183
  }
184
185
}
186