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/, когда оно на месте.
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 и референсы.