Notificaciones¶
Hardhat Flow envía notificaciones SMS para eventos críticos usando Twilio. Toda entrega SMS es asíncrona — las notificaciones se despachan mediante workers Celery y nunca bloquean la solicitud de la aplicación.
Eventos que disparan SMS¶
Seis eventos disparan notificaciones SMS automáticas:
| Event | Who is Notified |
|---|---|
| Job bloqueado | PM + Owner |
| Job desbloqueado | PM |
| Bid rechazado | PM + Owner |
| Bid cancelado | PM + Supervisor |
| Job cancelado | PM + Supervisor |
| Bander Priority activada (Bid o Job) | PM + Supervisor |
Detalle de eventos¶
Job Blocked
Cuando blocked pasa a true en un Job, el PM asignado y el Owner reciben SMS. El mensaje incluye el ID del Job y blocked_reason.
Job Unblocked
Cuando se quita blocked en un Job, el PM recibe SMS confirmando que el bloqueo se resolvió.
Bid Rejected
Cuando un Owner pone un Bid en Bid Rejected, se notifica al PM asignado y a todos los usuarios con rol Owner del inquilino.
Bid Cancelled Cuando un Owner cancela un Bid, se notifica al PM y al Supervisor asignados.
Job Cancelled Cuando un Owner cancela un Job, se notifica al PM y al Supervisor asignados.
Priority Flag Set
Cuando priority pasa a true en un Bid o Job, el PM y el Supervisor asignados reciben SMS de urgencia.
Las notificaciones de prioridad se envían cuando la bandera se activa (de false a true). Al quitar la bandera no se envía notificación.
Requisito de número telefónico¶
Las notificaciones SMS requieren un número en el registro del usuario (User.phone).
- El teléfono es obligatorio para quien deba recibir SMS.
- Se recomienda encarecidamente registrar teléfonos para todas las cuentas de Owner, PM y Supervisor.
- Badge Workers y usuarios de Accounting no son destinatarios de SMS.
Si no hay teléfono registrado¶
Si se dispara una notificación para un usuario sin número:
- El SMS se omite en silencio para ese usuario.
- Se registra una advertencia vía structlog con ID de usuario, tipo de evento e ID de entidad.
- Los demás destinatarios (si los hay) reciben sus notificaciones con normalidad.
No hay notificación en la aplicación ni error visible al usuario que disparó el evento si un SMS no puede enviarse por falta de teléfono. Revise los registros si sospecha que faltan SMS.
Número saliente por inquilino¶
Cada inquilino tiene su propio número Twilio saliente. El número se guarda en CompanySettings.twilio_phone_number.
- Todo SMS enviado desde un inquilino sale del número configurado de esa empresa.
- Los destinatarios ven un número reconocible y consistente por compañía.
- El número lo configura el Owner o Platform Admin en CompanySettings.
Un número por inquilino ayuda a que clientes y personal reconozcan y distingan los SMS por empresa.
Entrega asíncrona vía Celery¶
Todas las notificaciones SMS se entregan de forma asíncrona:
- Ocurre el evento en la aplicación (ej. Job bloqueado).
- Se encola una tarea Celery de inmediato.
- Un worker Celery ejecuta la tarea y llama a la API de Twilio.
- La respuesta de la API (éxito o fallo) queda registrada.
La solicitud HTTP que disparó el evento no espera la entrega del SMS. Si Celery está caído o Twilio devuelve error, la acción en la aplicación igual se completa. Los fallos de SMS solo aparecen en registros.
La entrega SMS es el mejor esfuerzo posible. Si los workers Celery no están en ejecución, las notificaciones quedan en cola hasta que los workers vuelvan.
Formato del mensaje¶
Todos los SMS siguen este formato:
[Hardhat Flow] <Entity>: <identifier> — <what happened>.
| Event | Example Message |
|---|---|
| Job bloqueado | [Hardhat Flow] Job: 123 Main St — marked BLOCKED. Log in to view details. |
| Job desbloqueado | [Hardhat Flow] Job: 123 Main St — unblocked. |
| Bid rechazado | [Hardhat Flow] Bid: Acme Corp / 123 Main St — rejected. |
| Bid cancelado | [Hardhat Flow] Bid: Acme Corp / 123 Main St — cancelled. |
| Job cancelado | [Hardhat Flow] Job: 123 Main St — cancelled. |
| Prioridad (Bid) | [Hardhat Flow] Bid: Acme Corp / 123 Main St — marked HIGH PRIORITY. |
| Prioridad (Job) | [Hardhat Flow] Job: 123 Main St — marked HIGH PRIORITY. |
El identificador de entidad para Jobs es la ubicación del Bid asociado. Para Bids, es el nombre del cliente seguido de la ubicación del Bid.