Skip to content

Смета из ТЗ ​

Автоматический расчёт бюджета по оценке ТЗ (ТЗ, «Этап 2: внедрение автоматизированного процесса ТЗ → Бюджет»): менеджер задаёт функциональные блоки и оценочные часы, система умножает их на ставки, добавляет резерв на риски и переносит результат в плановый бюджет проекта.


Как считается ​

text
блок × статья расходов × часы × ставка отдела
    ↓
смета без резерва (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.

Что происходит при применении ​

  1. Проверяются проект и статус ТЗ. Бюджет закрытого проекта не меняется: 409 projects_estimate_project_closed до любой записи (ставки не фиксируются). Применить можно только утверждённую версию, в том числе мини-ТЗ. Смета по черновику в бюджет не попадает.
  2. Фиксируются ставки. Ставка каждой строки сохраняется в applied_rate: правка ставки отдела задним числом не меняет уже согласованный бюджет.
  3. Пишутся плановые суммы. По одной строке бюджета на статью расходов, источник spec_estimate:<категория>; резерв прибавляется к статье «Прочее» (к строкам сметы этой статьи, а не вместо них). Повторное применение обновляет те же строки, а не создаёт новые; статья, которой в новой смете нет, снимается с бюджета — строка без факта удаляется, строка с фактическими расходами остаётся с нулевым планом.
  4. Ставится задача на согласование бюджета менеджеру проекта, срок — три дня (ТЗ: «Задача на согласование финального бюджета отправляется руководителю проекта и финансовому директору»). Сбой постановки задачи не отменяет записанную смету; идентификатор задачи возвращается в 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Их стоимость по строкам трудозатрат; скрывается без доступа к затратам

Высокий показатель означает, что смета не отражает реальную работу, а прибыль по проекту «рисованная».

Загружаем документацию…