# 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) | 60–70 % | | PDF (refinamientos, nuevas secciones) | 15–25 % | | Infraestructura / deuda técnica | 10–15 % | | Documentación / metodología | 5–10 % | ### 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 (0–1) }` | | 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 // 0–1, 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 A–E: 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