# Informe de cierre — Fase 6

## Resultado

La Fase 6 queda completada para Normas, Laboratorio, Línea de Pruebas, Validación y sus contratos documentales. Se incorporó la implementación vigente de `seatsa-lab/main` en el commit congelado `087bbde77a1f8e3144c9c0e963d2fddbcb9d1420`; no se utilizó ninguna otra rama.

## Revalidación final — 3 de septiembre de 2026

La fase se reabrió después de que la descarga del informe `14980` expusiera una incompatibilidad que la aceptación original no detectó: `orderByRaw('expresión', 'ASC')` conserva la apariencia del código de `main`, pero en Laravel 13 el segundo argumento son *bindings*. MySQL recibía un parámetro inexistente y devolvía `HY093`.

Se revisó el bloque completo, no sólo la consulta que produjo el incidente:

- se adaptaron **49 llamadas activas** a `orderByRaw` en los generadores V2/V1, informes internacionales y controladores de capítulos/incisos; el criterio de orden no cambió, únicamente `ASC`/`DESC` pasó a formar parte de la expresión SQL;
- se sustituyeron **12 llamadas** obsoletas `createHeader`/`createFooter` por la API vigente `addHeader`/`addFooter` de PHPWord;
- se resolvieron **6 imágenes** de encabezado y marca de agua mediante `public_path`, eliminando la dependencia del directorio desde el que se ejecuta PHP;
- el traductor opcional del informe internacional ahora usa el cliente HTTP de Laravel, conserva el texto original si el servicio no está configurado o no responde y ya no escribe advertencias en la descarga;
- el segundo generador internacional dejó de crear un `TranslateClient` de Google que no utilizaba y que exigía credenciales ajenas al flujo;
- una prueba global impide reintroducir `ASC` o `DESC` como *binding* en cualquier archivo PHP de `app`.

Estos cambios son adaptaciones de compatibilidad. No se cambiaron filtros, relaciones, orden funcional, reglas de evaluación, contenido del informe ni acciones disponibles en el módulo.

### Ejecución real y revisión visual

- V2, informe `14980`: DOCX válido de **747,094 bytes**, 7 páginas, encabezado, pie y 6 recursos gráficos.
- V1, informe `14510`: DOCX válido de **786,153 bytes**, 41 páginas, encabezado, pie y 7 recursos gráficos.
- Ambos documentos se abrieron con Microsoft Word en modo de sólo lectura, se exportaron a PDF y se revisaron sus **48 páginas**. No se observaron imágenes rotas, texto recortado, tablas fuera de página ni daños en encabezados o pies.
- Los dos generadores internacionales completaron el recorrido con el reporte local `51`, que cuenta con 275 evaluaciones y no depende de archivos productivos ausentes.
- Las pantallas de capítulos e incisos completaron sus consultas reales con la norma local `141`.

### Evidencia final que sustituye las cifras anteriores

- Pruebas específicas del bloque: **23 aprobadas, 910 aserciones**.
- Suite completa: **318 pruebas, 318 aprobadas, 2,637 aserciones**.
- Sintaxis de los ocho archivos PHP modificados: **0 errores**.
- Routing: **1,109 rutas** cargadas; serialización de caché correcta y caché retirada al finalizar.
- Vistas Blade: compilación completa correcta y caché retirada al finalizar.
- Se actualizaron tres aserciones obsoletas de Requisiciones para comprobar el texto real `Bitácora de Egresos y Cuentas por Pagar`; no se modificó esa interfaz.

Los DOCX y renders creados para esta verificación son evidencia temporal de QA y no forman parte de los archivos que deben entregarse.

## Componentes incorporados

- Se sincronizó `linea_pruebas_controller` con las 32 funciones que faltaban respecto de `main`.
- Se sincronizó `validacion_informes_controller`, incluida la precarga de valores visuales y la sincronización de solicitudes del Portal.
- Se incorporaron las vistas vigentes de notificaciones, edición, listado y detalle de Línea de Pruebas.
- Se conservaron las adaptaciones Laravel 13 ya correctas en Normas, informes internacionales, configuración de traducción y notificaciones globales.
- Se copió el icono de notificaciones de Línea de Pruebas con hash idéntico a `main`.
- Se preservó como referencia inerte la migration `2026_08_28_000002_add_evaluacion_default_to_normas_variables.php` en `database/migrations_legacy`; `database/migrations` continúa vacío.
- Se trasladaron siete archivos rastreados de esta función: tres documentos Word de informe y cuatro evidencias de Línea de Pruebas. Todos conservan el mismo SHA-256 que la fuente. No se consideran respaldo productivo de `storage/app`.

## Tratamiento de `create_img`

La ruta de carga de imagen era consumida por tres vistas activas, pero el método había desaparecido del controlador actual de `main`. La implementación funcional todavía estaba conservada en `linea_pruebas_controller_versionAnterior.php`, dentro del mismo `main` autorizado.

Se recuperó esa implementación sin cambiar su contrato:

- marca la evaluación con resultado `imagen`;
- guarda el archivo en `public/linea_pruebas_img`;
- crea la relación en `linea_pruebas_imgs`;
- devuelve la respuesta JSON doblemente codificada que espera el JavaScript heredado.

