# OQI-004: Análisis de Componentes Frontend - Cuentas de Inversión

**Módulo:** OQI-004 - Cuentas de Inversión
**Ubicación:** `apps/frontend/src/modules/investment/`
**Fecha:** 2026-01-25
**Status:** ANÁLISIS COMPLETO

---

## 1. PÁGINAS (8 Archivos)

| Página | Ruta | Líneas | Estado | Descripción | Funcionalidades Clave |
|--------|------|--------|--------|-------------|----------------------|
| **Investment.tsx** | `pages/Investment.tsx` | 100 | ✅ Funcional | Dashboard principal del módulo - landing page de inversiones | Listado de productos disponibles (Atlas, Orion, Nova), botón "Abrir Nueva Cuenta", aviso de riesgo |
| **Portfolio.tsx** | `pages/Portfolio.tsx` | 346 | ✅ Funcional | Vista del portafolio del usuario con resumen de inversiones | Resumen de cuentas activas, stats totales (balance, ganancias), listado de cuentas con P&L, acciones rápidas |
| **Products.tsx** | `pages/Products.tsx` | 276 | ✅ Funcional | Catálogo de productos de inversión con filtrado por riesgo | Filtro por perfil de riesgo (conservador/moderado/agresivo), tarjetas de productos, nav a detalles |
| **ProductDetail.tsx** | `pages/ProductDetail.tsx` | 447 | ✅ Funcional | Detalles de un producto específico + formulario de inversión | Gráfico de rendimiento histórico (canvas), selector de monto de inversión, botones de inversión rápida, características del producto |
| **AccountDetail.tsx** | `pages/AccountDetail.tsx` | 608 | ✅ Funcional | Vista detallada de una cuenta de inversión individual | Tabs (resumen/transacciones/distribuciones/depósito/retiro), gráfico de rendimiento, componentes DepositForm y WithdrawForm |
| **Withdrawals.tsx** | `pages/Withdrawals.tsx` | 269 | ✅ Funcional | Historial de solicitudes de retiro con filtrado de estado | Vista de tarjetas de retiros, filtro por estado (pending/approved/processing/completed/rejected), stats de retiros |
| **Transactions.tsx** | `pages/Transactions.tsx` | 328 | ✅ Funcional | Historial global de transacciones filtrable por tipo y cuenta | Filtro por tipo (depósito/retiro/distribución/comisión), selector de cuenta, filtro de fecha, tabla de transacciones |
| **Reports.tsx** | `pages/Reports.tsx` | 422 | ✅ Funcional | Reportes y análisis de inversiones con gráficos | Gráfico de distribución (donut), gráfico de rendimiento por cuenta (barras), tabla detalle, export JSON |

---

## 2. COMPONENTES (6 Archivos)

| Componente | Ruta | Líneas | Tipo | Props | Estado | Descripción |
|------------|------|--------|------|-------|--------|-------------|
| **DepositForm** | `components/DepositForm.tsx` | 318 | Form | `accounts`, `onSuccess?`, `onCancel?` | ✅ Prod | Formulario de depósito con integración Stripe (cardElement), selección de cuenta, monto, confirmación de pago |
| **WithdrawForm** | `components/WithdrawForm.tsx` | 471 | Form | `accounts`, `onSuccess?`, `onCancel?` | ✅ Prod | Formulario de retiro 2-paso (detalles/verificación), método (bank/crypto), 2FA, límite diario $10k, mínimo $50 |
| **AccountSummaryCard** | `components/AccountSummaryCard.tsx` | 286 | Card | `account`, `onViewDetails?`, `onManageSettings?`, `compact?`, `showActions?` | ✅ Prod | Tarjeta resumen de cuenta con balance, ganancias totales, retorno mensual, estado, riesgo, distribución próxima |
| **ProductComparisonTable** | `components/ProductComparisonTable.tsx` | 396 | Table | `products`, `selectedProductId?`, `onSelectProduct?`, `onViewDetails?`, `compact?` | ✅ Prod | Tabla comparativa de productos por (Returns, Fees, Terms, Strategies), expandible, seleccionable, 2 layouts |
| **PerformanceWidgetChart** | `components/PerformanceWidgetChart.tsx` | 238 | Chart | `data`, `period?`, `height?`, `showTrend?`, `showValue?`, `lineColor?`, `fillColor?`, `compact?`, `onClick?` | ✅ Prod | Gráfico sparkline con canvas, indica tendencia (up/down/neutral), relleno dinámico, compacto u expansión |
| **AccountSettingsPanel** | `components/AccountSettingsPanel.tsx` | 524 | Panel | `account`, `settings`, `onSave?`, `onCancel?`, `isLoading?`, `compact?` | ✅ Prod | Panel de configuración de cuenta (distribución, auto-reinversión, notificaciones, alertas riesgo, retiros), tabs, form state |

