Расширить portfolioSummary в списке счетов: деньги, структура и нереализованная доходность #138

Closed
opened 2026-10-26 20:59:55 +03:00 by codex-bot · 0 comments
Owner

Проблема

Карточка счёта на /accounts (WealthLedger/frontend) показывает только стоимость и число акций/облигаций. Для информативной карточки нужны деньги на счёте, структура активов и нереализованная доходность — эти данные уже есть в сохранённом snapshot портфеля, но не отдаются в GET /api/v1/brokerage-accounts.

Ожидаемое поведение

BrokerageAccountDto.portfolioSummary дополняется полями, вычисляемыми из того же сохранённого snapshot без новых обращений к T-Bank и без дополнительных запросов к БД на счёт:

  • cashBalances: MoneyDto[] — копия cashBalances snapshot;
  • structure: PortfolioStructureDto — копия structure snapshot;
  • unrealizedReturnByCurrency[] — по каждой валюте: absolute (сумма positions[].absoluteReturn), costBasis (сумма averagePurchasePrice × quantity по тем же позициям), percent (decimal-строка или null при нулевой базе), partial (true, если в валюте есть позиции с absoluteReturn = null);
  • fundPositionCount, totalPositionCount (ненулевые позиции).

Acceptance Criteria

  • Новые поля обязательны (required) в схеме, существующие поля и семантика не меняются; portfolioSummary = null сохраняется при отсутствии snapshot.
  • Денежные значения — decimal-строки без потери точности (без Number); валюты не смешиваются и не конвертируются.
  • Нет новых upstream-вызовов и N+1; данные из того же PortfolioService.saved.
  • Swagger/OpenAPI обновлён, openapi:check / contract-тест проходят; unit/e2e покрывают: пустой портфель, позиции с null-доходностью (partial), нулевую базу, несколько валют.

Связано: WealthLedger/frontend (карточка счёта).

## Проблема Карточка счёта на /accounts (WealthLedger/frontend) показывает только стоимость и число акций/облигаций. Для информативной карточки нужны деньги на счёте, структура активов и нереализованная доходность — эти данные уже есть в сохранённом snapshot портфеля, но не отдаются в GET /api/v1/brokerage-accounts. ## Ожидаемое поведение `BrokerageAccountDto.portfolioSummary` дополняется полями, вычисляемыми из того же сохранённого snapshot без новых обращений к T-Bank и без дополнительных запросов к БД на счёт: - `cashBalances: MoneyDto[]` — копия `cashBalances` snapshot; - `structure: PortfolioStructureDto` — копия `structure` snapshot; - `unrealizedReturnByCurrency[]` — по каждой валюте: `absolute` (сумма `positions[].absoluteReturn`), `costBasis` (сумма `averagePurchasePrice × quantity` по тем же позициям), `percent` (decimal-строка или null при нулевой базе), `partial` (true, если в валюте есть позиции с `absoluteReturn = null`); - `fundPositionCount`, `totalPositionCount` (ненулевые позиции). ## Acceptance Criteria - Новые поля обязательны (required) в схеме, существующие поля и семантика не меняются; `portfolioSummary = null` сохраняется при отсутствии snapshot. - Денежные значения — decimal-строки без потери точности (без Number); валюты не смешиваются и не конвертируются. - Нет новых upstream-вызовов и N+1; данные из того же `PortfolioService.saved`. - Swagger/OpenAPI обновлён, `openapi:check` / contract-тест проходят; unit/e2e покрывают: пустой портфель, позиции с null-доходностью (partial), нулевую базу, несколько валют. Связано: WealthLedger/frontend (карточка счёта).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/backend#138