# Отчёт №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 |
|-----------------|----------|----------|--------|--------|-----------|------------|------------|
| Сводка          | Р        | —        | —      | —      | Р         | —          | —          |
| Реестр счетов   | Р        | —        | С¹     | —      | Р         | —          | —          |
| Календарь оплат | Р        | —        | Р¹     | —      | Р         | —          | —          |
| Отчёты          | Р        | —        | —      | —      | Р         | —          | —          |

### 1.6 Юр. отдел (legal)

| Подраздел           | 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).
