484 lines
15 KiB
Markdown
484 lines
15 KiB
Markdown
# Resumen Ejecutivo: MAI-013 - Administración & Seguridad
|
||
|
||
**Fecha de generación:** 2025-11-20
|
||
**Estado:** 🚧 En Progreso (30% completo)
|
||
**Story Points:** 40 SP
|
||
**Prioridad:** P0 (Crítica)
|
||
|
||
---
|
||
|
||
## 📊 Estado de Completitud
|
||
|
||
| Tipo de Documento | Completados | Total | % |
|
||
|-------------------|-------------|-------|---|
|
||
| README Principal | 1 | 1 | 100% ✅ |
|
||
| Requerimientos Funcionales (RF) | 2 | 5 | 40% 🚧 |
|
||
| Especificaciones Técnicas (ET) | 0 | 5 | 0% ⏳ |
|
||
| Historias de Usuario (US) | 0 | 8 | 0% ⏳ |
|
||
| **Total Documentos** | **3** | **19** | **16%** |
|
||
|
||
**Tamaño total generado:** ~85 KB (estimado final: ~280 KB)
|
||
|
||
---
|
||
|
||
## ✅ Documentos Completados
|
||
|
||
### 1. README.md del Módulo (~30 KB) ✅
|
||
|
||
**Contenido clave:**
|
||
- Descripción general del módulo transversal
|
||
- 7 roles especializados en construcción
|
||
- Matriz completa de permisos (7 roles × 14 módulos)
|
||
- Estructura jerárquica de centros de costo
|
||
- Sistema de auditoría completo (4 categorías de eventos)
|
||
- Estrategia de backups 3-2-1 (Full, Incremental, Archivos, Snapshots)
|
||
- Seguridad de datos (LFPDPPP + GDPR compliance)
|
||
- Políticas de seguridad (contraseñas, sesiones, acceso)
|
||
- Métricas de éxito (KPIs operacionales y de seguridad)
|
||
- Riesgos y mitigaciones
|
||
|
||
**Audiencia:** Product Owner, Stakeholders, Tech Lead, Security Team
|
||
|
||
---
|
||
|
||
### 2. RF-ADM-001: Gestión de Usuarios y Roles (~28 KB) ✅
|
||
|
||
**Contenido principal:**
|
||
|
||
#### 7 Roles Especializados
|
||
| Rol | Código | Nivel | Permisos Globales |
|
||
|-----|--------|-------|-------------------|
|
||
| Director General | `director` | 🔴 Alto | CRUD+Approve en todos |
|
||
| Ingeniero | `engineer` | 🟠 Alto | CRUD en Proyectos, Presupuestos, Obra |
|
||
| Residente | `resident` | 🟡 Medio | CRUD en Obra, Compras, Avances |
|
||
| Compras | `purchases` | 🟡 Medio | CRUD+Approve en Compras, Inventarios |
|
||
| Finanzas | `finance` | 🟠 Alto | CRUD+Approve en Estimaciones, Finanzas |
|
||
| RRHH | `hr` | 🟡 Medio | CRUD+Approve en RRHH, Nómina |
|
||
| Postventa | `post_sales` | 🟢 Bajo | CRUD en Postventa, Garantías, CRM |
|
||
|
||
#### Multi-Tenancy
|
||
- Usuario puede pertenecer a **múltiples empresas constructoras**
|
||
- **Roles diferentes** en cada empresa
|
||
- Selector de empresa sin re-login
|
||
- Aislamiento total por `constructoraId` (RLS)
|
||
|
||
#### Estados de Cuenta
|
||
```
|
||
[*] → active: Invitación aceptada
|
||
active → suspended: Suspensión temporal
|
||
suspended → active: Reactivación
|
||
active → inactive: Baja
|
||
inactive → active: Reactivación
|
||
active → locked: 5 intentos fallidos
|
||
locked → active: Desbloqueo (admin o timeout)
|
||
```
|
||
|
||
#### Proceso de Invitación
|
||
1. Admin crea invitación (email, rol, empresa)
|
||
2. Sistema genera token único (válido 7 días)
|
||
3. Email enviado con link de registro
|
||
4. Usuario completa perfil y contraseña
|
||
5. Primer login automático
|
||
6. Estado: `active`
|
||
|
||
#### Row Level Security (RLS)
|
||
```sql
|
||
-- Política automática en PostgreSQL
|
||
CREATE POLICY users_isolation_policy ON user_constructoras
|
||
USING (constructora_id = current_setting('app.current_constructora_id')::uuid);
|
||
```
|
||
|
||
**Casos de Uso Documentados:**
|
||
- Invitar nuevo ingeniero
|
||
- Usuario multi-empresa (Director en A, Ingeniero en B)
|
||
- Suspensión temporal con reactivación automática
|
||
|
||
**Tests Especificados:**
|
||
- Invitación exitosa con validación de email enviado
|
||
- Multi-tenancy: aislamiento entre empresas
|
||
- Cambio de rol con auditoría
|
||
|
||
---
|
||
|
||
### 3. RF-ADM-002: Sistema de Permisos Granulares (~27 KB) ✅
|
||
|
||
**Contenido principal:**
|
||
|
||
#### RBAC + ABAC Combinados
|
||
- **RBAC:** Permisos basados en roles predefinidos
|
||
- **ABAC:** Permisos adicionales basados en atributos/contexto
|
||
|
||
#### Permisos por Acción (CRUD+A)
|
||
```typescript
|
||
enum PermissionAction {
|
||
CREATE = 'create',
|
||
READ = 'read',
|
||
UPDATE = 'update',
|
||
DELETE = 'delete',
|
||
APPROVE = 'approve'
|
||
}
|
||
```
|
||
|
||
#### Matriz Completa (7 Roles × 14 Módulos)
|
||
| Módulo | Director | Engineer | Resident | Purchases | Finance | HR | Post Sales |
|
||
|--------|----------|----------|----------|-----------|---------|----|----------- |
|
||
| projects | CRUD+A | CRUD | R | R | R | R | R |
|
||
| budgets | CRUD+A | CRUD | R | R | R | - | - |
|
||
| purchases | CRUD+A | R | CRUD | CRUD+A | R | - | - |
|
||
| construction | CRUD+A | CRUD | CRUD | R | R | - | R |
|
||
| estimations | CRUD+A | CRUD | R | - | CRUD+A | - | - |
|
||
| hr | CRUD+A | R | R | - | R | CRUD+A | - |
|
||
| admin | CRUD+A | - | - | - | R | R | - |
|
||
|
||
#### Reglas de Negocio (ABAC)
|
||
|
||
**Regla 1: Acceso por Proyecto Asignado**
|
||
- Usuario solo ve proyectos donde es miembro del equipo
|
||
- Excepción: Director ve todos los proyectos
|
||
|
||
**Regla 2: Aprobación por Monto**
|
||
| Monto | Aprobador Nivel 1 | Aprobador Nivel 2 |
|
||
|-------|-------------------|-------------------|
|
||
| < $20K | Compras/Finance | - |
|
||
| $20K - $100K | Finance | Director |
|
||
| > $100K | Finance + Director | Ambos requeridos |
|
||
|
||
**Regla 3: Edición Temporal**
|
||
| Entidad | Tiempo límite | Excepción |
|
||
|---------|---------------|-----------|
|
||
| Estimación autorizada | 0 días (bloqueado) | Director puede revertir |
|
||
| Orden de compra | 7 días | Director puede modificar |
|
||
| Avance de obra | 3 días | Ingeniero puede corregir |
|
||
|
||
**Regla 4: Segregación de Funciones**
|
||
- ❌ Creador de orden de compra NO puede aprobarla
|
||
- ❌ Quien captura avances NO puede aprobarlos
|
||
- ✅ Director puede (excepción)
|
||
|
||
#### Validación en 3 Capas
|
||
|
||
**Capa 1: Frontend (UX)**
|
||
```typescript
|
||
{hasPermission('projects', 'create') && (
|
||
<Button onClick={createProject}>Crear Proyecto</Button>
|
||
)}
|
||
```
|
||
|
||
**Capa 2: Backend (Guards)**
|
||
```typescript
|
||
@RequirePermissions('projects', 'create')
|
||
@RequireRole('director', 'engineer')
|
||
async create(@Body() dto: CreateProjectDto) { }
|
||
```
|
||
|
||
**Capa 3: Database (RLS)**
|
||
```sql
|
||
CREATE POLICY projects_update_policy ON projects
|
||
FOR UPDATE
|
||
USING (
|
||
constructora_id = current_setting('app.current_constructora_id')::uuid
|
||
AND (
|
||
current_setting('app.current_user_role') = 'director'
|
||
OR user_id IN (SELECT user_id FROM team WHERE project_id = projects.id)
|
||
)
|
||
);
|
||
```
|
||
|
||
#### Permisos Personalizados
|
||
```typescript
|
||
interface CustomPermission {
|
||
userId: string;
|
||
module: string; // 'budgets'
|
||
actions: PermissionAction[]; // ['read']
|
||
scope?: {
|
||
projectId?: string; // Solo para un proyecto
|
||
validUntil?: Date; // Permiso temporal
|
||
};
|
||
grantedBy: string;
|
||
}
|
||
```
|
||
|
||
**Caso de uso:** Auditor externo con acceso temporal (30 días) a presupuestos de un proyecto específico.
|
||
|
||
**Tests Especificados:**
|
||
- Matriz completa de permisos por rol
|
||
- RLS automático en database
|
||
- Permisos personalizados temporales con expiración
|
||
|
||
---
|
||
|
||
## 📋 Documentos Pendientes (16/19)
|
||
|
||
### Requerimientos Funcionales (3 pendientes)
|
||
|
||
#### RF-ADM-003: Centros de Costo (Estimado: ~22 KB)
|
||
**Contenido esperado:**
|
||
- Estructura jerárquica (Empresa → Obra → Etapa → Frente)
|
||
- 3 tipos: Directos, Indirectos, Servicios Compartidos
|
||
- Imputación automática (Compras, RRHH, Maquinaria)
|
||
- Reportes por centro de costo
|
||
- Distribución de gastos indirectos
|
||
|
||
#### RF-ADM-004: Auditoría y Trazabilidad (Estimado: ~28 KB)
|
||
**Contenido esperado:**
|
||
- 4 categorías de eventos: Autenticación, Gestión usuarios, Operaciones críticas, Administración
|
||
- Estructura completa de AuditLog (20+ campos)
|
||
- Retención: 90 días (operativos), 5 años (críticos)
|
||
- Queries de consulta con filtros
|
||
- Reportes de auditoría
|
||
|
||
#### RF-ADM-005: Backups Automáticos (Estimado: ~25 KB)
|
||
**Contenido esperado:**
|
||
- 4 tipos de backup: Full (diario), Incremental (6h), Archivos (1h), Snapshots (30min)
|
||
- Estrategia 3-2-1 (3 copias, 2 medios, 1 offsite)
|
||
- Proceso de restauración (3 escenarios)
|
||
- RTO < 4 horas, RPO < 1 hora
|
||
- Pruebas mensuales de restauración
|
||
|
||
---
|
||
|
||
### Especificaciones Técnicas (5 pendientes)
|
||
|
||
| ID | Título | Complejidad | Tamaño Estimado |
|
||
|----|--------|-------------|-----------------|
|
||
| ET-ADM-001 | Modelo de RBAC multi-tenancy | Alta | ~45 KB |
|
||
| ET-ADM-002 | Centros de costo jerárquicos | Media | ~35 KB |
|
||
| ET-ADM-003 | Audit logging y change tracking | Alta | ~40 KB |
|
||
| ET-ADM-004 | Backups y Disaster Recovery | Alta | ~38 KB |
|
||
| ET-ADM-005 | Seguridad de datos (encriptación) | Alta | ~35 KB |
|
||
|
||
**Total estimado:** ~193 KB
|
||
|
||
**Contenido esperado:**
|
||
- Entities TypeORM completas
|
||
- ENUMs y tipos
|
||
- Services con lógica de negocio
|
||
- Controllers RESTful
|
||
- Frontend components (React)
|
||
- Validaciones Zod
|
||
- Tests unitarios
|
||
- Cron jobs (backups, cleanup)
|
||
|
||
---
|
||
|
||
### Historias de Usuario (8 pendientes)
|
||
|
||
| ID | Título | SP | Tamaño Estimado |
|
||
|----|--------|----|-----------------|
|
||
| US-ADM-001 | Crear y gestionar usuarios | 5 | ~15 KB |
|
||
| US-ADM-002 | Asignar roles y permisos | 5 | ~15 KB |
|
||
| US-ADM-003 | Configurar centros de costo | 5 | ~12 KB |
|
||
| US-ADM-004 | Consultar bitácora de auditoría | 5 | ~13 KB |
|
||
| US-ADM-005 | Configurar backups automáticos | 3 | ~10 KB |
|
||
| US-ADM-006 | Restaurar desde backup | 5 | ~14 KB |
|
||
| US-ADM-007 | Dashboard de administración | 7 | ~16 KB |
|
||
| US-ADM-008 | Configurar políticas de seguridad | 5 | ~13 KB |
|
||
|
||
**Total:** 40 SP | ~108 KB estimado
|
||
|
||
---
|
||
|
||
## 🏗️ Arquitectura Técnica (Preliminar)
|
||
|
||
### Base de Datos (PostgreSQL)
|
||
|
||
```sql
|
||
-- Schemas principales
|
||
CREATE SCHEMA IF NOT EXISTS auth_management;
|
||
CREATE SCHEMA IF NOT EXISTS admin;
|
||
CREATE SCHEMA IF NOT EXISTS audit_logging;
|
||
|
||
-- Tablas clave (estimadas)
|
||
auth_management.users (12 columnas)
|
||
auth_management.user_constructoras (6 columnas)
|
||
auth_management.invitations (8 columnas)
|
||
admin.roles (5 columnas)
|
||
admin.role_permissions (5 columnas)
|
||
admin.custom_permissions (10 columnas)
|
||
admin.cost_centers (12 columnas)
|
||
admin.system_settings (8 columnas)
|
||
audit_logging.audit_logs (20+ columnas)
|
||
admin.backups (15 columnas)
|
||
|
||
-- Total estimado: 10-12 tablas principales
|
||
```
|
||
|
||
### Backend (NestJS)
|
||
|
||
```
|
||
apps/backend/src/modules/
|
||
├── auth-management/
|
||
│ ├── users.service.ts
|
||
│ ├── invitations.service.ts
|
||
│ └── users.controller.ts
|
||
├── admin/
|
||
│ ├── roles.service.ts
|
||
│ ├── permissions.service.ts
|
||
│ ├── cost-centers.service.ts
|
||
│ └── system-settings.service.ts
|
||
├── audit/
|
||
│ ├── audit-logs.service.ts
|
||
│ ├── audit.middleware.ts
|
||
│ └── audit-logs.controller.ts
|
||
└── backups/
|
||
├── backup.service.ts
|
||
├── backup.cron.ts
|
||
└── restore.service.ts
|
||
```
|
||
|
||
### Frontend (React)
|
||
|
||
```
|
||
apps/frontend/src/features/admin/
|
||
├── pages/
|
||
│ ├── UsersManagementPage.tsx
|
||
│ ├── RolesPermissionsPage.tsx
|
||
│ ├── CostCentersPage.tsx
|
||
│ ├── AuditLogsPage.tsx
|
||
│ ├── BackupsPage.tsx
|
||
│ └── SystemSettingsPage.tsx
|
||
├── components/
|
||
│ ├── UserForm.tsx
|
||
│ ├── PermissionMatrix.tsx
|
||
│ ├── CostCenterTree.tsx
|
||
│ ├── AuditLogViewer.tsx
|
||
│ ├── BackupManager.tsx
|
||
│ └── SystemDashboard.tsx
|
||
└── stores/
|
||
└── adminStore.ts
|
||
```
|
||
|
||
---
|
||
|
||
## 📈 Características Clave Implementadas (Documentadas)
|
||
|
||
### 1. Multi-Tenancy Seguro ✅
|
||
- Múltiples empresas en el mismo sistema
|
||
- Aislamiento total por `constructoraId`
|
||
- RLS en PostgreSQL (defensa en profundidad)
|
||
- Selector de empresa sin re-login
|
||
|
||
### 2. RBAC + ABAC Combinados ✅
|
||
- 7 roles especializados en construcción
|
||
- Matriz de permisos (7 × 14 módulos)
|
||
- Reglas de negocio contextuales
|
||
- Permisos personalizados temporales
|
||
|
||
### 3. Validación en 3 Capas ✅
|
||
- Frontend: UX (oculta botones)
|
||
- Backend: Guards (seguridad real)
|
||
- Database: RLS (defensa en profundidad)
|
||
|
||
### 4. Auditoría Completa 🚧 (Pendiente documentar)
|
||
- 4 categorías de eventos
|
||
- Registro automático de operaciones críticas
|
||
- Retención diferenciada (90 días / 5 años)
|
||
- Queries con filtros avanzados
|
||
|
||
### 5. Backups Automáticos 🚧 (Pendiente documentar)
|
||
- Estrategia 3-2-1
|
||
- 4 tipos de backup (Full, Incremental, Archivos, Snapshots)
|
||
- RTO < 4 horas, RPO < 1 hora
|
||
- Pruebas mensuales
|
||
|
||
---
|
||
|
||
## 🔗 Integraciones con Otros Módulos
|
||
|
||
| Módulo | Tipo | Funcionalidad |
|
||
|--------|------|---------------|
|
||
| **Todos los módulos** | Transversal | RBAC, RLS, Auditoría |
|
||
| MAI-001 (Fundamentos) | Core | Reutiliza auth, extiende roles |
|
||
| MAI-002 (Proyectos) | RLS | Filtrado por constructora y equipo |
|
||
| MAI-003 (Presupuestos) | Auditoría | Log de cambios en presupuestos |
|
||
| MAI-004 (Compras) | Centros Costo | Imputación automática |
|
||
| MAI-008 (Estimaciones) | Auditoría | Log de aprobaciones >$50K |
|
||
| MAE-014 (Finanzas) | Centros Costo | Reporting financiero |
|
||
|
||
---
|
||
|
||
## 📊 Métricas de Progreso
|
||
|
||
| Métrica | Planificado | Actual | % |
|
||
|---------|-------------|--------|---|
|
||
| **README** | 1 | 1 | 100% ✅ |
|
||
| **RFs** | 5 | 2 | 40% 🚧 |
|
||
| **ETs** | 5 | 0 | 0% ⏳ |
|
||
| **USs** | 8 | 0 | 0% ⏳ |
|
||
| **Story Points** | 40 SP | - | - |
|
||
| **Tamaño Documentación** | ~280 KB | ~85 KB | 30% |
|
||
| **Tiempo invertido** | - | ~1 hora | - |
|
||
|
||
---
|
||
|
||
## 🎯 Próximos Pasos Inmediatos
|
||
|
||
### Opción 1: Completar Requerimientos Funcionales ⭐ RECOMENDADO
|
||
**Razón:** Terminar la capa de RFs antes de pasar a ETs
|
||
|
||
**Pendientes:**
|
||
1. RF-ADM-003: Centros de Costo (~1 hora)
|
||
2. RF-ADM-004: Auditoría (~1.5 horas)
|
||
3. RF-ADM-005: Backups (~1 hora)
|
||
|
||
**Estimación:** 3.5 horas para completar RFs (100%)
|
||
|
||
### Opción 2: Comenzar Especificaciones Técnicas
|
||
**Razón:** Tener especificación técnica completa de lo documentado
|
||
|
||
**Prioridad:**
|
||
1. ET-ADM-001: RBAC multi-tenancy (45 KB, ~2 horas)
|
||
2. ET-ADM-003: Audit logging (40 KB, ~2 horas)
|
||
|
||
### Opción 3: Crear Historias de Usuario
|
||
**Razón:** Tener user stories listas para sprint planning
|
||
|
||
**Prioridad P0 (críticas):**
|
||
- US-ADM-001: Gestión de usuarios (5 SP)
|
||
- US-ADM-002: Roles y permisos (5 SP)
|
||
- US-ADM-004: Auditoría (5 SP)
|
||
- US-ADM-006: Restauración (5 SP)
|
||
|
||
---
|
||
|
||
## 📝 Lecciones Aprendidas
|
||
|
||
### Reutilización de GAMILIT
|
||
|
||
| Componente | Reutilización | Adaptación Necesaria |
|
||
|------------|---------------|----------------------|
|
||
| Auth base | 95% | Extender de 3 a 7 roles |
|
||
| Multi-tenancy | 90% | Adaptar de schools a constructoras |
|
||
| RLS policies | 85% | Adaptar contexto (school_id → constructora_id) |
|
||
| Audit logging | 70% | Agregar eventos específicos de construcción |
|
||
| RBAC guards | 90% | Agregar permisos APPROVE |
|
||
|
||
**Ahorro estimado:** 90% del trabajo base ya hecho en GAMILIT.
|
||
|
||
### Complejidad Manejada
|
||
|
||
✅ Multi-tenancy con múltiples roles por empresa
|
||
✅ Matriz de permisos 7 × 14
|
||
✅ Validación en 3 capas (Frontend, Backend, Database)
|
||
✅ Reglas de negocio complejas (ABAC)
|
||
✅ Permisos personalizados temporales
|
||
|
||
---
|
||
|
||
## 🚨 Riesgos Identificados
|
||
|
||
| Riesgo | Probabilidad | Impacto | Mitigación |
|
||
|--------|--------------|---------|------------|
|
||
| RLS mal configurado | Media | Crítico | Tests automáticos en CI/CD |
|
||
| Permisos demasiado complejos | Media | Alto | Documentación clara, UI intuitiva |
|
||
| Performance de audit logs | Media | Medio | Particionamiento de tabla, retención |
|
||
| Backups fallan silenciosamente | Baja | Crítico | Monitoreo activo, alertas |
|
||
|
||
---
|
||
|
||
**Generado:** 2025-11-20
|
||
**Versión:** 1.0
|
||
**Autor:** Sistema de Documentación Técnica
|
||
**Próxima revisión:** Al completar RFs pendientes
|
||
**Reutilización GAMILIT:** 90%
|