fix: Consistent CPI calculations and correct benchmark data
1. DimensionAnalysisTab: Changed CPI fallback from 2.33 to 0 to match
ExecutiveSummaryTab calculation
2. ExecutiveSummaryTab: Fixed benchmark data for inverted metrics (CPI, Abandono)
- Values must be in ASCENDING order (p25 < p50 < p75 < p90)
- p25 = best performers (lowest CPI/abandono)
- p90 = worst performers (highest CPI/abandono)
- This fixes the visual comparison and gap calculation
Before: cpi { p25: 4.50, p50: 3.50, p75: 2.80, p90: 2.20 } (DESCENDING - wrong)
After: cpi { p25: 2.20, p50: 3.50, p75: 4.50, p90: 5.50 } (ASCENDING - correct)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -62,16 +62,17 @@ function generateCausalAnalysis(
|
||||
}
|
||||
|
||||
// v3.11: CPI consistente con Executive Summary
|
||||
const CPI_TCO = 2.33;
|
||||
const CPI_TCO = 2.33; // Benchmark para cálculos de impacto cuando no hay CPI real
|
||||
// Usar CPI pre-calculado de heatmapData si existe, sino calcular desde annual_cost/cost_volume
|
||||
// IMPORTANTE: Mismo cálculo que ExecutiveSummaryTab para consistencia
|
||||
const totalCostVolume = heatmapData.reduce((sum, h) => sum + (h.cost_volume || h.volume), 0);
|
||||
const totalAnnualCost = heatmapData.reduce((sum, h) => sum + (h.annual_cost || 0), 0);
|
||||
const hasCpiField = heatmapData.some(h => h.cpi !== undefined && h.cpi > 0);
|
||||
const CPI = hasCpiField
|
||||
? (totalCostVolume > 0
|
||||
? heatmapData.reduce((sum, h) => sum + (h.cpi || 0) * (h.cost_volume || h.volume), 0) / totalCostVolume
|
||||
: CPI_TCO)
|
||||
: (totalCostVolume > 0 ? totalAnnualCost / totalCostVolume : CPI_TCO);
|
||||
: 0)
|
||||
: (totalCostVolume > 0 ? totalAnnualCost / totalCostVolume : 0);
|
||||
|
||||
// Calcular métricas agregadas
|
||||
const avgCVAHT = totalVolume > 0
|
||||
|
||||
Reference in New Issue
Block a user