feat: automatizaciones ronda 2 + app de dashboards /dash
- Escalado: lead asignado sin contactar >48h genera actividad URGENTE al coordinador (LEAD_ESCALADO_HORAS, MONDAY_COORDINADOR_USER_ID) - Oportunidad en Aparto crea item en Apartado (fecha límite +7d); en Ganado crea la Venta; ambos con dedup - GET /api/reportes/resumen: leads, funnel, unidades por desarrollo, cobranza y actividades en una respuesta (cache 60s) - App dashboards (/dash): 8 KPIs + 3 gráficas Recharts, con auth - Landing: tarjeta Tableros; docs/AUTOMATIZACIONES-MONDAY.md con las recetas nativas para activar en la UI - Tests: api 158, dashboards 7, landing 5 — todo verde
This commit is contained in:
@@ -8,7 +8,9 @@ const app = crearApp()
|
||||
// Crons de respaldo (el webhook público aún no existe: no hay SSL ni DNS).
|
||||
// Se desactivan con MONDAY_AUTOMATIONS_ENABLED=false.
|
||||
if (config.automatizaciones.enabled) {
|
||||
// Polling: asigna vendedor (round-robin) a leads nuevos sin persona asignada
|
||||
// Polling: asigna vendedor (round-robin) a leads nuevos sin persona asignada,
|
||||
// escala leads sin contactar y crea Apartados/Ventas al moverse Oportunidades.
|
||||
// Cada regla tiene su propio catch: un fallo de Monday no rompe las demás.
|
||||
cron.schedule(config.automatizaciones.pollCron, () => {
|
||||
automatizacionesService
|
||||
.runRoundRobin()
|
||||
@@ -19,6 +21,29 @@ if (config.automatizaciones.enabled) {
|
||||
}
|
||||
})
|
||||
.catch((err: unknown) => console.error('[cron poll] error en round-robin:', err))
|
||||
|
||||
automatizacionesService
|
||||
.escaneoEscalado()
|
||||
.then((r) => {
|
||||
if (r.escalados > 0) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(`[cron poll] escalado: ${r.escalados} lead(s) escalado(s)`)
|
||||
}
|
||||
})
|
||||
.catch((err: unknown) => console.error('[cron poll] error en escalado:', err))
|
||||
|
||||
automatizacionesService
|
||||
.escaneoOportunidades()
|
||||
.then((r) => {
|
||||
if (r.apartadosCreados.length > 0 || r.ventasCreadas.length > 0 || r.errores.length > 0) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(
|
||||
`[cron poll] oportunidades: ${r.apartadosCreados.length} apartado(s), ` +
|
||||
`${r.ventasCreadas.length} venta(s), ${r.errores.length} error(es)`,
|
||||
)
|
||||
}
|
||||
})
|
||||
.catch((err: unknown) => console.error('[cron poll] error en oportunidades:', err))
|
||||
})
|
||||
|
||||
// Escaneo diario de leads inactivos (recordatorio vía update en el item)
|
||||
|
||||
Reference in New Issue
Block a user