Compare commits

...

2 Commits

Author SHA1 Message Date
462212c95e docs: update apps/docs — fix inconsistencies, add broker events diagrams
Some checks failed
CI / ci (pull_request) Failing after 3m18s
CI / ci (push) Failing after 3m16s
2026-06-22 22:15:51 +03:00
62a8cffc96 fix: resolve unhandled promise rejection in broker events test; update docs: roadmap and epics status 2026-06-22 22:02:43 +03:00
20 changed files with 286 additions and 85 deletions

View File

@ -392,3 +392,16 @@
`DELETE` endpoints возвращают `{ data: null, meta }`, что отражено в OpenAPI schema и frontend `DELETE` endpoints возвращают `{ data: null, meta }`, что отражено в OpenAPI schema и frontend
codegen types. codegen types.
## Broker (T-Bank Invest)
Все broker endpoints защищены JWT и возвращают envelope `{ data, meta }`.
| Endpoint | Method | Описание |
|---|---|---|
| `/api/v1/broker/accounts` | GET | Список брокерских счетов и ИИС |
| `/api/v1/broker/accounts/:accountId/portfolio` | GET | Портфель счёта: позиции, cash, метаданные |
| `/api/v1/broker/accounts/:accountId/events` | GET | События и будущие выплаты (дивиденды, купоны) с фильтром по датам |
| `/api/v1/broker/accounts/:accountId/operations` | GET | История операций (cursor pagination) |
| `/api/v1/broker/accounts/:accountId/operations/refresh` | POST | Принудительная синхронизация операций из T-Bank |
| `/api/v1/broker/accounts/:accountId/positions` | GET | Позиции счёта (с пагинацией) |

View File

@ -48,5 +48,7 @@ apps/backend/src/
├── securities/ ├── securities/
├── shares/ ├── shares/
├── bonds/ ├── bonds/
└── candles/ ├── candles/
├── portfolio/
└── tbank/
``` ```

View File

@ -40,9 +40,44 @@ root CA, которым локальная сеть или proxy подписы
|---|---| |---|---|
| `GET /api/v1/broker/accounts` | Открытые брокерские счета и ИИС | | `GET /api/v1/broker/accounts` | Открытые брокерские счета и ИИС |
| `GET /api/v1/broker/accounts/:accountId/portfolio` | Итоги портфеля, позиции, деньги и заблокированные деньги | | `GET /api/v1/broker/accounts/:accountId/portfolio` | Итоги портфеля, позиции, деньги и заблокированные деньги |
| `GET /api/v1/broker/accounts/:accountId/events` | Будущие события (дивиденды, купоны, погашения, оферты) и прошедшие фактические выплаты с фильтром по датам и типам |
| `GET /api/v1/broker/accounts/:accountId/operations` | История операций с cursor pagination | | `GET /api/v1/broker/accounts/:accountId/operations` | История операций с cursor pagination |
| `POST /api/v1/broker/accounts/:accountId/operations/sync` | Синхронизация истории операций в локальные Prisma-таблицы | | `POST /api/v1/broker/accounts/:accountId/operations/sync` | Синхронизация истории операций в локальные Prisma-таблицы |
## Поток данных для `/events`
Endpoint `/events` агрегирует будущие события и прошедшие выплаты из нескольких источников:
```mermaid
sequenceDiagram
actor User
participant Frontend
participant Backend
participant TBank as T-Bank gRPC
participant MOEX as MOEX ISS (cache)
User->>Frontend: Открывает вкладку «События»
Frontend->>Backend: GET /broker/accounts/:id/events?from=X&to=Y&types=Z
Backend->>TBank: GetPositions (текущие позиции счёта)
TBank-->>Backend: positions[]
loop Для каждой позиции
Backend->>MOEX: Получить график купонов / дивидендов
MOEX-->>Backend: futureEvents[]
end
Backend->>TBank: GetOperationsByCursor (фактические выплаты за период)
TBank-->>Backend: pastPayouts[]
Note over Backend: Агрегация + фильтр по from/to/types
Backend-->>Frontend: { events[], summary }
Frontend->>User: Отображает таблицу событий и сумму выплат
```
- **Будущие события** — строятся на лету по текущим позициям счёта и MOEX-метаданным (график купонов, даты дивидендов). Не записываются в БД.
- **Прошедшие выплаты** — извлекаются из истории операций T-Bank за указанный период.
- **Summary** — агрегированная оценка будущих выплат (не является гарантированной суммой).
- Кешируется через `CACHE_TBANK_EVENTS_TTL`.
Типы событий: `dividend`, `coupon`, `maturity`, `offer`. Первые три относятся к `cashflow`, `offer` — к `corporate`.
## Методы T-Bank ## Методы T-Bank
| Задача | Метод T-Bank | | Задача | Метод T-Bank |
@ -51,6 +86,7 @@ root CA, которым локальная сеть или proxy подписы
| Итоги портфеля | `OperationsService/GetPortfolio` | | Итоги портфеля | `OperationsService/GetPortfolio` |
| Деньги и settled-позиции | `OperationsService/GetPositions` | | Деньги и settled-позиции | `OperationsService/GetPositions` |
| История операций | `OperationsService/GetOperationsByCursor` | | История операций | `OperationsService/GetOperationsByCursor` |
| События и выплаты | Агрегация из позиций счёта + фактических операций |
| Метаданные инструментов | `InstrumentsService/GetInstrumentBy` | | Метаданные инструментов | `InstrumentsService/GetInstrumentBy` |
## Кеширование и синхронизация ## Кеширование и синхронизация
@ -62,6 +98,7 @@ Direct-read endpoints используют короткий in-memory cache, ч
- портфель: `CACHE_TBANK_PORTFOLIO_TTL` - портфель: `CACHE_TBANK_PORTFOLIO_TTL`
- позиции: `CACHE_TBANK_POSITIONS_TTL` - позиции: `CACHE_TBANK_POSITIONS_TTL`
- страницы операций: `CACHE_TBANK_OPERATIONS_TTL` - страницы операций: `CACHE_TBANK_OPERATIONS_TTL`
- события и прогноз выплат: `CACHE_TBANK_EVENTS_TTL`
- метаданные инструментов: `CACHE_TBANK_INSTRUMENT_TTL` - метаданные инструментов: `CACHE_TBANK_INSTRUMENT_TTL`
Для долговременной истории операций есть отдельные таблицы Prisma: Для долговременной истории операций есть отдельные таблицы Prisma:

