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.
1. Estructura de Tablas del Sistema
Section titled “1. Estructura de Tablas del Sistema”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:
Reglas de Alerta (alert_rules)
Section titled “Reglas de Alerta (alert_rules)”Almacena los criterios definidos por los administradores para generar alertas:
| Propiedad | Tipo | Descripción |
|---|---|---|
ID de Regla (id_rule) | Texto (PK) | Identificador único de la regla. |
Nombre (rule_name) | Texto | Nombre descriptivo de la regla (ej. “Factura por Vencer”). |
Creador (creator_user_id) | Entero | ID del usuario que configuró la regla. |
Tabla Origen (source_table) | Texto | Tabla física monitoreada (ej. table6). |
Tipo de Disparador (trigger_type) | Texto | Momento de evaluación: "onChange" (al guardar) o "scheduled" (programado por fechas). |
Alcance (scope) | Texto | Destinatarios: "personal" (solo creador), "global" (todos) o "roleBased" (roles específicos). |
Roles Destinatarios (target_role_ids) | JSON | Lista de identificadores de roles autorizados a recibir el aviso (ej. ["rol_supervisor"]). |
Condiciones (conditions) | JSON | Lista de comparaciones lógicas a evaluar (ej. [{column, operator, targetValue}]). |
Mensaje Plantilla (message_template) | Texto | Texto base con comodines dinámicos (ej. "El cliente {t6c0} debe {t6c2}"). |
Recordatorio Diario (remind_daily) | Booleano | Si 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:
| Propiedad | Tipo | Descripción |
|---|---|---|
ID de Notificación (id_notification) | Texto (PK) | Identificador único de la notificación. |
Mensaje (message) | Texto | Contenido del mensaje dinámico ya resuelto. |
Tipo (type_notification) | Texto | Severidad: "info", "warning", "error", o "maintenance". |
Descartable (dismissible) | Booleano | Define si el usuario puede quitar el aviso de su cajón. |
Vista Destino (target_view_id) | Texto | ID de la vista a la que se redirigirá al hacer clic en “Ver Detalle”. |
Fila Destino (target_row_id) | Texto | ID del registro específico relacionado para abrir su detalle. |
Fecha Expiración (expires_at) | Fecha | Límite tras el cual la notificación deja de mostrarse. |
Último Recordatorio (last_reminded_at) | Fecha | Control de fecha para el reenvío diario. |
Bandeja del Usuario (user_notifications)
Section titled “Bandeja del Usuario (user_notifications)”Controla el estado de lectura de cada notificación por cada usuario:
| Propiedad | Tipo | Descripción |
|---|---|---|
ID de Bandeja (id_user_notification) | Texto (PK) | Identificador único. |
Usuario (id_user) | Entero | ID del usuario destinatario. |
Notificación (id_notification) | Texto (FK) | Relación con la notificación global. |
Leído (is_read) | Booleano | Si 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:
Resolución Dinámica de Lookups
Section titled “Resolución Dinámica de Lookups”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.
Compilación de Plantillas de Mensajes
Section titled “Compilación de Plantillas de Mensajes”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):
- Un proceso programado evalúa periódicamente las condiciones en el servidor.
- Si el registro cumple con la condición de vencimiento, se genera la notificación.
- 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.
3. Integración en el Cliente de Flutter
Section titled “3. Integración en el Cliente de Flutter”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
Stackcon 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.