# Tasks — Spec 008: Port version2 → develop_eneon

**Rama base:** `develop_eneon`  
**Rama trabajo:** `feature/008-port-version2`  
**Referencia código:** `version2`  
**Plan:** [plan.md](./plan.md) | **Spec:** [spec.md](./spec.md)

---

## Leyenda

| Símbolo | Significado |
|---------|-------------|
| `[ ]` | Pendiente |
| `[x]` | Completado |
| `[P]` | Paralelizable con otras tareas marcadas `[P]` de la misma fase |
| `US-Axx` | User story Épica A (SIPS) |
| `US-Bxx` | User story Épica B (Tarifas) |
| `US-Cxx` | User story Épica C (Canal) |
| `US-Dxx` | User story Épica D (Representante) |
| `⚠️` | Tarea con riesgo de regresión develop — revisar [constraints-develop-eneon.md](./constraints-develop-eneon.md) |

---

## Resumen de progreso

| Fase | PR | Tareas | Completadas |
|------|-----|--------|-------------|
| 0 Bootstrap | PR-0 | 8 | 7 |
| 1 ADX backend | PR-1 | 12 | 11 |
| 2 SIPS | PR-2 | 14 | 12 |
| 3 Tarifas + servicios | PR-3 | 16 | 14 |
| 4 Canal/comercial | PR-4 | 12 | 10 |
| 5 Representante legal | PR-5 | 11 | 9 |
| 6 Regresión | PR-6 | 10 | 9 |
| **Total** | **7 PRs** | **83** | **72** |

---

## Fase 0 — Bootstrap (PR-0)

**Gate:** BD preparada, rama creada, baseline develop verificado.  
**Depende de:** —

- [x] **T001** Crear rama `feature/008-port-version2` desde `develop_eneon` actualizado
- [x] **T002** Copiar scripts SQL desde `version2` si no existen en develop:
  - `bdscripts/T_Propuesta_Comercial_CUPs_ventana_adx.sql`
  - `bdscripts/T_Propuesta_Comercial_CUPs_servicios_contrato.sql`
- [x] **T003** Backup tabla `T_Propuesta_Comercial_CUPs` → `bdscripts/backups/T_Propuesta_Comercial_CUPs_20260703_005423.sql` (~22 MB)
- [x] **T004** Ejecutar scripts SQL — 10 columnas añadidas vía `bdscripts/run_spec008_sql.php`
- [x] **T005** Verificar `Servicio_Integracion`: CodCom **17** = `audax`, CodCom **92** = `adx` (otras activas sin valor)
- [x] **T006** Documentar variables ADX en `.env.example` (sin secretos reales)
- [ ] **T007** [P] Baseline manual: historial CUPS en `EditarCups` + `EditarPunto`
- [ ] **T008** [P] Baseline manual: vistas tarjetas + contrato multipunto + carga masiva con barra progreso

---

## Fase 1 — Infraestructura ADX backend (PR-1)

**Gate:** `sips:adx-debug` y `tarifas:adx-debug` listan config; `--test` OK en sandbox.  
**Depende de:** T001–T006  
**Épicas:** A (parcial), B (parcial) | **US:** A-03, A-04, B-01, B-05

- [x] **T009** Crear `app/Services/Adx/AdxHttpClient.php` desde `version2`; unificar auth headers/basic/query
- [x] **T010** Crear `app/DataTransferObjects/AdxTarifaDto.php` desde `version2`
- [x] **T011** Crear `app/Services/Tarifas/AdxTarifasService.php` usando `AdxHttpClient`
- [x] **T012** Crear `app/Services/Sips/SipsProviderRegistry.php` desde `version2`
- [x] **T013** Crear `app/Services/Sips/AdxSipsService.php`; auth unificada vía `AdxHttpClient` (D-02)
- [x] **T014** Crear `config/sips.php` desde `version2`
- [x] **T015** Extender `config/services.php` bloque `adx` (sips + mostrarTarifas)
- [x] **T016** Crear `app/Console/Commands/SipsAdxDebugCommand.php`
- [x] **T017** Crear `app/Console/Commands/TarifasAdxDebugCommand.php`
- [x] **T018** Extender `IntegracionTraits::showTarifasIntegracion` con rama `adx` → `AdxTarifasService`
- [x] **T019** Sintaxis PHP verificada en archivos nuevos
- [ ] **T020** Smoke test manual: `php artisan sips:adx-debug` y `tarifas:adx-debug --test` — pendiente `composer install` completo en entorno

