bablo / стройплощадка
← Все сессии
Дата: 2026-05-20
Часов: 5
Кто:

2026-05-20 — Фиксы по фидбэку Руслана + редактирование записей

Контекст

Руслан начал активно тестировать пилот. За сессию пришли два раунда обратной связи.

Раунд 1 (утро): базовые фиксы

Проблема: нельзя удалять документы и сметы, неправильная формула маржи, неверная сумма сметы.

Формула маржи

Руслан уточнил: смета — это план выручки (что заплатит заказчик при выполнении всех объёмов), а не расход.

Утверждённая формула: Маржа = Сметная стоимость − Выплаты подрядчикам − Внесметные расходы

Поступления от заказчика — отдельная информационная строка, не участвуют в расчёте маржи (стройка ведётся и без аванса).

Файл: app/lib/calculators/margin.ts.

Удаление документов и смет

  • deleteDocument action в documents.ts — удаляет из S3 (best-effort) + из БД, редирект на /documents
  • deleteEstimate action в projects.ts — CASCADE чистит версии и строки, редирект на /projects/[id]

Парсер Smeta.RU (ТСН-2001)

Старый парсер брал суб-строки (ЗП/МР/НР) как позиции → получал 7 ₽ вместо 644M ₽.

Формат Smeta.RU: строка позиции (col0=№, col2=название), затем суб-строки (ЗП/МР), затем “ВСЕГО работ по позиции:” где col7=базисная цена, col9=текущая цена.

Парсер полностью переписан как state machine. Детектируется по watermark “Smeta.RU” в первых строках. Верификация на реальном файле: 112 позиций, итог = 644 004 611 ₽.

Файл: app/lib/estimates/xlsx-parser.ts.

Tailwind v4 — невидимые кнопки

В Tailwind v4 --color-accent генерирует утилиту bg-accent, а не bg-color-accent. Весь код проекта использует паттерн bg-color-accent.

Решение: в globals.css добавлены алиасы --color-color-accent, --color-color-success и т.д.

После изменения globals.css нужен docker compose build app, не просто restart.

Раунд 2 (день): ещё три бага

Проблема: смета показывает 22 149 747 ₽ (базисные цены 2000 года) вместо текущих; пропали копейки в итоге; нет редактирования записей.

totalBase vs totalCurrent

Страница объекта суммировала estimateLine.totalBase (col7 = базисные цены января 2000 = 22M) вместо estimateLine.totalCurrent (col9 = текущие цены = 644M+).

Также ParsedEstimate не имел поля totalCurrent — оба агрегата хранили totalBase.

Правки в трёх файлах:

  • xlsx-parser.ts — добавлено поле totalCurrent, оба парсера его накапливают
  • projects.tsimportEstimate теперь записывает корректный totalCurrent в estimateVersion
  • projects/[id]/page.tsx — суммирует totalCurrent для отображения, показывает 2 знака после запятой

Редактирование записей

Добавлены server actions: updateContract, updateRevenueEvent, updatePaymentEvent, deletePaymentEvent.

В UI каждая карточка (договор, поступление, платёж) получила inline <details> ”✎ Изменить” с предзаполненной формой — тот же паттерн что у “Добавить”.

Заодно добавлено удаление платежей (ранее кнопки не было).

Коммиты сессии

КоммитОписание
f598767fix: margin formula, deleteDocument, deleteEstimate
8b35e12fix: xlsx parser column keywords for current prices
49716eafix: margin from estimate revenue potential
ccd5088fix: Tailwind v4 color aliases in globals.css
d0abedafix: Smeta.RU parser state machine (ТСН-2001)
d33aa58fix(estimates): totalCurrent vs totalBase
973b690feat(projects): edit + delete for all record types

Статус на конец сессии

  • Руслан ещё раз перезагружает смету после фикса totalCurrent
  • Ожидаем подтверждения что суммы правильные
  • Открытая задача: NPM Proxy Host (домен вместо порта 3010)