Checklist Migracion Legacy -> API

Fuente: PENDIENTES_MIGRACION_LEGACY_API.md

# Pendientes Migración Legacy -> API

Fecha de actualización: `2026-03-05`

Referencia principal:
- `documentacionAPI/checklist-legacy-a-api.md`
- `documentacionAPI/roadmap-migracion-legacy-a-api.md`

## 0) Alcance activo (backlog vigente)

- [x] Alcance actual confirmado: migración de API para rutas legacy de `/intranet/`.
- [x] Entidad en ejecución actual: `Usuarios`.
- [x] Prioridad activa: estabilización de contrato `Usuarios` (incluyendo login JWT con `role` y `permisos`) y validación QA de este alcance.
- [x] Alcance ampliado por instrucción funcional: migración de `/extranet/` para perfiles `Afiliado` y `FormacionInscrito`.
- [x] Definir y ejecutar API conjunta extranet (sin duplicar endpoints por perfil) para recrear paneles de afiliado e inscrito.

## 0.1) API conjunta extranet (`Afiliado` + `FormacionInscrito`)

Referencia funcional legacy:
- `old-files/src/Controller/InicioController.php`
- `old-files/src/Controller/FormacionCursoExtranetController.php`
- `old-files/src/Controller/PermutaController.php`
- `old-files/src/Controller/PermutaConversacionController.php`
- `old-files/templates/inicio/home-extranet.html.twig`
- `old-files/templates/formacion_curso/extranet/*.twig`
- `old-files/templates/permuta/*.twig`
- `old-files/templates/permutaconversacion/*.twig`

Pendiente de implementación/migración:
- [x] Panel extranet unificado:
- [x] `GET /api/extranet/panel` (base implementada: perfil, rol, contador conversaciones no leídas, acciones disponibles).
- [x] `GET /api/extranet/me` (perfil autenticado unificado para `afiliado/inscrito`).
- [x] `POST /api/extranet/perfil/solicitud-cambio` (solicitud de cambio de datos del panel).
- [x] `POST /api/extranet/password/change` (cambio de password autenticado).

- [x] Registro/recuperación de `FormacionInscrito`:
- [x] `POST /api/extranet/inscritos/registro`
- [x] `POST /api/extranet/inscritos/password/reset-request`
- [x] `POST /api/extranet/inscritos/password/reset`

- [x] Formación extranet conjunta:
- [x] `GET /api/extranet/formacion/mis-cursos`
- [x] `GET /api/extranet/formacion/resumen`
- [x] `GET /api/extranet/formacion/pendientes`
- [x] `GET /api/extranet/formacion/cursos-disponibles`
- [x] `GET /api/extranet/formacion/cursos/{cursoId}`
- [x] `GET /api/extranet/formacion/compras/contexto` (cursos + carrito activo en una llamada)
- [x] `GET /api/extranet/formacion/condiciones-compra`
- [x] `POST /api/extranet/formacion/cursos/{cursoId}/inscribirse` (curso gratuito/plazo válido)
- [x] `DELETE /api/extranet/formacion/cursos/{cursoId}/inscripcion` (borrado desde pendientes)
- [x] `GET /api/extranet/formacion/carrito/activo`
- [x] `GET /api/extranet/formacion/carrito/{id}`
- [x] `POST /api/extranet/formacion/carrito/activo/detalles`
- [x] `DELETE /api/extranet/formacion/carrito/activo/detalles/{detalleId}`
- [x] `POST /api/extranet/formacion/carrito/{id}/confirmar`
- [x] `POST /api/extranet/formacion/carrito/{id}/pago-transferencia`
- [x] `GET /api/extranet/formacion/carrito/{id}/pago/resultado`
- [x] `GET /api/extranet/formacion/carrito/{id}/pago/error`
- [x] `GET /api/extranet/formacion/cursos/{cursoId}/certificado`

- [x] Permutas extranet conjunta:
- [x] `GET /api/extranet/permutas/mias`
- [x] `GET /api/extranet/permutas/listado`
- [x] `GET /api/extranet/permutas/listado` incluye estado de conversación por item (`conversacion.existe/id`) para acciones "contactar/ver".
- [x] `GET /api/extranet/permutas/poblaciones` (catálogo origen/destinos)
- [x] `POST /api/extranet/permutas`
- [x] `GET /api/extranet/permutas/{id}` (incluyendo coincidencias cuando aplica)
- [x] `PATCH /api/extranet/permutas/{id}`
- [x] `DELETE /api/extranet/permutas/{id}`
- [x] `GET /api/extranet/permutas/conversaciones`
- [x] `GET /api/extranet/permutas/conversaciones/resumen`
- [x] `POST /api/extranet/permutas/conversaciones`
- [x] `GET /api/extranet/permutas/conversaciones/{id}`
- [x] `DELETE /api/extranet/permutas/conversaciones/{id}`
- [x] `POST /api/extranet/permutas/conversaciones/{id}/mensajes`
- [x] `POST /api/extranet/permutas/conversaciones/{id}/leer` (marcar mensajes recibidos como leídos).
- [x] `POST /api/extranet/permutas/conversaciones/leer-todas`.