---

## Fase 2 — SIPS multi-proveedor (PR-2)

**Gate:** `/sips` AUDAX+ADX operativo; contratos envían `cod_com`; AUDAX persiste en BD.  
**Depende de:** T009–T020  
**Épicas:** A | **US:** A-01, A-02, A-03, A-05

### Backend

- [x] **T021** ⚠️ Reescribir `SipsController@index`: props `comercializadoras` + `sipsProvidersByCodCom` (desde `version2`)
- [x] **T022** ⚠️ Reescribir `SipsController@consumirServicioSips`: registry audax/adx + **retrocompat `cod_com` opcional** (D-03)
- [x] **T023** Implementar fallback `cod_com`: si ausente, resolver comercializadora AUDAX activa por defecto

### Frontend SIPS

- [x] **T024** Crear `resources/js/Pages/Eneon/Sips/types.ts`
- [x] **T025** Crear `resources/js/Pages/Eneon/Sips/config/resolveProvider.ts`
- [x] **T026** Crear `resources/js/Pages/Eneon/Sips/hooks/useSipsConsulta.ts`
- [x] **T027** [P] Crear componentes:
  - `components/ComercializadoraSelect.tsx`
  - `components/SipsUnsupportedMessage.tsx`
  - `components/shared/SipsConsumoResults.tsx`
  - `components/Audax/AudaxSipsPanel.tsx`
  - `components/Adx/AdxSipsPanel.tsx`
  - `components/Adx/AdxSuministroDetails.tsx`
- [x] **T028** Adaptar `resources/js/Pages/Eneon/Sips/Index.tsx` como orquestador multi-proveedor
- [x] **T029** ⚠️ Sustituir Nav Bootstrap de version2 por `EneonTabs` en paneles SIPS (D-04) — vía `SipsPanelTabs`
- [x] **T030** ⚠️ Integrar `validacionSips.ts` (develop) en flujo consulta — no eliminar archivo
- [x] **T031** Mantener `Sips.module.css` develop (a11y); botones `btnBuscar` en paneles (no estilos contratos version2)

### Integración contratos

- [x] **T032** Actualizar `UniClienteUniPunto/hooks/useCupsElectrico.ts` → POST `sips.consumo` con `cod_com`
- [x] **T033** Actualizar `UniClienteUniPunto/hooks/useCupsGas.ts` → POST `sips.consumo` con `cod_com`
- [x] **T034** Actualizar `ReferenciasCodigo/CupsElectricSection.tsx` y `CupsGasSection.tsx` → `cod_com`

### Verificación fase

- [ ] **T035** Manual V1: SIPS AUDAX — consulta luz/gas, persistencia `T_ConsumosSIPSAudax*`
- [ ] **T036** Manual V2: SIPS ADX — Electricity/Gas, suministros + lecturas sin BD

---

## Fase 3 — Tarifas ADX + servicios contrato (PR-3)

**Gate:** Ventana ADX persiste; servicios contrato round-trip en create/edit/bulk.  
**Depende de:** T009–T020 (paralelo con Fase 2 tras PR-1)  
**Épicas:** B | **US:** B-01, B-02, B-03, B-04, B-06

### Backend persistencia

- [x] **T037** Extender `app/Models/PropuestaComercialCups.php`: fillable + casts (10 campos — ver [data-model.md](./data-model.md))
- [x] **T038** Portar `ContratoTraits::mapServiciosContrato()` desde `version2`
- [x] **T039** Portar `ContratoTraits::mapVentanaAdxFields()` desde `version2`
- [x] **T040** Integrar mappers en create/update CUPS eléctrico y gas (create + edición)
- [x] **T041** Portar ampliación tarifas gas `RL.1`–`RL.6` en `app/Traits/CargaGlobalAudax.php`

### Frontend utilidades

