0 ? (value / max) * 100 : 0}%` }}
/>
{format(value)}
)
}
```
Formato de valores:
- "Ahorro esperado": `formatCurrency(value, currency)` — mismo helper que el resto de la tabla
- "Eficiencia": `value.toFixed(2)` + sufijo implícito (sin unidad visible, el tooltip explica)
### 5. Tests unitarios
Crear `tests/features/report/efficiency.test.ts`:
```ts
// Casos básicos para ambas métricas
// expectedSavings = savings × executionProbability
// efficiency = expectedSavings / executionTimeMinutes
// Edge cases:
// - savings ≤ 0 → null en ambas
// - automatable = false → null en ambas
// - executionTimeMinutes = 0 → efficiency null, expectedSavings puede ser válido
// - executionProbability = 0 → null en ambas (resultado sería 0, no rankeable)
// Ranking: filas nulas siempre al final del sort
// Sort por 'efficiency': fila nula < fila con efficiency 0.01
```
---
## Decisión de producto — focus group
Las dos columnas se implementan para **validar con clientes en talleres** cuál agrega más valor en contexto real de consultoría. No se elige una antes del focus group.
Cuando haya feedback suficiente, la siguiente decisión puede ser: mantener las dos, quedarse con una, o fusionarlas en una sola columna con toggle. Esa decisión es post Sprint 5.
---
## Scope estricto — lo que NO entra
- **PDF:** la tabla de comparación en PDF ya tiene 6 columnas en 138mm de ancho de contenido. Agregar una 7ª columna con barra de progreso no es viable en portrait sin truncar nombres de actividades. La columna de eficiencia queda fuera del PDF en esta etapa.
- Cambios en el modelo de datos (`ActivitySimResult`, `types.ts`): todos los datos necesarios ya existen.
- Cambios en el motor de simulación (`simulation.ts`): nada cambia allá.
- Cambios en `ReportPage.tsx` (salvo si hay props nuevas que pasar, que no hay).
- Cambios en `pdf-sections-roi.ts` ni en `buildComparisonTableConfig`.
---
## Criterios de validación
- [ ] Dos columnas nuevas visibles: "Ahorro esperado" y "Eficiencia", alineadas a la derecha
- [ ] Actividades no automatizables muestran "—" en ambas columnas
- [ ] Sort por defecto: mayor eficiencia primero (desc)
- [ ] Click en cada columna activa el sort por esa métrica; click nuevamente alterna asc/desc
- [ ] El ícono ArrowUpDown es más opaco en la columna de sort activa
- [ ] Barra de progreso proporcional en ambas columnas: el máximo = 100% del ancho
- [ ] Tooltip aparece al hacer hover en el header de cada columna nueva
- [ ] Tests unitarios de ambas fórmulas en Vitest: verdes, incluyendo edge cases
- [ ] `npm run lint` sin errores
- [ ] `npm run build` limpio
- [ ] Validación visual del director antes del OK formal
---
## Archivos a modificar
1. `src/features/report/ComparisonTable.tsx` — todo el trabajo de la feature
2. `tests/features/report/efficiency.test.ts` (nuevo) — tests unitarios de la fórmula
No modificar ningún otro archivo.