Files
whatsapp/modules/turnero/api/crear_envio_presencial.php
Lizandro GuarnizoandClaude Sonnet 4.6 1c3bd9868f feat: auto-fill médico solicitante en formularios presenciales
Agrega medico_nombre al __paciente prefilled de crear_envio_presencial.php
haciendo JOIN con medicos vía turnero_solicitudes.medico_id, de modo que
el campo linked 'Médico solicitante' del formulario id=15 (tomas prolongadas)
se auto-cargue con el médico registrado en recepción.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-09 15:45:28 -05:00

104 lines
4.2 KiB
PHP

<?php
/**
* POST /modules/turnero/api/crear_envio_presencial.php
*
* Crea (o recupera) un registro lab_form_envios vinculado a un turnero_consentimientos
* para que el paciente pueda firmar presencialmente via form_cliente.php?t=TOKEN.
*
* Body JSON:
* consent_token string UUID del turnero_consentimientos (requerido)
*/
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
$datos = inputJson();
$consentToken = trim($datos['consent_token'] ?? '');
if (!preg_match('/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i', $consentToken)) {
jsonError('consent_token inválido.');
}
$pdo = db();
// ── 1. Cargar el consentimiento con datos del turno y paciente ────────
$stmt = $pdo->prepare(
"SELECT tc.id AS tc_id,
tc.formulario_id,
tc.token AS tc_token,
tc.estado,
tc.lab_form_envio_id,
ts.paciente_id,
t.sesion_id,
p.nombre_completo, p.tipo_documento, p.numero_documento,
p.fecha_nacimiento, p.telefono, p.eps,
med.nombres AS medico_nombres, med.apellidos AS medico_apellidos
FROM turnero_consentimientos tc
JOIN turnero_turnos t ON t.id = tc.turno_id
LEFT JOIN turnero_solicitudes ts ON ts.turno_id = tc.turno_id
LEFT JOIN lab_pacientes p ON p.id = ts.paciente_id
LEFT JOIN medicos med ON med.id = ts.medico_id
WHERE tc.token = ?
LIMIT 1"
);
$stmt->execute([$consentToken]);
$tc = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$tc) jsonError('Consentimiento no encontrado.', 404);
// ── Si ya fue firmado o tiene envío vinculado, devolver ese token ────
if ($tc['lab_form_envio_id']) {
$stEnv = $pdo->prepare("SELECT token, estado FROM lab_form_envios WHERE id = ?");
$stEnv->execute([(int)$tc['lab_form_envio_id']]);
$envio = $stEnv->fetch(PDO::FETCH_ASSOC);
if ($envio) {
// Si el envio no fue completado todavía, reutilizarlo
if (!in_array($envio['estado'], ['completado', 'firmado'])) {
jsonOk(['form_token' => $envio['token']]);
}
// Si ya completado, devolver igualmente el token para que el operador lo vea
jsonOk(['form_token' => $envio['token'], 'ya_firmado' => true]);
}
}
if ($tc['estado'] === 'firmado') {
jsonError('Este consentimiento ya fue firmado.', 409);
}
// ── 3. Crear nuevo lab_form_envios ────────────────────────────────────
$formToken = bin2hex(random_bytes(32)); // 64 chars hex
$prefilled = [];
if ($tc['nombre_completo']) $prefilled['__paciente']['nombre_completo'] = $tc['nombre_completo'];
if ($tc['tipo_documento']) $prefilled['__paciente']['tipo_documento'] = $tc['tipo_documento'];
if ($tc['numero_documento']) $prefilled['__paciente']['numero_documento'] = $tc['numero_documento'];
if ($tc['fecha_nacimiento']) $prefilled['__paciente']['fecha_nacimiento'] = $tc['fecha_nacimiento'];
if ($tc['telefono']) $prefilled['__paciente']['telefono'] = $tc['telefono'];
if ($tc['eps']) $prefilled['__paciente']['eps'] = $tc['eps'];
$medicoNombre = trim(($tc['medico_nombres'] ?? '') . ' ' . ($tc['medico_apellidos'] ?? ''));
if ($medicoNombre) $prefilled['__paciente']['medico_nombre'] = $medicoNombre;
$userId = (int)($_SESSION['admin_user']['id'] ?? 0) ?: null;
$ins = $pdo->prepare(
"INSERT INTO lab_form_envios
(formulario_id, paciente_id, token, datos_prefilled, estado, enviado_por, enviado_via, turnero_consentimiento_id)
VALUES (?, ?, ?, ?, 'pendiente', ?, 'link', ?)"
);
$ins->execute([
(int)$tc['formulario_id'],
$tc['paciente_id'] ?: null,
$formToken,
json_encode($prefilled, JSON_UNESCAPED_UNICODE),
$userId,
(int)$tc['tc_id'],
]);
$formEnvioId = (int)$pdo->lastInsertId();
// ── 4. Guardar el vínculo en turnero_consentimientos ─────────────────
$pdo->prepare("UPDATE turnero_consentimientos SET lab_form_envio_id = ? WHERE id = ?")
->execute([$formEnvioId, (int)$tc['tc_id']]);
jsonOk(['form_token' => $formToken]);