- [x] **T042** Crear `Contratos/ComponentesComunes/ventanaPreciosUtils.ts`
- [x] **T043** Crear `Contratos/ComponentesComunes/serviciosContratoConfig.ts`
- [x] **T044** Crear `Contratos/ComponentesComunes/ServiciosContratoFields.tsx`
- [x] **T045** Extender `Contratos/Interfaces/Interfaces.ts` y `constants.ts` con tipos ventana + servicios

### Modal y tablas

- [x] **T046** ⚠️ Extender `Contratos/ModalPrecios.tsx`: detección provider ADX, modal XL, tabla 15 columnas; conservar tabla Audax 4 columnas
- [x] **T047** Actualizar `Edicion/components/ModalPrecios.tsx` para re-exportar componente compartido (eliminar duplicación)
- [x] **T048** Añadir columnas servicios contrato + tooltips en `MultiClienteMultiPunto/components/CupsElectricosTable.tsx`
- [x] **T049** [P] Añadir columnas servicios en `MultiClienteMultiPunto/components/CupsGasTable.tsx`
- [x] **T050** [P] Añadir columnas servicios en `UniClienteMultiPunto/components/CupsElectricosTable.tsx` + `CupsGasTable.tsx`
- [x] **T051** [P] Integrar servicios + `buildVentanaRowPatch` en `UniClienteUniPunto/CupsElectricSectionUnipunto.tsx` + `CupsGasSectionUnipunto.tsx`
- [x] **T052** [P] Integrar en `ReferenciasCodigo/CupsElectricSection.tsx` + `CupsGasSection.tsx`
- [x] **T053** Integrar en edición: `Edicion/components/CupsTableRow.tsx`, `useContratoEdition.ts`

### Bulk load

- [x] **T054** Propagar servicios contrato en `MultiClienteMultiPunto/hooks/useBulkLoadCups.ts`
- [x] **T055** [P] Propagar en `UniClienteMultiPunto/hooks/useBulkLoadCups.ts`

### Verificación fase

- [ ] **T056** Manual V3: modal tarifas ADX → selección ventana → save contrato → campos en BD
- [ ] **T057** Manual V4: toggles servicios contrato en multipunto/unipunto/edición

---

## Fase 4 — Canal y comercial (PR-4)

**Gate:** OKCom y documentos exigen canal/comercial; jobs registran campos.  
**Depende de:** T001–T006 (paralelo con Fase 2–3 tras PR-1)  
**Épicas:** C | **US:** C-01, C-02, C-03, C-04, C-05

### Frontend prompts

- [x] **T058** Crear `resources/js/Pages/Eneon/Contratos/promptComercialCanal.ts` (localStorage `eneon_comercial`, `eneon_canal`)
- [x] **T059** Integrar prompt en `EnviarDocumentoComercializadoraModal.tsx` antes del POST
- [x] **T060** Integrar prompt en `EditarContrato.tsx` — eliminar función inline duplicada
- [x] **T061** [P] Integrar prompt en `EditarContratoMultiClienteMultiPunto.tsx`

### Backend OKCom

- [x] **T062** Validar `comercial` + `canal` required en `ContratosController::okCommercialContract`
- [x] **T063** Extender `OkCommercialContractJob`: constructor + body POST externo con `comercial`, `canal`
- [x] **T064** Extender `ContratoTraits::okContractsTrait` → `IntegracionTraits::OkCommercialContractIntegracionTrait`

### Backend documentos

- [x] **T065** Extender `ContratoTraits::documentContractTrait` validación canal/comercial
- [x] **T066** Extender `IntegracionTraits::documentContractIntegracionTrait` + despacho job
- [x] **T067** Extender `EnvioDocumentoContratoIntegracionJob`: JSON body + multipart + historial

### Backend tramitación

- [x] **T068** Extender `GenerarContratoIntegracionJob` con `comercial`, `canal` en body integración
- [x] **T069** ⚠️ Actualizar `Utils.ts::saveContratoComercial`: TipProCom 3+ mantiene modal canal/comercial obligatorio

### Verificación fase

- [ ] **T070** Manual V5: OK Comercial — modal → job → historial proceso con body correcto
- [ ] **T071** Manual V6: envío documentación con canal/comercial; 422 si faltan

---

## Fase 5 — Representante legal TipProCom 1/2 (PR-5)

