← Volver al índice de anexos
Macrobloque 4·Inteligencia·Anexo 21 / 40

Anexo 21 · Alertas FARO

Etapa: Fase 6.2
DECK PARCIAL

ANEXO 21

Alertas FARO

Este anexo corresponde a la Fase 6 — Inteligencia, etapa “Alertas FARO”. Es la capa donde FARO Connect transforma reglas activadas en avisos concretos, priorizados y accionables.


1. Objetivo del anexo

El objetivo del Anexo 21 — Alertas FARO es definir cuándo, cómo, a quién y con qué prioridad FARO debe avisar que algo requiere atención.

La pregunta central es:

¿Qué evento merece ser comunicado como alerta y qué debe hacer la empresa con esa alerta?

Ejemplo simple:

KPI:
Margen bruto = 18%

Señal:
Margen bajo.

Regla:
Si margen < 20% y descuento > 10%, activar alerta.

Alerta FARO:
Margen crítico por descuento alto.

Responsable:
Gerente Comercial.

Acción sugerida:
Auditar ventas con descuento mayor al 8%.

Vencimiento sugerido:
72 horas.

La alerta no debe ser solo un cartel rojo. Debe ser un disparador de gestión.


2. Tesis del Anexo 21

La tesis es:

Una alerta FARO no es una notificación. Es una unidad de dirección.

Una alerta debe decir:

Qué pasó.
Por qué importa.
Qué KPI afecta.
Qué regla la disparó.
Qué tensión puede generar.
Qué área responde.
Qué responsable debe actuar.
Qué acción se sugiere.
Qué prioridad tiene.
Qué vencimiento corresponde.
Qué impacto puede tener en FARO Score.

Si una alerta no deriva en decisión, acción o seguimiento, es ruido. Y el ruido en dirección es veneno con buena interfaz.


3. Diferencia entre señal, regla, alerta, tensión y acción

Concepto Qué hace Ejemplo
Señal Detecta un movimiento relevante. Margen cayó 7 puntos.
Regla Evalúa si ese movimiento cumple una condición. Margen < 20% y descuento > 10%.
Alerta Comunica formalmente el riesgo. Margen crítico por descuento alto.
Tensión Interpreta contradicción entre variables. Ventas suben, margen baja y cobranza empeora.
Acción Define qué hacer. Auditar descuentos mayores al 8%.

La alerta es el punto donde FARO le dice a la organización:

“Esto ya merece gestión.”


4. Qué es una alerta FARO

Una alerta FARO es un aviso estructurado generado cuando una regla se activa y el evento tiene suficiente relevancia para ser comunicado.

Ejemplo:

{
  "alert_code": "margin_discount_alert",
  "title": "Margen crítico con descuento alto",
  "area": "Comercial",
  "severity": "alta",
  "kpi": "margen_bruto",
  "rule": "RULE_MARGIN_DISCOUNT_001",
  "responsible": "Gerente Comercial",
  "suggested_action": "auditar_descuentos_altos",
  "due_hours": 72,
  "possible_tension": "crecimiento_no_rentable",
  "score_impact": -4
}

Una alerta bien diseñada debe ser:

clara
concreta
priorizada
explicable
trazable
asignable
accionable
medible

5. Lo que una alerta NO debe ser

Una alerta FARO no debe ser:

un mensaje genérico,
un semáforo sin explicación,
un pop-up molesto,
una alarma sin responsable,
una lista infinita de problemas,
una notificación que nadie cierra,
un “revisar” sin contexto,
un ruido repetido todos los días.

Ejemplo malo:

Alerta: margen bajo.

Ejemplo FARO:

Alerta: margen crítico por descuento alto.

El margen bruto de la sucursal San Juan cayó a 18%, por debajo del umbral rojo del 20%. El descuento promedio subió a 12%. Esto puede indicar deterioro comercial por política de descuentos.

Responsable: Gerente Comercial.
Acción sugerida: auditar ventas con descuento mayor al 8%.
Vencimiento sugerido: 72 horas.

6. Tipos de alertas FARO

FARO debería manejar distintas familias de alertas.

Tipo de alerta Qué detecta Ejemplo
Alerta de KPI Un indicador está fuera de umbral. Margen bruto en rojo.
Alerta de señal Una variación relevante se detectó. Margen cayó 7 puntos.
Alerta de regla Una condición lógica se cumplió. Margen bajo + descuento alto.
Alerta de tensión probable Varias señales indican contradicción. Crecimiento no rentable probable.
Alerta de ejecución Acción, tarea o decisión no avanza. Acción crítica vencida.
Alerta de calidad de datos El dato no es confiable. Costos faltantes en 25% de ventas.
Alerta preventiva Riesgo futuro antes de que explote. Stock aún positivo, pero cobertura menor al plazo proveedor.
Alerta crítica Riesgo alto inmediato. Caja debajo del mínimo operativo.
Alerta recurrente Problema repetido. Mismo reclamo aparece 4 semanas seguidas.
Alerta de score FARO Score cae o cambia fuerte. Score baja 8 puntos por margen y stock.

