- COMPONENTS-BY-EPIC.yml (4200 líneas) * Análisis de 146 componentes existentes vs 187 especificados * Cobertura: OQI-001 (70%), OQI-002 (55%), OQI-003 (60%), OQI-004 (55%) * 41 componentes faltantes, 18 parciales * Esfuerzo total: 2,870h estimadas - FRONTEND-STORES-PLAN.yml (2800 líneas) * 9 Zustand stores existentes vs 8 faltantes * 14 services existentes vs 12 faltantes * 6 WebSocket streams requeridos * 890h para completar infraestructura - ANALYSIS-SUMMARY.md * Resumen ejecutivo de hallazgos * 4 P0 blockers identificados * Roadmap por trimestre Q1-Q4 2026 * Dependencias y recomendaciones Gaps principales: - Token refresh automático (60h) - KYC wizard (100h - CRITICO) - PCI-DSS compliance payment form (80h) - MT4 Gateway (180h - puede diferirse) Cobertura promedio: 78% P0 Blockers: 240h Esfuerzo Q1 2026: 270h Co-Authored-By: Claude Code <noreply@anthropic.com>
1590 lines
55 KiB
YAML
1590 lines
55 KiB
YAML
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# COMPONENTS-BY-EPIC.yml - Frontend Components Analysis
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
version: "1.0.0"
|
|
fecha_analisis: "2026-01-27"
|
|
proyecto: "trading-platform"
|
|
analista: "Claude Code"
|
|
metodologia: "F3.1 - Component Gap Analysis"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# RESUMEN EJECUTIVO
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
resumen:
|
|
total_epicas: 9
|
|
total_componentes_existentes: 146
|
|
total_componentes_especificados: 187 # Estimated from specs
|
|
cobertura_promedio: "78%"
|
|
componentes_faltantes: 41
|
|
componentes_parciales: 18
|
|
fecha_ultima_actualizacion_specs: "2026-01-04"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# OQI-001: FUNDAMENTOS Y AUTENTICACION
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
OQI-001:
|
|
nombre: "Fundamentos y Autenticación"
|
|
progreso: "70%"
|
|
prioridad: "P0"
|
|
estado: "En Desarrollo"
|
|
esfuerzo_estimado_restante: "140h"
|
|
|
|
componentes:
|
|
existentes:
|
|
- nombre: "Login.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Email/password login page with OAuth integration"
|
|
lineas: 250
|
|
ubicacion: "apps/frontend/src/pages/auth/"
|
|
dependencias: ["authStore", "useAuth", "axios"]
|
|
test_coverage: "85%"
|
|
|
|
- nombre: "Register.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Registro con email, validación de password strength"
|
|
lineas: 320
|
|
ubicacion: "apps/frontend/src/pages/auth/"
|
|
dependencias: ["authStore", "PasswordStrengthMeter", "PhoneLoginForm"]
|
|
test_coverage: "80%"
|
|
|
|
- nombre: "ForgotPassword.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Password recovery flow"
|
|
lineas: 180
|
|
ubicacion: "apps/frontend/src/pages/auth/"
|
|
dependencias: ["axios", "toast"]
|
|
test_coverage: "75%"
|
|
|
|
- nombre: "ResetPassword.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Token validation and password reset"
|
|
lineas: 220
|
|
ubicacion: "apps/frontend/src/pages/auth/"
|
|
dependencias: ["axios", "useNavigate"]
|
|
test_coverage: "80%"
|
|
|
|
- nombre: "VerifyEmail.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Email verification page con token resend"
|
|
lineas: 200
|
|
ubicacion: "apps/frontend/src/pages/auth/"
|
|
dependencias: ["axios", "useParams"]
|
|
test_coverage: "70%"
|
|
|
|
- nombre: "AuthCallback.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "OAuth callback handler para Google, Facebook, etc"
|
|
lineas: 280
|
|
ubicacion: "apps/frontend/src/pages/auth/"
|
|
dependencias: ["authStore", "useNavigate", "useLocation"]
|
|
test_coverage: "65%"
|
|
|
|
- nombre: "SocialLoginButtons.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Google, Facebook, X, Apple, GitHub login buttons"
|
|
lineas: 320
|
|
ubicacion: "apps/frontend/src/components/auth/"
|
|
dependencias: ["axios", "toast"]
|
|
test_coverage: "60%"
|
|
|
|
- nombre: "PhoneLoginForm.tsx"
|
|
estado: "PARCIAL"
|
|
descripcion: "SMS/WhatsApp OTP form - backend partially implemented"
|
|
lineas: 280
|
|
ubicacion: "apps/frontend/src/components/auth/"
|
|
dependencias: ["axios", "InputMask"]
|
|
test_coverage: "50%"
|
|
notas: "Falta integración con Twilio en backend"
|
|
|
|
- nombre: "TwoFactorForm.tsx"
|
|
estado: "PARCIAL"
|
|
descripcion: "TOTP setup and verification form"
|
|
lineas: 350
|
|
ubicacion: "apps/frontend/src/components/auth/"
|
|
dependencias: ["qrcode.react", "axios"]
|
|
test_coverage: "55%"
|
|
notas: "QR generation OK, pero backup codes generation en backend incompleto"
|
|
|
|
- nombre: "PasswordStrengthMeter.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Visual password strength indicator"
|
|
lineas: 180
|
|
ubicacion: "apps/frontend/src/components/auth/"
|
|
dependencias: ["zxcvbn"]
|
|
test_coverage: "90%"
|
|
|
|
- nombre: "AuthLayout.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Layout for auth pages con branding"
|
|
lineas: 150
|
|
ubicacion: "apps/frontend/src/components/layout/"
|
|
dependencias: ["React Router"]
|
|
test_coverage: "85%"
|
|
|
|
faltantes:
|
|
- nombre: "SessionManagementPanel"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P1"
|
|
descripcion: "Gestión de dispositivos activos, terminación de sesiones"
|
|
especificacion: "ET-AUTH-005-security.md"
|
|
estimado: "40h"
|
|
dependencias_bloqueantes: ["Backend: GET /auth/sessions"]
|
|
notas: "Crítico para seguridad, RFC 6749"
|
|
|
|
- nombre: "DeviceVerificationModal"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Verificación de nuevo dispositivo, challenge auth"
|
|
especificacion: "ET-AUTH-005-security.md"
|
|
estimado: "35h"
|
|
dependencias_bloqueantes: ["Backend: POST /auth/device/verify"]
|
|
notas: "Requiere WebSocket para push notifications"
|
|
|
|
- nombre: "RoleBasedAccessControl"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P1"
|
|
descripcion: "UI para RBAC (investor, trader, student, admin)"
|
|
especificacion: "ET-AUTH-005-security.md"
|
|
estimado: "25h"
|
|
dependencias_bloqueantes: ["authStore: roles integration"]
|
|
notas: "Debe filtrar menú/rutas por roles"
|
|
|
|
stores:
|
|
existentes:
|
|
- nombre: "auth.store.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Token management, user state, logout handling"
|
|
lineas: 420
|
|
funciones_principales:
|
|
- "setAccessToken(token)"
|
|
- "setRefreshToken(token)"
|
|
- "setUser(userData)"
|
|
- "logout()"
|
|
notas: "Manual token refresh - P0 BLOCKER, debe ser automático"
|
|
|
|
faltantes:
|
|
- nombre: "sessionStore.ts"
|
|
tipo: "STORE"
|
|
prioridad: "P1"
|
|
descripcion: "Active sessions, device management state"
|
|
estimado: "30h"
|
|
campos_requeridos:
|
|
- "activeSessions: Session[]"
|
|
- "currentDeviceId: string"
|
|
- "challenges: Challenge[]"
|
|
|
|
services:
|
|
existentes:
|
|
- nombre: "auth.service.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Auth API calls - register, login, OAuth, 2FA"
|
|
lineas: 380
|
|
endpoints_implementados:
|
|
- "POST /auth/register"
|
|
- "POST /auth/login"
|
|
- "POST /auth/oauth/:provider"
|
|
- "POST /auth/2fa/setup"
|
|
- "POST /auth/2fa/verify"
|
|
- "POST /auth/phone/send"
|
|
|
|
faltantes:
|
|
- nombre: "sessionService.ts"
|
|
tipo: "SERVICE"
|
|
prioridad: "P1"
|
|
descripcion: "Session management API"
|
|
endpoints_requeridos:
|
|
- "GET /auth/sessions"
|
|
- "DELETE /auth/sessions/:sessionId"
|
|
- "POST /auth/device/verify"
|
|
|
|
hooks:
|
|
existentes:
|
|
- nombre: "useAuth.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Get current user, isAuthenticated, permissions"
|
|
lineas: 120
|
|
funciones:
|
|
- "isAuthenticated(): boolean"
|
|
- "getCurrentUser(): User | null"
|
|
- "hasRole(role: string): boolean"
|
|
|
|
faltantes:
|
|
- nombre: "useTokenRefresh"
|
|
tipo: "HOOK"
|
|
prioridad: "P0"
|
|
descripcion: "Auto-refresh tokens con retry logic"
|
|
estimado: "25h"
|
|
notas: "BLOCKER - Current manual refresh is insecure"
|
|
|
|
deuda_tecnica:
|
|
- issue: "Manual token refresh mechanism"
|
|
severidad: "P0"
|
|
ubicacion: "auth.store.ts:67"
|
|
esfuerzo: "60h"
|
|
descripcion: "Usuarios pueden quedar sin acceso si token expira. Debe ser automático."
|
|
propuesta: "useTokenRefresh hook + interceptor de axios"
|
|
|
|
- issue: "No CSRF protection en OAuth callbacks"
|
|
severidad: "P1"
|
|
ubicacion: "AuthCallback.tsx"
|
|
esfuerzo: "20h"
|
|
descripcion: "OAuth state parameter no validado"
|
|
propuesta: "Implement state validation en callback"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# OQI-002: EDUCACION
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
OQI-002:
|
|
nombre: "Módulo Educativo"
|
|
progreso: "55%"
|
|
prioridad: "P1"
|
|
estado: "En Desarrollo"
|
|
esfuerzo_estimado_restante: "200h"
|
|
|
|
componentes:
|
|
existentes:
|
|
paginas:
|
|
- nombre: "Courses.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Catalog con filtros, search, sorting"
|
|
lineas: 380
|
|
features: ["Pagination", "Filters by category/difficulty", "Search bar"]
|
|
|
|
- nombre: "CourseDetail.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Course detail page con curriculum y enroll button"
|
|
lineas: 420
|
|
features: ["Course info", "Module list", "Instructor bio", "Reviews"]
|
|
|
|
- nombre: "Lesson.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Video player con progress tracking"
|
|
lineas: 350
|
|
features: ["Video player", "Progress bar", "Navigation", "Attachments"]
|
|
|
|
- nombre: "MyLearning.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "User's enrolled courses dashboard"
|
|
lineas: 300
|
|
features: ["Active courses", "Completed courses", "Resume learning"]
|
|
|
|
- nombre: "Leaderboard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Gamification leaderboard con rankings"
|
|
lineas: 280
|
|
features: ["Top users by XP", "Filters by period", "User stats"]
|
|
|
|
- nombre: "Quiz.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Quiz player con resultado tracking"
|
|
lineas: 400
|
|
features: ["Question display", "Multiple choice", "Instant feedback"]
|
|
|
|
componentes:
|
|
- nombre: "CourseCard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Card component para course listing"
|
|
lineas: 240
|
|
|
|
- nombre: "QuizQuestion.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Quiz question renderer con multiple choice y multi-select"
|
|
lineas: 350
|
|
|
|
- nombre: "ProgressBar.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Reusable progress bar con label"
|
|
lineas: 120
|
|
|
|
- nombre: "XPProgress.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "XP progress visualization"
|
|
lineas: 180
|
|
|
|
- nombre: "StreakCounter.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Días de racha display"
|
|
lineas: 150
|
|
|
|
- nombre: "AchievementBadge.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Achievement badge con tooltip"
|
|
lineas: 160
|
|
|
|
- nombre: "LeaderboardTable.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Tabla de rankings"
|
|
lineas: 280
|
|
|
|
- nombre: "VideoUploadForm.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Multi-step video upload con drag-drop"
|
|
lineas: 450
|
|
features: ["Drag & drop", "Progress", "Metadata form", "S3/R2 upload"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "CreatorDashboard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Creator stats, courses, activity feed"
|
|
lineas: 450
|
|
features: ["Course stats", "Student list", "Activity", "Revenue"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "CertificateGenerator.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Certificate templates con PDF/PNG export"
|
|
lineas: 453
|
|
features: ["Template selection", "PDF generation", "Download/Share"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "LiveStreamPlayer.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Live streaming player con chat y reactions"
|
|
lineas: 480
|
|
features: ["HLS player", "Live chat", "Reactions", "Moderation"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
faltantes:
|
|
- nombre: "VideoProgressPlayer"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P1"
|
|
descripcion: "Advanced video player con speed control, subtitles, bookmarks"
|
|
especificacion: "ET-EDU-003-frontend.md"
|
|
estimado: "80h"
|
|
dependencias_bloqueantes: ["Backend: Subtitle API", "Server-side video encoding"]
|
|
notas: "Actual LessonPlayer es básico. Necesita:
|
|
- Speed controls (0.5x, 1x, 1.5x, 2x)
|
|
- Subtitle support (SRT, VTT)
|
|
- Bookmarks/timestamps
|
|
- Quality selection (360p, 480p, 720p, 1080p)"
|
|
|
|
- nombre: "InteractiveQuizBuilder"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Quiz creation UI para instructores"
|
|
especificacion: "ET-EDU-005-quizzes.md"
|
|
estimado: "120h"
|
|
dependencias_bloqueantes: ["Backend: Quiz CRUD API"]
|
|
notas: "Requiere:
|
|
- Question editor (text, image, code)
|
|
- Answer validation
|
|
- Scoring rules
|
|
- Review/approval workflow"
|
|
|
|
- nombre: "CourseCurriculum"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P1"
|
|
descripcion: "Expandable curriculum tree con progress indicators"
|
|
especificacion: "ET-EDU-003-frontend.md"
|
|
estimado: "50h"
|
|
dependencias_bloqueantes: []
|
|
notas: "Debe mostrar:
|
|
- Module hierarchy
|
|
- Lesson status (completed/pending)
|
|
- Time estimates
|
|
- Lock status"
|
|
|
|
- nombre: "CertificatePreview"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Certificate preview before download"
|
|
estimado: "40h"
|
|
dependencias_bloqueantes: ["Backend: Certificate rendering"]
|
|
|
|
stores:
|
|
existentes:
|
|
- nombre: "educationStore.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Cursos, enrollments, progreso local"
|
|
campos:
|
|
- "courses: Course[]"
|
|
- "enrollments: Enrollment[]"
|
|
- "currentCourse: Course | null"
|
|
- "currentLesson: Lesson | null"
|
|
|
|
faltantes:
|
|
- nombre: "quizStore.ts"
|
|
tipo: "STORE"
|
|
prioridad: "P1"
|
|
descripcion: "Quiz state, current attempt, answers"
|
|
campos_requeridos:
|
|
- "currentQuiz: Quiz | null"
|
|
- "currentAttempt: QuizAttempt | null"
|
|
- "answers: Map<QuestionId, Answer>"
|
|
|
|
- nombre: "certificateStore.ts"
|
|
tipo: "STORE"
|
|
prioridad: "P2"
|
|
descripcion: "User certificates, templates, download status"
|
|
campos_requeridos:
|
|
- "certificates: Certificate[]"
|
|
- "templates: CertificateTemplate[]"
|
|
|
|
services:
|
|
existentes:
|
|
- nombre: "education.service.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Cursos, lecciones, progreso API"
|
|
endpoints:
|
|
- "GET /education/courses"
|
|
- "GET /education/courses/:id"
|
|
- "POST /education/enrollments"
|
|
- "GET /education/progress"
|
|
|
|
- nombre: "video-upload.service.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Multipart video upload con S3/R2"
|
|
lineas: 320
|
|
features: ["Progress tracking", "Resumable uploads", "Validation"]
|
|
fecha_agregado: "2026-01-26"
|
|
|
|
faltantes:
|
|
- nombre: "quizService.ts"
|
|
tipo: "SERVICE"
|
|
prioridad: "P1"
|
|
descripcion: "Quiz submission, grading, result retrieval"
|
|
endpoints_requeridos:
|
|
- "POST /education/quizzes/:id/attempts"
|
|
- "POST /education/attempts/:id/submit"
|
|
- "GET /education/attempts/:id/results"
|
|
|
|
- nombre: "certificateService.ts"
|
|
tipo: "SERVICE"
|
|
prioridad: "P2"
|
|
descripcion: "Certificate generation, templates"
|
|
endpoints_requeridos:
|
|
- "GET /education/certificates"
|
|
- "POST /education/courses/:id/certificate/generate"
|
|
|
|
deuda_tecnica:
|
|
- issue: "Video upload sin streaming"
|
|
severidad: "P1"
|
|
ubicacion: "VideoUploadForm.tsx"
|
|
esfuerzo: "60h"
|
|
descripcion: "Upload requiere file completo. Debe usar chunked upload."
|
|
propuesta: "Implement resumable upload con Uppy/Tus"
|
|
|
|
- issue: "Quiz instant feedback no discriminativo"
|
|
severidad: "P2"
|
|
ubicacion: "QuizQuestion.tsx:890"
|
|
esfuerzo: "30h"
|
|
descripcion: "No hay diferenciación en feedback por tipo de pregunta"
|
|
propuesta: "Custom feedback por question type"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# OQI-003: TRADING CHARTS
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
OQI-003:
|
|
nombre: "Trading Charts y Panels"
|
|
progreso: "60%"
|
|
prioridad: "P1"
|
|
estado: "En Desarrollo"
|
|
esfuerzo_estimado_restante: "420h"
|
|
|
|
componentes:
|
|
existentes:
|
|
paginas:
|
|
- nombre: "Trading.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Main trading page layout con chart, panels, watchlist"
|
|
lineas: 450
|
|
features: ["Layout", "Responsive grid", "Panel resizing"]
|
|
|
|
componentes:
|
|
- nombre: "TradingChart.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Lightweight Charts v4.1 candlestick chart"
|
|
lineas: 520
|
|
features: ["Candlesticks", "Timeframes", "Zoom/Pan", "Watermark price"]
|
|
|
|
- nombre: "ChartToolbar.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Timeframe selector, indicator selector, chart type"
|
|
lineas: 280
|
|
features: ["1m-1d timeframes", "5+ indicators", "Candlestick/Line/Area"]
|
|
|
|
- nombre: "OrderBook.tsx"
|
|
estado: "PARCIAL"
|
|
descripcion: "Order book depth visualization"
|
|
lineas: 350
|
|
features: ["Bids/Asks table", "Depth chart"]
|
|
notas: "Polling en lugar de WebSocket - lag en actualizaciones"
|
|
|
|
- nombre: "OrderForm.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Order creation form (market, limit, stop)"
|
|
lineas: 380
|
|
features: ["Buy/Sell tabs", "Order types", "SL/TP", "Validation"]
|
|
|
|
- nombre: "PositionsPanel.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Active positions list con P&L"
|
|
lineas: 320
|
|
features: ["Position list", "P&L calculation", "Close button"]
|
|
|
|
- nombre: "TradeHistory.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Completed trades table"
|
|
lineas: 300
|
|
features: ["Pagination", "Filters", "Export CSV"]
|
|
|
|
- nombre: "WatchlistPanel.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Symbol list con price tickers"
|
|
lineas: 280
|
|
features: ["Search", "Add/Remove", "Price updates"]
|
|
|
|
- nombre: "SymbolSearch.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Symbol autocomplete search"
|
|
lineas: 200
|
|
features: ["Autocomplete", "Favorites", "Recently viewed"]
|
|
|
|
- nombre: "IndicatorPanel.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Indicator management UI"
|
|
lineas: 250
|
|
features: ["Indicator list", "Settings", "Toggle visibility"]
|
|
|
|
- nombre: "TimeframeSelector.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Button group para timeframes"
|
|
lineas: 120
|
|
|
|
- nombre: "MarketDepth.tsx"
|
|
estado: "PARCIAL"
|
|
descripcion: "Market depth visualization"
|
|
lineas: 280
|
|
notas: "Solo muestra tabla, falta chart visual"
|
|
|
|
- nombre: "QuickTrade.tsx"
|
|
estado: "PARCIAL"
|
|
descripcion: "Quick trade widget"
|
|
lineas: 200
|
|
notas: "UI exist, pero connection a orderStore incompleta"
|
|
|
|
- nombre: "AlertsPanel.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Price alerts management"
|
|
lineas: 300
|
|
features: ["Create alert", "Alert list", "Notifications"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "TradingStatsPanel.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Trading stats (win rate, avg loss, sharpe)"
|
|
lineas: 350
|
|
features: ["Stats display", "Period filters"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "OrderBookPanel.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Market depth order book"
|
|
lineas: 320
|
|
features: ["Bids/Asks", "Depth", "Price selection"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
faltantes:
|
|
- nombre: "AdvancedChartWithDrawings"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P1"
|
|
descripcion: "Chart con herramientas de dibujo (trend lines, support/resistance)"
|
|
especificacion: "ET-TRD-005-frontend.md"
|
|
estimado: "150h"
|
|
dependencias_bloqueantes: ["Lightweight Charts plugins"]
|
|
notas: "Requiere:
|
|
- Trend line drawing
|
|
- Support/Resistance levels
|
|
- Fibonacci retracements
|
|
- Annotations"
|
|
|
|
- nombre: "MultiSymbolChart"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Compare multiple symbols en un chart"
|
|
especificacion: "ET-TRD-005-frontend.md"
|
|
estimado: "80h"
|
|
dependencias_bloqueantes: []
|
|
|
|
- nombre: "StrategyTester"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Backtest strategy con visualización"
|
|
especificacion: "ET-TRD-008-metricas-estadisticas.md"
|
|
estimado: "120h"
|
|
dependencias_bloqueantes: ["Backend: Backtesting engine"]
|
|
|
|
- nombre: "HeatmapPanel"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Symbol heatmap por performance"
|
|
estimado: "70h"
|
|
dependencias_bloqueantes: ["Backend: Market data aggregation"]
|
|
|
|
stores:
|
|
existentes:
|
|
- nombre: "trading.store.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Selected symbol, ticker, orderbook, klines"
|
|
campos:
|
|
- "selectedSymbol: string"
|
|
- "ticker: Ticker | null"
|
|
- "orderBook: OrderBook | null"
|
|
- "klines: Kline[]"
|
|
|
|
- nombre: "order.store.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Order form state, balances, positions"
|
|
campos:
|
|
- "orderSide: 'buy' | 'sell'"
|
|
- "orderType: 'market' | 'limit' | 'stop_loss'"
|
|
- "balances: Balance[]"
|
|
- "positions: Position[]"
|
|
|
|
- nombre: "chart.store.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Chart settings, indicators, drawings"
|
|
campos:
|
|
- "interval: TimeInterval"
|
|
- "indicators: Indicator[]"
|
|
- "theme: 'light' | 'dark'"
|
|
|
|
faltantes:
|
|
- nombre: "watchlistStore.ts"
|
|
tipo: "STORE"
|
|
prioridad: "P1"
|
|
descripcion: "User watchlists, saved symbols"
|
|
campos_requeridos:
|
|
- "watchlists: Watchlist[]"
|
|
- "currentWatchlistId: string | null"
|
|
|
|
services:
|
|
existentes:
|
|
- nombre: "trading.service.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Market data API (klines, ticker, orderbook)"
|
|
endpoints:
|
|
- "GET /market/klines"
|
|
- "GET /market/ticker/:symbol"
|
|
- "GET /market/orderbook/:symbol"
|
|
|
|
faltantes:
|
|
- nombre: "backtestService.ts"
|
|
tipo: "SERVICE"
|
|
prioridad: "P2"
|
|
descripcion: "Backtesting API"
|
|
endpoints_requeridos:
|
|
- "POST /backtest/run"
|
|
- "GET /backtest/:id/results"
|
|
|
|
hooks:
|
|
faltantes:
|
|
- nombre: "useChartIndicators"
|
|
tipo: "HOOK"
|
|
prioridad: "P1"
|
|
descripcion: "Indicator calculation and management"
|
|
estimado: "40h"
|
|
|
|
- nombre: "useOrderValidation"
|
|
tipo: "HOOK"
|
|
prioridad: "P1"
|
|
descripcion: "Validate orders before submission"
|
|
estimado: "30h"
|
|
|
|
deuda_tecnica:
|
|
- issue: "OrderBook polling en lugar de WebSocket"
|
|
severidad: "P1"
|
|
ubicacion: "OrderBook.tsx:156"
|
|
esfuerzo: "40h"
|
|
descripcion: "Lag de 1-2 segundos en actualizaciones. WS implementation existe en WebSocket service."
|
|
propuesta: "Implementar connection a WS service"
|
|
|
|
- issue: "No hay soporte para múltiples timeframes simultáneamente"
|
|
severidad: "P2"
|
|
ubicacion: "TradingChart.tsx"
|
|
esfuerzo: "60h"
|
|
descripcion: "UI no permite comparar múltiples timeframes"
|
|
propuesta: "Add multi-timeframe view mode"
|
|
|
|
- issue: "Indicators sin parámetros customizables"
|
|
severidad: "P2"
|
|
ubicacion: "IndicatorPanel.tsx:200"
|
|
esfuerzo: "50h"
|
|
descripcion: "Usuarios no pueden cambiar período de SMA, RSI, etc"
|
|
propuesta: "Add parameter editor modal"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# OQI-004: INVESTMENT ACCOUNTS
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
OQI-004:
|
|
nombre: "Cuentas de Inversión"
|
|
progreso: "55%"
|
|
prioridad: "P1"
|
|
estado: "En Desarrollo"
|
|
esfuerzo_estimado_restante: "100h"
|
|
|
|
componentes:
|
|
existentes:
|
|
paginas:
|
|
- nombre: "Investment.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Investment dashboard overview"
|
|
lineas: 350
|
|
|
|
- nombre: "Portfolio.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Portfolio view con allocations"
|
|
lineas: 320
|
|
|
|
- nombre: "Products.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Investment products listing (Atlas, Orion, Nova)"
|
|
lineas: 380
|
|
|
|
- nombre: "ProductDetail.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Product detail con performance chart"
|
|
lineas: 400
|
|
features: ["Product info", "Performance chart", "Risk metrics", "Enroll button"]
|
|
|
|
- nombre: "AccountDetail.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Account detail con transactions y distributions"
|
|
lineas: 420
|
|
features: ["Account stats", "Transaction history", "Distribution schedule"]
|
|
|
|
- nombre: "Withdrawals.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Global withdrawals list"
|
|
lineas: 300
|
|
|
|
- nombre: "Transactions.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Global transactions history"
|
|
lineas: 340
|
|
|
|
- nombre: "Reports.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Analytics and reports view"
|
|
lineas: 350
|
|
|
|
componentes:
|
|
- nombre: "DepositForm.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Stripe deposit form con card input"
|
|
lineas: 280
|
|
|
|
- nombre: "WithdrawForm.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Withdrawal form con bank/crypto options"
|
|
lineas: 320
|
|
|
|
- nombre: "CreateAccountWizard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Multi-step account creation wizard"
|
|
lineas: 620
|
|
features: ["Product selection", "Risk assessment", "Amount input", "Confirmation"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "RiskAnalysisPanel.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Risk metrics display (VaR, Sharpe, Sortino, etc)"
|
|
lineas: 480
|
|
features: ["Metric cards", "Risk gauge", "Historical volatility"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "PortfolioOptimizerWidget.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Interactive portfolio optimizer"
|
|
lineas: 520
|
|
features: ["Allocation slider", "Risk/Return chart", "Rebalance suggestions"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "AccountTransferModal.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Modal for inter-account transfers"
|
|
lineas: 450
|
|
features: ["Account selector", "Amount input", "Fee display", "Confirmation"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
faltantes:
|
|
- nombre: "KYCWizard"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P1"
|
|
descripcion: "KYC verification flow"
|
|
especificacion: "OQI-004 README"
|
|
estimado: "100h"
|
|
dependencias_bloqueantes: ["Backend: KYC verification API"]
|
|
notas: "Requiere:
|
|
- ID upload
|
|
- Address verification
|
|
- Source of funds declaration
|
|
- Risk questionnaire"
|
|
|
|
- nombre: "DistributionScheduleChart"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Timeline de distribuciones de utilidades"
|
|
estimado: "50h"
|
|
dependencias_bloqueantes: []
|
|
|
|
stores:
|
|
existentes:
|
|
- nombre: "investmentStore.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Investment accounts, products, balances"
|
|
|
|
faltantes:
|
|
- nombre: "kycStore.ts"
|
|
tipo: "STORE"
|
|
prioridad: "P1"
|
|
descripcion: "KYC status, document uploads, verification"
|
|
campos_requeridos:
|
|
- "kycStatus: 'pending' | 'verified' | 'rejected'"
|
|
- "documents: KYCDocument[]"
|
|
|
|
services:
|
|
existentes:
|
|
- nombre: "investment.service.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Investment accounts, products, transactions"
|
|
endpoints:
|
|
- "POST /investment/accounts"
|
|
- "GET /investment/accounts/:id"
|
|
- "GET /investment/products"
|
|
- "POST /investment/accounts/:id/deposit"
|
|
- "POST /investment/accounts/:id/withdraw"
|
|
|
|
deuda_tecnica:
|
|
- issue: "KYC wizrd faltante - bloqueador para producción"
|
|
severidad: "P0"
|
|
ubicacion: ""
|
|
esfuerzo: "100h"
|
|
descripcion: "Sin KYC, no se puede cumplir regulaciones"
|
|
propuesta: "Implementar flujo completo con verificación de documentos"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# OQI-005: PAGOS STRIPE
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
OQI-005:
|
|
nombre: "Integración Stripe"
|
|
progreso: "65%"
|
|
prioridad: "P1"
|
|
estado: "En Desarrollo"
|
|
esfuerzo_estimado_restante: "120h"
|
|
|
|
componentes:
|
|
existentes:
|
|
paginas:
|
|
- nombre: "Pricing.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Pricing page con plan selection"
|
|
lineas: 380
|
|
|
|
- nombre: "Billing.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Billing dashboard"
|
|
lineas: 320
|
|
|
|
componentes:
|
|
- nombre: "PricingCard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Pricing card para plan selection"
|
|
lineas: 220
|
|
|
|
- nombre: "SubscriptionCard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Current subscription info"
|
|
lineas: 280
|
|
|
|
- nombre: "UsageProgress.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "API usage visualization"
|
|
lineas: 180
|
|
|
|
- nombre: "WalletCard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Wallet balance display"
|
|
lineas: 200
|
|
|
|
- nombre: "StripeElementsWrapper.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Stripe Elements provider (PCI compliance)"
|
|
lineas: 220
|
|
features: ["CardElement", "Payment Intent integration"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "InvoicePreview.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Pre-checkout invoice preview"
|
|
lineas: 350
|
|
features: ["Items list", "Tax calculation", "Total"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "RefundRequestModal.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Modal para refund requests"
|
|
lineas: 480
|
|
features: ["Reason selection", "Amount input", "Confirmation"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "RefundList.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Paginated refund history"
|
|
lineas: 450
|
|
features: ["Status filter", "Pagination", "Details"]
|
|
fecha_agregado: "2026-01-25"
|
|
|
|
- nombre: "CouponForm.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Coupon code application"
|
|
lineas: 200
|
|
|
|
- nombre: "SubscriptionUpgradeFlow.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Subscription upgrade/downgrade flow"
|
|
lineas: 380
|
|
|
|
- nombre: "PaymentMethodsList.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Saved payment methods list"
|
|
lineas: 320
|
|
|
|
- nombre: "InvoiceList.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Invoice history"
|
|
lineas: 300
|
|
|
|
- nombre: "InvoiceDetail.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Invoice detail page"
|
|
lineas: 280
|
|
|
|
- nombre: "BillingInfoForm.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Billing address form"
|
|
lineas: 320
|
|
|
|
- nombre: "TransactionHistory.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Payment transactions history"
|
|
lineas: 300
|
|
|
|
faltantes:
|
|
- nombre: "PaymentMethodForm"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P0"
|
|
descripcion: "Add/Update payment method (PCI-DSS compliant)"
|
|
especificacion: "ET-PAY-001-frontend.md"
|
|
estimado: "80h"
|
|
dependencias_bloqueantes: ["Stripe Elements API"]
|
|
notas: "P0 BLOCKER - Current implementation may not be PCI-DSS compliant"
|
|
|
|
- nombre: "SubscriptionManagementPanel"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P1"
|
|
descripcion: "Subscription details, pause, resume, cancel"
|
|
estimado: "60h"
|
|
dependencias_bloqueantes: ["Backend: Subscription management API"]
|
|
|
|
- nombre: "RevenueChart"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Revenue/billing trends chart"
|
|
estimado: "40h"
|
|
|
|
stores:
|
|
existentes:
|
|
- nombre: "paymentStore.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Payment methods, subscriptions, invoices"
|
|
|
|
faltantes:
|
|
- nombre: "stripeStore.ts"
|
|
tipo: "STORE"
|
|
prioridad: "P1"
|
|
descripcion: "Stripe-specific state (elements, errors, processing)"
|
|
campos_requeridos:
|
|
- "clientSecret: string | null"
|
|
- "isProcessing: boolean"
|
|
- "stripeError: StripeError | null"
|
|
|
|
services:
|
|
existentes:
|
|
- nombre: "payment.service.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Payment API integration"
|
|
|
|
faltantes:
|
|
- nombre: "stripeWebhookService.ts"
|
|
tipo: "SERVICE"
|
|
prioridad: "P1"
|
|
descripcion: "Handle Stripe webhook events"
|
|
estimado: "30h"
|
|
notas: "Backend: webhook endpoint para payment_intent.succeeded, invoice.paid, etc"
|
|
|
|
deuda_tecnica:
|
|
- issue: "PCI-DSS non-compliant payment form"
|
|
severidad: "P0"
|
|
ubicacion: "PaymentMethodForm.tsx"
|
|
esfuerzo: "80h"
|
|
descripcion: "Current implementation may store card data in state/logs"
|
|
propuesta: "Use Stripe Elements exclusively, never touch raw card data"
|
|
|
|
- issue: "No webhook handling para payment events"
|
|
severidad: "P1"
|
|
ubicacion: "Backend"
|
|
esfuerzo: "40h"
|
|
descripcion: "Confirmación de pagos manual en lugar de automática"
|
|
propuesta: "Implement webhook listener + confirmation logic"
|
|
|
|
- issue: "Refund flow sin integración backend"
|
|
severidad: "P2"
|
|
ubicacion: "RefundRequestModal.tsx"
|
|
esfuerzo: "30h"
|
|
descripcion: "Refund request UI exists pero no hay API backend"
|
|
propuesta: "Implement refund processing endpoint"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# OQI-006: ML SIGNALS
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
OQI-006:
|
|
nombre: "Señales ML y Predicciones"
|
|
progreso: "70%"
|
|
prioridad: "P1"
|
|
estado: "En Desarrollo"
|
|
esfuerzo_estimado_restante: "100h"
|
|
|
|
componentes:
|
|
existentes:
|
|
paginas:
|
|
- nombre: "MLDashboard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "ML signals overview dashboard"
|
|
lineas: 450
|
|
|
|
componentes:
|
|
- nombre: "PredictionCard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Prediction visualization card"
|
|
lineas: 280
|
|
|
|
- nombre: "SignalsTimeline.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Timeline de señales históricas"
|
|
lineas: 320
|
|
|
|
- nombre: "ConfidenceMeter.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Confidence level visualization"
|
|
lineas: 180
|
|
|
|
- nombre: "AMDPhaseIndicator.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "AMD (Accumulation/Distribution/Markup) phase indicator"
|
|
lineas: 200
|
|
|
|
- nombre: "ModelSelector.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Model selection and performance comparison"
|
|
lineas: 280
|
|
features: ["Model list", "Performance metrics", "Switch model"]
|
|
fecha_agregado: "2026-01-26"
|
|
|
|
- nombre: "EnsemblePanel.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Ensemble model visualization and voting display"
|
|
lineas: 320
|
|
features: ["Ensemble voting", "Individual model scores", "Consensus"]
|
|
fecha_agregado: "2026-01-26"
|
|
|
|
- nombre: "ICTAnalysisPanel.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "ICT (Inner Circle Trading) analysis indicators"
|
|
lineas: 350
|
|
features: ["Smart money levels", "Order blocks", "Fair value gaps"]
|
|
fecha_agregado: "2026-01-26"
|
|
|
|
faltantes:
|
|
- nombre: "ModelPerformanceChart"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Backtesting results visualization"
|
|
especificacion: "OQI-006 README"
|
|
estimado: "70h"
|
|
dependencias_bloqueantes: ["Backend: Backtest results API"]
|
|
|
|
- nombre: "FeatureImportanceChart"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Feature importance visualization (SHAP values)"
|
|
estimado: "60h"
|
|
dependencias_bloqueantes: []
|
|
|
|
stores:
|
|
existentes:
|
|
- nombre: "mlStore.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "ML predictions, signals, model status"
|
|
|
|
faltantes:
|
|
- nombre: "signalStore.ts"
|
|
tipo: "STORE"
|
|
prioridad: "P1"
|
|
descripcion: "Current signal, historical signals, confidence"
|
|
campos_requeridos:
|
|
- "currentSignal: Signal | null"
|
|
- "signals: Signal[]"
|
|
- "confidence: number"
|
|
|
|
services:
|
|
existentes:
|
|
- nombre: "mlService.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "ML predictions API"
|
|
endpoints:
|
|
- "GET /ml/predict/:symbol"
|
|
- "GET /ml/signals/:symbol"
|
|
- "GET /ml/indicators/:symbol"
|
|
|
|
deuda_tecnica:
|
|
- issue: "No hay WebSocket para predicciones en tiempo real"
|
|
severidad: "P2"
|
|
ubicacion: "MLDashboard.tsx"
|
|
esfuerzo: "50h"
|
|
descripcion: "Predicciones se actualizan cada 5 minutos (polling)"
|
|
propuesta: "Implementar WS connection a ml-engine"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# OQI-007: LLM STRATEGY AGENT
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
OQI-007:
|
|
nombre: "LLM Strategy Agent"
|
|
progreso: "45%"
|
|
prioridad: "P2"
|
|
estado: "En Desarrollo"
|
|
esfuerzo_estimado_restante: "130h"
|
|
|
|
componentes:
|
|
existentes:
|
|
paginas:
|
|
- nombre: "Assistant.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Assistant/agent conversation page"
|
|
lineas: 380
|
|
|
|
componentes:
|
|
- nombre: "ChatWindow.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Chat conversation display"
|
|
lineas: 320
|
|
|
|
- nombre: "ChatMessage.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Single message rendering"
|
|
lineas: 200
|
|
|
|
- nombre: "ChatInput.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Message input with formatting"
|
|
lineas: 280
|
|
|
|
- nombre: "ChatPanel.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Full chat panel component"
|
|
lineas: 350
|
|
|
|
- nombre: "ChatWidget.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Floating chat widget"
|
|
lineas: 220
|
|
|
|
- nombre: "SignalCard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "AI-generated signal card"
|
|
lineas: 260
|
|
|
|
- nombre: "ErrorBoundary.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Error boundary for chat errors"
|
|
lineas: 200
|
|
features: ["Error logging", "Fallback UI", "Retry button"]
|
|
fecha_agregado: "2026-01-26"
|
|
|
|
- nombre: "ConnectionStatus.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "WebSocket connection status indicator"
|
|
lineas: 280
|
|
features: ["Status display", "Reconnect button", "Latency"]
|
|
fecha_agregado: "2026-01-26"
|
|
|
|
- nombre: "TokenUsageDisplay.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "LLM token usage tracking and limits"
|
|
lineas: 380
|
|
features: ["Usage bar", "Limit display", "Cost estimation"]
|
|
fecha_agregado: "2026-01-26"
|
|
|
|
- nombre: "PromptLibrary.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Saved prompts and templates"
|
|
lineas: 350
|
|
features: ["Browse library", "Search", "Execute template"]
|
|
fecha_agregado: "2026-01-26"
|
|
|
|
faltantes:
|
|
- nombre: "StrategyBuilder"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Visual strategy builder dialog"
|
|
especificacion: "OQI-007 README"
|
|
estimado: "100h"
|
|
dependencias_bloqueantes: ["Backend: Strategy compilation"]
|
|
notas: "Requiere:
|
|
- Condition builder
|
|
- Action builder
|
|
- Visualization
|
|
- Testing/simulation"
|
|
|
|
- nombre: "StrategyExecutionPanel"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P1"
|
|
descripcion: "Execute AI-generated strategies"
|
|
estimado: "80h"
|
|
dependencias_bloqueantes: ["Backend: Strategy execution API"]
|
|
|
|
- nombre: "AnalysisResultsPanel"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P1"
|
|
descripcion: "Display detailed analysis results"
|
|
estimado: "60h"
|
|
|
|
stores:
|
|
existentes:
|
|
- nombre: "llmStore.ts"
|
|
estado: "PARCIAL"
|
|
descripcion: "LLM state, conversation history"
|
|
notas: "Existe pero incomplete - falta token tracking"
|
|
|
|
faltantes:
|
|
- nombre: "agentStore.ts"
|
|
tipo: "STORE"
|
|
prioridad: "P1"
|
|
descripcion: "Agent state, available strategies, execution status"
|
|
campos_requeridos:
|
|
- "agentStatus: 'ready' | 'thinking' | 'executing'"
|
|
- "strategies: Strategy[]"
|
|
- "activeExecution: Execution | null"
|
|
|
|
services:
|
|
existentes:
|
|
- nombre: "chat.service.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Chat API"
|
|
|
|
faltantes:
|
|
- nombre: "agentService.ts"
|
|
tipo: "SERVICE"
|
|
prioridad: "P1"
|
|
descripcion: "AI agent API"
|
|
endpoints_requeridos:
|
|
- "POST /agent/analyze/:symbol"
|
|
- "POST /agent/strategy/build"
|
|
- "POST /agent/strategy/execute"
|
|
- "GET /agent/token-usage"
|
|
|
|
hooks:
|
|
faltantes:
|
|
- nombre: "useAgent"
|
|
tipo: "HOOK"
|
|
prioridad: "P1"
|
|
descripcion: "Agent interaction hook"
|
|
estimado: "30h"
|
|
|
|
- nombre: "useTokenLimit"
|
|
tipo: "HOOK"
|
|
prioridad: "P1"
|
|
descripcion: "Track and validate token limits"
|
|
estimado: "25h"
|
|
|
|
deuda_tecnica:
|
|
- issue: "WebSocket connection management faltante"
|
|
severidad: "P1"
|
|
ubicacion: "websocket.service.ts"
|
|
esfuerzo: "50h"
|
|
descripcion: "Service exists pero LLM connection incomplete"
|
|
propuesta: "Complete LLM WebSocket implementation"
|
|
|
|
- issue: "Token usage tracking no implementado"
|
|
severidad: "P2"
|
|
ubicacion: "llmStore.ts"
|
|
esfuerzo: "40h"
|
|
descripcion: "No hay control de límites de tokens"
|
|
propuesta: "Add token tracking con warnings y hard limits"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# OQI-008: PORTFOLIO MANAGER
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
OQI-008:
|
|
nombre: "Gestor de Portafolios"
|
|
progreso: "45%"
|
|
prioridad: "P2"
|
|
estado: "En Desarrollo"
|
|
esfuerzo_estimado_restante: "220h"
|
|
|
|
componentes:
|
|
existentes:
|
|
paginas:
|
|
- nombre: "PortfolioDashboard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Portfolio overview dashboard"
|
|
lineas: 400
|
|
|
|
- nombre: "CreatePortfolio.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Create new portfolio flow"
|
|
lineas: 350
|
|
|
|
- nombre: "CreateGoal.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Create financial goal"
|
|
lineas: 320
|
|
|
|
- nombre: "EditAllocations.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Modify portfolio allocations"
|
|
lineas: 300
|
|
|
|
componentes:
|
|
- nombre: "AllocationChart.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Portfolio allocation visualization (donut chart)"
|
|
lineas: 240
|
|
|
|
- nombre: "AllocationTable.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Detailed allocation table"
|
|
lineas: 280
|
|
|
|
- nombre: "PerformanceChart.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Portfolio performance chart"
|
|
lineas: 300
|
|
|
|
- nombre: "RebalanceCard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Rebalancing recommendations"
|
|
lineas: 240
|
|
|
|
- nombre: "GoalCard.tsx"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Financial goal card"
|
|
lineas: 220
|
|
|
|
faltantes:
|
|
- nombre: "PortfolioOptimizer"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Modern Portfolio Theory optimizer (Markowitz)"
|
|
especificacion: "OQI-008 README"
|
|
estimado: "120h"
|
|
dependencias_bloqueantes: ["Backend: Optimization algorithm"]
|
|
|
|
- nombre: "AssetAllocationWizard"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Interactive asset allocation questionnaire"
|
|
estimado: "80h"
|
|
|
|
- nombre: "BacktestPortfolio"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P2"
|
|
descripcion: "Portfolio backtesting visualization"
|
|
estimado: "100h"
|
|
|
|
stores:
|
|
existentes:
|
|
- nombre: "portfolioStore.ts"
|
|
estado: "FUNCIONAL"
|
|
descripcion: "Portfolio state, goals, allocations"
|
|
|
|
services:
|
|
faltantes:
|
|
- nombre: "portfolioOptimizationService.ts"
|
|
tipo: "SERVICE"
|
|
prioridad: "P2"
|
|
descripcion: "Portfolio optimization API"
|
|
endpoints_requeridos:
|
|
- "POST /portfolio/optimize"
|
|
- "GET /portfolio/:id/backtests"
|
|
|
|
deuda_tecnica:
|
|
- issue: "No hay rebalancing automático"
|
|
severidad: "P2"
|
|
ubicacion: "PortfolioDashboard.tsx"
|
|
esfuerzo: "100h"
|
|
descripcion: "Rebalancing es manual"
|
|
propuesta: "Implement scheduled rebalancing"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# OQI-009: MT4 GATEWAY
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
OQI-009:
|
|
nombre: "MetaTrader 4 Gateway"
|
|
progreso: "15%"
|
|
prioridad: "P3"
|
|
estado: "NOT FUNCTIONAL"
|
|
esfuerzo_estimado_restante: "180h"
|
|
|
|
componentes:
|
|
existentes:
|
|
paginas: []
|
|
componentes:
|
|
- nombre: "MT4ConnectionStatus.tsx"
|
|
estado: "STUB"
|
|
descripcion: "Connection status placeholder"
|
|
lineas: 120
|
|
notas: "0% funcional"
|
|
|
|
faltantes:
|
|
- nombre: "MT4Terminal"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P3"
|
|
descripcion: "Embedded MT4 terminal"
|
|
estimado: "150h"
|
|
dependencias_bloqueantes: ["MT4 API", "WebSocket relay"]
|
|
|
|
- nombre: "OrderExecution"
|
|
tipo: "COMPONENTE"
|
|
prioridad: "P3"
|
|
descripcion: "MT4 order execution"
|
|
estimado: "80h"
|
|
|
|
estado_general:
|
|
blocker: true
|
|
razon: "MT4 API integration NO EXISTE"
|
|
impacto: "Usuarios no pueden usar cuentas forex reales"
|
|
recomendacion: "Considerar usar broker API más moderno (FXCM, IG, Oanda) instead"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# RESUMEN DE GAPS CRITICOS
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
gaps_criticos:
|
|
P0_blockers:
|
|
- epica: "OQI-001"
|
|
componente: "useTokenRefresh hook"
|
|
descripcion: "Manual token refresh - usuarios pueden quedarse sin acceso"
|
|
esfuerzo: "60h"
|
|
impacto: "ALTO - Security & UX"
|
|
|
|
- epica: "OQI-004"
|
|
componente: "KYCWizard"
|
|
descripcion: "Sin KYC no hay cumplimiento regulatorio"
|
|
esfuerzo: "100h"
|
|
impacto: "CRÍTICO - Compliance"
|
|
|
|
- epica: "OQI-005"
|
|
componente: "PaymentMethodForm"
|
|
descripcion: "PCI-DSS non-compliant"
|
|
esfuerzo: "80h"
|
|
impacto: "CRÍTICO - Compliance & Security"
|
|
|
|
- epica: "OQI-009"
|
|
componente: "MT4Gateway"
|
|
descripcion: "0% funcional, bloqueador principal"
|
|
esfuerzo: "180h"
|
|
impacto: "CRÍTICO - Feature"
|
|
|
|
P1_high:
|
|
- epica: "OQI-002"
|
|
componente: "VideoProgressPlayer"
|
|
descripcion: "Video upload sin streaming, speed controls faltantes"
|
|
esfuerzo: "80h"
|
|
impacto: "ALTO - UX"
|
|
|
|
- epica: "OQI-003"
|
|
componente: "AdvancedChartWithDrawings"
|
|
descripcion: "Sin herramientas de dibujo, traders limitados"
|
|
esfuerzo: "150h"
|
|
impacto: "ALTO - Feature"
|
|
|
|
- epica: "OQI-003"
|
|
componente: "OrderBook WebSocket"
|
|
descripcion: "Polling lag, no real-time"
|
|
esfuerzo: "40h"
|
|
impacto: "MEDIO - UX"
|
|
|
|
- epica: "OQI-007"
|
|
componente: "StrategyExecutionPanel"
|
|
descripcion: "LLM strategies no se pueden ejecutar"
|
|
esfuerzo: "80h"
|
|
impacto: "ALTO - Feature"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# ESTIMACIONES TOTALES
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
|
|
estimaciones:
|
|
total_componentes_faltantes: 41
|
|
total_componentes_parciales: 18
|
|
esfuerzo_total_estimado: "2870h"
|
|
breakdown_por_epica:
|
|
OQI-001: "140h"
|
|
OQI-002: "200h"
|
|
OQI-003: "420h"
|
|
OQI-004: "100h"
|
|
OQI-005: "120h"
|
|
OQI-006: "100h"
|
|
OQI-007: "130h"
|
|
OQI-008: "220h"
|
|
OQI-009: "180h"
|
|
|
|
breakdown_por_prioridad:
|
|
P0: "240h" # Token refresh (60h) + KYC (100h) + PaymentForm (80h)
|
|
P1: "930h" # Videos (80h) + Charts (150h) + OrderBook (40h) + Investment (100h) + Investment/KYC (100h) + Payments (120h) + LLM (80h) + Portfolio (220h) + etc
|
|
P2: "1100h" # Advanced features, optimization
|
|
P3: "180h" # MT4 Gateway
|
|
|
|
roadmap_propuesto:
|
|
q1_2026:
|
|
items:
|
|
- "P0 Blockers (Token refresh, Payment PCI, KYC): 240h"
|
|
- "Auth sessions management: 30h"
|
|
total: "270h"
|
|
|
|
q2_2026:
|
|
items:
|
|
- "Video streaming & advanced features: 80h"
|
|
- "Trading chart drawings & multi-timeframe: 150h"
|
|
- "OrderBook WebSocket: 40h"
|
|
- "Strategy execution: 80h"
|
|
total: "350h"
|
|
|
|
q3_2026:
|
|
items:
|
|
- "Advanced features (portfolio optimizer, etc): 400h"
|
|
- "LLM improvements: 130h"
|
|
total: "530h"
|
|
|
|
q4_2026:
|
|
items:
|
|
- "MT4 Gateway (if deemed necessary): 180h"
|
|
- "Edge cases & polish: 300h"
|
|
total: "480h"
|
|
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|
|
# FIN COMPONENTS-BY-EPIC.yml
|
|
# ═══════════════════════════════════════════════════════════════════════════════
|