Техническое задание на систему ресурсного планирования
Версия 1.7 • 9 октября 2026 года
Назначение документа — зафиксировать функции разработанного веб-прототипа для подачи заявок на проектные ресурсы, согласования назначений, просмотра загрузки и управленческой отчётности. Документ предназначен для заказчика, аналитиков, разработчиков и тестировщиков.
1 Обозначения в формулах
В формулах используются латинские буквы. Значение относится к выбранному месяцу и области отчёта. В расчёте одного назначения берутся часы этого назначения; в итогах сотрудника или группы часы суммируются. Ставки указаны в рублях за час, а доход и расходы — в рублях.
| Обозначение | Что означает и единица измерения | Пример |
|---|---|---|
| FTE | Загрузка, FTE — доля полной загрузки сотрудника. Плановая загрузка и фактическая загрузка — разные показатели с одинаковой единицей FTE. Не количество людей. | 1 FTE — полная загрузка; 0,5 FTE — половина нормы. |
| H | Норма часов одного сотрудника: число будней × 8 часов. Часы (ч). Праздники и отпуска должны быть учтены. Данные можно брать из API 1С. | 22 будних дня × 8 = 176 ч. |
| P | Плановые часы согласованных назначений. Часы (ч). При постоянной загрузке: FTE × H; при изменениях — сумма дневных FTE × 8. | 0,5 × 176 = 88 ч. |
| R | Доходная ставка: сколько планируется получить за час работы ресурса. ₽/час. | R = 4 000 ₽/час. |
| C | Расходная ставка: сколько стоит час работы специалиста. ₽/час. | C = 4 300 ₽/час. |
| I | Плановый доход: P × R. Рубли (₽). Расчёт по плану, не подтверждённая выручка. | 88 × 4 000 = 352 000 ₽. |
| Δ | Превышение расходной ставки: max(C − R; 0). ₽/час. Буква «дельта». | max(4 300 − 4 000; 0) = 300 ₽/час. |
| Rср | Средняя доходная ставка, взвешенная по плановым часам назначений. ₽/час. | Σ(P × R) / ΣP. |
| Cср | Средняя расходная ставка, взвешенная по плановым часам назначений. ₽/час. | Σ(P × C) / ΣP. |
Обозначения норм факта и математических операций
| Обозначение | Что означает и единица измерения | Пример |
|---|---|---|
| A | Фактические часы работ, отдельно от отпусков. Часы (ч). Рассчитываются из введённой фактической загрузки, FTE × H каждого месяца. | Фактическая загрузка, FTE 0,5 × 176 = 88 ч. |
| N | Норма часов группы: число сотрудников × H. Часы (ч). Для одного сотрудника N = H. | 3 сотрудника × 176 = 528 ч. |
| V | Часы отпуска выбранных сотрудников за период. Часы (ч). Не прибавляются к часам работ. | У одного сотрудника отпуск 16 ч: V = 16 ч. |
| Nбез | Норма часов группы без отпусков: N − V. Часы (ч). «Без» — без отпусков. | 176 − 16 = 160 ч. |
| N1, N2 | Норма часов группы в первом и втором рассматриваемых месяцах. Часы (ч). Цифры — номера месяцев примера. | N1 = 160 ч; N2 = 176 ч; сумма = 336 ч. |
| Σ или «сумма» | Сложить значения всех выбранных строк, дней или месяцев. Σ читается «сигма». | ΣP при 40 и 48 ч = 88 ч. |
| max(x; 0) | Взять большее из x и нуля. Здесь x — результат вычитания, а не отдельный показатель. | max(−300; 0) = 0; max(300; 0) = 300. |
| ×, /, −, >, = | Умножение, деление, вычитание, больше, равно. Скобки задают порядок расчёта. | C > R означает: расходная ставка выше доходной. |
| × 100% | Перевести долю в процент. Утилизация — часы работ / соответствующая норма × 100%. | 88 / 176 × 100% = 50%. |
Пример одного сотрудника: норма часов одного сотрудника H = норма часов группы N = 176 ч; плановые часы P = фактические часы A = 88 ч; часы отпуска V = 16 ч; норма часов группы без отпусков Nбез = 160 ч. Плановая утилизация по норме и фактическая утилизация по норме — 50%. Плановая утилизация без отпусков и фактическая утилизация без отпусков — 55%. Совпадение плана и факта в примере условное: показатели вводятся и рассчитываются отдельно.
Пример средневзвешенной ставки: 40 ч по 4 000 ₽/час и 48 ч по 5 000 ₽/час. Rср = (40 × 4 000 + 48 × 5 000) / (40 + 48) = 4 545,45 ₽/час. Простое среднее двух ставок здесь не используется.
В накопительных показателях сначала складываются часы и нормы каждого месяца, затем рассчитывается процент. При неизвестных исходных данных или нулевой норме в таблицах утилизации по типам проектов выводится прочерк. Подробные правила отсутствующих данных приведены в разделах 25 и 31.
Единые названия показателей
Эти названия используются в требованиях, формулах и описаниях таблиц. План и факт всегда обозначаются отдельно. Для месячного, недельного и накопительного расчёта к названию добавляется период. Область расчёта — назначение, сотрудник, проект или группа — уточняется в строке или заголовке.
| Единое название | Единица и расчёт | Смысл |
|---|---|---|
| Плановая загрузка / фактическая загрузка | FTE; P / H либо введённый факт | Доля полной загрузки. Для группы значения сотрудников складываются. |
| Плановый расход | ₽; P × C | Стоимость плановых часов. |
| Разница ставок | ₽/час; R − C | Отрицательное значение означает превышение расходной ставки. |
| Разница средних ставок | ₽/час; Rср − Cср | Разница ставок сотрудника, взвешенных по плановым часам. |
| Разница плановых сумм | ₽; плановый доход − плановый расход | Денежный результат согласованного плана. |
| Превышение планового расхода за период | ₽; Δ × сумма P | Положительная сумма превышения расходов над доходом в строке. |
| Плановая утилизация по норме | %; (P / H) × 100% или (P / N) × 100% | Доля плановых часов в норме сотрудника или группы. |
| Фактическая утилизация по норме | %; (A / H) × 100% или (A / N) × 100% | Доля фактических часов в норме сотрудника или группы. |
| Плановая утилизация без отпусков | %; P / Nбез × 100% | Плановые часы относительно нормы часов группы без отпусков. |
| Фактическая утилизация без отпусков | %; A / Nбез × 100% | Фактические часы относительно нормы часов группы без отпусков. |
| Свободные часы | ч; max(H − P; 0) | Остаток нормы сотрудника; для группы — сумма остатков. |
| Свободный ресурс | FTE; число сотрудников − сумма плановой загрузки | Объём свободной загрузки, не количество людей. |
| Доля отпуска | %; V / N × 100% | Доля часов отпуска в норме часов группы. |
В сохранённых макетах показаны подписи текущего интерфейса. Их соответствие словарю: «План» — плановые часы или плановая загрузка в выбранных единицах; «Факт» / «Списано» — фактические часы или фактическая загрузка; «Норма» — норма часов одного сотрудника либо группы; «Без отпусков» — норма часов группы без отпусков; «Доход» / «Расход» — плановый доход / плановый расход; «Аллокация» — плановая утилизация на проекте. При дальнейшей доработке интерфейса применяется полный словарь этого раздела.
Базовая версия: https://resource-planning-center.jammyglade1.chatgpt.site.
Версия 1.7 включает единый словарь показателей и обозначений в разделе 1. Описание отчётности, ручного факта и сведений сотрудников — в разделах 21–29; нормы часов, плановые часы и фактические часы по типам проектов — в разделах 30–32. Макеты отчётов помещены в разделы 22–26 и 30; их названия показателей соответствуют словарю раздела 1.
2 Назначение и границы
Руководитель проекта запрашивает специалистов на проект. Ресурсный менеджер выбирает конкретных сотрудников и согласовывает их загрузку. Утверждённые назначения автоматически учитываются в общем ресурсном плане.
| В текущем прототипе | В отдельной доработке |
|---|---|
| Заявки, выбор роли или сотрудника, помесячные FTE | Получение справочников из Bitrix24 |
| Единая доходная ставка и расходная ставка специалиста | Получение справочников из Bitrix24 |
| Согласование, возврат и отклонение | Авторизация и серверные права по ролям |
| Ресурсный план и отчёты; ручные фактические FTE | Интеграция фактических часов и производственный календарь |
| Изменение и завершение назначений с согласованием | Идентификация авторов и полный журнал решений |
3 Участники
| Роль | Основные действия |
|---|---|
| Руководитель проекта | Создать заявку; посмотреть свои заявки и согласованную загрузку по своим проектам. Запросить вывод человека, уменьшение FTE или замену по своим назначениям. |
| Ресурсный менеджер | Посмотреть общий план; назначить сотрудников; отследить недогруженных сотрудников. Согласовать, вернуть или отклонить изменение назначения. |
В прототипе роль и руководитель выбираются вручную. Это демонстрационные режимы интерфейса, а не разграничение доступа. Привязка проектов и пользователей к аккаунтам должна быть реализована до рабочего использования.
4 Создание заявки на ресурсы
FR 01. Пользователь открывает форму кнопкой «Новая заявка». Одна заявка относится к одному проекту и может содержать несколько строк ресурсов. Одна строка описывает одну требуемую роль и, при необходимости, одного желаемого сотрудника.
| Поле | Правило заполнения |
|---|---|
| Проект | Обязательное значение из справочника проектов. |
| Руководитель проекта | Обязательное имя до 100 символов. В режиме РП подставляется выбранный руководитель и недоступно для ручного изменения. |
| Первый месяц | Месяц начала планирования в формате YYYY-MM. |
| Количество месяцев | В форме от 1 до 12. По выбранному периоду создаются строки помесячного планирования. |
| Роль ресурса | Бизнес-аналитик, системный аналитик, архитектор, Backend-разработчик, Frontend-разработчик или тестировщик. |
| Желаемый сотрудник | Необязателен. Вариант «На подбор» означает, что сотрудник ещё не определён. Выбираются только сотрудники соответствующей роли. |
| Доходная ставка | Обязательная положительная ставка продажи в ₽/час. Одна ставка на строку ресурса на весь период. |
| Расходная ставка | Подставляется из данных выбранного специалиста. Вручную в заявке не редактируется. |
| Плановая загрузка, FTE | На каждый месяц от 0 до 1. Хотя бы в одном месяце строки значение должно быть больше нуля. |
| Комментарий | Необязательный текст до 1000 символов. |
FR 02. Пользователь может добавлять и удалять строки ресурсов, но не может отправить заявку без ресурсов. Сервер принимает от 1 до 50 строк; для каждой строки допускает от 1 до 24 уникальных месяцев. Форма создания ограничивает период 12 месяцами.
FR 03. При смене роли желаемый сотрудник и его расходная ставка сбрасываются. При смене периода сохраняются значения совпадающих месяцев; для новых месяцев FTE задаётся равным нулю.
FR 04. Отправка сохраняет заявку со статусом «На согласовании». Потребность без назначенного сотрудника не включается в согласованный план и не резервирует загрузку до решения ресурсного менеджера.
Макет создания заявки
Заявка с едиными ставками ресурса и помесячными FTE.

