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.
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]