7. Biblioteca inicial de alertas FARO

Una base inicial seria debería tener:

150 a 300 alertas iniciales

Escalable a:

1.000+ alertas por industria, módulo, KPI, tensión, acción y responsable.

Distribución sugerida:

Familia de alertas Cantidad inicial
Comerciales 30-50
Financieras 30-50
Stock / Compras 30-60
RRHH 20-40
Operaciones 30-50
Dirección / Workflow 30-60
Calidad de datos 20-40
Clientes 20-40
Proveedores 20-40
Industria específica 50-150

Arranque recomendable para MVP:

30 a 50 alertas críticas bien diseñadas.

Más vale pocas alertas que se atienden que 300 alarmas que todos aprenden a ignorar.


8. Estructura estándar de una alerta FARO

Cada alerta debe tener una ficha estructurada.

{
  "alert_code": "ALERT_COMMERCIAL_001",
  "title": "Margen crítico con descuento alto",
  "description": "El margen bruto cayó por debajo del umbral definido y el descuento promedio superó el máximo permitido.",
  "module": "Comercial",
  "area": "Comercial",
  "severity": "alta",
  "priority": "alta",
  "kpi_code": "gross_margin_rate",
  "signal_code": "gross_margin_drop",
  "rule_code": "RULE_MARGIN_DISCOUNT_001",
  "possible_tension": "crecimiento_no_rentable",
  "responsible_role": "Gerente Comercial",
  "approver_role": "Dirección",
  "consulted_roles": ["Finanzas", "Compras"],
  "suggested_action": "auditar_descuentos_altos",
  "due_hours": 72,
  "score_impact": -4,
  "confidence": 0.84,
  "status": "open",
  "channels": ["FARO Connect", "email", "WhatsApp ejecutivo"]
}

9. Campos obligatorios por alerta

Campo Para qué sirve
alert_code Identificador único.
title Título claro para el usuario.
description Explicación ejecutiva.
module Módulo FARO donde vive.
area Área responsable.
severity Gravedad.
priority Orden de atención.
kpi_code KPI afectado.
rule_code Regla que la disparó.
responsible_role Responsable de actuar.
suggested_action Acción sugerida.
due_hours / due_date Plazo recomendado.
confidence Confianza de la alerta.
status Estado de gestión.
score_impact Impacto posible en FARO Score.

10. Severidad de alertas

La severidad indica gravedad del evento.

Severidad Lectura Ejemplo
Baja Requiere monitoreo. Leve aumento de gastos.
Media Requiere revisión. Descuento promedio en amarillo.
Alta Requiere acción concreta. Margen en rojo con descuento alto.
Crítica Requiere prioridad inmediata y escalamiento. Caja por debajo del mínimo operativo.

11. Fórmula de severidad de alerta

Severidad alerta =
impacto económico × 30%
+ urgencia × 20%
+ desviación contra umbral × 20%
+ recurrencia × 15%
+ cantidad de áreas afectadas × 10%
+ confianza del dato × 5%

Código ejemplo:

def calcular_severidad_alerta(
    impacto,
    urgencia,
    desvio,
    recurrencia,
    areas_afectadas,
    confianza
):
    score = (
        impacto * 0.30 +
        urgencia * 0.20 +
        desvio * 0.20 +
        recurrencia * 0.15 +
        areas_afectadas * 0.10 +
        confianza * 0.05
    )

    if score >= 85:
        return "critica"
    elif score >= 65:
        return "alta"
    elif score >= 45:
        return "media"
    return "baja"

12. Prioridad de alerta

La severidad no siempre es igual a prioridad.

Ejemplo:

Una alerta financiera media puede tener prioridad alta si afecta caja de esta semana.
Una alerta comercial alta puede esperar si no tiene impacto inmediato.

Fórmula sugerida:

Prioridad =
severidad × 30%
+ impacto en caja × 25%
+ vencimiento cercano × 15%
+ tensión relacionada × 15%
+ responsable disponible × 5%
+ recurrencia × 10%

Código:

def calcular_prioridad_alerta(
    severidad_score,
    impacto_caja,
    vencimiento_cercano,
    tension_relacionada,
    responsable_disponible,
    recurrencia
):
    return round(
        severidad_score * 0.30 +
        impacto_caja * 0.25 +
        vencimiento_cercano * 0.15 +
        tension_relacionada * 0.15 +
        responsable_disponible * 0.05 +
        recurrencia * 0.10,
        2
    )

13. Estados de una alerta

