# Indice de Requerimientos Funcionales - MGN-002 Users

## Resumen del Modulo

| Campo | Valor |
|-------|-------|
| **Codigo** | MGN-002 |
| **Nombre** | Users - Gestion de Usuarios |
| **Prioridad** | P0 - Critica |
| **Total RFs** | 5 |
| **Estado** | En documentacion |
| **Fecha** | 2025-12-05 |

---

## Descripcion General

El modulo de usuarios gestiona el ciclo de vida completo de los usuarios del sistema, incluyendo:

- **CRUD de Usuarios**: Crear, listar, actualizar y eliminar usuarios (admin)
- **Perfil Personal**: Cada usuario gestiona su propia informacion
- **Cambio de Email**: Proceso seguro con verificacion
- **Cambio de Password**: Autoservicio con validaciones
- **Preferencias**: Personalizacion de la experiencia

---

## Lista de Requerimientos Funcionales

| ID | Nombre | Prioridad | Complejidad | Estado | Story Points |
|----|--------|-----------|-------------|--------|--------------|
| [RF-USER-001](./RF-USER-001.md) | CRUD de Usuarios | P0 | Media | Aprobado | 13 |
| [RF-USER-002](./RF-USER-002.md) | Perfil de Usuario | P1 | Baja | Aprobado | 7 |
| [RF-USER-003](./RF-USER-003.md) | Cambio de Email | P1 | Media | Aprobado | 6 |
| [RF-USER-004](./RF-USER-004.md) | Cambio de Password | P0 | Baja | Aprobado | 4 |
| [RF-USER-005](./RF-USER-005.md) | Preferencias de Usuario | P2 | Baja | Aprobado | 7 |

**Total Story Points:** 37

---

## Grafo de Dependencias

```
RF-AUTH-001 (Login)
       │
       ▼
RF-USER-001 (CRUD Usuarios) ─────────────────────────┐
       │                                              │
       ├──────────────────┬──────────────────┐       │
       │                  │                  │       │
       ▼                  ▼                  ▼       │
RF-USER-002          RF-USER-003       RF-USER-004  │
(Perfil)            (Cambio Email)   (Cambio Pass)  │
       │                  │                          │
       └────────┬─────────┘                          │
                │                                    │
                ▼                                    │
         RF-USER-005 ◄───────────────────────────────┘
        (Preferencias)
```

### Orden de Implementacion Recomendado

1. **RF-USER-001** - CRUD de usuarios (base)
2. **RF-USER-004** - Cambio de password (seguridad basica)
3. **RF-USER-002** - Perfil de usuario (autoservicio)
4. **RF-USER-003** - Cambio de email (proceso complejo)
5. **RF-USER-005** - Preferencias (personalizacion)

---

## Endpoints del Modulo

### Gestion de Usuarios (Admin)

| Metodo | Endpoint | RF | Descripcion | Permisos |
|--------|----------|-----|-------------|----------|
| POST | `/api/v1/users` | RF-USER-001 | Crear usuario | users:create |
| GET | `/api/v1/users` | RF-USER-001 | Listar usuarios | users:read |
| GET | `/api/v1/users/:id` | RF-USER-001 | Obtener usuario | users:read |
| PATCH | `/api/v1/users/:id` | RF-USER-001 | Actualizar usuario | users:update |
| DELETE | `/api/v1/users/:id` | RF-USER-001 | Eliminar usuario | users:delete |
| POST | `/api/v1/users/:id/activate` | RF-USER-001 | Activar usuario | users:update |
| POST | `/api/v1/users/:id/deactivate` | RF-USER-001 | Desactivar usuario | users:update |

### Perfil Personal (Self-service)

| Metodo | Endpoint | RF | Descripcion |
|--------|----------|-----|-------------|
| GET | `/api/v1/users/me` | RF-USER-002 | Obtener mi perfil |
| PATCH | `/api/v1/users/me` | RF-USER-002 | Actualizar mi perfil |
| POST | `/api/v1/users/me/avatar` | RF-USER-002 | Subir avatar |
| DELETE | `/api/v1/users/me/avatar` | RF-USER-002 | Eliminar avatar |
| POST | `/api/v1/users/me/email/request-change` | RF-USER-003 | Solicitar cambio email |
| GET | `/api/v1/users/email/verify-change` | RF-USER-003 | Verificar cambio email |
| POST | `/api/v1/users/me/password` | RF-USER-004 | Cambiar password |
| GET | `/api/v1/users/me/preferences` | RF-USER-005 | Obtener preferencias |
| PATCH | `/api/v1/users/me/preferences` | RF-USER-005 | Actualizar preferencias |
| POST | `/api/v1/users/me/preferences/reset` | RF-USER-005 | Reset preferencias |

