Sprint 2 Etapas 1-2: modelo recursos utilizationMinutes+units, Dexie v3, ActivityPanel wow

This commit is contained in:
2026-05-19 21:26:34 -03:00
parent 49364f4b18
commit a01380240a
23 changed files with 292265 additions and 244 deletions

295
CLAUDE.md
View File

@@ -1,34 +1,26 @@
# CLAUDE.md — Contexto del Proyecto
# CLAUDE.md — InQ ROI · Contexto de implementación
> Este archivo es leído automáticamente por Claude Code en cada sesión.
> Define el "norte" del proyecto y las reglas no negociables.
> Leído automáticamente por Claude Code al arrancar desde este directorio.
> Contiene reglas de código, arquitectura, marca y convenciones de implementación.
> Para contexto estratégico y de colaboración ver `cowork/InQ ROI - Simulador de procesos/CLAUDE.md`.
---
## ⚠️ Reglas de Marca — NO NEGOCIABLES (Sprint 1.5+)
## ⚠️ Reglas de Marca — NO NEGOCIABLES
Estas reglas aplican a TODO string que aparezca en código, PDFs, CSVs, tests y documentación.
### 1. Ortografía de "InQ" — SIEMPRE I-n-Q
### Ortografía de "InQ" — SIEMPRE I-n-Q
```
✅ InQ ← correcto
✅ InQuality ← correcto (nombre completo)
✅ InQ ROI ← nombre del producto
❌ INQ ← bug
❌ Inq ← bug
❌ inq ← bug
❌ inQ ← bug
❌ INQ ❌ Inq ❌ inq ❌ inQ todos son bugs
```
Cualquier desviación es un bug que debe corregirse antes de hacer commit.
### 2. Nombre del producto
`InQ ROI` — nombre de trabajo para Sprint 1.5. Se reemplazará en Sprint 3-4. No debatir el nombre ahora.
### 3. Color protagonista
### Paleta protagonista
```
Primario: #F59845 (naranja InQ)
@@ -36,107 +28,34 @@ Gradiente: #F59845 → #ED3E8F (naranja → magenta InQ)
```
El gradiente se usa SOLO en KPI Hero y banners principales.
**NO usar morado de CONCILIA** (`#572FA2`, `#CB1889`) en este producto.
**NO usar colores CONCILIA** (`#572FA2`, `#CB1889`) en este producto.
### 4. Footer de PDFs
### Assets de logo
Logos disponibles en `assets/`:
- `MARCA FINAL 2023 AREA DE SEGURIDAD 1 COLOR.png` — logo horizontal color (uso principal)
- `MARCA FINAL 2023 AREA DE SEGURIDAD 1 BCO.png` — logo horizontal blanco (sobre fondos oscuros)
- `MARCA FINAL 2023 AREA DE SEGURIDAD 2 COLOR.png` — versión con área de seguridad 2
- `MARCA FINAL 2023 AREA DE SEGURIDAD 2 ISO COLOR LOGO BCO.png` — isotipo + logo blanco
Usar el logo PNG en lugar de texto "InQ" / "InQuality" en headers de PDF y en la UI cuando corresponda.
### Footer de PDFs
Tagline obligatorio: `"Powered by InQuality"` — en todos los footers de PDF, siempre.
### 5. Rol del consultor
Si aparece un nombre de consultor en algún campo, es como "consultor responsable", no como "creador" ni "founder" del producto.
---
## Identidad del Proyecto
**Nombre de trabajo**: Process Cost Platform (nombre comercial por definir)
**Una frase**: Plataforma web para que consultores de procesos cuantifiquen costos operativos y calculen ROI de automatización a partir de archivos BPMN 2.0.
**Mantra**: *Los procesos de negocio son activos estratégicos de las empresas y un diferencial competitivo.*
**Nombre de trabajo:** InQ ROI
**Una frase:** Plataforma web para que consultores de procesos cuantifiquen costos operativos y calculen ROI de automatización a partir de archivos BPMN 2.0.
**Deploy:** Cloudflare Pages — https://process-cost-platform.pages.dev
**Estado:** Sprint 2 en curso (ver `sprints/sprint-2/BRIEF.md`)
---
## Estado Actual
- **Fase**: 1 — Sprint 1 (ROI y escenarios de automatización)
- **Fase anterior completada**: 0 — MVP "Noche Cero" (v0.1.0-mvp, deployado en https://process-cost-platform.pages.dev)
- **Documento maestro**: `ARCHITECTURE.md` (raíz del repo)
- **Audiencia primaria del Sprint 1**: equipo de InQuality (consultora de procesos)
- **Caso de uso primario**: pre-venta de proyectos de automatización con cálculo de ROI
- **Deploy**: Cloudflare Pages (estático, gratis)
---
## Reglas No Negociables — Sprint 1
### ✅ Lo que SÍ entra en Sprint 1
1. **Volumetría del proceso**: frecuencia anual de ejecución + horizonte de análisis (años)
2. **Marcado de actividades automatizables** con costos automatizados (tiempo + costo fijo)
3. **Inversión en automatización** como dato del proceso (un único valor agregado)
4. **Motor de simulación dual**: corre escenarios "actual" y "automatizado" sobre el mismo BPMN
5. **Sección de ROI en el reporte**: KPIs grandes, tabla comparativa, gráficos de payback y ahorros
6. **5 KPIs de ROI**: Ahorro por ejecución, Ahorro anual, Payback (meses), Ahorro acumulado a N años, ROI % anualizado
7. **Mecanismo de transparencia**: detecta valores cero o inversión cero y los expone en el reporte
8. **Migración Dexie v1 → v2** con datos existentes preservados
9. **Export PDF/CSV ampliado** para incluir páginas/datos de ROI
10. **Documento metodológico anexo** sobre cómo calcular el costo automatizado por ejecución
### ❌ Lo que NO entra en Sprint 1
- Múltiples escenarios (más de 2)
- Escenarios como entidad separada (modelo B) — sigue siendo modelo A: dos pares de campos por actividad
- VPN, TIR, tasa de descuento (cálculos financieros sofisticados)
- Captura desglosada del costo de automatización (licencias, desarrollo, infra) — un único campo
- Análisis de sensibilidad ("¿qué pasa si la frecuencia cae 30%?")
- Distribuciones probabilísticas
- Modelar bots como recursos con capacidad
- Multi-tenant, login, colaboración, versionado, IA, modo oscuro, i18n, PWA
**Si dudás si una feature entra: NO ENTRA.** Defendé el alcance. Anotala en `TODO.md`.
---
## Decisiones Arquitectónicas Adoptadas (Sprint 1)
### Modelo de escenarios: Modelo A (dos campos por actividad)
Cada actividad tiene:
- `directCostFixed` y `executionTimeMinutes` (escenario actual, ya existían)
- `automatedCostFixed` y `automatedTimeMinutes` (nuevos, escenario automatizado)
- `automatable: boolean` (default false)
**NO se modela con dos diagramas distintos.** Un BPMN, dos pares de campos por actividad. El motor recibe un parámetro `scenario: 'actual' | 'automated'` y aplica los campos correspondientes.
Migración a "escenarios como entidad" se evaluará en Sprint 3-4 si InQuality lo demanda.
### Volumetría: multiplicador en el reporte, no en el motor
El motor sigue siendo **determinístico** y calcula "una ejecución". La volumetría (frecuencia anual + horizonte) es un parámetro del proceso que el reporte usa para extrapolar:
- `costoAnual = costoUnitario × frecuenciaAnual`
- `costoHorizonte = costoAnual × horizonteAños`
No se introduce VPN ni Monte Carlo en Sprint 1.
### ROI: cálculos nominales simples
- `savingsPerExecution = costActual - costAutomated`
- `annualSavings = savingsPerExecution × annualFrequency`
- `paybackMonths = (automationInvestment / annualSavings) × 12`
- `cumulativeSavingsHorizon = (annualSavings × horizonYears) - automationInvestment`
- `roiAnnualPercent = (annualSavings / automationInvestment) × 100`
Edge cases manejados explícitamente: inversión cero, ahorro negativo, división por cero.
### Transparencia metodológica
Si se detectan valores cero (costo automatizado en cero, inversión en cero, etc.), el reporte muestra una **sección visible pero discreta** ("Transparencia metodológica") con la lista de valores no informados. **Es feature, no bug**: convierte una posible debilidad en señal de seriedad profesional para el cliente.
---
## Stack Tecnológico (sin cambios respecto al MVP)
## Stack Tecnológico (sin cambios hasta nuevo aviso)
| Capa | Tecnología |
|---|---|
@@ -148,14 +67,14 @@ Si se detectan valores cero (costo automatizado en cero, inversión en cero, etc
| UI | shadcn/ui sobre Tailwind CSS |
| Iconos | Lucide React |
| Gráficos | Apache ECharts (vía echarts-for-react) |
| Persistencia | IndexedDB vía Dexie |
| Persistencia | IndexedDB vía Dexie (actualmente v2) |
| Validación | Zod |
| Export PDF | jsPDF + jsPDF-autotable + html2canvas |
| Export CSV | papaparse |
| Testing | Vitest + Playwright |
| Deploy | Cloudflare Pages |
**No introduzcas librerías fuera de esta lista sin justificación explícita.**
**No introduzcas librerías fuera de esta lista sin justificación explícita y consulta al director.**
---
@@ -167,34 +86,53 @@ src/
├── App.tsx
├── router.tsx
├── domain/ ← lógica de negocio pura, sin React, testeable
│ ├── types.ts
│ ├── simulation.ts ← motor de simulación (acepta scenario)
│ ├── roi.ts ← NUEVO en Sprint 1: cálculos puros de ROI
│ ├── types.ts ← tipos TypeScript del dominio
│ ├── simulation.ts ← motor de simulación (acepta scenario: 'actual' | 'automated')
│ ├── roi.ts ← cálculos puros de ROI
│ ├── bpmn-parser.ts
│ └── schemas.ts ← Zod schemas
├── store/ ← Zustand stores
├── persistence/ ← Dexie / IndexedDB (v2 en Sprint 1)
├── persistence/ ← Dexie / IndexedDB
│ └── db.ts ← schema + migraciones (versión actual: v2)
├── features/ ← organizado por feature, no por tipo
│ ├── import/
│ ├── workspace/ ← ampliado en Sprint 1 (panel de automatización)
│ ├── simulation/ ← ampliado (dispara dual scenario)
│ └── report/ ← ampliado (tab Comparación + ROI)
│ ├── workspace/ ← ActivityPanel, ResourcesPanel, BpmnCanvas, WorkspacePage
│ ├── simulation/
│ └── report/ ← ReportPage, ActivitiesTable, CostByResourceChart, etc.
├── components/ui/ ← shadcn copy-pastes
├── lib/ ← utilidades transversales (format, colors, pdf, csv)
│ └── export/ ← pdf-sections.ts, pdf-sections-roi.ts, csv.ts
└── styles/
```
**Reglas de dependencia (sin cambios)**:
- `domain/` NO importa de React, ni de `store/`, ni de `features/`. Es puro.
### Reglas de dependencia (no negociables)
- `domain/` **NO** importa de React, ni de `store/`, ni de `features/`. Es puro.
- `features/` puede importar de `domain/`, `store/`, `persistence/`, `lib/`, `components/`.
- `store/` puede importar de `domain/` y `persistence/`. Nada más.
---
## Estado del modelo de recursos (pre-Sprint 2)
El modelo de recursos está **parcialmente implementado** desde el MVP. Lo que existe:
- `Resource` en `types.ts`: `{ id, processId, name, type, costPerHour }`
- `ActivityResourceAssignment` embebido en `Activity`: `{ resourceId, utilizationPercent: number (0-1) }`
- Tabla `resources` en Dexie desde v1
- `ResourcesPanel.tsx`: CRUD de recursos por proceso
- `ActivityPanel.tsx`: asignación con slider de porcentaje
- Motor de simulación: ya calcula `cost = costPerHour × (executionTimeMinutes/60) × utilizationPercent`
- `CostByResourceChart.tsx`: gráfico en reporte
**Sprint 2 mejora este modelo.** No construye desde cero. Ver `sprints/sprint-2/BRIEF.md` para scope exacto.
---
## Principios de Código
1. **TypeScript strict** activado. Nada de `any` salvo en bordes con librerías sin tipos.
2. **Dominio puro**: motor y cálculos de ROI son funciones puras testeables sin DOM.
2. **Dominio puro**: funciones en `domain/` son puras, testeables sin DOM.
3. **Componentes tontos, hooks inteligentes**: lógica en custom hooks, JSX limpio.
4. **Sin lógica de negocio en componentes**.
5. **Convenciones de naming**:
@@ -208,35 +146,33 @@ src/
---
## Diferencial Visual (sigue siendo CRÍTICO)
## Diferencial Visual
El reporte sigue siendo el corazón. En Sprint 1 se le agregan páginas. Reglas:
El reporte es el corazón del producto. Reglas:
- Tipografía: **Inter** para UI, **JetBrains Mono** para números/datos
- Paleta heatmap: verde `#10b981` → amarillo `#f59e0b` → rojo `#ef4444`
- Paleta heatmap: verde `#10b981` → amarillo `#f59e0b` → rojo `#ef4444` (saturados, calibrados en E2E)
- Paleta ROI:
- Ahorro positivo: verde `#10b981`
- Ahorro marginal o neutro: gris `#64748b`
- Ahorro negativo o payback fuera de horizonte: rojo `#ef4444`
- Advertencias de transparencia: amarillo `#f59e0b` (no rojo: es informativo, no error)
- Cifras de dinero siempre formateadas con separadores y símbolo de moneda
- KPIs de ROI **más grandes** que los KPIs del reporte de costos (es la sección que vende)
- El export PDF debe verse igual o mejor que la pantalla
- Ahorro marginal: gris `#64748b`
- Ahorro negativo: rojo `#ef4444`
- Advertencias de transparencia: amarillo `#f59e0b`
- Cifras de dinero: siempre con separadores y símbolo de moneda
- KPIs de ROI más grandes que KPIs de costos
- Export PDF igual o mejor que pantalla
- Densidad de información media-alta (audiencia: consultor profesional)
---
## Definition of Done — Cada Feature
Antes de marcar una tarea como terminada:
- [ ] Funciona en el happy path
- [ ] Maneja el caso de datos vacíos sin crashear
- [ ] Maneja edge cases definidos (división por cero, valores negativos, valores cero)
- [ ] Funciona en happy path
- [ ] Maneja datos vacíos sin crashear
- [ ] Maneja edge cases (división por cero, valores negativos, cero)
- [ ] Persiste en IndexedDB cuando corresponde (con migración si cambió schema)
- [ ] Tiene estilo consistente con el resto de la app
- [ ] Si toca dominio: tiene al menos un test en Vitest
- [ ] Si toca el flujo end-to-end: tiene cobertura en Playwright
- [ ] Estilo consistente con el resto de la app
- [ ] Si toca dominio: al menos un test en Vitest
- [ ] Si toca flujo end-to-end: cobertura en Playwright
---
@@ -253,91 +189,30 @@ npx playwright test # tests E2E (Playwright headless)
---
## Cómo Trabajar Conmigo (el Usuario)
## Verificación final antes de entregar artefactos
- Cuando termines una tarea grande, **resumí qué cambió y qué falta**.
- Si una decisión no está clara, **proponé 2-3 opciones** con pros/contras antes de codear.
- Si encontrás que algo del documento de arquitectura está mal o falta, **avisame antes de improvisar**.
- No agregues features no pedidas. Si algo se te ocurre, anotalo en `TODO.md`.
- Cuando completes algo, **mostrame los archivos creados/modificados**, no los pegues completos en el chat salvo que te lo pida.
- **Validá programáticamente** lo que yo no puedo ver visualmente (uso Mac + VS Code + Claude Code sin browser interactivo). Para flujos críticos: Playwright + extracción de datos del PDF/CSV generado.
- Si un test revela algo raro: **NO racionalices el problema, investigá la causa raíz**. Los tests no mienten.
---
## Contexto del Fundador y Equipo
- Consultor de automatización de procesos basado en Paraguay
- Construye esto como herramienta consultiva propia + del equipo de InQuality + para vender a colegas LATAM
- Usa Claude Code Pro como único "equipo de desarrollo"
- Sprint 1 es para uso interno de InQuality (no para mostrar a cliente todavía)
- Casos de uso confirmados:
- Análisis de costos operativos en consultoría de procesos
- **Pre-venta de proyectos de automatización con cálculo de ROI** (caso estrella del Sprint 1)
- Valora: claridad, robustez, pulido visual, mantenibilidad, validación rigurosa
---
## Reglas de marca NO NEGOCIABLES
- "InQ" siempre se escribe I-n-Q (mayúscula-minúscula-mayúscula)
- Color protagonista: naranja #F59845
- Gradiente identidad: #F59845#ED3E8F
- NO usar morado CONCILIA (#572FA2, #CB1889)
- Footer obligatorio: "Powered by InQuality"
- No promover a Marcos como creador
## Verificación final antes de present_files
Antes de presentar cualquier PDF al usuario, verificá que:
Antes de presentar cualquier PDF o pantalla:
1. El header/footer dice "InQ ROI" (no "Process Cost Platform" ni otro)
2. El footer incluye "Powered by InQuality"
3. No hay caracteres rotos (símbolos sin renderizar)
3. No hay caracteres rotos
4. La marca "InQ" se escribe siempre I-n-Q
---
## Política de iniciativa proactiva
Cuando detectés una oportunidad de mejora fuera del scope del prompt actual:
Antes de aplicar un cambio fuera del scope del prompt actual, evaluar en orden:
- Cambios triviales (variables internas, reordenar imports): ejecutar
- Cambios visibles pero reversibles (wording, spacing, tooltips):
ejecutar y reportar explícitamente al final
- Cambios de marca, arquitectura o datos (paleta, dependencias,
estructura, features nuevas): CONSULTAR ANTES DE PROCEDER
1. ¿Resuelve un ítem listado en `TECH_DEBT.md`, `BACKLOG.md` o archivos de planificación? → **Nivel 3** (consultar antes)
2. ¿Choca con restricción explícita del prompt ("NO entra", "NO tocar")? → **Nivel 3**
3. ¿Modifica paginación, layout, estructura de salida, o contenido visible? → **Nivel 2** mínimo (ejecutar y reportar)
4. ¿Afecta marca, identidad, dependencias o configuración? → **Nivel 3**
5. Si nada aplica → **Nivel 1** (ejecutar libremente)
Estructura de propuesta cuando hay un cambio Nivel 3:
PROPUESTA DE CAMBIO NIVEL 3 — requiere aprobación antes de implementar
Cambio sugerido: [descripción]
Justificación: [por qué lo considero valioso]
Impacto: [qué afecta]
Alternativa si se rechaza: [qué hacer en lugar]
Ver methodology/PRINCIPLES.md sección "Política de iniciativa agéntica" para detalle completo.
### Criterios refinados (post-Sprint 1.5)
Antes de aplicar un cambio fuera del scope explícito del prompt actual,
evaluá en este orden:
1. ¿El cambio resuelve un ítem listado en TECH_DEBT.md, BACKLOG.md u
archivos de planificación? → Nivel 3 (consultar), sin importar el
tamaño técnico
2. ¿Choca con restricción explícita del prompt ("NO entra", "NO tocar")?
→ Nivel 3 (consultar)
3. ¿Modifica paginación, layout, estructura de salida, o contenido
visible? → Nivel 2 mínimo (reportar)
4. ¿Afecta marca, identidad, dependencias o configuración? → Nivel 3
5. Si nada aplica → Nivel 1
Argumentos NO válidos para evitar consulta:
Argumentos **NO válidos** para evitar consulta:
- "Es mejora de legibilidad"
- "Es consistencia con etapa anterior" (verificar si esa etapa fue
autorizada)
- "Es trivial de revertir" (reversibilidad NO es criterio de clasificación)
- "Resuelve un bug menor" (si el bug está en TECH_DEBT.md, es Nivel 3)
- "Es consistencia con etapa anterior"
- "Es trivial de revertir"
- "Resuelve un bug menor" (si está en TECH_DEBT.md, es Nivel 3)
Referencia completa: methodology/PATTERNS.md C.6 refinado +
methodology/ANTI_PATTERNS.md AP.8.
Ver `methodology/PATTERNS.md` C.6 y `methodology/ANTI_PATTERNS.md` AP.8.