Доходная и расходная ставки показаны рядом в карточке и в каждой строке месячной таблицы. Расходная ставка выше доходной выделена цветом и текстом. Ставки в месячной таблице не редактируются. Связанные требования: FR 01–FR 04, FR 12 и FR 13.
Примечание к макету: расположение элементов может адаптироваться к ширине экрана. На узком экране таблица прокручивается горизонтально.
5 Согласование и статусы
FR 05. Ресурсный менеджер открывает заявку со статусом «На согласовании». По каждой строке он назначает сотрудника соответствующей роли, проверяет загрузку после назначения, доходную и расходную ставки. Он может скорректировать FTE и доходную ставку. Состав ролей при согласовании не меняется.
| Текущий статус | Действие | Результат |
|---|---|---|
| Нет заявки | Отправить на согласование | На согласовании |
| На согласовании | Согласовать | Согласована |
| На согласовании | На доработку | На доработке |
| На согласовании | Отклонить | Отклонена |
| На доработке | Создать исправленную заявку | Новая заявка со статусом На согласовании; исходная остаётся без изменений |
Проверки согласования
FR 06. Сотрудник должен быть назначен на каждую строку. Нельзя согласовать строку со значением «На подбор».
FR 07. Загрузка проверяется по каждому рабочему дню всех согласованных назначений и рассматриваемой заявки. При отсутствии дневного распределения FTE месяца применяется ко всем рабочим дням месяца. Согласование блокируется, если суммарная загрузка хотя бы одного дня превышает 1 FTE. Допуск сравнения — 0,00001. Проверка по дням позволяет учесть вывод или замену в середине месяца без скрытой перегрузки.
FR 08. Если расходная ставка хотя бы одной строки выше доходной, согласование требует явного подтверждения превышения расходов. При изменении сотрудника, FTE или ставки подтверждение сбрасывается.
FR 09. Возврат на доработку и отклонение требуют непустую причину в комментарии. Эти действия не включают ресурсы в план.
FR 10. Согласованная, отклонённая или возвращённая заявка не может быть повторно рассмотрена как ожидающая решения. Карточка доступна для просмотра.
Сохранение решения
При первичном согласовании сохраняются назначенные сотрудники, FTE, единые доходные ставки, расходные ставки из справочника и lossAccepted. Исходные запрошенные значения первичной заявки заменяются согласованными. Для последующих изменений назначений сохраняются отдельная заявка и история до и после изменения, описанные в разделе 13. Автор решения пока обозначается общим значением «Ресурсный менеджер»; учётная запись не фиксируется.
FR 11. После сохранения решения ресурсный план и статусы на странице обновляются. При ошибке форма остаётся открытой, введённые значения сохраняются и выводится причина отказа.
Макет согласования заявки
Назначение специалиста с проверкой загрузки и превышения расходов.

В помесячной таблице дополнительно показан итоговый FTE после назначения. Если расходы превышают доход, кнопка согласования доступна только после подтверждения. Связанные требования: FR 06–FR 09 и AC 05–AC 10.
Примечание к макету: расположение элементов может адаптироваться к ширине экрана. На узком экране таблица прокручивается горизонтально.
Макет списка заявок
Список заявок с руководителем, периодом, доходом и статусом.

