Files
specs/openspec/changes/archive/2026-08-13-add-portfolio-view/tasks.md
T
2026-08-13 22:48:40 +03:00

5.4 KiB
Raw Blame History

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 для protobuf units/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 через generated paths[...], 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.