View File

@ -7,11 +7,16 @@
| `npm run dev:backend` | Запуск NestJS в режиме watch на :3000 | | `npm run dev:backend` | Запуск NestJS в режиме watch на :3000 |
| `npm run dev:frontend` | Vite dev-сервер на `:5173`, проксирует `/api` на backend | | `npm run dev:frontend` | Vite dev-сервер на `:5173`, проксирует `/api` на backend |
| `npm run dev:docs` | Docusaurus dev-сервер документации | | `npm run dev:docs` | Docusaurus dev-сервер документации |
| `npm run dev:design-system` | Storybook dev-сервер дизайн-системы |
| `npm run build:backend` | `nest build` | | `npm run build:backend` | `nest build` |
| `npm run build:frontend` | `tsc -b && vite build` | | `npm run build:frontend` | `tsc -b && vite build` |
| `npm run build:docs` | `docusaurus build` | | `npm run build:docs` | `docusaurus build` |
| `npm run build:design-system` | TypeScript build дизайн-системы |
| `npm run build:storybook` | Production build Storybook |
| `npm run test:backend` | Offline backend unit tests через Vitest | | `npm run test:backend` | Offline backend unit tests через Vitest |
| `npm run test:frontend` | Frontend tests через Vitest + Testing Library | | `npm run test:frontend` | Frontend tests через Vitest + Testing Library |
| `npm run test:design-system` | Design system tests через Vitest |
| `npm run test:storybook` | Storybook browser tests (Playwright) |
| `npm run lint` | ESLint для backend и frontend | | `npm run lint` | ESLint для backend и frontend |
| `npm run format` | Prettier для всех `*.{ts,tsx}` | | `npm run format` | Prettier для всех `*.{ts,tsx}` |
| `npm run format:check` | Проверка Prettier для всех `*.{ts,tsx}` | | `npm run format:check` | Проверка Prettier для всех `*.{ts,tsx}` |
@ -39,6 +44,15 @@
| `npm run lint -w apps/frontend` | ESLint для `src/**/*.{ts,tsx}` | | `npm run lint -w apps/frontend` | ESLint для `src/**/*.{ts,tsx}` |
| `npm run test -w apps/frontend` | Frontend Vitest suite | | `npm run test -w apps/frontend` | Frontend Vitest suite |
## Design system workspace
| Команда | Описание |
|---|---|
| `npm run dev -w packages/design-system` | Storybook dev-server |
| `npm run build -w packages/design-system` | TypeScript build |
| `npm run build:storybook -w packages/design-system` | Production build Storybook |
| `npm run test -w packages/design-system` | Vitest suite |
## Docs workspace ## Docs workspace
| Команда | Описание | | Команда | Описание |

View File

@ -51,6 +51,28 @@ npm run test -w apps/frontend
Тесты покрывают API-клиент, auth context, hooks, базовые pages и shared components. Тесты покрывают API-клиент, auth context, hooks, базовые pages и shared components.
## Тесты design system
Фреймворк: **Vitest** + **React Testing Library** + **Accessibility check**.
Запуск:
```bash
npm run test:design-system
# или
npm run test -w packages/design-system
```
Тесты покрывают компоненты дизайн-системы: Button, DataTable, Select, Skeleton, Money и др.
## Storybook browser tests
Интерактивные тесты Storybook через Playwright.
```bash
npm run test:storybook
```
## Live MOEX integration tests ## Live MOEX integration tests
Live MOEX checks вынесены из default backend suite. Live MOEX checks вынесены из default backend suite.

