feat: mis cobranzas, recordatorios de pago y agente IA con acciones

- PlanPago.vendedorId + filtro ?mios=1; toggle Mis planes/Todos en /pay
- Motor de recordatorios: próximos a vencer (3d) y vencidos (re-cada 7d),
  canal Monday Actividad + stub WhatsApp listo para WA CRM, log persistente,
  cron diario 9:30, run manual con dry-run, historial en /api/cobranza/recordatorios
- Agente IA: memoria por usuario (conversaciones aisladas) y tool calling:
  cotizar_unidad (motor real por desarrollo) y buscar_unidad (inventario Monday)
- Tests: api 261, cobranza 75, agente-ia 13
This commit is contained in:
2026-08-28 08:07:12 +00:00
parent 59944668a8
commit aa27e89c75
18 changed files with 1437 additions and 17 deletions

View File

@@ -2,6 +2,7 @@ import cron from 'node-cron'
import { crearApp } from './app.js'
import { config } from './config/index.js'
import { automatizacionesService } from './services/automatizaciones.service.js'
import { recordatoriosCobranzaService } from './services/recordatorios-cobranza.service.js'
const app = crearApp()
@@ -59,6 +60,22 @@ if (config.automatizaciones.enabled) {
// eslint-disable-next-line no-console
console.log(`Automatizaciones Monday activas (poll: "${config.automatizaciones.pollCron}", inactividad: "${config.automatizaciones.recordatorioCron}")`)
// Escaneo diario de recordatorios de cobranza (pagos por vencer / vencidos)
cron.schedule(config.recordatoriosCobranza.cron, () => {
recordatoriosCobranzaService
.ejecutarPasada()
.then((r) => {
// eslint-disable-next-line no-console
console.log(
`[cron cobranza] recordatorios: ${r.enviados.length} enviado(s), ` +
`${r.evaluados.filter((e) => e.decision === 'dedup').length} deduplicado(s), ${r.fallidos.length} fallido(s)`,
)
})
.catch((err: unknown) => console.error('[cron cobranza] error en recordatorios:', err))
})
// eslint-disable-next-line no-console
console.log(`Recordatorios de cobranza activos (cron: "${config.recordatoriosCobranza.cron}")`)
}
app.listen(config.port, () => {