Files
BeyondCXAnalytics_AE/frontend/types.ts
sujucu70 88d7e4c10d feat: Add Law 10/2025 compliance analysis tab
- Add new Law10Tab with compliance analysis for Spanish Law 10/2025
- Sections: LAW-01 (Response Speed), LAW-02 (Resolution Quality), LAW-07 (Time Coverage)
- Add Data Maturity Summary showing available/estimable/missing data
- Add Validation Questionnaire for manual data input
- Add Dimension Connections linking to other analysis tabs
- Fix KPI consistency: use correct field names (abandonment_rate, aht_seconds)
- Fix cache directory path for Windows compatibility
- Update economic calculations to use actual economicModel data

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 21:58:26 +01:00

359 lines
14 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { LucideIcon } from 'lucide-react';
export type TierKey = 'gold' | 'silver' | 'bronze';
export type AnalysisSource = 'synthetic' | 'backend' | 'fallback';
export interface Tier {
name: string;
price: number;
color: string;
description: string;
requirements: string;
timeline: string;
features?: string[];
}
export interface Field {
name: string;
type: string;
example: string;
critical: boolean;
}
export interface DataCategory {
category: string;
fields: Field[];
}
export interface DataRequirement {
mandatory: DataCategory[];
format: string;
volumeMin: string;
}
export type TiersData = Record<TierKey, Tier>;
export type DataRequirementsData = Record<TierKey, DataRequirement>;
// --- v2.0: Nueva estructura de datos de entrada ---
// Configuración estática (manual)
export interface StaticConfig {
cost_per_hour: number; // Coste por hora agente (€/hora, fully loaded)
avg_csat?: number; // CSAT promedio (0-100, opcional, manual)
// Mapeo de colas/skills a segmentos de cliente
segment_mapping?: {
high_value_queues: string[]; // Colas para clientes alto valor
medium_value_queues: string[]; // Colas para clientes valor medio
low_value_queues: string[]; // Colas para clientes bajo valor
};
}
// Interacción raw del CSV (datos dinámicos)
export interface RawInteraction {
interaction_id: string; // ID único de la llamada/sesión
datetime_start: string; // Timestamp inicio (ISO 8601 o auto-detectado)
queue_skill: string; // Cola o skill
channel: 'Voice' | 'Chat' | 'WhatsApp' | 'Email' | string; // Tipo de medio
duration_talk: number; // Tiempo de conversación activa (segundos)
hold_time: number; // Tiempo en espera (segundos)
wrap_up_time: number; // Tiempo ACW post-llamada (segundos)
agent_id: string; // ID agente (anónimo/hash)
transfer_flag: boolean; // Indicador de transferencia
repeat_call_7d?: boolean; // True si el cliente llamó en los últimos 7 días (para FCR)
caller_id?: string; // ID cliente (opcional, hash/anónimo)
disconnection_type?: string; // Tipo de desconexión (Externo/Interno/etc.)
total_conversation?: number; // Conversación total en segundos (null/0 = abandono)
is_abandoned?: boolean; // Flag directo de abandono del CSV
record_status?: 'valid' | 'noise' | 'zombie' | 'abandon'; // Estado del registro para filtrado
fcr_real_flag?: boolean; // FCR pre-calculado en el CSV (TRUE = resuelto en primer contacto)
// v3.0: Campos para drill-down (jerarquía de 2 niveles)
original_queue_id?: string; // Nombre real de la cola en centralita (nivel operativo)
linea_negocio?: string; // Línea de negocio (business_unit) - 9 categorías C-Level
// queue_skill ya existe arriba como nivel estratégico
}
// Tipo para filtrado por record_status
export type RecordStatus = 'valid' | 'noise' | 'zombie' | 'abandon';
// v3.4: Tier de clasificación para roadmap
export type AgenticTier = 'AUTOMATE' | 'ASSIST' | 'AUGMENT' | 'HUMAN-ONLY';
// v3.4: Desglose del score por factores
export interface AgenticScoreBreakdown {
predictibilidad: number; // 30% - basado en CV AHT
resolutividad: number; // 25% - FCR (60%) + Transfer (40%)
volumen: number; // 25% - basado en volumen mensual
calidadDatos: number; // 10% - % registros válidos
simplicidad: number; // 10% - basado en AHT
}
// v3.4: Métricas por cola individual (original_queue_id - nivel operativo)
export interface OriginalQueueMetrics {
original_queue_id: string; // Nombre real de la cola en centralita
volume: number; // Total de interacciones
volumeValid: number; // Sin NOISE/ZOMBIE (para cálculo CV)
aht_mean: number; // AHT promedio (segundos)
cv_aht: number; // CV AHT calculado solo sobre VALID (%)
transfer_rate: number; // Tasa de transferencia (%)
fcr_rate: number; // FCR Real (%) - usa fcr_real_flag, incluye filtro recontacto 7d
fcr_tecnico: number; // FCR Técnico (%) = 100 - transfer_rate, comparable con benchmarks
agenticScore: number; // Score de automatización (0-10)
scoreBreakdown?: AgenticScoreBreakdown; // v3.4: Desglose por factores
tier: AgenticTier; // v3.4: Clasificación para roadmap
tierMotivo?: string; // v3.4: Motivo de la clasificación
isPriorityCandidate: boolean; // Tier 1 (AUTOMATE)
annualCost?: number; // Coste anual estimado
}
// v3.1: Tipo para drill-down - Nivel 1: queue_skill (estratégico)
export interface DrilldownDataPoint {
skill: string; // queue_skill (categoría estratégica)
originalQueues: OriginalQueueMetrics[]; // Colas reales de centralita (nivel 2)
// Métricas agregadas del grupo
volume: number; // Total de interacciones del grupo
volumeValid: number; // Sin NOISE/ZOMBIE
aht_mean: number; // AHT promedio ponderado (segundos)
cv_aht: number; // CV AHT promedio ponderado (%)
transfer_rate: number; // Tasa de transferencia ponderada (%)
fcr_rate: number; // FCR Real ponderado (%) - usa fcr_real_flag
fcr_tecnico: number; // FCR Técnico ponderado (%) = 100 - transfer_rate
agenticScore: number; // Score de automatización promedio (0-10)
isPriorityCandidate: boolean; // Al menos una cola con CV < 75%
annualCost?: number; // Coste anual total del grupo
}
// Métricas calculadas por skill
export interface SkillMetrics {
skill: string;
volume: number; // Total de interacciones
channel: string; // Canal predominante
// Métricas de rendimiento (calculadas)
fcr: number; // FCR Real: (transfer_flag == FALSE) AND (repeat_call_7d == FALSE) - sin recontacto 7 días
fcr_tecnico: number; // FCR Técnico: 100% - transfer_rate (comparable con benchmarks de industria)
fcr_real: number; // Alias de fcr - FCR Real con filtro de recontacto 7 días
aht: number; // AHT = duration_talk + hold_time + wrap_up_time
avg_talk_time: number; // Promedio duration_talk
avg_hold_time: number; // Promedio hold_time
avg_wrap_up: number; // Promedio wrap_up_time
transfer_rate: number; // % con transfer_flag = true
abandonment_rate: number; // % abandonos (desconexión externa + sin conversación)
// Métricas de variabilidad
cv_aht: number; // Coeficiente de variación AHT (%)
cv_talk_time: number; // CV de duration_talk (proxy de variabilidad input)
cv_hold_time: number; // CV de hold_time
// Distribución temporal
hourly_distribution: number[]; // 24 valores (0-23h)
off_hours_pct: number; // % llamadas fuera de horario (19:00-08:00)
// Coste
annual_cost: number; // Volumen × AHT × cost_per_hour × 12
// Outliers y complejidad
outlier_rate: number; // % casos con AHT > P90
}
// --- Analysis Dashboard Types ---
export interface Kpi {
label: string;
value: string;
change?: string; // e.g., '+5%' or '-10s'
changeType?: 'positive' | 'negative' | 'neutral';
}
// v4.0: 7 dimensiones viables
export type DimensionName =
| 'volumetry_distribution' // Volumetría & Distribución
| 'operational_efficiency' // Eficiencia Operativa
| 'effectiveness_resolution' // Efectividad & Resolución
| 'complexity_predictability' // Complejidad & Predictibilidad
| 'customer_satisfaction' // Satisfacción del Cliente (CSAT)
| 'economy_cpi' // Economía Operacional (CPI)
| 'agentic_readiness'; // Agentic Readiness
export interface SubFactor {
name: string;
displayName: string;
score: number;
weight: number;
description: string;
details?: Record<string, any>;
}
export interface DistributionData {
hourly: number[]; // 24 valores (0-23h)
off_hours_pct: number;
peak_hours: number[];
weekday_distribution?: number[]; // 7 valores (0=domingo, 6=sábado)
}
export interface DimensionAnalysis {
id: string;
name: DimensionName;
title: string;
score: number;
percentile?: number;
summary: string;
kpi: Kpi;
icon: LucideIcon;
// v2.0: Nuevos campos
sub_factors?: SubFactor[]; // Para Agentic Readiness
distribution_data?: DistributionData; // Para Volumetría
}
export interface HeatmapDataPoint {
skill: string;
segment?: CustomerSegment; // Segmento de cliente (high/medium/low)
volume: number; // Volumen mensual de interacciones
cost_volume?: number; // Volumen usado para calcular coste (non-abandon)
aht_seconds: number; // AHT "limpio" en segundos (solo valid, excluye noise/zombie/abandon) - para métricas de calidad
aht_total?: number; // AHT "total" en segundos (ALL rows incluyendo noise/zombie/abandon) - solo informativo
aht_benchmark?: number; // AHT "tradicional" en segundos (incluye noise, excluye zombie/abandon) - para comparación con benchmarks de industria
metrics: {
fcr: number; // FCR Real: sin transferencia Y sin recontacto 7 días (0-100) - CALCULADO
fcr_tecnico?: number; // FCR Técnico: sin transferencia (comparable con benchmarks industria)
aht: number; // Average Handle Time score (0-100, donde 100 es óptimo) - CALCULADO
csat: number; // Customer Satisfaction score (0-100) - MANUAL (estático)
hold_time: number; // Hold Time promedio (segundos) - CALCULADO
transfer_rate: number; // % transferencias - CALCULADO
abandonment_rate: number; // % abandonos - CALCULADO
};
annual_cost?: number; // Coste total del período (calculado con cost_per_hour)
cpi?: number; // Coste por interacción = total_cost / cost_volume
// v2.0: Métricas de variabilidad interna
variability: {
cv_aht: number; // Coeficiente de variación del AHT (%)
cv_talk_time: number; // CV Talk Time (deprecado en v2.1)
cv_hold_time: number; // CV Hold Time (deprecado en v2.1)
transfer_rate: number; // Tasa de transferencia (%)
};
automation_readiness: number; // Score 0-100 (calculado)
// v2.1: Nuevas dimensiones para Agentic Readiness Score
dimensions?: {
predictability: number; // Dimensión 1: Predictibilidad (0-10)
complexity_inverse: number; // Dimensión 2: Complejidad Inversa (0-10)
repetitivity: number; // Dimensión 3: Repetitividad/Impacto (0-10)
};
readiness_category?: 'automate_now' | 'assist_copilot' | 'optimize_first';
}
// v2.0: Segmentación de cliente
export type CustomerSegment = 'high' | 'medium' | 'low';
export interface Opportunity {
id: string;
name: string;
impact: number;
feasibility: number;
savings: number;
dimensionId: string;
customer_segment?: CustomerSegment; // v2.0: Nuevo campo opcional
}
// Usar objeto const en lugar de enum para evitar problemas de tree-shaking con Vite
export const RoadmapPhase = {
Automate: 'Automate',
Assist: 'Assist',
Augment: 'Augment'
} as const;
export type RoadmapPhase = typeof RoadmapPhase[keyof typeof RoadmapPhase];
export interface RoadmapInitiative {
id: string;
name: string;
phase: RoadmapPhase;
timeline: string;
investment: number;
resources: string[];
dimensionId: string;
risk?: 'high' | 'medium' | 'low'; // v2.0: Nuevo campo
// v2.1: Campos para trazabilidad
skillsImpacted?: string[]; // Skills que impacta
savingsDetail?: string; // Detalle del cálculo de ahorro
estimatedSavings?: number; // Ahorro estimado €
resourceHours?: number; // Horas estimadas de recursos
// v3.0: Campos mejorados conectados con skills reales
volumeImpacted?: number; // Volumen de interacciones impactadas
kpiObjective?: string; // Objetivo KPI específico
rationale?: string; // Justificación de la iniciativa
}
export interface Finding {
text: string;
dimensionId: string;
type?: 'warning' | 'info' | 'critical'; // Tipo de hallazgo
title?: string; // Título del hallazgo
description?: string; // Descripción detallada
impact?: 'high' | 'medium' | 'low'; // Impacto estimado
}
export interface Recommendation {
text: string;
dimensionId: string;
priority?: 'high' | 'medium' | 'low'; // v2.0: Prioridad
title?: string; // Título de la recomendación
description?: string; // Descripción detallada
impact?: string; // Impacto estimado (e.g., "Mejora del 20-30%")
timeline?: string; // Timeline estimado (e.g., "1-3 meses")
}
export interface EconomicModelData {
currentAnnualCost: number;
futureAnnualCost: number;
annualSavings: number;
initialInvestment: number;
paybackMonths: number;
roi3yr: number;
savingsBreakdown: { category: string; amount: number; percentage: number }[];
npv?: number; // v2.0: Net Present Value
costBreakdown?: { category: string; amount: number; percentage: number }[]; // v2.0
}
export interface BenchmarkDataPoint {
kpi: string;
userValue: number;
userDisplay: string;
industryValue: number;
industryDisplay: string;
percentile: number;
p25?: number; // v2.0: Percentil 25
p50?: number; // v2.0: Percentil 50 (mediana)
p75?: number; // v2.0: Percentil 75
p90?: number; // v2.0: Percentil 90
}
// v2.0: Nuevo tipo para Agentic Readiness Score
export interface AgenticReadinessResult {
score: number; // 0-10
sub_factors: SubFactor[];
tier: TierKey;
confidence: 'high' | 'medium' | 'low';
interpretation: string;
}
export interface AnalysisData {
tier?: TierKey; // Opcional para compatibilidad
overallHealthScore: number;
summaryKpis: Kpi[];
dimensions: DimensionAnalysis[];
findings: Finding[]; // Actualizado de keyFindings
recommendations: Recommendation[];
heatmapData: HeatmapDataPoint[]; // Actualizado de heatmap
opportunities: Opportunity[]; // Actualizado de opportunityMatrix
roadmap: RoadmapInitiative[];
economicModel: EconomicModelData;
benchmarkData: BenchmarkDataPoint[]; // Actualizado de benchmarkReport
agenticReadiness?: AgenticReadinessResult; // v2.0: Nuevo campo
staticConfig?: StaticConfig; // v2.0: Configuración estática usada
source?: AnalysisSource;
dateRange?: { min: string; max: string }; // v2.1: Periodo analizado
drilldownData?: DrilldownDataPoint[]; // v3.0: Drill-down Cola + Tipificación
}