**Gate:** Tramitación y PDF Tip 1/2 usan representante validado; Tip 3 sin regresión.  
**Depende de:** T058–T069  
**Épicas:** D | **US:** D-01, D-02, D-03, D-04, D-05, D-06

### Frontend

- [x] **T072** Crear `resources/js/Pages/Eneon/Contratos/promptCondicionesParticulares.ts`
- [x] **T073** Actualizar `Utils.ts::saveContratoComercial`: TipProCom 1/2 → prompt condiciones particulares + `CodConCli`
- [x] **T074** Actualizar `useGenerarContratosCondicionesParticularesPDF.ts`: param `codConCli` en query
- [x] **T075** Actualizar `EditarContrato.tsx` botón Generar 2: `promptCondicionesParticulares` en lugar de solo canal/comercial
- [x] **T076** ⚠️ Fusionar `MultiClienteMultiPunto/components/RepresentanteLegalSection.tsx`: conservar `TypeaheadClienteConLimpiar` + props errores develop; añadir bulk guard version2 — ya presente en develop
- [x] **T077** Portar `filterClientesByRepresentanteLegal` + guard bulk load en `useContratoMultiClienteMultiPunto.ts` / `useBulkLoadCups.ts` — ya presente en develop

### Backend

- [x] **T078** Portar `ContratoTraits::getRepresentantesLegalesByCodCliTrait` desde `version2`
- [x] **T079** Exponer prop Inertia `representantesLegales` en render edición contrato (`ContratosController`)
- [x] **T080** Portar `IntegracionTraits::resolverContactoRepresentanteTramitacion` + body TipProCom 1/2
- [x] **T081** Extender `IntegracionController`: leer `CodConCli`, pasar a `GenerarContratoIntegracionJob`
- [x] **T082** Portar cambios `AuxiliarCondicionesParticularesTraits::resolverRepresentanteLegalCondicionesParticulares`
- [x] **T083** Extender `AnexoProductoController::generateContratosCondicionesParticulares` con query `CodConCli`

### Verificación fase

- [ ] **T084** Manual V7: tramitar Tip 1/2 con representante; verificar body integración + PDF condiciones particulares
- [ ] **T085** Manual: TipProCom 3 tramita sin modal representante (sin regresión)

---

## Fase 6 — Regresión develop y cierre (PR-6)

**Gate:** Criterios spec §5 completos; constraints §11 checklist OK.  
**Depende de:** T021–T085

### Resultado auditoría estática (2026-07-02)

| Tarea | Resultado | Notas |
|-------|-----------|-------|
| T086 | PASS | Wiring historial intacto: controller, traits, `EditarCups`, `EditarPunto` |
| T087 | PASS | Ruta `cups.historial` en `web.php` L312; consumida por `useHistorialCups` |
| T088 | PASS | SIPS vía `SipsPanelTabs` → `EneonTabs`; contratos portados conservan tabs develop |
| T089 | PASS | `BarraProgresoCargaMasiva` montada en MultiCliente y UniCliente multipunto |
| T090 | PASS | `*CardsView` entry points en Clientes, CUPS, Contratos, Comercializadoras |
| T091 | PASS | Hooks validación importados en componentes padre |
| T092 | PASS | 11 subcomponentes UniClienteUniPunto §4 presentes; ADX integrado dentro |
| T093 | PASS parcial | §1–§7, §9 OK; §8 plantillas PDF no versionadas en repo (preexistente / assets servidor) |
| T094 | OK | Criterios §5 actualizados con estado estático vs manual |
| T095 | Pendiente | Smoke integrado manual V8 |

**§11 checklist:** PASS en a11y, historial wiring, tarjetas, bulk, CI; FAIL parcial solo en plantillas PDF en git (ver §8).

### Regresión funcional develop

