diff --git a/frontend/components/OpportunityPrioritizer.tsx b/frontend/components/OpportunityPrioritizer.tsx index d8dc83f..2b3f5dd 100644 --- a/frontend/components/OpportunityPrioritizer.tsx +++ b/frontend/components/OpportunityPrioritizer.tsx @@ -14,6 +14,7 @@ import React, { useState, useMemo } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; +import { useTranslation } from 'react-i18next'; import { Opportunity, DrilldownDataPoint, AgenticTier } from '../types'; import { ChevronRight, @@ -115,6 +116,7 @@ const OpportunityPrioritizer: React.FC = ({ drilldownData, costPerHour = 20 }) => { + const { t } = useTranslation(); const [expandedId, setExpandedId] = useState(null); const [showAllOpportunities, setShowAllOpportunities] = useState(false); @@ -260,9 +262,9 @@ const OpportunityPrioritizer: React.FC = ({
-

Oportunidades Priorizadas

+

{t('opportunityPrioritizer.title')}

- {enrichedOpportunities.length} iniciativas ordenadas por potencial de ahorro y factibilidad + {t('opportunityPrioritizer.subtitle', { count: enrichedOpportunities.length })}

@@ -273,50 +275,50 @@ const OpportunityPrioritizer: React.FC = ({
- Ahorro Total Identificado + {t('opportunityPrioritizer.totalSavingsIdentified')}
€{(summary.totalSavings / 1000).toFixed(0)}K
-
anuales
+
{t('opportunityPrioritizer.annual')}
- Quick Wins (AUTOMATE) + {t('opportunityPrioritizer.quickWins')}
{summary.byTier.AUTOMATE.length}
- €{(summary.byTier.AUTOMATE.reduce((s, o) => s + o.savings, 0) / 1000).toFixed(0)}K en 3-6 meses + €{(summary.byTier.AUTOMATE.reduce((s, o) => s + o.savings, 0) / 1000).toFixed(0)}K {t('opportunityPrioritizer.inMonths', { count: '3-6' })}
- Asistencia (ASSIST) + {t('opportunityPrioritizer.assistance')}
{summary.byTier.ASSIST.length}
- €{(summary.byTier.ASSIST.reduce((s, o) => s + o.savings, 0) / 1000).toFixed(0)}K en 6-9 meses + €{(summary.byTier.ASSIST.reduce((s, o) => s + o.savings, 0) / 1000).toFixed(0)}K {t('opportunityPrioritizer.inMonths', { count: '6-9' })}
- Optimización (AUGMENT) + {t('opportunityPrioritizer.optimization')}
{summary.byTier.AUGMENT.length}
- €{(summary.byTier.AUGMENT.reduce((s, o) => s + o.savings, 0) / 1000).toFixed(0)}K en 9-12 meses + €{(summary.byTier.AUGMENT.reduce((s, o) => s + o.savings, 0) / 1000).toFixed(0)}K {t('opportunityPrioritizer.inMonths', { count: '9-12' })}
@@ -326,8 +328,8 @@ const OpportunityPrioritizer: React.FC = ({
- EMPIEZA AQUÍ - Prioridad #1 + {t('opportunityPrioritizer.startHere')} + {t('opportunityPrioritizer.priority1')}
@@ -343,7 +345,7 @@ const OpportunityPrioritizer: React.FC = ({ {topOpportunity.name.replace(/^[^\w\s]+\s*/, '')} - {TIER_CONFIG[topOpportunity.tier].label} • {TIER_CONFIG[topOpportunity.tier].description} + {t(`opportunityPrioritizer.tierLabels.${topOpportunity.tier.toLowerCase()}`)} • {TIER_CONFIG[topOpportunity.tier].description}
@@ -351,21 +353,21 @@ const OpportunityPrioritizer: React.FC = ({ {/* Key metrics */}
-
Ahorro Anual
+
{t('opportunityPrioritizer.annualSavings')}
€{(topOpportunity.savings / 1000).toFixed(0)}K
-
Volumen
+
{t('opportunityPrioritizer.volume')}
{topOpportunity.volume.toLocaleString()}
-
Timeline
+
{t('opportunityPrioritizer.timeline')}
- {topOpportunity.timelineMonths} meses + {topOpportunity.timelineMonths} {t('opportunityPrioritizer.months')}
@@ -397,7 +399,7 @@ const OpportunityPrioritizer: React.FC = ({

- Próximos Pasos + t("opportunityPrioritizer.nextSteps")

    {topOpportunity.nextSteps.map((step, i) => ( @@ -423,7 +425,7 @@ const OpportunityPrioritizer: React.FC = ({

    - Todas las Oportunidades Priorizadas + {t('opportunityPrioritizer.allOpportunities')}

    @@ -460,18 +462,18 @@ const OpportunityPrioritizer: React.FC = ({ {opp.name.replace(/^[^\w\s]+\s*/, '')} - {TIER_CONFIG[opp.tier].label} • {TIER_CONFIG[opp.tier].timeline} + {t(`opportunityPrioritizer.tierLabels.${opp.tier.toLowerCase()}`)} • {t(`opportunityPrioritizer.timelines.${opp.tier.toLowerCase()}`)}
    {/* Quick stats */}
    -
    Ahorro
    +
    {t('opportunityPrioritizer.savings')}
    €{(opp.savings / 1000).toFixed(0)}K
    -
    Volumen
    +
    {t('opportunityPrioritizer.volume')}
    {opp.volume.toLocaleString()}
    @@ -482,7 +484,7 @@ const OpportunityPrioritizer: React.FC = ({ {/* Visual bar: Value vs Effort */}
    -
    Valor / Esfuerzo
    +
    {t('opportunityPrioritizer.valueEffort')}
    = ({ {/* Next steps */}
    -
    Próximos Pasos
    +
    {t('opportunityPrioritizer.nextSteps')}
    {opp.nextSteps.map((step, i) => ( @@ -609,7 +611,7 @@ const OpportunityPrioritizer: React.FC = ({
    - Metodología de priorización: Las oportunidades se ordenan por potencial de ahorro TCO (volumen × tasa de contención × diferencial CPI). + {t('opportunityPrioritizer.methodology')} Las oportunidades se ordenan por potencial de ahorro TCO (volumen × tasa de contención × diferencial CPI). La clasificación de tier (AUTOMATE/ASSIST/AUGMENT) se basa en el Agentic Readiness Score considerando predictibilidad (CV AHT), resolutividad (FCR + Transfer), volumen, calidad de datos y simplicidad del proceso.
    diff --git a/frontend/locales/en.json b/frontend/locales/en.json index 073abaf..0da6f71 100644 --- a/frontend/locales/en.json +++ b/frontend/locales/en.json @@ -1820,5 +1820,41 @@ } } } + }, + "opportunityPrioritizer": { + "title": "Prioritized Opportunities", + "subtitle": "{{count}} initiatives ordered by savings potential and feasibility", + "whereAreOpportunities": "Where are opportunities?", + "totalSavingsIdentified": "Total Savings Identified", + "annual": "annual", + "quickWins": "Quick Wins (AUTOMATE)", + "assistance": "Assistance (ASSIST)", + "optimization": "Optimization (AUGMENT)", + "inMonths": "in {{months}} months", + "startHere": "START HERE", + "priority1": "Priority #1", + "annualSavings": "Annual Savings", + "volume": "Volume", + "timeline": "Timeline", + "months": "months", + "nextSteps": "Next Steps", + "allOpportunities": "All Prioritized Opportunities", + "savings": "Savings", + "valueEffort": "Value / Effort", + "value": "Value", + "effort": "Effort", + "viewMore": "View {{count}} more opportunities", + "methodology": "Prioritization methodology:", + "methodologyDescription": "Opportunities are ordered by TCO savings potential (volume × containment rate × CPI differential). AUTOMATE/ASSIST/AUGMENT tier classification is based on Agentic Readiness Score considering predictability (CV AHT), resolvability (FCR + Transfer), volume, data quality and process simplicity.", + "tierLabels": { + "automate": "Automate", + "assist": "Assist", + "augment": "Augment" + }, + "timelines": { + "automate": "3-6 months", + "assist": "6-9 months", + "augment": "9-12 months" + } } } \ No newline at end of file diff --git a/frontend/locales/es.json b/frontend/locales/es.json index 1719cb5..986343e 100644 --- a/frontend/locales/es.json +++ b/frontend/locales/es.json @@ -1804,5 +1804,41 @@ } } } + }, + "opportunityPrioritizer": { + "title": "Oportunidades Priorizadas", + "subtitle": "{{count}} iniciativas ordenadas por potencial de ahorro y factibilidad", + "whereAreOpportunities": "¿Dónde están las oportunidades?", + "totalSavingsIdentified": "Ahorro Total Identificado", + "annual": "anuales", + "quickWins": "Quick Wins (AUTOMATE)", + "assistance": "Asistencia (ASSIST)", + "optimization": "Optimización (AUGMENT)", + "inMonths": "en {{count}} meses", + "startHere": "EMPIEZA AQUÍ", + "priority1": "Prioridad #1", + "annualSavings": "Ahorro Anual", + "volume": "Volumen", + "timeline": "Timeline", + "months": "meses", + "nextSteps": "Próximos Pasos", + "allOpportunities": "Todas las Oportunidades Priorizadas", + "savings": "Ahorro", + "valueEffort": "Valor / Esfuerzo", + "value": "Valor", + "effort": "Esfuerzo", + "viewMore": "Ver {{count}} oportunidades más", + "methodology": "Metodología de priorización:", + "methodologyDescription": "Las oportunidades se ordenan por potencial de ahorro TCO (volumen × tasa de contención × diferencial CPI). La clasificación de tier AUTOMATE/ASSIST/AUGMENT se basa en el Agentic Readiness Score considerando predictibilidad (CV AHT), resolvibilidad (FCR + Transfer), volumen, calidad de datos y simplicidad del proceso.", + "tierLabels": { + "automate": "Automatizar", + "assist": "Asistir", + "augment": "Aumentar" + }, + "timelines": { + "automate": "3-6 meses", + "assist": "6-9 meses", + "augment": "9-12 meses" + } } } \ No newline at end of file