# 12 — Auditoría *(Entregable L)*

> La auditoría responde a una sola pregunta, en cualquier momento y sobre cualquier dato:
> **¿quién cambió esto, cuándo, desde dónde, qué había antes y qué hay ahora?**
>
> En un sistema académico esta capacidad no es un lujo administrativo: es la evidencia con la que el colegio
> responde a un reclamo formal de un acudiente sobre una nota.

---

## Por qué la auditoría es un control de seguridad, no solo un registro

El sistema concede, por requisito, poderes amplios: el Coordinador puede modificar **cualquier** nota (§31), y
puede reabrir periodos cerrados (§46). Esos permisos son necesarios para operar.

Lo que impide que se usen arbitrariamente **no son los permisos** —ya están concedidos— sino el hecho de que cada
uso quede registrado de forma imborrable. La auditoría es, literalmente, el único control que queda sobre el uso
legítimo de privilegios legítimos.

De ahí tres decisiones de diseño:

1. **No es desactivable** desde ninguna pantalla del sistema.
2. **Se escribe dentro de la misma transacción** que la operación auditada: si el registro de auditoría falla, la
   operación se revierte. No existe la posibilidad de una modificación sin rastro.
3. **Es inmutable**: no hay pantalla de edición ni de borrado de registros de auditoría, para ningún rol.

---

## Qué se registra *(§49)*

| Campo | Contenido | Ejemplo |
|---|---|---|
| **Usuario** | Identificador y nombre en el momento del hecho | `1035478921 · CARLOS PÉREZ` |
| **Rol** | El rol con el que actuaba | `COORDINADOR` |
| **Fecha y hora** | Con precisión de segundos, zona `America/Bogota` | `22/08/2026 14:32:07` |
| **IP** | Dirección de origen | `190.85.x.x` |
| **Agente** | Navegador y sistema | `Chrome 128 / Windows` |
| **Módulo** | Área funcional | `NOTAS` |
| **Acción** | Operación realizada | `MODIFICAR` |
| **Entidad y registro** | Qué se afectó | `nota` · `id 48211` |
| **Descripción** | Texto legible para humanos | *"Modificación de nota de JUAN GÓMEZ en Matemáticas, Periodo 2"* |
| **Valor anterior** | Solo los campos que cambiaron | `nota_definitiva: 3.5` |
| **Valor nuevo** | Ídem | `nota_definitiva: 4.2` |
| **Resultado** | Desenlace | `EXITO` / `FALLIDO` / `RECHAZADO_POR_PERMISOS` |
| **Contexto** | Año y periodo | `2026 · Periodo 2` |

**El campo "descripción" merece una nota.** Un registro que dice `entidad=nota id=48211 campo=nota_definitiva
3.5→4.2` es correcto pero inútil para un coordinador que atiende un reclamo. Por eso cada registro guarda también
una descripción en lenguaje natural, construida en el momento del hecho, con los nombres reales del estudiante y
la asignatura. Si el estudiante cambia de nombre después, el registro conserva el nombre que tenía entonces.

---

## Operaciones auditadas

### Prioridad crítica — siempre, sin excepción *(§49)*

| Módulo | Acciones |
|---|---|
| **Notas** | Crear · Modificar · Eliminar |
| **Recuperaciones** | Registrar · Modificar |
| **Matrículas** | Crear · Modificar · Cambiar estado · Anular |
| **Traslados** | Ejecutar |
| **Promoción** | Cada decisión individual + resumen del lote |
| **Periodos** | Cerrar · **Reabrir** (con motivo obligatorio) |
| **Años** | Crear · Activar · **Cerrar** · Reabrir |
| **Usuarios** | Crear · Modificar · Cambiar rol · Activar / desactivar |
| **Contraseñas** | Restablecer · Cambiar · Bloquear / desbloquear cuenta |
| **Configuración** | Escala de desempeño · Parámetros académicos · Datos institucionales |

### Prioridad alta

| Módulo | Acciones |
|---|---|
| **Estudiantes** | Crear · Modificar · Activar / desactivar |
| **Docentes** | Crear · Modificar · Activar / desactivar |
| **Acudientes** | Crear · Modificar · Asociar / desasociar de un estudiante |
| **Cursos** | Crear · Modificar · Cambiar director · Activar / desactivar |
| **Asignación docente** | Asignar · Retirar |
| **Áreas y asignaturas** | Crear · Modificar · Activar / desactivar |
| **Desempeños** | Crear · Modificar · Desactivar |
| **Observaciones** | Crear · Modificar |
| **Copia de estructura** | Ejecutar (con el resumen de lo copiado) |

### Prioridad media