Фильтр статуса используется для выбора заявок. Кнопка открытия ведёт в карточку; в текущем интерфейсе менеджера у ожидающей заявки действие называется «Рассмотреть». Связанные требования: FR 05 и FR 10.
Примечание к макету: расположение элементов может адаптироваться к ширине экрана. На узком экране таблица прокручивается горизонтально.
6 Ставки и финансовые расчёты
FR 12. Доходная и расходная ставки располагаются рядом в строке ресурса. В помесячной таблице показываются колонки: месяц, плановая загрузка, FTE, доходная ставка ₽/час, расходная ставка ₽/час, плановые часы, плановый доход. При рассмотрении заявки дополнительно показывается загрузка после назначения.
Ставки в месячных строках повторяют единые значения ресурса и отдельно по месяцам не редактируются. Если сотрудник не выбран, расходная ставка отсутствует: отображается «Специалист не выбран» или «Не назначен». Отсутствие ставки не считается нулевой себестоимостью для принятия решения.
Обозначения и единые названия показателей приведены в разделе 1. P — плановые часы, H — норма часов одного сотрудника, R — доходная ставка, C — расходная ставка.
| Показатель | Формула |
|---|---|
| Норма часов одного сотрудника H | Число дней с понедельника по пятницу × 8 часов. Праздники и сокращённые дни пока не учитываются. |
| Плановые часы P | FTE месяца × H месяца. |
| Плановый доход I | P × единая доходная ставка R. |
| Превышение расходной ставки Δ | max(Расходная ставка C − R, 0). |
| Превышение планового расхода за период | Δ × сумма плановых часов строки за весь период. |
| Плановый доход заявки | Сумма доходов по всем месяцам и строкам ресурсов. |
| Плановая утилизация по норме | Плановая загрузка, FTE × 100%. |
| Средняя доходная ставка старой строки | Сумма старых помесячных доходов / сумма плановых часов. |
Подсветка превышения расходов
FR 13. При C > R блок ставок и ячейка расходной ставки в каждом месяце подсвечиваются красным. Кроме цвета выводятся текст «Выше доходной», превышение расходной ставки Δ в ₽/час и превышение планового расхода за период в ₽. При C = R предупреждение не выводится. Отрицательная ставка и нулевая доходная ставка не допускаются.
Пример: плановая загрузка = 0,5 FTE; норма часов одного сотрудника H = 176 ч; доходная ставка R = 4 000 ₽/час; расходная ставка C = 4 300 ₽/час. Плановые часы P — 88 ч; плановый доход I — 352 000 ₽; плановый расход — 378 400 ₽. Превышение расходной ставки Δ — 300 ₽/час; превышение планового расхода за месяц — 26 400 ₽.
Совместимость и округление
Старые заявки с разными доходными ставками по месяцам отображаются с единой ставкой, усреднённой по плановым часам. Это сохраняет общий доход за период; прежнее распределение дохода по месяцам может измениться. В карточке есть уведомление об усреднении.
Текущие денежные значения в таблицах округляются до целых рублей, часы в форме — до двух знаков, часы в ресурсном плане — до целых. Расчёты выполняются с исходными числовыми значениями. Для рабочей версии необходимо согласовать точность денежных расчётов и правила округления.
7 Ресурсный план и режим руководителя проекта
FR 14. План представляет собой таблицу с группировкой по сотрудникам. Сотрудник раскрывается до своих проектов. В строках сотрудника и проекта отображаются «План» и «Факт». Колонки: сотрудник или проект, показатель, сумма плановых часов за видимый период и шесть последовательных месяцев.
FR 15. В план входят только согласованные назначения с учётом одобренных изменений. Заявка на изменение не учитывается как дополнительное назначение. Пользователь выбирает первый месяц, единицы отображения — FTE, часы или проценты, ищет сотрудника либо проект и раскрывает или сворачивает строки. FTE сотрудника за месяц — сумма его согласованных назначений в выбранной области просмотра.
Ресурсный менеджер
Область просмотра — все заявки и сотрудники демонстрационного пула. Доступны показатели: число сотрудников, загрузка в первом месяце таблицы, число ожидающих решения заявок и свободный ресурс в первом месяце. Нулевые назначения сотрудников остаются видимыми.
Руководитель проекта
FR 16. После выбора режима РП открывается ресурсный план. Можно выбрать руководителя и один из его проектов либо все свои проекты. Отображаются только заявки выбранного руководителя, а в плане — сотрудники с согласованными назначениями в выбранных заявках. Наличие одного общего проекта у разных РП не объединяет их назначения в режиме РП.
Сводные показатели РП: число назначенных сотрудников, согласованная загрузка в первом месяце, число его заявок на согласовании, число проектов с заявками. Потребности без согласованных назначений видны в заявках, но не добавляют людей в таблицу плана.
В режиме РП не показывается загрузка этих людей по чужим руководителям. Это не означает, что сотрудник полностью свободен вне проектов РП. Проверка общей доступности выполняется ресурсным менеджером при согласовании.
Фильтр свободных ресурсов
FR 17. Нажатие на показатель «Свободный ресурс» в режиме ресурсного менеджера открывает таблицу плана, очищает поиск и оставляет сотрудников с общей согласованной загрузкой меньше 1 FTE в первом месяце таблицы. Включаются полностью свободные и частично занятые сотрудники.
Показатель равен числу сотрудников пула минус их суммарный FTE за первый месяц; это объём свободного FTE, а не число людей. Подсветка карточки и подпись над таблицей показывают активный фильтр, месяц и число видимых сотрудников. Повторное нажатие или «Сбросить фильтр» возвращает полный список. При смене месяца фильтр пересчитывается.
FR 18. Пока фактические часы не подключены, во всех строках «Факт» основного ресурсного плана выводится прочерк. Ручной ввод фактических FTE реализован отдельно для отчёта по некоммерческим проектам (раздел 25) и не заполняет строки «Факт» основного плана. Отсутствие факта не подменяется нулём.
Макет ресурсного плана менеджера
Макеты показывают основные экраны планирования. Новая вкладка «Назначения» и кнопка изменения показаны в разделе 18. Это схемы экранов, а не снимки действующих заявок; значения приведены для пояснения поведения.
Сводные показатели и помесячная загрузка всех сотрудников с раскрытием по проектам.

Карточка «Свободный ресурс» включает фильтр сотрудников с загрузкой меньше 1 FTE. Таблица переключается между FTE, часами и процентами. Связанные требования: FR 14, FR 15, FR 17 и FR 18.
Примечание к макету: расположение элементов может адаптироваться к ширине экрана. На узком экране таблица прокручивается горизонтально.
Макет загрузки проектов руководителя
Просмотр ресурсов выбранного руководителя проекта.

Выбор РП и проекта ограничивает состав заявок и согласованных назначений. В раскрытых строках видны только назначения выбранного РП. Связанные требования: FR 16 и AC 14–AC 15.
Примечание к макету: расположение элементов может адаптироваться к ширине экрана. На узком экране таблица прокручивается горизонтально.
13 Изменение и завершение назначений
Раздел описывает функции опубликованной версии решения от 8 октября 2026 года. Изменение согласованного назначения проходит отдельное согласование. До принятия решения действует прежний ресурсный план.
Доступ к назначениям
FR 20. Вверху страницы доступна кнопка «Изменить назначения», открывающая вкладку «Назначения». В режиме РП список ограничивается выбранным руководителем и проектом. Ресурсный менеджер видит общий список. Дополнительный вход — «Изменить назначение» в раскрытой строке проекта под сотрудником.
FR 21. Список содержит сотрудника и роль, проект и руководителя, период, состояние изменения и действия «Изменить» и «Вывести из проекта». При ожидающем изменении кнопки недоступны; состояние «На согласовании» открывает его карточку. Для завершённого участия выводится «Участие завершено». Назначение остаётся в списке для просмотра истории.
Типы изменения
| Тип | Поведение с выбранной даты |
|---|---|
| Вывести из проекта | FTE исходного сотрудника становится нулевым во всех оставшихся рабочих днях планового периода. |
| Уменьшение загрузки | Указывается одно новое значение FTE. Для каждого оставшегося рабочего дня применяется минимум текущего и нового FTE: ранее меньшая или нулевая загрузка не увеличивается. |
| Замена сотрудника | С выбранной даты исходный сотрудник освобождается, а другому специалисту той же роли задаётся указанный FTE на оставшиеся месяцы исходного периода. |
FR 22. Изменение создаётся для одной строки действующей согласованной заявки. Новые месяцы и новые роли этим сценарием не добавляются. Замена возможна при наличии другого сотрудника требуемой роли в справочнике; отсутствие кандидата нельзя обходить выбором специалиста иной роли.
Обязательные сведения
FR 23. Пользователь задаёт тип изменения, дату и причину до 1000 символов. Дата — корректный календарный день не ранее текущей даты по Москве. Участие по старым условиям заканчивается до выбранной даты; новый режим применяется начиная с неё. После даты должен существовать хотя бы один рабочий день с ненулевой текущей загрузкой.
Для уменьшения или замены требуется FTE больше 0 и не больше 1. При уменьшении хотя бы в одном оставшемся дне нагрузка должна снизиться. Для полного освобождения выбирается вывод. Для замены обязателен другой сотрудник той же роли.
Макет списка назначений
Схема экрана опубликованного прототипа. Значения приведены для пояснения сценария и не являются реальными данными сотрудников.

Кнопка вверху и вкладка «Назначения» дают прямой доступ к изменению. Список ограничивается выбранным РП и проектом. Кнопки заблокированы при ожидающем изменении или завершённом участии.
Макет запроса изменения
Схема экрана опубликованного прототипа. Значения приведены для пояснения сценария и не являются реальными данными сотрудников.

