156 lines
11 KiB
Markdown
156 lines
11 KiB
Markdown
# Информативный обзор брокерских счетов
|
||
|
||
Дата: 2026-06-19
|
||
Статус: согласовано к планированию
|
||
Эпик: [Портфель брокера](../../epics/BrokerPortfolio.md)
|
||
|
||
## Контекст
|
||
|
||
Страница `/broker` показывает открытые брокерские счета и ИИС карточками, но полезная информация в
|
||
них ограничена названием, типом, техническим статусом и идентификатором. Пользователь не может на
|
||
одном экране оценить совокупный капитал, сравнить счета и понять структуру активов.
|
||
|
||
Страница предназначена преимущественно для одного–трёх счетов.
|
||
|
||
## Цель
|
||
|
||
Превратить список брокерских счетов в компактный финансовый обзор, который с первого взгляда
|
||
отвечает на вопросы:
|
||
|
||
- сколько средств находится на всех доступных счетах;
|
||
- как изменилась их стоимость за день;
|
||
- сколько свободных денег доступно;
|
||
- как капитал распределён между счетами и основными классами активов;
|
||
- какой счёт нужно открыть для подробного анализа.
|
||
|
||
## Область изменений
|
||
|
||
Фича изменяет страницу списка брокерских счетов и включает:
|
||
|
||
- общую сводку по успешно загруженным счетам;
|
||
- информативные карточки отдельных счетов;
|
||
- независимую загрузку данных каждого счёта;
|
||
- состояния загрузки, частичной ошибки и отсутствия счетов;
|
||
- адаптивное отображение на широких и узких экранах.
|
||
|
||
Детальные страницы счёта, позиции, операции, торговые действия и правила расчёта показателей,
|
||
приходящих от T-Bank, не изменяются.
|
||
|
||
## Требования
|
||
|
||
### 1. Общая сводка
|
||
|
||
Над списком счетов отображается сводка по портфелям, данные которых успешно загружены:
|
||
|
||
- количество доступных счетов;
|
||
- совокупная стоимость портфелей;
|
||
- совокупный дневной результат в деньгах и процентах;
|
||
- свободные деньги;
|
||
- распределение стоимости по акциям, облигациям, фондам, деньгам и прочим активам.
|
||
|
||
Денежные значения разных валют не складываются и показываются отдельными суммами. Процентный
|
||
дневной результат и единое распределение активов показываются только для сопоставимых денежных
|
||
значений одной валюты. Интерфейс не выполняет неявную конвертацию валют.
|
||
|
||
Для каждой валюты совокупный дневной процент рассчитывается как отношение суммы дневных изменений
|
||
к суммарной стоимости портфелей на начало дня:
|
||
|
||
```text
|
||
sum(daily) / (sum(portfolio) - sum(daily)) * 100
|
||
```
|
||
|
||
Процент не показывается, если хотя бы у одного включённого в валютную группу счёта отсутствует
|
||
стоимость или дневное изменение либо если стоимость на начало дня неположительна.
|
||
|
||
Если загружены не все счета, сводка явно сообщает, по скольким счетам рассчитаны показатели.
|
||
Недоступный счёт не включается в агрегированные значения.
|
||
|
||
### 2. Карточка счёта
|
||
|
||
Для каждого счёта показываются:
|
||
|
||
- название;
|
||
- понятный тип: `Брокерский счёт` или `ИИС`;
|
||
- дата открытия, если она доступна;
|
||
- текущая стоимость;
|
||
- дневной результат в деньгах и процентах;
|
||
- ожидаемая доходность;
|
||
- распределение стоимости по основным классам активов.
|
||
|
||
Технический идентификатор, сырой enum статуса и сырой enum уровня доступа в карточке не
|
||
отображаются.
|
||
|
||
Вся карточка является доступной с клавиатуры ссылкой на обзор выбранного счёта. Цвет доходности
|
||
используется только как дополнительный признак: знак и числовое значение остаются видимыми.
|
||
|
||
### 3. Загрузка
|
||
|
||
После получения списка счетов данные их портфелей загружаются независимо. До появления значений
|
||
общая сводка и карточки показывают skeleton-состояние с устойчивыми размерами, чтобы содержимое не
|
||
скакало при загрузке.
|
||
|
||
Появление данных одного счёта не должно ждать завершения остальных запросов.
|
||
|
||
### 4. Ошибки
|
||
|
||
Ошибка загрузки списка счетов показывает ошибку всей страницы.
|
||
|
||
Ошибка загрузки портфеля отдельного счёта:
|
||
|
||
- не скрывает другие счета;
|
||
- не блокирует переход в доступные счета;
|
||
- показывает локальное сообщение в карточке проблемного счёта;
|
||
- позволяет повторить загрузку этого счёта;
|
||
- исключает этот счёт из общей сводки и маркирует сводку как частичную.
|
||
|
||
### 5. Пустое состояние
|
||
|
||
Если открытых брокерских счетов и ИИС нет, страница показывает отдельное пустое состояние вместо
|
||
пустой сетки карточек. Текст объясняет, какие счета появятся на странице после подключения T-Bank.
|
||
|
||
### 6. Адаптивность
|
||
|
||
При одном–трёх счетах карточки располагаются вертикально и сохраняют единый порядок показателей для
|
||
быстрого сравнения.
|
||
|
||
На узком экране показатели переносятся на несколько строк, диаграмма распределения остаётся
|
||
читаемой, а интерактивные области не требуют горизонтальной прокрутки.
|
||
|
||
## Ограничения
|
||
|
||
- Страница остаётся read-only.
|
||
- Frontend не обращается к T-Bank напрямую.
|
||
- Агрегация не пересчитывает показатели отдельного счёта: исходные стоимости и доходность берутся
|
||
из существующих ответов портфеля. Единственный новый производный показатель — совокупный дневной
|
||
процент по явно заданной в этой спецификации формуле.
|
||
- Данные разных счетов могут иметь разные моменты `asOf`; интерфейс не представляет сводку как
|
||
транзакционно согласованный снимок.
|
||
- Решение рассчитано на один–три счёта. Расширение этого предположения требует пересмотра
|
||
[ADR-012](../../../apps/docs/docs/adr/ADR-012-frontend-broker-account-aggregation.md).
|
||
|
||
## Acceptance Criteria
|
||
|
||
- Над счетами показана общая стоимость, дневной результат, свободные деньги, число счетов и
|
||
распределение активов.
|
||
- Значения разных валют не складываются без курса конвертации.
|
||
- Каждая успешно загруженная карточка показывает стоимость, доходность, тип и распределение активов.
|
||
- Название и дата открытия показываются, когда доступны.
|
||
- Технический ID и сырые T-Bank enum-значения не отображаются.
|
||
- Вся карточка ведёт на обзор соответствующего счёта и доступна с клавиатуры.
|
||
- Во время загрузки отображаются skeleton-состояния без заметного изменения геометрии страницы.
|
||
- Ошибка одного портфеля не скрывает остальные счета и не включает недоступные данные в сводку.
|
||
- Пользователь может повторить запрос проблемного счёта.
|
||
- При отсутствии счетов отображается объясняющее пустое состояние.
|
||
- Страница не требует горизонтальной прокрутки на поддерживаемых мобильных ширинах.
|
||
- Unit-тесты покрывают агрегацию, валютные ограничения и расчёт распределения.
|
||
- Component-тесты покрывают успешную загрузку, skeleton, пустое состояние, частичную ошибку,
|
||
повторный запрос и переход в счёт.
|
||
|
||
## Не цели
|
||
|
||
- Добавление aggregate endpoint на backend.
|
||
- Конвертация валют и получение валютных курсов.
|
||
- Поддержка более трёх счетов как отдельного плотного режима.
|
||
- Изменение детальной страницы брокерского счёта.
|
||
- Изменение T-Bank DTO, OpenAPI-контракта или сгенерированных frontend-типов.
|