View File

@ -1,7 +1,7 @@
# Компоненты # Компоненты
Published docs ниже перечисляют primary entrypoints. Legacy файлы в `components/` сохранены как Published docs ниже перечисляют primary entrypoints. Все legacy-файлы в `components/` удалены,
тонкие re-export shim'ы для coexistence со старыми импортами. компоненты используют FSD-структуру.
## Layout (`app/layouts/AppLayout.tsx`, legacy shim: `components/Layout.tsx`) ## Layout (`app/layouts/AppLayout.tsx`, legacy shim: `components/Layout.tsx`)
@ -19,7 +19,7 @@ Published docs ниже перечисляют primary entrypoints. Legacy фа
- При клике на результат переходит на `/stocks/:secid` или `/bonds/:secid` - При клике на результат переходит на `/stocks/:secid` или `/bonds/:secid`
- Закрывается при клике вне компонента - Закрывается при клике вне компонента
Legacy path `components/SearchBar.tsx` остаётся shim-файлом и не является primary entrypoint. Legacy path `components/SearchBar.tsx` удалён.
## PriceChart (`widgets/price-chart/ui/PriceChart.tsx`, public API: `widgets/price-chart`) ## PriceChart (`widgets/price-chart/ui/PriceChart.tsx`, public API: `widgets/price-chart`)
@ -30,7 +30,7 @@ Legacy path `components/SearchBar.tsx` остаётся shim-файлом и н
- Цвета: зелёный для роста, красный для падения - Цвета: зелёный для роста, красный для падения
- Адаптивная ширина (resize listener) - Адаптивная ширина (resize listener)
Legacy path `components/PriceChart.tsx` остаётся shim-файлом. Legacy path `components/PriceChart.tsx` удалён.
## StockDetails (`widgets/stock-details/ui/StockDetails.tsx`, public API: `widgets/stock-details`) ## StockDetails (`widgets/stock-details/ui/StockDetails.tsx`, public API: `widgets/stock-details`)
@ -39,7 +39,7 @@ Legacy path `components/PriceChart.tsx` остаётся shim-файлом.
- Принимает `ShareResponse` - Принимает `ShareResponse`
- Отображает: название, тикер, ISIN, цена, изменение (%), open/high/low, объём, капитализация, уровень листинга - Отображает: название, тикер, ISIN, цена, изменение (%), open/high/low, объём, капитализация, уровень листинга
Legacy path `components/StockDetails.tsx` остаётся shim-файлом. Legacy path `components/StockDetails.tsx` удалён.
## BondDetails (`widgets/bond-details/ui/BondDetails.tsx`, public API: `widgets/bond-details`) ## BondDetails (`widgets/bond-details/ui/BondDetails.tsx`, public API: `widgets/bond-details`)
@ -48,7 +48,7 @@ Legacy path `components/StockDetails.tsx` остаётся shim-файлом.
- Принимает `BondResponse` - Принимает `BondResponse`
- Отображает: название, ISIN, цена (в % от номинала), номинал, дата погашения, купон (сумма/%), период купона, НКД, доходность к погашению, дюрация, тип - Отображает: название, ISIN, цена (в % от номинала), номинал, дата погашения, купон (сумма/%), период купона, НКД, доходность к погашению, дюрация, тип
Legacy path `components/BondDetails.tsx` остаётся shim-файлом. Legacy path `components/BondDetails.tsx` удалён.
## DividendsTable (`widgets/dividends-table/ui/DividendsTable.tsx`, public API: `widgets/dividends-table`) ## DividendsTable (`widgets/dividends-table/ui/DividendsTable.tsx`, public API: `widgets/dividends-table`)
@ -57,3 +57,12 @@ Legacy path `components/BondDetails.tsx` остаётся shim-файлом.
- Принимает готовый список дивидендов через props - Принимает готовый список дивидендов через props
- Рендерит payout-историю без собственных query-вызовов - Рендерит payout-историю без собственных query-вызовов
- Используется page-layer как prop-driven widget - Используется page-layer как prop-driven widget
## BrokerEventsOverview (`widgets/broker-events-overview/ui/BrokerEventsOverview.tsx`, public API: `widgets/broker-events-overview`)
Обзор ближайших событий и будущих выплат брокерского счёта.
- Принимает `accountId`
- Показывает до 5 ближайших событий (дивиденды, купоны)
- Ссылка на полную страницу событий
- Состояния: загрузка, ошибка, пустой список

View File

