Files
mkd/docs/REPORT_02_ACCESS_TABLE_AND_REWRITE_PLAN.md
2026-02-04 00:17:04 +05:00

21 KiB
Executable File
Raw Blame History

Отчёт №2 — Таблица доступов и план переписывания прав

Документ подготовлен после согласования отчёта №1. Содержит: большую таблицу доступов (раздел × подраздел × роль), рекомендуемые шаблоны прав, пошаговый план переписывания логики прав и чек-лист файлов для правок.


1. Большая таблица доступов

Уровни: нет доступа, Ч чтение, Р редактирование, С только своё. По умолчанию для роли везде, где раздел доступен, используется Р (редактирование).

1.1 Сводка (dashboard)

Подраздел DIRECTOR ENGINEER MASTER LAWYER FINANCIER HR_MANAGER PR_MANAGER
Стратегические цели Р Р Р Р Р Р
Панель «Производство» Р Р Р¹ Р Р Р Р
Панель «PR и клиентский опыт» Р Р Р Р Р Р
Панель «Финансы» Р Р Р Р Р Р
Панель «Развитие» Р Р Р Р Р Р
Панель «Юр. отдел» Р Р Р Р Р Р
Панель «Кадры» Р Р Р Р Р Р
Мои задачи Р Р Р Р Р Р
Новости компании Р Р Р Р Р Р

1.2 Участки (objects)

Подраздел DIRECTOR ENGINEER MASTER LAWYER FINANCIER HR_MANAGER PR_MANAGER
Обзор участков Р Р Р* Р Р
Дома Р Р Р* Р Р
Штат участка Р Р Р* Р Р

* MASTER: по умолчанию scope = только свой участок (см. п. 1.10).

1.3 Заявки (requests)

Подраздел DIRECTOR ENGINEER MASTER LAWYER FINANCIER HR_MANAGER PR_MANAGER
Сводка Р Р Р* Р Р
Реестр заявок Р Р Р* Р Р
Контроль Р Р Р* Р Р
Качество Р Р Р* Р Р
Привязки Р Р Р* Р Р
Отключения Р Р Р* Р Р

1.4 PR и NPS (pr)

Подраздел DIRECTOR ENGINEER MASTER LAWYER FINANCIER HR_MANAGER PR_MANAGER
Сводка Р Р
SMM Р Р
Мероприятия Р Р¹ Р
Обратная связь Р Р
Отчёты Р Р
Фото работ Р Р¹ Р
NPS Р Р
Негатив Р Р

1.5 Финансы (finance)

Подраздел DIRECTOR ENGINEER MASTER LAWYER FINANCIER HR_MANAGER PR_MANAGER
Сводка Р Р
Реестр счетов Р С¹ Р
Календарь оплат Р Р¹ Р
Отчёты Р Р
Подраздел DIRECTOR ENGINEER MASTER LAWYER FINANCIER HR_MANAGER PR_MANAGER
Сводка Р Р
Взыскание долгов Р Р
Договоры Р Р
Судебные дела Р Р
Досудебная работа Р Р Р
Соответствие Р Р

1.7 Развитие (development)

Подраздел DIRECTOR ENGINEER MASTER LAWYER FINANCIER HR_MANAGER PR_MANAGER
Сводка Р Р
Реестр объектов Р Р
ОСС Р Р
Техаудит Р Р
Маркетинг Р Р

1.8 Кадры (hr)

Подраздел DIRECTOR ENGINEER MASTER LAWYER FINANCIER HR_MANAGER PR_MANAGER
Сводка Р Р
Сотрудники Р Р
Календарь Р Р
Вакансии Р Р
Подбор Р Р
Охрана труда Р Р

1.9 Офис (office)

Подраздел DIRECTOR ENGINEER MASTER LAWYER FINANCIER HR_MANAGER PR_MANAGER
Сводка Р Р Р Р
Закупки Р Р Р¹ Р Р
Документы Р Р Р Р
Объекты Р Р Р Р
Ремонты Р Р Р¹ Р Р
База знаний Р Р Р Р
Встречи Р Р Р Р
Новости Р Р Р Р

