# RF-AUDIT-001: Audit Trail de Entidades ## Identificacion | Campo | Valor | |-------|-------| | **ID** | RF-AUDIT-001 | | **Modulo** | MGN-007 Audit | | **Titulo** | Audit Trail de Entidades | | **Prioridad** | P0 - Critica | | **Estado** | Draft | | **Fecha** | 2025-12-05 | --- ## Descripcion El sistema debe registrar automaticamente todos los cambios realizados en entidades criticas, incluyendo quien, cuando, que cambio y los valores anteriores/nuevos, permitiendo trazabilidad completa y restauracion de datos. --- ## Requisitos Funcionales ### RF-AUDIT-001.1: Estructura del Registro de Auditoria | Campo | Tipo | Descripcion | |-------|------|-------------| | id | UUID | Identificador unico | | tenant_id | UUID | Tenant donde ocurrio | | user_id | UUID | Usuario que realizo la accion | | action | ENUM | CREATE, UPDATE, DELETE, RESTORE | | entity_type | VARCHAR(100) | Tipo de entidad (tabla) | | entity_id | UUID | ID del registro afectado | | old_values | JSONB | Valores anteriores | | new_values | JSONB | Valores nuevos | | changed_fields | TEXT[] | Lista de campos modificados | | ip_address | INET | IP del cliente | | user_agent | TEXT | User agent del navegador | | request_id | UUID | ID de la peticion HTTP | | created_at | TIMESTAMPTZ | Timestamp del evento | ### RF-AUDIT-001.2: Acciones Auditables ```typescript enum AuditAction { CREATE = 'create', UPDATE = 'update', DELETE = 'delete', RESTORE = 'restore', // Restaurar soft-delete ARCHIVE = 'archive', // Archivar EXPORT = 'export', // Exportar datos IMPORT = 'import', // Importar datos BULK_UPDATE = 'bulk_update' } ``` ### RF-AUDIT-001.3: Entidades Auditables Por defecto, se auditan las siguientes entidades: | Modulo | Entidades | |--------|-----------| | Auth | sessions, password_changes | | Users | users, user_roles | | Roles | roles, permissions, role_permissions | | Tenants | tenants, subscriptions | | Catalogs | contacts, products, categories | | Financial | accounts, journal_entries | **Configuracion:** ```typescript @Auditable({ fields: ['name', 'email', 'status'], // Campos a auditar sensitiveFields: ['password'], // Campos a ocultar enabled: true }) export class User { ... } ``` ### RF-AUDIT-001.4: Campos Sensibles Ciertos campos se registran de forma especial: | Tipo | Tratamiento | |------|-------------| | Passwords | Solo registrar que cambio, no valores | | Tokens | Enmascarar (mostrar ultimos 4 chars) | | Datos personales | Encriptar en audit log | | Datos financieros | Registrar sin enmascarar | ### RF-AUDIT-001.5: Diferencias (Diff) Para UPDATEs, solo se almacenan los campos modificados: ```typescript // Ejemplo de registro { "action": "update", "entityType": "users", "entityId": "uuid-123", "oldValues": { "name": "John Doe", "email": "john@old.com" }, "newValues": { "name": "John Smith", "email": "john@new.com" }, "changedFields": ["name", "email"] } ``` ### RF-AUDIT-001.6: Restauracion de Datos El sistema permite restaurar un registro a un estado anterior: ```typescript POST /api/v1/audit/:auditId/restore // Restaura la entidad a los valores en old_values // Crea nuevo registro de audit con action=RESTORE ``` --- ## Operaciones ### Consultar Historial de Entidad ```typescript GET /api/v1/audit/entity/:type/:id Response: { "entityType": "users", "entityId": "uuid-123", "history": [ { "id": "audit-uuid-1", "action": "update", "changedFields": ["name"], "user": { "id": "...", "name": "Admin" }, "createdAt": "2025-12-05T10:00:00Z" }, { "id": "audit-uuid-2", "action": "create", "user": { "id": "...", "name": "System" }, "createdAt": "2025-12-01T10:00:00Z" } ] } ``` ### Consultar Detalle de Cambio ```typescript GET /api/v1/audit/:auditId Response: { "id": "audit-uuid-1", "action": "update", "entityType": "users", "entityId": "uuid-123", "oldValues": { "name": "John Doe" }, "newValues": { "name": "John Smith" }, "changedFields": ["name"], "user": { "id": "...", "name": "Admin" }, "ipAddress": "192.168.1.100", "createdAt": "2025-12-05T10:00:00Z" } ``` ### Buscar en Audit Log ```typescript GET /api/v1/audit?entityType=users&action=update&userId=uuid&from=2025-12-01&to=2025-12-05 Response: { "data": [...], "meta": { "total": 50, "page": 1, "limit": 20 } } ``` --- ## Reglas de Negocio | ID | Regla | Severidad | |----|-------|-----------| | BR-001 | Audit logs son inmutables (nunca se modifican) | Critical | | BR-002 | Retencion minima: 1 año | Compliance | | BR-003 | Solo admins pueden ver audit log | Security | | BR-004 | Restauracion requiere permiso especial | Security | | BR-005 | Operaciones bulk generan un registro por entidad | Info | --- ## Criterios de Aceptacion - [ ] Registro automatico de CRUD en entidades marcadas - [ ] Almacenamiento de valores old/new - [ ] Consulta de historial por entidad - [ ] Busqueda por usuario, fecha, tipo - [ ] Restauracion a estado anterior - [ ] Campos sensibles enmascarados - [ ] Performance < 10ms overhead por operacion --- ## Historial | Version | Fecha | Autor | Cambios | |---------|-------|-------|---------| | 1.0 | 2025-12-05 | Requirements-Analyst | Creacion inicial |