33 lines
5.4 KiB
Markdown
33 lines
5.4 KiB
Markdown
## 1. Backend Portfolio read-path
|
||
|
||
- [x] 1.1 Расширить существующий T-Bank client вызовами `GetPortfolio`, `GetPositions` и FIGI metadata lookup, сохранив TLS, global limiter, deadline, retry и безопасный mapping gRPC ошибок.
|
||
- [x] 1.2 Добавить точный normalizer на `BigInt` для protobuf `units`/`nano`: canonical decimal strings, signed дробные части, сложение, вычитание и умножение без JavaScript float.
|
||
- [x] 1.3 Добавить Portfolio DTO, authenticated controller и user-scoped service для `GET /api/v1/brokerage-accounts/:accountId/portfolio`; проверять доступный Brokerage Account через `GetAccounts`, затем получать `GetPortfolio` и `GetPositions` параллельно.
|
||
- [x] 1.4 Нормализовать обычные ненулевые позиции из `GetPortfolio.positions`, доступные ненулевые Cash Balance из `GetPositions.money`, типы инструментов, FIGI/ticker/name fallback, `currentValue`, `absoluteReturn` и totals по валютам без конвертации.
|
||
- [x] 1.5 Добавить in-memory Portfolio Snapshot cache с fresh TTL 30 секунд, fallback до пяти минут только для временной недоступности и очисткой User snapshots после replace/delete T-Bank connection.
|
||
- [x] 1.6 Добавить глобальный FIGI metadata cache на 24 часа для успешных и отрицательных результатов; ошибки lookup не кэшировать и не делать их причиной ошибки Portfolio Snapshot.
|
||
- [x] 1.7 Добавить backend unit/e2e тесты: auth, отсутствие connection, `404` недоступного счёта, error mapping, точные отрицательные decimal values, empty Portfolio, порядок, валютные агрегаты, metadata fallback/cache, snapshot fresh/fallback/invalid token и invalidation connection.
|
||
|
||
## 2. Generated contract and frontend data layer
|
||
|
||
- [x] 2.1 Запустить backend API и перегенерировать frontend OpenAPI client; проверить generated contract для Portfolio endpoint и DTO.
|
||
- [x] 2.2 Добавить FSD entity slice `portfolio` с API query через generated `paths[...]`, `staleTime: 30_000`, отключённым retry, обработкой codes и public barrel export.
|
||
- [x] 2.3 Добавить локальные display helpers для русской локали, которые форматируют decimal strings и валюты без финансовой арифметики на клиенте.
|
||
|
||
## 3. Portfolio detail page
|
||
|
||
- [x] 3.1 Заменить placeholder `/accounts/:accountId` на loading, empty, unavailable-account, known-error, generic-error и loaded state-вьюхи, скрывая устаревший frontend Snapshot при refetch.
|
||
- [x] 3.2 Добавить loaded Portfolio view с названием/типом Brokerage Account из существующего account-list cache или нейтральным заголовком при прямом URL, агрегатами по валютам, upstream-порядком позиций и отдельной секцией Cash Balance.
|
||
- [x] 3.3 Показать `lastSuccessfulAt` и нейтральное stale warning без ручного обновления; добавить действия возврата к списку, настройкам или retry только в разрешённых error-состояниях.
|
||
- [x] 3.4 Оформить detail page локальными Mantine/CSS-module компонентами в светлом финансовом стиле `references/fin-tracker`: slate-границы, синий accent, плотная иерархия сумм и одноколоночный mobile layout, не копируя reference code и не добавляя placeholder-данные.
|
||
- [x] 3.5 Добавить frontend tests для query policy, всех page states, stale warning, error actions, account-title fallback, upstream порядка и rendering nullable значений.
|
||
|
||
## 4. Documentation and verification
|
||
|
||
- [x] 4.1 Создать `docs/features/portfolio-view.md` с пользовательским потоком, Mermaid sequence diagram, API contract, публичной моделью, exact decimal rules, cache/fallback, metadata fallback, ошибками и MVP-ограничениями.
|
||
- [x] 4.2 Сверить ADR 005 с фактической общей cache policy и обновить только при противоречии.
|
||
- [x] 4.5 Отображать позиции раздельно по типам, предпочитать полное name инструмента и форматировать RUB символом `₽`.
|
||
- [x] 4.6 Искать metadata инструмента по UID с fallback на FIGI, чтобы уменьшить технические displayName.
|
||
- [x] 4.3 Запустить backend lint, tests и build; запустить frontend lint, typecheck, tests, build и no-TODO check; визуально проверить desktop и mobile состояния Portfolio.
|
||
- [x] 4.4 Перед архивированием запустить `openspec validate add-portfolio-view --type change --strict --store wealth-ledger-specs` и `opsx-verify`.
|