docs: состояние фазы 2 после аллокации, API и экранов портфеля
Плюс два ограничения, которые стоили времени: AssetClass нельзя выставлять наружу енумом из-за значения index, и сектор не заполнен ни у одного инструмента — его нет в ответе GetInstrumentBy, нужны потиповые Shares/Bonds.
This commit is contained in:
+11
-4
@@ -50,8 +50,8 @@
|
||||
|
||||
## Аналитика (`analytics/`, `pricing/{fx,prices}.py`, `metrics/refresh.py`)
|
||||
Шаги регистрируются в `analytics/__init__.py` и выполняются `refresh_all` по порядку:
|
||||
`fx → classify → lots → valuation → returns → networth → cashflow → spending → runway →
|
||||
quality` (фаза 2 вставит income и allocation после returns). Запуск:
|
||||
`fx → classify → lots → valuation → returns → allocation → networth → cashflow → spending →
|
||||
runway → quality` (фаза 4 вставит income и rebalance после allocation). Запуск:
|
||||
worker после синка с `changed=True`, `fintracker metrics refresh`, `POST /metrics/refresh`,
|
||||
`POST /rules/apply`. Каждая `metric_*` таблица пересобирается целиком. Net worth считается
|
||||
от текущего `account.balance` назад по транзакциям; конвертация — `FxTable` по дате
|
||||
@@ -63,7 +63,10 @@ worker после синка с `changed=True`, `fintracker metrics refresh`, `P
|
||||
`portfolio:<id>`. `returns` читает только `metric_portfolio_value_daily`: XIRR по внешним
|
||||
потокам и терминальной стоимости, TWR цепочкой `V_t / (V_{t-1} + F_t)`. Покупка бумаги без
|
||||
цены трактуется как вывод из оцениваемого портфеля (`unvalued_flow_rub`), иначе дыра в
|
||||
данных читалась бы как обвал.
|
||||
данных читалась бы как обвал. `allocation` режет тот же итог четырьмя способами (класс,
|
||||
сектор, страна, валюта), включая кэш в каждый разрез: четыре диаграммы одного портфеля
|
||||
обязаны быть одного размера. Бакет — стабильный ключ (`cash`, `unknown`, код страны), язык
|
||||
живёт в клиенте.
|
||||
|
||||
Деньги в JSON — `Money` (`api/schemas/common.py`), всегда позиционная строка.
|
||||
|
||||
@@ -73,7 +76,11 @@ worker после синка с `changed=True`, `fintracker metrics refresh`, `P
|
||||
- Ошибки — RFC 7807 (`application/problem+json`), см. `api/errors.py`.
|
||||
- Auth: `POST /auth/login` → access JWT (1 ч) + refresh (30 д, хранится хэшем, ротируется);
|
||||
login rate-limited в памяти (`api/ratelimit.py`).
|
||||
- Деньги в JSON — строки.
|
||||
- Деньги в JSON — строки; енумы моделей наружу отдаются не всегда: `asset_class` идёт
|
||||
строкой, потому что значение `index` ломает генератор Dart-клиента.
|
||||
- Аналитика инвестиций читает только `metric_*` — на запрос ничего не считается.
|
||||
Параметр `scope` (`all | account:<id> | portfolio:<id>`) резолвится через
|
||||
`analytics/valuation.account_scopes`, неизвестный scope — 404, а не пустой график.
|
||||
|
||||
## Клиент (`app/`)
|
||||
Flutter, Riverpod, go_router, fl_chart; клиент `app/packages/api_client` генерируется
|
||||
|
||||
Reference in New Issue
Block a user