Смета из ТЗ
Автоматический расчёт бюджета по оценке ТЗ (ТЗ, «Этап 2: внедрение автоматизированного процесса ТЗ → Бюджет»): менеджер задаёт функциональные блоки и оценочные часы, система умножает их на ставки, добавляет резерв на риски и переносит результат в плановый бюджет проекта.
Как считается
блок × статья расходов × часы × ставка отдела
↓
смета без резерва (subtotal)
↓ + резерв на риски (risk_reserve_percent из настроек бюджета)
итог к утверждению (total)Пример из ТЗ: 50 часов по ставке 2500 и 30 часов по ставке 2000 дают 185 000; резерв 20 % добавляет 37 000; итог — 222 000.
Ставка берётся из поля departments.hourly_rate. Строка без отдела или с отделом без ставки попадает в missing_rates и не даёт суммы: лучше показать пробел в смете, чем посчитать работу бесплатной.
Ставку задают в карточке отдела («Администрирование → Отделы», поле «Ставка, ₽/ч»; API — hourly_rate в POST/PUT /departments). В PUT поле меняется, только если пришло в теле (null — сбросить): клиент, не знающий поля, ставку не обнуляет. Отрицательная ставка — 400 departments_hourly_rate_negative.
Ставки и суммы — себестоимость (объект costs матрицы прав). Без права на чтение costs сервер отдаёт смету с часами и блоками, но без денег: applied_rate, rate, суммы и итоги вырезаны (нули), missing_rates пуст, а в ответе costs_hidden: true — интерфейс прячет колонки «Ставка» и «Сумма». Так же hourly_rate в справочнике отделов приходит null тем, кому закрыты затраты (инженеры, сотрудники дивизиона, склад).
Резерв на риски — поле risk_reserve_percent настроек бюджета проекта (GET/PUT /projects/:id/budget/settings, 0–100). ТЗ предлагает 15–20 %.
API
| Запрос | Что делает |
|---|---|
GET /api/v1/projects/:id/specs/:version/estimate | Строки оценки и расчёт |
PUT /api/v1/projects/:id/specs/:version/estimate | Заменяет набор строк целиком |
POST /api/v1/projects/:id/specs/:version/estimate/apply | Переносит смету в бюджет и ставит задачу на согласование |
Строка оценки: block (функциональный блок), category (статья расходов finance), department_id, hours, comment.
Ошибки: 400 projects_estimate_block_required, projects_estimate_category_invalid, projects_estimate_hours_invalid; 409 projects_estimate_spec_not_approved, 409 projects_estimate_project_closed.
Что происходит при применении
- Проверяются проект и статус ТЗ. Бюджет закрытого проекта не меняется:
409 projects_estimate_project_closedдо любой записи (ставки не фиксируются). Применить можно только утверждённую версию, в том числе мини-ТЗ. Смета по черновику в бюджет не попадает. - Фиксируются ставки. Ставка каждой строки сохраняется в
applied_rate: правка ставки отдела задним числом не меняет уже согласованный бюджет. - Пишутся плановые суммы. По одной строке бюджета на статью расходов, источник
spec_estimate:<категория>; резерв прибавляется к статье «Прочее» (к строкам сметы этой статьи, а не вместо них). Повторное применение обновляет те же строки, а не создаёт новые; статья, которой в новой смете нет, снимается с бюджета — строка без факта удаляется, строка с фактическими расходами остаётся с нулевым планом. - Ставится задача на согласование бюджета менеджеру проекта, срок — три дня (ТЗ: «Задача на согласование финального бюджета отправляется руководителю проекта и финансовому директору»). Сбой постановки задачи не отменяет записанную смету; идентификатор задачи возвращается в
task_id.
Права: запись затрат (costs) «все» — любой проект; иначе нужно и ведение проекта, и запись costs.
Отчёт «Незапланированные работы»
GET /api/v1/reports/unplanned_work?date_from=&date_to=&department_id= — показатель «Отклонение из-за незапланированных работ» из ТЗ: сколько работы идёт мимо сметы.
| Поле | Что это |
|---|---|
tasks_total | Задачи проекта (кроме отменённых) |
unplanned_tasks | Задачи без плановых часов |
unplanned_percent | Их доля; по ней проекты и сортируются |
unplanned_hours | Фактические часы по таким задачам |
unplanned_cost | Их стоимость по строкам трудозатрат; скрывается без доступа к затратам |
Высокий показатель означает, что смета не отражает реальную работу, а прибыль по проекту «рисованная».