Skip to content

Sistema de Alertas y Notificaciones (Técnico)

El Sistema de Alertas y Notificaciones de Axol Systems automatiza la detección de condiciones operativas y plazos límite (como fechas de vencimiento) y distribuye notificaciones en tiempo real a los usuarios adecuados en la interfaz de Flutter.

La lógica de evaluación de alertas se procesa directamente en el servidor de base de datos para optimizar el rendimiento y asegurar la integridad de las reglas.


El sistema utiliza tres tablas principales para gestionar las reglas configuradas por los usuarios, almacenar las alertas generadas y controlar el estado de lectura individual:

Almacena los criterios definidos por los administradores para generar alertas:

PropiedadTipoDescripción
ID de Regla (id_rule)Texto (PK)Identificador único de la regla.
Nombre (rule_name)TextoNombre descriptivo de la regla (ej. “Factura por Vencer”).
Creador (creator_user_id)EnteroID del usuario que configuró la regla.
Tabla Origen (source_table)TextoTabla física monitoreada (ej. table6).
Tipo de Disparador (trigger_type)TextoMomento de evaluación: "onChange" (al guardar) o "scheduled" (programado por fechas).
Alcance (scope)TextoDestinatarios: "personal" (solo creador), "global" (todos) o "roleBased" (roles específicos).
Roles Destinatarios (target_role_ids)JSONLista de identificadores de roles autorizados a recibir el aviso (ej. ["rol_supervisor"]).
Condiciones (conditions)JSONLista de comparaciones lógicas a evaluar (ej. [{column, operator, targetValue}]).
Mensaje Plantilla (message_template)TextoTexto base con comodines dinámicos (ej. "El cliente {t6c0} debe {t6c2}").
Recordatorio Diario (remind_daily)BooleanoSi es verdadero, reenvía la alerta diariamente si la condición sigue activa.

Notificaciones Globales (global_notifications)

Section titled “Notificaciones Globales (global_notifications)”

Registra las alertas individuales compiladas y vigentes:

PropiedadTipoDescripción
ID de Notificación (id_notification)Texto (PK)Identificador único de la notificación.
Mensaje (message)TextoContenido del mensaje dinámico ya resuelto.
Tipo (type_notification)TextoSeveridad: "info", "warning", "error", o "maintenance".
Descartable (dismissible)BooleanoDefine si el usuario puede quitar el aviso de su cajón.
Vista Destino (target_view_id)TextoID de la vista a la que se redirigirá al hacer clic en “Ver Detalle”.
Fila Destino (target_row_id)TextoID del registro específico relacionado para abrir su detalle.
Fecha Expiración (expires_at)FechaLímite tras el cual la notificación deja de mostrarse.
Último Recordatorio (last_reminded_at)FechaControl de fecha para el reenvío diario.

Controla el estado de lectura de cada notificación por cada usuario:

PropiedadTipoDescripción
ID de Bandeja (id_user_notification)Texto (PK)Identificador único.
Usuario (id_user)EnteroID del usuario destinatario.
Notificación (id_notification)Texto (FK)Relación con la notificación global.
Leído (is_read)BooleanoSi el usuario ya marcó o descartó el aviso.

2. Motor de Alertas en el Servidor (Flujo Lógico)

Section titled “2. Motor de Alertas en el Servidor (Flujo Lógico)”

La evaluación de las condiciones y el envío de notificaciones ocurre en el backend mediante un conjunto de procesos estructurados:

Para evaluar condiciones basadas en campos que están relacionados (lookups virtuales), el motor cuenta con un resolvedor recursivo. Este recorre la ruta de referencias configurada (ej. t6c7,t2c1), buscando de forma automática en las tablas correspondientes hasta traer el valor final del texto.

Cuando se dispara una alerta, el sistema toma el texto base configurado en message_template y busca los comodines escritos entre llaves (ej. {t6c1}).

  • Extrae el valor real de la fila (incluso resolviendo lookups de manera interna si es necesario).
  • Reemplaza el comodín con el valor final (ej. reemplaza {t6c1} con "Comercial Alfa").

Evaluación Programada y Recordatorios Diarios

Section titled “Evaluación Programada y Recordatorios Diarios”

Para las alertas basadas en plazos de fechas (scheduled):

  1. Un proceso programado evalúa periódicamente las condiciones en el servidor.
  2. Si el registro cumple con la condición de vencimiento, se genera la notificación.
  3. Mecanismo remind_daily: Si el usuario marcó la alerta como leída (descartada) pero el registro origen sigue vencido (ej. no se ha capturado el pago), el proceso del servidor detecta que ha transcurrido un día desde el descarte y vuelve a crear la alerta en la bandeja del usuario para evitar olvidos.

El cliente móvil y web interactúa de forma fluida con este motor a través de las siguientes interfaces:

Diseñador de Reglas de Alerta (AlertRuleBuilderView)

Section titled “Diseñador de Reglas de Alerta (AlertRuleBuilderView)”

Permite a los supervisores crear reglas sin interactuar con bases de datos:

  • Mapeo de Vistas: El usuario selecciona la vista amigable (ej. "CLIENTES") y el diálogo resuelve por debajo el nombre de la tabla física correspondiente.
  • Dropdown de Columnas: Muestra en formato de doble fila el nombre de la propiedad y su tipo/código técnico en texto secundario.
  • Inline Error Banner: En caso de errores al guardar en el servidor, dibuja un banner rojo descriptivo dentro del propio diálogo modal para evitar que los mensajes emerjan detrás de la ventana.

Cajón de Notificaciones (NotificationDrawer)

Section titled “Cajón de Notificaciones (NotificationDrawer)”
  • Tabs con Badge: Las pestañas de filtrado de notificaciones se rediseñaron utilizando un layout Stack con posicionamiento absoluto (Positioned) para dibujar badges flotantes (contadores de no leídos). Esto mantiene la altura y alineación fija de las pestañas independientemente de si muestran números o no.
  • El badge se oculta explícitamente en la pestaña de historial completo (“Todo”).

4. Mantenimiento Automático del Historial

Section titled “4. Mantenimiento Automático del Historial”

Para optimizar el tamaño de la base de datos, el sistema ejecuta políticas de purga automáticas:

  • Notificaciones Expiradas: Se eliminan de inmediato al superar la fecha expires_at.
  • Purga de Historial Leído: Las notificaciones con más de 30 días de antigüedad que ya hayan sido leídas por todos sus destinatarios son eliminadas permanentemente.