ТЗ: смета → документы → расходы → план и факт
Дата: 2026-09-30. Основа: план estimate-overhaul-plan.md (решения заказчика — в нём, раздел 6), разбор текущего кода денег и документов. Этап 1 плана — разбор ТЗ нейросетью — сделан.
Цель: сотрудник проходит путь от ТЗ клиента до закрытия проекта по понятным шагам, без ручного «планового бюджета» и без Excel на стороне. Смета — единственный источник цены и плана, документы собираются из шаблонов, расходы приходят документами поставщиков, план и факт считаются сами.
1. Что сейчас сломано (коротко)
| Что видит сотрудник | Причина |
|---|---|
| «Смета не формируется» / файл не найти | PDF загружается от «урезанного» сотрудника без прав его ролей — у многих 403; у остальных файл ложится вне папок, и без раздела документов его не видно; номер при сбое уже израсходован |
| Шаблонов нет | API шаблонов есть, экрана нет; PDF по шаблону собирает заглушка без кириллицы — нечитаемо; сами документы нарисованы кодом |
| Менеджер не может выставить счёт | право на счета снято с менеджеров; счёт всегда на всю смету — ни аванса, ни остатка |
| «Счёт № 1» у каждого клиента | нумерация по клиенту, а не по нашему юрлицу |
| Документы нельзя поправить | нет черновиков, перевыпуска, удаления |
| Расходы не попадают в факт | документов поставщиков нет; оплата расходным платежом не меняет факт статьи |
| План бюджета «с потолка» | плановый бюджет вводится руками, смета — сумма статей по категориям |
| Оборудование не в смете | вкладка «Оборудование» с бюджетом не связана |
| Предпросмотр Word/Excel не работает | LibreOffice в образе сервера нет |
2. Путь сотрудника
Карточка проекта показывает «Что дальше» — один следующий шаг с кнопкой: «Составьте смету», «Отправьте смету клиенту», «Клиент согласовал — сформируйте договор», «Выставьте счёт на аванс», «Закройте проект актом».
Менеджер проекта
- ТЗ — загрузил ТЗ клиента, помощник разобрал (этап 1).
- Смета — «Собрать смету»: из разбора ТЗ, оборудования проекта, перевозок, командировок и команды; правит строки, наценку, скидки.
- Клиенту — «Отправить клиенту»: ссылка на смету (без входа в RMS), клиент смотрит, согласует или просит изменения; менеджер получает уведомление.
- Согласовано — смета становится планом бюджета проекта.
- Договор — из шаблона, с суммой сметы и реквизитами сторон; подписанный скан загружается к договору.
- Счета — «Выставить счёт»: аванс (процент или сумма), остаток, произвольный — из строк сметы или своими строками. Оплата отмечается сама по платежу клиента.
- Работа — часы по задачам, перевозки, командировки, расходы поставщиков идут в факт сами.
- Изменения — новая версия сметы → клиенту → доп. соглашение и доплата.
- Закрытие — акт из шаблона на согласованную смету; после подписания — «Сдан», финансы закрывают.
Финансы
- Документы поставщиков — счёт, акт, УПД: загрузить скан → помощник распознаёт поставщика, номер, дату, суммы, НДС (как реквизиты, этап 4 AI) → привязать к проекту и разделу сметы.
- Согласовать расход (сверх сметы — с пометкой «перерасход») → оплатить → факт проекта.
- Входящие платежи клиентов разносятся на счета — счёт становится «оплачен» (частично — «частично оплачен»).
- Финансы тоже выставляют счета, договоры, акты — те же экраны.
Клиент (по ссылке)
Видит смету по разделам с ценами (без себестоимости и наценки), итоги со скидкой и налогами; скачивает PDF; «Согласовать» (ФИО, комментарий) или «Нужны изменения» (комментарий). Ссылка живёт до отзыва или новой версии.
3. Смета
3.1 Модель
project_estimates— версия сметы: проект, номер версии, статус, версия ТЗ, наше юрлицо-продавец, налоговый режим и ставки на момент версии, наценка сметы, скидка сметы, итоги (снимок), кто и когда отправил и согласовал.- Статусы: черновик → отправлена клиенту → согласована | нужны изменения → архив (при новой согласованной версии прежняя — архив).
- Править можно только черновик; «нужны изменения» → новая версия-черновик из этой.
project_estimate_sections— разделы: оборудование, перевозки, командировки, команда, подрядчики, материалы, креатив, прочее и свои; порядок; скидка раздела (процент или сумма).project_estimate_lines— строки:- название для клиента, внутренний комментарий;
- количество, единица, дни (оборудование) или часы (команда);
- себестоимость за единицу и цена для клиента за единицу (по умолчанию = себестоимость × (1 + наценка сметы), округление до рубля; можно зафиксировать вручную);
- источник: оборудование проекта, позиция каталога, перевозка, командировка, сотрудник, разбор ТЗ, вручную — и id источника;
- «зафиксировано вручную» — сбор из проекта строку не перезаписывает;
- «внутренняя» — не видна клиенту и не входит в цену (например, резерв на риски у себя);
- порядок.
3.2 Расчёт (один движок на сервере, money.Money)
Себестоимость строки = количество × дни/часы × себестоимость за единицу
Цена строки = количество × дни/часы × цена для клиента за единицу
Раздел = Σ цен строк − скидка раздела
Сумма = Σ разделов − скидка сметы
УСН = Сумма × ставка УСН (если режим с УСН)
НДС = (Сумма + УСН) × ставка НДС (если режим с НДС)
Итого клиенту = Сумма + УСН + НДС
Маржа = Сумма − Σ себестоимостей (в рублях и %)Пример заказчика: позиция 1 000 → УСН 10 % = 1 100 → НДС 5 % от 1 100 = 1 155. При НДС 22 % (общая система) УСН нет.
- Налоговый режим — у нашего юрлица (реквизиты): «общая система, НДС 22 %» или «УСН N % + НДС 0 / 5 / 7 %». Смета берёт режим юрлица-продавца проекта; в проекте можно переопределить.
- Наценка одна на смету и клиенту не видна — она внутри цен строк.
- Статья «налоги» наценкой и налогами не облагается повторно.
- Клиент видит: разделы, строки (название, кол-во, дни/часы, цена за единицу, сумма), скидки, УСН и НДС строками по режиму, итого.
3.3 «Собрать смету»
| Раздел | Откуда | Себестоимость | Цена клиенту |
|---|---|---|---|
| Оборудование | потребность проекта (вкладка «Оборудование») и разбор ТЗ | свой склад — 0 (своё), субаренда и закупка — цена поставщика | ставка аренды каталога за день × дни со скидкой за длительность 1 / 0,5 / 0,3 / 0,15 / 0,1 × кол-во |
| Перевозки | операции логистики проекта (план), иначе оценочная строка «доставка и возврат» | плановая стоимость | себестоимость × (1 + наценка) |
| Командировки | командировки проекта: билеты, жильё, суточные | плановая стоимость | себестоимость × (1 + наценка) |
| Команда | команда проекта и часы из разбора ТЗ / сметы по ТЗ | часы × персональная себестоимость часа | часы × персональная ставка для клиента |
| Подрядчики, материалы, прочее | вручную или из разбора ТЗ | вручную | себестоимость × (1 + наценка) или вручную |
- Повторный сбор показывает «что изменилось»: добавлено, изменилось, пропало — и не трогает строки, зафиксированные вручную.
- Одна формула аренды на всю систему (заявки на оборудование, логистика и смета берут её из одного места).
3.4 Ставки сотрудников
user_rates— история ставок сотрудника: себестоимость часа и ставка для клиента, действует с даты. Правят финансы и администратор в карточке сотрудника («Ставки»); себестоимость видна по правуcosts, ставка для клиента — поclient_budget.- Если у сотрудника ставок нет: ставки должности → отдела (у отдела — две ставки вместо одной
hourly_rate). - В команде проекта можно переопределить обе ставки на проект.
- Факт труда (часы из задач × себестоимость часа) считается по той же ставке (сейчас — по часовой ставке команды или профилю компенсации).
3.5 Ссылка клиенту
- «Отправить клиенту» → ссылка
…/estimate/<token>(токен 32 байта, в базе — хэш), срок — до новой версии или отзыва; можно скопировать или отправить письмом контакту проекта. - Страница без входа: логотип и реквизиты нашей компании, проект, разделы и строки, итоги, «Скачать PDF», «Согласовать» (ФИО, комментарий) и «Нужны изменения» (комментарий). Никаких внутренних данных.
- Менеджер видит «открыта клиентом» и решение; уведомление и обновление экрана сразу (синхронизация между пользователями).
- Согласование — статус версии «согласована», запись в журнале действий (ФИО клиента, IP, время).
4. Документы и шаблоны
4.1 Шаблоны в Word
- Шаблон — файл Word (DOCX) с полями
{{…}}: администратор или финансы скачивают стандартный, правят в Word как обычный документ и загружают обратно. Таблицы строк — строкой-образцом{{#lines}} … {{/lines}}. - Шаблоны по видам: смета (КП), счёт, договор, доп. соглашение, акт; для каждого вида — шаблон по умолчанию и, при нескольких юрлицах, свой для юрлица.
- Экран «Администрирование → Шаблоны документов»: список, скачать, загрузить новую версию, предпросмотр на данных любого проекта, список полей с примерами.
- Поля: наша компания (название, реквизиты, банк, руководитель; место для подписи, без картинок подписи и печати), клиент (то же), проект (название, даты, площадка), документ (номер, дата), смета (разделы, строки, скидки, налоги, итого, сумма прописью), счёт (назначение, аванс/остаток, срок оплаты), договор (предмет, сроки, порядок оплаты).
- Документ сохраняется в двух видах: DOCX (можно поправить руками) и PDF (для отправки).
- Конвертер: отдельный сервис Gotenberg (LibreOffice и Chromium) в
compose: Word → PDF для документов и заодно предпросмотр офисных файлов, который сейчас не работает.
4.2 Документ
- Статусы: черновик → выпущен → отправлен → счёт: частично оплачен / оплачен, договор и акт: подписан; аннулирован — из любого, кроме оплаченного и подписанного.
- Черновик правится и перевыпускается; выпущенный — только «перевыпустить» (новая версия, прежняя — «заменён»).
- Номер выдаётся при выпуске, а не при черновике: по нашему юрлицу, виду и году, формат настраивается (
СЧ-{год}-{номер}); неудачный выпуск номер не тратит (всё в одной транзакции, файл загружается до записи). - Файлы документов ложатся в папки проекта: смета — «Коммерческие предложения», договоры, доп. соглашения и акты — «Договоры и акты», счета — «Счета»; загрузку делает сервер от имени системы после проверки прав на документы проекта (без «урезанного» сотрудника).
- Подписанный скан загружается к документу («Загрузить подписанный»).
4.3 Виды
| Документ | Из чего | Кто |
|---|---|---|
| Смета (КП) | версия сметы | менеджер проекта, финансы |
| Договор | согласованная смета, шаблон; создаёт запись в реестре договоров (юристы видят и ведут сроки) | менеджер проекта (черновик), юристы и финансы (выпуск) |
| Счёт клиенту | смета: аванс % / сумма, остаток, выбранные строки или свои строки | менеджер проекта и финансы |
| Доп. соглашение | разница новой согласованной версии сметы с прежней | менеджер, юристы, финансы |
| Акт | согласованная смета (с доп. соглашениями) | менеджер проекта, финансы |
| Счёт без проекта | свои строки, клиент из справочника | финансы |
Права: менеджер проекта (запись карточки проекта + client_budget) выставляет счета и акты своих проектов — это меняет решение миграции 0150; финансы — по всем.
5. Расходы и оплаты
- Документы поставщиков (
supplier_documents): вид (счёт, акт, УПД, чек), поставщик (справочник поставщиков или компаний), номер, дата, суммы с НДС и без, проект и раздел или строка сметы, файл, статус получен → согласован → оплачен (частично — «частично оплачен»), кто согласовал. - Загрузка скана → помощник распознаёт поставщика, номер, дату, суммы, НДС и строки (механизм реквизитов из файла) → финансы проверяют и привязывают к проекту.
- Согласование: менеджер проекта подтверждает «это наш расход»; финансовый директор согласует сверх сметы раздела («перерасход +N ₽»).
- Оплата: исходящий платёж по документу поставщика (как сейчас по статье или обязательству); оплаченная сумма — факт раздела сметы.
- Входящие платежи клиента разносятся на наши счета; частичная оплата — «частично оплачен», выручка проекта растёт на оплаченную сумму.
- Обязательства (аренда склада и т. п.) при оплате получают дату факта.
6. План и факт
- План = согласованная версия сметы: по разделам и строкам, себестоимость и цена. Ручного «планового бюджета» нет; поле
projects.planned_budgetзаполняется итогом сметы и в интерфейсе не редактируется. - Факт — сам:
- команда — часы из задач × себестоимость часа сотрудника (по мере записи и утверждения табеля);
- поставщики — согласованные и оплаченные документы (раздел — по привязке);
- перевозки и командировки — фактическая стоимость (как сейчас);
- оборудование — субаренда и закупка документами поставщиков; своё — 0 (стоимость владения в проект не относим).
- Вкладка «Смета и бюджет»: разделы — план, факт, отклонение, % исполнения; строки раскрываются; «перерасход» красным; «Динамика бюджета» — план против накопленного факта по неделям в реальном времени; выручка — выставлено, оплачено, к оплате.
- Отклонение и маржа видны тем, у кого есть
costs/earnings_margin.
7. Что удаляется или переделывается
- Статьи бюджета как «план» — вместо них смета;
project_cost_itemsостаётся журналом факта по разделам. - «Смета по ТЗ → применить в бюджет» — раздел «Команда» сметы.
- Рисование документов кодом (fpdf) и заглушка HTML→PDF — шаблоны Word и Gotenberg.
- Расчёт итогов оборудования во фронте — сервер.
- Строка «Наценка» в документах клиента.
Данные переносятся: текущие плановые статьи и настройки бюджета — в смету v1 «согласована» (если по проекту выставлялись счета) или «черновик».
8. Этапы
| Этап | Что получает сотрудник | Оценка |
|---|---|---|
| 2. Документы работают ✅ | смета, счёт, акт, договор формируются и лежат в папках; номер по нашему юрлицу при выпуске; черновик счёта; менеджер выставляет счёт на аванс, остаток, свои строки; счёт компании без проекта — из карточки компании (сделано 2026-09-30, Система документов → Счёт по проекту); перевыпуск — отменить и выставить заново | 3–4 дня |
| 3. Смета ✅ | модель, расчёт с налогами по юрлицу, скидки, скрытая наценка, экран по разделам, «Собрать смету» из проекта и разбора ТЗ, ставки сотрудников, перенос текущих данных | 6–8 дней |
| 4. Ссылка клиенту ✅ | отправить смету ссылкой, клиент согласует или просит изменения, уведомление | 2–3 дня |
| 5. Шаблоны Word ✅ | Gotenberg, шаблоны по видам и юрлицам, админка, поля, предпросмотр; DOCX и PDF каждого документа; предпросмотр офисных файлов (Шаблоны документов в Word) | 4–5 дней |
| 6. Расходы ✅ | документы поставщиков с распознаванием, согласование, оплата по документу, частичные оплаты, факт по разделам (Документы поставщиков) | 4–5 дней |
| 7. План и факт ✅ | план = смета, факт автоматически, раздел «План и факт» во вкладке «ТЗ и смета», «Что дальше» в карточке проекта (План и факт) | 3–4 дня |
Порядок: этап 2 сразу чинит то, что сломано сейчас; этапы 3–4 — главное для менеджера; 5 меняет способ рисования документов, не их логику; 6–7 — для финансов. Каждый этап закрывается по Definition of Done из CLAUDE.md, сквозной сценарий раздела 5 дорожной карты дополняется шагами этого ТЗ.
Эксплуатация: при выкате удалять образы прошлых выкатов — диск staging заполнен на 78 % (каждый выкат — ~1,4 ГБ образов); Gotenberg — ~1,3 ГБ образ и ~400 МБ памяти.
8.1 Этап 3 — как делаем (по разбору кода 2026-09-30)
Что в коде не так, как предполагало ТЗ, и как это решено:
- Потребность в оборудовании (
project_equipment_requirements) не знает источника (свой склад, субаренда, закупка) и дат — только количество, дни аренды и цену проекта. Строка сметы из потребности — «своё»: себестоимость 0, цена = цена проекта или цена каталога за день (equipment.cost) × коэффициент длительности × кол-во. Субаренда и закупка берутся из позиций логистики проекта (logistic_operation_items,source_typerental/purchase) и становятся себестоимостью той же строки. - Командировки хранят одну плановую стоимость — строка сметы на командировку целиком (без разбивки на билеты, жильё и суточные).
- Ставок у должностей нет — порядок ставок: проект (команда) → сотрудник (
user_rates, история) → отдел. У отдела и в команде появляется вторая ставка — для клиента. - Часы в смете по ТЗ — по отделам, не по людям: строки раздела «Команда» из неё — по ставкам отдела; сотрудника с его личными ставками добавляют строкой «Сотрудник».
- УСН хранится в настройках бюджета проекта; у реквизитов юрлица появляется свой процент УСН, смета берёт режим юрлица-продавца (переопределяется в смете).
- Перевозки без операций логистики оценочной строкой не добавляются (нет тарифа) — строку добавляют вручную.
Порядок: модель и движок расчёта → API сметы и «Собрать смету» с разницей → ставки → перенос текущих данных (смета v1 из плановых статей) → документы берут строки и итоги из сметы → экран сметы.
9. Вопросы (ответы нужны до этапа указанного в скобках)
Ответы 2026-09-30: НДС зависит от нашего юрлица-продавца (его реквизиты); стандартного процента аванса нет; своих шаблонов Word пока нет; в документах — место для подписи, без картинок; своё оборудование сдаётся в аренду, его себестоимость неизвестна; кто подтверждает расход поставщика — решаем на этапе 6. Решено на этапе 6 (2026-10-01): подтверждает руководитель проекта, сверх плановой себестоимости раздела сметы (или вне сметы) — ещё финансы; смета — номинальный план до проекта, документы поставщиков её не меняют.
- Юрлица и режимы (этап 3): какие наши юрлица выставляют документы и на каком режиме каждое — общая система с НДС 22 % или УСН с каким % и НДС 5 / 7 %?
- Счёт на аванс (этап 2): стандартный процент аванса есть (например, 50 %)? Срок оплаты счёта по умолчанию?
- Договор (этап 5): есть ли ваш типовой договор в Word — возьмём его за основу шаблона? То же для сметы (КП), счёта и акта.
- Подпись и печать (этап 5): ставить картинками в документы или только место для подписи?
- Своё оборудование в факте (этап 7): считаем его себестоимость 0 или внутреннюю ставку (износ, амортизация)?
- Согласование расходов (этап 6): кто подтверждает расход поставщика — менеджер проекта, финансовый директор или оба; и от какой суммы?