- [x] Publicaciones extranet (afiliado):
- [x] `GET /api/extranet/publicaciones`
- [x] `GET /api/extranet/publicaciones/{id}`
- [x] `GET /api/extranet/publicaciones/{id}/certificado`

- [x] Documentación sección sindical extranet (afiliado):
- [x] `GET /api/extranet/documentacion/seccion-sindical`
- [x] `GET /api/extranet/documentacion/seccion-sindical/{id}/download`

- [x] Certificado Hacienda extranet (afiliado autenticado):
- [x] `GET /api/extranet/certificados/hacienda.pdf`

- [x] Catálogos extranet:
- [x] `GET /api/extranet/catalogos/provincias`
- [x] Ownership extranet normalizado en formación/permutas: `inscrito` derivado de JWT (sin `inscritoId` por query/body).
- [x] Simulador jubilación extranet (afiliado): `POST /api/extranet/jubilacion/calcular`.
- [x] Jurídico extranet (afiliado): `GET /api/extranet/juridico/solicitudes`, `POST /api/extranet/juridico/new`, `POST /api/extranet/juridico/solicitudes`, `POST /api/extranet/juridico/validar/{id}`, `POST /api/extranet/juridico/addDoc/{id}` (y aliases REST equivalentes).

## 1) Implementación pendiente (fuera de alcance actual `/intranet/usuarios`)

- [x] Definir implementación final de `permutas_destino` (entidad propia o pivote explícita).
- [x] Crear cobertura funcional de tablas legacy pendientes sin migraciones de esquema (contrato BD cerrada).
- [x] `documentacion` (API base implementada y validada en F4 técnico/funcional).
- [x] `email_seguro` (API base implementada y validada en F4 técnico/funcional).
- [x] `email_seguro_documentos` (API base implementada y validada en F4 técnico/funcional).
- [x] `permutas_destino` (cerrado como pivote `ManyToMany` en entidad `Permuta`)
- [x] `search_bo` (compatibilidad `getbo` implementada y validada en F4 técnico/funcional).
- [x] `votacion` (API extranet implementada y validada en F4 técnico/funcional).
- [x] `votacion_candidatura` (cobertura de voto/candidaturas implementada y validada en F4 técnico/funcional).
- [x] `votacion_votante` (registro anti-duplicado de voto implementado y validado en F4 técnico/funcional).

Estado de fases:
- [x] F1 (`usuarios`) cerrada.
- [x] F2 (compatibilidad endpoints legacy no usuarios) cerrada.
- [x] F3 (listeners legacy no usuarios) cerrada: `documentacionAPI/f3-listeners-no-usuarios.md`.
- [x] Decisión `SesionListener` no usuarios cerrada como `NO_APLICA`.
- [x] F4 (datos/esquema legacy) validada técnicamente y funcionalmente con evidencias en `documentacionAPI/ejecucion-f4-schema-audit-2026-03-04.md` y `documentacionAPI/ejecucion-f4-funcional-auth-2026-03-05.md`.
- [x] Auditoría técnica F4 ejecutada en Docker (`scripts/qa_f4_legacy_schema.sh`) con evidencia en `documentacionAPI/ejecucion-f4-schema-audit-2026-03-04.md`.

Nota de alcance:
- `documento_seccion_sindical` ya está absorbido en `documento_unificado` (API actual).
- La tabla legacy pendiente `documentacion` es un ámbito distinto y separado.

## 2) Validación alcance usuarios (cerrada)

- [x] Ejecución F1 usuarios consolidada en `documentacionAPI/ejecucion-f1-usuarios-resultados.md`.
- [x] Compatibilidad `ULC-*` cerrada en `PASS`.
- [x] Validación listeners `LUS-*` cerrada en `PASS` (`SesionListener`: `NO_APLICA`).

## 3) Validación pendiente (módulos fuera de alcance actual)

