3dfcf5aaa8
feat: complete broker account analytics with sync button, tests, and state filter
...
CI / ci (pull_request) Failing after 3m39s
CI / ci (push) Failing after 3m10s
- Add state filter (EXECUTED/null) to analytics query (spec compliance)
- Add service unit tests (11 tests) and controller test
- Add sync button to operations page with mutation hook
- Regenerate frontend types via codegen
- Update tasks.md marking all items complete
Backend: 114 tests, Frontend: 116 tests — all pass
2026-06-24 11:29:09 +03:00
abf3676ba1
fix(backend): export BrokerAnalyticsService from TBankModule
2026-06-24 09:42:35 +03:00
5cd56b239a
feat: wire up broker analytics endpoint, cache config, and module registration
...
- Add analytics cache key to TBANK_CACHE_KEYS
- Add tbankAnalyticsTtl to cache configuration
- Register and export BrokerAnalyticsService in TBankModule
- Add BrokerAnalyticsEnvelopeDto to broker envelope DTOs
- Add GET /accounts/:accountId/analytics endpoint to TBankController
- Fix TBankController spec to pass new constructor dependency
2026-06-24 09:41:57 +03:00
5184d34262
fix(backend): handle malformed payment JSON in analytics service
2026-06-24 09:40:41 +03:00
61e3398c71
feat(backend): add broker analytics DTO and service
2026-06-24 09:38:25 +03:00
063e80c375
feat(openapi): unify frontend types with codegen, fix backend nullable DTOs
...
- Fix ApiResponseMeta nullable property (add type: String) to prevent Record<string, never> in codegen
- Fix broker events DTO nullable fields with proper type annotations
- Regenerate frontend types.ts from updated Swagger schema
- Replace all hand-written types in responses.ts with codegen aliases
- Remove stale BrokerPortfolioEvent/BrokerEventsSummary/BrokerEventsData interfaces
- Fix codegen output path in frontend package.json
2026-06-23 19:58:23 +03:00
5b794c0419
feat: add Swagger response DTOs for all missing endpoints
...
- Shares: ShareEnvelopeDto, ShareMarketDataEnvelopeDto, DividendsEnvelopeDto,
ShareHistoryEnvelopeDto, DividendItemDto, HistoryItemDto
- Bonds: BondEnvelopeDto, BondMarketDataEnvelopeDto, BondHistoryEnvelopeDto,
BondHistoryItemDto
- Candles: CandleItemDto, CandleEnvelopeDto
- Securities: SearchResultItemDto, SearchEnvelopeDto
- Health: HealthResponseDto, HealthEnvelopeDto
- Add @ApiOkResponse decorators to all previously undocumented endpoints
- Reuse ApiResponseMeta from common for all envelope DTOs
2026-06-23 07:17:30 +03:00
f7dc338719
feat: add actual payouts and filter-as-draft UX to broker events calendar
...
CI / ci (pull_request) Failing after 3m9s
CI / ci (push) Failing after 3m9s
- Backend: actual events from T-Bank operations, types filter, split forecast/actual summary
- Frontend: draft/applied filters with multi-select types, status column (Факт/Прогноз), green actual amounts
- Docs: update spec, plan, tasks
2026-06-22 21:48:03 +03:00
c71ba090ad
test: remove unused test
CI / ci (push) Failing after 3m15s
2026-06-22 20:21:20 +03:00
595d059151
feat: add broker events calendar and payout projections for T-Bank accounts
CI / ci (push) Failing after 3m1s
2026-06-22 06:41:37 +03:00
a95308762f
docs: improve AGENTS.md and README.md
CI / ci (push) Successful in 3m20s
2026-06-19 13:32:49 +03:00
8aea56cbbf
feat: expose broker position counts
2026-06-18 23:15:32 +03:00
feaff2103e
perf(broker): parallel instrument name loading with per-service rate limit queues
...
- Split single p-queue (5 req/s) into 3 isolated queues:
operations (5/s), instruments (20/s), users (5/s)
- Removed dead instruments param from mapBrokerPortfolio
- portfolio/positions endpoints share raw GetPortfolio cache
- Docs: T_BANK_INSTRUMENTS_RATE_LIMIT, CACHE_TBANK_POSITIONS_TTL,
rate limiting section in tbank-invest.md
2026-06-18 06:34:55 +03:00
49ee364856
feat(broker): per-type positions pagination with independent tables
...
CI / lint (pull_request) Successful in 2m9s
CI / test (pull_request) Successful in 1m56s
CI / build (pull_request) Successful in 2m6s
CI / lint (push) Successful in 1m56s
CI / test (push) Successful in 1m55s
CI / build (push) Successful in 2m19s
- Add type query param to GET /accounts/:accountId/positions endpoint
- Backend filters T-Bank portfolio positions by instrument type before pagination
- Each instrument type (share, bond, etf, fund) has its own frontend table with
independent cursor-based pagination and skeleton loading
- Groups with no positions are automatically hidden
- Cache key includes type for correct per-type caching
- Remove centralized positions pagination state from BrokerAccountDetailPage
- 94 backend tests / 112 frontend tests pass
2026-06-18 06:02:54 +03:00
4b87eccba4
test(tbank): update portfolio tests, add getPositions tests, fix operation fixture name
2026-06-17 14:41:32 +03:00
8b202ef7d3
feat(tbank): add GET /positions endpoint with cursor pagination
2026-06-17 14:39:30 +03:00
6b3bdd2aec
fix(tbank): include cursor/limit in positions cache key, add tbankPositionsTtl config
2026-06-17 14:38:51 +03:00
bb7fef8deb
feat(tbank): add getPositions() method to BrokerPortfolioService
2026-06-17 14:36:32 +03:00
05f1e792c5
feat(tbank): extract mapBrokerPosition, add mapBrokerPositionsPage, add name to operation
2026-06-17 14:34:02 +03:00
953c7c29a6
feat(tbank): add positions page types/DTOs and operation name field
2026-06-17 14:30:48 +03:00
a8715258ca
fix: avoid stale tbank grpc deadlines
CI / lint (pull_request) Successful in 2m15s
CI / test (pull_request) Successful in 2m2s
CI / build (pull_request) Successful in 2m7s
CI / lint (push) Successful in 2m2s
CI / test (push) Successful in 2m10s
CI / build (push) Successful in 2m7s
2026-06-17 12:08:48 +03:00
8c2a6c9e3c
fix: trust tbank grpc root certificate
CI / lint (pull_request) Successful in 2m11s
CI / test (pull_request) Successful in 1m58s
CI / build (pull_request) Successful in 2m3s
CI / lint (push) Successful in 1m57s
CI / test (push) Successful in 2m4s
CI / build (push) Successful in 2m8s
2026-06-17 07:39:37 +03:00
ea916dfec9
fix: restrict and expose tbank broker sync
2026-06-17 06:57:49 +03:00
3fe4e7a4ec
fix: harden tbank operation sync
2026-06-17 06:47:18 +03:00
6e30177294
feat: persist tbank broker operations
2026-06-17 06:44:45 +03:00
b848d256d1
fix: load tbank proto contracts at runtime
2026-06-16 22:54:21 +03:00
d01d2b9f7f
feat: expose tbank broker operations
2026-06-16 22:46:19 +03:00
bd6b2589c0
feat: expose tbank broker portfolio
2026-06-16 22:43:40 +03:00
ddeab01b9e
feat: expose tbank broker accounts
2026-06-16 22:34:12 +03:00
4ef2f8d05e
feat: add tbank grpc client service
2026-06-16 22:23:33 +03:00
825095106c
feat: add tbank domain mappers
2026-06-16 22:20:01 +03:00
7a8bc7c90a
feat: configure tbank integration
2026-06-16 22:15:31 +03:00
526e5dc5f3
feat: add tbank invest proto contracts
2026-06-16 22:10:54 +03:00
739405a597
docs: consolidate SDD documentation
CI / lint (pull_request) Successful in 2m10s
CI / build (pull_request) Has been cancelled
CI / test (pull_request) Has been cancelled
CI / lint (push) Has been cancelled
CI / test (push) Has been cancelled
CI / build (push) Has been cancelled
2026-06-15 21:04:24 +03:00
c062850e83
docs: refine openapi null response schema
2026-06-15 19:54:31 +03:00
835686d886
docs: improve openapi schema metadata
2026-06-15 05:58:45 +03:00
44e13cc67e
test: cover checked-in openapi artifacts
2026-06-15 05:05:13 +03:00
974c83d67e
test: make backend service specs deterministic
2026-06-15 04:56:53 +03:00
c994b6a2fb
test: split moex live integration checks
2026-06-15 04:47:13 +03:00
96f003852d
feat: implement portfolio analytics, PnL calculation, and security screener
...
CI / lint (pull_request) Failing after 1m48s
CI / test (pull_request) Successful in 1m47s
CI / build (pull_request) Successful in 1m53s
CI / lint (push) Failing after 1m59s
CI / test (push) Successful in 1m56s
CI / build (push) Successful in 1m50s
- Add buyPrice and buyDate to positions for PnL tracking
- Implement backend analytics service for real-time portfolio performance
- Add server-side security screener with filtering, sorting, and pagination
- Update frontend UI with analytics summaries and sortable screener table
- Optimize MOEX API calls with batch fetching and portfolio-specific caching
- Add unit tests for analytics and screener services
2026-06-14 15:59:25 +03:00
a8b3b55896
feat(backend): add Swagger decorators for enriched portfolio list
2026-06-14 14:11:05 +03:00
f0e5e36b7d
feat(backend): enrich portfolio list with MOEX batch data
2026-06-14 14:08:43 +03:00
25a6d22a0c
test(backend): add failing tests for portfolio list enrichment
2026-06-14 14:08:11 +03:00
461a5b1ca6
feat(backend): add PortfolioListResponseDto
2026-06-14 14:02:01 +03:00
60e456fbb5
perf: reduce portfolio enrichment from 298 to 2 MOEX API calls (-99.3%)
...
Three optimizations:
1. Merge getBondData + getBondMarketData into single batch call
(same endpoint, parse both tables)
2. Remove redundant getSecurityDescription for shortName
(shortName already in market data responses)
3. Batch by market: 1 call for all shares, 1 call for all bonds
(instead of N individual calls)
Before: 298 API calls for 104 positions -> ~29.8s
After: 2 API calls for 104 positions -> ~0.3s
2026-06-14 13:19:22 +03:00
a980520261
feat: portfolio management with share/bond separation
...
CI / lint (pull_request) Successful in 1m59s
CI / test (pull_request) Successful in 1m45s
CI / build (pull_request) Failing after 1m54s
CI / lint (push) Successful in 1m50s
CI / test (push) Successful in 1m47s
CI / build (push) Failing after 2m3s
- Add Portfolio + Position models (Prisma + migrations)
- Backend: PortfolioModule with CRUD, enrichment, type detection
- Backend: enrichBondPosition returns 13 financial fields (YTM, duration,
coupon, NCD, accrued interest, bid/offer, bondType, offerDate, etc.)
- Frontend: portfolio pages, 4 TanStack Query hooks, split share/bond tables
- Fix: MOEX bond marketdata board fallback (TQCB → TQOB for OFZ)
- Frontend: clickable ticker links to /stocks/:secid and /bonds/:secid
- Remove: target allocation, deviation, tags display from Phase 1
- Docs: ADR-009 (domain model), ADR-010 (price computation),
portfolio backend doc, superpowers spec + plan
2026-06-14 11:14:04 +03:00
ca4a8b35f3
fix: null safety for market data components and backend CI
CI / lint (pull_request) Successful in 1m54s
CI / test (pull_request) Successful in 1m46s
CI / build (pull_request) Failing after 1m50s
2026-06-14 09:22:02 +03:00
729e94b4db
test: add 95 frontend unit tests with vitest, RTL, and MSW
...
CI / lint (pull_request) Failing after 1m53s
CI / test (pull_request) Failing after 1m45s
CI / build (pull_request) Failing after 1m44s
CI / lint (push) Failing after 1m39s
CI / test (push) Failing after 1m40s
CI / build (push) Failing after 1m34s
95 tests across 22 files covering all frontend modules:
- API layer: client, auth
- Components: BondDetails, Layout, PriceChart, ProtectedRoute, SearchBar, StockDetails
- Context: AuthContext
- Hooks: useAuth, useBond, useBondCandles, useSearch, useStock, useStockCandles, useStockDividends
- Pages: BondPage, HomePage, LoginPage, ProfilePage, RegisterPage, StockPage
Infrastructure:
- vitest + @testing-library/react + MSW v2 with 13 API handlers
- Co-located test files alongside source files
- Test utilities: setup, server, factories, test-utils
- BrowserRouter future flags for MemoryRouter test compatibility
- Root test:frontend script for workspace-wide execution
2026-06-14 08:27:15 +03:00
c2478277e6
feat: add authentication system with JWT + RBAC
...
CI / lint (pull_request) Failing after 1m45s
CI / test (pull_request) Failing after 1m42s
CI / build (pull_request) Failing after 1m31s
CI / lint (push) Failing after 1m46s
CI / test (push) Failing after 1m34s
CI / build (push) Failing after 1m35s
Backend:
- AuthModule with register, login, logout, refresh, profile endpoints
- JwtAuthGuard (global, opt-out via @Public) + RolesGuard (@Roles)
- PrismaModule with SQLite via @prisma/adapter-libsql (Prisma 7)
- Auth configuration in configuration.ts
Frontend:
- Auth context with session restoration via refresh cookie
- Login, Register, Profile pages with ProtectedRoute
- Auto-refresh on 401 with token rotation
- API client refactored for auth headers
Russian text: auth flows translated to Russian
All text translated: auth pages, profile, layout, loading states
2026-06-13 22:24:46 +03:00
b79c8210dc
style: apply prettier formatting across the codebase
CI / lint (pull_request) Successful in 9m42s
CI / build (pull_request) Has been cancelled
CI / test (pull_request) Has been cancelled
2026-06-13 20:32:34 +03:00