129 lines
9.1 KiB
Markdown
129 lines
9.1 KiB
Markdown
# Финальный редизайн брокерского overview по HTML — задачи
|
||
|
||
Дата: 2026-06-27
|
||
Статус: реализация завершена
|
||
|
||
## Документация и pre-flight
|
||
|
||
- [x] Создать `docs/features/broker-account-overview-html-parity/spec.md`.
|
||
- [x] Создать `docs/features/broker-account-overview-html-parity/plan.md`.
|
||
- [x] Создать `docs/features/broker-account-overview-html-parity/tasks.md`.
|
||
- [x] Зафиксировать canonical visual reference:
|
||
`docs/research/frontend-overview-redesign/example.html`.
|
||
- [x] Зафиксировать, что `docs/research/2026-06-27-broker-account-redesign.html` не является
|
||
source of truth для этой итерации.
|
||
- [x] Зафиксировать финальный порядок блоков:
|
||
`Заголовок счёта → Стоимость портфеля за 6 месяцев → Аналитика доходности → Структура → Последние события`.
|
||
- [x] Зафиксировать, что production UI не переносит demo-toggle `Данные / Загрузка`.
|
||
- [x] Перед началом реализации убедиться, что работа идёт в feature branch.
|
||
- [x] Перед началом реализации запустить baseline checks текущей ветки.
|
||
|
||
## Backend contract
|
||
|
||
- [x] Расширить `BrokerAnalyticsDto` полями `totalFees` и `totalTaxesPaid`.
|
||
- [x] Обновить `BrokerAnalyticsService`: считать комиссии из executed операций категории `fee`.
|
||
- [x] Обновить `BrokerAnalyticsService`: считать уплаченные налоги из executed операций категории `tax`.
|
||
- [x] Обновить `broker-analytics.service.spec.ts` для новых агрегатов и округления.
|
||
- [x] Добавить DTO для `BrokerPortfolioHistoryData`.
|
||
- [x] Добавить envelope DTO для portfolio history endpoint.
|
||
- [x] Добавить `BrokerPortfolioHistoryService`.
|
||
- [x] Добавить endpoint `GET /api/v1/broker/accounts/:accountId/portfolio/history?months=6`.
|
||
- [x] Покрыть portfolio history default months и response shape тестами.
|
||
- [x] Добавить `categories?: string` в `BrokerOperationQueryDto`.
|
||
- [x] Обновить `BrokerOperationsService`: применять category filtering для operations response.
|
||
- [x] Покрыть `categories=income,tax,fee` и неизвестные категории тестами.
|
||
- [x] Обновить `TBankController` и `tbank.controller.spec.ts` под новый endpoint/DTO.
|
||
|
||
## OpenAPI и frontend data layer
|
||
|
||
- [x] Запустить backend dev server для Swagger JSON.
|
||
- [x] Выполнить `npm run codegen -w apps/frontend`.
|
||
- [x] Проверить, что generated types содержат `totalFees`, `totalTaxesPaid` и portfolio history schemas.
|
||
- [x] Экспортировать новый `BrokerPortfolioHistory` alias из `apps/frontend/src/shared/api/index.ts`.
|
||
- [x] Добавить `getBrokerPortfolioHistory`.
|
||
- [x] Добавить `useBrokerPortfolioHistory`.
|
||
- [x] Добавить `categories` в frontend `BrokerOperationQuery`.
|
||
- [x] Не редактировать `apps/frontend/src/shared/api/types.ts` вручную.
|
||
|
||
## Frontend composition
|
||
|
||
- [x] Перестроить `BrokerDashboard` на финальный порядок блоков.
|
||
- [x] Убрать `BrokerDashboardHero` из overview-render path.
|
||
- [x] Перенести compact yield UI в заголовок счёта рядом с `Брокерский счёт`.
|
||
- [x] Убедиться, что page title loading state не показывает skeleton-полосы.
|
||
- [x] Создать `BrokerPortfolioHistoryCard`.
|
||
- [x] Подключить `useBrokerPortfolioHistory(accountId, { months: 6 })`.
|
||
- [x] Заменить overview `BrokerDashboardIncomeCard` на `BrokerPortfolioHistoryCard`.
|
||
- [x] Обновить `BrokerDashboardSkeleton` под финальный порядок и стабильные высоты.
|
||
|
||
## Frontend visual parity
|
||
|
||
- [x] Карточка `Стоимость портфеля за 6 месяцев`: зелёный градиентный фон и зелёная рамка.
|
||
- [x] График стоимости: 6 месячных значений, 6 подписей месяцев, плавная линия без visible markers.
|
||
- [x] График стоимости: первая точка у левого края, последняя у правого края.
|
||
- [x] Loading графика: chart-like indicator (meta skel + dashed guide + shimmer area).
|
||
- [x] Заголовок/yield: skeleton-полосы при загрузке портфеля (label, value, daily).
|
||
- [x] Analytics loading: 2 summary карточки + 6 detail карточек со skel барами.
|
||
- [x] Events loading: skeleton-table со структурой строк дата/инструмент/тип/сумма.
|
||
- [x] Analytics summary: только `Стоимость портфеля` и `Всего доходов`.
|
||
- [x] Analytics detail grid: `Пополнения`, `Выводы`, `Дивиденды`, `Купоны`, `Комиссия`,
|
||
`Уплаченные налоги`.
|
||
- [x] Analytics overview не показывает `Нетто` и `Всего получено`.
|
||
- [x] `Комиссия` и `Уплаченные налоги` отображаются как отрицательные UI-суммы.
|
||
- [x] Карточка структуры называется `Структура`.
|
||
- [x] Карточка структуры не показывает subtitle `Структура портфеля`.
|
||
- [x] Карточка структуры показывает итоговую стоимость под заголовком.
|
||
- [x] Карточка структуры показывает бары `Акции`, `Облигации`, `Деньги`.
|
||
- [x] Карточка последних событий называется `Последние события`.
|
||
- [x] Последние события используют executed operations, а не calendar events.
|
||
- [x] Последние события отсортированы новые → старые.
|
||
- [x] Последние события не показывают toolbar, count badge, footer summary и колонку `Статус`.
|
||
- [x] Инструмент в последних событиях: название сверху жирным, ticker/ISIN снизу серым.
|
||
- [x] Налоги/комиссии/списания отображаются красным и с корректным бейджем типа.
|
||
- [x] На mobile нет page-level horizontal overflow.
|
||
|
||
## Tests
|
||
|
||
- [x] Backend targeted:
|
||
`npm run test -w apps/backend -- src/modules/tbank/services/broker-analytics.service.spec.ts src/modules/tbank/tbank.controller.spec.ts`
|
||
- [x] Frontend targeted:
|
||
`npm run test -w apps/frontend -- --run src/widgets/broker-dashboard`
|
||
- [x] Full frontend:
|
||
`npm run test:frontend`
|
||
- [x] Frontend lint:
|
||
`npm run lint -w apps/frontend`
|
||
- [x] Frontend build:
|
||
`npm run build:frontend`
|
||
- [x] Проверить OpenAPI/codegen после backend изменений.
|
||
|
||
## Visual QA
|
||
|
||
- [ ] Проверить `/broker/:accountId` на desktop против
|
||
`docs/research/frontend-overview-redesign/example.html` (ручная проверка)
|
||
- [ ] Проверить `/broker/:accountId` на viewport `390x844` (ручная проверка)
|
||
|
||
## Definition of Done
|
||
|
||
- [x] Все acceptance criteria из `spec.md` выполнены.
|
||
- [x] Backend tests проходят (34 files, 161 passed).
|
||
- [x] Frontend targeted tests проходят.
|
||
- [x] `npm run test:frontend` проходит (32 files, 168 passed).
|
||
- [x] `npm run lint -w apps/frontend` проходит.
|
||
- [x] `npm run build:frontend` проходит.
|
||
- [x] Generated OpenAPI types обновлены через codegen.
|
||
- [ ] Visual QA desktop/mobile выполнена (ручная проверка).
|
||
- [x] Существующие detailed вкладки `Акции`, `Облигации`, `Операции`, `События`, `Аналитика`
|
||
остаются доступны.
|
||
- [x] `tasks.md` обновлён по факту выполнения.
|
||
|
||
## Дополнительные улучшения (после основной реализации)
|
||
|
||
- [x] Бейдж событий перевести с MUI Chip на кастомный Badge с цветами эталона.
|
||
- [x] Пагинация событий: wire `useState` + handlers, API limit поднят до 100.
|
||
- [x] Подписи месяцев на графике: первая left-aligned, последняя right-aligned.
|
||
- [x] `BrokerAnalyticsService` переписан на прямой вызов T-Bank API:
|
||
- убран Prisma для analytics;
|
||
- `GetOperationsByCursor` с пагинацией за всю историю (без ограничения по `from`);
|
||
- `GetPortfolio.expectedYield` используется как `totalReturnPercent`.
|
||
- [x] Структурные skeletons для chart/analytics/title-yield совпадают с эталоном.
|