Estado Significado
Open Alerta abierta.
Acknowledged Responsable la vio.
Assigned Ya tiene responsable formal.
In progress Se está trabajando.
Waiting validation Requiere validar dato o causa.
Converted to action Generó acción formal.
Escalated Fue escalada a un superior.
Resolved Se resolvió la condición.
Dismissed Se descartó por no aplicar.
False positive Alerta incorrecta.
Recurring Reaparece en varios períodos.
Closed Cerrada con evidencia.

Regla sana:

Una alerta no debería cerrarse solo porque alguien la vio. Se cierra porque se resolvió, se justificó o se convirtió en acción.


14. Ciclo de vida de una alerta FARO

Regla activada
→ alerta generada
→ responsable notificado
→ responsable confirma lectura
→ FARO sugiere acción
→ se crea acción o se justifica descarte
→ se hace seguimiento
→ se mide resultado
→ se cierra alerta
→ se actualiza FARO Score
→ se aprende para futuras reglas

15. Alertas comerciales

15.1 Alertas base

Alerta Condición Responsable
Margen crítico margen < umbral rojo Gerente Comercial
Descuento alto descuento > máximo permitido Gerente Comercial
Venta no rentable margen bajo + descuento alto Comercial / Finanzas
Vendedor con margen bajo margen por vendedor bajo Gerente Comercial
Cliente grande poco rentable venta alta + margen bajo Comercial / Finanzas
Comisión desalineada comisión sube + margen baja Comercial / RRHH
Mix comercial débil venta sube en productos bajo margen Comercial
Canal no rentable canal con margen bajo recurrente Comercial

15.2 Código: alerta de margen crítico

def alerta_margen_critico(margen, descuento, confianza):
    if margen < 0.20 and confianza >= 0.75:
        return {
            "alert_code": "margin_critical",
            "title": "Margen crítico",
            "severity": "alta",
            "area": "Comercial",
            "responsible": "Gerente Comercial",
            "suggested_action": "auditar_operaciones_bajo_margen",
            "confidence": confianza
        }

    if margen < 0.20 and confianza < 0.75:
        return {
            "alert_code": "margin_critical_low_confidence",
            "title": "Margen crítico con baja confianza",
            "severity": "media",
            "area": "Comercial",
            "requires_validation": True,
            "confidence": confianza
        }

    return None

16. Alertas financieras

16.1 Alertas base

Alerta Condición Responsable
Caja bajo mínimo caja < caja mínima Finanzas
Cobranza lenta días cobranza > objetivo Finanzas
Mora crítica mora > umbral Finanzas
Cliente grande moroso concentración alta + mora Finanzas / Comercial
Gasto desalineado gastos crecen más que ventas Finanzas
Pago vencido crítico obligación vencida Finanzas
Flujo operativo negativo egresos > ingresos Finanzas
Rentabilidad operativa baja rentabilidad < umbral Dirección / Finanzas

16.2 Código: alerta caja bajo mínimo

def alerta_caja_bajo_minimo(caja_actual, caja_minima):
    if caja_actual < caja_minima:
        brecha = caja_minima - caja_actual

        return {
            "alert_code": "cash_below_minimum",
            "title": "Caja por debajo del mínimo operativo",
            "severity": "critica",
            "area": "Finanzas",
            "responsible": "Responsable de Finanzas",
            "suggested_action": "priorizar_cobranza_y_revisar_pagos",
            "brecha": brecha,
            "score_impact": -7
        }

    return None

17. Alertas de stock

17.1 Alertas base

Alerta Condición Responsable
Stock bajo mínimo stock actual < stock mínimo Stock
Cobertura insuficiente días cobertura < plazo proveedor Compras / Stock
Stock inmovilizado producto sin movimiento > umbral Stock / Finanzas
Quiebre de producto clave producto crítico sin stock Stock / Comercial
Diferencia físico-sistema diferencia > tolerancia Stock
Stock mal compuesto stock alto + rotación baja + quiebres Stock / Compras
Producto crítico sin proveedor alternativo alta dependencia Compras
Sobrestock por sucursal stock alto y baja venta local Stock / Sucursal

17.2 Código: alerta cobertura insuficiente

def alerta_cobertura_insuficiente(stock_actual, venta_promedio_diaria, plazo_proveedor):
    if venta_promedio_diaria == 0:
        return None

    dias_cobertura = stock_actual / venta_promedio_diaria

    if dias_cobertura < plazo_proveedor:
        return {
            "alert_code": "coverage_below_supplier_lead_time",
            "title": "Cobertura menor al plazo de reposición",
            "severity": "alta",
            "area": "Stock / Compras",
            "responsible": "Responsable de Compras",
            "consulted": ["Stock", "Comercial"],
            "suggested_action": "anticipar_reposicion_o_buscar_alternativa",
            "dias_cobertura": round(dias_cobertura, 2),
            "plazo_proveedor": plazo_proveedor
        }

    return None

18. Alertas de compras y proveedores

