trading-platform/docs/02-definicion-modulos/OQI-004-investment-accounts/requerimientos/RF-INV-003-depositos.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

284 lines
7.9 KiB
Markdown

---
id: "RF-INV-003"
title: "Sistema de Depositos"
type: "Requirement"
status: "Done"
priority: "Alta"
epic: "OQI-004"
project: "trading-platform"
version: "1.0.0"
created_date: "2025-12-05"
updated_date: "2026-01-04"
---
# RF-INV-003: Sistema de Depósitos
## Metadata
| Campo | Valor |
|-------|-------|
| **ID** | RF-INV-003 |
| **Épica** | OQI-004 - Cuentas de Inversión |
| **Tipo** | Requerimiento Funcional |
| **Prioridad** | P0 |
| **Story Points** | 8 |
| **Estado** | Aprobado |
| **Última actualización** | 2025-12-05 |
---
## Descripción
El sistema debe permitir a los usuarios depositar fondos en sus cuentas de inversión a través de múltiples métodos de pago, con procesamiento seguro y tracking completo de transacciones.
---
## Métodos de Depósito
### 1. Stripe (Tarjeta de Crédito/Débito)
| Característica | Valor |
|----------------|-------|
| Mínimo | $50 USD |
| Máximo | $10,000 USD |
| Comisión | 2.9% + $0.30 |
| Tiempo procesamiento | Instantáneo |
| Monedas | USD, EUR (conversión automática) |
### 2. Transferencia desde Wallet Interno
| Característica | Valor |
|----------------|-------|
| Mínimo | $10 USD |
| Máximo | Balance disponible |
| Comisión | Sin comisión |
| Tiempo procesamiento | Instantáneo |
### 3. Crypto (Futuro - Fase 2)
| Característica | Valor |
|----------------|-------|
| Monedas | USDT, USDC |
| Red | Ethereum, BSC, Polygon |
| Confirmaciones | 3-12 según red |
---
## Flujo de Depósito
### Diagrama de Flujo
```
┌─────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ User │────▶│ Select │────▶│ Enter │────▶│ Confirm │
│ Account │ │ Method │ │ Amount │ │ Payment │
└─────────┘ └──────────┘ └──────────┘ └────┬─────┘
┌──────────────────────────────────┘
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Process │────▶│ Update │────▶│ Send │
│ Payment │ │ Balance │ │ Confirm │
└──────────┘ └──────────┘ └──────────┘
```
### Estados de Transacción
| Estado | Descripción |
|--------|-------------|
| `pending` | Transacción iniciada, esperando pago |
| `processing` | Pago recibido, procesando |
| `completed` | Fondos acreditados a la cuenta |
| `failed` | Pago rechazado o error |
| `refunded` | Pago devuelto (por solicitud o error) |
---
## Funcionalidades Requeridas
### RF-INV-003.1: Iniciar Depósito
El usuario debe poder:
- Seleccionar cuenta de inversión destino
- Elegir método de pago
- Ingresar monto a depositar
- Ver resumen con comisiones
- Confirmar transacción
### RF-INV-003.2: Procesamiento Stripe
```typescript
interface StripeDepositRequest {
accountId: string; // Cuenta de inversión destino
amount: number; // Monto en USD
paymentMethodId: string; // Stripe payment method
}
interface StripeDepositResponse {
transactionId: string;
status: 'pending' | 'completed' | 'failed';
amount: number;
fee: number;
netAmount: number; // amount - fee
receiptUrl?: string;
}
```
### RF-INV-003.3: Transferencia desde Wallet
```typescript
interface WalletTransferRequest {
accountId: string; // Cuenta de inversión destino
amount: number; // Monto en USD
}
interface WalletTransferResponse {
transactionId: string;
status: 'completed';
amount: number;
fee: 0;
newWalletBalance: number;
newAccountBalance: number;
}
```
### RF-INV-003.4: Validaciones
| Validación | Mensaje de Error |
|------------|------------------|
| Monto < mínimo | "El monto mínimo es $50 USD" |
| Monto > máximo | "El monto máximo es $10,000 USD" |
| Cuenta inactiva | "La cuenta debe estar activa para depositar" |
| Saldo insuficiente (wallet) | "Saldo insuficiente en wallet" |
| Tarjeta rechazada | "El pago fue rechazado. Verifica tu tarjeta" |
### RF-INV-003.5: Primer Depósito
Cuando es el primer depósito de una cuenta:
- Cambiar estado de cuenta a `active`
- Registrar timestamp de primer depósito
- Iniciar trading automático
- Enviar email de bienvenida
---
## Modelo de Datos
### Entidad: DepositTransaction
```typescript
interface DepositTransaction {
id: string; // UUID
accountId: string; // FK a investment_accounts
userId: string; // FK a users
method: 'stripe' | 'wallet' | 'crypto';
status: TransactionStatus;
// Montos
amount: number; // Monto solicitado
fee: number; // Comisión cobrada
netAmount: number; // Monto acreditado
currency: 'USD';
// Stripe specific
stripePaymentIntentId?: string;
stripeReceiptUrl?: string;
// Wallet specific
walletTransactionId?: string;
// Metadata
ipAddress: string;
userAgent: string;
// Timestamps
createdAt: Date;
processedAt?: Date;
completedAt?: Date;
failedAt?: Date;
}
```
---
## Reglas de Negocio
1. **RN-020**: Los depósitos solo pueden hacerse a cuentas activas o pending_deposit
2. **RN-021**: Las comisiones de Stripe se descuentan del monto depositado
3. **RN-022**: Los depósitos desde wallet son instantáneos y sin comisión
4. **RN-023**: El primer depósito activa automáticamente la cuenta
5. **RN-024**: Límite diario de depósitos: $50,000 USD (prevención de fraude)
6. **RN-025**: Los depósitos generan registro de auditoría inmutable
---
## Criterios de Aceptación
```gherkin
Escenario: Depósito con tarjeta exitoso
DADO que el usuario tiene cuenta activa en Atlas
Y tiene tarjeta guardada en Stripe
CUANDO deposita $500 USD
ENTONCES se procesa el pago exitosamente
Y se descuenta la comisión de Stripe
Y el balance de la cuenta aumenta en $485.20
Y recibe confirmación por email
Escenario: Depósito desde wallet
DADO que el usuario tiene $1,000 en su wallet
Y tiene cuenta activa en Orion
CUANDO transfiere $200 desde su wallet
ENTONCES el balance del wallet disminuye en $200
Y el balance de la cuenta aumenta en $200
Y no se cobra comisión
Y la transferencia es instantánea
Escenario: Primer depósito activa cuenta
DADO que el usuario tiene cuenta en estado "pending_deposit"
CUANDO realiza su primer depósito de $100
ENTONCES la cuenta cambia a estado "active"
Y el trading automático se inicia
Y recibe email de bienvenida con instrucciones
Escenario: Depósito por debajo del mínimo
DADO que el usuario intenta depositar $30 USD
CUANDO confirma la transacción
ENTONCES recibe error "El monto mínimo es $50 USD"
Y la transacción no se procesa
```
---
## API Endpoints
| Método | Endpoint | Descripción |
|--------|----------|-------------|
| POST | /investment/deposits/stripe | Crear depósito con Stripe |
| POST | /investment/deposits/wallet | Transferir desde wallet |
| GET | /investment/deposits | Listar depósitos del usuario |
| GET | /investment/deposits/:id | Detalle de depósito |
---
## Webhooks (Stripe)
| Evento | Acción |
|--------|--------|
| `payment_intent.succeeded` | Acreditar fondos, actualizar transacción |
| `payment_intent.payment_failed` | Marcar transacción como fallida |
| `charge.refunded` | Revertir acreditación, notificar usuario |
---
## Referencias
- [US-INV-003: Realizar depósito](../historias-usuario/US-INV-003-realizar-deposito.md)
- [ET-INV-003: Stripe Integration](../especificaciones/ET-INV-003-stripe.md)
- [RF-PAY-002: Checkout y Pagos](../../OQI-005-payments-stripe/requerimientos/RF-PAY-002-checkout.md)
---
**Autor:** Requirements-Analyst
**Fecha:** 2025-12-05