---

## 3. ANÁLISIS ESTRUCTURAL

### 3.1 Jerarquía de Componentes

```
App
├── Investment (landing page)
│   └── Product cards
├── Portfolio (lista de cuentas)
│   ├── AccountRow (iterado)
│   ├── StatCard
│   └── Quick Actions
├── Products (catálogo)
│   ├── RiskBadge
│   ├── ProductCard (iterado)
│   └── Filters
├── ProductDetail (detalles + inversión)
│   ├── PerformanceChart (canvas)
│   ├── StatCard
│   ├── AccountSettingsPanel (sidebar)
│   └── InvestForm (button only)
├── AccountDetail (cuenta individual)
│   ├── StatCard
│   ├── Tabs (5 opciones)
│   ├── PerformanceChart
│   ├── TransactionRow
│   ├── DistributionRow
│   ├── DepositForm (embedded)
│   └── WithdrawForm (embedded)
├── Withdrawals (historial retiros)
│   ├── WithdrawalCard
│   └── Filters
├── Transactions (historial transacciones)
│   ├── TransactionRow
│   ├── Filters
│   └── Stats
└── Reports (análisis)
    ├── AllocationChart (donut canvas)
    ├── PerformanceBarChart
    └── Table
```

### 3.2 Flujos de Datos

**Flujo Depósito:**
```
Investment.tsx → ProductDetail.tsx → DepositForm.tsx
                                   → (Stripe API)
                                   → /api/v1/payments/wallet/deposit
                                   → AccountDetail.tsx
```

**Flujo Retiro:**
```
Portfolio.tsx → AccountDetail.tsx → WithdrawForm.tsx
                                  → /api/v1/investment/accounts/{id}/withdraw
                                  → Withdrawals.tsx
```

**Flujo Visualización:**
```
Portfolio.tsx → AccountDetail.tsx → [Tabs]
                                  → Transactions.tsx (si "Ver todos")
                                  → Reports.tsx (si "Reportes")
```

### 3.3 APIs Consumidas

| Endpoint | Método | Componente | Estado |
|----------|--------|-----------|--------|
| `/api/v1/investment/accounts/summary` | GET | Portfolio.tsx | ✅ Activo |
| `/api/v1/investment/products` | GET | Products.tsx | ✅ Activo |
| `/api/v1/investment/products/{id}` | GET | ProductDetail.tsx | ✅ Activo |
| `/api/v1/investment/products/{id}/performance` | GET | ProductDetail.tsx | ✅ Activo |
| `/api/v1/investment/accounts/{id}` | GET | AccountDetail.tsx | ✅ Activo |
| `/api/v1/investment/accounts/{id}/transactions` | GET | AccountDetail.tsx, Transactions.tsx | ✅ Activo |
| `/api/v1/investment/accounts/{id}/withdrawals` | GET | Withdrawals.tsx | ✅ Activo |
| `/api/v1/investment/accounts/{id}/deposit` | POST | DepositForm.tsx | ✅ Activo |
| `/api/v1/investment/accounts/{id}/withdraw` | POST | WithdrawForm.tsx | ✅ Activo |
| `/api/v1/payments/wallet/deposit` | POST | DepositForm.tsx | ✅ Activo |