| Módulo | Acciones |
|---|---|
| **Tareas** | Crear · Modificar · Desactivar |
| **Comunicados** | Publicar · Modificar · Desactivar |
| **Boletines** | Generación masiva (curso, periodo, cantidad) |
| **Reportes** | Exportación de reportes con datos personales |
| **Archivos** | Subir · Descargar adjuntos sensibles |

### Eventos de seguridad

| Evento | Registro |
|---|---|
| Ingreso exitoso | Bitácora de sesión |
| Intento fallido | Bitácora de sesión + auditoría al alcanzar el umbral |
| Cuenta bloqueada | Auditoría |
| **Acceso rechazado por permisos** | **Auditoría** — es la señal temprana de un intento de abuso interno |
| Sesión expirada | Bitácora de sesión |

> El registro de los **accesos rechazados** es lo que permite detectar al docente que está probando URLs de
> asignaturas ajenas, o al acudiente que cambia el identificador de estudiante. Sin ese registro, esos intentos son
> invisibles.

### Lo que NUNCA se registra

- Contraseñas, ni en texto plano ni como resumen
- Testigos de sesión
- El contenido íntegro de campos médicos (se registra que se modificaron, no el valor)
- Consultas de lectura rutinarias — saturarían la auditoría y la volverían inservible

---

## Ejemplos de registros

**Modificación de nota** *(el caso del ejemplo de §49)*

```
┌────────────────────────────────────────────────────────────────────────┐
│  22/08/2026 14:32:07                                    ● Nota crítica │
│  Usuario:     CARLOS PÉREZ (1035478921) · COORDINADOR                  │
│  Origen:      190.85.x.x · Chrome 128 / Windows                        │
│  Módulo:      NOTAS          Acción: MODIFICAR        Resultado: ÉXITO │
│  Contexto:    2026 · Periodo 2                                         │
│                                                                        │
│  Modificación de nota                                                  │
│  Estudiante:  JUAN GÓMEZ RUIZ (TI 1098765432) · 6°A                   │
│  Asignatura:  Matemáticas                                              │
│                                                                        │
│      Nota definitiva:   3.5  ──►  4.2                                  │
└────────────────────────────────────────────────────────────────────────┘
```

**Reapertura de periodo**

```
┌────────────────────────────────────────────────────────────────────────┐
│  20/06/2026 09:15:44                                    ● Nota crítica │
│  Usuario:     ANA RUIZ (52147896) · COORDINADOR                        │
│  Módulo:      PERIODOS       Acción: REABRIR          Resultado: ÉXITO │
│                                                                        │
│  Reapertura del Periodo 2 de 2026                                      │
│  Motivo:      "Corrección de notas de Sociales 7°B por error de        │
│                digitación reportado por el docente titular."           │
│      Estado:  CERRADO  ──►  ABIERTO                                    │
│      Reaperturas de este periodo: 1                                    │
└────────────────────────────────────────────────────────────────────────┘
```

**Acceso rechazado**

```
┌────────────────────────────────────────────────────────────────────────┐
│  15/05/2026 11:03:21                              ⚠ Alerta de seguridad│
│  Usuario:     PEDRO SILVA (79456123) · DOCENTE                         │
│  Origen:      181.51.x.x                                               │
│  Módulo:      NOTAS   Acción: EDITAR   Resultado: RECHAZADO_POR_PERMISOS│
│                                                                        │
│  Intento de acceso fuera de ámbito                                     │
│  Recurso:     Física · 9°A · Periodo 2                                 │
│  Motivo:      El usuario no es docente titular de esta asignatura      │
└────────────────────────────────────────────────────────────────────────┘
```

**Promoción — resumen de lote**

```
┌────────────────────────────────────────────────────────────────────────┐
│  30/11/2026 16:20:11                                                   │
│  Usuario:     ANA RUIZ (52147896) · COORDINADOR                        │
│  Módulo:      PROMOCION      Acción: EJECUTAR_LOTE    Resultado: ÉXITO │
│                                                                        │
│  Promoción de 5°A (2026) hacia 2027                                    │
│      Promovidos:      28  →  6°A                                       │
│      No promovidos:    3  →  5°A 2027                                  │
│      Retirados:        1                                               │
│      Total procesado: 32 de 32                                         │
│                          (32 registros individuales asociados)         │
└────────────────────────────────────────────────────────────────────────┘
```

---

## Consulta de la auditoría

