One Hat Cyber Team
Your IP :
104.23.243.58
Server IP :
172.67.218.182
Server :
Linux 128-201-239-36.cprapid.com 3.10.0-1160.41.1.el7.x86_64 #1 SMP Tue Aug 31 14:52:47 UTC 2021 x86_64
Server Software :
Apache
PHP Version :
7.4.33
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
home
/
juscatamarca
/
www
/
subdomains
/
justabot
/
View File Name :
ChatBot.php
<?php date_default_timezone_set('America/Argentina/Buenos_Aires'); header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); header("Access-Control-Allow-Methods: POST"); header("Access-Control-Max-Age: 3600"); header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); require_once 'funciones_bot.php'; require_once 'funciones_menu.php'; require_once 'asistente_openai.php'; $apiKey = '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'; $data = json_decode(file_get_contents("php://input")); if ( !empty($data->query) && !empty($data->appPackageName) && !empty($data->messengerPackageName) && !empty($data->query->sender) && !empty($data->query->message) ) { $telefono = $data->query->sender; $mensaje = strtolower(trim($data->query->message)); registrarUsuarioSiNoExiste($telefono); $datosUltimaVisita = obtenerUltimaVisita($telefono); if ($datosUltimaVisita) { $fecha = $datosUltimaVisita['fecha_ultima_visita']; $hora = $datosUltimaVisita['hora_ultima_visita']; $ultimaVisita = DateTime::createFromFormat('Y-m-d H:i:s', "$fecha $hora"); $ahora = new DateTime(); $intervalo = $ahora->getTimestamp() - $ultimaVisita->getTimestamp(); if ($intervalo >= 3600) { // 3600 segundos = 1 hora actualizarEstadoUsuario($telefono, 'sesion_finalizada'); } } if (esNuevoDia($telefono)) { actualizarEstadoUsuario($telefono, null); } $estado = obtenerEstadoUsuario($telefono); $respuestas = []; $nombre = obtenerNombreUsuario($telefono); if (!$estado) { if (empty($nombre)) { actualizarEstadoUsuario($telefono, 'esperando_dni'); $respuestas[] = "👋 ¡Hola! Soy *JUSTA* 🤖, el asistente virtual del Poder Judicial de Catamarca.\nAntes de continuar necesito tu número de DNI."; } else { $respuestas[] = "👋 ¡Hola *$nombre*! Soy JUSTA. 🤖\n¿Qué te gustaría consultar? Elegí una opción:\n\n". obtenerMenuPrincipal(); actualizarEstadoUsuario($telefono, 'esperando_opcion'); } } else { switch ($estado) { case 'esperando_dni': if (is_numeric($mensaje)) { $nombre = buscarEnPadron($mensaje); if ($nombre) { guardarDniTemporal($telefono, $mensaje); $respuestas[] = "📋 Encontré el nombre *$nombre*.\n¿Sos vos?\n\n1️⃣ Sí\n2️⃣ No"; } else { guardarDniTemporal($telefono, $mensaje); actualizarEstadoUsuario($telefono, 'esperando_nombre_manual'); $respuestas[] = "❌ No encontré tu DNI en el padrón.\nPor favor, escribí tu *nombre y apellido* para registrarte."; } } else { $respuestas[] = "⚠️ El DNI debe contener solo números. Intentá de nuevo."; } break; case 'confirmar_nombre_padron': if ($mensaje === '1') { // Confirmó que es él $dni = obtenerDniTemporal($telefono); // función nueva que lee `usuario_dni` $nombre = buscarEnPadron($dni); actualizarUsuarioConNombre($telefono, $nombre); actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "✅ Gracias *$nombre*. Ya estás registrado."; $respuestas[] = "¿Qué te gustaría consultar? Elegí una opción:\n\n". obtenerMenuPrincipal(); } elseif ($mensaje === '2') { actualizarEstadoUsuario($telefono, 'esperando_nombre_manual'); $respuestas[] = "✍️ Por favor escribí tu nombre y apellido completo."; } else { $respuestas[] = "⚠️ Escribí 1 para *Sí* o 2 para *No*."; } break; case 'esperando_nombre_manual': if (preg_match('/^[a-zA-ZÁÉÍÓÚÑáéíóúñ\s]{3,50}$/u', $mensaje)) { $nombreFormateado = mb_strtoupper($mensaje, 'UTF-8'); actualizarUsuarioConNombre($telefono, $nombreFormateado); actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "✅ Gracias *$nombreFormateado*. Ya estás registrado."; $respuestas[] ="¿Qué te gustaría consultar? Elegí una opción:\n\n" .obtenerMenuPrincipal(); } else { $respuestas[] = "⚠️ El nombre ingresado no es válido. Solo debe contener letras y espacios (mínimo 3 caracteres, sin símbolos ni números).\n\n ✍️ Por favor escribí tu *nombre y apellido* nuevamente."; } break; case 'sesion_finalizada': $respuestas[] = "⏳ ¡Hola de nuevo! Pasó más de una hora desde tu última consulta, así que reiniciamos la conversación. ¿Qué te gustaría consultar? Elegí una opción:\n\n". obtenerMenuPrincipal(); actualizarEstadoUsuario($telefono, 'esperando_opcion'); break; //Menu principal case 'esperando_opcion': switch ($mensaje) { case '1': actualizarEstadoUsuario($telefono, 'menu_violencia'); $respuestas[] = violenciaFAMILIARyDeGÉNERO(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; break; case '2': actualizarEstadoUsuario($telefono, 'menu_juicio_jurados'); $respuestas[] = juicioPorJurado(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; break; case '3': actualizarEstadoUsuario($telefono, 'menu_escuela_capacitacion'); $respuestas[] = EscuelaCapacitacion(). "⬅️ Escribí *X* para volver al menú anterior."; //porque no tiene submenus esta opcion break; case '4': actualizarEstadoUsuario($telefono, 'menu_calendario'); $respuestas[] = "🗓 *Calendario Judicial*: https://juscatamarca.gob.ar/asuetosyferiados/public/\n\n". "⬅️ Escribí *X* para volver al menú anterior."; break; case '5': actualizarEstadoUsuario($telefono, 'menu_concursos'); $respuestas[] = ConsursosJudiciales(). "⬅️ Escribí *X* para volver al menú anterior."; break; case '6': actualizarEstadoUsuario($telefono, 'menu_tec_forense'); $respuestas[] = EquipoTecnicoForense(). "⬅️ Escribí *X* para volver al menú anterior."; break; case '7': actualizarEstadoUsuario($telefono, 'esperando_consulta'); $respuestas[] = "✍️ Escribí de forma breve tu consulta"; break; case '8': actualizarEstadoUsuario($telefono,'esperando_dni_votacion'); $respuestas[] = "✍️ Escribí el número de DNI para buscar en el padrón electoral."; break; default: $respuestas[] = "❌ Opción inválida. Por favor escribí un número del *1 al 8*."; break; } break; // Menu y submenus de GUÍA DE RECURSOS POR VIOLENCIA FAMILIAR Y DE GÉNERO case 'menu_violencia': switch ($mensaje) { case '1': actualizarEstadoUsuario($telefono, 'submenu_asesoramiento'); $respuestas[] = Asesoramiento(); break; case '2': actualizarEstadoUsuario($telefono, 'submenu_recepcion_denuncias'); $respuestas[] = RecepcionDenuncias(); break; case '3': actualizarEstadoUsuario($telefono, 'submenu_GuiaDerechoDeLasMujeres'); $respuestas[] = GuiaDerechoDeLasMujeres(); break; case '4': actualizarEstadoUsuario($telefono, 'submenu_Mediacion'); $respuestas[] = Mediacion(); break; case '5': actualizarEstadoUsuario($telefono, 'submenu_JuzgadosFamilia'); $respuestas[] = JuzgadoFamilia(); break; case '6': actualizarEstadoUsuario($telefono, 'submenu_AudienciaLaboral'); $respuestas[] = AudienciaLaboral(); break; case '7': actualizarEstadoUsuario($telefono, 'submenu_DefensoriaCivil'); $semana_actual = date("W"); // semana del año (01-53) $respuestas[] = DefensoriaCivil($semana_actual); break; case '8': actualizarEstadoUsuario($telefono, 'submenu_AsesoriaMenores'); $dia_string = date("d"); // devuelve el día con dos dígitos (01-31) $dia = (int) $dia_string; $respuestas[] = AsesoriaMenores($dia); break; default: if (in_array(strtoupper($mensaje), ['X', 'Z'])) { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = obtenerMenuPrincipal(); } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta.\nEscribí *X* o *Z* para volver al menú principal."; } break; } break; //submenus case 'submenu_asesoramiento': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_violencia'); $respuestas[] = violenciaFAMILIARyDeGÉNERO(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_recepcion_denuncias': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_violencia'); $respuestas[] = violenciaFAMILIARyDeGÉNERO(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_GuiaDerechoDeLasMujeres': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_violencia'); $respuestas[] = violenciaFAMILIARyDeGÉNERO(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_Mediacion': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_violencia'); $respuestas[] = violenciaFAMILIARyDeGÉNERO(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_JuzgadosFamilia': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_violencia'); $respuestas[] = violenciaFAMILIARyDeGÉNERO(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_AudienciaLaboral': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_violencia'); $respuestas[] = violenciaFAMILIARyDeGÉNERO(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_DefensoriaCivil': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_violencia'); $respuestas[] = violenciaFAMILIARyDeGÉNERO(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_AsesoriaMenores': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_violencia'); $respuestas[] = violenciaFAMILIARyDeGÉNERO(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; // Menu y submenus de JUICIO POR JURADOS case 'menu_juicio_jurados': switch ($mensaje) { case '1': actualizarEstadoUsuario($telefono, 'submenu_InformacionGral'); $respuestas[] = InformacionGral(); break; case '2': actualizarEstadoUsuario($telefono, 'submenu_ParticipacionDeCiudadanos'); $respuestas[] = ParticipacionDeCiudadanos(); break; case '3': actualizarEstadoUsuario($telefono, 'submenu_ConvocatoriaParajurados'); $respuestas[] = ConvocatoriaParajurados(); break; case '4': actualizarEstadoUsuario($telefono, 'submenu_RetribucionAjurados'); $respuestas[] = RetribucionAjurados(); break; case '5': actualizarEstadoUsuario($telefono, 'submenu_AudienciaSeleccionJurados'); $respuestas[] = AudienciaSeleccionJurados(); break; case '6': actualizarEstadoUsuario($telefono, 'submenu_DuranteJuicio'); $respuestas[] = DuranteJuicio(); break; case '7': actualizarEstadoUsuario($telefono, 'submenu_DerechosyObligaciones'); $respuestas[] = DerechosyObligaciones(); break; default: if (in_array(strtoupper($mensaje), ['X', 'Z'])) { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = obtenerMenuPrincipal(); } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta.\nEscribí *X* o *Z* para volver al menú principal."; } break; } break; //submenus case 'submenu_InformacionGral': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_juicio_jurados'); $respuestas[] = juicioPorJurado(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_ParticipacionDeCiudadanos': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_juicio_jurados'); $respuestas[] = juicioPorJurado(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_ConvocatoriaParajurados': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_juicio_jurados'); $respuestas[] = juicioPorJurado(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_RetribucionAjurados': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_juicio_jurados'); $respuestas[] = juicioPorJurado(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_AudienciaSeleccionJurados': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_juicio_jurados'); $respuestas[] = juicioPorJurado(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_DuranteJuicio': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_juicio_jurados'); $respuestas[] = juicioPorJurado(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; case 'submenu_DerechosyObligaciones': if (strtoupper($mensaje) === 'Z') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = "📋 *Menú principal:*\n\n". obtenerMenuPrincipal(); } elseif (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'menu_juicio_jurados'); $respuestas[] = juicioPorJurado(). "✍️ Respondé con el número de la opción\n o ⬅️ Escribí *X* para volver al menú anterior."; //vuelve al mostrar el menu de violencia } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta"; } break; // Menu y submenus de JUICIO POR JURADOS case 'menu_escuela_capacitacion': if (in_array(strtoupper($mensaje), ['X', 'Z'])) { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = obtenerMenuPrincipal(); } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta.\nEscribí *X* o *Z* para volver al menú principal."; } break; // Menu y submenus de Calendario case 'menu_calendario': if (in_array(strtoupper($mensaje), ['X', 'Z'])) { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = obtenerMenuPrincipal(); } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta.\nEscribí *X* o *Z* para volver al menú principal."; } break; // Menu y submenus de Cocursos Judiciales case 'menu_concursos': if (in_array(strtoupper($mensaje), ['X', 'Z'])) { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = obtenerMenuPrincipal(); } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta.\nEscribí *X* o *Z* para volver al menú principal."; } break; // Menu y submenus de Calendario case 'menu_tec_forense': if (in_array(strtoupper($mensaje), ['X', 'Z'])) { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = obtenerMenuPrincipal(); } else { $respuestas[] = "❌ Opción inválida. Por favor escribí una opción correcta.\nEscribí *X* o *Z* para volver al menú principal."; } break; // A Partir de aca, con chat Gpt para que responda de un documento case 'esperando_consulta': if (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = obtenerMenuPrincipal(); break; } $threadId = obtenerThreadIdPorTelefono($telefono); if (!$threadId) { $threadId = crearNuevoThread($apiKey); guardarThreadIdPorTelefono($telefono, $threadId); } //$respuestas[] = "💬 Dame unos segundos... ya estoy leyendo tu consulta 📖"; try { $respuestaGPT = enviarPreguntaAlAsistente($mensaje, $threadId); if (empty($respuestaGPT)) { $respuestas[] = "❌ No se pudo generar una respuesta en este momento. Intentá más tarde."; } else { actualizarEstadoUsuario($telefono, 'esperando_consulta'); $respuestas[] = $respuestaGPT; $respuestas[] = "✍️ Si querés hacer otra pregunta, escribila ahora.\n⬅️ O escribí *X* para volver al menú principal."; } } catch (Exception $e) { $respuestas[] = "❌ Error al consultar OpenAI: " . $e->getMessage(); } break; //PAdron Electoral case 'esperando_dni_votacion': { if (strtoupper($mensaje) === 'X') { actualizarEstadoUsuario($telefono, 'esperando_opcion'); $respuestas[] = obtenerMenuPrincipal(); break; } // ====== CONFIG PADRÓN (EDITAR) ====== $DB_HOST = 'localhost'; $DB_NAME = 'juscatamarca_padron_electoral_2025'; $DB_USER = 'juscatamarca_charbot'; $DB_PASS = 'eOIw8M3X)?-U'; // ====== OBTENER DNI DEL MENSAJE ====== $dni = preg_replace('/\D+/', '', (string)$mensaje); // Solo dígitos if (strlen($dni) < 7) { $respuestas[] = "⚠️ El DNI ingresado no parece válido. Intentá de nuevo."; break; } try { // ====== CONEXIÓN PDO ====== $dsn = "mysql:host={$DB_HOST};dbname={$DB_NAME};charset=utf8mb4"; $pdo = new PDO($dsn, $DB_USER, $DB_PASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]); // ====== CONSULTA ====== $sql = " SELECT v.TX_APELLIDO, v.TX_NOMBRE, v.NU_MATRICULA, v.NU_NRO_MESA, v.TX_CIRC_NUMERO, e.*, m.*, d.dpto_id, d.nombre_depto FROM votantes AS v LEFT JOIN establecimiento AS e ON TRIM(v.NU_NRO_MESA) = TRIM(e.NU_NUMERO) LEFT JOIN municipios AS m ON TRIM(UPPER(CAST(v.TX_CIRC_NUMERO AS CHAR))) = TRIM(UPPER(m.CIRC)) LEFT JOIN departamentos AS d ON TRIM(CAST(m.DEPARTAMENTO AS CHAR)) = TRIM(CAST(d.dpto_id AS CHAR)) WHERE TRIM(CAST(v.NU_MATRICULA AS CHAR)) = ? "; $stmt = $pdo->prepare($sql); $stmt->execute([$dni]); $filas = $stmt->fetchAll(); if (empty($filas)) { $respuestas[] = "🔎 No se encontraron resultados para el DNI *{$dni}*.\n✍️ Si querés consultar otro dni, escribilo ahora.\n⬅️ O escribí *X* para volver al menú principal."; actualizarEstadoUsuario($telefono, 'esperando_dni_votacion'); break; } // ====== ARMADO DE MENSAJES ====== $i = 0; foreach ($filas as $fila) { $i++; $apellido = $fila['TX_APELLIDO'] ?? ''; $nombre = $fila['TX_NOMBRE'] ?? ''; $mesa = $fila['NU_NRO_MESA'] ?? '(s/d)'; $escuela = $fila['ESTABLECIMIENTO'] ?? ($fila['TX_NOMBRE_ESTABLE'] ?? '(s/d)'); $domicilio = $fila['DOMICILIO'] ?? '(s/d)'; $localidad = $fila['LOCALIDAD'] ?? '(s/d)'; $municipio = $fila['MUNICIPIO'] ?? ($fila['TX_MUNICIPIO'] ?? '(s/d)'); $circuito = $fila['CIRCUITO'] ?? '(s/d)'; $deptoNom = $fila['nombre_depto'] ?? '(s/d)'; $deptoId = $fila['dpto_id'] ?? '(s/d)'; $msg = "✅ Encontrado en padrón:\n\n"; $msg .= "👤 *{$apellido}, {$nombre}*\n"; $msg .= "🪪 DNI: *{$dni}*\n"; $msg .= "🗳️ Mesa: *{$mesa}*\n"; $msg .= "🏫 Establecimiento: *{$escuela}*\n"; $msg .= "📍 Domicilio: *{$domicilio}*\n"; $msg .= "🏘️ Localidad: *{$localidad}*\n"; $msg .= "🏛️ Municipio: *{$municipio}*\n"; $msg .= "🔁 Circuito: *{$circuito}*\n"; $msg .= "🗺️ Depto: *{$deptoNom}*\n"; $respuestas[] = $msg; } actualizarEstadoUsuario($telefono, 'esperando_dni_votacion'); $respuestas[] = "Si querés consultar otro dni, escribilo ahora.\n⬅️ O escribí *X* para volver al menú principal."; } catch (PDOException $e) { $respuestas[] = "❌ Error inesperado, reintente "; //$respuestas[] = "❌ Error de base de datos: " . $e->getMessage(); actualizarEstadoUsuario($telefono, 'esperando_dni_votacion'); } catch (Throwable $t) { $respuestas[] = "❌ Error inesperado, reintente "; //$respuestas[] = "❌ Error inesperado: " . $t->getMessage(); actualizarEstadoUsuario($telefono, 'esperando_dni_votacion'); } break; } default: $respuestas[] = "⏳ ¡Hola de nuevo! Tu sesión fue restablecida por inactividad, así que reiniciamos la conversación. ¿Qué te gustaría consultar? Elegí una opción:\n\n". obtenerMenuPrincipal(); actualizarEstadoUsuario($telefono, 'esperando_consulta'); break; } } if (empty($respuestas)) { $respuestas[] = "⏳ ¡Hola de nuevo! Parece que tu sesión había expirado o no se pudo identificar tu estado anterior.\n\nEmpecemos de nuevo. Elegí una opción del menú:\n\n" . obtenerMenuPrincipal(); obtenerMenuPrincipal(); actualizarEstadoUsuario($telefono, 'esperando_opcion'); } http_response_code(200); echo json_encode(["replies" => array_map(fn($m) => ["message" => $m], $respuestas)]); } else { http_response_code(400); // echo json_encode(["replies" => [ // ["message" => "Error ❌"], // ["message" => "JSON incompleto. ¿Seguro que el mensaje lo envió AutoResponder?"] // ]]); } ?>