### 3.4 Librerías y Dependencias

| Librería | Uso | Versión | Status |
|----------|-----|---------|--------|
| `react` | Core | 18.2.0 | ✅ |
| `react-router-dom` | Routing | Actuales | ✅ |
| `lucide-react` | Iconos | Actuales | ✅ |
| `@stripe/react-stripe-js` | Pagos | Actuales | ✅ |
| `@stripe/stripe-js` | Pagos | Actuales | ✅ |
| `react-hook-form` | Forms | Actuales | ✅ |
| Canvas API | Gráficos | Nativa | ✅ |

---

## 4. TIPOS DE DATOS DEFINIDOS

### 4.1 Investment Account
```typescript
interface InvestmentAccount {
  id: string;
  productId: string;
  product: { code: string; name: string; riskProfile: string };
  status: 'active' | 'suspended' | 'closed';
  balance: number;
  initialInvestment: number;
  totalDeposited: number;
  totalWithdrawn: number;
  totalEarnings: number;
  unrealizedPnl: number;
  unrealizedPnlPercent: number;
  openedAt: string;
}
```

### 4.2 Account Summary
```typescript
interface AccountSummary {
  totalBalance: number;
  totalEarnings: number;
  totalDeposited: number;
  totalWithdrawn: number;
  overallReturn: number;
  overallReturnPercent: number;
  accounts: InvestmentAccount[];
}
```

### 4.3 Investment Product
```typescript
interface InvestmentProduct {
  id: string;
  code: string;
  name: string;
  description: string;
  riskProfile: 'conservative' | 'moderate' | 'aggressive';
  targetReturnMin: number;
  targetReturnMax: number;
  maxDrawdown: number;
  minInvestment: number;
  managementFee: number;
  performanceFee: number;
  features: string[];
  strategy: string;
  assets: string[];
  tradingFrequency: string;
}
```

### 4.4 Transaction
```typescript
interface Transaction {
  id: string;
  type: 'deposit' | 'withdrawal' | 'distribution' | 'fee' | 'adjustment';
  amount: number;
  status: 'pending' | 'completed' | 'failed' | 'cancelled';
  createdAt: string;
  description?: string;
  balanceAfter: number;
}
```

### 4.5 Withdrawal
```typescript
interface Withdrawal {
  id: string;
  amount: number;
  status: 'pending' | 'approved' | 'processing' | 'completed' | 'rejected';
  requestedAt: string;
  processedAt?: string;
  bankInfo?: { bankName: string; accountLast4: string };
  cryptoInfo?: { network: string; addressLast8: string };
  rejectionReason?: string;
}
```

### 4.6 Account Settings
```typescript
interface AccountSettings {
  distributionFrequency: 'weekly' | 'biweekly' | 'monthly' | 'quarterly';
  autoReinvest: boolean;
  reinvestPercentage: number;
  notifications: {
    distributionAlert: boolean;
    performanceAlert: boolean;
    riskAlert: boolean;
    newsAlert: boolean;
  };
  riskAlerts: {
    enabled: boolean;
    drawdownThreshold: number;
    dailyLossThreshold: number;
  };
  withdrawalSettings: {
    preferredMethod: 'bank' | 'crypto' | 'wallet';
    autoWithdraw: boolean;
    autoWithdrawThreshold: number;
  };
}
```

---

## 5. PATRONES UTILIZADOS

### 5.1 Componentes Funcionales con Hooks
- **useState** para manejo de estado local (loading, error, activeTab, filters)
- **useEffect** para efectos secundarios (cargar datos, dibujar canvas)
- **useRef** para referencias a canvas en gráficos
- **useMemo** para optimización de cálculos costosos

### 5.2 Custom Hooks (Implícitos)
- `investmentService.getAccountSummary()`
- `investmentService.getProductById(productId)`
- `investmentService.getProductPerformance(productId, period)`
- `investmentService.getAccountById(accountId)`
- `investmentService.getTransactions(accountId, filters)`
- `investmentService.getWithdrawals(status?)`
- `investmentService.createAccount(productId, amount)`
- `investmentService.getUserAccounts()`

