# Indice de Requerimientos Funcionales - MGN-004 Tenants

## Resumen del Modulo

| Campo | Valor |
|-------|-------|
| **Modulo** | MGN-004 |
| **Nombre** | Tenants (Multi-Tenancy) |
| **Descripcion** | Arquitectura multi-tenant con aislamiento de datos |
| **Total RFs** | 4 |
| **Story Points** | 100 |
| **Estado** | Ready |
| **Fecha** | 2025-12-05 |

---

## Lista de Requerimientos

| ID | Nombre | Prioridad | SP | Estado |
|----|--------|-----------|-----|--------|
| [RF-TENANT-001](./RF-TENANT-001.md) | Gestion de Tenants | P0 | 29 | Ready |
| [RF-TENANT-002](./RF-TENANT-002.md) | Configuracion de Tenant | P0 | 19 | Ready |
| [RF-TENANT-003](./RF-TENANT-003.md) | Aislamiento de Datos | P0 | 20 | Ready |
| [RF-TENANT-004](./RF-TENANT-004.md) | Subscripciones y Limites | P1 | 32 | Ready |

---

## Diagrama de Arquitectura Multi-Tenant

```
┌─────────────────────────────────────────────────────────────────┐
│                      Platform Layer                              │
├─────────────────────────────────────────────────────────────────┤
│  Platform Admin UI     │    API Gateway    │    Auth Service    │
│  (Gestion tenants)     │   (Routing)       │   (JWT + tenant)   │
└─────────────────────────────────────────────────────────────────┘
                                │
                                ▼
┌─────────────────────────────────────────────────────────────────┐
│                      Application Layer                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐             │
│  │ TenantGuard │  │  RbacGuard  │  │LimitGuard   │             │
│  │(Contexto)   │  │ (Permisos)  │  │(Subscripcion)│             │
│  └─────────────┘  └─────────────┘  └─────────────┘             │
│                                                                  │
│  ┌─────────────────────────────────────────────────────────────┐│
│  │              TenantAwareServices                             ││
│  │  (Todos los servicios heredan contexto de tenant)           ││
│  └─────────────────────────────────────────────────────────────┘│
│                                                                  │
└─────────────────────────────────────────────────────────────────┘
                                │
                                ▼
┌─────────────────────────────────────────────────────────────────┐
│                      Data Layer                                  │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  PostgreSQL Database (Shared)                                    │
│                                                                  │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐             │
│  │  Tenant A   │  │  Tenant B   │  │  Tenant C   │             │
│  │  tenant_id  │  │  tenant_id  │  │  tenant_id  │             │
│  │  =uuid-a    │  │  =uuid-b    │  │  =uuid-c    │             │
│  └─────────────┘  └─────────────┘  └─────────────┘             │
│                                                                  │
│  Row Level Security (RLS) - Aislamiento automatico              │
│  SET app.current_tenant_id = 'tenant-uuid'                      │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘
```

---

## Flujo de Request Multi-Tenant

```
┌─────────────────────────────────────────────────────────────────┐
│                        Request Flow                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│  1. Request HTTP                                                 │
│     └─> Authorization: Bearer {JWT con tenant_id}               │
│                                                                  │
│  2. JwtAuthGuard                                                │
│     └─> Valida token, extrae user + tenant_id                   │
│                                                                  │
│  3. TenantGuard                                                 │
│     └─> Verifica tenant activo                                  │
│     └─> Inyecta tenant en request                               │
│                                                                  │
│  4. TenantContextMiddleware                                     │
│     └─> SET app.current_tenant_id = :tenantId                   │
│                                                                  │
│  5. LimitGuard (si aplica)                                      │
│     └─> Verifica limites de subscripcion                        │
│                                                                  │
│  6. RbacGuard                                                   │
│     └─> Valida permisos del usuario                             │
│                                                                  │
│  7. Controller                                                  │
│     └─> Ejecuta logica de negocio                               │
│                                                                  │
│  8. TenantAwareService                                          │
│     └─> Automaticamente filtra por tenant                       │
│                                                                  │
│  9. PostgreSQL RLS                                              │
│     └─> Ultima linea de defensa                                 │
│     └─> WHERE tenant_id = current_setting('app.current_tenant_id')│
│                                                                  │
└─────────────────────────────────────────────────────────────────┘
```

---

## Estados del Tenant

