Поток: upload -> raw_report_file (sha256 UNIQUE) -> parse -> raw_report_line,
событий в леджере ещё нет -> preview -> POST /imports/{id}/commit ->
ledger/ingest.py резолвит инструмент, считает dedupe_key, пишет event
confirmed | shadow (plan §1.6 B) — сравнивая account.primary_event_source
с источником отчёта, а не гадая. Нерезолвленный инструмент ждёт в
pending_instrument, никогда не угадывается; POST /instruments/pending/{id}/resolve
привязывает и пересобирает лоты.
ledger/dedupe.py — shadow-матчинг случая B двумя проходами (точная дата, затем
±1 рабочий день, жадно 1:1, |price| ±0,5 %). Шаги shadow_dedupe и
report_reconcile зарегистрированы перед quality: оба говорят через FINDINGS.
/instruments/pending регистрируется в app.py ДО routers/instruments.py:
FastAPI сопоставляет маршруты по порядку, и /instruments/{id} с типом int
отвечает 422 на нечисловой сегмент, а не проваливается дальше.
Контракт — docs/ai/import-contract.md, общий для бэкенда и Flutter.
docs/ai — обзор проекта
Назначение
fin-tracker объединяет два мира личных финансов:
- ZenMoney — повседневные счета и транзакции (синкается с банками сам), читаем через
POST /v8/diff/; - брокеры — T-Invest по gRPC API, Сбер и ВТБ через загрузку отчётов, прочее вручную/CSV;
и считает поверх них то, за что раньше платили Snowball Income: позиции по всем брокерам, P&L, XIRR/TWR, аллокацию, календарь дивидендов и купонов с прогнозом, ребалансировку, бенчмарки, налоги — плюс net worth, cash flow и runway по ZenMoney.
Система в общих чертах
sources/* ──sync──▶ raw_* (JSONB, идемпотентно) ──map──▶ core (account, instrument, event, cash_txn…)
│
worker (APScheduler, advisory locks) ▼
ledger (лоты FIFO, дедуп, матчинг ZM↔брокер)
│
analytics (polars, pyxirr) ──▶ metric_* ──▶ api ──▶ Flutter
backend/src/fintracker/sources/— по одному пакету на источник, контракт вbase.py.worker/— планировщик и запуск синков (runner.run_source): lock,sync_run, курсор.api/— FastAPI,/api/v1, ошибки RFC 7807, деньги строками.app/— Flutter, клиент сгенерирован изopenapi/openapi.json.
Документы
- architecture.md — домен, модули, потоки данных, API.
- conventions.md — деньги, валюты, идемпотентность, стиль.
- plan.md — фазы и чек-листы проверки.
- ops.md — деплой на VPS, бэкапы, секреты.
- links.md — внешние API и референсы.