# Permisos con vencimiento

En **Maestro de clientes → Agregar o editar campos**, el administrador de cuenta puede crear el tipo **Permiso con vencimiento**. El campo tiene una clave estable; cambiar su nombre no afecta los datos ni los avisos.

## Configuración

- Nombre, categoría, visibilidad al cliente y estado activo, como las demás columnas.
- Días predeterminados de anticipación: 30, 15 y 7. Se admiten hasta 12 números distintos entre 1 y 3650 días calendario.
- Canales: Sistema, Correo o ambos. Los avisos internos aparecen en Mis notificaciones.
- Permitir ajustar los días por empresa, o mantener los predeterminados de la cuenta.
- Recordatorio semanal opcional después del vencimiento.
- Vinculación opcional de un campo Sí/No y otro de fecha existentes. Deben tener la misma visibilidad que el permiso. Los campos se reúnen visualmente en el bloque sin borrar sus valores. El vínculo no se cambia después de crear el bloque; si se necesita otra relación, se crea otro permiso.

Para **Patente**, por ejemplo, cree «Patente» de tipo permiso y vincule «Aplica Patente» y «Vencimiento Patente». Puede vincular solo una fecha, como la firma electrónica: una fecha anterior implica Sí, y una fecha vacía queda sin definir. No se agrupan automáticamente campos personalizados basándose en sus nombres.

Los valores antiguos se consultan al abrir el bloque. Al guardar una renovación se actualizan también los campos vinculados y la auditoría conserva los cambios anteriores. Desactivar el bloque conserva sus valores y vuelve a mostrar los campos originales con el último valor aprobado.

## Ficha y formulario del cliente

Con **Sí**, fecha y al menos un aviso son obligatorios, tanto en pantalla como en el servidor. Se aceptan fechas pasadas, sábados, domingos y feriados: no se cambia la fecha del permiso. Con **No**, no se exige fecha, se detienen futuros avisos y se conserva el historial en Auditoría.

La ficha interna presenta únicamente tres columnas: **¿Aplica?**, **Fecha de vencimiento** y **Avisar antes (días)**, sin un recuadro adicional por permiso. Fecha y avisos se habilitan al seleccionar Sí. Siempre se incluyen los administradores autorizados de esa empresa. Los destinatarios adicionales que ya estaban guardados se conservan; no se muestran en esta vista simplificada. El formulario externo no muestra ni permite cambiar destinatarios internos.

En la ficha interna, **Avisar antes (días)** es un campo numérico con un único valor entero entre 1 y 3650. Si existían varios plazos, se muestra el mayor; al guardar un permiso aplicable con días ajustables, se conserva únicamente el valor ingresado. Los permisos con días fijados por la cuenta siguen respetando esa configuración.

Los botones **Subir** y **Bajar** de cada encabezado permiten reorganizar las secciones de la ficha sin perder los datos pendientes de guardar. El orden se conserva automáticamente para cada usuario y cuenta cliente, y se aplica al volver a abrir la ficha. Las secciones nuevas se agregan al final.

Los cambios de operarios sujetos a aprobación no alteran los recordatorios hasta que se aprueban. El maestro muestra el estado vigente, próximo a vencer, vence hoy, vencido o fecha pendiente, con un resumen de las empresas de la página y acceso para actualizar la ficha.

La carga Excel usa una celda por permiso: `SI | 2026-12-31 | 30,15,7` o `NO`. Descargue la plantilla actual después de agrupar campos antiguos. No se exportan credenciales ni valores privados a la plantilla.

## Ejecución y entrega

- `php artisan maestro:recordar-permisos --dry-run`: cuenta avisos previstos, sin guardar ni enviar.
- El programador Laravel revisa cada hora; la cola `work-tasks` procesa los correos. El ejecutor Windows de tareas también incluye este comando.
- Es necesario mantener operativo el programador del servidor y configurar el correo. No basta con abrir una pantalla.
- Se avisa al entrar en cada plazo, al vencer y al detectar un vencido. Si el programador estuvo detenido, se genera el aviso correspondiente al plazo actual, sin enviar todos los atrasados juntos. La repetición semanal usa bloques de siete días desde el vencimiento.
- La clave única incluye empresa, permiso, fecha, plazo, destinatario y canal. Ejecutar el comando otra vez no duplica el mismo aviso. Una renovación crea un nuevo ciclo.
- Antes del envío se comprueban empresa activa, licencia, campo activo, fecha, plazo y acceso actual del destinatario. Se cancelan correos que hayan quedado desactualizados. Los avisos ya entregados permanecen como historial.
- Si no se puede confirmar una entrega, queda **REVISAR**. El administrador puede reintentar desde el maestro, pasados cinco minutos, confirmando que el correo no llegó. No hay reintentos automáticos de entregas inciertas.

Los registros de avisos están en `company_permit_notices`. Esta implementación no consulta fechas en entidades de control ni interpreta prórrogas legales.