Alerta Condición Responsable
Proveedor incumplidor cumplimiento < umbral Compras
Proveedor crítico dependencia alta + bajo cumplimiento Compras / Dirección
Costo de compra sube variación costo > tolerancia Compras / Finanzas
Compra urgente recurrente compras urgentes > umbral Compras
Orden crítica pendiente orden vencida de producto clave Compras
Proveedor sin alternativa dependencia alta sin suplente Dirección / Compras
Recepción con diferencia diferencia cantidad/precio Compras / Stock

Código ejemplo:

def alerta_proveedor_critico(cumplimiento, dependencia):
    if cumplimiento < 0.75 and dependencia > 0.40:
        return {
            "alert_code": "critical_supplier",
            "title": "Proveedor crítico",
            "severity": "alta",
            "area": "Compras",
            "responsible": "Responsable de Compras",
            "consulted": ["Stock", "Finanzas"],
            "suggested_action": "buscar_proveedor_alternativo_y_revisar_plan_de_reposicion",
            "possible_tension": "proveedor_critico"
        }

    return None

19. Alertas de RRHH

Alerta Condición Responsable
Costo laboral alto costo laboral / ventas > umbral RRHH / Finanzas
Comisión desalineada comisión sube + margen baja Comercial / RRHH
Ausentismo alto ausentismo > umbral RRHH
Productividad baja productividad < objetivo RRHH / Área
Dependencia de persona clave proceso crítico concentrado Dirección / RRHH
Tareas vencidas por responsable vencimientos recurrentes Responsable superior
Rotación elevada bajas > umbral RRHH

Código ejemplo:

def alerta_comision_desalineada(comision_sobre_margen, umbral=0.25):
    if comision_sobre_margen > umbral:
        return {
            "alert_code": "commission_margin_misaligned",
            "title": "Comisión elevada sobre margen",
            "severity": "alta",
            "area": "Comercial / RRHH",
            "responsible": "Gerente Comercial",
            "consulted": ["RRHH", "Finanzas"],
            "suggested_action": "revisar_formula_de_comision_por_margen_y_cobranza"
        }

    return None

20. Alertas de operaciones y workflow

Alerta Condición Responsable
Acción crítica vencida acción crítica vencida Responsable + Gerencia
Acciones vencidas altas tasa vencidas > umbral Gerencia General
Decisión sin acción decisión no bajada a tarea Dirección
Acción sin responsable tarea huérfana Gerencia / FARO Admin
Reclamo reincidente reclamo repetido Operaciones
SLA incumplido cumplimiento < umbral Operaciones
Cuello de botella acumulación por etapa Responsable de proceso
Cierre sin medición acción cerrada sin KPI Dirección

Código:

def alerta_accion_critica_vencida(accion):
    if accion["prioridad"] == "critica" and accion["estado"] != "cerrada" and accion["dias_vencida"] >= 1:
        return {
            "alert_code": "critical_action_overdue",
            "title": "Acción crítica vencida",
            "severity": "critica",
            "area": accion["area"],
            "responsible": accion["responsable"],
            "escalate_to": "Gerencia General",
            "suggested_action": "exigir_cierre_o_reasignar_responsable",
            "score_impact": -6
        }

    return None

21. Alertas de calidad de datos

Estas alertas son fundamentales. Si los datos son malos, FARO debe avisarlo antes de actuar.

Alerta Condición Impacto
Costo unitario incompleto faltan costos en ventas margen no confiable
Clientes duplicados duplicación alta rentabilidad/mora distorsionada
Stock desactualizado última carga vieja stock no confiable
Falta trazabilidad registros sin origen baja auditoría
Campos críticos vacíos datos mínimos faltantes bloquea KPIs
Inconsistencia entre fuentes ERP ≠ banco / stock físico ≠ sistema requiere conciliación
Carga atrasada fuente no actualiza score desactualizado

Código:

def alerta_calidad_datos(score_calidad, modulo):
    if score_calidad < 0.50:
        return {
            "alert_code": "data_quality_critical",
            "title": f"Calidad de datos crítica en {modulo}",
            "severity": "critica",
            "area": "Data / Sistemas",
            "responsible": "Data Owner",
            "suggested_action": "bloquear_decisiones_criticas_y_corregir_datos",
            "score_impact": -5
        }

    if score_calidad < 0.70:
        return {
            "alert_code": "data_quality_weak",
            "title": f"Calidad de datos débil en {modulo}",
            "severity": "media",
            "area": "Data / Sistemas",
            "responsible": "Data Owner",
            "suggested_action": "revisar_completitud_y_trazabilidad",
            "score_impact": -2
        }

    return None

22. Alertas preventivas

Las alertas preventivas son una de las capas más valiosas de FARO.

No esperan el rojo. Detectan el riesgo temprano.

Ejemplo:

