getConnection(); echo "════════════════════════════════════════\n"; echo " DEBUG: Turno WA → consentimiento_turno [usite]\n"; echo "════════════════════════════════════════\n\n"; // ── 1. Config WA turnero ────────────────────────────────────── echo "1. CONFIGURACIÓN WHATSAPP\n"; echo "─────────────────────────\n"; // Token y phone IDs viven en system_config; resto en lab_config $sysCfg = $pdo->query( "SELECT config_key AS k, config_value AS v FROM system_config WHERE config_key IN ('whatsapp_token','whatsapp_phone_number_id','whatsapp_phone_number_id_turnero')" )->fetchAll(PDO::FETCH_KEY_PAIR); $labCfg = $pdo->query( "SELECT clave AS k, valor AS v FROM lab_config WHERE clave IN ('turnero_wa_template','turnero_wa_lang','turnero_wa_kiosko_enabled')" )->fetchAll(PDO::FETCH_KEY_PAIR); $cfg = array_merge($sysCfg, $labCfg); $tokenLen = strlen($cfg['whatsapp_token'] ?? ''); echo "Token WA: " . ($tokenLen > 0 ? "✅ presente ({$tokenLen} chars)" : "❌ VACÍO") . "\n"; echo "Phone ID principal: " . ($cfg['whatsapp_phone_number_id'] ?? '❌ no configurado') . "\n"; echo "Phone ID turnero: " . ($cfg['whatsapp_phone_number_id_turnero'] ?? '⚠️ no configurado (usará principal)') . "\n"; echo "Plantilla turno: " . ($cfg['turnero_wa_template'] ?? 'consentimiento_turno (default)') . "\n"; echo "Idioma: " . ($cfg['turnero_wa_lang'] ?? 'es_CO (default)') . "\n"; echo "Kiosko WA habilitado: " . (($cfg['turnero_wa_kiosko_enabled'] ?? '0') === '1' ? '✅ SÍ' : '❌ NO') . "\n\n"; // ── 2. Plantilla en BD ──────────────────────────────────────── echo "2. PLANTILLA EN BASE DE DATOS\n"; echo "──────────────────────────────\n"; $tplNombre = $cfg['turnero_wa_template'] ?? 'consentimiento_turno'; $tpl = $pdo->prepare("SELECT template_name, language_code, status, body_text FROM message_templates WHERE template_name = ? LIMIT 1"); $tpl->execute([$tplNombre]); $tplRow = $tpl->fetch(PDO::FETCH_ASSOC); if ($tplRow) { echo "✅ Encontrada: {$tplRow['template_name']} [{$tplRow['language_code']}] estado={$tplRow['status']}\n"; echo "Body: " . substr($tplRow['body_text'] ?? '', 0, 200) . "\n"; } else { echo "❌ Plantilla '{$tplNombre}' NO encontrada en message_templates\n"; } echo "\n"; // ── 3. Formularios de recepción configurados ────────────────── echo "3. FORMULARIOS DE CONSENTIMIENTO EN RECEPCIÓN\n"; echo "───────────────────────────────────────────────\n"; $forms = $pdo->query( "SELECT l.nombre AS desk, f.id, f.nombre AS formulario, f.is_active FROM turnero_lugar_consentimientos tlc JOIN turnero_lugares l ON l.id = tlc.lugar_id AND l.tipo = 'recepcion' JOIN lab_formularios f ON f.id = tlc.formulario_id ORDER BY l.nombre, f.nombre" )->fetchAll(PDO::FETCH_ASSOC); if ($forms) { foreach ($forms as $r) { $act = $r['is_active'] ? '✅' : '⚠️ inactivo'; echo " {$act} Desk: {$r['desk']} → [{$r['id']}] {$r['formulario']}\n"; } } else { echo "❌ Ningún formulario configurado en desks de recepción\n"; echo " Ve a Configuración → Sesión y vincula un formulario al desk de recepción\n"; } echo "\n"; // ── 4. Últimos consentimientos creados desde kiosko ─────────── echo "4. ÚLTIMOS CONSENTIMIENTOS CREADOS (recientes)\n"; echo "─────────────────────────────────────────────────\n"; try { $rows = $pdo->query( "SELECT tc.id, tc.turno_id, tc.estado, tc.enviado_at, tt.codigo, tt.paciente_nombre, tt.paciente_cel, f.nombre AS formulario FROM turnero_consentimientos tc JOIN turnero_turnos tt ON tt.id = tc.turno_id JOIN lab_formularios f ON f.id = tc.formulario_id ORDER BY tc.id DESC LIMIT 10" )->fetchAll(PDO::FETCH_ASSOC); if ($rows) { foreach ($rows as $r) { echo " Turno {$r['codigo']} | {$r['paciente_nombre']} | cel={$r['paciente_cel']}\n"; echo " Formulario: {$r['formulario']}\n"; echo " Estado: {$r['estado']} | Enviado: " . ($r['enviado_at'] ?? 'NO') . "\n\n"; } } else { echo " Sin registros\n"; } } catch (\Throwable $e) { echo " ❌ Error SQL: " . $e->getMessage() . "\n"; } echo "\n"; // ── 4b. Diagnóstico tabla turnero_consentimientos ───────────── echo "4b. DIAGNÓSTICO TABLA Y TURNOS RECIENTES\n"; echo "──────────────────────────────────────────\n"; // Verificar que la tabla existe y tiene las columnas esperadas try { $cols = $pdo->query("DESCRIBE turnero_consentimientos")->fetchAll(PDO::FETCH_COLUMN); echo "Columnas: " . implode(', ', $cols) . "\n"; } catch (\Throwable $e) { echo "❌ Error al leer tabla: " . $e->getMessage() . "\n"; } // Últimos turnos de hoy (con o sin consentimiento) $hoyTurnos = $pdo->query( "SELECT tt.id, tt.codigo, tt.paciente_nombre, tt.paciente_cel, tt.creado_at, (SELECT COUNT(*) FROM turnero_consentimientos tc WHERE tc.turno_id = tt.id) AS tiene_consent FROM turnero_turnos tt WHERE DATE(tt.creado_at) = CURDATE() ORDER BY tt.id DESC LIMIT 10" )->fetchAll(PDO::FETCH_ASSOC); echo "\nÚltimos 10 turnos de hoy:\n"; if ($hoyTurnos) { foreach ($hoyTurnos as $t) { $cel = $t['paciente_cel'] ?: '(sin cel)'; $con = $t['tiene_consent'] ? '✅ consent' : '❌ sin consent'; echo " [{$t['id']}] {$t['codigo']} | {$t['paciente_nombre']} | cel={$cel} | {$con} | {$t['creado_at']}\n"; } } else { echo " Sin turnos hoy\n"; } // Test de inserción directa echo "\nTest inserción en turnero_consentimientos:\n"; if ($hoyTurnos) { $turnoTest = $hoyTurnos[0]; $formTest = $forms[0] ?? null; if ($formTest) { try { $testToken = 'DEBUG-TEST-' . time(); $ins = $pdo->prepare( "INSERT IGNORE INTO turnero_consentimientos (turno_id, formulario_id, token, estado) VALUES (?, ?, ?, 'pendiente')" ); $ins->execute([$turnoTest['id'], $formTest['id'], $testToken]); if ($ins->rowCount()) { $pdo->prepare("DELETE FROM turnero_consentimientos WHERE token = ?")->execute([$testToken]); echo " ✅ Inserción OK (se insertó y eliminó el registro de prueba)\n"; } else { echo " ⚠️ INSERT IGNORE no insertó (¿registro duplicado para turno {$turnoTest['id']}?)\n"; } } catch (\Throwable $e) { echo " ❌ Error al insertar: " . $e->getMessage() . "\n"; } } else { echo " ⚠️ No hay formularios de recepción configurados (sección 3)\n"; } } else { echo " ⚠️ Sin turnos hoy para probar\n"; } // Mostrar teléfono del paciente por documento $docBuscar = $_GET['doc'] ?? '1095819405'; echo "\nPaciente doc={$docBuscar} en lab_pacientes:\n"; try { $stmtPac = $pdo->prepare( "SELECT id, nombre_completo, telefono, numero_documento FROM lab_pacientes WHERE numero_documento = ? AND is_active = 1 LIMIT 1" ); $stmtPac->execute([$docBuscar]); $pacInfo = $stmtPac->fetch(PDO::FETCH_ASSOC); if ($pacInfo) { echo " ID: {$pacInfo['id']} | Nombre: {$pacInfo['nombre_completo']}\n"; echo " Teléfono registrado: " . ($pacInfo['telefono'] ?: '(vacío — por eso no llega WA)') . "\n"; if (!$pacInfo['telefono']) { echo " → Para que llegue WA, actualiza el teléfono de este paciente a 3168950803\n"; } } else { echo " ❌ Paciente con documento '{$docBuscar}' no encontrado en lab_pacientes\n"; } } catch (\Throwable $e) { echo " ❌ " . $e->getMessage() . "\n"; } // Versión del archivo create_turno.php echo "\nVersión create_turno.php: " . date('Y-m-d H:i:s', filemtime(__DIR__ . '/modules/turnero/api/create_turno.php')) . "\n"; echo "\n"; // ── 5. Test de envío ────────────────────────────────────────── if (isset($_GET['test_cel'])) { echo "5. TEST DE ENVÍO\n"; echo "─────────────────\n"; $testCel = trim($_GET['test_cel']); $testTpl = $cfg['turnero_wa_template'] ?? 'consentimiento_turno'; // Usar el idioma real de la plantilla aprobada en Meta $testLang = $tplRow['language_code'] ?? ($cfg['turnero_wa_lang'] ?? 'es'); require_once __DIR__ . '/services/WhatsAppService.php'; $baseUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST']; $testLink = $baseUrl . '/ver_formulario_enviado.php?token=TEST123'; echo "Plantilla: {$testTpl} [{$testLang}]\n"; echo "Body: " . ($tplRow['body_text'] ?? '—') . "\n"; echo "Params: ['A001']\n"; echo "URL botón: {$testLink}\n\n"; require_once __DIR__ . '/services/WhatsAppService.php'; try { $wa = new WhatsAppService('turnero'); $rawComps = [ ['type' => 'body', 'parameters' => [['type' => 'text', 'text' => 'A001']]] ]; $rawComps[] = [ 'type' => 'button', 'sub_type' => 'url', 'index' => '0', 'parameters' => [['type' => 'text', 'text' => 'TEST123']], ]; $wa->sendTemplateMessage($testCel, $testTpl, $testLang, [], [], $rawComps); echo "✅ Mensaje enviado a {$testCel}\n"; } catch (\Throwable $e) { echo "❌ Error: " . $e->getMessage() . "\n"; } } else { echo "5. TEST DE ENVÍO\n"; echo "─────────────────\n"; echo "Agrega ?test_cel=573001234567 a la URL para enviar un mensaje de prueba\n"; } echo "\n════ FIN ════\n";