codex/broker-account-analytics #41

Merged
ksv741 merged 9 commits from codex/broker-account-analytics into main 2026-06-24 12:09:38 +03:00
Showing only changes of commit 15427be384 - Show all commits

View 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 минут.
- Пустое состояние отображается при отсутствии данных.
- Ошибка загрузки не ломает навигацию.
## Вне области фичи
- учёт налогов и комиссий;
- нереализованная прибыль/убыток по текущим позициям;
- ручные портфели;
- мультивалютность;
- графики и визуализация динамики;
- экспорт данных.