Actualizar server.js

This commit is contained in:
2026-03-20 14:53:46 +00:00
parent ca3e809bdc
commit 2c1d8c0a87

View File

@@ -853,8 +853,37 @@ async function procesarConIA(ownerId, mensajeCliente, datosExpediente) {
tramoConfirmado = 'una hora por confirmar';
}
// 🛑 NUEVO: MÁQUINA DEL TIEMPO (Saber si la cita ya pasó)
let citaYaPaso = false;
if (tieneCitaConfirmada && datosExpediente.cita) {
const hoyTime = new Date().setHours(0,0,0,0);
const [y, m, d] = datosExpediente.cita.split('-');
const citaTime = new Date(y, m - 1, d).setHours(0,0,0,0);
if (citaTime < hoyTime) citaYaPaso = true;
}
// 🛑 NUEVO: DETECTOR DE ESTADO FINALIZADO
const esEstadoFinal = datosExpediente.estado && (datosExpediente.estado.toLowerCase().includes('finalizado') || datosExpediente.estado.toLowerCase().includes('terminado') || datosExpediente.estado.toLowerCase().includes('anulado'));
// 🛑 NUEVO: DETECTOR DE SEGURO VS PARTICULAR
const nombreCia = datosExpediente.compania || "su Aseguradora";
const esSeguro = !nombreCia.toLowerCase().includes('particular');
let directivaEstricta = "";
if (esUrgencia) {
if (esEstadoFinal) {
if (esSeguro) {
directivaEstricta = `🛑 ESTADO ACTUAL: SERVICIO CERRADO POR EL TÉCNICO.\nTU ÚNICO OBJETIVO: Informar al cliente que el informe ya ha sido enviado a ${nombreCia} y que estamos a la espera de que ellos nos den respuesta o autorización para continuar los trabajos.\nPROHIBICIÓN ABSOLUTA: NO intentes agendar cita ni dar horas. No asumas que la reparación está 100% terminada.`;
} else {
directivaEstricta = `🛑 ESTADO ACTUAL: SERVICIO FINALIZADO O ANULADO.\nTU ÚNICO OBJETIVO: Despedirte amablemente o dar soporte post-servicio si el cliente particular tiene alguna duda.\nPROHIBICIÓN ABSOLUTA: NO intentes agendar cita ni dar horas. El trabajo ya se ha terminado.`;
}
} else if (citaYaPaso) {
if (esSeguro) {
directivaEstricta = `🛑 ESTADO ACTUAL: LA CITA YA HA PASADO.\n📅 La cita fue el día: ${datosExpediente.cita}.\nTU ÚNICO OBJETIVO: Informar que el técnico ya acudió a la visita y que actualmente estamos tramitando el informe con ${nombreCia}, a la espera de sus instrucciones.\nPROHIBICIÓN ABSOLUTA: No hables en futuro ni propongas más citas.`;
} else {
directivaEstricta = `🛑 ESTADO ACTUAL: LA CITA YA HA PASADO.\n📅 La cita fue el día: ${datosExpediente.cita}.\nTU ÚNICO OBJETIVO: Preguntar amablemente al cliente particular si el técnico acudió y si el problema quedó resuelto o si estamos elaborando su presupuesto.\nPROHIBICIÓN ABSOLUTA: No hables en futuro ni agendes.`;
}
} else if (esUrgencia) {
directivaEstricta = `🛑 ESTADO ACTUAL: SERVICIO DE URGENCIA.\nTU ÚNICO OBJETIVO: Tranquilizar al cliente. Dile que al ser urgencia el técnico está avisado.\nPROHIBICIÓN ABSOLUTA: No des cita ni propongas horas.`;
} else if (hayCitaPendiente) {
directivaEstricta = `🛑 ESTADO ACTUAL: CITA PENDIENTE DE APROBACIÓN POR TÉCNICO.\n📅 Propuesta actual: El día ${datosExpediente.cita_pendiente_fecha} ${tramoPendiente}.\nTU ÚNICO OBJETIVO: Informar al cliente que estamos esperando confirmación del técnico.\n⚠️ REGLA CRÍTICA: Ignora el historial si no coincide con esta propuesta.\nPROHIBICIÓN ABSOLUTA: No agendes de nuevo.`;
@@ -3768,7 +3797,8 @@ app.post("/webhook/evolution", async (req, res) => {
s.raw_data->>'Población' as poblacion,
s.raw_data->>'appointment_status' as appointment_status,
s.raw_data->>'requested_date' as cita_pendiente_fecha,
s.raw_data->>'requested_time' as cita_pendiente_hora
s.raw_data->>'requested_time' as cita_pendiente_hora,
s.raw_data->>'Compañía' as compania
FROM scraped_services s
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
@@ -3825,7 +3855,8 @@ app.post("/webhook/evolution", async (req, res) => {
is_urgent: service.is_urgent,
appointment_status: service.appointment_status,
cita_pendiente_fecha: service.cita_pendiente_fecha,
cita_pendiente_hora: service.cita_pendiente_hora
cita_pendiente_hora: service.cita_pendiente_hora,
compania: service.compania // 👈 NUEVO: PASAMOS LA COMPAÑÍA
});
if (respuestaIA) {