# Tasks: Cambio de Titular de Puntos de Suministro con Trazabilidad y Sincronización Contractual

**Feature**: `015-cambio-titular-puntosuministro`
**Plan**: `plan.md`
**Total de tareas**: 22 (21 completadas, 1 pendiente de verificación interactiva por usuario)

> Formato: `- [x] TXXX [PN] [USX] Descripción — archivo exacto`

---

## FASE 1 — Base de Datos y Modelos (US1, US2, US3) 🟢 Prioridad P1

- [x] T001 [P1] [US1] Crear migración para la tabla `T_HISTORICO_CAMBIO_TITULAR` con `CodPunSum`, `CodCliAnterior`, `CodCliNuevo`, `FecCambio`, `procesado` (default 0), `CodUsu`, `tenant_id` e índices — `database/migrations/2026_10_08_180000_create_t_historico_cambio_titular_table.php`
- [x] T002 [P1] [US1] Crear modelo Eloquent `HistoricoCambioTitular` con casts, relaciones (`puntoSuministro`, `clienteAnterior`, `clienteNuevo`, `usuario`) y scope `scopePendientes` — `app/Models/HistoricoCambioTitular.php`
- [x] T003 [P1] [US1] Añadir relación `historicoCambiosTitular()` al modelo `PuntoSuministro` — `app/Models/PuntoSuministro.php`
- [ ] T004 [P1] [US1] Ejecutar migración en la base de datos MySQL con `php artisan migrate` *(pendiente por ejecución directa del usuario en su consola/entorno)*

---

## FASE 2 — Backend: Servicio de Cambio de Titular y Sincronización Inmediata (US1, US2) 🟢 Prioridad P1

- [x] T005 [P1] [US1] Actualizar `cambiarTitular()` en `PuntoSuministroTitularService` para validar que `$nuevoCodCli !== $punto->CodCli` y registrar movimiento en `HistoricoCambioTitular` (`procesado = false`) — `app/Services/PuntoSuministroTitularService.php`
- [x] T006 [P1] [US2] Implementar sincronización inmediata de propuestas pendientes (`NrContratoAudax` nulo o 0): marcar `CambioTitular = true` y actualizar `FecActCUPs = FecCambio` — `app/Services/PuntoSuministroTitularService.php`
- [x] T007 [P1] [US2] Implementar discriminación por `TipProCom`: si `TipProCom` es 1 o 2 reasignar `propuestaComercialCliente->CodCli = $nuevoCodCli`; si `TipProCom == 3` (Representante Legal) preservar `CodCli` intacto — `app/Services/PuntoSuministroTitularService.php`
- [x] T008 [P1] [US2] Actualizar registro en `HistoricoCambioTitular` a `procesado = true` cuando las propuestas pendientes absorben el cambio de titular — `app/Services/PuntoSuministroTitularService.php`
- [x] T009 [P2] [US1] Añadir acción `historicoTitular()` en `PuntoSuministroController` y registrar ruta `GET /puntoSuministro/{id}/historico-titular` — `app/Http/Controllers/PuntoSuministroController.php` & `routes/web.php`

---

## FASE 3 — Backend: Aplicación Diferida al Generar Nuevos Contratos (US3) 🟢 Prioridad P1

- [x] T010 [P1] [US3] Crear método `resolverCambioTitularDiferido()` en `PuntoSuministroTitularService`: consultar logs no procesados, buscar último contrato vigente previo del CUPS (`FecVenCUPs >= now()`), asignar fechas/flag y marcar log a `procesado = true` — `app/Services/PuntoSuministroTitularService.php`
- [x] T011 [P1] [US3] Conectar resolución de cambio de titular diferido en creación de CUPS eléctrico (`procesarCupsElectrico`) — `app/Traits/ContratoTraits.php`
- [x] T012 [P1] [US3] Conectar resolución de cambio de titular diferido en creación de CUPS gas (`procesarCupsGas`) — `app/Traits/ContratoTraits.php`

---

## FASE 4 — Frontend: Inmunidad en Asignación Masiva y Señalización Visual (US4) 🟡 Prioridad P1 / P2

- [x] T013 [P1] [US4] Declarar interfaz TypeScript `HistoricoCambioTitular` — `resources/js/interfaces.ts`
- [x] T014 [P1] [US4] Excluir de la propagación masiva de fechas (`isDatosComunes`) las filas eléctricas que tengan `cambioTitular` activo — `resources/js/Pages/Eneon/Contratos/UniClienteMultiPunto/hooks/useCupsElectricosManagement.ts`
- [x] T015 [P1] [US4] Excluir de la propagación masiva de fechas (`isDatosComunes`) las filas de gas que tengan `cambioTitular` activo — `resources/js/Pages/Eneon/Contratos/UniClienteMultiPunto/hooks/useCupsGasManagement.ts`
- [x] T016 [P1] [US4] Excluir de la propagación masiva de fechas (`isDatosComunes`) las filas de luz y gas con `cambioTitular` activo en contratos Tipo 3 — `resources/js/Pages/Eneon/Contratos/MultiClienteMultiPunto/ts/useContratoMultiClienteMultiPunto.ts`
- [x] T017 [P2] [US4] Incorporar estilo visual ámbar y badge *"Cambio titular"* en tablas de contratación UniCliente MultiPunto — `resources/js/Pages/Eneon/Contratos/UniClienteMultiPunto/components/CupsElectricosTable.tsx` & `CupsGasTable.tsx`
- [x] T018 [P2] [US4] Incorporar estilo visual ámbar y badge *"Cambio titular"* en tablas de contratación MultiCliente MultiPunto — `resources/js/Pages/Eneon/Contratos/MultiClienteMultiPunto/components/CupsElectricosTable.tsx` & `CupsGasTable.tsx`
- [x] T019 [P2] [US1] Añadir visualizador del histórico de titulares anteriores dentro del modal — `resources/js/Pages/Eneon/Dashboard/Editar/CambioTitularModal.tsx`
- [x] T022 [P1] [US1] Visualizar los datos del cliente (Razón Social y CIF/NIF) en lugar de solo sus IDs en el historial de traspasos — `app/Services/PuntoSuministroTitularService.php`, `resources/js/interfaces.ts` & `resources/js/Pages/Eneon/Dashboard/Editar/CambioTitularModal.tsx`

---

## FASE 5 — Pruebas Automatizadas y Verificación (US1, US2, US3, US4) 🟢 Prioridad P1 / P2

- [x] T020 [P1] [US1-US3] Crear tests automatizados de Feature para cambio de titular inmediato (TipProCom 1, 2 y 3) y diferido (herencia de contrato previo vigente) — `tests/Feature/PuntoSuministroTitularTest.php`
- [ ] T021 [P2] [US4] Verificación manual interactiva del flujo en navegador (Dashboard, asignación masiva inmune y badges)