@ -10,6 +10,7 @@
| `useStockDividends(secid)` | `['stockDividends', secid]` | 86400s | Дивиденды акции | | `useStockDividends(secid)` | `['stockDividends', secid]` | 86400s | Дивиденды акции |
| `useBond(secid)` | `['bond', secid]` | 900s | Спецификация облигации | | `useBond(secid)` | `['bond', secid]` | 900s | Спецификация облигации |
| `useBondCandles(secid, interval, from, till)` | `['bondCandles', secid, interval, from, till]` | 3600s | Свечи облигации | | `useBondCandles(secid, interval, from, till)` | `['bondCandles', secid, interval, from, till]` | 3600s | Свечи облигации |
| `useBrokerEvents(accountId, { from, to, types })` | `['broker', 'events', accountId, from, to, types]` | 300s | Будущие события и прошедшие выплаты брокерского счёта |
## Public API ## Public API
@ -20,6 +21,7 @@
- broker-account hooks: `entities/broker-account/index.ts` - broker-account hooks: `entities/broker-account/index.ts`
- broker-position hooks: `entities/broker-position/index.ts` - broker-position hooks: `entities/broker-position/index.ts`
- broker-operation hooks: `entities/broker-operation/index.ts` - broker-operation hooks: `entities/broker-operation/index.ts`
- broker-event hooks: `entities/broker-event/index.ts`
- session hooks: `entities/session/index.ts` - session hooks: `entities/session/index.ts`
## Конфигурация Query ## Конфигурация Query

View File

@ -14,8 +14,8 @@ React SPA, собранная с Vite.
## Структура исходников ## Структура исходников
Published-структура ниже описывает primary FSD entrypoints. Исторические каталоги `api/`, `context/`, Published-структура ниже описывает primary FSD entrypoints. Исторические каталоги полностью
`hooks/`, `components/` ещё присутствуют в кодовой базе для ещё не мигрированных доменов. мигрированы.
``` ```
apps/frontend/src/ apps/frontend/src/
@ -34,6 +34,8 @@ apps/frontend/src/
│ └── layouts/ │ └── layouts/
│ ├── AppLayout.tsx # Шапка + <Outlet/> │ ├── AppLayout.tsx # Шапка + <Outlet/>
│ └── index.ts │ └── index.ts
├── features/ # FSD features
│ └── screener/ # Скринер ценных бумаг (api, model, ui)
├── shared/ ├── shared/
│ ├── api/ # shared API client, response types, generated OpenAPI types │ ├── api/ # shared API client, response types, generated OpenAPI types
│ └── ui/ # shared UI primitives without domain logic │ └── ui/ # shared UI primitives without domain logic
@ -55,6 +57,7 @@ apps/frontend/src/
│ ├── broker-account-card/ # Карточка брокерского счёта │ ├── broker-account-card/ # Карточка брокерского счёта
│ ├── broker-accounts-summary/ # Сводка брокерских счетов │ ├── broker-accounts-summary/ # Сводка брокерских счетов
│ ├── broker-allocation-chart/ # График распределения │ ├── broker-allocation-chart/ # График распределения
│ ├── broker-events-overview/ # Ближайшие события (обзор)
│ ├── broker-operations-table/ # Таблица операций │ ├── broker-operations-table/ # Таблица операций
│ ├── portfolio-card/ # Карточка портфеля │ ├── portfolio-card/ # Карточка портфеля
│ ├── portfolio-form/ # Форма портфеля │ ├── portfolio-form/ # Форма портфеля
@ -73,14 +76,9 @@ apps/frontend/src/
│ ├── screener/ # Скринер (не мигрирован) │ ├── screener/ # Скринер (не мигрирован)
│ ├── broker-accounts/ # FSD: page entrypoint │ ├── broker-accounts/ # FSD: page entrypoint
│ ├── broker-account/ # FSD: page entrypoint │ ├── broker-account/ # FSD: page entrypoint
│ ├── broker-events/ # FSD: page entrypoint
│ ├── broker-positions/ # FSD: page entrypoint │ ├── broker-positions/ # FSD: page entrypoint
│ └── broker-operations/ # FSD: page entrypoint │ └── broker-operations/ # FSD: page entrypoint
├── api/
│ └── screener.ts # Screener API helpers (не мигрирован)
├── hooks/
│ └── useScreener.ts # Screener hook (не мигрирован)
├── components/
│ └── screener/ # Screener UI (не мигрирован)
├── test/ ├── test/
│ ├── factories.ts # Фабрики тестовых данных │ ├── factories.ts # Фабрики тестовых данных
│ ├── handlers.ts # MSW handlers │ ├── handlers.ts # MSW handlers
@ -116,6 +114,7 @@ apps/frontend/src/
| `broker-account` | API брокерских счетов | useBrokerAccounts, useBrokerAccountPortfolios | BrokerAccountLayout | | `broker-account` | API брокерских счетов | useBrokerAccounts, useBrokerAccountPortfolios | BrokerAccountLayout |
| `broker-position` | API брокерских позиций | useBrokerPositions | — | | `broker-position` | API брокерских позиций | useBrokerPositions | — |
| `broker-operation` | API брокерских операций | useBrokerOperations | — | | `broker-operation` | API брокерских операций | useBrokerOperations | — |
| `broker-event` | API брокерских событий и выплат | useBrokerEvents | — |
Каждая сущность имеет barrel-файл `index.ts`, реэкспортирующий публичное API. Каждая сущность имеет barrel-файл `index.ts`, реэкспортирующий публичное API.
@ -135,17 +134,10 @@ apps/frontend/src/
- `pages/home`, `pages/stock`, `pages/bond` — FSD page entrypoints для market pages - `pages/home`, `pages/stock`, `pages/bond` — FSD page entrypoints для market pages
- `pages/broker-*` — FSD page entrypoints для брокерского домена - `pages/broker-*` — FSD page entrypoints для брокерского домена
- Временно не мигрированы: `portfolios/`, `screener/`, `LoginPage.tsx`, `RegisterPage.tsx`, `ProfilePage.tsx` - `pages/portfolios/` — FSD page entrypoints для портфелей
- `pages/screener/` — FSD page entrypoint для скринера
- `pages/LoginPage.tsx`, `RegisterPage.tsx`, `ProfilePage.tsx` — auth страницы, используют FSD-imports из `entities/session`
### Не мигрировано ### features
Скринер остаётся в исторической структуре: - `features/screener/` — скринер: FilterPanel, FilterPanelBond, FilterPanelShare, ScreenerTable, useScreener hook
- `api/screener.ts` — API-вызовы
- `hooks/useScreener.ts` — логика с URLSearchParams
- `components/screener/` — FilterPanel, FilterPanelBond, FilterPanelShare, ScreenerTable
- `pages/screener/ScreenerPage.tsx` — страница
Страницы аутентификации (`LoginPage`, `RegisterPage`, `ProfilePage`) — плоские, но используют FSD-импорты из `entities/session`.
ESLint-правила на границы импортов FSD пока не введены.

