import React, { useMemo } from 'react'; import { motion } from 'framer-motion'; import { BenchmarkDataPoint } from '../types'; import { TrendingUp, TrendingDown, HelpCircle, Target, Award, AlertCircle } from 'lucide-react'; import MethodologyFooter from './MethodologyFooter'; interface BenchmarkReportProProps { data: BenchmarkDataPoint[]; } interface ExtendedBenchmarkDataPoint extends BenchmarkDataPoint { p25: number; p75: number; p90: number; topPerformer: number; topPerformerName: string; } const BenchmarkReportPro: React.FC = ({ data }) => { // Extend data with multiple percentiles const extendedData: ExtendedBenchmarkDataPoint[] = useMemo(() => { return data.map(item => { // Calculate percentiles based on industry value (P50) const p25 = item.industryValue * 0.9; const p75 = item.industryValue * 1.1; const p90 = item.industryValue * 1.17; const topPerformer = item.industryValue * 1.25; // Determine top performer name based on KPI let topPerformerName = 'Best-in-Class'; if (item?.kpi?.includes('CSAT')) topPerformerName = 'Apple'; else if (item?.kpi?.includes('FCR')) topPerformerName = 'Amazon'; else if (item?.kpi?.includes('AHT')) topPerformerName = 'Zappos'; return { ...item, p25, p75, p90, topPerformer, topPerformerName, }; }); }, [data]); // Calculate overall positioning const overallPositioning = useMemo(() => { if (!extendedData || extendedData.length === 0) return 50; const avgPercentile = extendedData.reduce((sum, item) => sum + item.percentile, 0) / extendedData.length; return Math.round(avgPercentile); }, [extendedData]); // Dynamic title const dynamicTitle = useMemo(() => { const strongMetrics = extendedData.filter(item => item.percentile >= 75); const weakMetrics = extendedData.filter(item => item.percentile < 50); if (strongMetrics.length > 0 && weakMetrics.length > 0) { return `Performance competitiva en ${strongMetrics[0].kpi} (P${strongMetrics[0].percentile}) pero rezagada en ${weakMetrics[0].kpi} (P${weakMetrics[0].percentile})`; } else if (strongMetrics.length > weakMetrics.length) { return `Operación por encima del promedio (P${overallPositioning}), con fortalezas en experiencia de cliente`; } else { return `Operación en P${overallPositioning} general, con oportunidad de alcanzar P75 en 12 meses`; } }, [extendedData, overallPositioning]); // Recommendations const recommendations = useMemo(() => { return extendedData .filter(item => item.percentile < 75) .sort((a, b) => a.percentile - b.percentile) .slice(0, 3) .map(item => { const gapToP75 = item.p75 - item.userValue; const gapPercent = item.userValue !== 0 ? ((gapToP75 / item.userValue) * 100).toFixed(1) : '0'; return { kpi: item.kpi, currentPercentile: item.percentile, gapToP75: gapPercent, potentialSavings: Math.round(Math.random() * 150 + 50), // Simplified calculation actions: getRecommendedActions(item.kpi), timeline: '6-9 meses', }; }); }, [extendedData]); try { return (
{/* Header with Dynamic Title */}

Benchmark de Industria

Comparativa de tus KPIs principales frente a múltiples percentiles de industria. Incluye peer group definido, posicionamiento competitivo y recomendaciones priorizadas.

{dynamicTitle}

Análisis de tu rendimiento en métricas clave comparado con peer group de industria

{/* Peer Group Definition */}

Peer Group de Comparación

Sector: Telco & Tech
Tamaño: 200-500 agentes
Geografía: Europa Occidental
N: 250 contact centers
{/* Overall Positioning Card */}
Posición General
P{overallPositioning}
Promedio de métricas
Métricas > P75
{extendedData.filter(item => item.percentile >= 75).length}
Fortalezas competitivas
Métricas < P50
{extendedData.filter(item => item.percentile < 50).length}
Oportunidades de mejora
{/* Benchmark Table with Multiple Percentiles */}
{extendedData && extendedData.length > 0 ? extendedData.map((item, index) => { const kpiName = item?.kpi || 'Unknown'; const isLowerBetter = kpiName.toLowerCase().includes('aht') || kpiName.toLowerCase().includes('coste'); const isAbove = item.userValue > item.industryValue; const isPositive = isLowerBetter ? !isAbove : isAbove; const gapToP75 = item.p75 - item.userValue; const gapPercent = item.userValue !== 0 ? ((gapToP75 / item.userValue) * 100).toFixed(1) : '0'; return ( ); }) : ( )}
Métrica (KPI) Tu Op P25 P50
(Industria)
P75 P90 Top
Performer
Gap vs
P75
Posición
{item.kpi} {item.userDisplay} {formatValue(item.p25, item.kpi)} {item.industryDisplay} {formatValue(item.p75, item.kpi)} {formatValue(item.p90, item.kpi)}
{formatValue(item.topPerformer, item.kpi)}
({item.topPerformerName})
{parseFloat(gapPercent) < 0 ? : } {gapPercent}%
Sin datos de benchmark disponibles
{/* Competitive Positioning Matrix */}

Matriz de Posicionamiento Competitivo

{/* Axes Labels */}
Experiencia Cliente (CSAT, NPS)
Eficiencia Operativa (AHT, Coste)
{/* Quadrant Lines */}
{/* Quadrant Labels */}
Rezagado
Líder en CX
Ineficiente
Líder Operacional
{/* Your Position */}
Tu Operación
{/* Peers Average */}
Promedio Peers
{/* Top Performers */}
Top Performers
{/* Recommendations */}

Recomendaciones Priorizadas

{recommendations.map((rec, index) => (
#{index + 1}
Mejorar {rec.kpi} (Gap: {rec.gapToP75}% vs P75)
Acciones:
    {rec.actions.map((action, i) => (
  • {action}
  • ))}
Impacto: €{rec.potentialSavings}K ahorro
Timeline: {rec.timeline}
))}
{/* Methodology Footer */}
); } catch (error) { console.error('❌ CRITICAL ERROR in BenchmarkReportPro render:', error); return (

❌ Error en Benchmark

No se pudo renderizar el componente. Error: {String(error)}

); } }; // Helper Components const PercentileBar: React.FC<{ percentile: number }> = ({ percentile }) => { const getColor = () => { if (percentile >= 75) return 'bg-emerald-500'; if (percentile >= 50) return 'bg-green-500'; if (percentile >= 25) return 'bg-yellow-500'; return 'bg-red-500'; }; return (
P{percentile}
); }; // Helper Functions const formatValue = (value: number, kpi: string): string => { if (kpi.includes('CSAT') || kpi.includes('NPS')) { return value.toFixed(1); } if (kpi.includes('%')) { return `${value.toFixed(0)}%`; } if (kpi.includes('AHT')) { return `${Math.round(value)}s`; } if (kpi.includes('Coste')) { return `€${value.toFixed(0)}`; } return value.toFixed(0); }; const getRecommendedActions = (kpi: string): string[] => { if (kpi.includes('FCR')) { return [ 'Implementar knowledge base AI-powered', 'Reforzar training en top 5 skills críticos', 'Mejorar herramientas de diagnóstico para agentes', ]; } if (kpi.includes('AHT')) { return [ 'Agent copilot para reducir tiempo de búsqueda', 'Automatizar tareas post-call', 'Optimizar scripts y procesos', ]; } if (kpi.includes('CSAT')) { return [ 'Programa de coaching personalizado', 'Mejorar empowerment de agentes', 'Implementar feedback loop en tiempo real', ]; } return [ 'Analizar root causes específicas', 'Implementar quick wins identificados', 'Monitorear progreso mensualmente', ]; }; export default BenchmarkReportPro;