Вывод сотрудника с 16 ноября. Текущий и новый FTE показываются рядом. Ноябрьский FTE усредняется по рабочим дням; прошлые дни сохраняются. Для уменьшения и замены форма дополнительно показывает новый FTE, а для замены — специалиста.
14 Пересчёт и согласование изменения
Предварительный расчёт
FR 24. Форма показывает текущий и новый плановая загрузка, FTE по месяцам, новые часы исходного сотрудника и, при замене, FTE нового специалиста. Рабочие дни до выбранной даты сохраняют прежнюю загрузку. Если ранее уже было согласованное изменение, используются сохранённые дневные значения, а не месячное среднее.
Плановые часы P за месяц = сумма дневных FTE × 8. Плановая загрузка, FTE = P / H, где H — норма часов одного сотрудника за месяц. Рабочие дни — понедельник–пятница, без праздников и сокращённых дней. Нулевые месяцы не удаляются. Факт остаётся неподключённым и отображается прочерками.
Пример: в ноябре 2026 года 21 рабочий день, норма 168 часов. При FTE 0,5 и выводе с 16 ноября сохраняются 10 рабочих дней: 40 часов; плановая загрузка месяца, FTE = 40 / 168 = 0,238095. Декабрьская загрузка становится нулевой, октябрьская не меняется.
Жизненный цикл
FR 25. Отправка создаёт отдельную заявку kind = change со статусом «На согласовании». В списке заявок выводятся тип изменения и дата. Текущая загрузка, свободный ресурс и исходное назначение при отправке не меняются. Дублирующая ожидающая заявка на ту же строку блокируется сервером.
FR 26. Ресурсный менеджер открывает изменение во вкладке «Заявки» либо по статусу в списке назначений. Он проверяет новый план и принимает решение: «Согласовать изменение», «На доработку» или «Отклонить». Возврат и отклонение требуют комментарий. Целевые дата, FTE, сотрудник и причина в карточке решения не редактируются.
FR 27. После согласования система заменяет строку исходной заявки новым планом; при замене добавляет строку нового специалиста. Отдельная согласованная заявка на изменение не суммируется повторно в ресурсном плане. План, сводная загрузка и фильтр свободного ресурса пересчитываются.
FR 28. После возврата пользователь нажимает «Исправить и отправить» и создаёт новую заявку на изменение исходного назначения. Прежняя возвращённая заявка сохраняется. Отклонение и возврат не меняют назначение.
Проверки решения и ставок
FR 29. Перед согласованием сервер сравнивает текущее назначение со снимком на момент запроса. Если назначение изменилось, решение блокируется и требуется новая заявка. Общая revision дополнительно защищает от одновременной записи.
FR 30. Для итогового плана проверяется загрузка каждого рабочего дня по всем проектам. Для замены доходная ставка наследуется от исходной строки, расходная — из справочника нового специалиста. При превышении показываются красное предупреждение и превышение расходной ставки Δ в ₽/час; согласование требует allowLoss = true. При отсутствии кандидата решение невозможно.
Макет согласования изменения
Схема экрана опубликованного прототипа. Значения приведены для пояснения сценария и не являются реальными данными сотрудников.

Менеджер проверяет причину, дату и новый план, затем согласует, возвращает или отклоняет изменение. При дорогой замене дополнительно показываются обе ставки, красное предупреждение и подтверждение превышения расходов.
15 История и данные изменения назначения
История согласованных изменений
FR 31. В исходной согласованной заявке сохраняется history: время решения at, общий автор actor = «Ресурсный менеджер», причина reason и снимки строки before и after. История показывается в карточке исходной заявки. Отдельная заявка на изменение хранит дату, тип, целевой план и данные замены; исходная заявка и прошлые рабочие дни не удаляются.
В текущем прототипе актор не связан с учётной записью. Возврат и отклонение отражаются статусом и комментарием отдельной заявки; отдельный временной журнал всех решений пока не реализован.
| Объект или поле | Содержание |
|---|---|
| RequestItem.kind | Необязательное значение change отличает изменение от первичной заявки. |
| AssignmentChange | targetId, lineIndex, effectiveDate, reason, mode, fte, employee, before, after; replacement — необязательная строка нового специалиста. |
| Month.days | Необязательная карта YYYY-MM-DD → FTE по рабочим дням. Для старых данных используется единый FTE месяца. |
| RequestItem.history | Массив согласованных изменений: at, actor, reason, before, after. |
| mode | release — вывод; reduce — уменьшение; replace — замена. |
| Хранение | Дополнительные поля сохраняются в существующем JSON payload таблицы planning_state; отдельная таблица изменений не создаётся. |
Пример запроса изменения
POST /api/planning: { "action": "change", "revision": 7, "targetId": "demo-1", "lineIndex": 0, "effectiveDate": "2026-11-16", "mode": "release", "reason": "Аналитические работы завершены" }. lineIndex — индекс строки с нуля. Для reduce добавляется fte; для replace — fte и employee.
Сервер формирует before, after и replacement самостоятельно. Клиент не может подменить сохранённый план полем lines. Согласование изменения: action = approve, id изменения, revision, comment и allowLoss при необходимости. Статусы и коды ответа совпадают с разделом 9.
Границы текущей реализации
Роли и выбор РП остаются демонстрационными; рабочие серверные права не добавлены. В снижении задаётся одно ограничение FTE на весь оставшийся период. Для иных помесячных потребностей создаётся новая первичная заявка. Календарь, интеграции фактических часов и идентификация автора требуют отдельной доработки. Ручные фактические FTE поддерживаются в отчёте по некоммерческим проектам (раздел 25).
16 Отчётность: общие правила
Новые отчёты дополняют ресурсный план и назначения. Они рассчитываются по текущему состоянию приложения; отдельные неизменяемые снимки отчётных периодов не сохраняются.
| Место в интерфейсе | Содержание |
|---|---|
| «Отчёты» → «Утилизация» | Недельная динамика, показатель за месяц, сравнение сотрудников, таблица загрузки, нормы, план и факт по типам проектов. |
| «Отчёты» → «Финансы по сотрудникам» | Ставки, разница ставок и плановые денежные суммы с детализацией по назначениям. |
| «Отчёты» → «Распределение сотрудников» | Сотрудники, проекты, плановая утилизация на проекте и дата освобождения. |
| «Некоммерческие проекты» | Две таблицы на одной вкладке: плановая загрузка, FTE сверху и фактическая загрузка, FTE снизу. |
| «Статистика» | Сводные таблицы численности с раскрытием групп до сотрудников. |
Область просмотра и исходные данные
FR 32. Ресурсный менеджер видит весь пул сотрудников. РП видит данные в области выбранного руководителя и проекта. Режимы являются фильтрами интерфейса; серверные права пока не реализованы.
FR 33. Плановые часы, FTE и деньги включают только approved-заявки, не являющиеся kind = change. Ожидающие, возвращённые и отклонённые заявки не влияют на расчёт. Одобренные изменения учитываются через обновлённые исходные назначения.
FR 34. Дневной план имеет приоритет: FTE рабочего дня = days[дата], если значение присутствует, иначе FTE месяца. Нулевое дневное значение сохраняется и не заменяется месячным FTE.
FR 35. При отсутствии справочных сведений выводятся «Не указано» либо прочерк. Неизвестный факт и ставка не считаются нулём. Числовые итоги вычисляются без предварительного округления.
Норма часов одного сотрудника H = число рабочих дней с понедельника по пятницу × 8 часов; праздники и сокращённые дни не учитываются. Отчётность отражает текущий план, а не автоматически полученный учёт рабочего времени.
17 Отчёт по утилизации сотрудников
FR 36. Отчёт показывает плановую долю занятости, а не фактическую утилизацию. Фильтры: месяц, роль, проект и поиск сотрудника по имени. Поиск применяется без учёта регистра. Фильтры действуют на все графики, показатели и таблицу.
| Элемент | Показатели и поведение |
|---|---|
| Сводные показатели | Плановые часы; норма часов группы; свободные часы; число сотрудников. |
| Недельная динамика | Линейный график 12 недель. Последняя неделя начинается в понедельник недели, содержащей последний день выбранного месяца. Учитываются будни до конца месяца; последняя неделя может быть неполной. |
| Плановая утилизация по норме за месяц | Кольцевой показатель: плановые часы P / норма часов группы N × 100%. Значение процента выводится числом. |
| Сравнение сотрудников | Горизонтальный график доли плановых часов от индивидуальной нормы месяца. |
| Таблица | Сотрудник и роль; проекты с ненулевой загрузкой; норма часов одного сотрудника, ч; плановые часы, ч; плановая утилизация по норме, %; свободные часы, ч; плановая загрузка, FTE. |
Формулы
FR 37. Плановые часы сотрудника за месяц P = сумма по всем рабочим дням и назначениям (8 × дневной FTE). Плановая загрузка, FTE = P / H. Плановая утилизация по норме = P / H × 100%. Свободные часы сотрудника = max(0; H − P). Свободные часы выборки — сумма свободных часов сотрудников.
Плановая утилизация по норме группы = сумма P / N × 100%, где N — норма часов группы. Недельная плановая утилизация по норме = плановые часы группы за неделю / (число сотрудников × число учтённых будней недели × 8) × 100%. При пустой выборке процент равен 0, таблица показывает отсутствие сотрудников.
Особенности области РП и выгрузка
В режиме менеджера знаменатель включает выбранных сотрудников пула, даже если нет назначений. Фильтр проекта показывает долю их загрузки именно на этом проекте. В режиме РП включены люди с согласованными назначениями в его области; «Незанято в выбранном плане» не означает общую доступность на других проектах.
FR 38. CSV содержит строки текущей месячной таблицы, учитывает фильтры и включает плановые часы, плановую утилизацию по норме и плановую загрузку, FTE. UTF-8 с BOM; разделитель — точка с запятой; десятичное представление — русская локаль. Недельный график в CSV не включается.
Макет отчёта по утилизации сотрудников