View File

@ -15,6 +15,7 @@ Source of truth для маршрутов: `apps/frontend/src/app/routing/AppRou
| `/portfolios/:id` | `PortfolioDetailPage` | Protected | Детальная страница портфеля | | `/portfolios/:id` | `PortfolioDetailPage` | Protected | Детальная страница портфеля |
| `/broker` | `BrokerAccountsPage` from `pages/broker-accounts` | Protected | Список брокерских счетов | | `/broker` | `BrokerAccountsPage` from `pages/broker-accounts` | Protected | Список брокерских счетов |
| `/broker/:accountId` | `BrokerAccountLayout` + nested pages | Protected | Детальная область брокерского счёта | | `/broker/:accountId` | `BrokerAccountLayout` + nested pages | Protected | Детальная область брокерского счёта |
| `/broker/:accountId/events` | `BrokerEventsPage` from `pages/broker-events` | Protected | Календарь событий и выплат |
Все page entrypoints живут в FSD-слоях: Все page entrypoints живут в FSD-слоях:
@ -25,6 +26,7 @@ Source of truth для маршрутов: `apps/frontend/src/app/routing/AppRou
- `pages/broker-account` - `pages/broker-account`
- `pages/broker-positions` - `pages/broker-positions`
- `pages/broker-operations` - `pages/broker-operations`
- `pages/broker-events`
Все страницы обёрнуты в `AppLayout`, который содержит: Все страницы обёрнуты в `AppLayout`, который содержит:
@ -87,7 +89,37 @@ Source of truth для маршрутов: `apps/frontend/src/app/routing/AppRou
<Route path="shares" element={<BrokerPositionsPage type="share" title="Акции" />} /> <Route path="shares" element={<BrokerPositionsPage type="share" title="Акции" />} />
<Route path="bonds" element={<BrokerPositionsPage type="bond" title="Облигации" />} /> <Route path="bonds" element={<BrokerPositionsPage type="bond" title="Облигации" />} />
<Route path="operations" element={<BrokerOperationsPage />} /> <Route path="operations" element={<BrokerOperationsPage />} />
<Route path="events" element={<BrokerEventsPage />} />
</Route> </Route>
</Route> </Route>
</Routes> </Routes>
``` ```
## Композиция страницы событий
Страница `/broker/:accountId/events` собирается из FSD-слоёв:
```mermaid
flowchart TB
BrokerEventsPage["pages/broker-events<br/>BrokerEventsPage"]
useBrokerEvents["entities/broker-event<br/>useBrokerEvents"]
BrokerEventApi["entities/broker-event/api<br/>brokerEventApi"]
BrokerEventsOverview["widgets/broker-events-overview<br/>BrokerEventsOverview"]
DS["@moex-vibe/design-system<br/>DatePicker, Select, Button<br/>DataTable, Metric, LoadingState"]
BrokerEventsPage --> useBrokerEvents
BrokerEventsPage --> BrokerEventsOverview
BrokerEventsPage --> DS
useBrokerEvents --> BrokerEventApi
subgraph Overview["Обзор на dashboard счёта"]
BrokerAccountOverview["pages/broker-account<br/>BrokerAccountOverviewPage"]
BrokerAccountOverview --> BrokerEventsOverview
end
```
- `BrokerEventsPage` — entrypoint страницы: фильтр по датам/типам, таблица событий, summary
- `BrokerEventsOverview` — компактный блок 5 ближайших событий (используется на overview счёта)
- `useBrokerEvents` — TanStack Query hook с ключом `['broker', 'events', accountId, from, to, types]`
```