```
                         ┌──────────────┐
                         │   created    │
                         └──────┬───────┘
                                │
                                ▼
                         ┌──────────────┐
             ┌──────────│    trial     │──────────┐
             │          └──────┬───────┘          │
             │                 │                   │
             │ (upgrade)       │ (trial expires)  │ (convert)
             │                 │                   │
             │                 ▼                   │
             │          ┌──────────────┐          │
             │          │trial_expired │          │
             │          └──────────────┘          │
             │                                     │
             ▼                                     ▼
      ┌──────────────┐                     ┌──────────────┐
      │    active    │◄────────────────────│   active     │
      └──────┬───────┘    (reactivate)     └──────┬───────┘
             │                                     │
             │ (suspend)                           │
             │                                     │
             ▼                                     │
      ┌──────────────┐                            │
      │  suspended   │────────────────────────────┘
      └──────┬───────┘
             │
             │ (schedule delete)
             ▼
      ┌──────────────────┐
      │ pending_deletion │
      └────────┬─────────┘
               │
               │ (30 days grace)
               ▼
      ┌──────────────┐
      │   deleted    │
      └──────────────┘
```

---

## Planes de Subscripcion

| Plan | Usuarios | Storage | Modulos | API Calls | Precio |
|------|----------|---------|---------|-----------|--------|
| **Trial** | 5 | 1 GB | Basicos | 1K/mes | Gratis |
| **Starter** | 10 | 5 GB | Basicos | 10K/mes | $29/mes |
| **Professional** | 50 | 25 GB | Standard | 50K/mes | $99/mes |
| **Enterprise** | ∞ | 100 GB | Premium | 500K/mes | $299/mes |
| **Custom** | Config | Config | Config | Config | Cotizacion |

---

## Tablas de Base de Datos

| Tabla | Descripcion |
|-------|-------------|
| tenants | Tenants registrados |
| tenant_settings | Configuracion de cada tenant (JSONB) |
| subscriptions | Subscripciones activas y pasadas |
| plans | Planes de subscripcion disponibles |
| invoices | Historial de facturacion |
| tenant_modules | Modulos activos por tenant |

---

## Estimacion Total

| Capa | Story Points |
|------|--------------|
| Backend: CRUD Tenants | 12 |
| Backend: Settings | 7 |
| Backend: RLS & Guards | 15 |
| Backend: Subscriptions | 15 |
| Backend: Billing | 10 |
| Backend: Tests | 12 |
| Frontend: Platform Admin | 15 |
| Frontend: Tenant Settings | 8 |
| Frontend: Subscription UI | 8 |
| Frontend: Tests | 6 |
| **Total** | **108 SP** |

> Nota: Los 100 SP indicados en resumen corresponden a la suma de RF individuales.

---

## Definition of Done del Modulo

- [ ] RF-TENANT-001: CRUD de tenants funcional
- [ ] RF-TENANT-002: Settings por tenant operativos
- [ ] RF-TENANT-003: RLS aplicado en TODAS las tablas
- [ ] RF-TENANT-003: Tests de aislamiento pasando
- [ ] RF-TENANT-004: Planes y limites configurados
- [ ] RF-TENANT-004: Enforcement de limites activo
- [ ] Platform Admin UI completa
- [ ] Tests unitarios > 80% coverage
- [ ] Tests de aislamiento exhaustivos
- [ ] Security review de RLS aprobado
- [ ] Performance tests con multiples tenants

---

## Consideraciones de Seguridad

### Aislamiento de Datos

- RLS como ultima linea de defensa
- Validacion en TODAS las capas
- Nunca confiar en input del cliente
- Auditar accesos cross-tenant

### Platform Admin

- Autenticacion separada
- 2FA obligatorio
- Logs de todas las acciones
- Switch de tenant explicito y auditado

### Datos Sensibles

- Encriptar datos sensibles por tenant
- Claves de encriptacion por tenant
- Backups separados (opcional enterprise)

---

## Notas de Implementacion

### Orden Recomendado

1. **Primero**: RF-TENANT-003 (RLS) - Base para todo lo demas
2. **Segundo**: RF-TENANT-001 (CRUD) - Crear tenants
3. **Tercero**: RF-TENANT-002 (Settings) - Configurar tenants
4. **Cuarto**: RF-TENANT-004 (Subscriptions) - Monetizacion

### Migracion de Datos Existentes

Si hay datos sin tenant_id:
1. Crear tenant "default"
2. Asignar todos los datos al default
3. Habilitar RLS
4. Migrar datos a tenants especificos

---

## Historial

| Version | Fecha | Autor | Cambios |
|---------|-------|-------|---------|
| 1.0 | 2025-12-05 | System | Creacion inicial con 4 RFs |
