Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
237 lines
11 KiB
PHP
237 lines
11 KiB
PHP
<?php
|
|
/**
|
|
* Debug: flujo WA kiosko → consentimiento_turno
|
|
* Acceso: /debug_turno_wa.php (solo admins)
|
|
*/
|
|
require_once __DIR__ . '/config/config.php';
|
|
if (!isUserLoggedIn()) { header('Location: login.php'); exit; }
|
|
|
|
header('Content-Type: text/plain; charset=utf-8');
|
|
|
|
$pdo = Database::getInstance()->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";
|