View File

@ -18,25 +18,21 @@ env:
## Jobs ## Jobs
### lint Единый job `ci` выполняет последовательно:
- `actions/checkout@v4` 1. **Checkout**`actions/checkout@v4`
- `actions/setup-node@v4` (Node 20) 2. **Setup Node**`actions/setup-node@v4` (Node 20)
- `npm ci` 3. **Install**`npm ci`
- `npm run lint` (ESLint для бэкенда) 4. **Lint**`npm run lint`
- `npx prettier --check "**/*.{ts,tsx}"` (проверка форматирования) 5. **Format check**`npm run format:check`
6. **Test backend**`npm run test:backend`
7. **Test frontend**`npm run test:frontend`
8. **Test design system**`npm run test:design-system`
9. **Test Storybook (browser)**`npm run test:storybook`
10. **Build backend**`npm run build:backend`
11. **Build frontend**`npm run build:frontend`
12. **Build design system**`npm run build:design-system`
13. **Build Storybook**`npm run build:storybook`
14. **Build docs**`npm run build:docs`
### test При failure Storybook build артефакты загружаются для диагностики.
- `actions/checkout@v4`
- `actions/setup-node@v4` (Node 20)
- `npm ci`
- `npm run test:backend` (vitest)
### build
- `actions/checkout@v4`
- `actions/setup-node@v4` (Node 20)
- `npm ci`
- `npm run build:backend` (nest build)
- `npm run build:frontend` (tsc -b && vite build)

View File

@ -78,6 +78,11 @@ const sidebars: SidebarsConfig = {
'adr/ADR-009-portfolio-domain', 'adr/ADR-009-portfolio-domain',
'adr/ADR-010-backend-price-computation', 'adr/ADR-010-backend-price-computation',
'adr/ADR-011-tbank-invest-grpc', 'adr/ADR-011-tbank-invest-grpc',
'adr/ADR-012-frontend-broker-account-aggregation',
'adr/ADR-013-frontend-fsd-broker-pilot',
'adr/ADR-014-frontend-fsd-market-pages',
'adr/ADR-015-frontend-libraries-modernization',
'adr/ADR-016-design-system',
], ],
}, },
], ],

View File

@ -109,7 +109,7 @@ describe('BrokerEventsOverview', () => {
isPlaceholderData: false, isPlaceholderData: false,
isStale: false, isStale: false,
refetch: vi.fn(), refetch: vi.fn(),
promise: Promise.reject(new Error('fail')), promise: new Promise<never>(() => {}),
status: 'error', status: 'error',
fetchStatus: 'idle', fetchStatus: 'idle',
} as unknown as ReturnType<typeof useBrokerEvents>); } as unknown as ReturnType<typeof useBrokerEvents>);

View File

@ -1,4 +1,6 @@
Авторизация # Аутентификация
Статус: завершён
Features: Features:
- auth-system - [x] [auth-system](../features/auth-system/spec.md) — регистрация, вход, JWT + refresh token, страницы

View File

