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

@@ -45,6 +45,11 @@ export class ApiClient {
}
}
// Post-análisis: la app lee toda la conversación del lead y extrae los datos clave de una pasada.
async analizarConversacion(leadId: string): Promise<boolean> {
return this.post(`/api/leads/${leadId}/analizar`, {});
}
async buscarLeadPorTelefono(telefono: string): Promise<string | null> {
try {
const { data } = await axios.get(`${this.baseUrl}/api/leads/by-phone`, {

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,
});