- [x] Ejecutar matriz `documentacionAPI/tests-compatibilidad-legacy-a-api.md` en casos no usuarios (`LC-*`) con evidencias: `documentacionAPI/ejecucion-compat-legacy-smoke-2026-03-03.md` y `documentacionAPI/ejecucion-compat-legacy-auth-2026-03-03.md`.
- [x] Ejecutar validacion funcional de FileUploader en documentacionAPI/validacion-funcional-fileuploader-legacy.md (FU-*) con evidencia en documentacionAPI/ejecucion-fileuploader-legacy-2026-03-04.md.
- [x] Ejecutar paridad visual de PDFs/imagenes en documentacionAPI/tests-paridad-visual-pdfs.md (PV-*). Estado final: CERRADO CON BLOQUEO EXTERNO por falta de dataset legacy (`documentacionAPI/ejecucion-cierre-pv-bloqueado-2026-03-05.md`).
- [x] Runbook de cierre PV legado documentado: `documentacionAPI/runbook-cierre-pv-legacy.md`.

## 4) Criterios de cierre del proceso

- [x] Endpoints legacy criticos implementados o alias acordados en produccion.
- [x] Todos los casos `ULC/LUS/FU/PV/LC` ejecutados con evidencia (incluyendo casos `PV-*` cerrados como `BLOQUEADO` por dependencia externa).
- [x] Pendientes residuales clasificados como:
- [x] NO_APLICA (justificado): no quedan ítems activos clasificados como `NO_APLICA` fuera de los ya cerrados por decisión explícita.
- [x] PLANIFICADO (PV-* pendiente QA visual con dataset legacy de referencia).

## Aplazado (por ahora)

- [x] Sin elementos aplazados activos.

## Realizado

