v1.2.1
[v1.2.1] — 2026-06-27
ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (
data/buhgalter.db) и каталогаbackups/.
При деплое через Docker и переходе на каталоги./data,./backups,./logsна хосте — инструкция по миграции.
Добавлено
Инфраструктура и API
BUHGALTER_LOG_MODE(prod/dev): вprodредактируются чувствительные заголовки, вdev— полные request-логи и расширенная диагностика ошибок- Docker Compose по умолчанию монтирует
./data,./backups,./logsс хоста (настраивается черезBUHGALTER_HOST_*_DIRв.env) - Docker-образ: entrypoint при старте создаёт каталоги volume и выставляет владельца uid 1000 (
buhgalter) — ручнойchownна хосте не нужен - В JSON-ошибках API опциональное поле
error.field— подсказка, какое поле запроса некорректно
Кредиты и ипотека
- График ипотеки с ежедневным начислением процентов: отдельный расчёт аннуитетного платежа и генерация (N−1 равных платежей + закрывающий)
- Ручной ввод ежемесячного платежа ипотеки из договора банка (
monthly_paymentв API и поле в форме создания) POST /api/v1/credits/schedule/preview— предпросмотр графика сcalculated_monthly_paymentбез сохранения
UI/UX
- Периодические операции: список на мобильных — карточки вместо горизонтальной прокрутки таблицы; форма вынесена в
{#snippet} - Редактирование операций дохода/расхода: меню «⋯» → Изменить на главной,
/transactions, странице счёта; формаTransactionForm— счёт, категория, подкатегория, сумма, описание, дата; тип (доход/расход) не меняется; дата в будущем →kind=future - Оплата кредита: в модалке можно выбрать счёт списания только для данного платежа (
account_idв API); основной счёт кредита (debit_account_id) не меняется - Действия в строках — компонент
RowActionsMenu: меню «⋯» с иконкой и подписью у каждого пункта (операции, периодические, категории, долги, график платежей) - Список счетов
/accounts: меню «⋯» на каждой карточке — редактировать (inline на карточке с подписями полей), сделать основным, архивировать, удалить - Страница счёта: действия (новая операция, перевод, редактирование, основной, архив, удаление) — в меню «⋯» в шапке карточки
- Настройки → Категории: «Сделать главной» — в меню «⋯»; раскрытие подкатегорий — клик по названию с ▶/▼ после текста
- Страница кредита: «Оплатить» — отдельная кнопка слева от меню «⋯» в шапке; в строках графика оплата остаётся в меню
- Страница должника: вкладки «Активные / Закрытые» через
PageTabs(как в настройках и списке долгов) - Фильтры (
FilterPanel): на мобильных свёрнуты под спойлер «Фильтры» с chevron; на десктопе всегда развёрнуты (/transactions,/stats, страница счёта) - In-memory кеш справочников в веб-клиенте:
GET /banks,GET /categories,GET /debtors— TTL 5 мин, дедупликация параллельных запросов, инвалидация при изменениях и logout
Изменено
UI/UX
/stats: в блоке «По категориям» только таблица категорий (отдельный список по подкатегориям убран)/stats: блок «По периодам» — человекочитаемые подписи (месяц «Июнь 2026», неделя «1–7 июня 2026», день —YYYY-MM-DD); порядок от новых к старым- Настройки → Категории: иконка категории/подкатегории — декоративная (без клика); главная категория отмечена галочкой у названия
- Редактирование счёта (список
/accountsи страница/accounts/[id]): у полей формы подписи «Название», «Банк», «Начальный баланс» - Погашение долга (
SettleDebtForm): переключатель «Не учитывать в балансе» (по умолчанию выключен) — затем счёт списания; при включённом переключателе поле счёта скрыто; счёт по умолчанию — из долга (account_id) или основной счёт;affects_balanceпри погашении задаётся в форме, а не наследуется от создания долга - Модалка оплаты кредита: убрана кнопка «Сегодня» у поля даты (дата задаётся календарём или берётся из графика)
Кредиты
- Пагинация графиков: кнопки «В начало» и «В конец» (форма создания и страница кредита)
- Для потребительских кредитов ручной платёж проверяется на минимум (покрытие процентов) и максимум (укладывание в срок); для ипотеки принимается любая положительная сумма из договора
- В графике кредита: оплатить — только ближайший неоплаченный платёж; удалить — только последний оплаченный; при удалении платёж восстанавливается как неоплаченный
scheduled
Документация и контракты
- OpenAPI: описание
POST /credits/schedule/preview, ипотечного графика,error.field, кодыERR_CREDIT_*; схемаPreviewScheduleResponse; UI-действия над счетами (PUT,POST .../archive,POST .../primary,DELETE) на/accounts - OpenAPI: уточнено поведение
GET /dashboard(forecast_balance,has_future_this_month) и lifecycle оплаты/удаления платежейPOST/DELETE /credits/{id}/payments* - OpenAPI: endpoints
/stats/*(сводка, категории, периоды, поиск, контекст;GET /stats/by-subcategory— только API, в UI не используется) - OpenAPI:
GET /stats/by-period— формат ключейperiod, сортировкаitemsпо убыванию даты - OpenAPI: поведение in-memory кеша веб-клиента для справочников (
/banks,/categories,/debtors) - OpenAPI:
POST /debts/{id}/settle— телоSettleDebtRequest(affects_balance,account_idнезависимы от флага долга при создании) - OpenAPI:
PUT /transactions/{id}— тип операции должен совпадать с существующим (ERR_TX_TYPE_CHANGE); дата в будущем переводит вkind=future; операции сcredit_payment_linkedредактируются через кредит, не через transactions - OpenAPI:
POST /credits/{id}/payments— опциональныйaccount_idдля счёта данной оплаты - Справочники UI: docs/ui-row-actions.md —
RowActionsMenu(счета, категории, операции на главной),FilterPanel; docs/ui-stats.md — страница/stats; docs/ui-api-cache.md — кеш справочников; docs/ui-dialogs.md — погашение долга; docs/ui-credits.md — оплата кредита, счёт платежа; docs/transactions-display.md — редактирование операций; docs/categories-and-icons.md — раскрытие категорий, главная в меню
Исправлено
Кредиты
- Создание ипотеки и предпросмотр графика: ошибки валидации возвращают 400 вместо 500
- Отрицательный последний платёж в длинном графике ипотеки
- Предпросмотр графика в форме создания: при ошибке предыдущие строки не сбрасываются
- Ручной платёж, совпадающий с расчётным в пределах 1 ₽, трактуется как автоматический (без лишнего override)
- Пустой график при корректном расчёте платежа (гонка запросов / ложный
UserSetPaymentдля ипотеки) - Исправлен регресс: платёж по кредиту с будущей датой снова корректно влияет на прогноз баланса текущего месяца (главная и страница счёта)
- Устранён преждевременный перевод
future-операций кредита вmanualдо наступления даты операции
Инфраструктура
- Docker: исправлен
permission deniedпри записи в/app/logs/auditна bind mounts, созданных Docker от root
UI/UX
- Веб-интерфейс по HTTP (не localhost, например
http://192.168.x.x): страницы не зависали на «Загрузка…» —RowActionsMenuи импорт больше не требуютcrypto.randomUUID(недоступен вне secure context); используется$lib/random-id - Дополнительно стабилизирован
DateTimePicker: высота календаря и поле даты больше не «скачут» между месяцами и состояниями - Исправлены вкладки на странице должника: единый стиль
PageTabsвместо кнопокbtn-primary/btn-ghost - Исправлены фильтры на десктопе: после спойлера на мобильных панель на широких экранах снова всегда видна (
FilterPanel+matchMedia) - В меню кредита пункт «Изменить банк» отображался с иконкой галочки (
save) вместо иконки банка
Техническое
- Тесты backend/frontend и OpenAPI-проверки синхронизированы с контрактами
v1.2.1 $lib/stats-period.ts— форматирование подписей периодов на странице/stats- Версия
1.2.1
Коммиты
Changelog
- d315001 - Исправлена сборка docker (права на лиректории) - Исправлена незагрузка некоторых страниц
- 705d962 Release v1.2.1
Docker
Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.1. При необходимости: cp .env.example .env.
docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.1
docker compose -f docker-compose.yaml up -dИли без compose:
docker run -d --name buhgalter \
-p 8765:8765 \
-v buhgalter-data:/app/data \
-v buhgalter-backups:/app/backups \
--restart unless-stopped \
ghcr.io/kai-zer-ru/buhgalter:1.2.1