Staffing — отделы, сотрудники, проекты, задачи, кадровый резерв
Простыми словами: это собственный внутренний PM/staffing-инструмент P4P — здесь компания ведёт свои отделы, проекты и задачи, а также рассматривает людей, которые хотят работать с P4P. Несмотря на то, что /team/* по виду URL похож на рабочее пространство клиентской организации, им не является: см. Архитектурные уровни — весь этот модуль уровня Platform, закрыт platform:staffing:* и PlatformStaffMembership (нужно быть признанным сотрудником P4P, чтобы вообще что-то здесь увидеть), а не чем-либо уровня Organization.
Все роуты разделяют middleware: 'platform-access' + requiresPlatformPermission: 'platform:staffing:read' (гейт уровня страницы; отдельные изменяющие действия требуют :manage, см. ниже) и layout: 'team'. Бэкенд: apps/core-api/src/modules/staffing/*.
Как сделать...
Сгруппировано так же, как технические разделы ниже — иконка помощи каждой страницы ведёт прямо в свою группу, а не во весь этот список.
Отделы
Создать отдел — «Отделы» → Создать новый отдел → Название, выбери Руководителя → Создать отдел. См. гайд по полям ниже — что означает каждое поле.
Отредактировать отдел — открой отдел → меню ⋯ (справа вверху) → Редактировать отдел. Те же поля, что при создании — см. гайд по полям ниже.
Создать/отредактировать отдел — гайд по полям
- Название (обязательно) — отображаемое имя отдела, видно везде в приложении (списки, хлебные крошки, карточки). От 2 до 100 символов — если оставить пустым или ввести один символ, покажется «Минимум 2 символа», а не «Это поле обязательно» (срабатывает именно минимум в 2 символа, даже на пустом поле).
- Руководитель (обязательно) — найди и выбери сотрудника; он станет руководителем этого отдела, что даёт ему прямой доступ к собственной финансовой книге отдела и каталогу ролей (см. модель прав выше) — отдельное право назначать не нужно, само руководство и есть доступ.
- Описание (необязательно) — контекст о том, чем занимается отдел, показывается на его вкладке Overview. До 500 символов.
- Родительский отдел (необязательно) — оставь «Нет — отдел верхнего уровня», если это не суб-отдел. У суб-отдела не может быть своих суб-отделов — только один уровень вложенности, поэтому в этом списке предлагаются только отделы верхнего уровня.
Удалить отдел — открой отдел → ⋯ → Удалить. Заблокировано, пока у отдела есть активные суб-отделы — см. Суб-отделы.
Участники
Добавить кого-то в отдел — открой отдел → вкладка Члены → Добавить члена → выбери сотрудников → Добавить (N). См. гайд по полям ниже.
Назначить или сменить роль участника в отделе — отдел → вкладка Члены → смени роль прямо из строки (доступно руководителю или :manage). См. гайд по полям ниже.
Удалить кого-то из отдела — отдел → вкладка Члены → меню ⋯ строки → Удалить из отдела.
Вкладка «Члены» — гайд по полям
- Добавить члена — одно поле: найди и выбери одного или нескольких сотрудников. В списке показаны только те, кого ещё нет в этом отделе. Текстовой валидации нет — кнопка Добавить (N) просто неактивна, пока не выбран хотя бы один человек.
- Сменить роль — одно поле: список собственных ролей этого отдела (см. гайд по полям «Роли» ниже) или «Без роли». При выборе роли текст её функций автоматически показывается прямо под списком — отдельного поля заполнять для этого не нужно. Если у отдела ещё нет ролей, диалог ведёт на вкладку «Роли» вместо пустого списка.
Роли
Создать роль отдела — отдел → вкладка Роли → Новая роль → Название, при желании Функции → Создать роль. См. гайд по полям ниже.
Отредактировать или удалить роль отдела — отдел → вкладка Роли → меню ⋯ строки → Редактировать или Удалить. Роль, которая ещё используется, удалить нельзя — сначала переназначь её участникам.
Создать/отредактировать роль отдела — гайд по полям
Роль отдела — это метка вроде должности со свободным текстовым описанием — она не несёт никаких прав или доступа (для этого существуют роли организации и платформенные роли — совершенно другое понятие). Она нужна исключительно для того, чтобы упорядочить и описать, кто чем занимается внутри отдела.
- Название (обязательно) — отображаемое имя роли, например «Рекрутёр». От 1 до 100 символов. Кнопка отправки неактивна только пока поле пустое — превышение 100 символов не ловится до реальной отправки, где покажется «Максимум 100 символов».
- Функции (необязательно) — свободный текст о том, за что отвечает эта роль. Виден всем, у кого эта роль назначена, и автоматически показывается в превью, когда кто-то выбирает роль в списке ролей на вкладке «Члены». До 2000 символов.
Единственную автоматически созданную роль Руководитель переименовать нельзя (поле «Название» у неё отключено) — она всегда следует за тем, кто указан в Department.leaderId, а не назначается вручную.
Проекты (вкладка «Проекты» отдела)
Прикрепить проект к отделу — отдел → вкладка Проекты → Прикрепить проект → выбери → подтверди. См. также Проекты → Отделы для обратного направления (та же связь, но привязанная со стороны проекта).
Открепить проект от отдела — отдел → вкладка Проекты → меню ⋯ строки → Открепить от отдела.
Суб-отделы
Создать суб-отдел — отдел → вкладка Суб-отделы → Новый подотдел (та же форма, что и создание любого отдела, с уже заполненным родительским отделом).
Сотрудники
Добавление здесь — не действие staffing, а тот же самый процесс приглашения в штат платформы, что и в «Как сделать...» Администрирования платформы, просто со ссылкой отсюда для удобства.
Отправить кого-то в отпуск или вернуть из него — открой профиль → меню ⋯ → Отправить в отпуск / Вернуть из отпуска. Это только внутренний статус занятости, не блокировка аккаунта — см. Администрирование платформы → Пользователи.
Проекты
Создать проект — «Проекты» → Новый проект → заполни поля → Создать. См. гайд по полям ниже.
Отредактировать проект — либо из списка «Проекты» (меню ⋯ строки → Редактировать), либо изнутри самого проекта (иконка карандаша рядом с его названием). Те же поля, что при создании, плюс Статус и Прогресс — см. гайд по полям ниже.
Удалить проект — список «Проекты» → меню ⋯ строки → Удалить. Удаляет навсегда всё содержимое — отделы, этапы, задачи и участников.
Создать/отредактировать проект — гайд по полям
- Название (обязательно) — отображаемое имя проекта везде в приложении. От 1 до 100 символов.
- Описание (необязательно) — краткая сводка, показывается в списках и карточках проектов. До 1000 символов.
- Vision (необязательно) — более длинное поле с богатым форматированием (жирный текст, списки, ссылки) о том, зачем нужен проект и как выглядит «готово» — показывается на вкладке Overview проекта, там же и редактируется напрямую. До 2000 символов.
- Иконка (обязательно) — выбери одну из сетки; значения по умолчанию нет. Попытка отправить форму без выбора иконки покажет «Это поле обязательно» прямо под сеткой, и запрос вообще не уйдёт — легко пропустить, поскольку больше ничто в форме не привлекает к этому внимание.
- Статус (только при редактировании) — Planned / Active / Completed / Archived. Не предлагается при создании — каждый новый проект начинается со статуса Planned.
- Прогресс (только при редактировании) — число от 0 до 100, показывается как полоса прогресса проекта на вкладке Overview. Устанавливается вручную, не вычисляется из завершённости задач или этапов — ничто не пересчитывает его автоматически (у этапов есть своё, отдельное предупреждение о несоответствии — см. гайд по полям «Этапы» ниже).
- Владелец (необязательно) — найди и выбери сотрудника; если оставить пустым, по умолчанию им становишься ты сама. Чисто информационное поле (показывается на вкладке Overview) — само по себе не даёт никаких прав.
Отделы (вкладка «Отделы» проекта)
Прикрепить отдел к проекту — проект → вкладка Отделы → Прикрепить отдел → выбери отдел → Прикрепить отдел. См. также Отделы → Проекты для обратного направления.
Открепить отдел от проекта — проект → вкладка Отделы → меню ⋯ строки → Открепить отдел.
Участники
Прикрепить контрактора к проекту — проект → вкладка Участники → Прикрепить участника → выбери из кадрового резерва → подтверди. Все из привязанного отдела появляются здесь автоматически (через членство в отделе) — для них отдельный шаг не нужен. См. гайд по полям ниже.
Отредактировать или открепить участника — проект → вкладка Участники → меню ⋯ строки → Редактировать участника (его роль/обязанности в проекте) или Открепить участника.
Прикрепить/отредактировать участника — гайд по полям
Этот диалог прикрепляет только контракторов из кадрового резерва — сотрудник из привязанного отдела уже доступен как исполнитель задачи через своё членство в отделе, прикреплять здесь нечего (см. Участники выше).
- Человек (обязательно, только при прикреплении — не показывается при редактировании) — в списке появляются только записи кадрового резерва со статусом Approved; те, кто ещё на рассмотрении, не предлагаются. Если подходящих нет, список так и сообщает, а не показывается пустым.
- Роль (необязательно) — свободный текст, например «Frontend-разработчик» — собственная метка проекта для того, чем занимается человек, отдельная от любой роли отдела.
- Обязанности (необязательно) — свободный текст с описанием того, чем человек занимается на проекте. Ограничения по длине ни у одного из этих полей нет.
Этапы
Добавить этап — проект → вкладка Этапы → Добавить этап → название/описание/даты → создать.
Изменить порядок этапов проекта — проект → вкладка Этапы → перемести этап стрелками ↑/↓.
Отредактировать или удалить этап — проект → вкладка Этапы → меню ⋯ строки → Изменить стадию или Удалить этап. При удалении задачи этапа не удаляются, а открепляются.
Добавить/отредактировать этап — гайд по полям
- Название (обязательно) — от 1 до 100 символов.
- Описание (необязательно) — до 500 символов.
- Дата начала / Срок (оба необязательны) — можно выбрать любое из них или оба сразу. Два выбора даты следят друг за другом вживую: дата начала не даст выбрать что-либо позже уже установленного срока, и наоборот — некорректный диапазон предотвращается прямо в самом календаре, а не отлавливается постфактум сообщением об ошибке.
- Статус (только при редактировании) — Planned / In progress / Completed. Не предлагается при создании — каждый новый этап начинается со статуса Planned. Устанавливается вручную, не выводится из статусов его задач — список этапов отдельно помечает несоответствие («Отмечен как завершённый, но задачи ещё открыты» или «Все задачи выполнены, но этап не отмечен завершённым»), когда этот статус расходится со статусами задач, но никогда не исправляет ни одну из сторон автоматически.
- Владелец (необязательно) — сотрудник, чисто информационное поле, как и собственное поле «Владелец» у проекта.
Задачи (вкладка «Задачи» проекта)
Создание и управление задачами изнутри проекта — тот же процесс, что и в разделе Задачи ниже, просто заранее привязан к этому проекту.
Задачи
Создать задачу откуда угодно — «Задачи» (сквозная доска по всем проектам) → Новая задача → название → Выберите проект → Выберите сотрудника → Создать задачу. См. гайд по полям ниже.
Изменить статус/исполнителя и т.д. у задачи — открой задачу; каждое поле редактируется прямо на месте, кликом (как в Jira) — отдельного режима «редактирования» нет. См. гайд по полям ниже — там поля, доступные только этим способом, а не в диалоге создания.
Перенастроить список статусов задач — «Задачи» → иконка шестерёнки (только platform:staffing:configure) → Настройка колонок → добавляй/переименовывай/меняй порядок/деактивируй статусы. 5 системных статусов можно только деактивировать, не удалить. См. гайд по полям ниже.
Удалить задачу — открой задачу → меню ⋯ → Удалить.
Создать/отредактировать задачу — гайд по полям
Диалог Новая задача охватывает только поля ниже; Отдел, Цена, Подзадача от и смена Статуса при создании не предлагаются — они существуют только как редактируемые инлайн поля на странице задачи, уже после её создания (см. вступление к этому списку выше).
- Название (обязательно) — от 1 до 150 символов. В отличие от большинства других диалогов создания в этом модуле, сама кнопка Создать задачу остаётся неактивной, пока не заполнены Название, Проект и Исполнитель — сообщения о валидации после клика не будет, кнопка просто пока не реагирует.
- Проект (обязательно) — найди и выбери; от выбранного проекта зависят все остальные поля формы (Этап, Исполнитель, Помощники) и сбрасываются при его смене.
- Приоритет — Urgent / High / Medium / Low. По умолчанию Medium.
- Этап (необязательно) — появляется только после выбора проекта; предлагает собственные этапы этого проекта или «Пока нет этапов», если их нет.
- Описание (необязательно) — до 2000 символов.
- Исполнитель (обязательно) — человек в роли RESPONSIBLE у задачи. В списке показаны только подходящие для выбранного проекта: сотрудники из привязанных к проекту отделов, плюс контракторы из кадрового резерва, уже прикреплённые именно к этому проекту (не весь кадровый резерв) — см. гайд по полям «Участники».
- Срок (необязательно).
- Помощники (необязательно) — любое число дополнительных людей в поддерживающей роли HELPER, выбираются из того же списка подходящих людей, что и Исполнитель, за вычетом уже выбранного Исполнителя.
- Отдел (только при редактировании, инлайн на странице задачи) — должен быть одним из собственных привязанных отделов проекта задачи (см. Отделы выше) — проверяется на сервере, а не просто ограничение выпадающего списка.
- Цена (только при редактировании, инлайн) — обычное число, только для внутреннего учёта бюджета; само по себе не создаёт и не привязывает никакую реальную запись в книге учёта (сравни с Выплатами за задачи, которые как раз это делают).
- Подзадача от (только при редактировании, инлайн) — должна быть задачей верхнего уровня в том же проекте; у подзадачи не может быть своих подзадач (только один уровень вложенности, тот же лимит, что и у отделов и суб-отделов).
Настройка колонок — гайд по полям
Каждая строка здесь — статус, в котором может находиться задача, те же статусы становятся колонками канбан-доски на вкладке «Задачи» каждого проекта и на сквозной странице Задачи.
- Название — от 1 до 50 символов. У 5 посеянных системных строк (To Do, In Progress, In Review, Blocked, Done, каждая помечена System) это поле вообще не редактируется — их отображаемое имя переводится по языку, а не хранится как обычный текст, поэтому редактирование здесь молча ничего бы не изменило; поле для этих строк просто показывает название, это не инпут. Пользовательские строки — свободный текст на любом языке, применяется при потере фокуса/Enter, а не вживую при каждом нажатии клавиши. Превышение 50 символов не мешает печатать, но сохранение отклоняется — поле продолжает показывать введённый текст, пока его не сократят и не попробуют снова.
- Цвет — один из 6 образцов (Gray/Blue/Violet/Amber/Red/Green), чисто визуальный — не влияет на поведение, только на то, каким цветом статус отображается везде (колонка/бейдж).
- Категория — TODO / In progress / Done. Это не косметика: именно она определяет, как считается процент прогресса задачи. Каждый активный статус не-Done делится на равную долю диапазона 0–100 по порядку статусов (например, 3 таких статуса → доли 0–33/33–67/67–100); перевод задачи в любой статус категории Done сразу фиксирует прогресс на 100, независимо от позиции этого статуса в списке.
- Изменить порядок (стрелки ↑/↓) — меняет и порядок колонок канбан-доски, и доли прогресса по Категории выше, поскольку доли считаются именно в этом порядке.
- Переключатель «Активен» (только для системных строк) — восстанавливаемая альтернатива удалению системного статуса: выключение прячет его с доски и из всех списков выбора статуса, но сохраняет историю. Статус по умолчанию (тот, с которого начинаются новые задачи — сейчас To Do) выключить нельзя — сначала сделай статусом по умолчанию другой. Если на статусе ещё есть задачи, при выключении сначала спросят, куда их перенести.
- Удалить (иконка корзины, только для пользовательских строк — системные можно только деактивировать, никогда не удалить) — неактивна, если это последний оставшийся статус. Удаление статуса, на котором ещё есть задачи, требует сначала выбрать другой статус для их переноса — ничего никогда не остаётся молча брошенным.
- Название / цвет / категория нового статуса (нижняя строка) — добавляет новый пользовательский статус в конец списка; кнопка Добавить неактивна, пока не введено название.
Дашборд и Активность
Обе страницы только для чтения — настраивать нечего. Баннер «Мои выплаты» на дашборде и фильтры ленты активности разобраны в Финансах и соответствующих разделах модуля ниже.
Кадровый резерв
Провести заявку из кадрового резерва через рассмотрение — «Кадровый резерв» → меню ⋯ у строки → Взять в работу, затем Одобрить, затем Пригласить на платформу (отправляет приглашение в штат). Шаги не обязательно проходить по одному — свежую заявку со статусом Submitted можно сразу Одобрить, минуя Взять в работу.
Отредактировать классификацию заявки — открой заявку → меню ⋯ → Редактировать. См. гайд по полям ниже.
Добавить заметку о рассмотрении — открой заявку → Заметки о рассмотрении → впиши. Отдельно от собственных заметок кандидата и видно только сотрудникам. См. гайд по полям ниже.
Удалить заявку из кадрового резерва — меню ⋯ строки → Удалить. Возможно только для заявки без истории по проектам/задачам.
Общие документы
Загрузить общий документ — «Общие документы» → вкладка Документы → Загрузить документ.
Удалить или восстановить общий документ — меню ⋯ строки → Удалить (перемещает в Корзину, хранится 30 дней); из вкладки Корзина — Восстановить или Удалить навсегда.
Модель прав в одной таблице
Четыре права, один и тот же паттерн повторяется в каждом контроллере модуля:
| Право | Даёт |
|---|---|
platform:staffing:read | Просмотр всего — базовый гейт каждой страницы списка/деталей |
platform:staffing:manage | Создание/редактирование/удаление отделов, проектов, задач, записей кадрового резерва; управление любой задачей независимо от того, кто её создал |
platform:staffing:manage_own | На задаче, которую ты создала или на которую назначена (RESPONSIBLE/HELPER), только: смена статуса/прогресса/описания/срока/приоритета и комментирование — никогда не проверяется декоратором роута, всегда разрешается в TasksService.resolveTaskWriteAccess() для конкретной задачи |
platform:staffing:configure | Только реестр статусов задач (цвета/порядок/активация системных статусов) — общая, разделяемая настройка, намеренно отделена от повседневного :manage |
Несколько роутов намеренно не несут декоратор @RequirePlatformPermission вовсе — записи финансовой книги отдела и роуты управления ролями отдела используют вместо этого проверку «является ли этот актор руководителем отдела» на основе данных (DepartmentLeaderOrStaffingManageGuard или сырая проверка на уровне сервиса), потому что это право — по записи, а не то, что может выразить строка платформенного права (то же правило, что docs/iam/PERMISSIONS_CATALOG.md документирует для доступа по записи уровня организации).
Отделы (/team/departments)
Простыми словами: оргструктура компании. У отдела есть руководитель, участники, свои роли (должности внутри отдела, отдельные от платформенных ролей), привязанные проекты и — если руководитель ведёт её — собственная финансовая книга.
- Список/дерево + карточный вид (сохраняется локально). «Новый отдел» (
:manage) открывает тот же диалог формы, что и редактирование. - Вкладки карточки: Overview (статистика, суб-отделы, активные проекты, недавняя активность), Activity, Finances (см. Финансы → Собственная книга отдела), Members, Projects, Roles, Sub-departments — каждая разобрана в своём разделе ниже.
- Удаление отдела (
:manage) блокируется на сервере, пока у него есть активные суб-отделы.
Участники (вкладка Members отдела)
Добавление (только :manage — исключение для руководителя не распространяется на добавление людей), удаление (:manage), смена роли участника в отделе (руководитель или :manage, через DepartmentLeaderOrStaffingManageGuard — без строки права).
Роли (вкладка Roles отдела)
Собственный каталог DepartmentRole отдела (руководитель или :manage) — отдельно от платформенных ролей и от ролей организации в других частях вики; роль, которая используется, нельзя удалить.
Проекты (вкладка Projects отдела)
Привязка/отвязка проекта к этому отделу (:manage), с разбивкой задач/бюджета по отделу. Обратное направление — привязка отдела к проекту, и всё остальное со стороны проекта — разобрано в разделе Проекты ниже.
Суб-отделы (вкладка Sub-departments отдела)
Глубина ограничена одним уровнем — у суб-отдела не может быть своих суб-отделов. Поэтому же удаление отдела с активными суб-отделами заблокировано (см. выше) — сначала их нужно осознанно повысить или переназначить, а не потерять молча при удалении.
Сотрудники (/team/members)
Простыми словами: профиль каждого сотрудника P4P — но добавление здесь не действие staffing, а тот же самый процесс приглашения в штат платформы из Администрирования платформы, просто продублированный сюда для удобства.
- Список: поиск + фильтры по отделу/статусу. «Добавить сотрудника» закрыто и правом
:manage, и тем, кто реально может отправить приглашение (SUPER_ADMINилиP4P Owner— отражает реальный серверный гейт,SuperAdminOrOwnerGuard, на роуте приглашения), и открывает тот же диалог приглашения, что и/platform/staff. - Вкладки карточки: Overview (контакты, навыки/интересы, отделы), Activity (что этот человек сделал, а не что сделали с ним), Candidate application (показывается только если человек пришёл через кадровый резерв — снимок его исходной заявки только для чтения), Projects, Tasks.
- Действия меню «⋯» «Отправить в отпуск»/«Вернуть из отпуска» и «Убрать из штата» вызывают роуты модуля IAM/Users (
POST /admin/users/:id/leave,DELETE /admin/users/:id/platform-staff), а не staffing — эта страница просто удобная точка входа в действия, которые живут в Администрирование платформы → Пользователи.
Проекты (/team/projects)
Простыми словами: внутреннее управление проектами — отделы и люди, привязанные к проекту, дорожная карта этапов и доска задач, плюс (если видны финансы платформы) доля этого проекта в книге владельца.
- Список: переключатель grid/list, фильтры по статусу/отделу. «Новый проект» (
:manage). - Вкладки карточки: Overview (статистика прогресса, прогресс по этапам, недавние задачи, редактируемое инлайн rich-text поле «Vision»), Departments, Participants, Stages, Tasks, Activity и Finances (см. Финансы → Вкладка «Финансы» проекта) — каждая разобрана в своём разделе ниже.
- Отдел задачи должен быть одним из привязанных к проекту отделов — проверяется на сервере, не просто ограничение UI (см. Отделы → Проекты для обратного направления).
Отделы (вкладка Departments проекта)
Привязка/отвязка отдела к этому проекту (:manage) — обратное направление от Отделы → Проекты. Отдел задачи можно выбрать только из привязанных к проекту отделов.
Участники (вкладка Participants проекта)
Два вида: Contractors — реальные назначения, выбранные из кадрового резерва, не из справочника сотрудников; и read-only Departments — состав всех участников всех привязанных отделов (через членство в отделе, а не прямое назначение на проект).
Этапы (вкладка Stages проекта)
Упорядоченная дорожная карта, перестановка через ↑/↓ (:manage). Каждой задаче можно назначить этап; прогресс по этапам на вкладке Overview считается от этого.
Задачи (вкладка Tasks проекта)
Список или канбан-доска, 5 режимов группировки — только в рамках этого проекта. Сквозной аналог по всем проектам сразу — раздел Задачи ниже.
Задачи (/team/tasks)
Простыми словами: сквозная доска задач — все задачи по всем проектам в одном месте, в отличие от вкладки Tasks внутри конкретного проекта.
- Переключатель список/канбан, 5 режимов группировки канбана (статус/ответственный/приоритет/проект/этап). Drag-and-drop закрыт
:manage(перетаскивание карточки между колонками «ответственный» вызывает тот же роут добавления исполнителя, что и форма задачи). - Настройка статусов задач — отдельной страницы нет, но есть настоящий диалог настроек (иконка шестерёнки, только
platform:staffing:configure), покрывающий весь реестр статусов: создание/редактирование/переупорядочивание/удаление. 5 посеянных системных статусов нельзя удалить окончательно, только деактивировать. - Карточка задачи — каждое поле редактируется инлайн, в стиле Jira. Статус/этап/отдел/ответственный/помощники/цена требуют
:manage; описание/приоритет/срок/прогресс открыты для:manageили:manage_ownна своей задаче (создатель, или назначена как RESPONSIBLE/HELPER — включая через связанную запись кадрового резерва, не только через прямое назначение сотруднику). Комментарии следуют тому же разделению:manage/:manage_own. Удаление задачи — только:manage. - Исправлено, 2026-08-04: прикрепление файла к комментарию или описанию раньше требовало блокового
:manageбез какого-либо исключения:manage_ownвообще — пользователь с:manage_ownмог написать и отправить комментарий, но кнопка прикрепления всегда отвечала 403, хотя в UI выглядела доступной. Эндпоинт загрузки (POST /admin/staffing/attachments) общий (используется также для Project Vision) и по умолчанию не знает, к какой сущности относится файл; фикс протягивает необязательныйtaskIdчерез вызов загрузки, чтобы сервер мог применить ту же проверкуmanage_own+ создатель/назначенный, что уже использует остальная часть задачи, вместо требования блокового:manageвсегда, когда задача на самом деле идентифицируема.
Кадровый резерв (/team/hr-pool)
Простыми словами: воронка для людей, которые хотят работать с P4P, но не являются сотрудниками (пока или вообще) — публичная форма заявки наполняет очередь на рассмотрение; одобрение позволяет пригласить человека на проект как подрядчика, необязательно делая его сотрудником платформы.
- Публичная заявка (
/hr-pool/apply, без входа, вообще без гейтаplatform:staffing:*— Turnstile + рейт-лимит) — лендинг в маркетинговом стиле с формой (имя/email/телефон/мессенджер/тип/области интересов/навыки/заметки). СоздаётHRPoolEntryбез привязанногоUser. - Очередь на рассмотрение (
/team/hr-pool, только для сотрудников) — плитки статистики по статусам, фильтруемая таблица. «⋯» по строке: переход по статусам рассмотрения (новая → на рассмотрении → одобрена/деактивирована,:manage), «Пригласить» (только когдаAPPROVEDи ещё не привязана к пользователю,:manage— отправляет приглашение в штат платформы), удаление (только если у записи нет истории назначений). - Карточка записи — те же действия, плюс Редактировать (тип заявителя, области интересов, навыки — поля классификации,
:manage) и внутренний журнал заметок рассмотрения (:manageдля добавления заметки; отдельно от собственных заметок заявителя). - Подтверждённый пробел (2026-08-04): два готовых на бэкенде пути сегодня недостижимы из интерфейса —
- Публичные роуты принятия
HrPoolInvitationsController(GET/POST /hr-pool-invitations/:token[/accept]) не имеют соответствующей страницы подapps/portal/pages/hr-pool-invitations/— в отличие от структурно идентичных/invitations/[token]и/platform-staff-invitations/[token], которые существуют. Публичный allowlist роутов портала уже предвидит этот путь (middleware/auth.global.ts), но сама страница так и не была построена — у приглашения, отправленного из очереди кадрового резерва, сейчас нет реального места для перехода. - Самостоятельный опт-ин «указать меня как доступный ресурс» (
POST hr-pool/opt-in, открыт любому вошедшему пользователю платформы, не только сотрудникам) не имеет триггера в интерфейсе нигде в портале — сегодня существуют только публичная форма заявки и внутренняя очередь на рассмотрение.
- Публичные роуты принятия
Отредактировать заявку / добавить заметку о рассмотрении — гайд по полям
Диалог Редактировать охватывает только то, как классифицирован этот заявитель — его имя, email, телефон и предпочитаемый мессенджер были заданы один раз самим заявителем и здесь вообще не меняются (в форме их нет). В отличие от большинства других диалогов редактирования в этом модуле, Сохранить активна не только после изменения — она включается сразу, как только заполнены Тип заявителя и хотя бы одна Область интересов, так что клик по ней без реальных изменений просто пересохранит те же значения.
- Тип заявителя (обязательно) — Individual / Agency / Company / Service provider.
- Области интересов (обязательно, множественный выбор) — Consulting / Marketing / Development / Design / QA / AI / Events / Other. Нужна хотя бы одна; выбор Other открывает поле свободного текста под ней, но — несмотря на то, что оно стоит прямо под обязательным полем, — само остаётся необязательным, до 200 символов.
- Навыки (необязательно) — свободный текст, до 500 символов.
- Заметки о рассмотрении (отдельная панель под собственной информацией заявки, не часть диалога «Редактировать») — растущий журнал, а не одно поле: каждая заметка — простое текстовое поле от 1 до 4000 символов, отправляется собственной кнопкой Отправить (неактивна, пока пусто) и навсегда добавляется вместе с твоим именем и временем — заметки нельзя редактировать или удалить после отправки. Видны только сотрудникам с доступом к этой странице, никогда заявителю.
Дашборд и активность
/team/dashboard — реальные данные повсюду: приветствие, баннер «Мои выплаты» (показывается только когда есть ожидающие ответа предложения выплат — см. будущий документ модуля Finance для полного описания процесса выплат), шесть единообразных карточек разделов, отражающих боковое меню (Tasks/Projects/Team/Departments/HR Pool/Activity), недавняя активность и ссылки быстрых действий.
/team/activity — неотфильтрованная сквозная лента (все виды событий по задачам/проектам/отделам/записям кадрового резерва/сотрудникам), с фильтрами по актору/проекту/отделу/периоду. Обновляется в реальном времени.
Общие документы (/team/shared-documents)
Простыми словами: общая библиотека файлов для сотрудников P4P — под капотом вообще не функция staffing.
Использует общую платформенную возможность файлового хранилища (org:files:read/org:files:manage) для одной фиксированной, синтетической организации (system-org-shared-documents), а не что-то специфичное для staffing. Сама страница всё ещё закрыта platform:staffing:read (так что доступ имеют только сотрудники P4P), но действия загрузки/удаления/восстановления под ней управляются org:files:*, проверяемым по членству в этой синтетической организации. Вкладки «Активные»/«Корзина», хранение 30 дней при мягком удалении.
Тестирование этого модуля
scripts/e2e/menu/staffing.mjs (12 проверок) прогоняет основные сценарии этого модуля от начала до конца и проставляет lastVerified выше. По ходу найдены и исправлены: ошибка 403 для manage_own при прикреплении файла (описана в разделе «Задачи» выше) и отсутствующая организация system-org-shared-documents (пересоздана и перенесена в packages/database/prisma/seed.ts, чтобы переживать будущие сбросы БД) — без неё любая загрузка вложения к задаче/проекту или файла в Общие документы падала с обманчивой ошибкой «превышена квота». Не покрыто автоматизацией, стоит проверить руками — см. docs/MANUAL_TESTING.md: доступ руководителя отдела (и только его) к вкладкам «Финансы»/«Роли» своего отдела, реальная публичная форма заявки в кадровый резерв (закрыта Turnstile, поэтому автотест создаёт заявку напрямую в БД, а не через форму), диалог настройки статусов задач, drag-and-drop на канбан-доске и закрытие read/manage/manage_own правами изменяющих элементов на каждой странице.