# ═══════════════════════════════════════════════════════════════════════════════ # 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" - 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 # ═══════════════════════════════════════════════════════════════════════════════