- [x] **T086** ⚠️ Historial CUPS: lectura tab + escritura en update — auditoría estática PASS; confirmar tab en UI (T095)
- [x] **T087** ⚠️ Verificar rutas `cups.historial.*` intactas en `routes/web.php` — PASS (ruta única `cups.historial` con `{tipo}`)
- [x] **T088** EneonTabs operativos en SIPS y pantallas contratos tocadas — PASS estático
- [x] **T089** Barra progreso carga masiva (`BarraProgresoCargaMasiva`) funcional en multipunto — PASS wiring; smoke bulk en T095
- [x] **T090** Vistas tarjetas: Clientes, CUPS, Contratos, Comercializadoras — PASS entry points
- [x] **T091** Hooks validación develop operativos — PASS imports y archivos
- [x] **T092** UniClienteUniPunto subcomponentes develop presentes — PASS (11/11 §4)

### Cierre

- [x] **T093** Revisión diff completa vs [constraints-develop-eneon.md](./constraints-develop-eneon.md) checklist §11
- [x] **T094** Actualizar criterios aceptación [spec.md](./spec.md) §5 (marcar completados)
- [ ] **T095** Manual V8: escenario integrado historial + tarjetas + bulk + ADX smoke

---

## Mapa de dependencias entre tareas

```mermaid
flowchart TD
    T001[T001 Rama] --> T009[T009-T020 PR-1]
    T004[T004 SQL] --> T037[T037 Modelo]
    T009 --> T021[T021-T036 SIPS]
    T009 --> T037[T037-T057 Tarifas]
    T001 --> T058[T058-T071 Canal]
    T058 --> T072[T072-T085 Representante]
    T021 --> T086[T086-T095 Regresión]
    T037 --> T086
    T058 --> T086
    T072 --> T086
```

### Orden de ejecución recomendado

1. **T001–T008** (secuencial)
2. **T009–T020** (secuencial)
3. En paralelo:
   - **T021–T036** (SIPS)
   - **T037–T057** (Tarifas)
   - **T058–T071** (Canal)
4. **T072–T085** (Representante — tras Canal)
5. **T086–T095** (Regresión — al final)

---

## Checklist por PR (merge)

### PR-0 — Bootstrap
- [x] T001, T002, T003, T004, T005, T006 completados
- [ ] T007–T008 baseline manual UI pendiente
- [x] Gate BD: **OK** — 10 columnas presentes

### PR-1 — ADX backend
- [x] T009–T019 completados
- [ ] T020 smoke test artisan (requiere vendor completo)
- [x] Gate código: **OK** — servicios y rama ADX tarifas integrados

### PR-2 — SIPS
- [x] T021–T034 completados (código)
- [ ] T035–T036 verificación manual UI/SIPS
- [ ] Gate: `/sips` + contratos `cod_com` (smoke manual)

### PR-3 — Tarifas + servicios
- [x] T037–T055 completados (código); T056–T057 verificación manual pendiente
- [ ] Gate: ventana ADX + servicios persisten (smoke manual)

### PR-4 — Canal/comercial
- [x] T058–T069 completados (código); T070–T071 verificación manual pendiente
- [ ] Gate: OKCom + documentos validados (smoke manual)

### PR-5 — Representante legal
- [x] T072–T083, T076–T077 completados; T084–T085 verificación manual pendiente
- [ ] Gate: Tip 1/2 PDF + tramitación (smoke manual)

### PR-6 — Regresión
- [x] T086–T094 completados (auditoría estática)
- [ ] T095 + gates manuales pendientes
- [ ] Gate: spec §5 runtime + constraints §11 plantillas PDF aclaradas

---

## Comandos útiles (ejecutar manualmente)

```bash
# Extraer archivo desde version2 estando en feature branch
git show version2:app/Services/Adx/AdxHttpClient.php > app/Services/Adx/AdxHttpClient.php

# Diff archivo concreto
git diff develop_eneon..version2 -- app/Http/Controllers/SipsController.php

# Diagnóstico ADX
php artisan config:clear
php artisan sips:adx-debug --test
php artisan tarifas:adx-debug --test --tarifa=2.0TD --subtarifa=T0

# Frontend
npm run dev
```

---

## Siguiente paso

**Port código Spec 008 completo.** Pendiente antes de merge a `develop_eneon`:

1. **T095** — smoke manual V8 (historial + tarjetas + bulk + ADX)
2. Verificaciones manuales acumuladas: T007–T008, T020, T035–T036, T056–T057, T070–T071, T084–T085
3. Confirmar plantillas PDF en servidor (`storage/app/public/pdfs/templates/`) — no versionadas en git
