Files
fin-tracker/docs/ai
Dmitry 2e742a093b feat(reports): протокол и парсеры отчётов Сбера, ВТБ и Snowball CSV
sources/reports/base.py — контракт ReportParser (плагины: sniff/parse, чистые
функции без БД). registry.py выбирает парсер по содержимому файла, CSV
последним: он узнаёт файл по набору колонок и иначе перехватил бы чужой
формат.

Комиссия капитализируется в сделку, отдельным событием не эмитится: и Сбер,
и ВТБ печатают её дважды — колонками в сделках и строками в движении денег,
суммы совпадают, второе прочтение задвоило бы её. Расчётные строки («Сделка
от …», «Сальдо расчетов по сделкам») не эмитятся — это денежные ноги уже
учтённых сделок. У Сбера таблица «Информация о зачислениях на ИИС»
кумулятивна за календарный год и в леджер не идёт, иначе два пересекающихся
отчёта задвоили бы пополнения. CSV Snowball сводный по всем брокерам —
годится как сверка потоков и сделок на уровне портфеля, но не позиций по
счетам; CUSTOM_HOLDING_PRICE не событие, а цена — уходит в meta для
price_manual.

Обезличивание — anonymize.py + scripts/anonymize_reports.py, секреты
собираются по всему корпусу отчётов разом (Snowball цитирует номер договора
Сбера в примечании к переводу). test_fixtures_anonymized.py падает, если
в tests/fixtures/reports/ вне raw/ найдётся ИНН, ФИО или номер счёта — и по
форме (работает в CI без raw/), и по фактическому содержимому raw/, когда оно
на месте.
2026-09-19 10:39:37 +03:00
..

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 и референсы.