import { Injectable, Logger } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; import { LeadsService } from '../leads/leads.service'; import { ConversacionService } from '../conversacion/conversacion.service'; import { WhatsappService } from '../whatsapp/whatsapp.service'; import { ClaudeService } from '../claude/claude.service'; @Injectable() export class SchedulerService { private readonly logger = new Logger(SchedulerService.name); constructor( private readonly leadsService: LeadsService, private readonly conversacionService: ConversacionService, private readonly whatsappService: WhatsappService, private readonly claudeService: ClaudeService, ) {} /** * Cada 5 minutos: * 1. Busca leads con estado_actual = 'nuevo' * 2. Los marca como 'en_proceso' * 3. Les envía el mensaje de APERTURA de Luisa * * También marca como perdidos los leads en_proceso sin actividad > 48h. */ @Cron(CronExpression.EVERY_5_MINUTES) async procesarLeadsNuevos(): Promise { this.logger.log('[Scheduler] Buscando leads nuevos...'); // Primero limpiar leads inactivos await this.leadsService.marcarLeadsPerdidos(); // Obtener leads nuevos const leadsNuevos = await this.leadsService.findByEstado('nuevo'); if (leadsNuevos.length === 0) { this.logger.log('[Scheduler] No hay leads nuevos.'); return; } this.logger.log( `[Scheduler] Procesando ${leadsNuevos.length} lead(s) nuevo(s).`, ); for (const lead of leadsNuevos) { try { // Marcar como en_proceso antes de hacer nada await this.leadsService.updateEstado(lead, 'en_proceso'); this.logger.log( `[Scheduler] Lead id=${lead.id} marcado como en_proceso.`, ); // Generar mensaje de apertura con Claude usando contexto mínimo const historialVacio: Array<{ role: string; content: string }> = []; const mensajeDeApertura = 'APERTURA: Este es el primer mensaje. Preséntate y comienza el flujo de cualificación.'; const { respuesta } = await this.claudeService.llamarClaude( lead, historialVacio, mensajeDeApertura, ); // Guardar el mensaje de apertura en historial (como assistant) await this.conversacionService.guardarMensaje( lead.id, 'assistant', respuesta, ); // Enviar por WhatsApp await this.whatsappService.enviarApertura(lead.telefono, respuesta); this.logger.log( `[Scheduler] Apertura enviada a lead id=${lead.id} (${lead.telefono}).`, ); } catch (error) { this.logger.error( `[Scheduler] Error procesando lead id=${lead.id}: ${error.message}`, error.stack, ); } } } }