Графики плановой утилизации и таблица сотрудников. Условный пример: 528 плановых часов при норме часов группы 1 056 ч; плановая утилизация по норме — 50%. Требования FR 36–FR 38.
18 Финансы по сотрудникам
FR 39. Отчёт доступен в разделе «Отчёты». Использует фильтры месяца, роли, проекта и имени. Сверху — плановый доход, плановый расход, разница плановых сумм и число назначений с отрицательной разницей ставок. Все денежные суммы плановые.
| Строка / колонка | Содержание |
|---|---|
| Строка сотрудника | Имя и роль; плановые часы; средняя доходная ставка; средняя расходная ставка; разница средних ставок; плановый доход; плановый расход; разница плановых сумм. |
| Строки назначений | Под сотрудником показываются назначения с ненулевыми плановыми часами за месяц: проект, плановые часы, доходная ставка, расходная ставка, разница ставок, плановый доход, плановый расход и разница плановых сумм. Несколько назначений одного проекта остаются отдельными строками. |
| Доходная ставка R | Единая ставка строки назначения, ₽/час. Для старых строк применяется единая ставка, рассчитанная действующим механизмом совместимости. |
| Расходная ставка C | Снимок costRate согласованного назначения; если снимок отсутствует — текущая ставка справочника. При отсутствии значения — прочерк. |
| Разница ставок | R − C, ₽/час. Отрицательное значение означает превышение расходной ставки над доходной. |
Расчёт и предупреждения
FR 40. Для назначения: плановый доход I = P × R; плановый расход = P × C; разница плановых сумм = P × (R − C). Для сотрудника суммы складываются. Средняя доходная ставка Rср = сумма(P × R) / сумма P; средняя расходная ставка Cср = сумма(P × C) / сумма P. Разница средних ставок = Rср − Cср. Обе средние ставки взвешиваются по плановым часам месяца.
FR 41. При C > R строка назначения выделяется красным и содержит текст «Расходная ставка выше доходной». Отрицательная строка остаётся заметной, даже если средний результат сотрудника положительный. Сводный счётчик считает такие назначения, а не сотрудников.
Для сотрудника без плановых часов плановый доход, плановый расход и разница плановых сумм равны 0; средние ставки и разница средних ставок показаны прочерком. Если хотя бы у одного учитываемого назначения расходная ставка неизвестна, плановый расход и разница плановых сумм сотрудника не рассчитываются; общий плановый расход выборки также неизвестен. Денежные значения отображаются с округлением до целого рубля.
Область просмотра и CSV
РП видит только свои назначения; показатели не отражают доходность сотрудника на всех проектах компании. CSV содержит отдельную строку на каждое учитываемое назначение: сотрудник, проект, плановые часы, доходная ставка, расходная ставка, разница ставок, плановый доход, плановый расход и разница плановых сумм. Без назначений строки для сотрудника в этой выгрузке нет.
Макет финансового отчёта по сотрудникам

Ставки и плановые суммы с детализацией по назначениям. В строке сотрудника приведены средняя доходная ставка, средняя расходная ставка и разница средних ставок; в строке проекта — ставки назначения. Превышение расходов выделено красным. Требования FR 39–FR 41.
19 Распределение сотрудников по проектам
FR 42. Отчёт «Распределение сотрудников» находится в разделе «Отчёты». Фильтры: месяц, роль, проект и имя. Таблица повторяет формат распределения: одна строка сотрудника и последовательные блоки проектов.
| Колонки | Правило |
|---|---|
| ФИО; ЦФО; должность | ФИО — из справочника; должность в этом отчёте соответствует роли. ЦФО пока отображается прочерком. |
| Состояние; подразделение | Состояние рассчитывается по загрузке месяца. Подразделение в данном отчёте пока показано прочерком; заполненные подразделения используются во вкладках «Некоммерческие проекты» и «Статистика». |
| Блок проекта № | Название проекта; плановая утилизация на проекте, %; дата освобождения. Число блоков — максимум проектов в выборке, но не менее двух. |
| Несколько назначений | Назначения одного сотрудника на один проект объединяются: часы суммируются, дата берётся по последней ненулевой плановой загрузке. |
| Проекты в таблице | Только проекты с ненулевой плановой загрузкой выбранного месяца. Если таких проектов нет, ячейки блоков — прочерки. |
Плановая утилизация на проекте состояние и дата
FR 43. Плановая утилизация на проекте = плановые часы сотрудника на проекте за месяц / H × 100%. Состояние: 0% — «Свободен в плане»; больше 0 и меньше 100% — «Частичная загрузка»; около 100% — «Полная загрузка»; больше 100% — «Перегрузка». Для сравнения используется допуск 0,001 процентного пункта.
FR 44. Дата освобождения — следующий календарный день после последнего рабочего дня с ненулевым FTE во всём согласованном плане проекта, включая будущие месяцы. Это дата завершения по текущему плану, а не первая доступность в возможном промежутке между этапами.
Пример: план заканчивается в пятницу 27 ноября; дата освобождения — суббота 28 ноября. При согласованном выводе с 16 ноября и последнем ненулевом рабочем дне 13 ноября дата — 14 ноября. После согласования изменения дата пересчитывается.
FR 45. CSV воспроизводит строковую структуру таблицы: ФИО, ЦФО, должность, состояние, подразделение и повторяющиеся блоки проектов. Даты выгружаются как YYYY-MM-DD. В режиме РП состояние и даты отражают только его выбранную область проектов.
Макет распределения сотрудников по проектам

Одна строка сотрудника и два блока проектов: плановая утилизация на проекте и дата освобождения. ЦФО и подразделение в этом отчёте остаются прочерками. Требования FR 42–FR 45.
20 Некоммерческие проекты: план и факт FTE
FR 46. На одной вкладке «Некоммерческие проекты» расположены две таблицы: сверху плановая загрузка, ниже фактическая. В расчёт включены только проекты с сохранённым типом noncommercial. Проекты без типа не считаются некоммерческими.
| Элемент | Поведение |
|---|---|
| Фильтры | Первый месяц, период 3 / 6 / 12 месяцев, подразделение и имя сотрудника. Оба отчёта используют общие фильтры. |
| Колонки | Подразделение / сотрудник и последовательные месяцы периода. Значения — FTE, до двух десятичных знаков. |
| Группировка | Строка подразделения содержит число сотрудников и итог месяца. Подразделение раскрывается до сотрудников. Раскрытие синхронно в двух таблицах; есть «Развернуть все» / «Свернуть все». |
| Незаданные подразделения | Сотрудники объединены в «Подразделение не указано». Они не исключаются из отчёта. |
| Итог | FTE подразделения и общий итог — сумма FTE сотрудников. Значения не усредняются. |
Плановые и фактические значения
FR 47. Плановая загрузка сотрудника, FTE = согласованные часы на некоммерческих проектах / H. Учитываются дневные изменения назначений. При наличии выбранных некоммерческих проектов отсутствие плана даёт 0 FTE; если типы некоммерческих проектов не заданы вообще, выводятся прочерки и сообщение о настройке.
FR 48. Фактическая загрузка, FTE = сумма отдельно внесённых значений по сотруднику, проекту и месяцу. Пустое значение означает неизвестный факт; 0 означает подтверждённое отсутствие работ. Для итога сотрудника требуется факт по каждому некоммерческому проекту выбранной области, включая нули для проектов без работ.
FR 49. Если у любого сотрудника группы факт неполный, итог подразделения и общий итог выводятся как «Нет полного факта». Известные значения остаются доступны в детализации; частичная сумма не выдаётся за полный итог.
Ресурсный менеджер видит весь пул; РП — сотрудников, связанных с заявками его выбранной области, и только свои некоммерческие проекты. Показатели РП не являются общей загрузкой этих сотрудников. Выгрузка CSV для данной вкладки в текущей версии не реализована.
Макет плановой и фактической загрузки некоммерческих проектов

