docs: add spec for broker account analytics
This commit is contained in:
parent
0c4250fa6c
commit
15427be384
112
docs/features/broker-account-analytics/spec.md
Normal file
112
docs/features/broker-account-analytics/spec.md
Normal file
@ -0,0 +1,112 @@
|
||||
# Аналитика прибыльности брокерского счёта
|
||||
|
||||
Дата: 2026-06-24
|
||||
Статус: спецификация
|
||||
Эпик: [Портфель брокера](../../epics/BrokerPortfolio.md)
|
||||
|
||||
## Цель
|
||||
|
||||
Дать пользователю брокерского счёта T-Bank отдельный раздел, где можно увидеть агрегированную аналитику прибыльности портфеля: сколько всего было вложено (нетто), сколько получено (дивиденды + купоны) и общую доходность.
|
||||
|
||||
## Пользовательский результат
|
||||
|
||||
Пользователь может:
|
||||
|
||||
- открыть вкладку `Аналитика` внутри брокерского счёта;
|
||||
- увидеть, сколько всего денег было внесено на счёт (пополнения);
|
||||
- увидеть, сколько всего денег было выведено со счёта;
|
||||
- увидеть нетто-вложения (пополнения минус выводы);
|
||||
- увидеть сумму полученных дивидендов;
|
||||
- увидеть сумму полученных купонов;
|
||||
- увидеть общую сумму полученного дохода (дивиденды + купоны);
|
||||
- увидеть доходность в процентах от нетто-вложений.
|
||||
|
||||
## Область изменений
|
||||
|
||||
Фича относится только к брокерским счетам T-Bank и включает:
|
||||
|
||||
- новый backend endpoint `GET /api/v1/broker/accounts/:accountId/analytics`;
|
||||
- новый сервис `BrokerAnalyticsService` с агрегацией через raw SQL;
|
||||
- новую вкладку `Аналитика` в навигации брокерского счёта;
|
||||
- страницу аналитики с отображением вложений, полученного дохода и сводки.
|
||||
|
||||
## Требования
|
||||
|
||||
### 1. Источники данных
|
||||
|
||||
- Все данные агрегируются из таблицы `BrokerOperation`.
|
||||
- Для расчёта вложений используются операции с типами пополнений (`OPERATION_TYPE_INPUT` и аналоги) и выводов (`OPERATION_TYPE_OUTPUT` и аналоги).
|
||||
- Для расчёта полученного дохода используются операции с типами дивидендов (`OPERATION_TYPE_DIVIDEND`, `OPERATION_TYPE_DIV_EXT`) и купонов (`OPERATION_TYPE_COUPON`).
|
||||
- Данные считаются «навсегда»: без фильтра по дате, за всё время существования счёта.
|
||||
- Аналитика read-only и не изменяет данные.
|
||||
|
||||
### 2. Endpoint
|
||||
|
||||
- `GET /api/v1/broker/accounts/:accountId/analytics` — возвращает агрегированные показатели.
|
||||
- Кешируется с TTL 5 минут (как существующие broker-эндпоинты).
|
||||
- При отсутствии счёта возвращает 404.
|
||||
|
||||
### 3. Показатели
|
||||
|
||||
Endpoint возвращает:
|
||||
|
||||
| Поле | Описание |
|
||||
|------|----------|
|
||||
| `totalDeposits` | Сумма всех пополнений счёта |
|
||||
| `totalWithdrawn` | Сумма всех выводов со счёта |
|
||||
| `netInvested` | `totalDeposits − totalWithdrawn` (нетто-вложения) |
|
||||
| `totalDividends` | Сумма полученных дивидендов |
|
||||
| `totalCoupons` | Сумма полученных купонов |
|
||||
| `totalReceived` | `totalDividends + totalCoupons` |
|
||||
| `totalReturnPercent` | `(totalReceived / netInvested) × 100`, если `netInvested > 0`, иначе `null` |
|
||||
| `currency` | Валюта (RUB) |
|
||||
|
||||
### 4. Агрегация
|
||||
|
||||
- Запрос выполняется одним агрегирующим запросом к таблице `BrokerOperation`.
|
||||
- Из выборки исключаются операции с `payment IS NULL`.
|
||||
- Учитываются только исполненные операции (state = `OPERATION_STATE_EXECUTED` или `null`).
|
||||
|
||||
### 5. Вкладка
|
||||
|
||||
- В навигации брокерского счёта появляется вкладка `Аналитика` рядом с `События`.
|
||||
- Вкладка использует `useBrokerAccountContext()` для получения `accountId`.
|
||||
- Страница показывает три блока:
|
||||
1. **Вложено** — пополнения, выводы, нетто-итог
|
||||
2. **Получено** — дивиденды, купоны, итог
|
||||
3. **Сводка** — нетто-вложения, полученный доход, доходность в процентах
|
||||
|
||||
### 6. Пустые состояния и ошибки
|
||||
|
||||
- Если аналитика недоступна (нет операций), показывается пустое состояние.
|
||||
- Если нетто-вложения равны нулю, `totalReturnPercent` не показывается.
|
||||
- Ошибка загрузки не ломает навигацию счёта.
|
||||
|
||||
## Ограничения
|
||||
|
||||
- Фича работает только внутри маршрутов `/broker/:accountId/*`.
|
||||
- Ручные портфели `PortfolioModule` не входят в область фичи.
|
||||
- Фича не учитывает налоги, комиссии и валютную конвертацию.
|
||||
- Фича не учитывает нереализованную прибыль/убыток по текущим позициям.
|
||||
- Доходность считается только по полученным выплатам (дивиденды + купоны), без учёта изменения цены бумаг.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- На странице брокерского счёта есть вкладка `Аналитика`.
|
||||
- Вкладка показывает нетто-вложения (пополнения минус выводы).
|
||||
- Вкладка показывает сумму полученных дивидендов.
|
||||
- Вкладка показывает сумму полученных купонов.
|
||||
- Вкладка показывает общую сумму полученного дохода.
|
||||
- Доходность в процентах отображается, если нетто-вложения > 0.
|
||||
- Данные кешируются на 5 минут.
|
||||
- Пустое состояние отображается при отсутствии данных.
|
||||
- Ошибка загрузки не ломает навигацию.
|
||||
|
||||
## Вне области фичи
|
||||
|
||||
- учёт налогов и комиссий;
|
||||
- нереализованная прибыль/убыток по текущим позициям;
|
||||
- ручные портфели;
|
||||
- мультивалютность;
|
||||
- графики и визуализация динамики;
|
||||
- экспорт данных.
|
||||
Loading…
x
Reference in New Issue
Block a user