From e3f4bcf9bd7157ec24eb519b7510bf18fda2c87f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Mon, 28 Sep 2026 16:29:29 +0500 Subject: [PATCH] =?UTF-8?q?docs:=20=D1=80=D0=B5=D0=B5=D1=81=D1=82=D1=80=20?= =?UTF-8?q?=D0=BE=D1=81=D0=BE=D0=B1=D1=8B=D1=85=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Все места, где права выданы сверх обычных (по email, должности, группе SharePoint или в админке approval-route), собраны в одну таблицу с файлами проверок — чтобы не потерять их при переезде на группы SharePoint или смене сотрудника. Ссылка добавлена в docs/forms.md. Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/forms.md | 1 + docs/permissions.md | 59 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 docs/permissions.md diff --git a/docs/forms.md b/docs/forms.md index 5affc37..9d3151b 100644 --- a/docs/forms.md +++ b/docs/forms.md @@ -28,6 +28,7 @@ ## Что НЕ дублируем в карточке (лежит в других местах) - Колонки списков → `forms/<Форма>/provisioning.json`. - Параметры ссылок (rptype/rpmode/rpid/rpsource) → [`routing.md`](./routing.md). +- Особые права (кто что может сверх обычного, по email/должности/группе) → [`permissions.md`](./permissions.md). - Как обращаться к спискам SP из кода → [`sp-lists-frontend.md`](./sp-lists-frontend.md). - Общий жизненный цикл (черновик/upsert/блокировка/статусы), согласование, исполнение, печать — **одинаковы для всех форм** (общие примитивы `shared/ui` и `shared/approval`). diff --git a/docs/permissions.md b/docs/permissions.md new file mode 100644 index 0000000..eebf95b --- /dev/null +++ b/docs/permissions.md @@ -0,0 +1,59 @@ +# Особые права в портале — реестр + +Здесь собраны все места, где кому-то выданы права **сверх обычных**. Обычные +права такие: автор правит свою незавершённую заявку, согласующий или исполнитель +решает на своём активном шаге. + +Многие права пока выданы **по email или по должности прямо в коде**. Это +временно: план — переехать на группы SharePoint. Этот файл нужен, чтобы при +переезде, смене сотрудника или разборе «почему у него есть или нет кнопки» +ничего не потерять. + +> **Правило.** Добавили, изменили или убрали особое право — поправьте таблицу +> ниже в том же коммите. + +## Сводная таблица + +| Право | Кто | Как определяется | Где действует | Файл с проверкой | +|---|---|---|---|---| +| Удалять согласующих, которые ещё ждут очереди | Алтынай Бултурукова | email в коде | Подбор, Приём, Реферальная рекомендация: и при составлении, и в поданной заявке | `shared/approval/routeEditRights.ts` → `canEditRoute` | +| Заменять и удалять исполнителей, **в том числе активного** («На исполнении») | Алтынай Бултурукова | тот же email (`canEditRoute`) | **Только** Заявка на подбор, матрица «Исполнение» | `canEditRoute` + `forms/RecruitingSelection/RecruitingSelectionView.tsx` | +| Править **все поля** заявки на своём активном шаге согласования (без вложений) | Алтынай Бултурукова | email в коде | Подбор, Приём (Реферальная рекомендация — нет) | `shared/approval/fullEditRights.ts` → `canEditAllFields` | +| Править оклад на ИС, оклад после ИС, «Отдел/Участок» на своём шаге согласования | Начальник расчётной группы (сейчас Ким Анна) | должность шага: «начальник/руководитель» + «расчет» | Заявка на приём | `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`).