---

## Tablas de Base de Datos

| Tabla | Schema | RF | Descripcion |
|-------|--------|-----|-------------|
| `users` | core_users | RF-USER-001 | Tabla principal de usuarios |
| `user_avatars` | core_users | RF-USER-002 | Historial de avatares |
| `email_change_requests` | core_users | RF-USER-003 | Solicitudes de cambio email |
| `password_history` | core_auth | RF-USER-004 | Historial de passwords |
| `user_preferences` | core_users | RF-USER-005 | Preferencias por usuario |

---

## Modelo de Datos Principal

```mermaid
erDiagram
    users ||--o| user_preferences : "has"
    users ||--o{ user_avatars : "has"
    users ||--o{ email_change_requests : "requests"
    users ||--o{ password_history : "has"
    users }o--|| tenants : "belongs to"

    users {
        uuid id PK
        uuid tenant_id FK
        varchar email
        varchar password_hash
        varchar first_name
        varchar last_name
        varchar phone
        varchar avatar_url
        enum status
        boolean is_active
        timestamptz email_verified_at
        timestamptz last_login_at
        integer failed_login_attempts
        timestamptz locked_until
        jsonb metadata
        timestamptz created_at
        uuid created_by
        timestamptz updated_at
        uuid updated_by
        timestamptz deleted_at
        uuid deleted_by
    }

    user_preferences {
        uuid id PK
        uuid user_id FK
        uuid tenant_id FK
        varchar language
        varchar timezone
        varchar date_format
        varchar time_format
        varchar theme
        jsonb notifications
        jsonb dashboard
        timestamptz updated_at
    }
```

---

## Estados de Usuario

| Estado | Descripcion | Puede Login |
|--------|-------------|-------------|
| `pending_activation` | Recien creado, esperando activacion | No |
| `active` | Usuario activo y funcional | Si |
| `inactive` | Desactivado por admin | No |
| `locked` | Bloqueado por intentos fallidos | No |
| `deleted` | Soft deleted | No |

---

## Criterios de Aceptacion Consolidados

### Seguridad

- [ ] Soft delete en lugar de hard delete
- [ ] Solo admins gestionan otros usuarios
- [ ] Email verificado antes de cambio efectivo
- [ ] Password actual requerido para cambios sensibles
- [ ] Historial de passwords para evitar reuso
- [ ] Rate limiting en operaciones sensibles

### Funcionalidad

- [ ] CRUD completo con paginacion y filtros
- [ ] Perfil autoservicio funcional
- [ ] Avatar upload con resize automatico
- [ ] Cambio de email con doble verificacion
- [ ] Cambio de password con politica de complejidad
- [ ] Preferencias persistentes y aplicadas

### Auditoria

- [ ] created_by/updated_by en todas las operaciones
- [ ] deleted_by en soft deletes
- [ ] Historial de cambios de email
- [ ] Historial de passwords

---

## Estimacion Total

| Capa | Story Points |
|------|--------------|
| Database | 6 |
| Backend | 15 |
| Frontend | 16 |
| **Total** | **37** |

---

## Riesgos Identificados

| Riesgo | Probabilidad | Impacto | Mitigacion |
|--------|--------------|---------|------------|
| Spam de cambio de email | Media | Bajo | Rate limiting 3/dia |
| Storage de avatares lleno | Baja | Medio | Cleanup job, limites |
| Performance en listados | Media | Medio | Paginacion, indices |
| Enumeracion de usuarios | Baja | Alto | Permisos estrictos |

---

## Referencias

### Documentacion Relacionada

- [DDL-SPEC-core_users.md](../../02-modelado/database-design/DDL-SPEC-core_users.md) - Especificacion de base de datos
- [ET-users-backend.md](../../02-modelado/especificaciones-tecnicas/ET-users-backend.md) - Especificacion tecnica backend
- [TP-users.md](../../04-test-plans/TP-users.md) - Plan de pruebas

### Dependencias con Otros Modulos

- **MGN-001 (Auth)**: Autenticacion y tokens
- **MGN-003 (Roles)**: Asignacion de roles a usuarios
- **MGN-004 (Tenants)**: Aislamiento multi-tenant

---

## Historial de Cambios

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

---

## Aprobaciones

| Rol | Nombre | Fecha | Firma |
|-----|--------|-------|-------|
| Analista | System | 2025-12-05 | [x] |
| Tech Lead | - | - | [ ] |
| Product Owner | - | - | [ ] |
