trading-platform/docs/02-definicion-modulos/OQI-004-investment-accounts/historias-usuario/US-INV-007-ver-transacciones.md
rckrdmrd a7cca885f0 feat: Major platform documentation and architecture updates
Changes include:
- Updated architecture documentation
- Enhanced module definitions (OQI-001 to OQI-008)
- ML integration documentation updates
- Trading strategies documentation
- Orchestration and inventory updates
- Docker configuration updates

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 05:33:35 -06:00

325 lines
12 KiB
Markdown

---
id: "US-INV-007"
title: "Ver Historial de Transacciones"
type: "User Story"
status: "Done"
priority: "Media"
epic: "OQI-004"
project: "trading-platform"
story_points: 3
created_date: "2025-12-05"
updated_date: "2026-01-04"
---
# US-INV-007: Ver Historial de Transacciones
## Metadata
| Campo | Valor |
|-------|-------|
| **ID** | US-INV-007 |
| **Épica** | OQI-004 - Cuentas de Inversión |
| **Módulo** | investment |
| **Prioridad** | P1 |
| **Story Points** | 3 |
| **Sprint** | Sprint 6 |
| **Estado** | Pendiente |
| **Asignado a** | Por asignar |
---
## Historia de Usuario
**Como** inversor,
**quiero** ver el historial completo de transacciones de mi cuenta,
**para** auditar movimientos, reconciliar mi balance y tener trazabilidad completa.
## Descripción Detallada
El usuario debe poder acceder a un historial completo de todas las transacciones de su cuenta: depósitos, retiros, ganancias/pérdidas de trades, distribuciones de utilidades, y comisiones. Debe poder filtrar por tipo, fecha, y exportar los datos.
## Mockups/Wireframes
```
┌─────────────────────────────────────────────────────────────────┐
│ HISTORIAL DE TRANSACCIONES │
├─────────────────────────────────────────────────────────────────┤
│ │
│ Filtros: │
│ Tipo: [Todas ▼] Período: [Último mes ▼] [Buscar] │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Fecha │ Tipo │ Descripción │ Monto │ │
│ ├──────────────────────────────────────────────────────────┤ │
│ │ 2025-12-05 │ 💰 Depósito │ Stripe │ +$1,000 │ │
│ │ 10:30 AM │ │ │ │ │
│ ├──────────────────────────────────────────────────────────┤ │
│ │ 2025-12-04 │ 📈 Ganancia Trade │ BTC/USDT │ +$45.20 │ │
│ │ 03:15 PM │ │ Long │ │ │
│ ├──────────────────────────────────────────────────────────┤ │
│ │ 2025-12-04 │ 📉 Pérdida Trade │ ETH/USDT │ -$12.30 │ │
│ │ 11:20 AM │ │ Long │ │ │
│ ├──────────────────────────────────────────────────────────┤ │
│ │ 2025-12-03 │ 📊 Distribución │ Utilidades │ +$32.10 │ │
│ │ 12:00 PM │ │ Mensual │ │ │
│ ├──────────────────────────────────────────────────────────┤ │
│ │ 2025-12-02 │ 💸 Retiro │ Stripe │ -$500.00 │ │
│ │ 09:00 AM │ │ Completado │ │ │
│ ├──────────────────────────────────────────────────────────┤ │
│ │ 2025-12-01 │ 💰 Depósito │ Stripe │ +$200.00 │ │
│ │ 02:45 PM │ │ │ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ Mostrando 6 de 156 transacciones │
│ [← Anterior] Página 1 de 26 [Siguiente →] │
│ │
│ [Exportar CSV] [Exportar PDF] │
│ │
└─────────────────────────────────────────────────────────────────┘
```
---
## Criterios de Aceptación
**Escenario 1: Ver historial completo**
```gherkin
DADO que el usuario tiene cuenta con 156 transacciones
CUANDO navega a /investment/transactions/:accountId
ENTONCES se muestra lista paginada (10 por página)
Y cada transacción muestra: fecha, hora, tipo, descripción, monto
Y las transacciones están ordenadas por fecha desc (más recientes primero)
Y se muestra navegación de paginación
```
**Escenario 2: Filtrar por tipo de transacción**
```gherkin
DADO que el usuario está viendo el historial
CUANDO selecciona filtro "Tipo: Depósitos"
ENTONCES se muestran solo transacciones de tipo "deposit"
Y se actualiza contador "Mostrando X de Y"
Y se resetea paginación a página 1
```
**Escenario 3: Filtrar por período**
```gherkin
DADO que el usuario está viendo el historial
CUANDO selecciona "Período: Último mes"
ENTONCES se muestran solo transacciones de últimos 30 días
Y se actualiza la lista
```
**Escenario 4: Ver detalle de transacción**
```gherkin
DADO que el usuario está viendo el historial
CUANDO hace click en una transacción
ENTONCES se abre modal/drawer con detalle completo
Y muestra: ID transacción, timestamp exacto, monto bruto, comisiones, monto neto
Y para trades: par, dirección, precio entrada, precio salida, P&L
Y para Stripe: payment intent ID, método de pago
```
**Escenario 5: Exportar historial**
```gherkin
DADO que el usuario tiene filtros activos
CUANDO hace click en "Exportar CSV"
ENTONCES se descarga CSV con transacciones filtradas
Y incluye todas las columnas relevantes
Y nombre archivo: "transactions_atlas_2025-12-05.csv"
```
**Escenario 6: Cuenta sin transacciones**
```gherkin
DADO que el usuario tiene cuenta recién creada
Y no hay transacciones
CUANDO accede al historial
ENTONCES se muestra mensaje "Aún no hay transacciones"
Y se muestra CTA "Realizar primer depósito"
```
## Criterios Adicionales
- [ ] Mostrar balance acumulado después de cada transacción
- [ ] Indicadores visuales por tipo (colores, iconos)
- [ ] Búsqueda por texto libre (descripción, monto)
- [ ] Infinite scroll como alternativa a paginación
- [ ] Cache de consultas frecuentes
---
## Tareas Técnicas
**Database:**
- [ ] DB-INV-001: Índice compuesto en (account_id, created_at DESC)
- [ ] DB-INV-002: Índice en (account_id, transaction_type)
- [ ] DB-INV-003: Vista para unir transacciones con metadata
**Backend:**
- [ ] BE-INV-001: Endpoint GET /investment/accounts/:id/transactions
- [ ] BE-INV-002: Implementar TransactionService.getHistory()
- [ ] BE-INV-003: Query builder para filtros dinámicos
- [ ] BE-INV-004: Paginación cursor-based o offset
- [ ] BE-INV-005: Endpoint GET /investment/transactions/:id (detalle)
- [ ] BE-INV-006: Endpoint GET /investment/accounts/:id/transactions/export
**Frontend:**
- [ ] FE-INV-001: Crear página TransactionsPage.tsx
- [ ] FE-INV-002: Crear componente TransactionList.tsx
- [ ] FE-INV-003: Crear componente TransactionRow.tsx
- [ ] FE-INV-004: Crear componente TransactionFilters.tsx
- [ ] FE-INV-005: Crear componente TransactionDetailModal.tsx
- [ ] FE-INV-006: Crear componente Pagination.tsx
- [ ] FE-INV-007: Implementar transactionsStore
- [ ] FE-INV-008: Implementar exportación CSV
**Tests:**
- [ ] TEST-INV-001: Test queries con filtros
- [ ] TEST-INV-002: Test paginación
- [ ] TEST-INV-003: Test exportación
- [ ] TEST-INV-004: Test E2E historial completo
---
## Dependencias
**Depende de:**
- [ ] US-INV-003: Realizar depósito - Estado: Pendiente
- [ ] US-INV-006: Solicitar retiro - Estado: Pendiente
**Bloquea:**
- [ ] US-INV-011: Exportar reporte PDF
---
## Notas Técnicas
**Endpoints involucrados:**
| Método | Endpoint | Descripción |
|--------|----------|-------------|
| GET | /investment/accounts/:id/transactions | Lista paginada |
| GET | /investment/transactions/:id | Detalle |
| GET | /investment/accounts/:id/transactions/export | CSV export |
**Entidades/Tablas:**
- `investment.transactions`: Transacciones principales
- `investment.trade_details`: Metadata de trades
- `payments.stripe_transactions`: Metadata de Stripe
**Query Parameters:**
```typescript
{
page: 1,
limit: 10,
type?: "deposit" | "withdrawal" | "trade_profit" | "trade_loss" | "distribution" | "fee",
startDate?: "2025-11-01",
endDate?: "2025-12-05",
search?: "BTC",
sortBy?: "created_at",
sortOrder?: "DESC"
}
```
**Response GET /transactions:**
```typescript
{
transactions: [
{
id: "uuid",
accountId: "uuid",
type: "deposit",
amount: 1000,
description: "Stripe deposit",
createdAt: "2025-12-05T10:30:00Z",
metadata: {
stripePaymentIntentId: "pi_xxx",
paymentMethod: "card_****4242"
}
},
{
id: "uuid",
accountId: "uuid",
type: "trade_profit",
amount: 45.20,
description: "BTC/USDT Long",
createdAt: "2025-12-04T15:15:00Z",
metadata: {
symbol: "BTC/USDT",
side: "long",
entryPrice: 45000,
exitPrice: 46000,
size: 0.05,
pnl: 45.20
}
}
],
pagination: {
page: 1,
limit: 10,
total: 156,
totalPages: 16,
hasNext: true,
hasPrev: false
},
summary: {
totalDeposits: 5000,
totalWithdrawals: 1000,
totalProfits: 1245.50,
totalLosses: 255.30
}
}
```
**Tipos de Transacción:**
- `deposit`: Depósito vía Stripe
- `withdrawal`: Retiro vía Stripe
- `trade_profit`: Ganancia de trade del agente
- `trade_loss`: Pérdida de trade del agente
- `distribution`: Distribución mensual de utilidades
- `fee`: Comisiones (Stripe, plataforma)
**CSV Export Format:**
```csv
Date,Time,Type,Description,Amount,Balance,Transaction ID
2025-12-05,10:30:00,Deposit,Stripe,+1000.00,1000.00,uuid
2025-12-04,15:15:00,Trade Profit,BTC/USDT Long,+45.20,1045.20,uuid
```
---
## Definition of Ready (DoR)
- [x] Historia claramente escrita
- [x] Criterios de aceptación definidos
- [x] Story points estimados
- [x] Dependencias identificadas
- [ ] Diseño/mockup disponible
- [x] API spec disponible
## Definition of Done (DoD)
- [ ] Código implementado según criterios
- [ ] Tests unitarios escritos y pasando
- [ ] Tests de integración pasando
- [ ] Paginación funcionando correctamente
- [ ] Filtros funcionando
- [ ] Exportación CSV funcionando
- [ ] Code review aprobado
- [ ] Documentación actualizada
- [ ] Performance optimizada (queries < 500ms)
- [ ] QA aprobado
- [ ] Desplegado en ambiente de pruebas
---
## Historial de Cambios
| Fecha | Cambio | Autor |
|-------|--------|-------|
| 2025-12-05 | Creación | Requirements-Analyst |
---
**Creada por:** Requirements-Analyst
**Fecha:** 2025-12-05
**Última actualización:** 2025-12-05