From 5c3a18d97e2c08a579faa1138ba3e8d168808cf8 Mon Sep 17 00:00:00 2001 From: marsalva Date: Mon, 23 Mar 2026 21:34:34 +0000 Subject: [PATCH] Actualizar server.js --- server.js | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/server.js b/server.js index fa4bd5e..a5e1cc2 100644 --- a/server.js +++ b/server.js @@ -954,11 +954,11 @@ async function procesarConIA(ownerId, mensajeCliente, datosExpediente) { } else if (esUrgencia) { directivaEstricta = `🛑 ESTADO ACTUAL: URGENCIA. Tranquiliza al cliente sobre su avería (${datosExpediente.averia}) y dile que el técnico está avisado. NO PROPONGAS HORAS.`; } else if (hayCitaPendiente) { - directivaEstricta = `🛑 ESTADO ACTUAL: CITA PENDIENTE DE APROBACIÓN.\n📅 Propuesta actual: El día ${datosExpediente.cita_pendiente_fecha} ${tramoPendiente}.\nTU OBJETIVO: Informar que esperamos confirmación de la oficina para reparar su avería (${datosExpediente.averia}).\n⚠️ EXCEPCIÓN: Si el cliente pide CAMBIAR o CANCELAR, ofrécele un hueco nuevo.`; + directivaEstricta = `🛑 ESTADO ACTUAL: CITA PENDIENTE DE APROBACIÓN.\n📅 Propuesta actual: El día ${datosExpediente.cita_pendiente_fecha} ${tramoPendiente}.\nTU OBJETIVO: Informar que esperamos confirmación del técnico para reparar su avería (${datosExpediente.averia}).\n⚠️ EXCEPCIÓN: Si el cliente pide CAMBIAR o CANCELAR, ofrécele un hueco nuevo.`; } else if (tieneCitaConfirmada) { directivaEstricta = `🛑 ESTADO ACTUAL: CITA CONFIRMADA para el ${datosExpediente.cita} ${tramoConfirmado}. Recuerda la cita para su avería (${datosExpediente.averia}).\n⚠️ EXCEPCIÓN: Si el cliente pide CAMBIARLA o CANCELARLA, ofrécele un hueco nuevo.`; } else { - directivaEstricta = `🟢 ESTADO ACTUAL: PENDIENTE DE AGENDAR CITA.\nTU OBJETIVO: Acordar fecha y hora para reparar su avería (${datosExpediente.averia}). NUNCA ofrezcas horas ocupadas. Fines de semana solo URGENCIAS.`; + directivaEstricta = `🟢 ESTADO ACTUAL: PENDIENTE DE AGENDAR CITA.\nTU OBJETIVO: Acordar fecha y hora para reparar su avería (${datosExpediente.averia}). NUNCA ofrezcas horas ocupadas. Fines de semana solo URGENCIAS.\n⚠️ MUY IMPORTANTE: Cuando el cliente elija un hueco, NO le digas que la cita está confirmada. Dile que le pasas la nota al técnico para que él lo valide.`; } const promptSistema = ` @@ -978,8 +978,8 @@ async function procesarConIA(ownerId, mensajeCliente, datosExpediente) { --- ⚡ REGLA CRÍTICA DE AGENDA (COMANDO SECRETO) --- Si (y solo si) has propuesto un hueco y el cliente ACEPTA FIRMEMENTE, DEBES añadir AL FINAL ABSOLUTO de tu respuesta este texto literal: [PROPUESTA:YYYY-MM-DD HH:mm] - Ejemplo de respuesta tuya: "Perfecto, te agendo para el miércoles entre las 10:00 y las 11:00. ¡Nos vemos! [PROPUESTA:2026-03-25 10:00]" - ⛔ PROHIBICIÓN: NUNCA menciones al cliente las palabras "código", "confirmación" ni "propuesta". Solo pega los corchetes al final de tu mensaje y ya está. + Ejemplo de respuesta tuya: "Perfecto, le paso la nota al técnico para que te confirme el miércoles entre las 10:00 y las 11:00 aprox. ¡Te decimos algo pronto! [PROPUESTA:2026-03-25 10:00]" + ⛔ PROHIBICIÓN: NUNCA le digas "te agendo" ni "cita confirmada". El cliente debe saber que dependemos del técnico. NUNCA menciones las palabras "código" o "etiqueta". --- ⚙️ REGLAS DE COMUNICACIÓN --- 1. MÁXIMO 2 FRASES. Mensajes cortos y directos. @@ -4002,19 +4002,15 @@ app.post("/webhook/evolution", async (req, res) => { const fechaSugerida = matchPropuesta[1]; const horaSugerida = matchPropuesta[2]; - // 🚀 GUARDADO DIRECTO A CITA CONFIRMADA (Va al calendario del Operario sin preguntar) - const statusQ = await pool.query("SELECT id FROM service_statuses WHERE owner_id=$1 AND name ILIKE '%citado%' LIMIT 1", [ownerId]); - const idCitado = statusQ.rowCount > 0 ? String(statusQ.rows[0].id) : null; - - const rawQ = await pool.query("SELECT raw_data FROM scraped_services WHERE id=$1", [service.id]); - let rawActual = rawQ.rows[0].raw_data || {}; - - rawActual.scheduled_date = fechaSugerida; - rawActual.scheduled_time = horaSugerida; - rawActual.appointment_status = 'approved'; - if (idCitado) rawActual.status_operativo = idCitado; - - await pool.query("UPDATE scraped_services SET raw_data = $1 WHERE id = $2", [JSON.stringify(rawActual), service.id]); + // 🚀 GUARDADO COMO PENDIENTE (Espera a que el Técnico la apruebe en la App o en la Oficina) + await pool.query(` + UPDATE scraped_services + SET raw_data = raw_data || jsonb_build_object( + 'requested_date', $1::text, + 'requested_time', $2::text, + 'appointment_status', 'pending' + ) WHERE id = $3 + `, [fechaSugerida, horaSugerida, service.id]); } // 🧹 BORRAMOS EL TEXTO DEL CÓDIGO PARA QUE EL CLIENTE NO LO VEA NUNCA