feat(pacientes): verificar WhatsApp al ingresar teléfono, vincular user_id al guardar

fix(recepcion): mostrar nombre_completo en resultados de búsqueda de paciente

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-06-24 08:44:48 -05:00
co-authored by Claude Sonnet 4.6
parent 018d445846
commit af584bcc26
4 changed files with 56 additions and 2 deletions
+21
View File
@@ -0,0 +1,21 @@
<?php
/**
* GET /api/lab/check_whatsapp.php?phone=573001234567
* Verifica si un número de teléfono está registrado en WhatsApp (tabla users).
*/
require_once __DIR__ . '/_helpers.php';
requireAuth();
$phone = trim($_GET['phone'] ?? '');
if (!$phone) { jsonError('phone requerido', 400); }
$pdo = db();
$stmt = $pdo->prepare("SELECT id, name, phone_number FROM users WHERE phone_number = ? LIMIT 1");
$stmt->execute([$phone]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
jsonOk([
'found' => (bool)$user,
'user_id' => $user ? (int)$user['id'] : null,
'phone_number' => $user ? $user['phone_number'] : null,
]);
+9
View File
@@ -51,6 +51,15 @@ try {
}
// ────────────────────────────────────────────────────────────────────────
// Auto-vincular user_id por teléfono si no viene explícito
if (empty($datos['user_id']) && !empty($telVal)) {
$pdo = db();
$stmt = $pdo->prepare("SELECT id FROM users WHERE phone_number = ? LIMIT 1");
$stmt->execute([$telVal]);
$wid = $stmt->fetchColumn();
if ($wid) $datos['user_id'] = (int)$wid;
}
$pac = new Paciente();
$admin = adminId();
+25 -1
View File
@@ -283,8 +283,11 @@ require_once __DIR__ . '/shared/components/sidebar.php';
<option value="1">🇺🇸 1</option>
</select>
<input type="tel" class="form-control" name="telefono" id="pac-tel"
placeholder="3001234567" tabindex="5" style="border-radius:0 .45rem .45rem 0">
placeholder="3001234567" tabindex="5" style="border-radius:0 .45rem .45rem 0"
onblur="verificarWhatsapp()">
</div>
<div id="wa-badge" class="mt-1" style="font-size:.78rem;min-height:18px"></div>
<input type="hidden" id="pac-user-id" name="user_id">
</div>
<div class="col-sm-4">
<div class="form-floating">
@@ -517,6 +520,27 @@ async function editarPaciente(id) {
if (d.data?.[0]) abrirFormulario(d.data[0]);
}
async function verificarWhatsapp() {
const prefijo = document.getElementById('pac-tel-prefijo').value || '57';
let tel = (document.getElementById('pac-tel').value || '').replace(/[^0-9]/g, '');
if (tel.length === 10) tel = prefijo + tel;
const badge = document.getElementById('wa-badge');
const hiddenUid = document.getElementById('pac-user-id');
if (!tel || tel.length < 10) { badge.innerHTML = ''; hiddenUid.value = ''; return; }
badge.innerHTML = '<span class="text-muted"><i class="fas fa-spinner fa-spin me-1"></i>Verificando WhatsApp…</span>';
try {
const r = await fetch(`api/lab/check_whatsapp.php?phone=${encodeURIComponent(tel)}`);
const d = await r.json();
if (d.ok && d.data.found) {
badge.innerHTML = '<span class="text-success"><i class="fab fa-whatsapp me-1"></i>Registrado en WhatsApp</span>';
hiddenUid.value = d.data.user_id;
} else {
badge.innerHTML = '<span class="text-muted"><i class="fas fa-times-circle me-1"></i>Sin WhatsApp registrado</span>';
hiddenUid.value = '';
}
} catch(_) { badge.innerHTML = ''; hiddenUid.value = ''; }
}
async function guardarPaciente() {
const form = document.getElementById('form-paciente');
if (!form.checkValidity()) { form.reportValidity(); return; }
+1 -1
View File
@@ -908,7 +908,7 @@ async function buscarPaciente() {
}
lista.innerHTML = datos.map(p => `
<div class="pac-resultado" onclick="seleccionarPaciente(${JSON.stringify(p).replace(/"/g,'&quot;')})">
<div class="pac-nombre">${escHtml((p.full_name||p.nombre||'') + ' ' + (p.apellido||''))}</div>
<div class="pac-nombre">${escHtml(p.nombre_completo||p.full_name||p.nombre||'')}</div>
<div class="pac-doc">${escHtml(p.tipo_documento||'')} ${escHtml(p.documento||p.numero_documento||'')}
${p.telefono||p.celular ? '· ' + escHtml(p.telefono||p.celular) : ''}</div>
</div>`).join('');