Files
FRASA-CAS/docs/AUTOMATIZACIONES-MONDAY.md
Consult AS Technology 04941e9f80 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
2026-08-28 16:46:08 +00:00

107 lines
4.4 KiB
Markdown

# Automatizaciones nativas de Monday — checklist del admin
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) 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
El round-robin del servidor asigna la columna **Vendedor**; esta receta solo
envía la notificación.
- Board: **Leads**
- Receta: *"When a person is assigned to someone, notify someone"* (categoría
**People**; en español: "Cuando se asigne una persona, notificar a alguien")
- Parámetros:
- person column: **Vendedor**
- notify: **the person assigned** (el vendedor asignado)
- mensaje: `Tienes un lead nuevo: {item.name}`
## 2. Tablero Oportunidades — avisar cuando algo se gana
El servidor ya crea el item en Ventas; esto solo avisa al equipo.
- Board: **Oportunidades**
- Receta: *"When status changes to something, notify someone"* (categoría
**Status**)
- Parámetros:
- status column: **Estado** → valor: **Ganado**
- notify: una persona o equipo de coordinación (elegir en la receta)
- mensaje: `Venta ganada: {item.name} — {item.text_mm6ezd0d}` (unidad)
## 3. Tablero Apartado — recordatorio de fecha límite
- Board: **Apartado**
- Receta: *"When a date arrives, notify someone"* (categoría **Date
reminders**)
- Parámetros:
- date column: **Fecha límite**
- when: **1 día antes**, a las **9:00**
- notify: **el responsable del expediente** (o coordinación)
- mensaje: `El apartado de {item.name} vence mañana`
## 4. Mover items entre grupos por estado (orden visual)
Si los tableros tienen grupos (p. ej. "Activos" / "Cerrados"), una receta por
tablero mantiene el orden sin trabajo manual:
- Board: **Oportunidades** (repetir en **Leads** si usa grupos)
- Receta: *"When status changes to something, move item to group"* (categoría
**Status**)
- Parámetros sugeridos:
- **Estado** = Ganado → mover al grupo **Cerrados**
- **Estado** = Perdido → mover al grupo **Cerrados**
- **Estado** = Abandono → mover al grupo **Cerrados**
> Si el tablero no tiene grupos, omite esta receta: no afecta nada del servidor.
## Verificación rápida (2 min)
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 segundos, vía webhook; ≤ 5 min por el cron de
respaldo) un item nuevo en **Ventas**. Borra ambos después.