Files
whatsapp/modules/turnero/api/create_consent_token.php
Lizandro GuarnizoandClaude Sonnet 4.6 8e1f46904c Registrar quién crea cada consentimiento del turnero para el pie "Enviado por"
turnero_consentimientos nunca guardó quién lo generó; el pie del documento
mostraba el nombre de quien tuviera sesión abierta al verlo, no de quien
realmente lo atendió (por eso siempre aparecía el mismo usuario). Se agrega
la columna creado_por, se llena en los 6 puntos donde se crea un registro
(recepción, envío por WhatsApp, anexar formulario extra, autocreación por
examen/lugar), y ver_formulario_enviado.php ahora prioriza ese dato real
sobre el usuario de la sesión actual. Los documentos ya firmados antes de
este cambio siguen sin ese dato y usan el fallback anterior.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-03 12:50:41 -05:00

84 lines
2.8 KiB
PHP

<?php
/**
* POST /modules/turnero/api/create_consent_token.php
* Crea un token de consentimiento para un turno + formulario
* y retorna la URL para firmar.
*
* Body JSON:
* turno_id int requerido
* formulario_id int requerido
*/
require_once __DIR__ . '/_helpers.php';
requireMethod('POST');
requireTurnero();
$datos = inputJson();
$turnoId = (int)($datos['turno_id'] ?? 0);
$formularioId = (int)($datos['formulario_id'] ?? 0);
$pacienteIdReq = (int)($datos['paciente_id'] ?? 0);
if (!$turnoId) jsonError('turno_id requerido.');
if (!$formularioId) jsonError('formulario_id requerido.');
$pdo = db();
// Verificar que el turno existe
$stmt = $pdo->prepare("SELECT id, sesion_id, paciente_id FROM turnero_turnos WHERE id = ?");
$stmt->execute([$turnoId]);
$turno = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$turno) jsonError('Turno no encontrado.', 404);
$pacienteId = (int)$turno['paciente_id'];
// Si el turno aún no tiene paciente pero la petición trae uno válido, vincularlo aquí
// (evita la carrera con vincular_paciente.php que se llamaba fire-and-forget).
if (!$pacienteId && $pacienteIdReq) {
$upd = $pdo->prepare("UPDATE turnero_turnos SET paciente_id = ? WHERE id = ?");
$upd->execute([$pacienteIdReq, $turnoId]);
$pacienteId = $pacienteIdReq;
}
if (!$pacienteId) jsonError('El turno no tiene paciente vinculado.');
// Verificar que el formulario existe
$stmt = $pdo->prepare("SELECT id, nombre FROM lab_formularios WHERE id = ? AND is_active = 1");
$stmt->execute([$formularioId]);
$formulario = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$formulario) jsonError('Formulario no encontrado o inactivo.', 404);
// Buscar si ya existe un token
$stmt = $pdo->prepare(
"SELECT token, estado FROM turnero_consentimientos WHERE turno_id = ? AND formulario_id = ?"
);
$stmt->execute([$turnoId, $formularioId]);
$existente = $stmt->fetch(PDO::FETCH_ASSOC);
if ($existente) {
if (in_array($existente['estado'], ['firmado', 'rechazado'], true)) {
jsonError('Este consentimiento ya fue ' . $existente['estado'] . '.', 422);
}
$token = $existente['token'];
} else {
// Generar nuevo token
$token = sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff), mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
$stmt = $pdo->prepare(
"INSERT INTO turnero_consentimientos (turno_id, formulario_id, token, estado, creado_por)
VALUES (?, ?, ?, 'pendiente', ?)"
);
$stmt->execute([$turnoId, $formularioId, $token, adminId()]);
}
$url = BASE_URL . 'ver_formulario_enviado.php?token=' . urlencode($token);
jsonOk([
'token' => $token,
'url' => $url,
'nombre'=> $formulario['nombre'],
]);