feat(modo-local): CRM 100% local sin dependencia de Monday.com
Nuevas tablas: - ActividadLocal (historial de llamadas, reuniones, tareas) - AsignacionLocal (round-robin local) - fechaLimite en LeadCaptura Servicios nuevos: - actividad-local.service.ts (CRUD actividades) - local-canal.ts (canal de envío para recordatorios) - seed-modo-local.js (activar modo local) Mi día local mejorado: - Mis actividades hoy (filtros usuario/fecha/estado) - Apartados por vencer (con fechaLimite real) - Equipo (contadores por vendedor, solo coordinador/admin) - unidadCodigo en oportunidades desde datosJson Automatizaciones locales: - Round-robin: asigna leads sin vendedor + crea actividad - Inactividad: detecta oportunidades >10 días sin update - Escalado: alerta oportunidades >48h sin contacto Reportes: actividadesAbiertas + parcial:false en modo local Cron wiring: crons locales cuando Monday caído 661 tests verdes.
This commit is contained in:
@@ -53,10 +53,26 @@ if (config.automatizaciones.enabled) {
|
||||
// escaneos en paralelo provoca timeouts P1008 en AutomatizacionState.
|
||||
cron.schedule(config.automatizaciones.pollCron, () => {
|
||||
void (async () => {
|
||||
// Modo local: Monday caído → saltar las reglas sin ruido (fallan seguro de todos modos)
|
||||
// Modo local: Monday caído → ejecutar versiones locales de las automatizaciones
|
||||
if (!saludMonday.estaDisponible()) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.debug('[cron poll] Monday no disponible (modo local); pasada omitida')
|
||||
try {
|
||||
const r = await automatizacionesService.runRoundRobinLocal()
|
||||
if (r.asignados > 0) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(`[cron poll-local] round-robin local: ${r.asignados} lead(s) asignado(s)`)
|
||||
}
|
||||
} catch (err: unknown) {
|
||||
console.error('[cron poll-local] error en round-robin local:', err)
|
||||
}
|
||||
try {
|
||||
const r = await automatizacionesService.escaneoEscaladoLocal()
|
||||
if (r.escalados > 0) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(`[cron poll-local] escalado local: ${r.escalados} lead(s) escalado(s)`)
|
||||
}
|
||||
} catch (err: unknown) {
|
||||
console.error('[cron poll-local] error en escalado local:', err)
|
||||
}
|
||||
return
|
||||
}
|
||||
try {
|
||||
@@ -97,8 +113,14 @@ if (config.automatizaciones.enabled) {
|
||||
// Escaneo diario de leads inactivos (recordatorio vía update en el item)
|
||||
cron.schedule(config.automatizaciones.recordatorioCron, () => {
|
||||
if (!saludMonday.estaDisponible()) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.debug('[cron inactividad] Monday no disponible (modo local); escaneo omitido')
|
||||
// Modo local: escaneo de inactividad sobre tablas locales
|
||||
automatizacionesService
|
||||
.escaneoInactividadLocal({ preview: false })
|
||||
.then((r) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(`[cron inactividad-local] ${r.recordatoriosEnviados} recordatorio(s) local(es)`)
|
||||
})
|
||||
.catch((err: unknown) => console.error('[cron inactividad-local] error en escaneo local:', err))
|
||||
return
|
||||
}
|
||||
automatizacionesService
|
||||
|
||||
Reference in New Issue
Block a user