Actualizar server.js

This commit is contained in:
2026-03-08 15:03:46 +00:00
parent 96d6c9cc58
commit 235ed3e0c2

View File

@@ -3094,11 +3094,12 @@ app.post("/webhook/evolution", async (req, res) => {
const ownerId = instanceName.split("_")[1]; const ownerId = instanceName.split("_")[1];
const cleanPhone = telefonoCliente.slice(-9); const cleanPhone = telefonoCliente.slice(-9);
// 🔍 BUSCAMOS EL EXPEDIENTE ACTIVO MÁS RECIENTE (Ignorando finalizados/anulados)
const svcQ = await pool.query(` const svcQ = await pool.query(`
SELECT s.id, s.service_ref, s.assigned_to, u.full_name as worker_name, s.is_urgent, SELECT s.id, s.service_ref, s.assigned_to, u.full_name as worker_name, s.is_urgent,
st.name as status_name, st.name as status_name,
s.raw_data->>'scheduled_date' as cita, s.raw_data->>'scheduled_date' as cita,
s.raw_data->>'scheduled_time' as hora_cita, -- 👈 NUEVO: EXTRAEMOS LA HORA s.raw_data->>'scheduled_time' as hora_cita,
s.raw_data->>'Población' as poblacion, s.raw_data->>'Población' as poblacion,
s.raw_data->>'appointment_status' as appointment_status, s.raw_data->>'appointment_status' as appointment_status,
s.raw_data->>'requested_date' as cita_pendiente_fecha, s.raw_data->>'requested_date' as cita_pendiente_fecha,
@@ -3106,19 +3107,20 @@ app.post("/webhook/evolution", async (req, res) => {
FROM scraped_services s FROM scraped_services s
LEFT JOIN users u ON s.assigned_to = u.id LEFT JOIN users u ON s.assigned_to = u.id
LEFT JOIN service_statuses st ON (s.raw_data->>'status_operativo')::text = st.id::text LEFT JOIN service_statuses st ON (s.raw_data->>'status_operativo')::text = st.id::text
WHERE s.owner_id = $1 AND s.status != 'archived' AND s.raw_data::text ILIKE $2 WHERE s.owner_id = $1
AND s.status != 'archived'
AND s.raw_data::text ILIKE $2
-- 👇 MAGIA: Excluimos de la búsqueda los estados muertos
AND (st.name IS NULL OR (st.name NOT ILIKE '%finalizado%' AND st.name NOT ILIKE '%anulado%' AND st.name NOT ILIKE '%desasignado%'))
ORDER BY s.created_at DESC LIMIT 1 ORDER BY s.created_at DESC LIMIT 1
`, [ownerId, `%${cleanPhone}%`]); `, [ownerId, `%${cleanPhone}%`]);
if (svcQ.rowCount > 0) { if (svcQ.rowCount > 0) {
const service = svcQ.rows[0]; const service = svcQ.rows[0];
// Si entra aquí, es 100% seguro que el expediente está vivo y la IA puede hablar.
// 🛑 NUEVO ESCUDO: Bloquear IA si el estado es finalizado, anulado o desasignado
const nombreEstado = (service.status_name || "").toLowerCase();
if (nombreEstado.includes('finalizado') || nombreEstado.includes('anulado') || nombreEstado.includes('desasignado')) {
console.log(`🛑 [IA SILENCIADA] El cliente escribió, pero el exp #${service.service_ref} está ${service.status_name}.`);
return;
}
candadosIA.add(service.id); candadosIA.add(service.id);
try { try {