diff --git a/frontend/components/tabs/AgenticReadinessTab.tsx b/frontend/components/tabs/AgenticReadinessTab.tsx index f502d87..910cad4 100644 --- a/frontend/components/tabs/AgenticReadinessTab.tsx +++ b/frontend/components/tabs/AgenticReadinessTab.tsx @@ -1862,7 +1862,7 @@ function SkillClassificationSection({ drilldownData }: { drilldownData: Drilldow {/* Header */}

- CLASIFICACIÓN POR SKILL + {t('agenticReadiness.sections.classificationBySkill')}

@@ -1872,18 +1872,18 @@ function SkillClassificationSection({ drilldownData }: { drilldownData: Drilldow - - - - + + + + - - - - + + + + @@ -2298,7 +2298,7 @@ function ExpandableSkillRow({ // ============================================ // Configuración de colores y estilos por tier -const TIER_SECTION_CONFIG: Record = { +}> => ({ 'AUTOMATE': { color: '#10b981', bgColor: '#d1fae5', @@ -2316,9 +2316,9 @@ const TIER_SECTION_CONFIG: Record>(new Set()); - const config = TIER_SECTION_CONFIG[tier]; + const config = getTierSectionConfig(t)[tier]; const IconComponent = config.icon; // Extraer todas las colas del tier específico, agrupadas por skill @@ -2418,7 +2420,7 @@ function TierQueueSection({
{totalQueues} -

colas en {skillsWithTierQueues.length} skills

+

{t('agenticReadiness.sections.queuesIn', { count: skillsWithTierQueues.length })}

@@ -2427,14 +2429,14 @@ function TierQueueSection({
- Volumen: {totalVolume.toLocaleString()} int/mes + {t('agenticReadiness.sections.volumeColon')} {totalVolume.toLocaleString()} {t('agenticReadiness.table.int')}/{t('agenticReadiness.table.perMonth').replace('/', '')} - Coste: {formatCurrency(totalCost)}/año + {t('agenticReadiness.sections.costColon')} {formatCurrency(totalCost)}{t('agenticReadiness.table.perYear')}
- Ahorro potencial: {formatCurrency(potentialSavings)}/año + {t('agenticReadiness.sections.potentialSavingsColon')} {formatCurrency(potentialSavings)}{t('agenticReadiness.table.perYear')}
@@ -2444,13 +2446,13 @@ function TierQueueSection({
- - - - - - - + + + + + + + @@ -2510,14 +2512,14 @@ function TierQueueSection({
SkillVolumenDistribución Colas por TierAcción{t('agenticReadiness.table.skill')}{t('agenticReadiness.table.volume')}{t('agenticReadiness.classification.distribution')}{t('agenticReadiness.classification.action')}
AUTOASISTAUGMHUMAN{t('agenticReadiness.classification.auto')}{t('agenticReadiness.classification.assist')}{t('agenticReadiness.classification.augm')}{t('agenticReadiness.classification.human')}
Business Unit (Skill)ColasVolumenAHT Prom.CV Prom.FCRAhorro Potencial{t('agenticReadiness.table.businessUnit')}{t('agenticReadiness.table.queues')}{t('agenticReadiness.table.volume')}{t('agenticReadiness.table.avgAht')}{t('agenticReadiness.table.avgCv')}{t('agenticReadiness.table.fcr')}{t('agenticReadiness.table.potentialSavings')}
- - - - - - - - + + + + + + + + @@ -2570,9 +2572,9 @@ function TierQueueSection({ } // Componente para colas HUMAN-ONLY agrupadas por razón/red flag -function HumanOnlyByReasonSection({ drilldownData, redFlagConfigs }: { drilldownData: DrilldownDataPoint[]; redFlagConfigs: RedFlagConfig[] }) { +function HumanOnlyByReasonSection({ drilldownData, redFlagConfigs, t }: { drilldownData: DrilldownDataPoint[]; redFlagConfigs: RedFlagConfig[]; t: any }) { const [expandedReasons, setExpandedReasons] = useState>(new Set()); - const config = TIER_SECTION_CONFIG['HUMAN-ONLY']; + const config = getTierSectionConfig(t)['HUMAN-ONLY']; // Extraer todas las colas HUMAN-ONLY const allHumanOnlyQueues = drilldownData.flatMap(skill => @@ -2665,7 +2667,7 @@ function HumanOnlyByReasonSection({ drilldownData, redFlagConfigs }: { drilldown
{totalQueues} -

colas agrupadas por {reasonGroups.length} razones

+

{t('agenticReadiness.summary.groupedBy', { count: reasonGroups.length })}

@@ -2673,10 +2675,10 @@ function HumanOnlyByReasonSection({ drilldownData, redFlagConfigs }: { drilldown {/* Resumen */}
- Volumen total: {totalVolume.toLocaleString()} int/mes + {t('agenticReadiness.humanOnlyReasons.volumeTotal')} {totalVolume.toLocaleString()} {t('agenticReadiness.table.int')}/{t('agenticReadiness.table.perMonth').replace('/', '')} - Estas colas requieren intervención antes de considerar automatización + {t('agenticReadiness.summary.requiresIntervention')}
@@ -2686,10 +2688,10 @@ function HumanOnlyByReasonSection({ drilldownData, redFlagConfigs }: { drilldown
- - - - + + + + @@ -2742,13 +2744,13 @@ function HumanOnlyByReasonSection({ drilldownData, redFlagConfigs }: { drilldown
Cola (ID)VolumenAHTCVTransferFCRScoreAhorro{t('agenticReadiness.table.queueId')}{t('agenticReadiness.table.volume')}{t('agenticReadiness.table.aht')}{t('agenticReadiness.table.cv')}{t('agenticReadiness.table.transfer')}{t('agenticReadiness.table.fcr')}{t('agenticReadiness.table.score')}{t('agenticReadiness.table.savingsPerMonth')}
Razón / Red FlagColasVolumenAcción Recomendada{t('agenticReadiness.table.reason')}{t('agenticReadiness.table.queues')}{t('agenticReadiness.table.volume')}{t('agenticReadiness.table.recommendedAction')}
- - - - - - - + + + + + + + @@ -2864,10 +2866,10 @@ function PriorityCandidatesSection({ drilldownData, redFlagConfigs, t }: { drill

- CLASIFICACIÓN POR TIER DE AUTOMATIZACIÓN + {t('agenticReadiness.sections.classificationByTier')}

- Skills con colas clasificadas como AUTOMATE (score ≥ 7.5, CV ≤ 75%, transfer ≤ 20%) + {t('agenticReadiness.classification.subtitle')}

@@ -3729,16 +3731,16 @@ export function AgenticReadinessTab({ data, onTabChange }: AgenticReadinessTabPr {data.drilldownData && data.drilldownData.length > 0 ? ( <> {/* TABLA 1: Colas AUTOMATE - Listas para automatización */} - + {/* TABLA 2: Colas ASSIST - Candidatas a Copilot */} - + {/* TABLA 3: Colas AUGMENT - Requieren optimización */} - + {/* TABLA 4: Colas HUMAN-ONLY - Agrupadas por razón/red flag */} - + ) : ( /* Fallback a tabla por Línea de Negocio si no hay drilldown data */ diff --git a/frontend/components/tabs/RoadmapTab.tsx b/frontend/components/tabs/RoadmapTab.tsx index f420807..13fddd6 100644 --- a/frontend/components/tabs/RoadmapTab.tsx +++ b/frontend/components/tabs/RoadmapTab.tsx @@ -1160,11 +1160,11 @@ function WaveCard({

{formatCurrency(wave.costoRecurrenteAnual)}

-

Ahorro/año

+

{t('roadmap.comparison.savingsPerYear')}

{formatCurrency(wave.ahorroAnual)}

-

Margen/año

+

{t('roadmap.comparison.marginPerYear')}

{formatCurrency(margenAnual)}

@@ -1248,11 +1248,11 @@ function ScenarioComparison({ escenarios }: { escenarios: EscenarioData[] }) {

- Escenarios de Inversión + {t('roadmap.comparison.title')}

- Comparación de opciones según nivel de compromiso - + {t('roadmap.comparison.subtitle')} + ℹ️

@@ -1262,20 +1262,20 @@ function ScenarioComparison({ escenarios }: { escenarios: EscenarioData[] }) {
Cola (ID)SkillVolumenCV AHTTransferScoreRed Flags{t('agenticReadiness.table.queueId')}{t('agenticReadiness.table.skill')}{t('agenticReadiness.table.volume')}{t('agenticReadiness.table.cv')}{t('agenticReadiness.table.transfer')}{t('agenticReadiness.table.score')}{t('agenticReadiness.table.redFlags')}
- - - + + + - - + + - + @@ -1296,10 +1296,10 @@ function ScenarioComparison({ escenarios }: { escenarios: EscenarioData[] }) { @@ -1566,7 +1566,7 @@ function RoadmapTimeline({ waves }: { waves: WaveData[] }) { {formatCurrency(wave.inversionSetup)}
- Ahorro: + {t('roadmap.comparison.savingsLabel')} {formatCurrency(wave.ahorroAnual)}
@@ -1574,7 +1574,7 @@ function RoadmapTimeline({ waves }: { waves: WaveData[] }) { {/* Conditional badge */} {wave.esCondicional && (
- Condicional + {t('roadmap.comparison.conditional')}
)} @@ -1584,7 +1584,7 @@ function RoadmapTimeline({ waves }: { waves: WaveData[] }) { wave.riesgo === 'medio' ? 'bg-amber-500 text-white' : 'bg-red-500 text-white' }`}> - {wave.riesgo === 'bajo' ? '● Bajo' : wave.riesgo === 'medio' ? '● Medio' : '● Alto'} + ● {t(`roadmap.comparison.risk${wave.riesgo.charAt(0).toUpperCase() + wave.riesgo.slice(1)}`)} diff --git a/frontend/locales/en.json b/frontend/locales/en.json index c007f4b..b2809c5 100644 --- a/frontend/locales/en.json +++ b/frontend/locales/en.json @@ -686,9 +686,13 @@ "legendRisk": "= Risk" }, "comparison": { + "title": "Investment Scenarios", + "subtitle": "Comparison of options by commitment level", + "tooltip": "ROI based on industry benchmarks. Adjusted ROI considers implementation risk factors.", "investment": "Investment", "recurring": "Recurring", "savings": "Savings", + "adjusted": "adjusted", "margin": "Margin", "payback": "Payback", "roi3y": "3y ROI", @@ -697,7 +701,18 @@ "recommendation": "Recommendation", "recommendationEnabler": "Recommendation (Enabler)", "enabler": "Enabler", - "recommended": "Recommended" + "recommended": "Recommended", + "savingsPerYear": "Savings/year", + "marginPerYear": "Margin/year", + "savingsLabel": "Savings:", + "conditional": "Conditional", + "riskLow": "Low", + "riskMedium": "Medium", + "riskHigh": "High", + "enablerWaveTooltip": "Enabler wave - its value is in unlocking subsequent waves", + "negativeMarginTooltip": "Negative annual margin", + "projectedRoiTooltip": "Projected ROI. Validate with pilot.", + "adjustedRoiTooltip": "ROI adjusted for implementation risk" }, "entryCriteria": { "wave1TierFrom": "HUMAN-ONLY (4), AUGMENT (3)", @@ -1186,6 +1201,53 @@ "notRecommended": "Not recommended for automation at this time", "bronzeAnalysis": "Bronze analysis does not include Agentic Readiness Score" } + }, + "table": { + "queueId": "Queue (original_queue_id)", + "volume": "Volume", + "aht": "AHT", + "cv": "CV", + "transfer": "Transfer", + "fcr": "FCR", + "score": "Score", + "tier": "Tier", + "redFlags": "Red Flags", + "savingsPerMonth": "Savings/mo", + "total": "TOTAL", + "skill": "Skill", + "queues": "Queues", + "avgAht": "Avg AHT", + "avgCv": "Avg CV", + "potentialSavings": "Potential Savings", + "dominantTier": "Dominant Tier", + "perYear": "/year" + }, + "summary": { + "queuesAnalyzed": "queues analyzed", + "volumeInIndividualQueues": "of volume is in individual queues", + "balancedDistribution": "Balanced distribution across tiers. Review individual queues for prioritization.", + "clickToExpand": "Click on a skill to see individual queue details" + }, + "emptyStates": { + "noQueuesClassifiedAs": "No queues classified as {{tier}}", + "noQueuesMatchFilters": "No queues match the selected filters" + }, + "sections": { + "classificationBySkill": "CLASSIFICATION BY SKILL", + "classificationByTier": "CLASSIFICATION BY AUTOMATION TIER", + "queuesAutomate": "Queues AUTOMATE", + "readyForFullAutomation": "Ready for full automation with virtual agent (Score ≥7.5)", + "queuesAssist": "Queues ASSIST", + "candidatesForCopilot": "Candidates for Copilot - AI assists human agent (Score 5.5-7.5)", + "queuesAugment": "Queues AUGMENT", + "requireOptimization": "Require prior optimization: standardize processes, reduce variability (Score 3.5-5.5)", + "queuesHumanOnly": "Queues HUMAN-ONLY", + "notSuitableForAutomation": "Not suitable for automation: insufficient volume, low data quality, or extreme complexity", + "queuesIn": "queues in {{count}} skills", + "costPerYear": "/year", + "volumeColon": "Volume:", + "costColon": "Cost:", + "potentialSavingsColon": "Potential savings:" } }, "economicModel": { diff --git a/frontend/locales/es.json b/frontend/locales/es.json index ae4a811..ea61f0e 100644 --- a/frontend/locales/es.json +++ b/frontend/locales/es.json @@ -686,9 +686,13 @@ "legendRisk": "= Riesgo" }, "comparison": { + "title": "Escenarios de Inversión", + "subtitle": "Comparación de opciones según nivel de compromiso", + "tooltip": "ROI basado en benchmarks de industria. El ROI ajustado considera factores de riesgo de implementación.", "investment": "Inversión", "recurring": "Recurrente", "savings": "Ahorro", + "adjusted": "ajustado", "margin": "Margen", "payback": "Payback", "roi3y": "ROI 3a", @@ -697,7 +701,18 @@ "recommendation": "Recomendación", "recommendationEnabler": "Recomendación (Habilitador)", "enabler": "Habilitador", - "recommended": "Recomendado" + "recommended": "Recomendado", + "savingsPerYear": "Ahorro/año", + "marginPerYear": "Margen/año", + "savingsLabel": "Ahorro:", + "conditional": "Condicional", + "riskLow": "Bajo", + "riskMedium": "Medio", + "riskHigh": "Alto", + "enablerWaveTooltip": "Wave habilitadora - su valor está en desbloquear waves posteriores", + "negativeMarginTooltip": "Margen anual negativo", + "projectedRoiTooltip": "ROI proyectado. Validar con piloto.", + "adjustedRoiTooltip": "ROI ajustado por riesgo de implementación" }, "entryCriteria": { "wave1TierFrom": "HUMAN-ONLY (4), AUGMENT (3)", @@ -945,10 +960,17 @@ "strategicSkill": "Queue Skill (Estratégico)", "volume": "Volumen", "volumePerMonth": "int/mes", + "aht": "AHT", + "cv": "CV", + "fcr": "FCR", "ahtAvg": "AHT Prom.", "cvAvg": "CV Prom.", + "avgAht": "AHT Prom.", + "avgCv": "CV Prom.", "savingsPotential": "Ahorro Potencial", + "potentialSavings": "Ahorro Potencial", "dominantTier": "Tier Dom.", + "tier": "Tier", "transfer": "Transfer", "redFlags": "Red Flags", "savingsPerMonth": "Ahorro/mes", @@ -970,6 +992,9 @@ "tierAutoAssist": "(Tier AUTOMATE + ASSIST)", "interactions": "interacciones", "queuesAnalyzed": "colas analizadas", + "volumeInIndividualQueues": "del volumen está en colas individuales", + "balancedDistribution": "Distribución equilibrada entre tiers. Revisar colas individuales para priorización.", + "clickToExpand": "Click en un skill para ver el detalle de colas individuales", "interpretation": "Interpretación:", "interpretationText": "El {{pct}}% representa el volumen de interacciones automatizables (AUTOMATE + ASSIST). Solo el {{queuePct}}% de las colas ({{count}} de {{total}}) son AUTOMATE, pero concentran {{volumePct}}% del volumen total. Esto indica pocas colas de alto volumen automatizables - oportunidad concentrada en Quick Wins de alto impacto.", "inSkills": "en {{count}} skills", @@ -984,6 +1009,27 @@ "activeFilters": "Filtros activos:", "of": "de" }, + "emptyStates": { + "noQueuesClassifiedAs": "No hay colas clasificadas como {{tier}}", + "noQueuesMatchFilters": "No hay colas que cumplan los filtros seleccionados" + }, + "sections": { + "classificationBySkill": "CLASIFICACIÓN POR SKILL", + "classificationByTier": "CLASIFICACIÓN POR TIER DE AUTOMATIZACIÓN", + "queuesAutomate": "Colas AUTOMATE", + "readyForFullAutomation": "Listas para automatización completa con agente virtual (Score ≥7.5)", + "queuesAssist": "Colas ASSIST", + "candidatesForCopilot": "Candidatas a Copilot - IA asiste al agente humano (Score 5.5-7.5)", + "queuesAugment": "Colas AUGMENT", + "requireOptimization": "Requieren optimización previa: estandarizar procesos, reducir variabilidad (Score 3.5-5.5)", + "queuesHumanOnly": "Colas HUMAN-ONLY", + "notSuitableForAutomation": "No aptas para automatización: volumen insuficiente, calidad de datos baja o complejidad extrema", + "queuesIn": "colas en {{count}} skills", + "costPerYear": "/año", + "volumeColon": "Volumen:", + "costColon": "Coste:", + "potentialSavingsColon": "Ahorro potencial:" + }, "opportunityMap": { "title": "Mapa de Oportunidades", "subtitle": "Tamaño = Volumen · Color = Tier · Posición = Score vs Ahorro TCO",
EscenarioInversiónRecurrente{t('roadmap.comparison.scenario')}{t('roadmap.comparison.investment')}{t('roadmap.comparison.recurring')} - Ahorro - (ajustado) + {t('roadmap.comparison.savings')} + ({t('roadmap.comparison.adjusted')}) MargenPayback{t('roadmap.comparison.margin')}{t('roadmap.comparison.payback')} - ROI 3a - (ajustado) + {t('roadmap.comparison.roi3y')} + ({t('roadmap.comparison.adjusted')}) Riesgo{t('roadmap.comparison.risk')}
{esc.esHabilitador && ( - 💡 + 💡 )} {!esc.esRentable && !esc.esHabilitador && ( - + )} {roiInfo.text} {roiInfo.isHighWarning && ( - ⚠️ + ⚠️ )} {roiInfo.showAjustado && esc.roi3AnosAjustado > 0 && ( - - ({esc.roi3AnosAjustado.toFixed(1)}% ajust.) + + ({esc.roi3AnosAjustado.toFixed(1)}% {t('roadmap.comparison.adjusted').slice(0, 5)}.) )}
@@ -1396,7 +1396,7 @@ function ScenarioComparison({ escenarios }: { escenarios: EscenarioData[] }) {
- {esc.riesgo.charAt(0).toUpperCase() + esc.riesgo.slice(1)} + {t(`roadmap.comparison.risk${esc.riesgo.charAt(0).toUpperCase() + esc.riesgo.slice(1)}`)}