feat: enlaces de formulario sin vencimiento + PDF descargable sin sesión vía token público
This commit is contained in:
+54
-24
@@ -1,39 +1,69 @@
|
||||
<?php
|
||||
/**
|
||||
* ver_formulario_enviado.php — Ver respuesta de un formulario (imprimible / PDF)
|
||||
* Requiere: admin o enfermero autenticado
|
||||
* URL: ver_formulario_enviado.php?id=ENVIO_ID
|
||||
* Acceso admin/enfermero: ver_formulario_enviado.php?id=ENVIO_ID (requiere sesión)
|
||||
* Acceso público cliente: ver_formulario_enviado.php?t=TOKEN (sin sesión, solo firmado/completado)
|
||||
*/
|
||||
require_once 'config/config.php';
|
||||
if (!isUserLoggedIn()) { header('Location: login.php'); exit; }
|
||||
|
||||
$id = (int)($_GET['id'] ?? 0);
|
||||
if (!$id) { http_response_code(400); die('ID requerido'); }
|
||||
$tokenPublico = trim($_GET['t'] ?? '');
|
||||
$modoPublico = ($tokenPublico !== '');
|
||||
|
||||
if (!$modoPublico && !isUserLoggedIn()) {
|
||||
header('Location: login.php'); exit;
|
||||
}
|
||||
|
||||
// ── Cargar datos ──────────────────────────────────────────────────────
|
||||
$db = Database::getInstance();
|
||||
|
||||
$envio = $db->fetch(
|
||||
"SELECT e.*, f.nombre AS form_nombre, f.categoria, f.descripcion AS form_descripcion,
|
||||
f.esquema, f.permite_firma, f.requiere_firma,
|
||||
f.doc_encabezado, f.doc_subtitulo, f.doc_logo_base64, f.doc_color, f.doc_pie_pagina,
|
||||
p.nombre_completo AS paciente_nombre, p.numero_documento, p.tipo_documento,
|
||||
p.fecha_nacimiento, p.telefono AS paciente_telefono, p.eps,
|
||||
u.full_name AS enviado_por_nombre, u.email AS enviado_por_email
|
||||
FROM lab_form_envios e
|
||||
JOIN lab_formularios f ON f.id = e.formulario_id
|
||||
LEFT JOIN lab_pacientes p ON p.id = e.paciente_id
|
||||
LEFT JOIN admin_users u ON u.id = e.enviado_por
|
||||
WHERE e.id = ?",
|
||||
[$id]
|
||||
);
|
||||
if ($modoPublico) {
|
||||
// Acceso por token: solo si el formulario ya fue firmado/completado
|
||||
if (!preg_match('/^[a-f0-9]{64}$/i', $tokenPublico)) {
|
||||
http_response_code(400); die('Token inválido');
|
||||
}
|
||||
$envio = $db->fetch(
|
||||
"SELECT e.*, f.nombre AS form_nombre, f.categoria, f.descripcion AS form_descripcion,
|
||||
f.esquema, f.permite_firma, f.requiere_firma,
|
||||
f.doc_encabezado, f.doc_subtitulo, f.doc_logo_base64, f.doc_color, f.doc_pie_pagina,
|
||||
p.nombre_completo AS paciente_nombre, p.numero_documento, p.tipo_documento,
|
||||
p.fecha_nacimiento, p.telefono AS paciente_telefono, p.eps,
|
||||
u.full_name AS enviado_por_nombre, u.email AS enviado_por_email
|
||||
FROM lab_form_envios e
|
||||
JOIN lab_formularios f ON f.id = e.formulario_id
|
||||
LEFT JOIN lab_pacientes p ON p.id = e.paciente_id
|
||||
LEFT JOIN admin_users u ON u.id = e.enviado_por
|
||||
WHERE e.token = ?",
|
||||
[$tokenPublico]
|
||||
);
|
||||
if (!$envio) { http_response_code(404); die('Formulario no encontrado'); }
|
||||
if (!in_array($envio['estado'], ['firmado', 'completado'])) {
|
||||
http_response_code(403); die('El formulario aún no ha sido completado.');
|
||||
}
|
||||
} else {
|
||||
$id = (int)($_GET['id'] ?? 0);
|
||||
if (!$id) { http_response_code(400); die('ID requerido'); }
|
||||
|
||||
if (!$envio) { http_response_code(404); die('Formulario no encontrado'); }
|
||||
$envio = $db->fetch(
|
||||
"SELECT e.*, f.nombre AS form_nombre, f.categoria, f.descripcion AS form_descripcion,
|
||||
f.esquema, f.permite_firma, f.requiere_firma,
|
||||
f.doc_encabezado, f.doc_subtitulo, f.doc_logo_base64, f.doc_color, f.doc_pie_pagina,
|
||||
p.nombre_completo AS paciente_nombre, p.numero_documento, p.tipo_documento,
|
||||
p.fecha_nacimiento, p.telefono AS paciente_telefono, p.eps,
|
||||
u.full_name AS enviado_por_nombre, u.email AS enviado_por_email
|
||||
FROM lab_form_envios e
|
||||
JOIN lab_formularios f ON f.id = e.formulario_id
|
||||
LEFT JOIN lab_pacientes p ON p.id = e.paciente_id
|
||||
LEFT JOIN admin_users u ON u.id = e.enviado_por
|
||||
WHERE e.id = ?",
|
||||
[$id]
|
||||
);
|
||||
if (!$envio) { http_response_code(404); die('Formulario no encontrado'); }
|
||||
|
||||
// Enfermero solo puede ver sus propios envíos
|
||||
if (isEnfermero()) {
|
||||
$uid = (int)($_SESSION['admin_user']['id'] ?? 0);
|
||||
if ($envio['enviado_por'] != $uid) { http_response_code(403); die('Sin acceso'); }
|
||||
// Enfermero solo puede ver sus propios envíos
|
||||
if (isEnfermero()) {
|
||||
$uid = (int)($_SESSION['admin_user']['id'] ?? 0);
|
||||
if ($envio['enviado_por'] != $uid) { http_response_code(403); die('Sin acceso'); }
|
||||
}
|
||||
}
|
||||
|
||||
// ── Config global del lab ─────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user