Files
whatsapp/debug_turno_wa.php
T

201 lines
9.2 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";
$rows = $pdo->query(
"SELECT tc.id, tc.turno_id, tc.estado, tc.enviado_at, tc.creado_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') . " | Creado: {$r['creado_at']}\n\n";
}
} else {
echo " Sin registros\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, creado_at)
VALUES (?, ?, ?, 'pendiente', NOW())"
);
$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";
}
// 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';
$testLang = $cfg['turnero_wa_lang'] ?? 'es_CO';
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');
$wa->sendTemplateMessage($testCel, $testTpl, $testLang, ['A001'], [$testLink]);
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";