Monitorear la calidad de atención telefónica del proveedor Proximo Inbound mediante un sistema de evaluación automatizada con ponderaciones específicas por tipo de gestión.
BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad-- Tabla de hechos principal
BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
- evaluation_id (PK)
- ejecutivo_id, supervisor_id, proveedor_id
- fecha_llamada, timestamp_llamada (fecha real del contacto)
- fecha_evaluacion, timestamp_evaluacion (fecha de procesamiento)
- tipo_gestion: 'DIFICULTAD' | 'PROMESA'
- nota_total_consolidada (0-100)
- Métricas por competencia precalculadas
-- Tablas agregadas para performance
BI_USA.bi_LXNMkPhgWyjLRMotKNDs_agg_ejecutivo_semanal
BI_USA.bi_LXNMkPhgWyjLRMotKNDs_agg_supervisor_mensual
BI_USA.bi_LXNMkPhgWyjLRMotKNDs_agg_ranking_generalPara Looker Studio:
BI_USA.vw_calidad_looker_studio
-- Datos completamente desnormalizados
-- Sin JOINs complejos
-- Métricas listas para agregaciónPara Superset:
BI_USA.vw_dashboard_ejecutivo
BI_USA.vw_competencias_detalle
-- Estructura normalizada
-- Flexibilidad para consultas custom┌─────────────────┬─────────────────┬─────────────────┬─────────────────┐
│ EVALUACIONES │ EJECUTIVOS │ PROMEDIO │ % APROBACIÓN │
│ TOTAL │ ACTIVOS │ GENERAL │ (>=80 pts) │
│ 1,016 │ 85 │ 82.3 │ 74.2% │
└─────────────────┴─────────────────┴─────────────────┴─────────────────┘Query KPIs:
SELECT
COUNT(*) as total_evaluaciones,
COUNT(DISTINCT ejecutivo_id) as ejecutivos_activos,
ROUND(AVG(nota_total_consolidada), 1) as promedio_general,
ROUND(COUNTIF(nota_total_consolidada >= 80) * 100.0 / COUNT(*), 1) as porcentaje_aprobacion
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
WHERE fecha_llamada >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY);┌─────────────────────────────────────────────────────────────────┐
│ DIFICULTAD DE PAGO │
├─────────────────────────────────────────────────────────────────┤
│ Capacidad de Negociación (25%): 18.2 / 25 (72.8%) │
│ Conocimiento de Cartera (75%): 59.1 / 75 (78.8%) │
│ TOTAL: 77.3 / 100 (77.3%) │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────┐
│ PROMESA DE PAGO │
├─────────────────────────────────────────────────────────────────┤
│ Capacidad de Negociación (15%): 12.8 / 15 (85.3%) │
│ Conocimiento de Cartera (85%): 74.2 / 85 (87.3%) │
│ TOTAL: 87.0 / 100 (87.0%) │
└─────────────────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────────────────┐
│ EJECUTIVOS POR CUARTIL DE PERFORMANCE │
├─────────────────────────────────────────────────────────────────┤
│ Q4 (Excelente: 90-100): █████████░░ 18 ejecutivos (21%) │
│ Q3 (Muy Bueno: 80-89): ████████████ 24 ejecutivos (28%) │
│ Q2 (Bueno: 70-79): ██████████░░ 22 ejecutivos (26%) │
│ Q1 (Oportunidad: <70): █████████░░░ 21 ejecutivos (25%) │
└─────────────────────────────────────────────────────────────────┘Semana 14: ████████████████░░░░ 78.2
Semana 15: █████████████████░░░ 81.5
Semana 16: ██████████████████░░ 83.1
Semana 17: ████████████████████ 85.7 ← Semana actual┌─────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│ EJECUTIVO │ SUPERVISOR │ SEM 14 │ SEM 15 │ SEM 16 │ SEM 17 │ PROMEDIO│
├─────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ EJ001 │ Sosa Flavia │ 85.2 │ 87.1 │ 89.3 │ 91.2 │ 88.2 │
│ EJ002 │ Forneris R. │ 72.1 │ 75.3 │ 78.8 │ 82.1 │ 77.1 │
│ EJ003 │ Sosa Flavia │ 91.5 │ 89.7 │ 92.1 │ 94.3 │ 91.9 │
└─────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┴─────────┘-- Query base para tabla semanal
SELECT
ejecutivo_id,
supervisor_id,
semana_llamada,
tipo_gestion,
COUNT(*) as total_evaluaciones,
ROUND(AVG(nota_total_consolidada), 1) as nota_promedio,
COUNTIF(nota_total_consolidada >= 80) as aprobadas,
ROUND(COUNTIF(nota_total_consolidada >= 80) * 100.0 / COUNT(*), 1) as porcentaje_aprobacion
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
WHERE fecha_llamada >= DATE_SUB(CURRENT_DATE(), INTERVAL 4*7 DAY)
GROUP BY 1,2,3,4
ORDER BY ejecutivo_id, semana_llamada;┌─────────────────────────────────────────────────────────────────┐
│ DIFICULTAD DE PAGO │
│ ANÁLISIS POR CRITERIO │
├─────────────────────────────────────────────────────────────────┤
│ CAPACIDAD DE NEGOCIACIÓN (25%) │
│ ├─ Expresa atributos de pago (20): ████████████░░░░ 14.2/20 │
│ └─ Validación de datos (5): ████████████████ 4.8/5 │
│ │
│ CONOCIMIENTO DE CARTERA (75%) │
│ ├─ Ofrecimiento REFI (45): ██████████░░░░░░ 28.5/45 │
│ ├─ Alternativas de pago (20): ███████████████░ 18.1/20 │
│ ├─ Datos de cobranza (5): ████████████████ 4.9/5 │
│ └─ Informa medios de pago (5): ████████░░░░░░░░ 2.1/5 │
└─────────────────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────────────────┐
│ PROMESA DE PAGO │
│ ANÁLISIS POR CRITERIO │
├─────────────────────────────────────────────────────────────────┤
│ CAPACIDAD DE NEGOCIACIÓN (15%) │
│ ├─ Expresa atributos de pago (5): ███████████████░ 4.2/5 │
│ ├─ Compromiso de pago (5): ████████████████ 4.8/5 │
│ └─ Validación de datos (5): ████████████████ 4.9/5 │
│ │
│ CONOCIMIENTO DE CARTERA (85%) │
│ ├─ Ofrecimiento REFI (50): ███████████░░░░░ 35.2/50 │
│ ├─ Alternativas de pago (20): ███████████████░ 18.8/20 │
│ ├─ Datos de cobranza (5): ████████████████ 4.8/5 │
│ └─ Informa medios de pago (10): ████████████░░░░ 7.8/10 │
└─────────────────────────────────────────────────────────────────┘-- Query para heat map
SELECT
ejecutivo_id,
supervisor_id,
tipo_gestion,
-- Competencias Dificultad
ROUND(AVG(CASE WHEN tipo_gestion = 'DIFICULTAD' THEN dif_expresa_atributos_score END), 1) as dif_expresa_atributos,
ROUND(AVG(CASE WHEN tipo_gestion = 'DIFICULTAD' THEN dif_validacion_datos_score END), 1) as dif_validacion,
ROUND(AVG(CASE WHEN tipo_gestion = 'DIFICULTAD' THEN dif_ofrecimiento_refi_score END), 1) as dif_refi,
ROUND(AVG(CASE WHEN tipo_gestion = 'DIFICULTAD' THEN dif_alternativas_pago_score END), 1) as dif_alternativas,
ROUND(AVG(CASE WHEN tipo_gestion = 'DIFICULTAD' THEN dif_datos_cobranza_score END), 1) as dif_datos,
ROUND(AVG(CASE WHEN tipo_gestion = 'DIFICULTAD' THEN dif_medios_pago_score END), 1) as dif_medios,
-- Competencias Promesa
ROUND(AVG(CASE WHEN tipo_gestion = 'PROMESA' THEN prom_expresa_atributos_score END), 1) as prom_expresa_atributos,
ROUND(AVG(CASE WHEN tipo_gestion = 'PROMESA' THEN prom_compromiso_pago_score END), 1) as prom_compromiso,
ROUND(AVG(CASE WHEN tipo_gestion = 'PROMESA' THEN prom_validacion_datos_score END), 1) as prom_validacion,
ROUND(AVG(CASE WHEN tipo_gestion = 'PROMESA' THEN prom_ofrecimiento_refi_score END), 1) as prom_refi,
ROUND(AVG(CASE WHEN tipo_gestion = 'PROMESA' THEN prom_alternativas_pago_score END), 1) as prom_alternativas,
ROUND(AVG(CASE WHEN tipo_gestion = 'PROMESA' THEN prom_datos_cobranza_score END), 1) as prom_datos,
ROUND(AVG(CASE WHEN tipo_gestion = 'PROMESA' THEN prom_medios_pago_score END), 1) as prom_medios
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
GROUP BY 1,2,3
HAVING COUNT(*) >= 5;┌──────┬─────────────┬─────────────┬──────────┬───────────┬──────────────┐
│ RANK │ EJECUTIVO │ SUPERVISOR │ EVAL │ PROMEDIO │ CATEGORÍA │
├──────┼─────────────┼─────────────┼──────────┼───────────┼──────────────┤
│ 1 │ EJ047 │ Sosa Flavia │ 25 │ 94.3 │ Excelente │
│ 2 │ EJ023 │ Forneris R. │ 32 │ 92.8 │ Excelente │
│ 3 │ EJ081 │ Sosa Flavia │ 28 │ 91.5 │ Excelente │
│ 4 │ EJ012 │ Forneris R. │ 19 │ 90.2 │ Excelente │
│ 5 │ EJ055 │ Sosa Flavia │ 41 │ 89.7 │ Muy Bueno │
│ ... │ ... │ ... │ ... │ ... │ ... │
│ 83 │ EJ091 │ Forneris R. │ 12 │ 58.3 │ Oportunidad │
│ 84 │ EJ033 │ Sosa Flavia │ 8 │ 55.7 │ Oportunidad │
│ 85 │ EJ067 │ Forneris R. │ 15 │ 52.1 │ Oportunidad │
└──────┴─────────────┴─────────────┴──────────┴───────────┴──────────────┘-- Query para ranking con categorías
WITH ranking_ejecutivos AS (
SELECT
ejecutivo_id,
supervisor_id,
COUNT(*) as total_evaluaciones,
ROUND(AVG(nota_total_consolidada), 1) as promedio,
CASE
WHEN AVG(nota_total_consolidada) >= 90 THEN 'Excelente'
WHEN AVG(nota_total_consolidada) >= 80 THEN 'Muy Bueno'
WHEN AVG(nota_total_consolidada) >= 70 THEN 'Bueno'
WHEN AVG(nota_total_consolidada) >= 60 THEN 'Regular'
ELSE 'Oportunidad'
END as categoria,
ROW_NUMBER() OVER (ORDER BY AVG(nota_total_consolidada) DESC) as ranking
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
GROUP BY 1,2
HAVING total_evaluaciones >= 5
)
SELECT * FROM ranking_ejecutivos
ORDER BY ranking;┌─────────────┬─────────────┬─────────────┬─────────────┬─────────────┐
│ SUPERVISOR │ EJECUTIVOS │ PROMEDIO │ BRECHA │ HOMOGENEIDAD│
├─────────────┼─────────────┼─────────────┼─────────────┼─────────────┤
│ Sosa Flavia │ 48 │ 82.5 │ 38.2 │ Media │
│ Forneris R. │ 37 │ 79.3 │ 42.7 │ Alta │
└─────────────┴─────────────┴─────────────┴─────────────┴─────────────┘/* Colores principales */
:root {
--primary-blue: #1f4e79; /* Headers */
--secondary-blue: #4472c4; /* Gráficos principales */
--success-green: #70ad47; /* Métricas positivas */
--warning-orange: #ff8c00; /* Alertas */
--danger-red: #c55a5a; /* Métricas críticas */
--neutral-gray: #7f7f7f; /* Texto secundario */
--light-gray: #f2f2f2; /* Fondos */
--white: #ffffff; /* Fondos principales */
}
/* Escala de performance */
.excelente { background: linear-gradient(90deg, #70ad47, #92d050); }
.muy-bueno { background: linear-gradient(90deg, #4472c4, #5b9bd5); }
.bueno { background: linear-gradient(90deg, #ffc000, #ffdc80); }
.regular { background: linear-gradient(90deg, #ff8c00, #ffb366); }
.critico { background: linear-gradient(90deg, #c55a5a, #d99999); }Desktop (>1200px): 4 columnas layout
Tablet (768-1199px): 2 columnas layout
Mobile (>768px): 1 columna layoutPara Looker Studio:
Connector: BigQuery
Project: mibot-222814
Dataset: BI_USA
Main Table: vw_calidad_looker_studio
Refresh: Auto (cada 4 horas)Para Superset:
Database Type: Google BigQuery
SQL Alchemy URI: bigquery://mibot-222814/BI_USA
Default Schema: BI_USA
Cache Timeout: 3600 seconds (1 hora)-- KPIs principales
SELECT
'TOTAL' as metric,
COUNT(*) as value,
'evaluaciones' as unit
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
WHERE fecha_llamada >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
UNION ALL
SELECT
'EJECUTIVOS' as metric,
COUNT(DISTINCT ejecutivo_id) as value,
'activos' as unit
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
WHERE fecha_llamada >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
UNION ALL
SELECT
'PROMEDIO' as metric,
ROUND(AVG(nota_total_consolidada), 1) as value,
'puntos' as unit
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
WHERE fecha_llamada >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
UNION ALL
SELECT
'APROBACION' as metric,
ROUND(COUNTIF(nota_total_consolidada >= 80) * 100.0 / COUNT(*), 1) as value,
'%' as unit
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
WHERE fecha_llamada >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY);-- Tendencia semanal
SELECT
año_llamada,
semana_llamada,
CONCAT(año_llamada, '-W', LPAD(CAST(semana_llamada AS STRING), 2, '0')) as semana_display,
COUNT(*) as total_evaluaciones,
ROUND(AVG(nota_total_consolidada), 1) as promedio_semanal,
COUNTIF(nota_total_consolidada >= 80) as aprobadas,
ROUND(COUNTIF(nota_total_consolidada >= 80) * 100.0 / COUNT(*), 1) as porcentaje_aprobacion
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
WHERE fecha_llamada >= DATE_SUB(CURRENT_DATE(), INTERVAL 8*7 DAY)
GROUP BY 1,2,3
ORDER BY año_llamada, semana_llamada;-- Performance por competencia
SELECT
tipo_gestion,
'Expresa atributos' as competencia,
CASE WHEN tipo_gestion = 'DIFICULTAD' THEN 20 ELSE 5 END as max_puntaje,
ROUND(AVG(CASE WHEN tipo_gestion = 'DIFICULTAD' THEN dif_expresa_atributos_score
WHEN tipo_gestion = 'PROMESA' THEN prom_expresa_atributos_score END), 1) as promedio_obtenido,
ROUND(AVG(CASE WHEN tipo_gestion = 'DIFICULTAD' THEN dif_expresa_atributos_score
WHEN tipo_gestion = 'PROMESA' THEN prom_expresa_atributos_score END) * 100.0 /
CASE WHEN tipo_gestion = 'DIFICULTAD' THEN 20 ELSE 5 END, 1) as porcentaje_cumplimiento
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
GROUP BY tipo_gestion
UNION ALL
-- Repetir para cada competencia...-- Ranking de ejecutivos
SELECT
ROW_NUMBER() OVER (ORDER BY AVG(nota_total_consolidada) DESC) as ranking,
ejecutivo_id,
supervisor_id,
COUNT(*) as total_evaluaciones,
ROUND(AVG(nota_total_consolidada), 1) as promedio,
ROUND(MIN(nota_total_consolidada), 1) as minimo,
ROUND(MAX(nota_total_consolidada), 1) as maximo,
ROUND(STDDEV(nota_total_consolidada), 1) as variabilidad,
CASE
WHEN AVG(nota_total_consolidada) >= 90 THEN 'Excelente'
WHEN AVG(nota_total_consolidada) >= 80 THEN 'Muy Bueno'
WHEN AVG(nota_total_consolidada) >= 70 THEN 'Bueno'
WHEN AVG(nota_total_consolidada) >= 60 THEN 'Regular'
ELSE 'Oportunidad'
END as categoria_performance
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
GROUP BY ejecutivo_id, supervisor_id
HAVING total_evaluaciones >= 5
ORDER BY promedio DESC;-- Configurar filtros que apliquen a todas las hojas
PARAMETERS:
- fecha_inicio: DATE DEFAULT DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
- fecha_fin: DATE DEFAULT CURRENT_DATE()
- supervisor_filtro: STRING DEFAULT 'Todos'
- tipo_gestion_filtro: STRING DEFAULT 'Todos'-- Definir umbrales para alertas
CRITICAL_THRESHOLD = 60 -- Promedio crítico
WARNING_THRESHOLD = 70 -- Promedio de alerta
TARGET_THRESHOLD = 80 -- Objetivo mínimo
-- Query para alertas
SELECT
'ALERTA_SUPERVISOR' as tipo_alerta,
supervisor_id,
ROUND(AVG(nota_total_consolidada), 1) as promedio_actual,
80 as objetivo,
CASE
WHEN AVG(nota_total_consolidada) < 60 THEN 'CRÍTICO'
WHEN AVG(nota_total_consolidada) < 70 THEN 'ALERTA'
WHEN AVG(nota_total_consolidada) < 80 THEN 'ATENCIÓN'
ELSE 'OK'
END as nivel_alerta
FROM BI_USA.bi_LXNMkPhgWyjLRMotKNDs_fact_evaluaciones_calidad
WHERE fecha_llamada >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
GROUP BY supervisor_id
HAVING AVG(nota_total_consolidada) < 80;Resumen Ejecutivo → Click en KPI → Detalle por Supervisor
→ Click en Competencia → Análisis por Criterio
→ Click en Ejecutivo → Performance Individual
Ranking → Click en Ejecutivo → Historial de Evaluaciones
→ Click en Supervisor → Performance del Equipo<!-- Ejemplo de tooltip para competencias -->
<div class="tooltip">
<h4>Ofrecimiento REFI - Dificultad</h4>
<p><strong>Ponderación:</strong> 45 puntos (45% del total)</p>
<p><strong>Criterio:</strong> El agente debe mencionar si hay refinanciamiento disponible</p>
<p><strong>Promedio actual:</strong> 28.5 / 45 (63.3%)</p>
<p><strong>Meta:</strong> ≥ 36 puntos (80%)</p>
</div>-- Job de validación diario
SELECT
DATE(CURRENT_TIMESTAMP()) as fecha_validacion,
COUNT(*) as registros_procesados,
COUNT(CASE WHEN nota_total_consolidada IS NULL THEN 1 END) as notas_nulas,
COUNT(CASE WHEN fecha_llamada IS NULL THEN 1 END) as fechas_nulas,
ROUND(AVG(nota_total_consolidada), 2) as promedio_dia,
'OK' as status