buhgalter

Тип проекта: личный проект

Бухгалтер: Self-hosted личная бухгалтерия

Звезды: 2
🍴Форки: 1
🔄Обновлен: 8 июл. 2026 г.
📰 Релизы
Релиз: v1.3.2 (08.07.2026)

[v1.3.2] — 2026-07-08

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/.

Добавлено

Кредиты

  • Переключатель «Первый платёж сегодня» для потребительского кредита и рассрочки (first_payment_today в POST /api/v1/credits и preview; не для ипотеки) — первый платёж в дату выдачи, далее по payment_interval (ui-credits.md)
  • Ответ POST /api/v1/credits/schedule/preview: effective_monthly_payment, effective_monthly_payment_display, user_set_monthly_payment — отдельно от автоматического calculated_monthly_payment

Изменено

Кредиты

  • Ручной ежемесячный платёж: при явном сохранении введённая сумма всегда применяется; без override — только точное совпадение с расчётом (или целые рубли, совпадающие с усечённым расчётом). Убран допуск ±1 ₽, из‑за которого ручной ввод мог сбрасываться

UI/UX

  • TransactionForm: порядок полей при создании дохода/расхода — счёт → категория → подкатегория → сумма → описание → дата → время (transactions-display.md)
  • /budget: компактная шапка на мобильных — кнопки ←/→ 44×44, фиксированная ширина блока месяца, «Скопировать» / «Добавить» / переключатель месяца в одной строке с заголовком (ui-budget.md)

Техническое

  • API/OpenAPI: first_payment_today, расширенный CreditSchedulePreviewResponse
  • Unit: schedule_test.gofirst_payment_today, разрешение ручного платежа
  • docs/release-notes-v1.3.2.md
  • Версия 1.3.2

Коммиты

Changelog

  • 6ddb8dd81d0e3b7a127759ce29e9e27a127bd0a3 release 1.3.2
  • b879f229cb77ef418a291e97175e77360f76b956 Вёрстка в бюджете (мобюилка)
  • 6a5fc9eb3f67aa87bb25b79e228f444262f81ce7 Окно "Расход"/"Доход" - порядок ввода
  • 67ad7e1dcfc16a2c44cfc41cde9627595f2c544b Фикс добавления кредитов

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.3.2. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.3.2
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.3.2
Релиз: v1.3.1 (03.07.2026)

[v1.3.1] — 2026-07-03

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/.

Добавлено

Категории

  • Иконка «Караоке» (микрофон) в каталоге расходов (categories-and-icons.md)
  • Системная категория «Перевод» (is_system, иконка transfer, без подкатегорий) — только переводы между своими счетами; legacy-данные в пользовательской «Перевод» мигрируются в «Переводы» при старте (categoryseed.EnsureTransferCategory)

UI/UX

  • Пункт «Операции» в верхнем меню → /transactions (ui-navigation.md)
  • Иконки в Select / Combobox: счета (AccountIcon), категории и подкатегории (CategoryIcon) — $lib/select-options.ts, SelectOptionIcon.svelte
  • Универсальный TransactionList + TransactionCategoryCell: колонка «Категория» — иконка Категория → иконка Подкатегория; единая вёрстка на главной, /transactions, странице счёта, /stats, /debtors/[id] (transactions-display.md)

Изменено

UI/UX

  • /transactions: плановые и прошлые операции — в отдельных спойлерах (как на главной); пагинация только у прошлых
  • Главная и /accounts: блоки «Мои средства» и «Кредитные средства» — наличные и банки в одной сетке, кредитные карты отдельно; на главной — спойлеры, на /accounts — заголовки без спойлеров (ui-credit-cards.md)
  • Автопополнение: индикатор на карточке счёта — Автопополнение: {имя счёта списания}; при выключенном автопополнении строка скрыта (ui-balance-maintenance.md)
  • Бюджет: адаптивная вёрстка формы создания/редактирования по области (all_expense / category / subcategory) — ui-budget.md
  • Страница должника: блок «Последние операции» (бывш. «Связанные операции») на общем TransactionList без колонки «Категория»
  • Форма дохода/расхода: поле «Новая подкатегория» скрыто, если в селекте уже выбрана подкатегория

Исправлено

UI/UX

  • Редактирование операции: календарь DateTimePicker с usePortal открывается вверх, если снизу не хватает места (ui-dialogs.md)

Техническое

  • API: subcategory_icon, category_is_system в обогащении Transaction
  • Unit: select-options.test.ts, categoryseed/transfer_test.go, dropdown-position.test.ts
  • e2e: z-navigation.spec.ts (пункт «Операции»), transaction-actions.spec.ts (спойлеры плановых/прошлых), dashboard-accounts.spec.ts, accounts-management.spec.ts, budget.spec.ts (вёрстка формы)
  • docs/release-notes-v1.3.1.md
  • Версия 1.3.1

Коммиты

Changelog

  • 9aaa80e785983a9c67e1b516edca734f5714c4a0 v1.3.1
  • 9946a4df34875dbed4072cb47ba81ff9a6414270 UI главной и счетов
  • dfbb0e9ca055b0a39c6c8a908c88b1b158156672 UI-правки бюджета
  • 48629b4f03f9e9a58397d34dcdb7e4616eacc260 Список операций: UI
  • 28709e9951315a15cd822c9079be8934d37ab063 UI-окно добавления операции: Подкатегории
  • 77f92d472ebc34b83c7fb0167f5b13d19c3e0317 Вёрстка списка счетов
  • dd1440af7d663be4d714039928662dcbc2df6e1d Переводы
  • e87fb62e1999ce9dd1029ce15f325bfcbd48c5b6 Иконки в выпадающих списках
  • 85db9b3e676e4ca62490489c4dd1bb74e8ed3ca8 Автопополнение UI
  • 6f6a684994fc16a60e22e767e23fef49dfa04fc0 UI-правки страницы операций. Добавил её в верхнее меню.
  • cb655a7ef474ef36ecf00b6318ec782f746dd224 Исправление положения календаря в окне "Редактировать операцию"
  • c28a9a68c6da62c03964a7055dd0131272a4f89f Иконка "Караоке"

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.3.1. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.3.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.3.1
Релиз: v1.3.0 (02.07.2026)

