feat(api): webhooks Monday en tiempo real + alertas de inventario cableadas
- Webhook Oportunidades: cambio de etapa dispara escaneo (Aparto→Apartado, Ganado→Venta) además del round-robin de leads por create_item - Acepta los nombres reales de los eventos de Monday: create_pulse/pulseId y update_column_value (verificados en vivo) - Token interno (X-Internal-Token) para que los syncs locales llamen POST /cotizaciones/alertas-inventario sin JWT de usuario - sync-estatus-maestro.py notifica los cambios aplicados al endpoint de alertas (actividad al vendedor con cotizaciones recientes) - Fix P1008 SQLite: escaneos del poll cron secuenciales + connection_limit=1 en DATABASE_URL - Webhooks registrados en Monday sobre https://frasa.consultoria-as.com (Leads create_item, Oportunidades change_column_value); crons quedan como red de seguridad - Docs: sección 0 en AUTOMATIZACIONES-MONDAY.md con la matriz de eventos y los quirks de Monday
This commit is contained in:
@@ -3,12 +3,48 @@
|
||||
Recetas que se activan **desde la UI de Monday** (botón "Automatizar" en cada
|
||||
tablero). Tiempo estimado total: ~10 minutos. Ninguna requiere código.
|
||||
|
||||
> **No duplicar**: el servidor (API Gateway, crons cada 5 min) ya cubre la
|
||||
> asignación round-robin de vendedores, el recordatorio de leads inactivos
|
||||
> (10 días), el escalado de leads sin contactar (48 h), y la creación de items
|
||||
> en Apartado / Ventas cuando una oportunidad entra a **Aparto** o **Ganado**.
|
||||
> Las recetas de abajo son solo *avisos y orden visual*; no repitas esas reglas
|
||||
> como recetas nativas.
|
||||
> **No duplicar**: el servidor (API Gateway) ya cubre la asignación round-robin
|
||||
> de vendedores, el recordatorio de leads inactivos (10 días), el escalado de
|
||||
> leads sin contactar (48 h), y la creación de items en Apartado / Ventas
|
||||
> cuando una oportunidad entra a **Aparto** o **Ganado**. Las recetas de abajo
|
||||
> son solo *avisos y orden visual*; no repitas esas reglas como recetas
|
||||
> nativas.
|
||||
|
||||
## 0. Cómo llegan los eventos al servidor (webhooks + crons)
|
||||
|
||||
Desde que el stack tiene dominio público (Cloudflare Tunnel), Monday avisa al
|
||||
servidor **en tiempo real** vía webhooks registrados en
|
||||
`https://frasa.consultoria-as.com/api/webhooks/monday`:
|
||||
|
||||
| Board | Evento registrado | Reacción del servidor |
|
||||
|---|---|---|
|
||||
| Leads | `create_item` | Round-robin: asigna Vendedor al lead nuevo |
|
||||
| Oportunidades | `change_column_value` | Si la etapa es **Aparto** → crea item en Apartado; si es **Ganado** → crea item en Ventas |
|
||||
|
||||
Los **crons cada 5 min** (`POLL_CRON`) siguen activos como red de seguridad:
|
||||
repiten los mismos escaneos (idempotentes, con dedup en la base) por si un
|
||||
evento se pierde. El escaneo de **inactividad** (9:00) y los **recordatorios
|
||||
de cobranza** (9:30) solo corren por cron.
|
||||
|
||||
Notas técnicas (quirks de Monday, ya contemplados en el código):
|
||||
|
||||
- El webhook se registra como `create_item` pero el payload real llega como
|
||||
`create_pulse`, y el id viene en `pulseId` (no `itemId`).
|
||||
- Los cambios de columna llegan como `update_column_value`.
|
||||
- El evento `change_status_column_value` **no dispara** en estos boards; por
|
||||
eso se registró `change_column_value`.
|
||||
- Monday no firma sus webhooks: el servidor usa el evento solo como disparador
|
||||
y re-consulta el tablero por API antes de escribir nada.
|
||||
|
||||
Para re-registrar un webhook (p. ej. si cambia el dominio):
|
||||
|
||||
```graphql
|
||||
mutation {
|
||||
create_webhook(board_id: <BOARD_ID>,
|
||||
url: "https://frasa.consultoria-as.com/api/webhooks/monday",
|
||||
event: create_item) { id }
|
||||
}
|
||||
```
|
||||
|
||||
## 1. Tablero Leads — avisar al vendedor cuando se le asigna un lead
|
||||
|
||||
@@ -66,5 +102,5 @@ tablero mantiene el orden sin trabajo manual:
|
||||
1. Crea un item de prueba en **Leads**, asígnate como Vendedor → debe llegarte
|
||||
la notificación de la receta 1. Bórralo después.
|
||||
2. En **Oportunidades**, cambia un item de prueba a **Ganado** → notificación
|
||||
de la receta 2 **y** (en ≤ 5 min, por el servidor) un item nuevo en
|
||||
**Ventas**. Borra ambos después.
|
||||
de la receta 2 **y** (en segundos, vía webhook; ≤ 5 min por el cron de
|
||||
respaldo) un item nuevo en **Ventas**. Borra ambos después.
|
||||
|
||||
Reference in New Issue
Block a user