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.
204 lines
7.3 KiB
Markdown
204 lines
7.3 KiB
Markdown
# 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 usan `currency` 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:**
|
|
|
|
```typescript
|
|
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):
|
|
|
|
```typescript
|
|
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
|
|
```bash
|
|
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
|
|
```bash
|
|
npm run build
|
|
```
|
|
|
|
### 3. Tests — todos verdes incluyendo los nuevos
|
|
```bash
|
|
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]
|
|
```
|