> ## Documentation Index
> Fetch the complete documentation index at: https://alan-ramirez-dev.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 📜 Bitácora y Privacidad

> Registro transaccional inmutable y anonimización de datos sensibles.

El módulo de auditoría actúa como el observador principal del sistema. Su objetivo es mantener un registro inalterable de acciones críticas (inicios de sesión, altas, y bajas lógicas) cumpliendo con políticas estrictas de privacidad en la manipulación de datos sensibles (modo demo).

## 📡 Arquitectura Orientada a Eventos

Para evitar acoplar la lógica de auditoría en los controladores, la aplicación aprovecha el sistema de **Eventos y Listeners** de Laravel.

Por ejemplo, durante el flujo de autenticación, el `AuthController` únicamente emite el token. Es el `AuditLoginListener` quien intercepta el evento de forma pasiva, recopila el `User-Agent`, captura el contexto de la petición y lo inserta en el payload JSON de la bitácora.

## 🕵️‍♂️ Privacidad desde el Diseño (Privacy by Design)

Para cumplir con regulaciones modernas de protección de datos de los usuarios que lo utilicen (donde una IP se considera información personal), el sistema no almacena direcciones exactas. Esta responsabilidad se extrajo a un **Trait** reutilizable (`AuditableIp`).

```php theme={null}
// Fragmento del Trait AuditableIp.php
protected function anonymizeIp(?string $ip): string
{
    if (!$ip) return '0.0.0.0';

    // Enmascaramiento para IPv4 (Oculta los dos últimos octetos)
    if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
        $segmentos = explode('.', $ip);
        if (count($segmentos) === 4) {
            $segmentos[2] = str_repeat('*', strlen($segmentos[2]));
            $segmentos[3] = str_repeat('*', strlen($segmentos[3]));
            return implode('.', $segmentos);
        }
    }
    
    // (Incluye lógica análoga para segmentación y enmascaramiento de IPv6)
    return $ip;
}
```

## 🔄 Rotación Automática y Mantenimiento (Model Events)

Para asegurar que la base de datos no se sature de registros históricos innecesarios y optimizar el rendimiento de las consultas, el sistema cuenta con un mecanismo de "rotación de logs" integrado directamente en el ciclo de vida del modelo de Eloquent.

A través del método `booted()`, el modelo `AuditLog` intercepta el evento de creación. Cada vez que se inserta un nuevo registro, el sistema verifica dinámicamente si se ha superado el umbral máximo permitido (50 eventos) y, de ser así, purga automáticamente los registros más antiguos.

```php theme={null}
// Fragmento de AuditLog.php (Eventos del Modelo)
protected static function booted()
{
    static::created(function ($log) {
        $maxRecords = 50;
        $currentCount = DB::table('audit_logs')->count();
        
        if ($currentCount > $maxRecords) {
            $exceso = $currentCount - $maxRecords;
            
            $idsToDelete = DB::table('audit_logs')
                ->whereNotIn('id', [1, 2, 3, 4, 5]) // Protección de eventos demo inmutables
                ->orderBy('id', 'asc')
                ->limit($exceso)
                ->pluck('id');
                
            DB::table('audit_logs')->whereIn('id', $idsToDelete)->delete();
        }
    });
}
```
