# Informe de cierre — Fase 4

## Resultado

La Fase 4 queda completada para autenticación del Portal, permisos y destinatarios de Requisiciones, sistema global de notificaciones, servicios compartidos, correo y scheduler.

La fuente funcional fue exclusivamente `seatsa-lab/main` en el commit congelado `087bbde77a1f8e3144c9c0e963d2fddbcb9d1420`. No se tomó código de otras ramas.

## Componentes incorporados

- Modelo y controlador global de notificaciones, relaciones por usuario, consulta, destinatarios y presentación.
- Servicios de notificaciones de Bancos, Requisiciones, Modificaciones, documentos, chat y Portal.
- Composición del layout compartido y tarjetas globales en las 129 vistas que forman el contrato vigente de presentación.
- Conciliación de roles y recordatorios de pago de Requisiciones.
- Recordatorios de documentos de lunes a viernes a las 08:00.
- Compatibilidad de login del Portal por usuario o correo, contraseña cifrada y contraseña heredada.
- Recuperación de contraseña del Portal y su plantilla de correo.
- Servicios y modelos documentales del Portal requeridos por los componentes compartidos.
- Rutas reales `notificaciones.resumen` y `notificaciones.abrir`; se eliminó el endpoint temporal vacío.
- Controlador de Requisiciones de `main`, fusionado con las protecciones que ya tenía la base Laravel 13.

## Adaptaciones controladas para Laravel 13

Se preservaron las adaptaciones que no cambian la función de negocio:

- `Str::random()` en lugar del helper eliminado `str_random()`.
- Firmas `: void`, atributos de data providers y aserciones de cadenas compatibles con PHPUnit 12.
- Descarga de anexos como adjunto, validada por la suite existente.
- La firma anticipada de Requisiciones no ejecuta efectos posteriores ni marca avisos globales antes de completar la sección 2.2.
- Se conserva el cálculo de responsables de líneas activas, sin volver a habilitar la creación automática que `main` mantiene desactivada.

## Presentación de notificaciones

El contrato de `main` cubre 129 vistas:

- 126 vistas principales tienen exactamente un ancla.
- Los tres contenedores con pestañas no duplican el ancla en el padre; sus cuatro parciales hijos contienen el ancla correspondiente.
- Las tarjetas se insertan antes de la navegación por pestañas.
- Los parciales legacy no duplican la presentación cuando la interfaz global está activa.

Las nueve vistas nuevas del Portal que existen en `main` pero todavía no pertenecen a este contrato se mantienen para su fase funcional posterior. No se inventó una integración visual para ellas.

## Scheduler verificado

| Frecuencia | Comando |
|---|---|
| Lunes a viernes, 08:00 | `documentos:generar-recordatorios` |
| Cada minuto | `bancos:procesar-pagos-programados` |
| Diario, 02:00 | `requisiciones:generar-recordatorios-pago` |

También quedó registrado `requisiciones:conciliar-notificaciones-roles` para ejecución controlada, no programada automáticamente.

## Evidencia

- Pruebas específicas de Fase 4: **75 aprobadas**, **460 aserciones**.
- Regresión completa: **193 pruebas**, **192 aprobadas**, **837 aserciones**.
- Sintaxis: **387 archivos PHP**, **0 errores**.
- Routing: **1,099 rutas** cargadas.
- Autoload optimizado: generado correctamente.
- Base MySQL local: sin cambios durante esta fase.

La única falla de la regresión completa es la deuda heredada y ya inventariada del estatus SAT 207: la prueba espera `Sustitucion no aceptada`, mientras el código devuelve `Desconocido (207)`. No pertenece a la Fase 4 y se mantiene reservada para Facturación.

## Decisión de cierre

La infraestructura compartida que requieren las fases funcionales ya no usa stubs. Autenticación, notificaciones, correo y tareas programadas pueden servir como base para continuar la migración modular.

No se declara validada la operación contra servicios externos de correo ni la ejecución automática contra producción. Esas comprobaciones se realizarán únicamente con configuración local controlada y, cuando corresponda, en las fases funcionales.
