erp-construccion/docs/02-definicion-modulos/MAI-006-reportes-analytics/historias-usuario/US-BI-006-simulacion-escenarios.md

640 lines
30 KiB
Markdown

# US-BI-006: Simulacion de Escenarios What-If
**Epica:** MAI-006 - Reportes y Business Intelligence
**Sprint:** 21
**Story Points:** 5
**Prioridad:** Media
**Asignado a:** Backend + Frontend
---
## Historia de Usuario
**Como** Planner (Planificador de Proyectos)
**Quiero** simular escenarios "que pasaria si" cambiando variables clave del proyecto
**Para** evaluar el impacto de decisiones antes de ejecutarlas y elegir la mejor opcion
---
## Criterios de Aceptacion
### 1. Acceso al Simulador de Escenarios
- [ ] Puedo acceder al simulador desde el dashboard del proyecto
- [ ] Veo el estado actual del proyecto como "Escenario Base"
- [ ] Puedo crear hasta 5 escenarios simultaneos para comparar
- [ ] Cada escenario tiene un nombre descriptivo y color distintivo
- [ ] Los escenarios se guardan automaticamente
### 2. Variables Ajustables del Simulador
- [ ] Puedo ajustar las siguientes variables con sliders o inputs:
- **Duracion del proyecto:** ±30% del plazo original
- **Costo de materiales:** ±20% del precio actual
- **Costo de mano de obra:** ±15% del costo actual
- **Productividad:** ±25% de la productividad base
- **Tamaño del equipo:** ±5 personas
- **Horario de trabajo:** Normal, Turno extra, 24/7
- **Calidad de materiales:** Economica, Estandar, Premium
- **Subcontratacion:** % de trabajo subcontratado (0-100%)
- **Contingencia:** % adicional para imprevistos (0-20%)
- **Financiamiento:** Tasa de interes (0-15%)
- [ ] Cada variable muestra valor minimo, maximo y actual
- [ ] Los sliders tienen marcas para valores comunes
### 3. Impacto Calculado Automaticamente
- [ ] Al ajustar cualquier variable, el sistema calcula automaticamente:
- **Costo Total Final:** Nuevo costo estimado del proyecto
- **Duracion Total:** Nueva fecha estimada de termino
- **Margen de Utilidad:** % de utilidad final
- **ROI:** Retorno sobre inversion
- **Flujo de Efectivo:** Necesidad maxima de capital
- **Nivel de Riesgo:** Bajo, Medio, Alto
- [ ] Los calculos se actualizan en tiempo real (<500ms)
- [ ] Veo indicadores visuales de cambio (↑↓) vs escenario base
### 4. Comparacion de Escenarios
- [ ] Veo una tabla comparativa de todos los escenarios creados:
```
| Metrica | Base | Escenario A | Escenario B | Escenario C |
|------------------|---------|-------------|-------------|-------------|
| Costo Final | $45.2M | $42.8M | $48.5M | $46.1M |
| Duracion (dias) | 350 | 380 | 320 | 350 |
| Margen (%) | 18.0% | 21.5% | 15.2% | 19.3% |
| ROI (%) | 21.0% | 24.8% | 17.5% | 22.1% |
| Riesgo | Medio | Bajo | Alto | Medio |
```
- [ ] Puedo ordenar por cualquier metrica
- [ ] Las celdas se colorean segun mejor/peor que base (verde/rojo)
### 5. Graficas de Comparacion
- [ ] Veo graficas comparando escenarios:
- **Grafica de Barras:** Costo, Duracion, Margen de cada escenario
- **Grafica Radar:** Multiples metricas por escenario
- **Grafica de Dispersion:** Costo vs Duracion (trade-off)
- **Grafica de Gantt Comparativa:** Cronogramas lado a lado
- [ ] Puedo seleccionar que escenarios mostrar en graficas
- [ ] Las graficas son interactivas (zoom, tooltips)
### 6. Analisis de Sensibilidad
- [ ] Veo un analisis de sensibilidad mostrando:
- Que variables tienen mas impacto en el resultado
- Grafica de tornado con impacto de cada variable
- Rangos de variacion aceptables
- [ ] Ejemplo:
```
Impacto en Costo Final 10% cambio en variable):
1. Costo Materiales: ±$3.2M ████████████████
2. Productividad: ±$2.1M ██████████
3. Costo Mano de Obra: ±$1.8M █████████
4. Tamaño Equipo: ±$0.9M ████
5. Contingencia: ±$0.5M ██
```
- [ ] Puedo hacer clic en variable para ver detalle de sensibilidad
### 7. Escenarios Predefinidos
- [ ] El sistema incluye escenarios predefinidos comunes:
- **Fast Track:** Terminar 20% mas rapido (con sobrecosto)
- **Low Cost:** Reducir costo 15% (con mas tiempo)
- **High Quality:** Usar materiales premium (+10% costo)
- **Crash Project:** Terminar en tiempo minimo (maximo costo)
- **Balanced:** Optimizar costo y tiempo
- [ ] Puedo cargar un escenario predefinido como punto de partida
- [ ] Puedo guardar mis escenarios personalizados como templates
### 8. Recomendaciones del Sistema
- [ ] El sistema sugiere el mejor escenario basado en criterios:
- Maximizar ROI
- Minimizar costo
- Minimizar tiempo
- Balance costo-tiempo
- Minimizar riesgo
- [ ] Veo una recomendacion con justificacion:
```
📌 Recomendado: Escenario B "Balanced"
Razon: Ofrece el mejor balance entre costo, tiempo y riesgo.
- Ahorra $2.4M vs escenario rapido
- Solo 15 dias mas que el mas rapido
- Riesgo: Bajo (vs Alto del escenario rapido)
```
- [ ] Puedo cambiar el criterio de optimizacion
### 9. Guardar y Compartir Escenarios
- [ ] Puedo guardar escenarios con nombre descriptivo
- [ ] Puedo compartir escenarios con mi equipo
- [ ] Puedo exportar comparacion de escenarios a:
- PDF ejecutivo con graficas
- Excel con datos detallados
- PowerPoint para presentaciones
- [ ] El archivo exportado incluye supuestos de cada escenario
### 10. Aplicar Escenario al Proyecto
- [ ] Puedo marcar un escenario como "Aprobado"
- [ ] Al aprobar, puedo generar:
- Nueva version del presupuesto
- Nueva version del programa de obra
- Plan de accion con cambios necesarios
- [ ] Se registra que escenario fue aplicado y cuando
- [ ] Puedo hacer seguimiento: Escenario vs Realidad
---
## Mockup / Wireframe
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 🔬 Simulador de Escenarios What-If - Proyecto: Los Pinos │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ Escenarios Activos ─────────────────────────────────────────────────────┐│
│ │ ││
│ │ [🔵 Base] [🟢 Optimizado] [🟡 Fast Track] [🔴 Low Cost] [+ Nuevo] ││
│ │ ││
│ │ Escenario Activo: 🟢 Optimizado [💾 Guardar] [🗑️ Borrar]││
│ └───────────────────────────────────────────────────────────────────────────┘│
│ │
│ ┌─ Variables Ajustables ───────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 📅 Duracion del Proyecto │ │
│ │ [●────────────────●────────] 350 dias │ │
│ │ 245d Base: 350d 455d │ │
│ │ │ │
│ │ 🧱 Costo de Materiales (+/- %) │ │
│ │ [──────────●─────────────────] -5% │ │
│ │ -20% Base: 0% +20% │ │
│ │ │ │
│ │ 👷 Costo de Mano de Obra (+/- %) │ │
│ │ [──────────────●─────────────] +3% │ │
│ │ -15% Base: 0% +15% │ │
│ │ │ │
│ │ ⚡ Productividad (+/- %) │ │
│ │ [───────────────────●────────] +12% │ │
│ │ -25% Base: 0% +25% │ │
│ │ │ │
│ │ 👥 Tamaño del Equipo │ │
│ │ [──────────●─────────────────] 18 personas │ │
│ │ 10 Base: 15 20 │ │
│ │ │ │
│ │ ⏰ Horario de Trabajo │ │
│ │ ( ) Normal (●) Turno Extra ( ) 24/7 │ │
│ │ │ │
│ │ 🎯 Calidad de Materiales │ │
│ │ ( ) Economica (●) Estandar ( ) Premium │ │
│ │ │ │
│ │ 🤝 Subcontratacion (%) │ │
│ │ [────────●───────────────────] 25% │ │
│ │ 0% Base: 15% 100% │ │
│ │ │ │
│ │ [🔄 Restablecer] [📋 Cargar Template] [💾 Guardar como Template] │ │
│ └───────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Impacto Calculado ──────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Costo Total │ │ Duracion │ │ Margen │ │ ROI │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ $43.6M │ │ 335 dias │ │ 20.8% │ │ 24.2% │ │ │
│ │ │ 🟢 -3.5% │ │ 🟢 -15d │ │ 🟢 +2.8% │ │ 🟢 +3.2% │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Flujo Max │ │ Fecha Term. │ │ Riesgo │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ $8.2M │ │ 15/10/2025 │ │ 🟡 Medio │ │ │
│ │ │ 🟢 -$1.1M │ │ 🟢 -16d │ │ ✓ Aceptable│ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Comparacion de Escenarios ──────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────────────────────┐ │ │
│ │ │Metrica │🔵 Base │🟢 Optimiz│🟡 Fast Tr│🔴 Low Cost│Mejor │ │ │
│ │ ├─────────────────────────────────────────────────────────────────────┤ │ │
│ │ │Costo Final │$45.2M │$43.6M 🏆 │$52.8M │$41.2M 🏆 │Low Cost│ │ │
│ │ │Duracion (d) │350 │335 🏆 │280 🏆 │390 │Fast Tr│ │ │
│ │ │Margen (%) │18.0% │20.8% 🏆 │12.5% │19.5% │Optimiz│ │ │
│ │ │ROI (%) │21.0% │24.2% 🏆 │15.8% │22.5% │Optimiz│ │ │
│ │ │Riesgo │Medio │Medio │Alto │Bajo 🏆 │Low Cost│ │ │
│ │ └─────────────────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ Grafica Costo vs Duracion ──────────┬─ Analisis de Sensibilidad ───────┐ │
│ │ │ │ │
│ │ $M │ Impacto en Costo (tornado): │ │
│ │ 54│ 🟡 Fast │ │ │
│ │ 50│ Track │ Materiales │████████████│ ±$3.2M│ │
│ │ 46│ 🔵 Base │ Productiv. │██████████ │ ±$2.1M│ │
│ │ 42│ 🔴 Low 🟢 Optimiz. │ Mano Obra │█████████ │ ±$1.8M│ │
│ │ 38│ Cost │ Equipo │████ │ ±$0.9M│ │
│ │ 0└────────────────────────── │ Horario │███ │ ±$0.7M│ │
│ │ 250 300 350 400 dias │ │ │
│ │ │ Variable mas critica: Materiales │ │
│ └───────────────────────────────────────┴───────────────────────────────────┘ │
│ │
│ ┌─ Recomendacion del Sistema ──────────────────────────────────────────────┐ │
│ │ │ │
│ │ 📌 Escenario Recomendado: 🟢 Optimizado │ │
│ │ │ │
│ │ Razon: Mejor balance entre costo, tiempo, margen y riesgo │ │
│ │ │ │
│ │ ✓ Ahorra $1.6M vs escenario base │ │
│ │ ✓ Termina 15 dias antes │ │
│ │ ✓ Incrementa margen en 2.8 puntos porcentuales │ │
│ │ ✓ Nivel de riesgo aceptable (Medio) │ │
│ │ │ │
│ │ Supuestos clave: │ │
│ │ • Reduccion 5% en costos de materiales (via negociacion) │ │
│ │ • Incremento 12% en productividad (via capacitacion) │ │
│ │ • Turno extra en actividades criticas │ │
│ │ │ │
│ │ [✅ Aprobar Escenario] [📊 Ver Detalles] [✏️ Ajustar] │ │
│ └───────────────────────────────────────────────────────────────────────────┘ │
│ │
│ [📥 Exportar Comparacion] [📧 Compartir] [⚙️ Criterios de Optimizacion] │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## Flujo de Trabajo
```
1. ACCEDER AL SIMULADOR
Dashboard de Proyecto → Tab "Simulador What-If"
Sistema carga escenario base con valores actuales del proyecto
2. CREAR NUEVO ESCENARIO
Usuario hace clic en [+ Nuevo Escenario]
Modal: Nombre del escenario: "Optimizado"
Se crea escenario como copia del base
Escenario "Optimizado" queda activo para edicion
3. AJUSTAR VARIABLES
Usuario mueve slider "Costo Materiales" a -5%
Sistema recalcula impacto en tiempo real:
- Costo Total: $45.2M → $43.0M
- Margen: 18.0% → 19.5%
Usuario ajusta "Productividad" a +12%
Sistema recalcula:
- Duracion: 350d → 335d
- Costo MO: Reduccion por eficiencia
Impacto total se muestra en tarjetas
4. COMPARAR ESCENARIOS
Usuario crea escenario "Fast Track"
- Duracion: -20% (280 dias)
- Horario: 24/7
- Tamaño equipo: +5 personas
Sistema calcula:
- Costo: $52.8M (+16.8%)
- Margen: 12.5%
- Riesgo: Alto
Tabla comparativa se actualiza con 3 escenarios
5. ANALIZAR SENSIBILIDAD
Usuario hace clic en [Analisis de Sensibilidad]
Sistema ejecuta variacion ±10% en cada variable
Grafica de tornado muestra:
- Materiales: Mayor impacto (±$3.2M)
- Productividad: Segundo mayor (±$2.1M)
Usuario identifica variables criticas a controlar
6. REVISAR RECOMENDACION
Sistema analiza los 3 escenarios
Algoritmo de optimizacion evalua:
- ROI de cada escenario
- Balance costo-tiempo
- Nivel de riesgo
Recomendacion: "Optimizado" (mejor ROI con riesgo medio)
Justificacion se muestra al usuario
7. APROBAR Y APLICAR ESCENARIO
Usuario revisa escenario "Optimizado"
Hace clic en [✅ Aprobar Escenario]
Modal de confirmacion:
- Se generara nueva version del presupuesto
- Se ajustara el programa de obra
- Se creara plan de accion
Usuario confirma
Sistema:
- Marca escenario como "Aprobado"
- Registra fecha y usuario
- Genera plan de accion con cambios necesarios
8. EXPORTAR PARA PRESENTACION
Usuario hace clic en [Exportar Comparacion]
Selecciona formato: PowerPoint
Sistema genera PPTX con:
- Slide 1: Resumen de escenarios
- Slide 2: Tabla comparativa
- Slide 3: Graficas de costo vs duracion
- Slide 4: Analisis de sensibilidad
- Slide 5: Recomendacion
- Slide 6: Supuestos de cada escenario
Archivo listo para junta con cliente/direccion
```
---
## Notas Tecnicas
### Motor de Calculo de Escenarios
```typescript
// Interface de escenario
interface Scenario {
id: string;
name: string;
color: string;
baseProjectId: string;
variables: ScenarioVariables;
calculatedImpact: CalculatedImpact;
createdBy: string;
createdAt: Date;
status: 'draft' | 'approved' | 'archived';
}
// Variables ajustables
interface ScenarioVariables {
durationMultiplier: number; // 0.7 a 1.3 (±30%)
materialCostMultiplier: number; // 0.8 a 1.2 (±20%)
laborCostMultiplier: number; // 0.85 a 1.15 (±15%)
productivityMultiplier: number; // 0.75 a 1.25 (±25%)
teamSize: number; // base ±5
workSchedule: 'normal' | 'overtime' | '24x7';
materialQuality: 'economic' | 'standard' | 'premium';
subcontractingPercentage: number; // 0 a 100
contingencyPercentage: number; // 0 a 20
financingRate: number; // 0 a 15
}
// Impacto calculado
interface CalculatedImpact {
totalCost: number;
duration: number;
completionDate: Date;
profitMargin: number;
roi: number;
maxCashflow: number;
riskLevel: 'low' | 'medium' | 'high';
}
// Funcion de calculo principal
function calculateScenarioImpact(
baseProject: Project,
variables: ScenarioVariables
): CalculatedImpact {
// 1. Calcular costo de materiales
const baseMaterialCost = baseProject.budget.materials;
const materialCost = baseMaterialCost * variables.materialCostMultiplier;
// Ajuste por calidad
const qualityMultiplier = {
'economic': 0.85,
'standard': 1.0,
'premium': 1.20
};
const adjustedMaterialCost = materialCost * qualityMultiplier[variables.materialQuality];
// 2. Calcular costo de mano de obra
const baseLaborCost = baseProject.budget.labor;
const laborCost = baseLaborCost * variables.laborCostMultiplier;
// Ajuste por horario
const scheduleMultiplier = {
'normal': 1.0,
'overtime': 1.25,
'24x7': 1.50
};
const adjustedLaborCost = laborCost * scheduleMultiplier[variables.workSchedule];
// 3. Calcular duracion
const baseDuration = baseProject.schedule.totalDays;
let duration = baseDuration * variables.durationMultiplier;
// Ajuste por productividad
duration = duration / variables.productivityMultiplier;
// Ajuste por tamaño de equipo
const teamSizeEffect = variables.teamSize / baseProject.teamSize;
duration = duration / Math.sqrt(teamSizeEffect); // Ley de rendimientos decrecientes
// Ajuste por horario
const scheduleDurationMultiplier = {
'normal': 1.0,
'overtime': 0.85,
'24x7': 0.70
};
duration = duration * scheduleDurationMultiplier[variables.workSchedule];
// 4. Calcular costo de subcontratacion
const totalWorkCost = adjustedMaterialCost + adjustedLaborCost;
const subcontractingCost = totalWorkCost * (variables.subcontractingPercentage / 100) * 1.15;
// 5. Calcular costo total
const directCost = adjustedMaterialCost + adjustedLaborCost + subcontractingCost;
const contingency = directCost * (variables.contingencyPercentage / 100);
const indirectCost = directCost * 0.08; // 8% gastos indirectos
const totalCost = directCost + contingency + indirectCost;
// 6. Calcular financiamiento
const financingCost = totalCost * (variables.financingRate / 100) * (duration / 365);
const finalCost = totalCost + financingCost;
// 7. Calcular metricas financieras
const revenue = baseProject.contractAmount;
const profit = revenue - finalCost;
const profitMargin = (profit / revenue) * 100;
const roi = (profit / finalCost) * 100;
// 8. Estimar flujo de efectivo maximo
const avgMonthlyCost = finalCost / (duration / 30);
const maxCashflow = avgMonthlyCost * 2; // Peak typically 2x average
// 9. Calcular nivel de riesgo
const riskLevel = calculateRiskLevel({
profitMargin,
durationCompression: baseDuration / duration,
workSchedule: variables.workSchedule,
contingency: variables.contingencyPercentage
});
// 10. Calcular fecha de termino
const completionDate = addBusinessDays(baseProject.startDate, duration);
return {
totalCost: finalCost,
duration: Math.round(duration),
completionDate,
profitMargin,
roi,
maxCashflow,
riskLevel
};
}
// Calculo de nivel de riesgo
function calculateRiskLevel(factors: any): 'low' | 'medium' | 'high' {
let riskScore = 0;
// Margen bajo = mas riesgo
if (factors.profitMargin < 10) riskScore += 3;
else if (factors.profitMargin < 15) riskScore += 2;
else if (factors.profitMargin < 20) riskScore += 1;
// Compresion alta = mas riesgo
if (factors.durationCompression > 1.3) riskScore += 3;
else if (factors.durationCompression > 1.15) riskScore += 2;
else if (factors.durationCompression > 1.0) riskScore += 1;
// Horario intensivo = mas riesgo
if (factors.workSchedule === '24x7') riskScore += 2;
else if (factors.workSchedule === 'overtime') riskScore += 1;
// Contingencia baja = mas riesgo
if (factors.contingency < 5) riskScore += 2;
else if (factors.contingency < 10) riskScore += 1;
// Clasificacion final
if (riskScore >= 6) return 'high';
if (riskScore >= 3) return 'medium';
return 'low';
}
```
### Analisis de Sensibilidad
```typescript
// Analisis de sensibilidad (tornado chart)
function performSensitivityAnalysis(
baseProject: Project,
baseScenario: ScenarioVariables
): SensitivityResult[] {
const results: SensitivityResult[] = [];
const variationPercentage = 0.10; // ±10%
const variables = [
'materialCostMultiplier',
'laborCostMultiplier',
'productivityMultiplier',
'teamSize',
'subcontractingPercentage',
'contingencyPercentage'
];
for (const variable of variables) {
// Escenario con variable +10%
const scenarioHigh = { ...baseScenario };
scenarioHigh[variable] = baseScenario[variable] * (1 + variationPercentage);
const impactHigh = calculateScenarioImpact(baseProject, scenarioHigh);
// Escenario con variable -10%
const scenarioLow = { ...baseScenario };
scenarioLow[variable] = baseScenario[variable] * (1 - variationPercentage);
const impactLow = calculateScenarioImpact(baseProject, scenarioLow);
// Calcular rango de impacto
const costImpactRange = Math.abs(impactHigh.totalCost - impactLow.totalCost);
const durationImpactRange = Math.abs(impactHigh.duration - impactLow.duration);
results.push({
variable,
costImpact: costImpactRange,
durationImpact: durationImpactRange,
importance: costImpactRange // Ordenar por impacto en costo
});
}
// Ordenar por importancia
return results.sort((a, b) => b.importance - a.importance);
}
```
### Endpoints Necesarios
```typescript
// Escenarios
POST /api/scenarios // Crear escenario
GET /api/scenarios/project/:projectId // Listar escenarios
GET /api/scenarios/:id // Obtener escenario
PUT /api/scenarios/:id // Actualizar variables
DELETE /api/scenarios/:id // Eliminar escenario
POST /api/scenarios/:id/approve // Aprobar escenario
// Calculos
POST /api/scenarios/:id/calculate // Calcular impacto
POST /api/scenarios/compare // Comparar multiples escenarios
POST /api/scenarios/:id/sensitivity // Analisis de sensibilidad
// Templates
GET /api/scenario-templates // Listar templates
POST /api/scenarios/from-template/:id // Crear desde template
POST /api/scenarios/:id/save-as-template // Guardar como template
// Recomendaciones
POST /api/scenarios/recommend // Obtener recomendacion
// Exportacion
POST /api/scenarios/export-comparison // Exportar comparacion
```
---
## Definicion de "Done"
- [ ] Simulador de escenarios accesible desde dashboard
- [ ] 10 variables ajustables con sliders funcionales
- [ ] Calculo de impacto en tiempo real (<500ms)
- [ ] Creacion de hasta 5 escenarios simultaneos
- [ ] Tabla comparativa de escenarios
- [ ] Graficas de comparacion (barras, radar, dispersion)
- [ ] Analisis de sensibilidad con tornado chart
- [ ] 5 escenarios predefinidos incluidos
- [ ] Sistema de recomendacion funcional
- [ ] Guardar y compartir escenarios
- [ ] Exportacion a PDF, Excel y PowerPoint
- [ ] Aprobacion de escenarios
- [ ] Calculo de nivel de riesgo automatico
- [ ] Tests unitarios de formulas de calculo
- [ ] Performance: calculo <500ms
- [ ] Documentacion de formulas
- [ ] Validado con Planners y Directores
---
**Estimacion:** 5 Story Points
**Dependencias:** Requiere MAI-002 (Proyectos), MAI-003 (Presupuestos)
**Fecha:** 2025-11-18