Stock actual todavía está por encima del mínimo,
pero los días de cobertura son menores al plazo de reposición.

Alerta:

Riesgo de stock crítico futuro.

Código:

def alerta_preventiva_stock(stock_actual, stock_minimo, venta_promedio_diaria, plazo_proveedor):
    if venta_promedio_diaria == 0:
        return None

    dias_cobertura = stock_actual / venta_promedio_diaria

    if stock_actual >= stock_minimo and dias_cobertura < plazo_proveedor:
        return {
            "alert_code": "future_stock_risk",
            "title": "Riesgo futuro de stock crítico",
            "severity": "media_alta",
            "area": "Stock / Compras",
            "responsible": "Responsable de Compras",
            "suggested_action": "anticipar_reposicion",
            "preventive": True
        }

    return None

Esto es lo que diferencia a FARO de un tablero que llega tarde con cara de serio.


23. Alertas recurrentes

Una alerta recurrente indica que la empresa no está resolviendo la causa.

Ejemplo:

Margen crítico en la misma familia de productos durante 4 semanas.

O:

Acciones vencidas del mismo responsable durante 3 períodos.

Código:

def alerta_recurrente(alertas_previas, alert_code, limite=3):
    ocurrencias = [a for a in alertas_previas if a["alert_code"] == alert_code]

    if len(ocurrencias) >= limite:
        return {
            "alert_code": f"{alert_code}_recurring",
            "title": "Alerta recurrente",
            "severity": "alta",
            "message": "La alerta se repite y puede indicar causa raíz no resuelta.",
            "suggested_action": "analizar_causa_raiz_y_escalar"
        }

    return None

24. Alertas agrupadas

Para evitar ruido, FARO debe agrupar alertas relacionadas.

Ejemplo:

Alertas separadas:

Margen bajo.
Descuento alto.
Cobranza lenta.
Comisión elevada.

Agrupación FARO:

Paquete de alerta:
Crecimiento comercial riesgoso.

Esto puede derivar en tensión:

Crecimiento no rentable.

Código conceptual:

def agrupar_alertas(alertas):
    codigos = set(a["alert_code"] for a in alertas)

    if {"margin_critical", "discount_high", "collection_slow"}.issubset(codigos):
        return {
            "alert_group": "commercial_growth_risk",
            "title": "Crecimiento comercial riesgoso",
            "possible_tension": "crecimiento_no_rentable",
            "severity": "alta"
        }

    return None

25. Supresión de ruido

FARO debe evitar alertar por lo mismo cada cinco minutos.

Reglas de supresión:

No repetir la misma alerta si ya está abierta.
No notificar todos los días si no cambió la severidad.
Agrupar alertas similares.
Escalar solo si hay vencimiento o agravamiento.
Cerrar automáticamente solo si la condición se normalizó y fue validada.

Código ejemplo:

def debe_notificar(alerta_nueva, alertas_abiertas):
    for alerta in alertas_abiertas:
        misma_alerta = alerta["alert_code"] == alerta_nueva["alert_code"]
        mismo_responsable = alerta["responsible"] == alerta_nueva["responsible"]

        if misma_alerta and mismo_responsable and alerta["status"] in ["open", "in_progress"]:
            return False

    return True

26. Canales de alerta

FARO puede enviar alertas por distintos canales.

Canal Uso recomendado
FARO Connect Canal principal y trazable.
Email Alertas formales o reportes.
WhatsApp ejecutivo Alertas críticas o urgentes.
Slack / Teams Equipos operativos o técnicos.
Dashboard Visibilidad general.
Reporte semanal Alertas consolidadas.
Comité de dirección Alertas estratégicas y recurrentes.

Regla sana:

WhatsApp solo para lo crítico. Si todo va por WhatsApp, nada es crítico.


27. Matriz canal según severidad

Severidad Canal
Baja FARO Connect
Media FARO Connect + resumen diario/semanal
Alta FARO Connect + email al responsable
Crítica FARO Connect + email + WhatsApp ejecutivo + escalamiento

28. Alertas y responsables

Cada alerta debe tener RACI.

Ejemplo:

Alerta R A C I
Margen crítico Gerente Comercial Dirección Finanzas / Compras Administración
Stock crítico Responsable Stock Dirección Compras / Comercial Sucursal
Caja bajo mínimo Finanzas Dirección Comercial Administración
Acción crítica vencida Responsable acción Gerencia General Área involucrada Dirección
Calidad datos baja Data Owner Dirección Área dueña del dato Sistemas

Código:

def raci_alerta(alert_code):
    mapa = {
        "margin_critical": {
            "R": "Gerente Comercial",
            "A": "Dirección",
            "C": ["Finanzas", "Compras"],
            "I": ["Administración"]
        },
        "stock_critical": {
            "R": "Responsable de Stock",
            "A": "Dirección",
            "C": ["Compras", "Comercial"],
            "I": ["Sucursal"]
        },
        "cash_below_minimum": {
            "R": "Finanzas",
            "A": "Dirección",
            "C": ["Comercial"],
            "I": ["Administración"]
        }
    }

    return mapa.get(alert_code)