Плановая загрузка, FTE и фактическая загрузка, FTE показаны на одной вкладке. Подразделения раскрыты до сотрудников. Для будущих месяцев факт не заполнен: итог — «Нет полного факта». Требования FR 46–FR 49.
21 Статистика численности сотрудников
FR 50. Вкладка «Статистика» показывает сводные таблицы численности и раскрытие до сотрудников. Численность измеряется количеством уникальных сотрудников; FTE и суммы ставок не используются как количество людей.
| Сводная таблица | Группировка |
|---|---|
| По должностям | Поле position; если оно не заполнено — текущая роль сотрудника. |
| По подразделениям и состоянию | Комбинация подразделения и employmentStatus, например подразделение и «Декрет». Состояние кадровое, а не процент плановой загрузки. |
| По основным навыкам | Один основной skill сотрудника. Он не определяется автоматически из должности. |
| По категориям ставок | Название rateCategory. Это текстовая категория, а не размер расходной ставки в рублях. |
| Дата выхода — по месяцам | startDate группируется по месяцу и году начала работы сотрудника. |
| По проектам и ЦФО | Проект раскрывается до ЦФО, затем до сотрудников. Есть группа без назначений в выбранном месяце. |
Фильтры и состав выборки
FR 51. Общие фильтры: месяц распределения по проектам, ЦФО, подразделение, состояние сотрудника и имя. Сводные показатели: сотрудников в выборке, с назначениями месяца, число заполненных подразделений и число сотрудников без основного навыка. Незаданные значения образуют группу «Не указано».
FR 52. Распределение по проектам включает согласованные назначения с хотя бы одним ненулевым рабочим днём выбранного месяца. В режиме менеджера участвует весь пул; в режиме РП — только люди с такими назначениями на его проекты в месяце.
Сотрудник с несколькими проектами учитывается в каждом проекте, но общий итог «Всего уникальных сотрудников» исключает повторы. В остальных сводных таблицах сотрудник входит ровно в одну группу и общий итог равен размеру отфильтрованной выборки.
FR 53. Данные по должностям, навыкам и подразделениям отражают текущие сведения. Выбранный месяц не восстанавливает кадровый состав прошлой даты. История численности, автоматический учёт увольнений и исторические изменения подразделений пока не реализованы. CSV для этой вкладки пока отсутствует.
Макет статистики по должностям и подразделениям

Численность по должностям и подразделениям с кадровым состоянием. Раскрытие группы показывает сотрудников; итог считает людей, а не FTE. Требования FR 50–FR 53.
Макет статистики по навыкам и категориям ставок

Каждый основной навык и категория ставки образуют отдельную группу. Это текущие сведения сотрудников; выбранный месяц не восстанавливает исторический кадровый состав. Требования FR 50–FR 53.
Макет статистики по дате выхода проектам и ЦФО

Дата выхода группируется по месяцам. Детализация проекта проходит через ЦФО до сотрудников. Сотрудник на двух проектах входит в оба проекта, а в общем итоге учитывается один раз. Требования FR 50–FR 53.
22 Настройка данных отчётности и сохранение
FR 54. Вкладка «Некоммерческие проекты» содержит кнопку «Настроить данные / ввести факт». Менеджер задаёт тип каждого проекта, подразделение сотрудника и фактическую загрузку, FTE выбранного проекта и месяца. Пустое поле факта удаляет соответствующее значение; ноль сохраняется как явный факт. Закрытие без сохранения не меняет данные.
FR 55. Во вкладке «Статистика» кнопка «Данные сотрудников» позволяет заполнить подразделение, должность, ЦФО, основной навык, категорию ставки, состояние и дату выхода. Подразделения общие с некоммерческой отчётностью. В режиме РП кнопки изменения этих сведений не показываются; серверная защита по ролям остаётся отдельным требованием рабочего контура.
| Поле reportData | Структура и ограничения |
|---|---|
| projectTypes | Словарь: название известного проекта → commercial / noncommercial. Неуказанный тип хранится отсутствующим ключом. |
| departments | Словарь: ID известного сотрудника → название подразделения, до 150 символов; пробелы по краям удаляются. |
| actuals | Массив: employee, project, month YYYY-MM, fte. FTE от 0 до 2 включительно; максимум 10 000 записей. Сочетание сотрудник + проект + месяц уникально. |
| employeeStats | Словарь по ID сотрудника; position, cfo, skill, rateCategory, employmentStatus, startDate — необязательные строки до 200 символов. |
| startDate | Пустая строка допустима; заполненная дата проверяется на формат YYYY-MM-DD и существование календарного дня. Интерфейс допускает даты начиная с 2000 года. |
Контракт и совместимость
FR 56. GET /api/planning возвращает requests, revision и необязательный reportData. POST с action = report-data передаёт revision и полный объект reportData. Сервер проверяет известные ID, типы проектов, диапазоны, даты и повторы; успешный ответ содержит обновлённый State. Эта запись не меняет назначения, ставки и решения заявок.
Сохранение изменяет reportData целиком; клиент передаёт сохранённые значения всех его полей, включая не редактируемые в текущей форме. Проверка revision исключает перезапись более новой версии. При конфликте — HTTP 409; при неверных данных — HTTP 400. Старый формат без reportData остаётся читаемым.
Браузерное действие start_resource_request открывает форму новой заявки, но не отправляет её. Работа отчётов и основной сценарий не требуют поддержки этого действия браузером.
FR 57. Интеграция фактических часов не реализована. Ручные FTE и часы используются в некоммерческой отчётности и таблицах утилизации по типам проектов. Основной ресурсный план и прежние графики утилизации не получают фактические часы автоматически.
23 Приёмочные сценарии новых отчётов
| ID | Сценарий и ожидаемый результат |
|---|---|
| AC 41 | Согласовать плановую загрузку 0,5 FTE на месяц с нормой часов одного сотрудника 176 ч. Плановая утилизация по норме — 50%; плановые часы — 88 ч; свободные часы — 88 ч; плановая загрузка — 0,5 FTE. |
| AC 42 | Подать изменение вывода в середине месяца. До согласования отчёт прежний; после согласования месячные часы и недельная динамика учитывают нулевые дни после даты вывода. |
| AC 43 | Отфильтровать роль, проект и имя. Графики, сводные показатели, таблица и CSV утилизации относятся к одной выборке. При отсутствии людей выводится пустая таблица и 0%. |
| AC 44 | У сотрудника назначения: 80 плановых часов с R = 4 000 и C = 4 300 ₽/час; 40 плановых часов с R = 6 000 и C = 4 300 ₽/час. Средняя доходная ставка Rср — 4 666,67 ₽/час; средняя расходная ставка Cср — 4 300 ₽/час; разница средних ставок — 366,67 ₽/час. Плановый доход — 560 000 ₽; плановый расход — 516 000 ₽. Первое назначение выделено красным; счётчик — 1. |
| AC 45 | У назначения неизвестна расходная ставка. Плановый расход и разница плановых сумм не заменяются нулём. У сотрудника без плановых часов средние ставки и разница средних ставок показаны прочерками; плановые денежные суммы равны 0. |
| AC 46 | У сотрудника две строки одного проекта. В распределении они объединены в один блок; плановая утилизация на проекте суммируется. Проекты с нулевой загрузкой месяца не выводятся. |
| AC 47 | Последний ненулевой рабочий день проекта — 27.11.2026. Дата освобождения — 28.11.2026. После согласованного изменения она пересчитывается по обновлённому плану. |
| AC 48 | Экспортировать финансы и распределение. Файлы соответствуют фильтрам; финансы — по назначениям, распределение — одна строка сотрудника с блоками проектов. Русские имена читаются корректно. |
Проверки выполняются на демонстрационных данных. Значения ставок в таблице проверяют формулы; денежные колонки интерфейса округляются до целого рубля.
24 Приёмка некоммерческой отчётности и статистики
| ID | Сценарий и ожидаемый результат |
|---|---|
| AC 49 | Некоммерческий тип не задан. В обеих FTE-таблицах прочерки и сообщение о необходимости настройки. После задания noncommercial участвуют только такие проекты. |
| AC 50 | В одном подразделении два сотрудника с планом 0,25 и 0,5 FTE. Строка подразделения и общий итог — 0,75 FTE. Раскрытие показывает оба значения в плановой таблице и синхронно раскрывает подразделение в фактической. |
| AC 51 | Внести по одному некоммерческому проекту 0,2 и 0 FTE для двух сотрудников. Факт подразделения — 0,2. Пустое значение второго сотрудника меняет итог на «Нет полного факта», а не 0,2. |
| AC 52 | Выбраны два некоммерческих проекта. Факт есть только по одному. Итог сотрудника неизвестен до внесения второго значения, включая 0 при отсутствии работ. |
| AC 53 | Сохранить отрицательный FTE, значение больше 2, повтор одной записи или несуществующую дату выхода. Сервер возвращает ошибку; существующие данные не перезаписываются. |
| AC 54 | Заполнить подразделения, основные навыки, категории ставок и ЦФО; обновить страницу. Данные сохранены, сводные группы перестроены. Изменение сведений сотрудников не удаляет введённый факт и типы проектов. |
| AC 55 | Назначить сотрудника на два проекта месяца. В разбивке проектов он учтён дважды, но в общем итоге уникальных сотрудников — один раз. Раскрытие проекта → ЦФО → сотрудник работает. |
| AC 56 | Не заполнить должность и навык. В должностях используется текущая роль; в навыках — «Не указано». Показатель без основного навыка увеличивается на одного. |
| AC 57 | Переключить режим РП и выбрать проект. Все новые отчёты ограничены его областью. Кнопки изменения справочных сведений скрыты; видимая незанятость не трактуется как общая доступность. |
| AC 58 | Две формы сохраняются с одной revision. Только первая запись проходит; вторая не перезаписывает данные и требует обновления состояния. |
25 Утилизация по типам проектов: норма, план и факт
FR 58. В разделе «Отчёты» → «Утилизация», ниже графиков и таблицы сотрудников, расположены две новые таблицы: «Плановая утилизация по типам проектов» и «Фактическая утилизация по типам проектов». Они используют общие фильтры месяца, роли, проекта и имени сотрудника.
| Элемент | Содержание |
|---|---|
| Строки | Подразделение; строки типов проектов; итог подразделения; общий итог по выбранным сотрудникам. В фактической таблице дополнительно — «Отпуск (отдельно от работ)». |
| Типы проектов | Для внутреннего клиента; Коммерческий; НИОКР; Служебные. Для неуточнённого noncommercial — «Некоммерческий (без уточнения)»; для проекта без типа — «Тип не указан». |
| Периоды | Два блока: накопительно с января по выбранный месяц включительно и отдельно выбранный месяц. Состав сотрудников одинаков в обоих блоках. |
| Колонки каждого блока | Норма часов группы, ч; норма часов группы без отпусков, ч; плановые часы, ч / фактические часы, ч; плановая / фактическая утилизация по норме, %; плановая / фактическая утилизация без отпусков, %. В каждой таблице используется соответствующее полное название показателя. |
| Область просмотра | Менеджер — выбранные сотрудники пула и доступные проекты; РП — выбранные люди и проекты его области. Загрузка чужих руководителей не включается. |
Тип проекта и подразделение
FR 59. Подробный тип projectCategories задаётся для проекта отдельно. Он имеет приоритет при построении этой таблицы. Если уточнение отсутствует, применяется общий projectTypes: commercial → «Коммерческий», noncommercial → «Некоммерческий (без уточнения)». Проекты без обоих значений не теряются и попадают в «Тип не указан».
Общий признак commercial / noncommercial и подробная категория утилизации независимы. Изменение подробной категории не меняет автоматически состав некоммерческой отчётности; согласованность классификации обеспечивается при заполнении данных.
Подразделение берётся из общего departments. Без значения сотрудник входит в «Подразделение не указано». Итоги подразделений суммируют часы работ по всем типам; отпуск в эти итоги не включается. Числовые значения отображаются до одного десятичного знака; промежуточные расчёты не округляются.
Макет плановой утилизации по типам проектов

