Files
inq-roi-simulador-web/sprints/sprint-2/ETAPA_6_PROMPT.md
Marcos Benítez 1ff2724735 feat(sprint-2): recursos por actividad — modelo, UX y PDF
Etapas 3-6 del Sprint 2. Resumen de cambios:

**Reporte web (Etapa 3)**
- ActivitiesTable: filas expandibles con desglose fijo + recursos por actividad
- CumulativeSavingsChart: fix payback label superpuesto con eje Y
- BpmnCanvas: badge  14→20px
- TECH_DEBT cerrado: chart -inversión (ya estaba), payback label, badge

**Workspace (Etapa 4)**
- WorkspacePage: edición inline de nombre de proceso y cliente
  (click → input → Enter/blur guarda en IndexedDB, checkmark naranja 1.5s)

**PDF (Etapas 5-6)**
- pdf-sections: drawResourcesSection — tabla condicional de recursos por actividad
  con chips de tipo (rol/persona/sistema/equipamiento/insumo)
- pdf-export: página de recursos (pág. 4 cuando hay datos, metodología pasa a pág. 5)
- Fix truncamiento: splitTextToSize en resourceName y top3 ROI
- Fix texto: "ejecución" con tilde, header "Esp. (USD)" sin truncar
- TECH_DEBT cerrado: truncamiento notas metodológicas

**Tests**
- 7 tests nuevos: drawResourcesSection (4) + comportamiento condicional PDF (3)
- Total: 541 → 548 tests verdes

BREAKING: exportScenarioPdf ahora recibe activities[] como parámetro adicional.
2026-05-20 08:24:32 -03:00

7.3 KiB

Sprint 2 — Etapa 6: Fixes post-validación + Tests Sprint 2

Tipo: correcciones menores de texto/layout + tests unitarios. Sin features nuevas, sin cambios de dominio. Objetivo: cerrar los dos hallazgos de la validación visual de Etapa 5 y agregar tests que cubran el comportamiento nuevo del PDF de recursos (condicional de página, drawResourcesSection). Resultado esperado: PDF sin typos de acentos, columna "Costo esp." no truncada, suite de tests verde que incluye cobertura de la nueva sección de recursos. Validación visual del director requerida antes del OK formal.


Archivos a modificar

src/lib/export/pdf-sections.ts                         ← fix acentos + ancho columna
tests/lib/export/pdf-resources-section.test.ts         ← NUEVO — tests de drawResourcesSection

Opcionalmente, extender tests/lib/export/pdf-export.test.ts con 2 tests de comportamiento condicional (ver Feature 2). Si lo considerás más limpio, crear un archivo separado tests/lib/export/pdf-export-sprint2.test.ts.

Si durante la implementación necesitás tocar cualquier otro archivo, detenete y reportá el conflicto antes de proceder.


Fix 1 — Acentos faltantes en drawResourcesSection

En pdf-sections.ts, función drawResourcesSection, el subtítulo dice:

"Costo por ejecucion, ponderado por probabilidad de ejecucion de cada actividad."

Corregir a:

"Costo por ejecución, ponderado por probabilidad de ejecución de cada actividad."

Verificar con grep que no queden otras ocurrencias de "ejecucion" (sin tilde) en el archivo.


Fix 2 — Columna "Costo esp." truncada en drawResourcesSection

La última columna del header aparece como "Costo esp. (U..." porque cellWidth: 26 es insuficiente para "Costo esp. (USD)".

Solución preferida: cambiar el header a 'Esp. (USD)' (abreviado) manteniendo cellWidth: 26. Esto es más legible a 7.5pt en una celda angosta que forzar más ancho.

Si la moneda es variable (no siempre USD), usar \Esp. (${currency})`en lugar del string hardcodeado. Revisar si las otras columnas ya usancurrency` en el header — ser consistente.


Feature 2 — Tests unitarios: drawResourcesSection y página condicional

2.1 Tests para drawResourcesSection

Crear tests/lib/export/pdf-resources-section.test.ts.

El mock de jsPDF es el mismo patrón que usa pdf-export.test.ts — reusar o importar el fixture. El mock de autoTable es vi.fn().

Tests requeridos:

describe('drawResourcesSection', () => {

  it('no lanza error con actividades que tienen recursos', () => {
    // result con al menos una actividad con resourceCostBreakdown no vacío
    // resources con el recurso referenciado
    // activities con el assignedResource correspondiente
    // Verificar: no lanza, autoTable fue llamado
  })

  it('no llama a autoTable si todas las actividades tienen resourceCostBreakdown vacío', () => {
    // result con perActivity donde todos tienen resourceCostBreakdown: []
    // Verificar: autoTable NO fue llamado (la función retorna early)
  })

  it('el header de autoTable incluye la moneda correcta', () => {
    // Llamar con currency: 'PYG'
    // Verificar que el primer arg de autoTable.head contiene 'PYG'
  })

  it('llama a autoTable por cada actividad con recursos (una tabla total, no una por actividad)', () => {
    // result con 2 actividades con recursos
    // Verificar: autoTable fue llamado exactamente 1 vez (la tabla agrupa todo)
  })

})

2.2 Tests de comportamiento condicional en exportToPdf

Extender el describe existente en pdf-export.test.ts (o en nuevo archivo):

describe('exportToPdf — página condicional de recursos (Sprint 2)', () => {

  it('NO llama a drawResourcesSection cuando ninguna actividad tiene recursos', async () => {
    // mockSimulation con perActivity donde resourceCostBreakdown: [] en todas
    // Verificar: autoTable llamado exactamente 1 vez (solo la tabla principal de actividades)
  })

  it('llama a autoTable dos veces cuando hay actividades con recursos', async () => {
    // mockSimulation con al menos una actividad con resourceCostBreakdown no vacío
    // resources con el recurso referenciado
    // Verificar: autoTable llamado al menos 2 veces (tabla principal + tabla de recursos)
  })

  it('addPage se llama una vez más cuando hay recursos (página extra)', async () => {
    const addPageCallsWithout = /* llamar sin recursos, contar addPage.mock.calls.length */
    const addPageCallsWith = /* llamar con recursos, contar addPage.mock.calls.length */
    expect(addPageCallsWith).toBe(addPageCallsWithout + 1)
  })

})

Nota sobre el mock: El mock de jsPDF en pdf-export.test.ts hace vi.clearAllMocks() en beforeEach, así que los contadores se resetean entre tests. Asegurate de resetear también el mock de autoTable si lo extendés en el mismo archivo.


Verificaciones obligatorias antes de reportar

1. Verificación de scope con git diff — OBLIGATORIO

git diff --name-only HEAD

El resultado debe contener únicamente:

src/lib/export/pdf-sections.ts
tests/lib/export/pdf-resources-section.test.ts
tests/lib/export/pdf-export.test.ts               ← si se extendió este archivo
tests/lib/export/pdf-export-sprint2.test.ts        ← si se creó archivo nuevo

Si aparece cualquier archivo no listado → revertirlo y documentarlo.

Nota: src/features/workspace/WorkspacePage.tsx, src/lib/export/pdf-export.ts y src/lib/export/pdf-sections-roi.ts probablemente aparezcan en el diff porque son cambios de Etapas 4 y 5 que aún no han sido commiteados. Eso es correcto — no revertirlos.

2. Build limpio

npm run build

3. Tests — todos verdes incluyendo los nuevos

npm run test

El reporte debe indicar cuántos tests se agregaron respecto de los 541 anteriores.

4. Smoke test visual del fix de acentos

Exportar un PDF de escenario con recursos y verificar que la página 4 muestra:

  • "Costo por ejecución" (con tilde, dos veces) en el subtítulo
  • El header de la última columna no truncado ("Esp. (USD)" o similar)

Alcance estricto — lo que NO entra en esta etapa

  • Features nuevas de ningún tipo
  • Cambios en dominio, store, o componentes React
  • Tests E2E de Playwright (los existentes son suficientes para Sprint 2)
  • Cambios en pdf-export.ts o pdf-sections-roi.ts (Etapa 5 ya los cerró)
  • Refactors de código existente que no estén relacionados con los dos fixes

Reporte esperado al terminar

## Etapa 6 completada

### Archivos modificados
- src/lib/export/pdf-sections.ts — fix acentos + fix header columna
- tests/lib/export/pdf-resources-section.test.ts — NUEVO (X tests)
- tests/lib/export/pdf-export.test.ts — extendido (X tests nuevos) / pdf-export-sprint2.test.ts — NUEVO

### Fixes aplicados
- Acentos: "ejecución" corregido (2 ocurrencias en drawResourcesSection)
- Columna: header cambiado a "Esp. (USD)" — ya no se trunca

### Tests agregados
- pdf-resources-section.test.ts: X tests — [descripción breve]
- pdf-export.test.ts / sprint2: X tests — comportamiento condicional

### Verificaciones
- git diff --name-only HEAD: [lista] ✅
- npm run build: ✅
- npm run test: [nuevo total]/[anterior] tests verdes ✅
- Smoke test visual: [descripción breve del fix visual confirmado]

### Conflictos de scope
[ninguno / lista con razones]