Files
inq-roi-simulador-web/sprints/sprint-2/BRIEF.md

312 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Sprint 2 — Brief
> **Propósito:** completar y elevar el modelo de recursos con costo por hora (ya parcialmente implementado), con foco en la experiencia "wow" en el workspace y en la visibilidad de recursos en el reporte y el PDF. Complementado con mejoras de UX para uso en talleres y pre-venta.
>
> **Usuario objetivo:** equipo de InQuality. Uso interno en talleres de análisis de procesos y pre-venta de automatización. Ocasionalmente presentado a clientes directamente.
>
> **Sprint anterior:** Sprint 1.5 — identidad visual completa, PDFs de clase profesional, badge ⚡ en canvas, ROI con 5 KPIs. Ver cierre en `methodology/CASE_STUDIES/`.
---
## 0. Reglas no negociables (heredadas)
- **Marca:** "InQ" siempre I-n-Q. "InQ ROI" nombre del producto.
- **Paleta:** naranja `#F59845`, gradiente `#F59845 → #ED3E8F`. No usar morado CONCILIA.
- **Logo:** usar PNGs de `assets/` en lugar de texto "InQ" / "InQuality" donde corresponda. Logo principal: `MARCA FINAL 2023 AREA DE SEGURIDAD 1 COLOR.png`.
- **Footer PDFs:** "Powered by InQuality" — obligatorio en los tres PDFs.
- **Identidad visual:** estable hasta Sprint 4+. No reabrir paleta, tipografía ni sistema de componentes.
- **Validación visual:** tests verdes ≠ aprobación final. Todo artefacto visual requiere OK del director antes de cerrar etapa.
- **Iniciativa agéntica:** clasificar cambios por nivel (1/2/3). Ver `methodology/PATTERNS.md` C.6.
Para referencia completa del manual de marca, tokens CSS y logo, ver `assets/InQ manual de marca- 3.0.pdf` y `sprints/sprint-1-5/BRIEF.md` sección 1.
---
## 1. Contexto estratégico
### 1.1 Rebalanceo web/PDF
| Componente | Inversión esperada |
|---|---|
| Web app (workspace + reporte + features) | 6070 % |
| PDF (refinamientos, nuevas secciones) | 1525 % |
| Infraestructura / deuda técnica | 1015 % |
| Documentación / metodología | 510 % |
### 1.2 Criterio de wow (obligatorio)
Cada etapa con feature nueva incluye:
- **Versión mínima:** cumple la funcionalidad.
- **Versión con wow:** mismo objetivo + 1-2 detalles de experiencia que generan impacto positivo.
Por defecto: versión con wow si el costo extra < 40% del tiempo de la mínima.
---
## 2. Estado real del modelo de recursos (pre-Sprint 2)
**El modelo de recursos existe parcialmente desde el MVP.** Sprint 2 no construye desde cero.
### Lo que ya existe en el código
| Componente | Estado |
|---|---|
| `Resource` en `types.ts` | ✅ `{ id, processId, name, type, costPerHour }` |
| `ActivityResourceAssignment` en `Activity` | ✅ `{ resourceId, utilizationPercent: number (01) }` |
| Tabla `resources` en Dexie | ✅ Existe desde v1 |
| `ResourcesPanel.tsx` | ✅ CRUD completo de recursos por proceso |
| `ActivityPanel.tsx` asignación | ✅ Slider de % de utilización |
| Motor de simulación | ✅ Calcula `cost = costPerHour × (execTimeMin/60) × utilizationPercent` |
| `CostByResourceChart.tsx` en reporte | ✅ Muestra totales por recurso (o "Sin recursos") |
| Desglose por actividad en reporte | ❌ No existe |
| PDF con recursos | ❌ No existe |
### Problema del modelo actual
El modelo `utilizationPercent` no es intuitivo para consultores: "¿qué % de la actividad ocupa este recurso?" es menos claro que "¿cuántos minutos dedica este recurso a cada ejecución?". En un taller con cliente, la pregunta inevitable es "¿cómo llegaste a ese costo?" — la respuesta con minutos es verificable, con porcentajes no.
---
## 3. Decisiones arquitectónicas del sprint (validadas por el director)
| Decisión | Resolución |
|---|---|
| Scope de recursos | Por proceso. Catálogo global en Sprint 3 con feedback real. |
| Costo fijo convive con recursos | Sí. `costoTotal = directCostFixed + costoRecursos` |
| Recursos en escenario automatizado | Solo AS-IS en Sprint 2. TO-BE sigue con `automatedCostFixed`. |
| Modelo de utilización | Migrar `utilizationPercent``utilizationMinutes + units` |
| Versión Dexie | Incrementar a v3. Migración preserva datos existentes. |
### 3.1 Modelo migrado — `ActivityResourceAssignment`
```typescript
// Antes (v2)
interface ActivityResourceAssignment {
resourceId: UUID
utilizationPercent: number // 01, fracción del tiempo de la actividad
}
// Después (v3) — Sprint 2
interface ActivityResourceAssignment {
resourceId: UUID
utilizationMinutes: number // minutos del recurso por ejecución (independiente del tiempo de la actividad)
units: number // cantidad de unidades del recurso (default 1)
}
```
### 3.2 Fórmula de costo actualizada
```
costoRecurso = resource.costPerHour × assignment.utilizationMinutes / 60 × assignment.units
costoTotalActividad = directCostFixed + SUM(costoRecurso por cada assignment)
```
### 3.3 Migración v2 → v3
La migración convierte datos existentes con la heurística:
```
utilizationMinutes = Math.round(activity.executionTimeMinutes × assignment.utilizationPercent)
units = 1
```
Para asignaciones sin ejecutionTimeMinutes disponible, `utilizationMinutes = 0` (conservador, evita sobrestimación).
### 3.4 Lo que NO cambia en Sprint 2
- `Resource` type (solo `utilizationMinutes` cambia en `ActivityResourceAssignment`, no en `Resource`)
- Motor de simulación: recibe costo ya calculado o adapta la fórmula localmente
- Escenario automatizado: sin cambios
- ROI: opera sobre resultado de simulación, sin cambio
---
## 4. Features del sprint
### Feature A — Migración del modelo de recursos (Etapa 1)
**Peso estimado:** 15% del sprint.
- Actualizar `ActivityResourceAssignment` en `types.ts` y `schemas.ts`
- Actualizar fórmula en `simulation.ts`
- Dexie v3 con función de upgrade que migra `utilizationPercent → utilizationMinutes + units`
- Test de migración: procesos con asignaciones previas se convierten correctamente
- Tests unitarios de dominio: edge cases del nuevo modelo
**Criterio de aceptación:**
- [ ] Proceso sin recursos: comportamiento idéntico al actual
- [ ] Proceso con recursos: costo calculado correctamente con nueva fórmula
- [ ] Migración v2→v3: datos preservados, sin pérdida
- [ ] Tests de dominio verdes
---
### Feature B — ActivityPanel "wow" (Etapa 2)
**Peso estimado:** 20% del sprint.
**Versión mínima:**
- Reemplazar slider de % por inputs de `utilizationMinutes` (número) y `units` (número entero ≥ 1)
- Mostrar costo calculado por recurso debajo del input
**Versión con wow (recomendada):**
Todo lo anterior más:
- Cálculo en tiempo real: el costo se actualiza al tipear (debounce de 300ms)
- Subtotal de recursos visible en el panel antes de guardar
- Helper contextual bajo el total: _"Esta actividad consume el equivalente a **2.3 días** de trabajo del Analista Senior al mes"_ (calculado con `annualFrequency / 12 × utilizationMinutes / 60 / 8`)
- El campo `directCostFixed` con label explícito: "Costo fijo (insumos, licencias, etc.)" para diferenciar visualmente de los recursos
**Criterio de aceptación:**
- [ ] Inputs reemplazan slider de %
- [ ] Costo por recurso visible antes de guardar
- [ ] Helper contextual aparece cuando hay `annualFrequency > 0` y recursos asignados
- [ ] Validación visual del director aprobada
---
### Feature C — Reporte web: desglose de recursos (Etapa 3)
**Peso estimado:** 20% del sprint.
#### C.1 Desglose por actividad en ActivitiesTable
**Versión mínima:** columna "Recursos" en la tabla que muestra el costo total de recursos de la actividad.
**Versión con wow:** filas expandibles que muestran el desglose: fijo + recurso 1 + recurso 2 + subtotal. El expand/collapse usa animación consistente con el sistema de diseño.
#### C.2 CumulativeSavingsChart — arrancar en `-inversión` (TECH_DEBT)
El gráfico web parte de `(Año 0, 0)`. El PDF ya lo hace correcto (`(Año 0, -inversión)`). Inconsistencia que notarán analistas en pre-venta. Cambiar punto inicial en `CumulativeSavingsChart.tsx`.
#### C.3 Payback label superpuesto (TECH_DEBT — trivial)
Ajustar offset del label "Payback · X meses" para que no colisione con eje Y. ~15 min.
#### C.4 Badge ⚡ — evaluar tamaño (TECH_DEBT)
Evaluar 16×16px o 18×18px. Si no genera colisiones en nodos chicos: implementar y reportar. Si genera problemas: mantener 14×14px y documentar.
**Criterio de aceptación:**
- [ ] Tabla muestra desglose de recursos por actividad
- [ ] CumulativeSavingsChart arranca en `-automationInvestment`
- [ ] Payback label no colisiona con eje Y
- [ ] Validación visual del director aprobada
---
### Feature D — UX rápidos (Etapa 4)
**Peso estimado:** 10% del sprint.
#### D.1 Edición inline de nombre de proceso y cliente
**Problema:** requiere ir a configuración global. En un taller interrumpe el flujo.
**Versión mínima:** campo editable inline en el header del workspace (click para editar, Enter/blur para guardar).
**Versión con wow:** animación sutil texto → input → texto, guardado con checkmark naranja breve que desaparece en 1.5s.
**Criterio de aceptación:**
- [ ] Se puede editar nombre y cliente sin ir a configuración
- [ ] Los cambios persisten en IndexedDB
- [ ] Validación visual del director aprobada
---
### Feature E — PDF: recursos + verificación de truncamiento (Etapa 5)
**Peso estimado:** 15% del sprint.
#### E.1 Tabla de recursos en PDF (procesos Actual/Automatizado)
Sección condicional al final del PDF (solo si hay actividades con recursos asignados):
- Tabla: Actividad | Recurso | Tipo | Costo/hora | Minutos | Unidades | Costo
- Subtotal por actividad
- Si ninguna actividad tiene recursos: la sección no aparece
**Versión mínima:** tabla simple.
**Versión con wow:** chip de color por tipo de recurso (rol = naranja, sistema = azul slate, persona = verde, equipamiento = gris, insumo = amarillo).
#### E.2 Verificación de truncamiento (TECH_DEBT)
Test E2E que valide ancho de cada línea en los tres PDFs. Si pasa → cerrar ítem. Si hay truncamiento → aplicar `doc.splitTextToSize()`.
**Criterio de aceptación:**
- [ ] Sección de recursos aparece cuando hay datos, no aparece cuando no hay
- [ ] Test E2E confirma ausencia de truncamiento en los tres PDFs
- [ ] Validación visual del director aprobada
---
## 5. Estructura de etapas
| Etapa | Contenido | Peso |
|---|---|---|
| 1 | Migración modelo: `utilizationPercent``utilizationMinutes + units`. Dexie v3. Tests unitarios. | 15% |
| 2 | ActivityPanel "wow": inputs minutos/unidades, cálculo tiempo real, helper contextual | 20% |
| 3 | Reporte web: desglose recursos por actividad (expandible), CumulativeSavingsChart -inversión, payback fix, badge | 20% |
| 4 | UX rápidos: edición inline proceso/cliente | 10% |
| 5 | PDF: tabla recursos + verificación truncamiento | 15% |
| 6 | E2E tests completos + validación visual director | 10% |
| *(buffer)* | *(imprevistos o profundizar wow)* | 10% |
**Regla operativa:** ninguna etapa arranca sin su `ETAPA_X_PROMPT.md` aprobado por el director.
---
## 6. Lo que explícitamente NO entra en Sprint 2
- Catálogo global de recursos compartido entre procesos → Sprint 3
- Recursos en escenario automatizado (TO-BE) → Sprint 3 con Modelo B
- Múltiples simulaciones / historial de escenarios → Sprint 3
- Distribuciones de probabilidad → Fase 2
- Export Excel → Backlog sin driver urgente
- Modo oscuro, i18n, PWA → Fase 2
- Login, multi-tenant, colaboración → Fase 2
---
## 7. Deuda técnica que se cierra en este sprint
| Ítem en TECH_DEBT.md | Etapa |
|---|---|
| CumulativeSavingsChart arranca en `-inversión` (web) | 3 |
| Payback label superpuesto con eje Y | 3 |
| Badge ⚡ tamaño (evaluar 16-18px) | 3 |
| Verificación truncamiento notas metodológicas PDF | 5 |
---
## 8. Definition of Done — Sprint 2
- [ ] Features AE: todos los criterios de aceptación cumplen
- [ ] Migración Dexie v2→v3: test automatizado confirma preservación de datos
- [ ] Tests unitarios: fórmula nueva, edge cases (sin recursos, units > 1, solo fijo, mixto)
- [ ] E2E: flujo completo asignar recurso → simular → verificar costo en reporte → exportar PDF
- [ ] Validación visual: reporte web con desglose, PDF con tabla de recursos, chart con -inversión
- [ ] TECH_DEBT.md actualizado: ítems cerrados documentados
- [ ] OBSERVATIONS.md limpio al cerrar
- [ ] STRATEGIC_DIRECTION.md actualizado con reflexiones post-sprint
- [ ] Ratio web/PDF respetado (verificar con conteo de etapas)
---
## 9. Riesgos
| Riesgo | Probabilidad | Mitigación |
|---|---|---|
| La migración de `utilizationPercent``utilizationMinutes` produce valores incorrectos en procesos existentes | Media | Test de migración obligatorio antes de cualquier otra etapa. La heurística es conservadora (redondeo hacia abajo). |
| El helper contextual en ActivityPanel requiere acceso a `annualFrequency` del proceso | Baja | `useReportData` o contexto del workspace ya tiene el proceso. Verificar en Etapa 2. |
| La tabla de recursos en PDF excede el espacio disponible en página 4 | Media | Diseñar como página separada si supera el espacio. Sección completamente condicional. |
---
## 10. Referencias
- `CLAUDE.md` (simulador-web) — reglas de implementación
- `STRATEGIC_DIRECTION.md` — decisiones estratégicas post-Sprint 1.5
- `BACKLOG.md` — ítems "Recursos", "Edición inline"
- `TECH_DEBT.md` — ítems CumulativeSavingsChart, Payback, Badge, Truncamiento
- `methodology/PATTERNS.md` — C.6, C.1
- `methodology/ANTI_PATTERNS.md` — AP.8
- `sprints/sprint-1-5/BRIEF.md` — manual de marca completo y tokens CSS
- `assets/InQ manual de marca- 3.0.pdf` — manual de marca oficial