Files
request-portal/docs/permissions.md
T
Тимур Городецкий cfbca8c2b2 feat: Ербол Шаймерденов правит все поля и вложения заявки на рабочее место
Полное право правки стало раздельным по формам: раньше общий список открыл
бы Ерболу и подбор с приёмом. В «Организации рабочего места» право действует,
пока он есть в маршруте (согласование или исполнение) и заявка «На
согласовании» или «Выполнение», независимо от того, чья сейчас очередь.
Правки пишутся в журнал (подсветка «Было: …»), перед «Согласовать»
проверяются обязательные поля. Блок вложений вынесен в общий компонент.

Нужна новая колонка WorkplaceApproverChangesJson в списке данных.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-07 12:08:25 +05:00

64 lines
9.5 KiB
Markdown

# Особые права в портале — реестр
Здесь собраны все места, где кому-то выданы права **сверх обычных**. Обычные
права такие: автор правит свою незавершённую заявку, согласующий или исполнитель
решает на своём активном шаге.
Многие права пока выданы **по email или по должности прямо в коде**. Это
временно: план — переехать на группы SharePoint. Этот файл нужен, чтобы при
переезде, смене сотрудника или разборе «почему у него есть или нет кнопки»
ничего не потерять.
> **Правило.** Добавили, изменили или убрали особое право — поправьте таблицу
> ниже в том же коммите.
## Сводная таблица
| Право | Кто | Как определяется | Где действует | Файл с проверкой |
|---|---|---|---|---|
| Удалять согласующих, которые ещё ждут очереди | Алтынай Бултурукова, Павел Горбенко | email в коде | Подбор, Приём, Реферальная рекомендация: и при составлении, и в поданной заявке | `shared/approval/routeEditRights.ts` → `canEditRoute` |
| Удалять любых согласующих **при составлении** заявки | те же (`canEditRoute`) | email в коде | Все остальные формы с маршрутом согласования (отпуск, увольнение, 1С и т. д.); в поданной заявке — нет | `shared/approval/routeEditRights.ts` → `composeRemoveRowRule` |
| Добавлять и удалять исполнителей **при составлении** заявки | те же (`canEditRoute`) | email в коде | Все формы, где в маршруте из админки есть фаза исполнения; в поданной заявке — нет | `shared/approval/routeEditRights.ts` → `canEditExecutors` |
| Заменять и удалять исполнителей, **в том числе активного** («На исполнении») | Алтынай Бултурукова | тот же email (`canEditRoute`) | **Только** Заявка на подбор, матрица «Исполнение» | `canEditRoute` + `forms/RecruitingSelection/RecruitingSelectionView.tsx` |
| Править **все поля и вложения** заявки (добавлять и удалять файлы) на своём активном шаге согласования | Алтынай Бултурукова | email в коде (список по каждой форме) | Подбор, Приём (Реферальная рекомендация — нет) | `shared/approval/fullEditRights.ts` → `canEditAllFields` |
| То же: **все поля и вложения**, но **не только на своём шаге**: достаточно быть в маршруте (согласование или исполнение), пока заявка «На согласовании» или «Выполнение» | Ербол Шаймерденов | email в коде (список по каждой форме) + участие в маршруте | **Только** Организация рабочего места | `shared/approval/fullEditRights.ts` → `canEditAllFields` + `forms/WorkplaceSetup/useApproverRights.ts` |
| Заполнять «Необходимое ПО» и «Доступы» на своём шаге согласования | Первый шаг маршрута согласования (по маршруту — непосредственный руководитель) | порядок шага в маршруте | Организация рабочего места | `forms/WorkplaceSetup/useApproverRights.ts` (`canEditReviewFields`) |
| Править оклад на ИС, оклад после ИС, «Отдел/Участок» на своём шаге согласования | Начальник расчётной группы (сейчас Ким Анна) | должность шага: «начальник/руководитель» + «расчет» | Заявка на приём | `forms/RecruitingHire/approverRights.ts` → `canEditPayrollFields` |
| Ставить дату приёма (2.2) | Активный исполнитель | роль в маршруте (шаг «Исполнение»), без проверки должности | Заявка на приём | `forms/RecruitingHire/RecruitingHireView.tsx` (`hireDateEditable`) |
| Править карту СКУД и сумму за обучение | Начальник отдела кадрового делопроизводства | должность шага: «начальник/руководитель» + «кадров» + «делопроизводств» | Обходной лист | `forms/Clearance/approverRights.ts` → `canEditHrRecordsFields` |
| Править парковочную карту | Начальник отдела подбора и адаптации | должность шага: «начальник/руководитель» + «подбор» + «адаптац» | Обходной лист | `forms/Clearance/approverRights.ts` → `canEditParkingField` |
| Видеть раздел «Отчёты» | Группа SP «Отчеты по заявкам» (Id 199) **и** всегда: Тришина М., Городецкий Т., Горбенко П., Сарниязова А. | группа SharePoint + email в коде | Боковое меню | `shared/reports/reportsAccess.ts` → `hasReportsAccess` |
| Видеть «Все заявки» типа (чужие тоже, только просмотр) | Список email для каждого типа | настраивается **в админке approval-route**, не в коде | Раздел «Все заявки» | `shared/approval/requestTypeAccess.ts` |
| Подавать заявки, пока действует заморозка | Группа SP «Тестирование» (Id 124) | группа SharePoint | Все замороженные формы (разморожены для всех: 1С, Подбор, Приём, Реферал, Рабочее место) | `shared/ui/SubmitActions/SubmitActions.tsx` (`SUBMISSION_FROZEN`, `UNFROZEN_FORMS`) + `testerGroupAccess.ts` |
| Открывать формы «в разработке» (`comingSoon`) | Группа SP «Тестирование» (Id 124) | группа SharePoint | Плитки и формы с `comingSoon` | `shared/useIsTester.ts`, `components/RequestGrid/RequestGrid.tsx`, `features/submit/SubmitFeature.tsx` |
| Отладочная подмена личности (портал работает от имени другого сотрудника) | Тот, кто может править свойства веб-части на странице (владельцы или редакторы сайта) | поле в свойствах веб-части | Весь портал; на экране красная плашка | `shared/impersonation.ts` |
## Как проверяются права по должности
Права «по должности» (приём, обходной лист) сравнивают **ключевые слова** в
должности шага маршрута: это колонка Title строки согласования, её подставляет
маршрут при планировании. Обязателен управленческий маркер
«начальник»/«руководитель», иначе право получили бы рядовые сотрудники того же
отдела.
Риск: опечатка или переформулировка должности в кадровом справочнике молча
отключит право. Случайное совпадение слов может выдать его не тому человеку.
## Что сделать при переезде на группы SharePoint
1. Под каждый набор прав завести группу на сайте данных (`/sites/requests`).
2. В коде проверять членство по **Id группы**, а не по Title, как уже сделано
в `reportsAccess.ts` и `testerGroupAccess.ts`.
3. Проверка должна учитывать отладочную подмену личности (`effectiveUserEmail`,
см. `reportsAccess.ts`). Иначе под подменой будут проверяться права
настоящего пользователя.
4. Обновить эту таблицу.
## Известные ограничения
- **Замена активного исполнителя (подбор).** Если прежний исполнитель держит
заявку открытой и, не обновив страницу, нажмёт «Выполнено», решение
запишется в шаг, который уже принадлежит новому исполнителю. При решении
пока не перепроверяется, что шаг всё ещё за этим человеком
(`ApproverService.decide`).