Bot: dispara el post-análisis al cerrar la cualificación

Cuando la conversación llega al cierre (estado presupuesto/fin_*, o Luisa anuncia
que prepara/envía el presupuesto), el bot llama una vez a POST /api/leads/:id/analizar
para que la app capture todos los datos clave de la conversación de una pasada.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Carlos Narro
2026-06-10 11:56:05 +02:00
parent 1471261a73
commit 166d52f46d
2 changed files with 21 additions and 0 deletions

View File

@@ -49,6 +49,8 @@ export class WhatsappService implements OnModuleInit, OnModuleDestroy {
private readonly jidToLeadId = new Map<string, string>();
// contexto de lead por leadId
private readonly leadCache = new Map<string, LeadContext>();
// leads cuya conversación ya se mandó a post-análisis (para no repetir).
private readonly leadsAnalizados = new Set<string>();
constructor(
private readonly leadsService: LeadsService,
@@ -449,6 +451,20 @@ export class WhatsappService implements OnModuleInit, OnModuleDestroy {
this.logger.log(`Lead ${ctx.leadId} persistido — estado=${nuevoEstado || ctx.botStep}`);
}
// Al cerrar la cualificación, dispara el post-análisis de toda la conversación (una sola vez).
// Por estado (errático) O porque Luisa anuncia el presupuesto en su mensaje.
const cierre = ['presupuesto', 'fin_viable', 'fin_no_viable'];
const anunciaPresupuesto =
/presupuesto/i.test(respuesta) &&
/prepar|recib|enseguida|en un momento|te lo env|lo env|aqu[ií] mismo/i.test(respuesta);
if ((cierre.includes(ctx.botStep) || anunciaPresupuesto) && !this.leadsAnalizados.has(ctx.leadId)) {
this.leadsAnalizados.add(ctx.leadId);
this.api
.analizarConversacion(ctx.leadId)
.then((ok) => this.logger.log(`[ANALISIS] lead ${ctx.leadId}: ${ok ? 'ok' : 'fallo'}`))
.catch((e: any) => this.logger.error(`[ANALISIS] ${e.message}`));
}
await this.conversacionService.guardarMensaje(ctx.leadId, 'assistant', respuesta, {
botStep: ctx.botStep,
});