[v1.3.0] — 2026-07-02

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/.

Добавлено

Пользователи и админка

  • Статус пользователя: active / pending / banned; саморегистрация → pending без сессии; PUT /api/v1/admin/users/{id}/status; меню «⋯» в /admin/users; плашка и попап ?moderate=; уведомление админам user_registration (api/user-status.md, миграция 029_user_status.sql)

Счета

  • Кредитная карта (type=credit_card): лимит, счёт погашения, блок credit_cards_summary на главной, «Оплатить» / «Списать комиссию», импорт Cubux (ui-credit-cards.md, 033_credit_card_accounts.sql)
  • Архивация и мягкое удаление: archived / deleted, автоперевод остатка для cash/bank, правила для credit_card, вкладки «Архивные» / «Удалённые» (accounts-archive-delete.md, 040_account_deleted_status.sql)
  • Автопополнение (bank): порог, цель, счёт списания; hook после операций; уведомление auto_topup_disabled (balance-maintenance.md, 041_account_auto_topup.sql)

Кредиты

  • Учёт суммы займа в балансе при создании потребительского кредита: principal_affects_balance, операция дохода на debit_account_id; блокировка при платеже в графике с датой в прошлом (031_credit_principal_income.sql)

Бюджет

  • Помесячные лимиты (scope: category / subcategory / all_expense), copy_forward, CRUD и GET /budgets/summary; страница /budget; виджет на главной; колонки в /stats; триггер budget_threshold (budget.md, ui-budget.md, миграции 034039, 036, 037)

Уведомления

  • Недостаток средств: trigger_negative_balance, шаблон balance_shortfall, суффикс к credit_payment / planned_operation / debt_* (notifications.md, 032_notification_balance_shortfall.sql)
  • Ссылки в шаблонах: {debt_url}, {credit_url}, {transaction_url}, {budget_url}, {moderation_url} и др. — urls.go

UI/UX

  • MoneyDisplay — единый компонент read-only сумм; formatMoneyForDisplay для i18n (transactions-display.md)

Изменено

UI/UX

  • Верхнее меню: пункт «Бюджет»; на мобильных — drill-down подменю «Настройки» / «Админка» вместо длинного accordion (ui-navigation.md)
  • Главная: счета под спойлером на < sm; индикатор автопополнения у bank-счетов
  • /stats: блоки «По категориям» и «По периодам» — full-width строками (категории выше периодов); сводка без колонки «Разница» (ui-stats.md)
  • Ширина контента на десктопе: max-w-5xl (80rem, --container-5xl в layout.css)
  • Категория дохода «Кредиты» при principal_affects_balance — суффикс «(Доход)» в фильтрах и статистике

Backend

  • Доменный SQL — через sqlc (server/queries/); CI make inline-sql-check (sql-access.md)

Исправлено

Уведомления

  • {settings_url} в шаблоне test — канонический путь /settings/notifications (не устаревший ?tab=)

Долги

  • Удаление операции «Взял/Дал в долг»: единственная начальная операция удаляет долг; погашение — пересчёт остатка; начальную операцию нельзя удалить при наличии погашений (debt/transaction_delete.go)

Техническое

  • Миграции 029041
  • Unit: money-display.test.ts, credit-card.test.ts, account_delete_test.go, notify/balance tests
  • e2e: budget.spec.ts, budget-home.spec.ts, budget-stats.spec.ts, credit-card.spec.ts, credits-principal-income.spec.ts, accounts-management.spec.ts, dashboard-accounts.spec.ts, admin-advanced.spec.ts (модерация)
  • docs/release-notes-v1.3.0.md
  • Версия 1.3.0

Коммиты

Changelog

  • 0e3eb8d7f07b2b84ff89074a002744e8447c7e3c v1.3.0
  • 9a39c9f192afb4de2490e57ef08775f4b321a512 Merge branch '1.3.0' into master
  • e5fe1eaab17ef8e75d419bfd60289f5be9d58f1a Автопополнение одного счёта с другого
  • afeaa437af219b05071a3b2aa430c0264db58f26 Сделал основной размер страницы шире для десктоа
  • 88790d6ab21c719af1ec12012a00c1eb14b77648 Удаление/архивация счетов. Переработка логики.
  • eb1e1b22215bdea11d6f12820591544e3eda78f9 Меню в мобильной версии
  • c52b2b4d563db943a96db34b9672d39db5d8ae97 Перевёрстка /stat
  • 4405a006fa82567530c7cb8ac93dd4b93bc70097 На главной (в мобильной версии) счета скрыты под спойлер
  • 459248df60abf5c20d7be1519097ca757fd67c5a Единый компонент отображения сумм
  • 6646f4973ea0be631237702581e6146cb16059bf fix after merge
  • 5de25df691d5e9be91fd509d4618cc769b958eee Merge branch 'master' into 1.3.0
  • f5a36d987c8e1ddb28943ee8ede8b5564ef369c3 Бюджет. Доделки
  • 9f820636602fe4f0257f69156b18948f2217cb1c Бюджет
  • eebd477321b345606ce0adad1c29afb1d9d06472 1. Добавлен тип счёта "Кредитная карта" 2. Восстановлена страница "Архивных" счетов
  • cdacf71f0168fc2a4f274cf9a3cdee94b880395c Исправлен баг при удалении операции долга. Операция удалялась, долг оставался
  • b3572e1188fef39fad075e2686e75b0bbc4a2a9c Уведомления: Сообщение об отрицательном балансе, настройки, UI-доработки, URL в уведомлениях
  • f92ac36362ac92bebe98521ddffa210d4295ba56 Merge branch 'v1.3.0' into master
  • 42eee9818bc575877a20dc4c41eb65f23be5db2e Учёт денег кредита в балансе (типа кредит наличными)
  • 3f548f1591c241d64fca96dea518e9c70afe1744 SQL-спецификации, вынос SQL из основного кода Go
  • ed47c59ced04e67f8c5ffd380983a7197292bfe8 Статус пользователя — модерация регистрации, блокировка, меню «⋯» в админке, уведомления админам и плашка
  • 3fa9436c8911476f861f44ecf9352d64c8e0e456 Фильтр запросов, уменьшение нагрузки на логи

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.3.0. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.3.0
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.3.0
Релиз: v1.2.5 (01.07.2026)

