Files
2026-08-13 22:48:40 +03:00

33 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 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`.