```
┌───────────────────────────────────────────────────────────────────────────┐
│  AUDITORÍA                                                                │
├───────────────────────────────────────────────────────────────────────────┤
│  Desde [01/08/2026] Hasta [22/08/2026]                                    │
│  Usuario [Todos ▼] Rol [Todos ▼] Módulo [Notas ▼] Acción [Todas ▼]       │
│  Estudiante [Buscar…]  Resultado [Todos ▼]  ☐ Solo críticas               │
│                                    [Limpiar]  [Buscar]  [⬇ Exportar]      │
├───────────────────────────────────────────────────────────────────────────┤
│  248 registros                                                            │
├──────────────┬──────────────┬─────────┬───────────┬───────────────────────┤
│ Fecha        │ Usuario      │ Módulo  │ Acción    │ Descripción           │
├──────────────┼──────────────┼─────────┼───────────┼───────────────────────┤
│ 22/08 14:32  │ C. PÉREZ     │ NOTAS   │ MODIFICAR │ Nota de J. GÓMEZ…  👁 │
│ 22/08 14:28  │ M. GONZÁLEZ  │ NOTAS   │ CREAR     │ 32 notas · Mat. 6°A👁 │
│ 20/06 09:15  │ A. RUIZ      │ PERIODOS│ REABRIR   │ Periodo 2 · 2026  ⚠👁 │
└──────────────┴──────────────┴─────────┴───────────┴───────────────────────┘
```

**Filtros disponibles:** rango de fechas · usuario · rol · módulo · acción · resultado · año y periodo ·
**estudiante afectado** · solo operaciones críticas.

> El filtro **por estudiante** es el más usado en la práctica: cuando un acudiente reclama por la nota de su hijo,
> el coordinador necesita el historial completo de esa nota en 10 segundos, no recorrer 5 000 registros.

### Vistas complementarias

| Vista | Contenido |
|---|---|
| **Historial de un registro** | Desde la nota, la matrícula o el estudiante, un botón "Ver historial" muestra su línea de tiempo completa |
| **Actividad de un usuario** | Todo lo que hizo un usuario en un rango de fechas. Útil ante una sospecha concreta |
| **Panel de operaciones críticas** | Solo reaperturas, cierres, modificaciones de nota por Coordinador y restablecimientos de contraseña |
| **Alertas de seguridad** | Accesos rechazados y bloqueos, agrupados por usuario e IP |

---

## Retención y volumen

| Aspecto | Decisión |
|---|---|
| **Retención** | **Permanente** para operaciones académicas. Es información con valor probatorio |
| **Bitácora de sesión** | 1 año, luego se archiva |
| **Volumen estimado** | ~100 000 registros por año en un colegio de 800 estudiantes |
| **Rendimiento** | Índices por (institución, fecha), (usuario, fecha), (entidad, id) y (módulo, acción). Sin ellos, la consulta de auditoría se degrada notablemente al segundo año |
| **Archivado** [RT] | A partir del quinto año, los registros de años cerrados pueden moverse a una tabla histórica, manteniéndolos consultables sin penalizar la operación diaria |
| **Exportación** | CSV o PDF, respetando filtros. La exportación de auditoría **también se audita** |

---

## Cómo se implementa

| Decisión | Detalle |
|---|---|
| **Dónde se invoca** | En la **capa de servicios**, no en los controladores. Así toda ruta que llegue a la operación queda auditada, incluidas las peticiones asíncronas y los procesos por lotes |
| **Transaccionalidad** | Dentro de la misma transacción que la operación. Si falla la auditoría, se revierte todo |
| **Comparación de valores** | Automática: el servicio compara el estado anterior y el nuevo de la entidad, y registra **solo los campos que cambiaron**. Registrar la entidad completa infla la auditoría y hace imposible leerla |
| **Operaciones masivas** | Un registro de resumen del lote + los registros individuales, enlazados. Permite leer "se promovieron 32 estudiantes" sin perder el detalle de cada uno |
| **Datos desnormalizados** | Se guarda el nombre del usuario y una descripción legible, no solo identificadores. Un registro de 2026 debe seguir siendo comprensible en 2031, aunque el usuario ya no exista |
| **Inmutabilidad** | Sin pantallas de edición ni borrado. A nivel de base de datos, el usuario de la aplicación solo tiene permiso de inserción y lectura sobre esta tabla |

---

## Criterios de aceptación

- [ ] Modificar una nota genera un registro con valor anterior y nuevo
- [ ] La descripción del registro es comprensible sin consultar otras tablas
- [ ] Reabrir un periodo sin motivo es imposible
- [ ] Un intento de acceso fuera de ámbito queda registrado
- [ ] Una promoción de 32 estudiantes genera 1 resumen + 32 registros enlazados
- [ ] Ningún registro contiene contraseñas ni testigos de sesión
- [ ] La auditoría no se puede editar ni borrar desde ninguna pantalla, con ningún rol
- [ ] Filtrar por estudiante devuelve su historial completo en menos de 3 segundos
- [ ] Si la escritura de auditoría falla, la operación de negocio se revierte
- [ ] Un registro de un usuario ya desactivado sigue mostrando su nombre correctamente