[v1.2.5] — 2026-07-01

Добавлено

UI/UX

  • In-app toast: единая кратковременная обратная связь внизу справа — успех, ошибка, предупреждение, информация; API toast.success / toast.error / toast.fromError (ui-toast.md)
  • Многоуровневое меню: выпадающие «Настройки» и «Админка» в шапке (NavDropdown); настройки и периодические операции — отдельные маршруты /settings/* (ui-navigation.md)
  • DateTimePicker: параметр blockPastIncludingToday — в календаре недоступны сегодня и прошлые дни; константа futureDateOnlyPicker для форм с датой только в будущем (date-time-display.md)

Изменено

UI/UX

  • Настройки разбиты на отдельные страницы (/settings, /settings/password, …) с layout и крошками; вкладки вынесены в ProfileTab, PasswordTab, TokensTab, NotificationsTab; админка — только /admin/*; старые URL с ?tab= и /import, /recurring-operations не поддерживаются
  • Верхнее меню: пункт «Главная» убран (переход на дашборд — по клику на название приложения); в хлебных крошках «Главная» сохранена; крошки админки — «Главная / Админка / …» (без «Настройки»)
  • Главная: плановые операции в спойлере «Плановые» — сортировка по дате убыванию (от новых к старым), как у прошлых
  • Ошибки и успехи действий (сохранение, удаление, валидация при submit) выводятся через toast вместо inline-текста под формами; подсказки у полей и постоянные баннеры без изменений
  • Удалён компонент FormFeedback

Исправлено

UI/UX

  • API-токены: при создании с явной датой истечения нельзя выбрать сегодня и прошлые дни в календаре — минимум завтра в TZ пользователя (futureDateOnlyPicker на /settings/tokens)

Техническое

  • Unit: web/src/lib/toast.test.ts, web/src/lib/api/errors.test.ts, web/src/lib/datetime-picker.test.ts
  • e2e: toast.spec.ts — toast success/error; z-navigation.spec.ts — выпадающее меню настроек, крошки; transaction-actions.spec.ts — сортировка плановых на главной; settings-extended.spec.ts — API-токены
  • docs/release-notes-v1.2.5.md, ui-toast.md, ui-navigation.md, date-time-display.md, transactions-display.md
  • Версия 1.2.5

Коммиты

Changelog

  • bb6a9f2fdbbad68756953ed92a400154ee54cae6 документация
  • 248ebcffcfd72c0d01312f375026b02f29a27a23 Перестройка верхнего меню. Добавлены выпадающие меню
  • 03abca04825d35e7a6d9a4b311a538f62f18643e 1. Поправлен баг с добавлением токена: Срок действия заканчивался в прошлом 2. Сортировка в плановых операциях на главной, от новых к старым.
  • 780ca23f26c4173297bafcbfb32d01b30f111782 Переработка системных уведомлений на фронтенде (не путать с уведомлениями в мессенджеры)

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.5. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.5
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.5
Релиз: v1.2.4 (01.07.2026)

[v1.2.4] — 2026-07-01

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/.

Добавлено

API

  • API-токены: поля never_expires и expires_at (RFC3339) в POST /api/v1/user/tokens; по умолчанию срок действия — 30 дней; бессрочный токен (never_expires: true) — в UI предупреждение о риске; отозвать можно только свой токен (чужой — 404 NOT_FOUND). См. docs/api/authentication.md

UI/UX

  • DateTimePicker: кнопка «Сегодня» в календаре — быстрый выбор текущей даты
  • Пагинация: компонент TransactionPagination — единые кнопки «В начало / Назад / Вперёд / В конец» на /transactions, странице счёта, графике кредита и превью графика (ui-pagination.md)

Изменено

UI/UX

  • Форматы даты и времени: единые правила отображения по всему UI — дата 31.12.2026, дата-время 31.12.2026 12:00:00; в списках операций, долгах, кредитах, периодических операциях и плейсхолдерах уведомлений {date} / {requested_at}без секунд (31.12.2026 12:00). Константы: web $lib/dates.ts (DISPLAY_*_FORMAT), Go timeutil/display.go (Display*Layout); гайд docs/date-time-display.md
  • DateTimePicker: кнопка пикера и стандарты operationDatetimePickerCreate / Edit, dateOnlyPicker — подписи в формате дд.мм.гггг / дд.мм.гггг чч:мм
  • Главная: блоки «Общий баланс» и «Долги» — в одной строке на десктопе (sm:grid-cols-2); на мобильных — два отдельных блока
  • Главная — последние операции: плановые (kind=future) и прошлые (kind=manual) — в спойлерах <details> по 10 записей; плановые сверху, свёрнуты по умолчанию; прошлые — открыты; внизу карточки — кнопка «Все операции» (transactions-display.md)
  • Настройки → уведомления: каждый шаблон — отдельная карточка с кнопкой Сохранить (без общей формы на все шаблоны сразу); предпросмотр и сброс — в карточке шаблона
  • Админка — диагностика и бекапы: build_time и created_at через formatAPIDateTimeForDisplay (с секундами), а не сырой RFC3339
  • Админка: компонент AdminSupportLinks — ссылки «Поддержать проект» и «Репозиторий» на /admin/* и в Настройки → Администрирование → Система
  • Хлебные крошки: на всех разделах и вложенных экранах — цепочка от «Главная» через раздел (счета, настройки, админка и т.д.); в настройках и админке учитываются вкладки (ui-navigation.md)
  • Уведомления — сброс пароля (Telegram/MAX): в сообщении о запросе сброса пароля — ссылка для перехода к сбросу (/admin/users?reset=…); если внешний URL не настроен — текст «настройте внешний URL в админке». В редакторе шаблонов доступен плейсхолдер {reset_url}

Backend

  • Уведомления: форматирование плейсхолдеров даты/времени через timeutil.FormatDisplay* в часовом поясе пользователя; {date} и {requested_at} — без секунд
  • Уведомления — сброс пароля: плейсхолдер {reset_url} в шаблоне password_reset — ссылка на /admin/users?reset={user_id} при настроенном external_url, иначе подсказка настроить внешний URL в админке
  • Экспорт Cubux (CSV): суммы в колонках «Сумма списания» / «Сумма пополнения» — десятичное число (237.97), без суффикса _-₽; импорт по-прежнему принимает оба формата (import/cubux.md)

Сборка и релиз

  • Docker (GHCR): provenance: false в release.yml — образы снова корректно отображают платформы linux/amd64 и linux/arm64 (раньше из-за attestation manifests в GHCR показывалось unknown/unknown)

Исправлено

UI/UX

  • Админка — сброс пароля: модальное окно при переходе по ?reset= из уведомления закрывается по «Отмена»; параметр reset снимается с URL, повторное открытие блокируется (dismissedResetQuery в /admin/users)

Техническое

  • Unit/integration: internal/user (handler, tokens), auth_integration_test — создание/отзыв API-токенов, never_expires, expires_at, отзыв чужого токена; internal/auth/session_test.go
  • Unit: server/internal/timeutil/display_test.go, web/src/lib/dates.test.ts, web/src/lib/datetime-picker.test.ts, server/internal/notify/formatter_test.go, server/internal/importexport/cubux_test.go
  • e2e: date-time-display.spec.ts — формат даты в списке операций и build_time в диагностике; admin-advanced.spec.ts — закрытие сброса пароля по «Отмена», ссылки поддержки; settings-extended.spec.ts — API-токены; transaction-filters.spec.ts, transaction-actions.spec.ts — главная и пагинация
  • docs/release-notes-v1.2.4.md, date-time-display.md, transactions-display.md, ui-pagination.md, api/authentication.md, import/cubux.md
  • Версия 1.2.4

Коммиты

Changelog

  • ff7c8c9d68929198d9f45d28cbd7191c4bc8b8de API-документация
  • a459c04d726c119c9a737487d47ff5d6aa49d3b0 Документация
  • abc2bad9c84e6cf3933a038f44647cbacad11730 UI страницы настроек уведомлений
  • c9904ad5755f1e3b53fd3a2cddcfb2f66b8121dc Пагинация - вынесена в отдельный компонент
  • eeff5e3ef45c85b6c7585fd5cb25f6005a4724e7 Правки экспорта; UI главной страницы и списка операций
  • c50f133d9467418bdf6bf6874b4028886ee2a7b9 Ссылка на страницу сброса пароля в уведомлениях
  • fa88325ac10455dd6949d1c267d8afbc650d6905 API-токены: дата истечения, бессрочные токены. Тесты
  • 369857d9aedee7284b17d0247a5fdc288ef7a92f Пересборка документации
  • 12d5910f60867148b04a48df7c297d5287abf29d docker-release fix
  • 443a6cee13cb02ec02fa7f7bab6654cae5b0641d Кнопка "Сегодня" в календаре. Мелкие UI исправления
  • f8ffef21aa2754076caf783945dbccdf8503e10b Хлебные крошки
  • b4cefca86c9e0249676ca99087c10ce1461bd271 Окно сброса пароля - закрытие по кнопке "Отмена"
  • 7a3fced4e1cfddf8b31bad8bd41e2f142dbf14f5 Привёл в порядок отображение даты и времени
  • f3411c83876d56dff7f7bbfd23edb612f071cd94 UI админки: мелкие правки. Стандартизированный формат вывода даты-времени

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.4. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.4
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.4
Релиз: v1.2.3 (30.06.2026)

[v1.2.3] — 2026-06-30

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/.

Добавлено

UI/UX

  • Список операций (главная, /transactions, страница счёта): пункт меню «⋯» Повторить — форма новой операции с полями из выбранной строки (счёт, категория, сумма, описание; для перевода — счета, сумма, комиссия) и текущей датой; работает для дохода, расхода и перевода; недоступно для системных категорий и платежей по кредиту (TransactionForm / TransferForm, prop repeatFrom)

Изменено

UI/UX

  • Периодические операции (/recurring-operations): время выполнения по умолчанию — 08:00 в часовом поясе пользователя (раньше 00:00; UI и API при пустом time_local)
  • Поля суммы (MoneyInput): пустое и нулевое значение не отображается как 0.00 — показывается placeholder 0.00; при blur нулевой ввод очищается (formatMoneyForInput, formatMoneyInput); единообразно в формах счетов, операций, переводов, кредитов, долгов и периодических операций
  • Форма перевода: на странице счёта в «Откуда» подставляется текущий счёт; на главной и в «Все операции» — основной
  • Форма перевода: выбранный в одном поле счёт не показывается в противоположном селекте («Откуда» / «Куда»); при совпадении значений автоматически подбирается другой счёт (transferAccountOptions, pickOtherAccountId в $lib/transfer-accounts.ts)

Исправлено

Backend

  • Периодические операции: после автоматического создания операции планировщиком вызывается accountbalance.Refresh — пересчитывается current_balance счёта. Раньше транзакция появлялась в списке, но баланс не менялся (с v1.2.2 баланс денормализован и требует явного refresh)
  • Автосписание кредита: операция сохраняется с датой/временем из debit_time_local в часовом поясе пользователя (paymentTransactionDate; раньше в БД попадало 00:00)

UI/UX

  • Кредиты: в графике платежей и списке кредитов дата следующего платежа показывается с временем автосписания (formatCreditPaymentDateForDisplay, debit_time_local), а не полуночью

Техническое


Коммиты

Changelog

  • 7d9eec79b3fc743bca72acda46fe5fe66ad92b78 UI правки: placeholder в суммах, текущий счёт "Откуда" на странице счёта при добавлении перевода
  • 6d313979fc6a7ebbd40c6eb3ebdcaf87efc8ee49 Исправлено время в разделе "Кредиты"
  • c99b3ae039c215ef84a0b31ab3890a908e8e140d Исправлен баг: периодическая операция появляется в списке операций, но баланс не изменяется
  • 2a185b2cf24b345773a9c2d6ff47786b30c9975f Время в "Периодических операциях" по умолчанию 8:00
  • 643aaa0823891f6dd826dbf3f28b8677768afac0 Правки UI: Окно перевода, список счетов
  • 2144e26ecefb3ee0d46164470643b17b5f3b4f9a "Повторить" в операциях

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.3. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.3
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.3
Релиз: v1.2.2 (29.06.2026)

[v1.2.2] — 2026-06-28

ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ БЕКАП! Перед обновлением сохраните копию базы (data/buhgalter.db) и каталога backups/.

Добавлено

Обновления

  • GET /api/v1/version/check — сравнение текущей версии с последним релизом на GitHub (кеш на сервере 24 ч)
  • Веб-клиент: раз в сутки проверка обновления; модальное предупреждение о бэкапе и release notes — только для администраторов; ссылка «скачайте бекап» → Настройки → Админка → Бекапы

Производительность и API

  • Миграция 028: колонка accounts.current_balance — денормализованный баланс счёта; индекс idx_tx_user_account_balance на transactions
  • accountbalance — пересчёт и хранение current_balance при изменении операций; BackfillAll при миграции
  • Пакетные SQL-запросы для дашборда и прогноза (ForecastsByUser, агрегаты future-операций по всем счетам за один проход)
  • In-memory кеш GET-ответов на сервере (apicache): TTL 5 мин для справочников, 1 мин для остальных; инвалидация при любой мутации пользователя (docs/ui-api-cache.md)
  • GET /api/v1/ui/meta — агрегированные справочники для старта веб-клиента (счета, банки, категории, должники, кредиты); банки из ответа попадают в клиентский кеш на 24 ч

Фоновые задачи

UI/UX

  • Главная (/), Все операции (/transactions), страница счёта (/accounts/[id]): три кнопки-иконки Доход / Расход / Перевод (NewTransactionButtons, Font Awesome Solid: f067, f068, f0ec); подписи только в title / aria-label
  • На странице Все операции добавлена кнопка Перевод (раньше был только доход/расход через общую «Операция»)
  • Форма новой операции (TransactionForm): переключатель типа убран — тип задаётся кнопкой; заголовок модалки «Доход» или «Расход»; при редактировании тип по-прежнему только текстом
  • На странице счёта кнопки операций вынесены из меню «⋯» в шапку карточки (десктоп); на мобильных — в меню «⋯»; в меню — редактирование, основной, архив, удаление
  • /stats → «По категориям»: отдельные секции доходы и расходы; процент считается внутри каждого типа

Изменено

Производительность

  • Баланс счёта читается из current_balance, а не пересчитывается на каждый запрос
  • ActivateDueFutureTransactions убран из hot-path List, DashboardForUser, stats.Summary — активация только в фоне

UI/UX

  • Блок контекстной статистики операций и /stats: поле «Разница» убрано (дублировало баланс)
  • Баннер запросов сброса пароля у администратора: загрузка GET /admin/password-reset-requests один раз при монтировании, без повторных запросов на каждую навигацию

Документация и контракты

  • OpenAPI: уточнено описание percentage в StatsCategoryItem; схема UIMetaResponse для GET /ui/meta
  • docs/ui-api-cache.md — серверный in-memory кеш GET; клиент кеширует только статические банки

Исправлено

UI/UX

  • Страница счёта: клик по счёту-контрагенту в строке перевода корректно открывает страницу другого счёта (в обе стороны — и «с», и «на»)

Техническое

  • Расширено покрытие e2e-тестами (счета, операции, фильтры, импорт, кредиты, долги, админка, perf-сценарии)
  • make prepare — автофикс Go (golangci-lint fmt, golangci-lint run --fix), web (npm run lint:fix) и генерация (sqlc, OpenAPI, иконки категорий)
  • Версия 1.2.2

Коммиты

Changelog

  • 96c34cf13d0f59ba1ae3593fa4de993d6826e5e2 docs
  • 823f59e25d69d5dfe273008b2e81d65e6c1632f4 Активация future-операций в фоне
  • 6a4f1623540b2d57e20b135818b5eb01480659c6 Страница счёта - клик на другой счёт в переводах
  • bbf751c8738b35c05986c4e732f33659b573816e Убрать поле "Разница", дублирует баланс
  • eb3349af0827e1e8aaea0bb493303f0951711bd3 отключить постоянные запросы api/v1/admin/password-reset-requests
  • 69961b2371b18798a230b833fd0e6811b6f9bf9d - линтеры для go и web - команда make prepare
  • a8afbaf36775510961ccee94302703cd3c9f99f3 - оптимизирована работа с базой данных - добавлен серверный кеш - более полное покрытие проекта e2e тестами
  • 323e7641bf8b47501a2489f1f6bda79a2b3dae48 - добавлена проверка обновлений (раз в сутки) - Кнопки создания операций разделены (доход, расход, перевод) на страницах: Главная, Счёт, Список операций - На страницу счёта кнопки создания операций вынесены из меню на смтраницу - На странице списка операций добавлена кнопка "Перевод" - В мобильной версии на странице счёта кнопки добавления операций убраны в меню - Окно создания операции - убран тип операции - Обновлены e2e-тесты - Переработан ROADMAP

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.2. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.2
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.2
Релиз: v1.2.1 (27.06.2026)

[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

  • d3150019807a4a7b8f639e576c7dbdd6c6e7ffe6 - Исправлена сборка docker (права на лиректории) - Исправлена незагрузка некоторых страниц
  • 705d96206692b440d2184f28ba11c3b39eb00ea8 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
Релиз: v1.2.0 (26.06.2026)

[v1.2.0] — 2026-06-26

Добавлено

Кредиты и ипотека

  • Локальное время автосписания debit_time_local (HH:MM) в API/UI; автосписание включается переключателем, при включении по умолчанию подставляется 00:00 (для отключения передаётся null)
  • Автосписание через scheduler по дате платежа и debit_time_local; при создании кредита больше не предсоздаются массово будущие транзакции
  • Модалка управления автосписанием на странице кредита (переключатель + время)
  • Переключатель автоплатежа в форме создания кредита (с дефолтом 00:00)
  • Поля банка кредита bank_id, bank_name в API/UI
  • Тип кредита mortgage (MVP): property_price, down_payment, опция «не списывать взнос с баланса», расчёт property_price - down_payment
  • Отдельный счёт взноса down_payment_account_id (если не указан, используется debit_account_id)
  • Для ипотеки в UI фиксирована ежемесячная периодичность (month)

Периодические операции

  • Новая сущность и страница /recurring-operations; периоды: неделя / 2 недели / месяц / год; создание из существующей операции
  • В списке операций для системных категорий скрыто действие «Сделать периодической»
  • Перестроен layout формы: сначала список, затем кнопка «Добавить» с раскрытием; редактирование inline (одна открытая форма)
  • Из селектора исключены системные категории
  • Поле подкатегории всегда отображается (если список пуст, контрол disabled с )
  • Для периода month день берётся из start_date, поле day_of_month в UI скрыто

Setup и счета

  • Восстановление БД из .db-бэкапа на странице первичной настройки (POST /api/v1/setup/restore)
  • Действие «сделать основным» добавлено на список счетов (индикатор — синяя галочка у имени)

Уведомления

  • Admin-only триггер password_reset: новый тип шаблонов и настройка только для администраторов

Изменено

Кредиты

  • Иконки банков в списке и карточке кредита
  • Пагинация для длинных графиков платежей (вместо «показать ещё»), включая форму создания кредита
  • Оптимистичный UX оплаты: после «Оплатить» интерфейс сразу отражает изменения и блокирует редактирование графика до ответа сервера
  • Сортировка кредитов приведена к «новые → старые»
  • Страница деталей кредита: бейджи типа, редактирование имени, блок данных в 3 колонки, иконки действий вместо текстовых кнопок
  • Унифицирован денежный формат в кредитах (разделители тысяч + валюта)

UI/UX

  • Стабилизирована высота календаря
  • Внедрены хлебные крошки
  • Обновлены стили кнопок и вкладок
  • Триггеры уведомлений отображаются компактным вертикальным списком
  • На главной и странице счёта: текущий баланс + баланс с учётом future в текущем месяце (прогноз скрывается, если равен текущему)
  • Админ-раздел перенесён в «Настройки → Админка»

Документация и контракты

  • Описания BUHGALTER_STATIC_EMBED и BUHGALTER_CORS_ORIGINS приведены к фактическому runtime-поведению
  • Синхронизированы спецификации OpenAPI 1.2.0; добавлено поле transaction.category_is_system и описание ограничения для плановых операций системных категорий
  • ru/en локали снова встроены в серверный бинарник; типовой запуск больше не требует BUHGALTER_LOCALES_DIR

Исправлено

Кредиты и прогноз

  • Исправлен регресс: будущий платёж по кредиту (оплата датой в будущем) снова корректно учитывается в прогнозе баланса на главной и на странице счёта в рамках текущего месяца
  • В активации future-операций кредита устранён преждевременный перевод в manual до наступления даты операции

Навигация и счета

  • Исправлен переход на страницу счёта и загрузка страницы при прямом открытии URL
  • Восстановлено действие «сделать основным» на странице счёта

Операции

  • Для системных категорий (кредиты, долги и другие служебные категории) запрещено создавать и обновлять операции с kind=future — backend возвращает ошибку валидации (ERR_SYSTEM_CATEGORY_PLANNED)

UI/UX

  • Дополнительно стабилизирован DateTimePicker: высота календаря и поле даты больше не «скачут» между месяцами/состояниями

Техническое

Миграции

  • 024_credit_bank_and_debit_time
  • 025_notification_password_reset_trigger
  • 026_recurring_operations
  • 027_credit_mortgage_fields

Качество и релиз

  • Тесты backend/frontend и OpenAPI-проверки синхронизированы с контрактами v1.2.0
  • Версия 1.2.0

Коммиты

Changelog

  • f945f4c8a6af67ef1f8f4961aae4157392f2f657 Ещё несколько багов попутных, с календарём, регрес небольшой был, исправлен
  • 7b6d2c7bafa108abd91094e09c6e640aab6881eb Доработки по кредитам. e2e тесты
  • 59b7b934ada1ac4227d900b6f44e860a50c5aabb v1.2.0: добавлена ипотека и периодические операции, доработаны кредиты, добавлено восстановление базы в setup, локали встроены в бинарник

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.2.0. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.2.0
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.0
Релиз: v1.1.1 (25.06.2026)

[v1.1.1] — 2026-06-25

Добавлено

  • Поддержка .env файла — переменные окружения читаются из .env рядом с бинарником или docker-compose.yml; BUHGALTER_ALLOWED_HOSTS для доступа с удалённого сервера без reverse proxy (localhost/127.0.0.1 доступны всегда)
  • Документация OpenAPI без авторизации — страница /docs (Redoc) и /docs/openapi.yaml доступны без входа; в README добавлены ссылки на демо-стенд

Изменено

  • Счета — пункт «Счета» перенесён из вкладок Настроек в верхнее меню навигации; страница /accounts теперь показывает список счетов (раньше редиректила в Настройки)
  • Курсор — при наведении на все кнопки и кликабельные элементы теперь отображается указатель (рука) вместо стрелки
  • Высота кнопки «Новый счёт» на главной — приведена к единой высоте с иконкой-кнопкой «+»
  • Расстояние между «Админка» и именем пользователя в шапке увеличено на 5px

Исправлено

  • Подсветка активного раздела в верхнем меню

Техническое

  • Версия 1.1.1

Коммиты

Changelog

  • fe7076612b5b39176fc57ecfa417e1ed1ab9999a docker-compose.yaml (.env)
  • ba73722afadf040d1b0a7e9f709b13dc41bfb230 UI: - Счета переехали из Настроек в верхнее меню - Высота кнопки "Новый счёт" на главной выровнена с остальными - Верхнее меню: Кнопка раздела, в котором находишься - подсвечивается - Курсор при наведении на кнопки - рука

Docker

Вложения docker-compose.yaml, .env и .env.example — compose из репозитория; .env с BUHGALTER_IMAGE_TAG=1.1.1. При необходимости: cp .env.example .env.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.1.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.1.1
Релиз: v1.1.0 (25.06.2026)

[v1.1.0] — 2026-06-25

Добавлено

Сброс пароля (через администратора)

  • Страница входа: «Запросить сброс пароля» → POST /api/v1/auth/request-password-reset (при неизвестном логине — тот же успешный ответ, без перечисления учёток)
  • Баннер и список ожидающих запросов у администратора; подтверждение → POST /api/v1/admin/password-reset-requests/{id}/ack
  • Сброс пароля в админке → PUT /api/v1/admin/users/{id}/password с инвалидацией сессий пользователя
  • Таблица password_reset_requests (миграция 023); rate limit 5 запросов/мин с IP на endpoint сброса

Кредиты

  • Редактирование сумм неоплаченных платежей → PATCH /api/v1/credits/{id}/schedule (только kind=scheduled, is_applied=false; обновляются связанные future-операции)
  • При создании кредита задним числом: списание со счёта для хвоста ретро-платежей → поле retroactive_debit_count в POST /api/v1/credits (расход на debit_account_id, учёт в статистике)
  • Автодополнение укороченных графиков активных кредитов при старте (RepairShortSchedules; миграция-маркер 020)

Переводы и категории

  • Поле комиссии при переводе; расход в системной категории «Комиссия» (иконка percent)
  • Системная категория «Комиссия» для новых и существующих пользователей (backfill при старте)
  • При drag-order категорий системные остаются в конце; системную категорию нельзя назначить главной

Интерфейс

  • Мобильная адаптация: touch-targets 44px, карточки графика/операций, bottom sheet модалок, скролл вкладок, меню в шапке с пунктом «Счета»
  • Сброс формы при повторном открытии «Новый кредит»
  • В админке — блок доната и ссылка на репозиторий GitHub
  • Переключатели (ToggleSwitch) вместо чекбоксов: кредиты, долги, уведомления, импорт, фильтры, админка
  • Редактирование перевода из списка операций (страница счёта)
  • Фильтр категорий по типу операции (доход/расход) на /transactions, /stats, странице счёта
  • Суффиксы «(Доход)» / «(Расход)» у категорий с одинаковым именем (например «Долги»)
  • Иконка «Архивировать» на странице счёта (как у остальных действий)
  • Предупреждение при удалении оплаченного платежа по кредиту; подсказка в группе «Оплаченные» графика

Статистика и фильтры

  • Фильтры по дате без времени; границы суток в часовом поясе пользователя (/stats, /transactions, страница счёта)
  • /stats: автоприменение фильтров, поиск по описанию операций в блоке drill-down
  • Сводка на странице счёта: входящие переводы в «Доходе», исходящие в «Расходе» (согласовано с балансом)

Документация и демо

Изменено

  • Генератор графика с процентами: ровно term_months платежей; аннуитет 1…N−1, последний — остаток + проценты за период
  • Сортировка категорий в API: пользовательские, затем системные (sort_order, name)
  • OpenAPI 1.1.0: комиссия переводов, редактирование графика, retroactive_debit_count, password reset
  • Операции с флагом credit_payment_linked нельзя менять через PATCH /transactions/{id} — только на странице кредита
  • Поле суммы (MoneyInput): курсор не прыгает в конец при правке в середине числа

Исправлено

  • Укороченный график кредита (например 22 платежа вместо 36) — расчёт и восстановление при старте
  • Мобильное меню: перекрывалось контентом (z-index); не закрывалось при навигации
  • Форма создания кредита сохраняла данные предыдущего кредита без перезагрузки страницы
  • Статистика и список операций расходились по платежам кредита: прошедшие future-операции активируются при чтении; в SQL учитываются оплаченные платежи с exclude_from_stats=0
  • Сводка на странице счёта не учитывала входящие переводы в блоке «Доход»
  • Первоначальная настройка (POST /setup): повтор после частичного сбоя не давал 500 — восстановление маркера .configured, ответ 409 если БД уже настроена
  • Календарь (DateTimePicker): в конце месяца отображались дни 31–34 вместо дней следующего месяца; дни соседних месяцев в сетке теперь кликабельны
  • Тёмная тема: календарь, выпадающие списки и мобильное меню сливались с фоном (popover-panel)
  • Долги: дата операции и плановый возврат — только дата (без времени в форме и списках)
  • npm run check / vite build не обращались к API за allowedHosts (загрузка только при vite dev)

Техническое

  • Миграции: 020_repair_credit_schedules, 023_password_reset_requests
  • SQL: UpdateScheduledCreditPaymentAmount, UpdateFutureTransactionAmount, UpdateSystemCategoryIcon
  • StatsSummaryAccount — сводка по счёту с учётом переводов; ActivateDueFutureTransactions при списке операций и статистике
  • В ответах Transaction: credit_payment_linked; GuardTransactionUpdate для операций кредита
  • mapMoneyInputCursor — стабильный курсор в полях суммы
  • setup.Handler: syncConfiguredMarker, маркер .configured сразу после commit транзакции
  • DateTimePicker: calendarCells с годом/месяцем для padding-дней; плагин allowedHostsPlugin (configureServer)
  • CSS: --bg-popover, класс .popover-panel для overlay-панелей
  • Версия по умолчанию: 1.1.0 (VERSION, Makefile, Dockerfile, OpenAPI)

Коммиты

Changelog

  • b83c4ce5cc66ef772381ead529c35972e2ecec99 Подготовка релиза
  • cd163d51e49aefb813721cc49617c5919196a5a5 Исправлен календарь Мелкие фиксы
  • cf73c6016b48fef7c4232d98da817616dd32ae41 Исправлены статистика и фильтры Доработаны кредиты Обновлён UI и переводы
  • 5dfa93b9fe50528c485cdaece75ce8ce118716ff v1.1.0 - Сброс и восстановление пароля - Адаптация под мобильные браузеры - Комиссия за переводы и категория «Комиссия» - График кредита: ровно term_months платежей и repair при старте - Редактирование сумм неоплаченных платежей графика - Списание ретро-платежей при создании кредита - Переключатели в форме кредита (ретро-списание) - Сброс формы при повторном «Новый кредит» - Кнопка доната в админке - Демо-стенд и release notes v1.1.0 - OpenAPI 1.1.0

Docker

Вложения docker-compose.yaml и .env — тот же compose из репозитория; .env задаёт BUHGALTER_IMAGE_TAG=1.1.0.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.1.0
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.1.0
Релиз: v1.0.0 (24.06.2026)

[v1.0.0]

Первый стабильный релиз self-hosted приложения для личного учёта финансов.

Добавлено

Установка и инфраструктура

  • Три способа установки: сборка из исходников (make build), Docker (GHCR), бинарники GitHub Releases (Linux, Windows, macOS; amd64 и arm64)
  • Первый запуск через /setup: администратор, пароль с подтверждением, опциональная регистрация
  • Автоматические миграции SQLite (goose) при старте; схема 001019 (одна таблица — один файл)
  • Синхронизация версии приложения в БД (app_version / previous_app_version) при обновлении бинарника
  • Переменные окружения (BUHGALTER_ADDR, BUHGALTER_DATA_DIR, BUHGALTER_LOCALES_DIR, …)
  • Пример nginx reverse proxy + HTTPS; поле внешний URL в админке для работы за прокси
  • CI/CD: тесты, линтеры, сборка Docker-образа при git tag; GoReleaser для релизов

Пользователи и безопасность

  • Регистрация (если разрешена), сессии в cookie (10 дней неактивности)
  • API-токены (Bearer), GET /auth/verify
  • Правила сложности пароля при setup, смене пароля и создании пользователя
  • Изоляция данных по user_id; админ-панель: пользователи, системные настройки, бэкапы, восстановление, диагностика
  • Секретный ключ шифрования токенов уведомлений (set-only в админке)
  • Audit log в logs/audit/YYYY-MM-DD.jsonl

Финансовый учёт

  • Счета: банковские (справочник банков РФ) и наличные, архивация, основной счёт (★)
  • Категории и подкатегории доходов/расходов с иконками, drag-order, главная категория на тип
  • Операции: расход, доход, переводы; плановые операции (future) с активацией по дате
  • Двойной баланс на главной: текущий и прогноз с учётом будущих операций за месяц
  • Долги: единый список должников, погашение, виджет на главной, уведомления по срокам
  • Кредиты: график платежей, автосписание в полночь по timezone пользователя, досрочные платежи, закрытие и удаление

Импорт, экспорт, аналитика

  • Импорт CSV/XLSX с маппингом колонок (preset Cubux)
  • Экспорт операций в CSV
  • Статистика по типам, категориям и периодам; поиск по операциям и комментариям
  • Контекстная сводка на страницах со списками операций

Уведомления

  • Telegram и MAX (official API platform-api2.max.ru); настраиваемые шаблоны и время отправки
  • Уведомления по долгам («я должен» / «мне должны») с учётом timezone

Интерфейс

  • SvelteKit UI: светлая и тёмная тема, русский и английский (svelte-i18n)
  • Настройки: профиль, пароль, счета, категории, импорт, уведомления, API-токены
  • Адаптивная вёрстка, PWA (manifest, service worker, иконки)
  • Toast-уведомления, пустые состояния, единые диалоги (без window.confirm)

API и документация

  • REST API /api/v1/… с полным OpenAPI (описания на русском)
  • Интерактивная документация: Redoc на /docs
  • Документация в docs/: установка, модель данных, UI-гайды, импорт Cubux

База данных

  • Все изменения в базе данных - через миграции

Локализация

  • Локали сервера вынесены из бинарника (server/locales/, volume в Docker)

Техническое

  • Стек: Go 1.26+, SQLite, SvelteKit, встроенный статический фронтенд (embedstatic)
  • Команда make version vX.Y.Z — единая простановка semver во всех артефактах (VERSION, OpenAPI, Dockerfile, …)

Коммиты

Changelog

  • 0bc2ef8a21714eb6996b3b515495675ca00f0a84 Release v1.0.0: первый стабильный релиз.

Docker

Вложения docker-compose.yaml и .env — тот же compose из репозитория; .env задаёт BUHGALTER_IMAGE_TAG=1.0.0.

docker pull ghcr.io/kai-zer-ru/buhgalter:1.0.0
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.0.0
🧾 Последние коммиты
Коммит: 6ddb8dd (08.07.2026)
release 1.3.2
Автор: Maksim Kovalyov
Коммит: b879f22 (08.07.2026)
Вёрстка в бюджете (мобюилка)
Автор: Maksim Kovalyov
Коммит: 6a5fc9e (07.07.2026)
Окно "Расход"/"Доход" - порядок ввода
Автор: Maksim Kovalyov
Коммит: 67ad7e1 (07.07.2026)
Фикс добавления кредитов
Автор: Maksim Kovalyov
Коммит: 9aaa80e (03.07.2026)
v1.3.1
Автор: Maksim Kovalyov
Коммит: 9946a4d (03.07.2026)
UI главной и счетов
Автор: Maksim Kovalyov
Коммит: dfbb0e9 (03.07.2026)
UI-правки бюджета
Автор: Maksim Kovalyov
Коммит: 48629b4 (03.07.2026)
Список операций: UI
Автор: Maksim Kovalyov
Коммит: 28709e9 (03.07.2026)
UI-окно добавления операции: Подкатегории
Автор: Maksim Kovalyov
Коммит: 77f92d4 (03.07.2026)
Вёрстка списка счетов
Автор: Maksim Kovalyov
Поддержка проекта