29. Alertas y vencimientos

Una alerta debe tener plazo sugerido según severidad.

Severidad Vencimiento sugerido
Baja 7 a 14 días
Media 3 a 7 días
Alta 48 a 72 horas
Crítica 24 horas o menos

Código:

def vencimiento_por_severidad(severidad):
    if severidad == "critica":
        return 24
    if severidad == "alta":
        return 72
    if severidad == "media":
        return 7 * 24
    return 14 * 24

30. Alertas y acciones

Una alerta puede:

quedar en observación,
generar acción sugerida,
generar acción obligatoria,
escalar a Dirección,
agruparse en tensión,
afectar FARO Score.

Ejemplo:

def convertir_alerta_en_accion(alerta):
    if alerta["severity"] in ["alta", "critica"]:
        return {
            "title": alerta["suggested_action"],
            "area": alerta["area"],
            "responsible": alerta["responsible"],
            "due_hours": vencimiento_por_severidad(alerta["severity"]),
            "related_alert": alerta["alert_code"],
            "priority": alerta["severity"],
            "status": "pendiente"
        }

    return None

31. Alertas y tensiones

Una alerta aislada puede no ser tensión.

Ejemplo:

Margen bajo = alerta.

Pero:

Margen bajo
+ ventas altas
+ descuento alto
+ cobranza lenta
= tensión de crecimiento no rentable.

Tabla:

Alertas combinadas Tensión probable
Margen bajo + descuento alto + ventas altas Crecimiento no rentable
Caja baja + cobranza lenta + ventas altas Caja débil con ventas altas
Stock crítico + proveedor incumplidor Riesgo de abastecimiento
Comisión alta + margen bajo Comisión desalineada
Acciones vencidas + reincidencia Dirección sin ejecución
Gasto sube + ventas planas Estructura sobredimensionada

32. Alertas y FARO Score

Las alertas deben impactar el FARO Score según severidad, recurrencia y estado.

Fórmula simple

def impacto_alerta_score(severidad, recurrente=False, cerrada_en_tiempo=False):
    if cerrada_en_tiempo:
        return 2

    impacto = {
        "baja": -1,
        "media": -2,
        "alta": -4,
        "critica": -7
    }.get(severidad, 0)

    if recurrente:
        impacto *= 1.5

    return impacto

Ejemplo:

Alerta crítica abierta: -7 puntos.
Alerta crítica recurrente: -10,5 puntos.
Alerta alta cerrada en tiempo: +2 puntos.

33. Alertas por industria

33.1 Construcción / insumos

Margen crítico por producto.
Descuento alto por vendedor.
Stock crítico en cemento / hierro / productos clave.
Cliente de obra con mora.
Canje sin evaluación financiera.
Referido sin trazabilidad.
Comisión externa elevada.
Proveedor crítico de producto esencial.
Compra urgente por falta de planificación.

33.2 Retail

Promoción destructiva.
Quiebre de producto estrella.
Sucursal con margen bajo.
Merma alta.
Stock alto con baja rotación.
Ticket promedio en caída.

33.3 Salud

Ocupación alta con demora.
Turnos perdidos.
Profesional saturado.
Costo por prestación elevado.
Reclamos crecientes.
Insumo crítico bajo mínimo.

33.4 Logística

SLA incumplido.
Costo por kilómetro elevado.
Combustible desalineado.
Ruta no rentable.
Flota ociosa.
Mantenimiento reactivo.

33.5 Hotelería

Ocupación alta con tarifa baja.
RevPAR bajo.
Canal caro dominante.
Reclamos altos.
Costo por habitación ocupada elevado.
Cancelaciones crecientes.

33.6 Shopping / real estate

Locatario clave moroso.
Vacancia crítica por zona.
Tráfico alto con baja conversión.
Costos comunes desalineados.
Mix comercial débil.
Renta por m² deteriorada.

34. Ejemplo completo: alerta comercial

Datos

Ventas: +18%
Margen actual: 18%
Descuento promedio: 12%
Confianza: 0.86

Regla activada

Si margen < 20%
y descuento > 10%
y confianza >= 0.75,
activar alerta de margen crítico por descuento.

Alerta FARO

{
  "alert_code": "margin_discount_critical",
  "title": "Margen crítico por descuento alto",
  "severity": "alta",
  "priority": "alta",
  "area": "Comercial",
  "responsible": "Gerente Comercial",
  "consulted": ["Finanzas", "Compras"],
  "suggested_action": "auditar_ventas_con_descuento_mayor_al_8",
  "due_hours": 72,
  "possible_tension": "crecimiento_no_rentable",
  "score_impact": -4
}

