76 lines
2.4 KiB
PHP
76 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace App\Filters;
|
|
|
|
use CodeIgniter\Filters\FilterInterface;
|
|
use CodeIgniter\HTTP\RequestInterface;
|
|
use CodeIgniter\HTTP\ResponseInterface;
|
|
use App\Services\ModuleSubscriptionService;
|
|
|
|
/**
|
|
* Фильтр проверки подписки на модуль
|
|
*
|
|
* Проверяет, есть ли у организации активная подписка на указанный модуль.
|
|
* Если подписки нет - перенаправляет на dashboard с сообщением об ошибке.
|
|
*/
|
|
class ModuleSubscriptionFilter implements FilterInterface
|
|
{
|
|
/**
|
|
* Проверка подписки перед выполнением запроса
|
|
*/
|
|
public function before(RequestInterface $request, $arguments = null)
|
|
{
|
|
if (!$arguments) {
|
|
return;
|
|
}
|
|
|
|
$moduleCode = $arguments[0] ?? null;
|
|
if (!$moduleCode) {
|
|
return;
|
|
}
|
|
|
|
$session = session();
|
|
$orgId = $session->get('active_org_id');
|
|
|
|
// Если организация не выбрана - пропускаем (другие фильтры обработают)
|
|
if (!$orgId) {
|
|
return;
|
|
}
|
|
|
|
// Базовый модуль всегда доступен
|
|
if ($moduleCode === 'base') {
|
|
return;
|
|
}
|
|
|
|
$subscriptionService = new ModuleSubscriptionService();
|
|
|
|
// Проверяем доступность модуля
|
|
if (!$subscriptionService->isModuleAvailable($moduleCode, $orgId)) {
|
|
$session->setFlashdata('error', 'Модуль "' . $this->getModuleName($moduleCode) . '" не активен для вашей организации');
|
|
return redirect()->to('/');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Получение читаемого имени модуля
|
|
*/
|
|
protected function getModuleName(string $moduleCode): string
|
|
{
|
|
$names = [
|
|
'crm' => 'CRM',
|
|
'booking' => 'Бронирования',
|
|
'tasks' => 'Задачи',
|
|
'proof' => 'Proof',
|
|
];
|
|
return $names[$moduleCode] ?? $moduleCode;
|
|
}
|
|
|
|
/**
|
|
* Обработка ответа после выполнения запроса
|
|
*/
|
|
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
|
|
{
|
|
// Ничего не делаем после запроса
|
|
}
|
|
}
|