Вкладка «Концентрация» на странице счёта (main#48): топ-5 позиций/секторов/эмитентов и диаграмма распределения.
Backend-часть: хранение сектора и бренда инструмента (TbankInstrumentClassification, обновление раз в 24 ч), шаг классификации в часовом обходе до публикации Snapshot, новые вызовы T-Bank (etfBy, getAssetBy) с opt-in NOT_FOUND, поля sector и issuer в позиции Portfolio, нормализация старых Snapshot.
Prisma-модель и аддитивная миграция TbankInstrumentClassification
TbankClient.getEtf/getAssetBrand, opt-in NOT_FOUND только для новых вызовов
PositionClassificationService + repository, шаг до publish в queueSnapshot
DTO sector/issuer, регенерация openapi.json
Verification
npm run verify — lint, typecheck, 302 unit-теста, e2e SQLite — OK
npm run openapi:check, npm run test:openapi-contract (4/4) — OK
git diff --check — OK
Откат образа без миграции (task 3.4) — pending G4
Related PRs
frontend: WealthLedger/frontend#… (зависит от этого PR: snapshot OpenAPI совпадает)
specs: change account-top-positions
docs: WealthLedger/docs#…
Breaking Changes
Нет: ответ Portfolio расширен необязательными полями.
## Summary
Вкладка «Концентрация» на странице счёта (main#48): топ-5 позиций/секторов/эмитентов и диаграмма распределения.
Backend-часть: хранение сектора и бренда инструмента (TbankInstrumentClassification, обновление раз в 24 ч), шаг классификации в часовом обходе до публикации Snapshot, новые вызовы T-Bank (etfBy, getAssetBy) с opt-in NOT_FOUND, поля `sector` и `issuer` в позиции Portfolio, нормализация старых Snapshot.
## Linked Issue
WealthLedger/main#48
## Changes
- Prisma-модель и аддитивная миграция `TbankInstrumentClassification`
- `TbankClient.getEtf`/`getAssetBrand`, opt-in NOT_FOUND только для новых вызовов
- `PositionClassificationService` + repository, шаг до `publish` в `queueSnapshot`
- DTO `sector`/`issuer`, регенерация `openapi.json`
## Verification
- `npm run verify` — lint, typecheck, 302 unit-теста, e2e SQLite — OK
- `npm run openapi:check`, `npm run test:openapi-contract` (4/4) — OK
- `git diff --check` — OK
- Откат образа без миграции (task 3.4) — pending G4
## Related PRs
- frontend: WealthLedger/frontend#… (зависит от этого PR: snapshot OpenAPI совпадает)
- specs: change `account-top-positions`
- docs: WealthLedger/docs#…
## Breaking Changes
Нет: ответ Portfolio расширен необязательными полями.
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.
Summary
Вкладка «Концентрация» на странице счёта (main#48): топ-5 позиций/секторов/эмитентов и диаграмма распределения.
Backend-часть: хранение сектора и бренда инструмента (TbankInstrumentClassification, обновление раз в 24 ч), шаг классификации в часовом обходе до публикации Snapshot, новые вызовы T-Bank (etfBy, getAssetBy) с opt-in NOT_FOUND, поля
sectorиissuerв позиции Portfolio, нормализация старых Snapshot.Linked Issue
WealthLedger/main#48
Changes
TbankInstrumentClassificationTbankClient.getEtf/getAssetBrand, opt-in NOT_FOUND только для новых вызововPositionClassificationService+ repository, шаг доpublishвqueueSnapshotsector/issuer, регенерацияopenapi.jsonVerification
npm run verify— lint, typecheck, 302 unit-теста, e2e SQLite — OKnpm run openapi:check,npm run test:openapi-contract(4/4) — OKgit diff --check— OKRelated PRs
account-top-positionsBreaking Changes
Нет: ответ Portfolio расширен необязательными полями.