Files
fin-tracker/docs/ai/README.md
T
Dmitry ffc5ed959a feat(app): offline-кэш GET-запросов на дашборде — фаза 5
CacheInterceptor кэширует каждый успешный GET по путь+параметры в drift
(sqlite нативно, wasm+OPFS в браузере) и подменяет им сетевую ошибку;
провайдер отдаёт Cached<T>, экран показывает баннер «данные на …».
Контракт для остальных экранов — docs/ai/offline-cache.md.

flake.nix: libsecret/pkg-config для линуксовой сборки, jq/curl для
just app-web-assets (сборка sqlite3.wasm + drift_worker.js).
2026-09-19 12:40:08 +03:00

40 lines
2.5 KiB
Markdown

# 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](architecture.md) — домен, модули, потоки данных, API.
- [conventions.md](conventions.md) — деньги, валюты, идемпотентность, стиль.
- [plan.md](plan.md) — фазы и чек-листы проверки.
- [ops.md](ops.md) — деплой на VPS, бэкапы, секреты.
- [links.md](links.md) — внешние API и референсы.
- [offline-cache.md](offline-cache.md) — офлайн-кэш Flutter-клиента: контракт `Cached<T>`,
`CacheInterceptor`, баннер «данные на …» (фаза 5).