2026-05-20 (вечер) — Фиксы загрузки файлов, метрика остатка аванса, UI документов
Контекст
Второй раунд фидбэка Руслана за день. 4 новые проблемы.
Фикс 1 — Округление суммы договора
При редактировании суммы договора она округлялась до целых (аванс отображался с копейками, договор нет).
Причина: maximumFractionDigits: 0 в отображении карточки договора.
Правка: app/app/(app)/projects/[id]/page.tsx — maximumFractionDigits: 0 → 2.
Фикс 2 — Метрика «Остаток на руках»
Руслан попросил видеть в моменте: получили аванс — потратили — сколько осталось.
Формула: Остаток на руках = Поступления от заказчика − Выплаты − Внесметные расходы
Добавлено поле cashBalance в MarginResult (margin.ts) и новая строка в MarginCard.tsx:
- Поступило от заказчика: +345M ₽
- Остаток на руках: 345M ₽ (зелёный если ≥ 0, красный если уходит в минус)
Фикс 3 — Загрузка файлов через веб
Проблема: «Счёт через веб интерфейс не загружается. Опять ошибка.»
Причина: MinIO бакет bablo-documents не был создан. Контейнер MinIO запускался чистым, бакет надо создавать явно.
Решение:
- Создан бакет:
mc mb local/bablo-documents - В
uploadSingle.tsдобавлено авто-создание бакета при первом обращении (HeadBucketCommand+CreateBucketCommand)
Верификация (curl с реальной сессией): {"documentId":"fd821101-..."} — PASS. Файл записан в MinIO и в БД.
Фикс 4 — Документы от бота не видны в веб
Проблема: «Загрузил через бота картинку. А в веб интерфейсе не могу посмотреть что загружено.»
Документы в БД есть, но UI показывал только тип и дату — ни имя файла, ни текст.
Правки в app/app/(app)/documents/page.tsx:
- Имя файла — извлекается из S3-ключа (
source_url.split("/").pop()) - Канал — Telegram / Загрузка / Текст
- Превью текста — разворачиваемый
<details>сraw_text - Предупреждение для старых документов от бота без
source_url: «Файл не сохранён — пришли ещё раз»
Коммиты сессии
| Коммит | Описание |
|---|---|
| 255970a | fix(ruslan): contract rounding, cashBalance, MinIO bucket, docs UI |
Стройплощадка
Передеплоена на Vercel после сессии. 21 страница, 10 work-логов.
Статус на конец сессии
- Загрузка файлов работает — проверено
- Ждём фидбэк Руслана по новым изменениям
- Старые 3 документа без
source_url(бот присылал до создания бакета) — Руслан должен переслать заново - Открытая задача: NPM Proxy Host (домен вместо порта 3010)