@ -24,14 +24,14 @@
## Features ## Features
- [T-Bank broker portfolios](../features/tbank-broker-portfolios/spec.md) - [x] [T-Bank broker portfolios](../features/tbank-broker-portfolios/spec.md) — реализовано
- [Отображение брокерского портфеля](../features/broker-portfolio-display/spec.md) - [x] [Отображение брокерского портфеля](../features/broker-portfolio-display/spec.md) — реализовано
- [x] [Разделы брокерского счёта](../features/broker-account-sections/spec.md) — реализовано - [x] [Разделы брокерского счёта](../features/broker-account-sections/spec.md) — реализовано
- [Информативный обзор брокерских счетов](../features/broker-accounts-overview/spec.md) - [x] [Информативный обзор брокерских счетов](../features/broker-accounts-overview/spec.md) — реализовано
- [x] [Календарь событий и прогноз будущих выплат брокерского счёта](../features/broker-events-and-payouts/spec.md) — реализовано - [x] [Календарь событий и прогноз будущих выплат брокерского счёта](../features/broker-events-and-payouts/spec.md) — реализовано
- [Улучшение UI операций](../features/broker-operations-ui-improvements/spec.md) - [x] [Исправление deadline и очереди T-Bank](../features/tbank-deadline-queue-fix/spec.md) — реализовано
- [Пагинация и загрузка позиций](../features/broker-positions-pagination-and-loading/spec.md) - [~] [Улучшение UI операций](../features/broker-operations-ui-improvements/spec.md) — черновик, частично
- [Исправление deadline и очереди T-Bank](../features/tbank-deadline-queue-fix/spec.md) - [~] [Пагинация и загрузка позиций](../features/broker-positions-pagination-and-loading/spec.md) — черновик, частично
## Критерий завершения эпика ## Критерий завершения эпика

View File

@ -1,5 +1,7 @@
Developer Operations # Developer Operations
Статус: завершён
Features: Features:
- ci-cd - [x] [ci-cd](../features/ci-cd/spec.md) — Gitea Actions pipeline
- pre-commit-checks - [x] [pre-commit-checks](../features/pre-commit-checks/spec.md) — Husky + lint-staged

View File

@ -1,5 +1,7 @@
Документация # Документация
Статус: завершён
Features: Features:
- docusaurus-docs - [x] [docusaurus-docs](../features/docusaurus-docs/spec.md)
- russian-docs-and-architecture-diagrams - [x] [russian-docs-and-architecture-diagrams](../features/russian-docs-and-architecture-diagrams/spec.md)

View File

@ -1,9 +0,0 @@
Страница портфеля
Features:
- pagination-loading-overlay
- portfolio
- portfolio-allocation-chart
- portfolio-analytics
- portfolio-enricher-optimization
- portfolio-list-enrichment

View File

@ -0,0 +1,16 @@
# Портфельная страница
Статус: активный
## Цель
Страница управления ручными портфелями — создание, редактирование, аналитика, распределение активов.
## Features
- [x] [pagination-loading-overlay](../features/pagination-loading-overlay/spec.md)
- [x] [portfolio](../features/portfolio/spec.md)
- [x] [portfolio-allocation-chart](../features/portfolio-allocation-chart/spec.md)
- [x] [portfolio-analytics](../features/portfolio-analytics/spec.md)
- [x] [portfolio-enricher-optimization](../features/portfolio-enricher-optimization/spec.md)
- [x] [portfolio-list-enrichment](../features/portfolio-list-enrichment/spec.md)

View File

@ -1,5 +1,7 @@
Контроль качества # Контроль качества
Статус: активный
Features: Features:
- frontend-test-coverage - [x] [frontend-test-coverage](../features/frontend-test-coverage/spec.md)
- quality-gate-contract-docs - [~] [quality-gate-contract-docs](../features/quality-gate-contract-docs/spec.md) — частично

View File

