# Protección de datos y acceso obligatorio a formularios

En **Configuración → Ley de protección de datos**, el administrador de cuenta selecciona una empresa, escribe su aviso y puede cargar un PDF de hasta 10 MB. El texto no viene prellenado: debe configurar el aviso correspondiente a cada empresa. Al editar solo el texto se conserva el PDF anterior.

En cada inicio de sesión de clientes y proveedores habilitados para formularios:

1. Se muestra el aviso de su empresa en un modal, con descarga privada del documento completo. El botón Aceptar permanece deshabilitado hasta marcar el check. La aceptación también se valida en el servidor.
2. Cancelar destruye la sesión y regresa al login. El clic fuera del modal y Escape no lo cierran.
3. Después de aceptar se exige cambiar la contraseña. Debe ser distinta de la anterior y contener al menos 12 caracteres, mayúsculas, minúsculas, números y símbolos. Se actualizan juntos los accesos de la persona y el usuario.
4. Solo entonces se habilitan los formularios y sus documentos. Las URLs directas, descargas y solicitudes POST pasan por la misma protección.

Cada aceptación registra empresa, persona, fecha, versión, texto y referencia al PDF aceptado. Una modificación del aviso invalida la aceptación de la versión anterior. Los PDF anteriores se conservan de forma privada para mantener la referencia histórica.

Si todavía no se configura el aviso de una empresa, el acceso a sus formularios queda pendiente de configuración y solo se permite cancelar. Esta actualización no envía correos ni modifica contraseñas de clientes existentes automáticamente.

## Actualización del servidor

Subir:

- database/migrations/2026_09_15_000001_company_data_policies.php
- app/Models/System/CompanyDataPolicy.php
- app/Filament/Pages/DataProtection.php
- app/Http/Middleware/RequireClientFormConsent.php
- app/Http/Controllers/Cliente/ClientePortalController.php
- bootstrap/app.php
- routes/web.php
- resources/views/filament/pages/data-protection.blade.php
- resources/views/filament/navigation/geolocalizacion-flyout.blade.php
- resources/views/cliente/layout.blade.php
- resources/views/cliente/required-modal.blade.php
- resources/views/cliente/politica-datos.blade.php
- resources/views/cliente/cambiar-password.blade.php

Ejecutar:

```sh
php artisan migrate --path=database/migrations/2026_09_15_000001_company_data_policies.php --force
php artisan optimize:clear
```

Configurar el texto y documento de cada empresa antes de invitar a clientes. La migración está aplicada localmente; el servidor requiere esta actualización.