Lectura ejecutiva

La empresa está vendiendo con margen crítico y alto descuento. Puede estar comprando volumen a costa de rentabilidad.

35. Ejemplo completo: alerta financiera

Datos

Caja mínima requerida: $20M
Caja actual: $13M
Días de cobranza: 48
Ventas: +12%

Alerta FARO

{
  "alert_code": "cash_below_minimum",
  "title": "Caja por debajo del mínimo operativo",
  "severity": "critica",
  "area": "Finanzas",
  "responsible": "Finanzas",
  "consulted": ["Comercial", "Dirección"],
  "suggested_action": "priorizar_cobranza_y_reprogramar_pagos_no_criticos",
  "due_hours": 24,
  "possible_tension": "caja_debil_con_ventas_altas",
  "score_impact": -7
}

Lectura ejecutiva

La empresa vende, pero no está convirtiendo ventas en caja con la velocidad necesaria. Riesgo financiero inmediato.

36. Ejemplo completo: alerta de stock

Datos

Stock actual: 180 unidades
Stock mínimo: 150 unidades
Venta promedio diaria: 45 unidades
Plazo proveedor: 7 días

Cálculo

Días de cobertura = 4 días

Alerta FARO

{
  "alert_code": "future_stock_risk",
  "title": "Riesgo futuro de stock crítico",
  "severity": "alta",
  "area": "Stock / Compras",
  "responsible": "Compras",
  "consulted": ["Stock", "Comercial"],
  "suggested_action": "anticipar_reposicion_o_buscar_proveedor_alternativo",
  "due_hours": 48,
  "possible_tension": "stock_critico_comercial"
}

Lectura ejecutiva

Aunque el stock todavía supera el mínimo, la cobertura no alcanza para esperar el plazo del proveedor. Si no se actúa, habrá quiebre.

37. Tabla SQL de alertas

CREATE TABLE alert_events (
    alert_id TEXT PRIMARY KEY,
    alert_code TEXT NOT NULL,
    title TEXT NOT NULL,
    description TEXT,
    company_id TEXT,
    branch_id TEXT,
    area_id TEXT,
    module TEXT,
    kpi_code TEXT,
    signal_id TEXT,
    rule_code TEXT,
    tension_code TEXT,
    severity TEXT,
    priority TEXT,
    confidence NUMERIC,
    responsible_id TEXT,
    responsible_role TEXT,
    approver_id TEXT,
    suggested_action TEXT,
    due_date TIMESTAMP,
    status TEXT DEFAULT 'open',
    score_impact NUMERIC,
    source_snapshot JSONB,
    created_at TIMESTAMP DEFAULT now(),
    acknowledged_at TIMESTAMP,
    resolved_at TIMESTAMP,
    closed_at TIMESTAMP
);

38. Tabla SQL de biblioteca de alertas

CREATE TABLE alert_library (
    alert_code TEXT PRIMARY KEY,
    title TEXT NOT NULL,
    description TEXT,
    module TEXT,
    area_id TEXT,
    default_severity TEXT,
    default_priority TEXT,
    related_kpis JSONB,
    related_rules JSONB,
    related_tensions JSONB,
    suggested_actions JSONB,
    responsible_role TEXT,
    consulted_roles JSONB,
    default_due_hours INTEGER,
    score_impact NUMERIC,
    industry_scope JSONB,
    channels JSONB,
    active BOOLEAN DEFAULT true,
    created_at TIMESTAMP DEFAULT now(),
    updated_at TIMESTAMP DEFAULT now()
);

39. Tabla SQL de historial de estados

CREATE TABLE alert_status_history (
    id TEXT PRIMARY KEY,
    alert_id TEXT NOT NULL,
    previous_status TEXT,
    new_status TEXT,
    changed_by TEXT,
    change_reason TEXT,
    changed_at TIMESTAMP DEFAULT now()
);

Esto permite auditar:

quién vio la alerta,
quién la asignó,
quién la cerró,
por qué se descartó,
cuándo se escaló,
qué acción generó.

40. Motor de alertas FARO

Flujo recomendado:

Regla activada
→ validar confianza mínima
→ revisar si ya existe alerta abierta
→ calcular severidad
→ calcular prioridad
→ asignar responsable
→ definir vencimiento
→ seleccionar canal
→ registrar alerta
→ notificar
→ crear acción si corresponde
→ impactar score

Código conceptual:

def motor_alertas(rule_result, alertas_abiertas):
    if not rule_result:
        return None

    alerta = construir_alerta_desde_regla(rule_result)

    if not debe_notificar(alerta, alertas_abiertas):
        return {
            "status": "suppressed",
            "reason": "alerta_similar_abierta"
        }

    alerta["due_hours"] = vencimiento_por_severidad(alerta["severity"])
    alerta["channels"] = canales_por_severidad(alerta["severity"])

    return alerta


