Auditoría
Toda operación relevante escribe en AuditLog dentro de la misma
transacción del cambio: si el cambio se revierte, la auditoría también — no
puede existir un cambio sin rastro ni un rastro de algo que no ocurrió.
Qué se audita
| Tipo | Acciones |
|---|---|
Notas (GradeEntry) |
create, update, rectify (con valor anterior y nuevo) |
| Asistencia | update, justify |
| Matrícula | create, status-change (retiros/traslados con motivo), promotion |
Pagos (Obligation) |
payment (monto, estado anterior/nuevo) |
| Año/período/parcial | transition, close |
| Configuración | upsert (con diff, token de Moodle ya enmascarado) |
| Actas de fin de año | recovery-supletorio / recovery-remedial |
| Accesos LOPDP | read sobre fichas de alumnos y observaciones |
Cada registro guarda: quién (cuenta), cuándo, entidad afectada (uuid),
antes/después en JSON y el correlationId del request que lo originó.
Evidencia real de la simulación
Consulta directa a la base tras el recorrido de este manual:
hora | entityType | action | antes | despues
----------+--------------+---------+------------------------------------------+--------------------------------------
01:17:23 | Observation | read | — | —
01:17:23 | Student | read | — | —
01:17:07 | AcademicYear | create | — | {"name": "2028-2029"}
01:17:05 | Obligation | payment | {"status": "PENDIENTE", "paidAmount": 0} | {"status": "PARCIAL", "paymentId": …}
01:17:05 | GradeEntry | rectify | {"score": 9.5} | {"score": 9.75, "rectificationId": …}
01:17:04 | Partial | close | — | —
La historia completa del recorrido es legible ahí: el cierre del parcial, la rectificación 9.5 → 9.75, el abono de la pensión, y los accesos de lectura a la ficha y observaciones de la alumna.
El visor para administración
Configuración → Auditoría: paginado, filtrable por entidad y acción, con los actores resueltos a nombre legible.

Filtrado a Rectificación — la respuesta a "¿quién cambió esta nota?":

Propiedades
- Solo-escritura: no existe endpoint de edición ni borrado de auditoría;
solo lectura para
ADMIN. - Transaccional:
AuditService.record(tx, …)exige la transacción del cambio — está en el contrato del servicio, no es opcional. - Trazable: el
correlationIdconecta cada registro con los logs del request que lo produjo (ver Logs). - Respaldada: viaja en el backup diario y en los snapshots de cierre de período que se conservan permanentemente.