# Motor de notificaciones

## Procesos requeridos en el servidor

Después de desplegar y ejecutar las migraciones aprobadas, el servidor debe mantener:

```bash
php artisan queue:work --queue=notifications,default --tries=3
```

El cron del sistema debe invocar una vez por minuto:

```cron
* * * * * cd /ruta/de/la/api && php artisan schedule:run >> /dev/null 2>&1
```

Estos procesos no se configuran automáticamente desde el repositorio. Deben administrarse con el mecanismo de procesos del servidor y ejecutarse con el mismo usuario de la aplicación.

## Zona horaria

Las fechas recibidas se interpretan con `NOTIFICATIONS_TIMEZONE` (`America/Mexico_City` por defecto) y se persisten en UTC. La zona horaria general de Laravel puede permanecer en UTC.

## Adjuntos

Los adjuntos se guardan en el disco privado configurado por `NOTIFICATIONS_ATTACHMENT_DISK`. El binario indicado por `NOTIFICATIONS_PDFINFO_BINARY` debe estar instalado para aceptar PDF. Esta validación estructural no sustituye un antivirus; se recomienda analizar los archivos con el servicio corporativo disponible antes de producción.

## Transición del cron anterior

La ruta HTTP anterior `/cronjobs/notificaciones` fue retirada para evitar que ejecute los mismos recordatorios que el Scheduler. Antes del despliegue se debe eliminar cualquier invocación externa a esa URL; el único disparador admitido es `schedule:run`.

## Recordatorios automáticos

`notifications:generate-reminders` se programa una vez al día en `NOTIFICATIONS_AUTOMATION_TIME`, interpretado en `America/Mexico_City`. El comando encola un Job independiente para prácticas, servicio social, tareas, exámenes, evaluaciones docentes y pagos.

Cada dominio:

- procesa `mysql2` por lotes y sólo alumnos activos;
- genera periodos configurables 5/2/1/0;
- usa una clave única por alumno, evento, fecha límite y periodo;
- vuelve a comprobar el estado vigente justo antes de FCM;
- conserva el historial si no hay dispositivo o Firebase falla;
- limita la cantidad examinada por dominio y periodo mediante `NOTIFICATIONS_AUTOMATION_MAX_PER_PERIOD`.

Los recordatorios pueden deshabilitarse globalmente o por dominio con las variables `NOTIFICATIONS_AUTOMATION_*`. Los comprobantes de pago con validación pendiente no se consideran pagos confirmados: el adeudo sólo deja de ser elegible cuando `tblp_pagos` ya no está en estado pendiente o su saldo calculado es cero.

Por seguridad, `NOTIFICATIONS_AUTOMATION_ENABLED` es `false` por defecto. Sólo debe activarse después de ejecutar las migraciones autorizadas, iniciar el worker, retirar el cron HTTP externo y validar el volumen previsto con `NOTIFICATIONS_AUTOMATION_MAX_PER_PERIOD`.