def canales_por_severidad(severidad):
    if severidad == "critica":
        return ["FARO Connect", "email", "WhatsApp ejecutivo"]
    if severidad == "alta":
        return ["FARO Connect", "email"]
    if severidad == "media":
        return ["FARO Connect", "resumen diario"]
    return ["FARO Connect"]

41. Alertas y validación humana

No todas las alertas deben generar decisión automática.

Alerta Requiere validación humana
Stock bajo mínimo No siempre. Puede crear acción automática.
Acción vencida No. Puede escalar automáticamente.
Margen bajo Sí, antes de cambiar política.
Cliente moroso Sí, antes de bloquear crédito.
Comisión desalineada Sí, antes de modificar fórmula.
Canje mal evaluado Sí, siempre.
RRHH sensible Sí, siempre.
Calidad de datos crítica Sí, requiere data owner.

Regla conservadora:

FARO puede automatizar seguimiento. Las decisiones sensibles deben quedar bajo aprobación humana.


42. Testing de alertas

Cada alerta debe probarse.

Ejemplo test:

def test_alerta_margen_critico():
    alerta = alerta_margen_critico(
        margen=0.18,
        descuento=0.12,
        confianza=0.90
    )

    assert alerta is not None
    assert alerta["alert_code"] == "margin_critical"
    assert alerta["severity"] == "alta"

Test con baja confianza:

def test_alerta_margen_baja_confianza():
    alerta = alerta_margen_critico(
        margen=0.18,
        descuento=0.12,
        confianza=0.60
    )

    assert alerta is not None
    assert alerta["requires_validation"] is True

Sin testing, una alerta es apenas una sospecha con pretensiones.


43. Riesgos si no existe una buena capa de alertas

Riesgo Consecuencia
Demasiadas alertas El usuario las ignora.
Alertas sin responsable Nadie actúa.
Alertas sin explicación Baja confianza.
Alertas sin vencimiento No hay presión de cierre.
Alertas sin trazabilidad No se puede auditar.
Alertas sin acción Se informa, pero no se gestiona.
Alertas repetidas Ruido operativo.
Alertas con datos débiles Decisiones equivocadas.
Alertas sin relación con score FARO Score pierde explicación.

44. Output final del Anexo 21

Al finalizar este anexo, FARO debe tener definido:

1. Biblioteca inicial de alertas FARO.
2. Tipos de alertas.
3. Estructura estándar de alerta.
4. Severidad de alertas.
5. Prioridad de alertas.
6. Estados de alerta.
7. Ciclo de vida de una alerta.
8. Alertas por área.
9. Alertas por industria.
10. Alertas preventivas.
11. Alertas recurrentes.
12. Alertas agrupadas.
13. Reglas de supresión de ruido.
14. Canales de notificación.
15. RACI por alerta.
16. Vencimientos sugeridos.
17. Conversión alerta → acción.
18. Conversión alerta → tensión.
19. Impacto en FARO Score.
20. Tablas SQL de alertas.
21. Motor de alertas.
22. Validación humana.
23. Testing de alertas.
24. Gobernanza de alertas.

45. Conexión con otros anexos

Próximo anexo Qué recibe desde Anexo 21
Anexo 17 — Biblioteca de KPIs KPIs que pueden disparar alertas.
Anexo 18 — Objetivos y umbrales Límites que definen estados de alerta.
Anexo 19 — Señales FARO Señales que pueden convertirse en alertas.
Anexo 20 — Reglas de negocio Reglas que disparan alertas.
Anexo 22 — Biblioteca de tensiones Alertas combinadas que forman tensiones.
Anexo 23 — Diagnóstico ejecutivo Alertas explicadas en lenguaje directivo.
Anexo 24 — Confianza del diagnóstico Confianza mínima para alertar o escalar.
Anexo 25 — Priorización ejecutiva Alertas ordenadas por impacto y urgencia.
Anexo 26 — Recomendaciones FARO Recomendaciones derivadas de alertas.
Anexo 29 — Biblioteca de acciones Acciones sugeridas por alerta.
Anexo 31 — Workflow y escalamiento Alertas convertidas en tareas y escalamiento.
Anexo 35 — FARO Score Impacto de alertas abiertas, críticas o resueltas.
Anexo 36 — Aprendizaje Historial de alertas para mejorar reglas futuras.

Las Alertas FARO son avisos ejecutivos accionables. Se generan cuando una regla detecta un desvío, riesgo o evento relevante, y deben incluir severidad, prioridad, responsable, vencimiento, explicación, acción sugerida, trazabilidad e impacto en FARO Score. No son notificaciones sueltas: son disparadores de gestión.

Versión 1.0 · Última revisión: 2026-05-28 Anexo 21 de 40 · Fase 6.2