Compliance LegalTech & Cuarentena
El módulo LegalTech de Mañuti gestiona el consentimiento informado de documentos legales (Términos de Servicio, Políticas de Privacidad, Acuerdos de Confidencialidad), garantizando la inmutabilidad de las versiones y la obligatoriedad del consentimiento por perfil funcional.
1. Modelo Relacional de Versionado Inmutable
El sistema desacopla la entidad conceptual del documento de sus versiones redactadas en Markdown:
flowchart TD
DOC["[documentos]"]
VER["[documento_versiones]"]
ROL["[documento_rol]<br/>(Audiencia/Roles)"]
ACEPT["[documento_aceptaciones]<br/>(Firma Digital: usuario_id, IP, UA)"]
VER -->|"N : 1"| DOC
DOC -->|"N : M"| ROL
ACEPT -->|"N : 1"| VER
Entidades Core
documentos: Contenedor maestro (nombre,slug,cat_tipo_documento,obligatorio).documento_versiones: Cuerpo inmutable en formato Markdown (version,contenido,cat_status,fecha_publicacion).documento_rol: Mapea la audiencia requerida. Un acuerdo de confidencialidad puede asociarse solo al rolSuper Admin, mientras los términos generales aplican al rolOperador.documento_aceptaciones: Almacena el consentimiento vinculando al usuario con la versión exacta aceptada (documento_version_id), preservando fecha UTC, dirección IP y User Agent.
2. Máquina de Estados del Ciclo de Vida Documental
flowchart TD
CREAR["[Crear Documento]"]
BORRADOR["Genera Versión 1.0 en Borrador (DOC_BORRADOR)"]
EDICION["[Edición con EasyMDE Markdown]"]
PUBLICAR["[Publicar esta Versión]"]
PUB_ACTION["Marca v1.0 como DOC_PUBLICADO<br/>Dispara Cuarentena a Usuarios"]
OBS_ACTION["Marca versión previa como DOC_OBSOLETO<br/>Preserva firmas históricas intactas"]
CREAR --> BORRADOR
BORRADOR --> EDICION
EDICION --> PUBLICAR
PUBLICAR --> PUB_ACTION
PUBLICAR --> OBS_ACTION
Forking de Versiones
Para modificar un documento vigente, el sistema prohíbe la sobreescritura directa. Requiere ejecutar una duplicación controlada (nueva-version), generando un borrador derivado (e.g., v1.1) que hereda el contenido previo para su modificación sin alterar la versión que los usuarios continúan viendo en producción.
3. Middleware de Cuarentena Legal (CheckPendingDocuments)
El middleware con alias 'legal.check' intercepta la navegación del usuario tras autenticarse:
// app/Http/Middleware/CheckPendingDocuments.php
public function handle(Request $request, Closure $next)
{
$user = Auth::user();
if (!$user) return $next($request);
// Excepciones: Rutas requeridas para procesar el consentimiento o salir
if ($request->routeIs('legal.show_pending') ||
$request->routeIs('legal.accept') ||
$request->routeIs('logout')) {
return $next($request);
}
if ($this->hasPendingLegalDocuments($user)) {
return redirect()->route('legal.show_pending');
}
return $next($request);
}
Algoritmo de Detección de Pendientes
- Obtiene los roles activos asignados al usuario actual.
- Consulta si existen documentos obligatorios con versiones en estatus
DOC_PUBLICADOdirigidos a dichos roles. - Comprueba si existe un registro de aceptación en
documento_aceptacionespara la tupla: $$\text{Existe Firma}(U_{\text{id}}, V_{\text{publicada_id}})$$ - Si la firma no existe, el usuario es recluido en la pantalla de consentimiento
/legal/pendiente.
4. Re-Consentimiento Automático ante Nuevas Versiones
Si la organización publica la versión v1.1 de un aviso de privacidad:
- Los usuarios que habían firmado la versión
v1.0pierden inmediatamente el acceso a las funciones operativas en su siguiente interacción HTTP. - El sistema no hereda firmas entre versiones. La pantalla de cuarentena despliega el nuevo texto procesado mediante Parsedown y exige una nueva manifestación de voluntad para reactivar la cuenta.