План и факт
Смета считается до проекта, и расходы в ней номинальные. По ходу проекта расходы становятся реальными: часы команды, счета поставщиков, перевозки, командировки. Раздел «ТЗ и смета → План и факт» сравнивает одно с другим по разделам сметы. Этап 7 ТЗ «смета → документы → расходы → план и факт».
План
План — действующая смета: согласованная, а пока её нет — последняя версия не в архиве. Тогда карточка пишет «Смета ещё не согласована — план по версии N».
- По разделам: себестоимость (что будет стоить нам) и цена (что заплатит клиент, со скидками).
- Строки раскрываются: наименование, количество, себестоимость и цена.
- Выручка по смете — итог сметы с налогами. Он же — плановый бюджет проекта.
Плановый бюджет пишется при согласовании сметы (projects.planned_budget). Пока согласованная смета есть, руками он не меняется:
- в карточке и в «Деньгах проекта» поле закрыто с причиной «Итог согласованной сметы»;
- сервер отвечает
409 projects_planned_budget_from_estimate.
Изменить бюджет можно новой версией сметы. У проектов без согласованной сметы поле по-прежнему правится.
Факт
Факт собирается сам из журнала расходов проекта (project_cost_items, actual_amount).
| Источник | Как попадает в факт | Раздел сметы |
|---|---|---|
| Часы команды | часы × себестоимость часа сотрудника | «Команда» |
| Документы поставщиков | оплаченная сумма (Документы поставщиков) | раздел документа |
| Перевозки | фактическая стоимость операции | «Перевозки» |
| Субаренда и закупка | стоимость операции | «Оборудование» |
| Командировки | фактическая стоимость | «Командировки» |
| Ручные статьи | факт статьи | по статье |
- Своё оборудование в факт не идёт: его себестоимость в проекте — 0.
- Статья журнала попадает в раздел своего вида (
tech→ оборудование,labor→ команда, …). Если такого раздела в смете нет — в строку «Вне сметы». - Документ поставщика попадает в свой раздел: вид + название.
- Часы команды в разделе показываются одной строкой «Часы команды · N записей».
Себестоимость часа — та же, что в смете. Порядок:
- ставка участника команды проекта;
- себестоимость часа сотрудника на дату записи (
user_rates); - профиль оплаты (почасовой или оклад / норма часов);
- ставка отдела.
Пересчёт: finance.SyncLaborCosts после записи времени, задач и утверждения табеля.
Отклонение и исполнение
- Отклонение = факт − план. Плюс — перерасход, красным.
- Исполнение = факт / план. Полоса дорастает до 100 % и краснеет при перерасходе.
- «Вне сметы» — факт без плана, весь он перерасход.
Итоги по проекту:
- план, факт, отклонение, исполнение;
- маржа по смете — цена сметы − себестоимость сметы;
- ожидаемая маржа — цена сметы − фактические расходы.
Выручка:
- по смете;
- выставлено — счета, кроме черновиков и отменённых;
- оплачено — оплаченный счёт целиком, у остальных — разнесённые проведённые платежи;
- к оплате.
«Заработок» над карточкой — прежний расчёт: оплаченная выручка − фактические расходы.
Динамика бюджета
График «Динамика бюджета»:
- План — себестоимость действующей сметы. Если сметы нет — плановые суммы статей, как раньше.
- Факт — накопленный итог по неделям. Дата расхода берётся из источника:
- запись времени;
- прибытие перевозки;
- командировка;
- последняя проведённая оплата документа поставщика;
- для ручных статей — дата создания.
Кто видит
Раздел открыт тем, у кого открыты финансы проекта и есть бюджет клиента или затраты. Внутри сервер скрывает поля по правам:
| Что | Нужно |
|---|---|
| себестоимость, факт, отклонение, исполнение, из чего сложился факт, внутренние строки | затраты (costs) |
| цены, выручка | бюджет клиента (client_budget) |
| маржа | earnings_margin и оба права выше |
«Что дальше»
Карточка на обзоре проекта показывает один следующий шаг по пути проекта с кнопкой, которая ведёт на нужную вкладку и раздел. Шаги по порядку:
- ТЗ. «Загрузите и согласуйте ТЗ», пока оно на согласовании — «ТЗ на согласовании». Этот шаг видят все: без ТЗ по проекту не платят.
- Смета. «Составьте смету» → «Отправьте смету клиенту» → «Ждём решения клиента» (открыл ли клиент ссылку) или «Клиент просит изменения».
- Договор. «Клиент согласовал — сформируйте договор».
- Счёт. «Выставьте счёт на аванс».
- Оплата. «Ждём оплату от клиента»: сколько осталось получить — сумма видна с бюджетом клиента.
- Работа. «Проект в работе»: факт копится сам.
- Акт. Проект сдан без акта — «Закройте проект актом». Акт выставлен — «отметьте подписание». Всё подписано и оплачено — «проект можно закрывать».
Рядом — что ждёт действий:
- расходы поставщиков к подтверждению;
- расходы сверх сметы, которые ждут финансов;
- согласованные расходы к оплате.
Денежные шаги видны при финансах проекта. У закрытого, отменённого и проигранного проекта шага нет.
Карточка обновляется сама после смены статуса, ТЗ, сметы, документов, расходов и платежей.
API
GET /api/v1/projects/:id/budget/plan-fact— план и факт по разделам, итоги, выручка;GET /api/v1/projects/:id/budget/dynamics— динамика (план — из сметы);GET /api/v1/projects/:id/next-step— «Что дальше».
Где в коде
internal/modules/budget/planfact.go— сборка, разнесение факта по разделам, скрытие по правам;internal/modules/estimates/service.go(ProjectPlan) — план из сметы;internal/modules/nextstep— правила шага (Decide) и состояние проекта одним запросом;internal/modules/finance/labor.go— факт часов;- фронт:
BudgetPlanFactCard.vue,ProjectNextStepCard.vue,usePlannedBudgetLock.ts.