### 5.3 Patrones de Formularios
- **React Hook Form** para validación
- **Stripe CardElement** para pagos
- **Two-step verification** en WithdrawForm

### 5.4 Patrones de Gráficos
- **Canvas API** para dibujo de líneas y áreas
- **Dip pixel ratio** (DPR) para retina displays
- **Gradient fills** con semitransparencia

### 5.5 Patrones de Estado
- Loading states globales
- Error handling con mensajes
- Success states con confirmación visual
- Optimistic updates (parcial)

---

## 6. CARACTERÍSTICAS DESTACADAS

| Característica | Componentes | Descripción |
|---|---|---|
| **Stripe Integration** | DepositForm | CardElement embebido, confirmCardPayment |
| **2FA/Verification** | WithdrawForm | Step-by-step flow con código verificación |
| **Canvas Charts** | ProductDetail, AccountDetail, Reports, PerformanceWidgetChart | Gráficos de rendimiento custom |
| **Tab Navigation** | AccountDetail | 5 tabs: Overview, Transactions, Distributions, Deposit, Withdraw |
| **Dynamic Forms** | WithdrawForm | Campos condicionales (bank vs crypto) |
| **Comparison Tables** | ProductComparisonTable | Expandible, seleccionable, 2 layouts |
| **Risk Visualization** | Componentes varios | Badges, colores (verde/amarillo/rojo) |
| **Localization** | Componentes varios | Formato de fecha/moneda por locale |
| **Dark Mode Ready** | Todos | Clases Tailwind dark: |
| **Responsive Design** | Todos | Grid/Flex con breakpoints md, lg |

---

## 7. ESTADOS Y TRANSICIONES

### 7.1 Account State Machine
```
PENDING → ACTIVE ↔ SUSPENDED
                    ↓
                 CLOSED
```

### 7.2 Withdrawal State Machine
```
PENDING → APPROVED → PROCESSING → COMPLETED
    ↓         ↓          ↓
  REJECTED  REJECTED  REJECTED
```

### 7.3 Transaction State Machine
```
PENDING → COMPLETED
   ↓
 FAILED    CANCELLED
```

---

## 8. VALIDACIONES

### 8.1 DepositForm
- Monto mínimo: $10
- Monto máximo: $100,000
- Incremento: $0.01
- Token JWT requerido

### 8.2 WithdrawForm
- Monto mínimo: $50
- Monto máximo: Balance o $10k (lo que sea menor)
- Incremento: $0.01
- Verificación 2FA requerida
- Límite diario: $10,000

### 8.3 ProductDetail Investment
- Monto >= minInvestment del producto
- Token JWT requerido
- Producto debe existir

---

## 9. ACCESIBILIDAD Y UX

| Aspecto | Implementación |
|--------|-----------------|
| Loading States | Spinners, disabled buttons |
| Error States | Mensajes en rojo, iconos AlertCircle |
| Success States | Checkmark, mensaje confirmación |
| Empty States | Iconos emoji grandes, CTAs claros |
| Keyboard Nav | Links y buttons nativos |
| ARIA Labels | Labels en formularios |
| Color Contrast | Tailwind dark: para legibilidad |
| Responsive | Grid/Flex, responsive typography |

---

## 10. RESUMEN DE COBERTURA

| Elemento | Cantidad | Coverage |
|----------|----------|----------|
| Páginas | 8 | 100% |
| Componentes | 6 | 100% |
| Tipos TypeScript | 6+ | 100% |
| Endpoints API | 10 | 100% |
| Líneas de Código | ~3,500 | Total |
| Archivos | 14 | Total |

---

**Fecha de Análisis:** 2026-01-25
**Módulo OQI-004 Status:** 35% Implementado
**Análisis Realizado por:** Claude Code
**Próximo Paso:** Análisis de Contratos API y Gaps
