Merge pull request #10 from sujucu70/claude/check-agent-readiness-status-Exnpc

Claude/check agent readiness status exnpc
This commit is contained in:
sujucu70
2026-02-07 19:18:18 +01:00
committed by GitHub
4 changed files with 192 additions and 54 deletions

View File

@@ -2007,12 +2007,14 @@ function ExpandableSkillRow({
dataPoint, dataPoint,
idx, idx,
isExpanded, isExpanded,
onToggle onToggle,
redFlagConfigs
}: { }: {
dataPoint: DrilldownDataPoint; dataPoint: DrilldownDataPoint;
idx: number; idx: number;
isExpanded: boolean; isExpanded: boolean;
onToggle: () => void; onToggle: () => void;
redFlagConfigs: RedFlagConfig[];
}) { }) {
// v3.4: Contar colas por Tier // v3.4: Contar colas por Tier
const tierCounts = { const tierCounts = {
@@ -2326,10 +2328,12 @@ const TIER_SECTION_CONFIG: Record<AgenticTier, {
// Componente de tabla de colas por Tier (AUTOMATE, ASSIST, AUGMENT) // Componente de tabla de colas por Tier (AUTOMATE, ASSIST, AUGMENT)
function TierQueueSection({ function TierQueueSection({
drilldownData, drilldownData,
tier tier,
redFlagConfigs
}: { }: {
drilldownData: DrilldownDataPoint[]; drilldownData: DrilldownDataPoint[];
tier: 'AUTOMATE' | 'ASSIST' | 'AUGMENT'; tier: 'AUTOMATE' | 'ASSIST' | 'AUGMENT';
redFlagConfigs: RedFlagConfig[];
}) { }) {
const [expandedSkills, setExpandedSkills] = useState<Set<string>>(new Set()); const [expandedSkills, setExpandedSkills] = useState<Set<string>>(new Set());
const config = TIER_SECTION_CONFIG[tier]; const config = TIER_SECTION_CONFIG[tier];
@@ -2536,7 +2540,7 @@ function TierQueueSection({
} }
// Componente para colas HUMAN-ONLY agrupadas por razón/red flag // Componente para colas HUMAN-ONLY agrupadas por razón/red flag
function HumanOnlyByReasonSection({ drilldownData }: { drilldownData: DrilldownDataPoint[] }) { function HumanOnlyByReasonSection({ drilldownData, redFlagConfigs }: { drilldownData: DrilldownDataPoint[]; redFlagConfigs: RedFlagConfig[] }) {
const [expandedReasons, setExpandedReasons] = useState<Set<string>>(new Set()); const [expandedReasons, setExpandedReasons] = useState<Set<string>>(new Set());
const config = TIER_SECTION_CONFIG['HUMAN-ONLY']; const config = TIER_SECTION_CONFIG['HUMAN-ONLY'];
@@ -3692,16 +3696,16 @@ export function AgenticReadinessTab({ data, onTabChange }: AgenticReadinessTabPr
{data.drilldownData && data.drilldownData.length > 0 ? ( {data.drilldownData && data.drilldownData.length > 0 ? (
<> <>
{/* TABLA 1: Colas AUTOMATE - Listas para automatización */} {/* TABLA 1: Colas AUTOMATE - Listas para automatización */}
<TierQueueSection drilldownData={data.drilldownData} tier="AUTOMATE" /> <TierQueueSection drilldownData={data.drilldownData} tier="AUTOMATE" redFlagConfigs={redFlagConfigs} />
{/* TABLA 2: Colas ASSIST - Candidatas a Copilot */} {/* TABLA 2: Colas ASSIST - Candidatas a Copilot */}
<TierQueueSection drilldownData={data.drilldownData} tier="ASSIST" /> <TierQueueSection drilldownData={data.drilldownData} tier="ASSIST" redFlagConfigs={redFlagConfigs} />
{/* TABLA 3: Colas AUGMENT - Requieren optimización */} {/* TABLA 3: Colas AUGMENT - Requieren optimización */}
<TierQueueSection drilldownData={data.drilldownData} tier="AUGMENT" /> <TierQueueSection drilldownData={data.drilldownData} tier="AUGMENT" redFlagConfigs={redFlagConfigs} />
{/* TABLA 4: Colas HUMAN-ONLY - Agrupadas por razón/red flag */} {/* TABLA 4: Colas HUMAN-ONLY - Agrupadas por razón/red flag */}
<HumanOnlyByReasonSection drilldownData={data.drilldownData} /> <HumanOnlyByReasonSection drilldownData={data.drilldownData} redFlagConfigs={redFlagConfigs} />
</> </>
) : ( ) : (
/* Fallback a tabla por Línea de Negocio si no hay drilldown data */ /* Fallback a tabla por Línea de Negocio si no hay drilldown data */

View File

@@ -1217,11 +1217,11 @@ function Law10SummaryRoadmap({
<table className="w-full text-sm"> <table className="w-full text-sm">
<thead> <thead>
<tr className="border-b border-gray-200 bg-gray-50"> <tr className="border-b border-gray-200 bg-gray-50">
<th className="text-left py-3 px-3 font-medium text-gray-600">Requisito</th> <th className="text-left py-3 px-3 font-medium text-gray-600">{t('law10.summaryTable.requirement')}</th>
<th className="text-left py-3 px-3 font-medium text-gray-600">Descripcion</th> <th className="text-left py-3 px-3 font-medium text-gray-600">{t('law10.summaryTable.description')}</th>
<th className="text-center py-3 px-3 font-medium text-gray-600">Estado</th> <th className="text-center py-3 px-3 font-medium text-gray-600">{t('law10.summaryTable.status')}</th>
<th className="text-center py-3 px-3 font-medium text-gray-600">Score</th> <th className="text-center py-3 px-3 font-medium text-gray-600">{t('law10.summaryTable.score')}</th>
<th className="text-left py-3 px-3 font-medium text-gray-600">Gap</th> <th className="text-left py-3 px-3 font-medium text-gray-600">{t('law10.summaryTable.gap')}</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -1271,40 +1271,40 @@ function Law10SummaryRoadmap({
<div className="flex flex-wrap gap-4 mb-6 p-3 bg-gray-50 rounded-lg text-xs"> <div className="flex flex-wrap gap-4 mb-6 p-3 bg-gray-50 rounded-lg text-xs">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<CheckCircle className="w-4 h-4 text-emerald-500" /> <CheckCircle className="w-4 h-4 text-emerald-500" />
<span className="text-gray-600">Cumple: Requisito satisfecho</span> <span className="text-gray-600">{t('law10.summaryTable.legend.complies')}</span>
</div> </div>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<AlertTriangle className="w-4 h-4 text-amber-500" /> <AlertTriangle className="w-4 h-4 text-amber-500" />
<span className="text-gray-600">Parcial: Requiere mejoras</span> <span className="text-gray-600">{t('law10.summaryTable.legend.partial')}</span>
</div> </div>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<XCircle className="w-4 h-4 text-red-500" /> <XCircle className="w-4 h-4 text-red-500" />
<span className="text-gray-600">No Cumple: Accion urgente</span> <span className="text-gray-600">{t('law10.summaryTable.legend.notComply')}</span>
</div> </div>
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<HelpCircle className="w-4 h-4 text-gray-400" /> <HelpCircle className="w-4 h-4 text-gray-400" />
<span className="text-gray-600">Sin Datos: Campos no disponibles en CSV</span> <span className="text-gray-600">{t('law10.summaryTable.legend.noData')}</span>
</div> </div>
</div> </div>
{/* Inversion Estimada */} {/* Inversion Estimada */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 p-4 bg-gray-50 rounded-lg"> <div className="grid grid-cols-1 md:grid-cols-3 gap-4 p-4 bg-gray-50 rounded-lg">
<div className="text-center"> <div className="text-center">
<p className="text-xs text-gray-500 mb-1">Coste de no cumplimiento</p> <p className="text-xs text-gray-500 mb-1">{t('law10.summaryTable.investment.nonComplianceCost')}</p>
<p className="text-xl font-bold text-red-600">Hasta 100K</p> <p className="text-xl font-bold text-red-600">{t('law10.summaryTable.investment.upTo100k')}</p>
<p className="text-xs text-gray-400">Multas potenciales/infraccion</p> <p className="text-xs text-gray-400">{t('law10.summaryTable.investment.potentialFines')}</p>
</div> </div>
<div className="text-center"> <div className="text-center">
<p className="text-xs text-gray-500 mb-1">Inversion recomendada</p> <p className="text-xs text-gray-500 mb-1">{t('law10.summaryTable.investment.recommendedInvestment')}</p>
<p className="text-xl font-bold text-blue-600">{formatCurrency(estimatedInvestment())}</p> <p className="text-xl font-bold text-blue-600">{formatCurrency(estimatedInvestment())}</p>
<p className="text-xs text-gray-400">Basada en tu operacion</p> <p className="text-xs text-gray-400">{t('law10.summaryTable.investment.basedOnOperation')}</p>
</div> </div>
<div className="text-center"> <div className="text-center">
<p className="text-xs text-gray-500 mb-1">ROI de cumplimiento</p> <p className="text-xs text-gray-500 mb-1">{t('law10.summaryTable.investment.complianceRoi')}</p>
<p className="text-xl font-bold text-emerald-600"> <p className="text-xl font-bold text-emerald-600">
{data.economicModel?.roi3yr ? `${Math.round(data.economicModel.roi3yr / 2)}%` : 'Alto'} {data.economicModel?.roi3yr ? `${Math.round(data.economicModel.roi3yr / 2)}%` : 'Alto'}
</p> </p>
<p className="text-xs text-gray-400">Evitar sanciones + mejora CX</p> <p className="text-xs text-gray-400">{t('law10.summaryTable.investment.avoidSanctions')}</p>
</div> </div>
</div> </div>
</Card> </Card>
@@ -1313,29 +1313,31 @@ function Law10SummaryRoadmap({
// Seccion: Resumen de Madurez de Datos // Seccion: Resumen de Madurez de Datos
function DataMaturitySummary({ data }: { data: AnalysisData }) { function DataMaturitySummary({ data }: { data: AnalysisData }) {
const { t } = useTranslation();
// Usar datos economicos reales cuando esten disponibles // Usar datos economicos reales cuando esten disponibles
const currentAnnualCost = data.economicModel?.currentAnnualCost || 0; const currentAnnualCost = data.economicModel?.currentAnnualCost || 0;
const annualSavings = data.economicModel?.annualSavings || 0; const annualSavings = data.economicModel?.annualSavings || 0;
// Datos disponibles // Datos disponibles
const availableData = [ const availableData = [
{ name: 'Cobertura temporal 24/7', article: 'Art. 14' }, { name: t('law10.dataMaturity.items.coverage247'), article: t('law10.dataMaturity.article', { number: '14' }) },
{ name: 'Distribucion geografica', article: 'Art. 15 parcial' }, { name: t('law10.dataMaturity.items.geoDistribution'), article: t('law10.dataMaturity.articlePartial', { number: '15' }) },
{ name: 'Calidad resolucion proxy', article: 'Art. 17 indirecto' }, { name: t('law10.dataMaturity.items.resolutionQuality'), article: t('law10.dataMaturity.articleIndirect', { number: '17' }) },
]; ];
// Datos estimables // Datos estimables
const estimableData = [ const estimableData = [
{ name: 'ASA <3min via proxy abandono', article: 'Art. 8.2', error: '±10%' }, { name: t('law10.dataMaturity.items.asa3min'), article: t('law10.dataMaturity.article', { number: '8.2' }), error: t('law10.dataMaturity.errorMargin', { margin: '10' }) },
{ name: 'Lenguas cooficiales via pais', article: 'Art. 15', error: 'sin detalle' }, { name: t('law10.dataMaturity.items.officialLanguages'), article: t('law10.dataMaturity.article', { number: '15' }), error: t('law10.dataMaturity.noDetail') },
]; ];
// Datos no disponibles // Datos no disponibles
const missingData = [ const missingData = [
{ name: 'Tiempo resolucion casos', article: 'Art. 17' }, { name: t('law10.dataMaturity.items.caseResolutionTime'), article: t('law10.dataMaturity.article', { number: '17' }) },
{ name: 'Cobros indebidos <5 dias', article: 'Art. 17' }, { name: t('law10.dataMaturity.items.undueBilling'), article: t('law10.dataMaturity.article', { number: '17' }) },
{ name: 'Transfer a supervisor', article: 'Art. 8' }, { name: t('law10.dataMaturity.items.supervisorTransfer'), article: t('law10.dataMaturity.article', { number: '8' }) },
{ name: 'Info incidencias <2h', article: 'Art. 17' }, { name: t('law10.dataMaturity.items.incidentInfo'), article: t('law10.dataMaturity.article', { number: '17' }) },
{ name: 'Auditoria ENAC', article: 'Art. 22', note: 'requiere contratacion externa' }, { name: t('law10.dataMaturity.items.enacAudit'), article: t('law10.dataMaturity.article', { number: '22' }), note: t('law10.dataMaturity.items.externalContractRequired') },
]; ];
return ( return (
@@ -1344,17 +1346,17 @@ function DataMaturitySummary({ data }: { data: AnalysisData }) {
<div className="p-2 bg-indigo-100 rounded-lg"> <div className="p-2 bg-indigo-100 rounded-lg">
<TrendingUp className="w-5 h-5 text-indigo-600" /> <TrendingUp className="w-5 h-5 text-indigo-600" />
</div> </div>
<h3 className="font-semibold text-gray-900 text-lg">Resumen: Madurez de Datos para Compliance</h3> <h3 className="font-semibold text-gray-900 text-lg">{t('law10.dataMaturity.title')}</h3>
</div> </div>
<p className="text-sm text-gray-600 mb-4">Tu nivel actual de instrumentacion:</p> <p className="text-sm text-gray-600 mb-4">{t('law10.dataMaturity.currentLevel')}</p>
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6"> <div className="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
{/* Datos disponibles */} {/* Datos disponibles */}
<div className="p-4 bg-emerald-50 border border-emerald-200 rounded-lg"> <div className="p-4 bg-emerald-50 border border-emerald-200 rounded-lg">
<div className="flex items-center gap-2 mb-3"> <div className="flex items-center gap-2 mb-3">
<CheckCircle className="w-5 h-5 text-emerald-600" /> <CheckCircle className="w-5 h-5 text-emerald-600" />
<p className="font-semibold text-emerald-800">DATOS DISPONIBLES (3/10)</p> <p className="font-semibold text-emerald-800">{t('law10.dataMaturity.availableData')}</p>
</div> </div>
<ul className="space-y-2 text-sm"> <ul className="space-y-2 text-sm">
{availableData.map((item, idx) => ( {availableData.map((item, idx) => (
@@ -1370,7 +1372,7 @@ function DataMaturitySummary({ data }: { data: AnalysisData }) {
<div className="p-4 bg-amber-50 border border-amber-200 rounded-lg"> <div className="p-4 bg-amber-50 border border-amber-200 rounded-lg">
<div className="flex items-center gap-2 mb-3"> <div className="flex items-center gap-2 mb-3">
<AlertTriangle className="w-5 h-5 text-amber-600" /> <AlertTriangle className="w-5 h-5 text-amber-600" />
<p className="font-semibold text-amber-800">DATOS ESTIMABLES (2/10)</p> <p className="font-semibold text-amber-800">{t('law10.dataMaturity.estimableData')}</p>
</div> </div>
<ul className="space-y-2 text-sm"> <ul className="space-y-2 text-sm">
{estimableData.map((item, idx) => ( {estimableData.map((item, idx) => (
@@ -1386,7 +1388,7 @@ function DataMaturitySummary({ data }: { data: AnalysisData }) {
<div className="p-4 bg-red-50 border border-red-200 rounded-lg"> <div className="p-4 bg-red-50 border border-red-200 rounded-lg">
<div className="flex items-center gap-2 mb-3"> <div className="flex items-center gap-2 mb-3">
<XCircle className="w-5 h-5 text-red-600" /> <XCircle className="w-5 h-5 text-red-600" />
<p className="font-semibold text-red-800">NO DISPONIBLES (5/10)</p> <p className="font-semibold text-red-800">{t('law10.dataMaturity.unavailableData')}</p>
</div> </div>
<ul className="space-y-2 text-sm"> <ul className="space-y-2 text-sm">
{missingData.map((item, idx) => ( {missingData.map((item, idx) => (
@@ -1406,28 +1408,28 @@ function DataMaturitySummary({ data }: { data: AnalysisData }) {
<div className="p-4 bg-gray-50 rounded-lg"> <div className="p-4 bg-gray-50 rounded-lg">
<div className="flex items-center gap-2 mb-4"> <div className="flex items-center gap-2 mb-4">
<Lightbulb className="w-5 h-5 text-amber-500" /> <Lightbulb className="w-5 h-5 text-amber-500" />
<p className="font-semibold text-gray-800">INVERSION SUGERIDA PARA COMPLIANCE COMPLETO</p> <p className="font-semibold text-gray-800">{t('law10.dataMaturity.investment.title')}</p>
</div> </div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 mb-4"> <div className="grid grid-cols-1 md:grid-cols-2 gap-4 mb-4">
{/* Fase 1 */} {/* Fase 1 */}
<div className="p-3 bg-white rounded border border-gray-200"> <div className="p-3 bg-white rounded border border-gray-200">
<p className="font-medium text-gray-800 mb-2">Fase 1 - Instrumentacion (Q1 2026)</p> <p className="font-medium text-gray-800 mb-2">{t('law10.dataMaturity.investment.phase1.title')}</p>
<ul className="space-y-1 text-sm text-gray-600"> <ul className="space-y-1 text-sm text-gray-600">
<li className="flex justify-between"> <li className="flex justify-between">
<span> Tracking ASA real</span> <span>{t('law10.dataMaturity.investment.phase1.realAsaTracking')}</span>
<span className="font-semibold">5-8K</span> <span className="font-semibold">5-8K</span>
</li> </li>
<li className="flex justify-between"> <li className="flex justify-between">
<span> Sistema ticketing/casos</span> <span>{t('law10.dataMaturity.investment.phase1.ticketingSystem')}</span>
<span className="font-semibold">15-25K</span> <span className="font-semibold">15-25K</span>
</li> </li>
<li className="flex justify-between"> <li className="flex justify-between">
<span> Enriquecimiento lenguas</span> <span>{t('law10.dataMaturity.investment.phase1.languageEnrichment')}</span>
<span className="font-semibold">2K</span> <span className="font-semibold">2K</span>
</li> </li>
<li className="flex justify-between border-t border-gray-100 pt-1 mt-1"> <li className="flex justify-between border-t border-gray-100 pt-1 mt-1">
<span className="font-medium">Subtotal:</span> <span className="font-medium">{t('law10.dataMaturity.investment.phase1.subtotal')}</span>
<span className="font-bold text-blue-600">22-35K</span> <span className="font-bold text-blue-600">22-35K</span>
</li> </li>
</ul> </ul>
@@ -1435,22 +1437,22 @@ function DataMaturitySummary({ data }: { data: AnalysisData }) {
{/* Fase 2 */} {/* Fase 2 */}
<div className="p-3 bg-white rounded border border-gray-200"> <div className="p-3 bg-white rounded border border-gray-200">
<p className="font-medium text-gray-800 mb-2">Fase 2 - Operaciones (Q2-Q3 2026)</p> <p className="font-medium text-gray-800 mb-2">{t('law10.dataMaturity.investment.phase2.title')}</p>
<ul className="space-y-1 text-sm text-gray-600"> <ul className="space-y-1 text-sm text-gray-600">
<li className="flex justify-between"> <li className="flex justify-between">
<span> Cobertura 24/7 (chatbot + on-call)</span> <span>{t('law10.dataMaturity.investment.phase2.coverage247')}</span>
<span className="font-semibold">65K/año</span> <span className="font-semibold">65K/año</span>
</li> </li>
<li className="flex justify-between"> <li className="flex justify-between">
<span> Copilot IA (reducir AHT)</span> <span>{t('law10.dataMaturity.investment.phase2.aiCopilot')}</span>
<span className="font-semibold">35K + 8K/mes</span> <span className="font-semibold">35K + 8K/mes</span>
</li> </li>
<li className="flex justify-between"> <li className="flex justify-between">
<span> Auditor ENAC</span> <span>{t('law10.dataMaturity.investment.phase2.enacAuditor')}</span>
<span className="font-semibold">12-18K/año</span> <span className="font-semibold">12-18K/año</span>
</li> </li>
<li className="flex justify-between border-t border-gray-100 pt-1 mt-1"> <li className="flex justify-between border-t border-gray-100 pt-1 mt-1">
<span className="font-medium">Subtotal año 1:</span> <span className="font-medium">{t('law10.dataMaturity.investment.phase2.subtotalYear1')}</span>
<span className="font-bold text-blue-600">112-118K</span> <span className="font-bold text-blue-600">112-118K</span>
</li> </li>
</ul> </ul>
@@ -1460,21 +1462,21 @@ function DataMaturitySummary({ data }: { data: AnalysisData }) {
{/* Totales - usar datos reales cuando disponibles */} {/* Totales - usar datos reales cuando disponibles */}
<div className="grid grid-cols-3 gap-4 pt-4 border-t border-gray-200"> <div className="grid grid-cols-3 gap-4 pt-4 border-t border-gray-200">
<div className="text-center"> <div className="text-center">
<p className="text-xs text-gray-500 mb-1">Inversion Total</p> <p className="text-xs text-gray-500 mb-1">{t('law10.dataMaturity.investment.totals.totalInvestment')}</p>
<p className="text-xl font-bold text-blue-600"> <p className="text-xl font-bold text-blue-600">
{currentAnnualCost > 0 ? formatCurrency(Math.round(currentAnnualCost * 0.05)) : '134-153K'} {currentAnnualCost > 0 ? formatCurrency(Math.round(currentAnnualCost * 0.05)) : '134-153K'}
</p> </p>
<p className="text-xs text-gray-400">~5% coste anual</p> <p className="text-xs text-gray-400">{t('law10.dataMaturity.investment.totals.percentAnnualCost')}</p>
</div> </div>
<div className="text-center"> <div className="text-center">
<p className="text-xs text-gray-500 mb-1">Riesgo Evitado</p> <p className="text-xs text-gray-500 mb-1">{t('law10.dataMaturity.investment.totals.riskAvoided')}</p>
<p className="text-xl font-bold text-red-600"> <p className="text-xl font-bold text-red-600">
{currentAnnualCost > 0 ? formatCurrency(Math.min(1000000, currentAnnualCost * 0.3)) : '750K-1M'} {currentAnnualCost > 0 ? formatCurrency(Math.min(1000000, currentAnnualCost * 0.3)) : '750K-1M'}
</p> </p>
<p className="text-xs text-gray-400">sanciones potenciales</p> <p className="text-xs text-gray-400">{t('law10.dataMaturity.investment.totals.potentialSanctions')}</p>
</div> </div>
<div className="text-center"> <div className="text-center">
<p className="text-xs text-gray-500 mb-1">ROI Compliance</p> <p className="text-xs text-gray-500 mb-1">{t('law10.dataMaturity.investment.totals.complianceRoi')}</p>
<p className="text-xl font-bold text-emerald-600"> <p className="text-xl font-bold text-emerald-600">
{data.economicModel?.roi3yr ? `${data.economicModel.roi3yr}%` : '490-650%'} {data.economicModel?.roi3yr ? `${data.economicModel.roi3yr}%` : '490-650%'}
</p> </p>

View File

@@ -1649,6 +1649,72 @@
"requiredData": "Requires data", "requiredData": "Requires data",
"score": "Score", "score": "Score",
"gap": "Gap" "gap": "Gap"
},
"summaryTable": {
"requirement": "Requirement",
"description": "Description",
"status": "Status",
"score": "Score",
"gap": "Gap",
"legend": {
"complies": "Complies: Requirement satisfied",
"partial": "Partial: Requires improvements",
"notComply": "Does Not Comply: Urgent action",
"noData": "No Data: Fields not available in CSV"
},
"investment": {
"nonComplianceCost": "Cost of non-compliance",
"upTo100k": "Up to 100K",
"potentialFines": "Potential fines/infraction",
"recommendedInvestment": "Recommended investment",
"basedOnOperation": "Based on your operation",
"complianceRoi": "Compliance ROI",
"avoidSanctions": "Avoid sanctions + improve CX"
}
},
"dataMaturity": {
"title": "Summary: Data Maturity for Compliance",
"currentLevel": "Your current instrumentation level:",
"availableData": "AVAILABLE DATA (3/10)",
"estimableData": "ESTIMABLE DATA (2/10)",
"unavailableData": "NOT AVAILABLE (5/10)",
"items": {
"coverage247": "24/7 temporal coverage",
"geoDistribution": "Geographic distribution",
"resolutionQuality": "Resolution quality proxy",
"asa3min": "ASA <3min via abandonment proxy",
"officialLanguages": "Co-official languages via country",
"caseResolutionTime": "Case resolution time",
"undueBilling": "Undue billing <5 days",
"supervisorTransfer": "Transfer to supervisor",
"incidentInfo": "Incident info <2h",
"enacAudit": "ENAC audit",
"externalContractRequired": "requires external contracting"
},
"investment": {
"title": "SUGGESTED INVESTMENT FOR COMPLETE COMPLIANCE",
"phase1": {
"title": "Phase 1 - Instrumentation (Q1 2026)",
"realAsaTracking": "• Real ASA tracking",
"ticketingSystem": "• Ticketing/case system",
"languageEnrichment": "• Language enrichment",
"subtotal": "Subtotal:"
},
"phase2": {
"title": "Phase 2 - Operations (Q2-Q3 2026)",
"coverage247": "• 24/7 coverage (chatbot + on-call)",
"aiCopilot": "• AI Copilot (reduce AHT)",
"enacAuditor": "• ENAC auditor",
"subtotalYear1": "Year 1 subtotal:"
},
"totals": {
"totalInvestment": "Total Investment",
"percentAnnualCost": "~5% annual cost",
"riskAvoided": "Risk Avoided",
"potentialSanctions": "potential sanctions",
"complianceRoi": "Compliance ROI"
}
}
} }
} }
} }

View File

@@ -1649,6 +1649,72 @@
"requiredData": "Requiere datos", "requiredData": "Requiere datos",
"score": "Score", "score": "Score",
"gap": "Gap" "gap": "Gap"
},
"summaryTable": {
"requirement": "Requisito",
"description": "Descripción",
"status": "Estado",
"score": "Score",
"gap": "Gap",
"legend": {
"complies": "Cumple: Requisito satisfecho",
"partial": "Parcial: Requiere mejoras",
"notComply": "No Cumple: Acción urgente",
"noData": "Sin Datos: Campos no disponibles en CSV"
},
"investment": {
"nonComplianceCost": "Coste de no cumplimiento",
"upTo100k": "Hasta 100K",
"potentialFines": "Multas potenciales/infracción",
"recommendedInvestment": "Inversión recomendada",
"basedOnOperation": "Basada en tu operación",
"complianceRoi": "ROI de cumplimiento",
"avoidSanctions": "Evitar sanciones + mejora CX"
}
},
"dataMaturity": {
"title": "Resumen: Madurez de Datos para Compliance",
"currentLevel": "Tu nivel actual de instrumentación:",
"availableData": "DATOS DISPONIBLES (3/10)",
"estimableData": "DATOS ESTIMABLES (2/10)",
"unavailableData": "NO DISPONIBLES (5/10)",
"items": {
"coverage247": "Cobertura temporal 24/7",
"geoDistribution": "Distribución geográfica",
"resolutionQuality": "Calidad resolución proxy",
"asa3min": "ASA <3min vía proxy abandono",
"officialLanguages": "Lenguas cooficiales vía país",
"caseResolutionTime": "Tiempo resolución casos",
"undueBilling": "Cobros indebidos <5 días",
"supervisorTransfer": "Transfer a supervisor",
"incidentInfo": "Info incidencias <2h",
"enacAudit": "Auditoría ENAC",
"externalContractRequired": "requiere contratación externa"
},
"investment": {
"title": "INVERSIÓN SUGERIDA PARA COMPLIANCE COMPLETO",
"phase1": {
"title": "Fase 1 - Instrumentación (Q1 2026)",
"realAsaTracking": "• Tracking ASA real",
"ticketingSystem": "• Sistema ticketing/casos",
"languageEnrichment": "• Enriquecimiento lenguas",
"subtotal": "Subtotal:"
},
"phase2": {
"title": "Fase 2 - Operaciones (Q2-Q3 2026)",
"coverage247": "• Cobertura 24/7 (chatbot + on-call)",
"aiCopilot": "• Copilot IA (reducir AHT)",
"enacAuditor": "• Auditor ENAC",
"subtotalYear1": "Subtotal año 1:"
},
"totals": {
"totalInvestment": "Inversión Total",
"percentAnnualCost": "~5% coste anual",
"riskAvoided": "Riesgo Evitado",
"potentialSanctions": "sanciones potenciales",
"complianceRoi": "ROI Compliance"
}
}
} }
} }
} }