- [x] Compatibilidad legacy implementada para `GET /api/formacion/cursos/diplomas/{documento}`.
- [x] API base de `documentacion` implementada (`GET/POST/PATCH/DELETE + descargar` en `/api/documentacion`).
- [x] API de `abogados` ampliada: `GET /api/solicitudes/abogados/tipos`, salida `tipoNombre`/`provinciaNombre` y filtros `tipoNombre`/`provinciaNombre`.
- [x] CRUD de `centros de trabajo` implementado en `/api/profesional/centros-trabajo` (list/get/create/patch/delete) bajo patrón CQRS/hexagonal.
- [x] CRUD de `municipios` implementado en `/api/profesional/municipios` (list/get/create/patch/delete) bajo patrón CQRS/hexagonal.
- [x] Aliases legacy extranet añadidos para formación (`/api/extranet/formacion/cursos`, `/cursos/mis`, `ajax/add-cart`, `comprar-cursos`, `confirmar-compra`, `pago-transferencia`, `pago-tpv/pago-aceptado`, `ver-certificado`) y permutas conversaciones (`GET /api/extranet/permutas/conversaciones/{id}/mensajes`).
- [x] Aliases legacy públicos de encuesta jurídica añadidos (`GET /api/encuesta-juridica/{token}` y `POST /api/encuesta-juridica-realizar/{token}`), manteniendo rutas actuales `/api/public/encuesta-juridica/{token}`.
- [x] Aliases legacy de no-inscritos añadidos para registro y recuperación de contraseña (`POST /api/no-inscritos/registro`, `/api/no-inscritos/regenerar-password`, `/api/no-inscritos/regenerar-password/confirmar`) y compatibilidad `/api/inscritos/regenerar-password`.
- [x] Endpoints públicos legacy de formación no afiliados implementados: `GET /api/no-afiliados/formacion/cursos-abiertos` y `GET /api/no-afiliados/formacion/confirmar-plaza/{token}`.
- [x] Endpoint legacy `GET /api/no-afiliados/getbo/{clave}` añadido con respuesta de compatibilidad (`status: partial`) mientras se completa migración de `search_bo`.
- [x] Compatibilidad pública `no-afiliado/no-afiliados` añadida para registro y recuperación de contraseña (`/api/no-afiliado(s)/registro`, `/regenerar-password`, `/regenerar-password/confirmar`) y alias de formación/getbo en singular/plural.
- [x] Compatibilidad pública `no-inscrito/no-inscritos` añadida para registro y recuperación de contraseña (`/api/no-inscrito(s)/registro`, `/regenerar-password`, `/regenerar-password/confirmar`).
- [x] Recuperación de contraseña intranet implementada (`POST /api/regenerar-password` y `POST /api/regenerar-password/confirmar/{token}`) con token firmado y expiración.
- [x] Panel extranet enriquecido con estado de votación legacy (`votacion`/`votacion_votante`): indica si hay votación activa y si el afiliado ya votó.
- [x] API extranet de votación legacy implementada: `GET /api/extranet/votacion/activa` y `POST /api/extranet/votacion/{id}/votar` (tablas `votacion`, `votacion_candidatura`, `votacion_votante`).
- [x] API base para tablas legacy `email_seguro` y `email_seguro_documentos` implementada en `/api/seguros/email-seguro` (list/get/create + add/delete documentos).
- [x] Cerrados aliases legacy API pendientes del mapeo: `GET /api/formacion/{tipo}/`, `GET /api/publicacion/` (y detalle/certificado), `POST /api/solicitudes/{id}/archivo` y `GET /api/formacion/cursos/{curso}/inscritos/{inscrito}/certificado`.
- [x] QA smoke de compatibilidad legacy ejecutado en Docker con script `scripts/qa_legacy_compat.sh` y evidencia en `documentacionAPI/ejecucion-compat-legacy-smoke-2026-03-03.md`.
- [x] Acceso ADMIN al panel de afiliado sin login con password: endpoint `POST /api/afiliados/{id}/impersonar` + consumo frontend en intranet (`AfiliadoDetail`).
- [x] Restricción aplicada: solo `ROLE_ADMIN` puede cambiar contraseña de afiliado vía `PATCH /api/afiliados/{id}` cuando se envía campo `password`.
- [x] Recuperación de contraseña (intranet/afiliado/inscrito) conectada a cola de correo: envío de enlace de reset con plantilla `templates/emails/password-reset-link.html.twig` (manteniendo compatibilidad de respuesta JSON).
- [x] Permutas extranet: aliases añadidos para compatibilidad de frontend/legacy (`GET /api/extranet/permutas`, `/mis`, `/mia`).
- [x] Aliases extranet adicionales para compatibilidad frontend/legacy: documentacion (GET /api/extranet/documentacion, /download/{id}, /{id}/descargar, /seccion-sindical/{id}/descargar), publicaciones (GET /api/extranet/publicaciones/certificado/{id}), votacion (GET /api/extranet/votacion) y juridico sin id en path (POST /api/extranet/juridico/validar, POST /api/extranet/juridico/addDoc).
- [x] Corregido bug en generación de certificado de curso legacy (`GET /api/formacion/cursos/{curso}/inscritos/{inscrito}/certificado`): consulta de documentos actualizada a `entidad/entidadId` en `FormacionDocumentoService`.
- [x] Smoke técnico de endpoints PDF ejecutado con evidencia en `documentacionAPI/ejecucion-pdf-smoke-2026-03-03.md`.
- [x] Script de QA autenticado añadido y ejecutado (`scripts/qa_legacy_auth_compat.sh`) con evidencias en `/tmp/legacy-auth-compat/20260303_174120` (contenedor backend).
- [x] Script de smoke PDF añadido y ejecutado (`scripts/qa_pdf_smoke.sh`) con evidencias en `/tmp/pdf-smoke/20260303_174746` (contenedor backend).
- [x] PV artefactos API generados para paridad visual (Hacienda/Certificado curso/Publicacion) con evidencia en documentacionAPI/ejecucion-pv-artifacts-api-2026-03-04.md; comparacion visual contra legacy pendiente en QA.
- [x] Paridad de rutas frontend (src/api) vs router backend (/api/*) verificada en Docker: MISSING_COUNT=0 (2026-03-04).
- [x] Auditoría técnica F4 de tablas legacy y cobertura API ejecutada con `scripts/qa_f4_legacy_schema.sh` (evidencia en `documentacionAPI/ejecucion-f4-schema-audit-2026-03-04.md`).
- [x] Comparador técnico PV API vs legacy añadido (`scripts/qa_pdf_parity_compare.sh`); ejecución registrada con `LEGACY_DIR` ausente (`WARN missing_legacy`) en `/tmp/sipan-backend-qa/pdf-parity-compare/20260305_093451/summary.txt`.
- [x] Paridad estructural de plantillas PDF ejecutada (`scripts/qa_pv_template_parity.sh`) con evidencia en `documentacionAPI/ejecucion-pv-template-parity-2026-03-05.md` (estado parcial: acta/memoria pendientes de validación visual final).
- [x] Compatibilidad legacy de petición de factura implementada en financiera: aliases `POST /api/financiera/facturas/{id}/enviar-peticion-factura`, `/enviomail-peticion-factura/{id}` y `/enviomail-peiticion-factura/{id}` sobre el flujo de `solicitar-original` (validado en Docker, 2026-03-07).
- [x] Compatibilidad `usuarios` (`ULC-*`) ejecutada en Docker con script autologin (`scripts/qa_f1_usuarios_autologin.sh`) y evidencias en `var/qa/f1-usuarios/20260308_122843` (incluye `ULC-007` en `403` con token sin permiso).
- [x] Checklist QA `usuarios` completado (CRUD + validaciones + seguridad) con `scripts/qa_f1_usuarios_extended.sh`; evidencia: `/tmp/sipan-backend-qa/f1-usuarios-extended/20260308_125711`.
- [x] Regresión final consolidada en Docker con `scripts/qa_final_regression.sh` (LC/LC_AUTH/FU/ULC/ULC_EXT en PASS); evidencia: `/tmp/sipan-backend-qa/final-regression/20260308_192415`.