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):