2026-05-20 — Фиксы по фидбэку Руслана + редактирование записей
Контекст
Руслан начал активно тестировать пилот. За сессию пришли два раунда обратной связи.
Раунд 1 (утро): базовые фиксы
Проблема: нельзя удалять документы и сметы, неправильная формула маржи, неверная сумма сметы.
Формула маржи
Руслан уточнил: смета — это план выручки (что заплатит заказчик при выполнении всех объёмов), а не расход.
Утверждённая формула: Маржа = Сметная стоимость − Выплаты подрядчикам − Внесметные расходы
Поступления от заказчика — отдельная информационная строка, не участвуют в расчёте маржи (стройка ведётся и без аванса).
Файл: app/lib/calculators/margin.ts.
Удаление документов и смет
deleteDocumentaction вdocuments.ts— удаляет из S3 (best-effort) + из БД, редирект на/documentsdeleteEstimateaction в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.ts—importEstimateтеперь записывает корректныйtotalCurrentвestimateVersionprojects/[id]/page.tsx— суммируетtotalCurrentдля отображения, показывает 2 знака после запятой
Редактирование записей
Добавлены server actions: updateContract, updateRevenueEvent, updatePaymentEvent, deletePaymentEvent.
В UI каждая карточка (договор, поступление, платёж) получила inline <details> ”✎ Изменить” с предзаполненной формой — тот же паттерн что у “Добавить”.
Заодно добавлено удаление платежей (ранее кнопки не было).
Коммиты сессии
| Коммит | Описание |
|---|---|
| f598767 | fix: margin formula, deleteDocument, deleteEstimate |
| 8b35e12 | fix: xlsx parser column keywords for current prices |
| 49716ea | fix: margin from estimate revenue potential |
| ccd5088 | fix: Tailwind v4 color aliases in globals.css |
| d0abeda | fix: Smeta.RU parser state machine (ТСН-2001) |
| d33aa58 | fix(estimates): totalCurrent vs totalBase |
| 973b690 | feat(projects): edit + delete for all record types |
Статус на конец сессии
- Руслан ещё раз перезагружает смету после фикса totalCurrent
- Ожидаем подтверждения что суммы правильные
- Открытая задача: NPM Proxy Host (домен вместо порта 3010)