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