Месячный и накопительный блоки плановой утилизации. Показан пример одного подразделения: 3 сотрудника, норма часов группы за октябрь — 528 ч. Норма одинакова для всех типов проектов и не суммируется по их строкам. Требования FR 58–FR 60.
Макет фактической утилизации по типам проектов

Фактические часы, утилизация по норме и без отпусков; отпуск показан отдельно. Накопительно с января по октябрь норма часов группы — 5 208 ч. Примеры условные и служат пояснению формул. Требования FR 58–FR 64.
26 Формулы, фактические часы и отпуска
FR 60. Норма часов группы за месяц N = число выбранных сотрудников × норма часов одного сотрудника H. Накопительная норма часов группы = число сотрудников × сумма H с января по выбранный месяц включительно. История кадрового состава и индивидуальные графики работы в этой норме не учитываются.
| Показатель | Правило расчёта |
|---|---|
| Плановые часы P | Сумма 8 × дневной FTE согласованных назначений выбранных людей и проектов соответствующего типа. days имеет приоритет перед FTE месяца; ожидающие изменения исключены. |
| Фактические часы A | Сумма actuals.fte × H соответствующего месяца по сотрудникам и проектам типа. Факт вводится вручную; нормы разных месяцев применяются отдельно. |
| Часы отпуска V | Сумма сохранённых vacations.hours по сотрудникам и месяцам. Отпуск задаётся один раз на сотрудника и месяц, независимо от проекта. |
| Норма часов группы без отпусков | Nбез = N − V. Одна и та же норма часов группы показана для всех типов проектов. Нормы строк типов не суммируются. |
| Плановая и фактическая утилизация | Плановая утилизация по норме = P / N × 100%; плановая утилизация без отпусков = P / Nбез × 100%. Фактическая утилизация по норме = A / N × 100%; фактическая утилизация без отпусков = A / Nбез × 100%. Накопительно используются суммы часов и норм, а не среднее месячных процентов. |
| Строка отпуска | Норма часов группы N; норма часов группы без отпусков Nбез; часы отпуска V; доля отпуска V / N × 100%; в последней колонке — прочерк. Часы отпуска не включаются в работы. |
Полнота данных и ручной ввод
FR 61. Для полного факта нужны записи по каждому выбранному сотруднику, каждому проекту соответствующего типа и каждому месяцу периода, включая явный 0 при отсутствии работ. Если запись отсутствует, часы и проценты соответствующего факта показываются прочерком. При отсутствии проектов типа часы работ равны 0.
FR 62. Если часы отпуска отсутствуют хотя бы для одного выбранного сотрудника и месяца, норма часов группы без отпусков и процент по ней неизвестны. Пустое поле не приравнивается к нулевому отпуску. При нулевом знаменателе процент не рассчитывается. Норма часов группы остаётся видимой.
FR 63. Кнопка «Типы проектов, факт и отпуска» открывает ввод категорий, месяца, проекта для факта и часов сотрудников. Факт часов сохраняется как actuals.fte = часы / H; это те же записи, что в некоммерческой отчётности. Отпуск сохраняется отдельно. Пустое поле удаляет запись; 0 сохраняет подтверждённое отсутствие работ или отпуска.
27 Данные и приёмка таблиц утилизации
FR 64. reportData дополнен projectCategories: словарь название известного проекта → одна из четырёх категорий; и vacations: массив employee, month YYYY-MM, hours. Значения отпуска — от 0 до нормы месяца, без повторов employee + month; максимум 10 000 записей. Фактические часы проекта допускаются от 0 до двух норм месяца, что соответствует пределу 2 FTE.
Сохранение использует action = report-data и контроль revision. Сохраняются остальные поля reportData, введённый ранее факт, сведения сотрудников и типы проектов. В режиме РП кнопка редактирования скрыта; серверное разграничение ролей остаётся требованием рабочего контура. Отдельная выгрузка этих таблиц пока не реализована: CSV утилизации по-прежнему содержит месячную таблицу сотрудников.
| ID | Сценарий и ожидаемый результат |
|---|---|
| AC 59 | При норме часов группы N = 176 ч, часах отпуска V = 16 ч и фактической загрузке 0,5 FTE: фактические часы A = 88 ч; норма часов группы без отпусков Nбез = 160 ч; фактическая утилизация по норме — 50%; фактическая утилизация без отпусков — 55%. |
| AC 60 | Два месяца: норма часов группы N1 = 160 и N2 = 176 ч; фактические часы — 80 и 132 ч. Накопительная фактическая утилизация по норме = 212 / 336 × 100% = 63,1%, а не среднее 50% и 75%. |
| AC 61 | Удалить отпуск одного сотрудника за месяц. Норма часов группы без отпусков и процент по ней — прочерки; норма часов группы и известные часы работ сохранены. Ввести 0: знаменатель становится известным. |
| AC 62 | Факт одного проекта месяца отсутствует. Строка его типа и общий факт неизвестны; другие типы с полными записями показывают значения. Накопительный факт не становится полным при заполнении только выбранного месяца. |
| AC 63 | Сохранить 88 фактических часов в месяце с H = 176. В actuals хранится 0,5 FTE; некоммерческий отчёт использует ту же запись для проекта соответствующего общего типа. |
| AC 64 | Проект без уточнения: commercial группируется в «Коммерческий»; noncommercial — в «Некоммерческий (без уточнения)»; без общего типа — в «Тип не указан». Уточнить НИОКР: строка меняет группу без изменения часов. |
| AC 65 | Строка отпуска показывает часы отпуска и долю отпуска; часы отпуска не прибавляются к фактическим часам. При V = 176 ч и N = 176 ч норма часов группы без отпусков равна 0; фактическая утилизация без отпусков — прочерк. |
| AC 66 | Попытаться сохранить отрицательный отпуск, отпуск больше нормы или повтор employee + month. Сервер отклоняет запись. Обновление категорий не удаляет прочие сведения отчётности. |
28 Данные и хранение
| Объект | Атрибуты текущей реализации |
|---|---|
| Сотрудник | id, name, role, initials, color, costRate. Источник — встроенный демонстрационный справочник. |
| Проект | Название из встроенного списка. Отдельный ID проекта и связь с Bitrix24 пока отсутствуют. |
| Заявка RequestItem | id, project, manager, status, created, comment, lines, необязательный lossAccepted. Необязательные kind = change, change и history описаны в разделе 13. |
| Строка Line | role, employee, rate, costRate, months. rate — единая доходная ставка; costRate — расходная ставка назначенного специалиста. |
| Месяц Month | month в формате YYYY-MM, fte. Поле rate допускается только для чтения старых данных. Необязательное days — FTE по рабочим датам после изменения назначения. |
| Состояние State | requests — заявки; revision — версия записи; необязательный reportData — сведения и факт для отчётности (раздел 27). |
Хранилище
Заявки и дополнительные данные отчётности сохраняются в Cloudflare D1. Таблица planning_state содержит id, JSON-поле payload и целочисленную revision; используется одна запись main. Новый payload содержит requests и reportData. Прежний payload-массив заявок читается без потери данных; при следующей записи сохраняется новый формат. Основные сотрудники и проекты остаются в коде приложения, а типы проектов, подразделения, фактические FTE и дополнительные сведения сотрудников доступны для ручного заполнения.
FR 19. Перед записью проверяется revision. Сохранение выполняется условным обновлением только при совпадении версии. Устаревший запрос не должен перезаписывать чужие изменения. Пользователю предлагается обновить страницу и повторить действие.
Расходная ставка при согласовании
Сервер получает расходную ставку из справочника назначенного сотрудника. Переданное клиентом значение costRate не является доверенным источником. После согласования ставка сохраняется в строке заявки как снимок; для старых строк без снимка используется текущая ставка справочника.
Для рабочего контура следует заменить имена и названия как ключи на стабильные идентификаторы пользователей, проектов и ролей. История согласованных изменений назначения уже сохраняется. Нормализация хранения, полная история первичного согласования, идентификация автора и история ставок остаются отдельной доработкой.
29 Техническая архитектура и интерфейс API
Клиент: React / TypeScript, Vinext, Radix и Shadcn. Сервер: HTTP-обработчики Cloudflare Workers. Хранилище: D1, миграции Drizzle. Ставки, загрузка и данные отчётности проверяются сервером при сохранении.
| Метод и маршрут | Назначение |
|---|---|
| GET /api/planning | Возвращает State: requests, revision и необязательный reportData. При недоступности загрузки — HTTP 503. |
| POST /api/planning | Создаёт заявку, принимает решение или сохраняет reportData (раздел 27). При устаревшей revision — HTTP 409; ошибки проверки и записи — HTTP 400. |
Статусы и обязательность
Внутренние значения статусов: pending — на согласовании; approved — согласована; returned — на доработке; rejected — отклонена. Поле employee может быть пустым при создании, но обязательно для согласования. costRate отсутствует без выбранного сотрудника.
Контракт действий
| action | Поля помимо revision |
|---|---|
| create | project, manager, comment, lines. Каждая строка содержит role, employee, rate, months с month и fte. |
| approve | id заявки, lines с назначенными сотрудниками, comment, allowLoss. allowLoss должен быть true при превышении расходов. Для заявки kind = change: id, comment, allowLoss; исходные снимки и целевой план берутся с сервера, lines не передаются. |
| return | id заявки, непустой comment. |
| reject | id заявки, непустой comment. |
| change | targetId, lineIndex, effectiveDate, mode, fte, employee, reason. Создание изменения назначения; сервер формирует снимки и новый план. |
Успешный POST возвращает обновлённый State. Ошибка возвращает JSON-объект с полем error. Строки, сотрудники, диапазоны FTE и ставки проверяются сервером. Одна доходная ставка не должна превышать 1 000 000 ₽/час.
Пример строки новой заявки
{ "role": "Системный аналитик", "employee": "e1", "rate": 3500, "months": [{ "month": "2026-10", "fte": 0.5 }, { "month": "2026-11", "fte": 1 }] }
Границы текущего API
API не проверяет учётную запись и серверные права: GET выдаёт полное состояние, фильтрация по имени РП выполняется в интерфейсе. До рабочего запуска требуется серверное разграничение доступа. Публичный прототип не предназначен для реальных конфиденциальных ставок и сведений сотрудников. Данные должны браться из Сферы: Bitrix 24
30 Интеграции и требования к рабочему контуру
Интеграция с Bitrix24 запланирована, но в текущей версии отсутствует. Следующие требования описывают доработку; они не являются уже реализованными возможностями.
| Данные | Назначение | Статус |
|---|---|---|
| Сотрудники и роли | Заполнение пула ресурсов и подбор по роли | Демонстрационный справочник |
| Проекты и руководители | Связь заявки с проектом и определение прав РП | Место хранения в Bitrix24 не определено |
| Расходные ставки | Подстановка ставки специалиста | Демонстрационные значения; источник не определён |
| Фактические часы | Заполнение строк Факт и расчёт отклонений | Time |
| Производственный календарь | Норма часов с праздниками и сокращёнными днями | Пока пятидневная неделя по 8 часов |
Условия интеграции с Bitrix24
INT 01. Согласовать сущность проектов: рабочие группы, сделки, смарт-процесс либо другая сущность. Определить поля и стабильные ID проектов и руководителей.
INT 02. Получать сотрудников и согласованное соответствие их ролям. Учитывать деактивацию сотрудника и закрытие проекта без удаления уже согласованных назначений.
INT 03. Согласовать, где хранятся заявки и назначения: в данном приложении либо в Bitrix24. Запись обратно в Bitrix24 не реализована.
INT 04. Хранить секреты интеграции на сервере; согласовать способ подключения, права чтения и записи, период обновления и реакцию на ошибки.
Рабочие права и надёжность
NFR 01. Авторизованный РП должен получать через API только разрешённые проекты и заявки. Согласование доступно ресурсному менеджеру на сервере. Доступ к расходным ставкам нужно согласовать отдельно.
NFR 02. Дополнить существующую историю изменений назначения идентификатором реального автора; фиксировать исходные и согласованные значения также при первичном согласовании и вести полный журнал решений. При конфликте записи не терять изменения других пользователей; сохранять ввод при сбое.
NFR 03. Согласовать резервное копирование, восстановление, срок хранения и удаление данных, мониторинг ошибок и требования к производительности после определения числа пользователей, сотрудников и проектов. Числовые SLA в текущем задании не утверждены.