Skip to content

v1.2.1

Choose a tag to compare

@github-actions github-actions released this 27 Jun 04:08

[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.mdRowActionsMenu (счета, категории, операции на главной), 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