- Кэш проверки дублей не сбрасывался после импорта: повторный импорт
того же файла в течение 30 секунд (staleTime) сверялся со списком
транзакций, полученным ДО первого импорта, и не находил ни одного
дубля — ровно тот случай, ради которого проверка и делалась.
- Кнопку импорта можно было нажать, пока проверка дублей ещё шла или
шёл фоновый рефетч: дубли проходили мимо фильтра. Теперь кнопка
заблокирована на время запроса, а его ошибка больше не проглатывается
молча, а показывается предупреждением.
- Ручная смена кодировки ломала уже выбранные колонки: заголовки
перечитывались, старый выбор указывал на несуществующее имя,
indexOf давал -1, и все строки молча отбрасывались как «не удалось
распознать дату». Маппинг переугадывается при изменении состава
заголовков.
- Текст «Они не будут импортированы» противоречил включённой галочке
«Всё равно импортировать их».
Пять доработок импорта транзакций из CSV:
1. Проверка дублей при повторном импорте — сверка с уже существующими
транзакциями на счёте за диапазон дат файла (по дате+типу+сумме+
описанию), похожие исключаются из импорта по умолчанию с опцией
всё равно их добавить.
2. Автоопределение кодировки файла (UTF-8 с откатом на Windows-1251)
вместо жёстко зашитого UTF-8 — раньше кириллица из банковских
выгрузок превращалась в кракозябры. Есть ручной выбор на случай
неверного автоопределения.
3. Исправлен баг в parseAmount: суммы с несколькими разделителями
тысяч и без дробной части (например "1,234,567") теряли цифры и
отбрасывались как нераспознанные — теперь распознаются верно.
4. Добавлен явный выбор разделителя дробной части (точка/запятая) на
случай, когда автоопределение не может разрешить неоднозначность.
5. Пример значения из файла показывается прямо под каждым выбором
колонки при сопоставлении — не нужно доходить до превью, чтобы
понять, что в колонке.
Fourth of the four ideas picked from the Maybe/Sure feature audit, and the
last one queued up. A 3-step wizard (account -> column mapping -> preview)
at /transactions/import, parsed entirely client-side (new lib/csv.ts —
delimiter auto-detect, 5 date formats, thousands/decimal-separator-aware
amounts) and submitted through a new all-or-nothing POST /transactions/bulk
endpoint, mirroring backup restore's validate-everything-before-touching-
anything approach.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Year was previously hardcoded to the current year on all three pages
(useState with no setter) — only the month could be changed via
MonthSelector, making it impossible to look at or compare older years
even though transaction history goes back further than the current
year.
Adds GET /transactions/years (contiguous range from the earliest
transaction through the current year) and a YearSelector component
matching MonthSelector's style, wired into all three pages alongside
a real year useState.
Aurum — a self-hosted personal finance operating system: cash flow,
net worth tracking, budgets, goals, recurring payments, reports,
proactive alerts, and a compound-interest returns calculator, all
bilingual (RU/EN) and mobile-first. Ships as a three-container Docker
Compose stack (Postgres + FastAPI + nginx-served React frontend).
See README.md for setup and CONTRIBUTING.md for development.