1.10 Панель управления (admin)

Подраздел DIRECTOR ENGINEER MASTER LAWYER FINANCIER HR_MANAGER PR_MANAGER
Все подразделы Р

Только роль DIRECTOR по умолчанию имеет доступ к разделу admin. Остальные роли — нет доступа (при необходимости доступ задаётся кастомными permissions).

1.11 Ограничение по участкам

Роль Ограничение по участкам
DIRECTOR Все участки
ENGINEER Все участки
MASTER Только свой участок (свои назначенные участки)
LAWYER Все участки
FINANCIER Все участки
HR_MANAGER Все участки
PR_MANAGER Все участки

Список «своих» участков формируется из employee_districts с fallback на employees.assigned_district_id.

¹ MASTER: доступ по шаблону «Мастер участка (расширенный)» — при назначении шаблона подставляются permissions (в т.ч. dashboard_production, finance_invoices:own, finance_calendar, office_supply, office_repair, pr_events, pr_photos), scope = own_district. Реестр счетов для мастера — уровень «только своё» (С): видны только счета, созданные им (scope=own в API).


2. Шаблоны прав

Рекомендуемые шаблоны для быстрого назначения прав пользователям. Каждый шаблон задаёт permissions (массив ключей раздел/подраздел:уровень), scope и suggested_role.

Название шаблона Разделы и подразделы (уровень) Рекомендуемая роль Scope Назначение
Мастер участка objects (все подразделы), requests (все подразделы) MASTER own_district Мастер: участки и заявки только по своим участкам.
Мастер участка (расширенный) objects, requests, dashboard_production, finance_invoices:own, finance_calendar, office_supply, office_repair, pr_events, pr_photos MASTER own_district Мастер: участки, заявки, сводка (производство), реестр счетов (только свои), календарь оплат, закупки ТМЦ, ремонт техники, мероприятия и фото отчёты по своим домам.
Гл. инженер dashboard, objects, requests, office, development (все подразделы — edit) ENGINEER all Производство, участки, заявки, офис, развитие.
Начальник PR dashboard, pr, requests (все подразделы — edit) PR_MANAGER all PR и NPS, заявки, сводка.
Финансист dashboard, finance, office, objects (все подразделы — edit) FINANCIER all Финансы, офис, участки (для отчётности).
HR-менеджер dashboard, hr, office (все подразделы — edit) HR_MANAGER all Кадры, офис.
Юрист dashboard, legal, objects, requests (все подразделы — edit) LAWYER all Юр. отдел, участки, заявки.
Только чтение (сводка и участки) dashboard:read, objects:read (подразделы — read) ENGINEER или MASTER all / own_district Просмотр без редактирования.

В интерфейсе админки шаблоны отображаются как справочник: при создании/редактировании пользователя можно применить шаблон — подставляются permissions, scope и при необходимости suggested_role. Таблица доступов (раздел × подраздел) остаётся единой; шаблон — это готовый набор строк этой таблицы для выбранной роли и scope.


3. План переписывания прав

3.1 Единый источник прав

  • Создать один модуль констант: коды ролей, названия ролей (ROLE_NAMES), список разделов (SECTION_IDS / ALL_SECTION_KEYS), матрица «роль → разделы по умолчанию» (ROLE_ACCESS), матрица «роль → scope по умолчанию» (например ROLE_DEFAULT_SCOPE).
  • Варианты реализации: (1) общий файл в репозитории, импортируемый и на фронте (TypeScript), и на бэкенде (через require/импорт JS-версии или общий JSON); (2) генерация из одного JSON/YAML в constants для фронта и в константы для Node. Цель: убрать дублирование ROLE_ACCESS, ROLE_NAMES, SECTION_IDS в App.tsx, Navigation.tsx, server.js, UsersSection.tsx, PermissionsSection.tsx.
  • В constants/permissions.ts оставить SECTION_LABELS, SECTION_SUBS, функции canAccessSub, getPermissionLevel, allowedSubsForSection и т.д.; роли и ROLE_ACCESS импортировать из единого источника.

