Карточка счёта на /accounts (WealthLedger/frontend) показывает только стоимость и число акций/облигаций. Для информативной карточки нужны деньги на счёте, структура активов и нереализованная доходность — эти данные уже есть в сохранённом snapshot портфеля, но не отдаются в GET /api/v1/brokerage-accounts.
Ожидаемое поведение
BrokerageAccountDto.portfolioSummary дополняется полями, вычисляемыми из того же сохранённого snapshot без новых обращений к T-Bank и без дополнительных запросов к БД на счёт:
unrealizedReturnByCurrency[] — по каждой валюте: absolute (сумма positions[].absoluteReturn), costBasis (сумма averagePurchasePrice × quantity по тем же позициям), percent (decimal-строка или null при нулевой базе), partial (true, если в валюте есть позиции с absoluteReturn = null);
Новые поля обязательны (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 (карточка счёта).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Проблема
Карточка счёта на /accounts (WealthLedger/frontend) показывает только стоимость и число акций/облигаций. Для информативной карточки нужны деньги на счёте, структура активов и нереализованная доходность — эти данные уже есть в сохранённом snapshot портфеля, но не отдаются в GET /api/v1/brokerage-accounts.
Ожидаемое поведение
BrokerageAccountDto.portfolioSummaryдополняется полями, вычисляемыми из того же сохранённого snapshot без новых обращений к T-Bank и без дополнительных запросов к БД на счёт:cashBalances: MoneyDto[]— копияcashBalancessnapshot;structure: PortfolioStructureDto— копияstructuresnapshot;unrealizedReturnByCurrency[]— по каждой валюте:absolute(суммаpositions[].absoluteReturn),costBasis(суммаaveragePurchasePrice × quantityпо тем же позициям),percent(decimal-строка или null при нулевой базе),partial(true, если в валюте есть позиции сabsoluteReturn = null);fundPositionCount,totalPositionCount(ненулевые позиции).Acceptance Criteria
portfolioSummary = nullсохраняется при отсутствии snapshot.PortfolioService.saved.openapi:check/ contract-тест проходят; unit/e2e покрывают: пустой портфель, позиции с null-доходностью (partial), нулевую базу, несколько валют.Связано: WealthLedger/frontend (карточка счёта).