Una prueba aislada valida las cuatro operaciones usando SQLite y almacenamiento falso. No escribe en MySQL local.

## Tratamiento de `apiInforme`

`apiInforme` no tenía método en el controlador actual, en los respaldos disponibles ni en el historial de `main`. La ruta existía desde el primer commit, pero no tiene consumidores en vistas, controladores ni JavaScript. Su URI la ubicaba conceptualmente en Facturación, aunque nunca fue ejecutable.

Se retiró esa ruta muerta. No se sustituyó por otra función ni se redirigió hacia un generador distinto, para evitar alterar informes o exponer documentos mediante una suposición. Los generadores vigentes de Word, PDF y QR permanecen registrados y probados.

## Corrección de rutas heredadas

El contrato de Fase 6 detectó otras nueve operaciones automáticas sin método y una ruta manual inexistente:

- `normas`: las operaciones reales continúan en `new_norma`, `show_norma`, `edit_norma` y `delete_norma`; el recurso automático se limitó a `index`.
- `subir_norma`: no tenía método `import` ni consumidor y se retiró.
- incisos: se excluyeron `create`, `store` y `update` automáticos; continúan `new_inciso`, `edit_inciso` y el resto de rutas reales.
- Línea de Pruebas: se excluyeron `create` y `show` automáticos; permanecen el listado y los flujos por programación/reporte.
- correlación internacional: se excluyeron `create` y `update` automáticos; continúan las rutas específicas de alta y edición.

Después de la corrección, todas las rutas de los 14 controladores del bloque apuntan a clases y métodos existentes.

## Base local verificada en modo lectura

MySQL 8.0.33, base `seatsacomsayuc_lab_schema`, ya contiene las estructuras requeridas por el código vigente:

- `variable_x_clasificador_opciones.evaluacion_default`;
- `normas_incisos_x_variables.evaluacion_default`;
- `norma_indices.mostrar_en_contenido_informe`;
- los tres campos de solicitud de reemplazo en `linea_prueba_reportes`;
- `linea_trabajos.mostrar_laboratorio_programacion`;
- tablas de reportes, evaluaciones, normas, capítulos e incisos.

No fue necesario alterar la base local ni ejecutar migrations, seeders o SQL.

## Verificación documental

### Word

Los tres informes Word rastreados en `main` se abrieron mediante Microsoft Word en modo de sólo lectura y se renderizaron a PDF para inspección:

- 50 páginas;
- 51 páginas;
- 52 páginas.

Se revisaron las 153 páginas. Conservan encabezado SEATSA, folio, índice, tablas multinivel, imágenes, marca de agua, QR, pies, observaciones y firmas. No se observaron superposiciones, texto recortado ni tablas fuera de página. Las pruebas de código también validan anchos, tablas anidadas, imágenes proporcionales, símbolos `°`, `µ`, `±`, `Ω`, superíndices y ausencia de páginas en blanco artificiales.

### PDF y QR

El generador Laravel 13 produjo un PDF real de Validación con el registro local controlado `id_programacion_muestra=35022`: dos páginas, 1,787,864 bytes, encabezado, datos, QR y pie. El QR también se generó de forma aislada como PNG de 512 px mediante Imagick.

La plantilla del PDF es funcionalmente idéntica a `main`. La revisión detectó dos características heredadas que no se corrigieron para no cambiar estilos sin autorización:

- el código del formato del pie derecho se visualiza cortado como `FORSAT-7.1-12-`;
- el segundo folio contiene bastante espacio vacío después de los últimos datos.

El PDF de Yukon rastreado en `linea_pruebas_archivos` es sólo una evidencia externa de carga y no se utilizó como aceptación visual de un informe SEATSA.

### Excel

Los controladores de Normas, Línea de Pruebas y Validación de `main` no generan Excel. Por tanto, no existe un artefacto Excel propio de este bloque que migrar o comparar. La validación integral de Excel de los módulos que sí lo generan permanece en la Fase 8.

## Evidencia automatizada de la ejecución original

- Pruebas específicas de Fase 6: **22 aprobadas**, **133 aserciones**.
- Regresión completa: **231 pruebas**, **230 aprobadas**, **1,055 aserciones**.
- Sintaxis: **388 archivos PHP**, **0 errores**.
- Routing: **1,086 rutas** cargadas.
- Vistas Blade: compilación completa correcta.
- Rendimiento representativo: 80 consultas usan los índices esperados y mejoran de manera material frente al escenario sin índices.
- Árbol fuente `seatsa-lab/main`: sin modificaciones.

En esa ejecución todavía existía la deuda SAT 207 de Facturación. La revalidación final indicada arriba sustituye esta fotografía histórica y confirma la suite completa sin fallos.

## Decisión de cierre

La lógica, rutas, carga de imágenes, relaciones, generación Word, PDF y QR del bloque quedan trasladadas y protegidas por pruebas. La particularidad heredada del pie del PDF queda documentada para decisión visual en la Fase 8; no representa una regresión introducida por Laravel 13.