@ -4,25 +4,87 @@ Roadmap отражает порядок продуктовой работы, н
Требования и разрешение на реализацию определяются спецификацией конкретной фичи и текущей задачей Требования и разрешение на реализацию определяются спецификацией конкретной фичи и текущей задачей
пользователя. пользователя.
## Завершённые эпики
### [Аутентификация](epics/Authentication.md)
- [x] [auth-system](features/auth-system/spec.md) — полноценная регистрация, вход, JWT + refresh token,
страницы login/register/profile, session provider.
### [Документация](epics/Documentation.md)
- [x] [docusaurus-docs](features/docusaurus-docs/spec.md) — 30+ страниц документации, ADR, диаграммы.
- [x] [russian-docs-and-architecture-diagrams](features/russian-docs-and-architecture-diagrams/spec.md) —
документация на русском, декомпозированные схемы архитектуры.
### [DevOps](epics/DevOps.md)
- [x] [ci-cd](features/ci-cd/spec.md) — Gitea Actions: lint, test, build всех пакетов + Storybook.
- [x] [pre-commit-checks](features/pre-commit-checks/spec.md) — Husky + lint-staged.
## Активные эпики ## Активные эпики
### [Портфель брокера](epics/BrokerPortfolio.md) ### [Портфель брокера](epics/BrokerPortfolio.md)
Цель: сделать реальные брокерские счета понятными на уровне обзора, позиций и операций. Цель: дать пользователю целостный доступ к реальным брокерским счетам T-Bank.
- [x] [Разделы брокерского счёта](features/broker-account-sections/spec.md) — реализовано. - [x] [T-Bank broker portfolios](features/tbank-broker-portfolios/spec.md) — интеграция с gRPC,
- [x] [Информативный обзор брокерских счетов](features/broker-accounts-overview/spec.md) — реализовано. синхронизация счетов/позиций/операций.
- [x] [Календарь событий и прогноз будущих выплат брокерского счёта](features/broker-events-and-payouts/spec.md) - [x] [Отображение брокерского портфеля](features/broker-portfolio-display/spec.md) — таблицы позиций
— отдельная вкладка событий и прогноз будущих выплат по выбранному диапазону дат для T-Bank по классам, история операций с пагинацией.
счёта. - [x] [Разделы брокерского счёта](features/broker-account-sections/spec.md) — навигация по вкладкам,
обзор/позиции/операции/события.
- [x] [Информативный обзор брокерских счетов](features/broker-accounts-overview/spec.md) —
сводка по всем счетам с агрегацией.
- [x] [Календарь событий и прогноз будущих выплат](features/broker-events-and-payouts/spec.md) —
вкладка событий и прогноз выплат по диапазону дат.
- [x] [Исправление deadline и очереди T-Bank](features/tbank-deadline-queue-fix/spec.md) — deadline
внутри PQueue, best-effort обогащение.
- [~] [Улучшение UI операций](features/broker-operations-ui-improvements/spec.md) — черновик,
`keepPreviousData` внедрён, `formatMoney` с префиксом не реализован.
- [~] [Пагинация и загрузка позиций](features/broker-positions-pagination-and-loading/spec.md) —
черновик, пагинация и скелетоны есть, отдельная секция позиций не выделена.
## Следующие этапы для активной фичи ### [Портфельная страница](epics/PortfolioDashboard.md)
1. [x] Проверить и утвердить `spec.md` для планирования. Цель: страница управления портфелями — создание, аналитика, распределение.
2. [x] Проверить и утвердить подготовленные `plan.md` и `tasks.md`.
3. [x] Получить отдельное подтверждение пользователя перед началом реализации. - [x] [Portfolio CRUD](features/portfolio/spec.md) — создание/редактирование ручных портфелей,
добавление позиций.
- [x] [График распределения](features/portfolio-allocation-chart/spec.md) — SVG donut chart.
- [x] [Обогащение списка портфелей](features/portfolio-list-enrichment/spec.md) — batch MOEX
обогащение (totalValue, positionCount).
- [x] [Оптимизация обогащения](features/portfolio-enricher-optimization/spec.md) — batch-методы
MoexClient.
- [~] [Аналитика портфеля](features/portfolio-analytics/spec.md) — Phase 1 (cost basis + PnL)
реализован; Phase 2 (дивиденды) и Phase 3 (target allocation) частично.
- [~] [Пагинация и overlay загрузки](features/pagination-loading-overlay/spec.md) — черновик,
`keepPreviousData` и `loading-spinner` есть, компонент `TableLoadingOverlay` не выделен.
### [Контроль качества](epics/QualityAssurance.md)
- [x] [Покрытие frontend-тестами](features/frontend-test-coverage/spec.md) — Vitest + Testing Library +
MSW, тесты в colocation.
- [~] [Quality gate и контрактная документация](features/quality-gate-contract-docs/spec.md) —
docs обновлены, OpenAPI актуален; некоторые AC в работе.
## Крупные завершённые работы (вне эпиков)
- [x] [FSD-миграция фронтенда](features/fsd-frontend-refactor/spec.md) — поэтапный переход на
Feature-Sliced Design через 10+ features: entities, shared, market pages, broker pilot,
portfolios, screener, app-auth, cleanup, final.
- [x] [Дизайн-система](features/design-system-foundation/spec.md) — `@moex-vibe/design-system`:
три уровня токенов, MUI theme, DataTable, базовые компоненты, Storybook.
- [x] [Миграция брокерских разделов на DS](features/broker-account-sections-ds-migration/spec.md)
- [x] [Миграция страницы счетов на DS](features/broker-accounts-page-migration/spec.md)
- [x] [Pilot-миграция](features/pilot-migration/spec.md) — HomePage + SearchBar на DS.
- [x] [Security screener](features/security-screener/spec.md) — Phase 1: фильтры, таблица, backend.
- [x] [MVP](features/moex-vibe/spec.md) — поиск, карточки акций/облигаций, графики, дивиденды.
## Кандидаты следующих фич ## Кандидаты следующих фич
- [ ] [Миграция таблиц на дизайн-систему](features/table-migration/spec.md) — перевести legacy-таблицы - [ ] [Миграция таблиц на дизайн-систему](features/table-migration/spec.md) — перевести legacy-таблицы
frontend на `DataTable` поверх `TanStack Table` без изменения бизнес-логики. на `DataTable` поверх `TanStack Table`.
- [ ] Аналитика портфеля Phases 23 — дивидендный доход, сравнение с target allocation.
- [ ] Quality gate — завершить оставшиеся AC.
- [ ] Broker-events — UX доработки и смешанный календарь.