3.2 Изменения в БД

  • Миграции при необходимости: структура portal_users (role, permissions, scope) и permission_templates не меняется. При scope=own_district во всех API, где идёт фильтр по участку, единообразно использовать список district_id из employee_districts с fallback на assigned_district_id (см. п. 3.4).

3.3 Фронт

  • Заменить все проверки «по роли» на единые функции из общего модуля прав с учётом permissions и scope. Логика уже опирается на allowedSections и userPermissions из /auth/me; нужно убрать локальные константы и импортировать ROLE_ACCESS, ROLE_NAMES (и при необходимости SECTION_IDS) из единого источника.
  • Компоненты, использующие allowedSubsForSection, canAccessSub, useSubPermission, оставить без изменения логики; источник констант — общий.

3.4 Бэкенд

  • Все API, отдающие данные в зависимости от прав: использовать единую функцию вычисления allowedSections (и при необходимости уровней по подразделам) из констант. Для фильтра по участку при scope=own_district — единая функция: получить разрешённые district_id из employee_districts по employee_id пользователя; если пусто — взять assigned_district_id. Применять этот список в запросах (buildings — фильтр домов по district_id IN (...), при необходимости заявки, отчёты и т.д.).
  • В backend/routes/buildings.js заменить текущую логику (только assigned_district_id) на получение списка участков через employee_districts + fallback и фильтр WHERE (data->>'districtId') = ANY($1).

3.5 Админка

  • Создание/редактирование пользователей и шаблонов — сохранение в текущем формате (role, permissions, scope); при необходимости расширить под полную матрицу или подсказки по шаблонам. ROLE_NAMES брать из единого источника.

4. Чек-лист файлов для правок

Файл Что менять
Единый источник (новый файл) Создать модуль с ролями, ROLE_NAMES, ROLE_ACCESS, SECTION_IDS, ROLE_DEFAULT_SCOPE. Вариант: constants/roleAccess.ts (фронт) + использование на бэкенде через копию или общий пакет.
constants/permissions.ts Импорт SECTION_IDS/ALL_SECTION_KEYS и ролей из единого источника при необходимости; оставить SECTION_LABELS, SECTION_SUBS, все функции.
types.ts UserRole синхронизировать с единым источником (экспорт типа из источника или дублировать список).
App.tsx Удалить локальные ROLE_ACCESS, ROLE_NAMES; импорт из единого модуля.
components/Navigation.tsx Удалить ROLE_ACCESS; импорт из единого модуля.
components/admin/UsersSection.tsx Удалить ROLE_NAMES; импорт из единого модуля.
components/admin/PermissionsSection.tsx Удалить ROLE_NAMES; импорт из единого модуля.
backend/server.js Удалить локальные ROLE_ACCESS, SECTION_IDS; подключать константы из общего модуля (например shared/roleAccess.js или сгенерированный файл). Функцию allowedSectionsFromPermissions оставить, секции брать из констант.
backend/routes/buildings.js При scope=own_district: получать список district_id из employee_districts по employee_id пользователя; при пустом — [assigned_district_id]. Фильтр домов: WHERE (data->>'districtId') = ANY($1::text[]).
Другие API в server.js Найти все места фильтра по участку или проверки раздела; подключить единую функцию получения списка участков для scope=own_district.
Миграции При появлении новых полей или таблиц ролей по умолчанию — добавить миграции. Текущий план миграций не требует.

После выполнения пунктов чек-листа логика прав будет приведена к единому источнику, дубли убраны, фильтр по участкам для scope=own_district будет учитывать все назначенные участки (employee_districts).