# Formularios anuales de clientes y proveedores

Los formularios de cliente natural, cliente jurídico y proveedor natural guardan ahora un registro independiente por persona y año (`form_year`). Se usa el año vigente en la zona horaria configurada para la aplicación (America/Guayaquil por defecto).

- Al finalizar 2026 se conservan sus datos, PDF original, PDF firmado y fecha de finalización. No se puede volver a modificar ese formulario ni generar/enviar nuevas credenciales durante 2026.
- En 2027 se habilita automáticamente el envío de credenciales. El correo indica el año correspondiente. No se envían correos automáticamente: el administrador sigue decidiendo cuándo entregar el acceso.
- El formulario de 2027 precarga la información del registro anterior de ese tipo. Guardarlo crea un registro nuevo, sin sobrescribir 2026.
- Los consentimientos y la firma se renuevan cada año. Los adjuntos de respaldo se conservan en su registro original; cuando sean obligatorios para el nuevo año, deberán cargarse nuevamente.
- El historial permite consultar los períodos anteriores y descargar sus PDF de manera privada. Los años anteriores son de consulta, incluidos los períodos que quedaron pendientes.
- El bloqueo de credenciales está tanto en la interfaz (contraseña temporal deshabilitada) como en el servicio que las genera. La finalización es el estado `ENVIADO`; guardar solamente un borrador o quedar pendiente de firma no bloquea el acceso anual.
- No requiere cron para cambiar de año. Una ventana abierta durante el cambio de año debe recargarse antes de guardar.

## Datos existentes

La migración asigna el año de creación a los registros existentes, usando la fecha de envío como alternativa si falta aquella. Conserva los datos y archivos actuales. No reconstruye versiones históricas que se hubieran sobrescrito antes de introducir este historial.

La migración impide revertirse si ya existen varios años para una misma persona, para evitar la pérdida de historial.

## Subida a cPanel

Aplicar después del cambio de [firma y finalización](firma-formularios-clientes-proveedores.md). Subir estos archivos actualizados:

- `database/migrations/2026_09_13_000008_add_annual_form_history.php`
- `app/Services/Clientes/AnnualClientForms.php`
- `app/Services/Clientes/ClientePortalService.php`
- `app/Services/Clientes/FormSigningPdf.php`
- `app/Models/Clientes/HasAnnualForm.php`
- `app/Models/Clientes/NaturalClientForm.php`
- `app/Models/Clientes/LegalClientForm.php`
- `app/Models/Proveedor/PN/ProveedorNaturalFormulario.php`
- `app/Models/Personas/Persona.php`
- `app/Http/Controllers/Cliente/NaturalClientFormController.php`
- `app/Http/Controllers/Cliente/LegalClientFormController.php`
- `app/Http/Controllers/Cliente/FormSigningController.php`
- `app/Http/Controllers/Proveedor/PN/FormularioProveedorNaturalController.php`
- `app/Filament/Resources/Personas/Schemas/PersonaForm.php`
- `app/Mail/ClienteFormularioBienvenida.php`
- `resources/views/emails/clientes/formulario-bienvenida.blade.php`
- `resources/views/cliente/historial-anual.blade.php`
- `resources/views/cliente/firma.blade.php`
- `resources/views/cliente/natural/form.blade.php`
- `resources/views/cliente/juridica/form.blade.php`
- `resources/views/proveedor/pn/formulario.blade.php`

En la raíz del proyecto, con el PHP de la aplicación:

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

## Validación local

13 pruebas y 353 aserciones correctas: cambios de año 2026–2028, bloqueo de credenciales sin alterar contraseñas ni enviar correo, habilitación al año siguiente con correo simulado, precarga y registros separados, inmutabilidad de datos y PDF anteriores, descargas privadas, finalización y migración de registros existentes.
