Saltar a contenido

Diagrama de Estado: Notificacion

La Notificacion es el aggregate root del dominio GexCom. Su ciclo de vida esta controlado por transiciones de estado con reglas de negocio validadas en la entidad.

Maquina de Estados

stateDiagram-v2
    [*] --> PENDIENTE : Notificacion.crear()

    PENDIENTE --> EN_PROCESO : iniciar_proceso()
    PENDIENTE --> CANCELADA : cancelar()

    EN_PROCESO --> ENVIADA : marcar_enviada()
    EN_PROCESO --> FALLIDA : marcar_fallida()
    EN_PROCESO --> CANCELADA : cancelar()

    ENVIADA --> RECIBIDA : confirmar_recepcion()
    ENVIADA --> FALLIDA : marcar_fallida()

    FALLIDA --> EN_PROCESO : reintentar()
    FALLIDA --> CANCELADA : cancelar()

    RECIBIDA --> [*] : (terminal)
    CANCELADA --> [*] : (terminal)

    note right of PENDIENTE
        Estado inicial al crear
        la notificacion
    end note

    note right of ENVIADA
        Dispatch completado
        via Email o WhatsApp
    end note

    note right of FALLIDA
        Permite reintentar
        o cancelar definitivamente
    end note

Reglas de Transicion

Las transiciones son validadas por TransicionEstado en core/:

Desde Hacia Metodo Validacion
PENDIENTE EN_PROCESO iniciar_proceso() Proceso activo
PENDIENTE CANCELADA cancelar() Observacion requerida
EN_PROCESO ENVIADA marcar_enviada() Canal configurado
EN_PROCESO FALLIDA marcar_fallida() Motivo de fallo
EN_PROCESO CANCELADA cancelar() Observacion requerida
ENVIADA RECIBIDA confirmar_recepcion()
ENVIADA FALLIDA marcar_fallida() Motivo de fallo
FALLIDA EN_PROCESO reintentar() Max reintentos no alcanzado
FALLIDA CANCELADA cancelar() Observacion requerida

Canales de Notificacion

Cada Notificacion tiene un CanalNotificacion que determina el dispatcher:

graph LR
    N[Notificacion] --> C{Canal}
    C -->|EMAIL| ED[EmailDispatcher<br/>SMTP]
    C -->|WHATSAPP| WD[WhatsAppDispatcher<br/>Meta API]
    C -->|PRESENCIAL| P[Manual]
    C -->|TELEFONO| T[Manual]
    C -->|CORREO_FISICO| CF[Manual]
    ED --> DW[DispatchWorker<br/>asyncio.Queue + retry]
    WD --> DW

Los canales PRESENCIAL, TELEFONO y CORREO_FISICO son gestionados manualmente por el notificador — no tienen dispatcher automatico.

Audit Trail

Cada cambio de estado genera un registro en AuditLog (append-only, inmutable en PostgreSQL via trigger):

AuditLog {
    id: int (autoincrement)
    tabla: str
    accion: str  (CAMBIO_ESTADO, CREAR, etc.)
    usuario_id: UUID
    detalles: JSON
    timestamp: datetime
}