Files
whatsapp/verificar_formulario.php
2026-03-10 18:42:51 -05:00

187 lines
7.7 KiB
PHP

<?php
/**
* verificar_formulario.php — Verificación pública de integridad de documentos
* Público, sin autenticación.
* URL: verificar_formulario.php?h=HASH_SHA256
*/
require_once 'config/config.php';
$hash = trim($_GET['h'] ?? '');
$valido = false;
$envio = null;
$error = '';
if ($hash && preg_match('/^[a-f0-9]{64}$/i', $hash)) {
$db = Database::getInstance();
$envio = $db->fetch(
"SELECT e.id, e.estado, e.completado_en, e.ip_cliente,
f.nombre AS form_nombre, f.categoria,
p.nombre_completo AS paciente_nombre, p.numero_documento
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
WHERE e.hash_verificacion = ?",
[$hash]
);
if ($envio) {
$valido = in_array($envio['estado'], ['firmado', 'completado']);
} else {
$error = 'El código de verificación no corresponde a ningún documento registrado.';
}
} elseif ($hash) {
$error = 'El código de verificación no tiene el formato correcto.';
}
function esc3(mixed $v): string {
return htmlspecialchars((string)($v ?? ''), ENT_QUOTES);
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Verificación de documento — Lab</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<style>
body { background: #f0f4ff; min-height: 100vh; display: flex; flex-direction: column;
align-items: center; justify-content: flex-start; padding: 40px 16px; }
.verify-card { max-width: 560px; width: 100%; background: #fff;
border-radius: 12px; overflow: hidden;
box-shadow: 0 4px 24px rgba(0,0,0,.12); }
.card-header-bar { padding: 22px 28px; color: #fff; }
.card-header-bar.valid { background: linear-gradient(135deg, #1b5e20, #2e7d32); }
.card-header-bar.invalid { background: linear-gradient(135deg, #b71c1c, #c62828); }
.card-header-bar.neutral { background: linear-gradient(135deg, #1565c0, #0288d1); }
.card-body-p { padding: 24px 28px; }
.result-icon { font-size: 3.5rem; margin-bottom: 12px; }
.field-row { display: flex; gap: 12px; padding: 7px 0; border-bottom: 1px solid #f0f0f0; }
.field-row:last-child { border: none; }
.field-label { flex: 0 0 44%; font-size: 12px; color: #6c757d; }
.field-val { flex: 1; font-size: 13px; font-weight: 600; }
.hash-display { font-family: monospace; font-size: 11px; word-break: break-all;
background: #f0f5ff; border: 1px solid #c3d3f7; border-radius: 6px;
padding: 10px 12px; color: #1e3a6e; margin-top: 12px; }
.search-form input { font-size: 13px; font-family: monospace; }
</style>
</head>
<body>
<div class="verify-card">
<!-- Header -->
<div class="card-header-bar <?= $hash ? ($valido ? 'valid' : 'invalid') : 'neutral' ?>">
<h5 class="fw-bold mb-0 text-center">
<i class="fas fa-shield-alt me-2"></i>Verificación de integridad de documentos
</h5>
</div>
<div class="card-body-p">
<?php if (!$hash): ?>
<!-- Formulario de búsqueda -->
<p class="text-muted small mb-4 text-center">
Ingresa el código SHA-256 que aparece en el documento para verificar su autenticidad.
</p>
<form method="get" class="search-form">
<div class="mb-3">
<label class="form-label fw-semibold small">Código de verificación (SHA-256)</label>
<input type="text" name="h" class="form-control" maxlength="64"
placeholder="Ej: a3f4b8c1d2e..." required>
<div class="form-text">Código de 64 caracteres que aparece en el pie del documento.</div>
</div>
<button class="btn btn-primary w-100 fw-semibold">
<i class="fas fa-search me-1"></i>Verificar documento
</button>
</form>
<?php elseif ($valido && $envio): ?>
<!-- Documento válido -->
<div class="text-center mb-4">
<div class="result-icon">✅</div>
<h5 class="fw-bold text-success">Documento válido y auténtico</h5>
<p class="text-muted small">
Este documento fue registrado en nuestro sistema y no ha sido modificado.
</p>
</div>
<div class="field-row">
<div class="field-label">Formulario</div>
<div class="field-val"><?= esc3($envio['form_nombre']) ?></div>
</div>
<?php if ($envio['paciente_nombre']): ?>
<div class="field-row">
<div class="field-label">Paciente</div>
<div class="field-val"><?= esc3($envio['paciente_nombre']) ?></div>
</div>
<?php endif; ?>
<?php if ($envio['numero_documento']): ?>
<div class="field-row">
<div class="field-label">Documento</div>
<div class="field-val"><?= esc3($envio['numero_documento']) ?></div>
</div>
<?php endif; ?>
<div class="field-row">
<div class="field-label">Estado</div>
<div class="field-val">
<?= $envio['estado'] === 'firmado'
? '<span class="badge" style="background:#198754">✍️ Firmado digitalmente</span>'
: '<span class="badge" style="background:#0d6efd">✅ Completado</span>' ?>
</div>
</div>
<?php if ($envio['completado_en']): ?>
<div class="field-row">
<div class="field-label">Fecha de registro</div>
<div class="field-val"><?= esc3(date('d/m/Y H:i', strtotime($envio['completado_en']))) ?> UTC</div>
</div>
<?php endif; ?>
<div class="field-row">
<div class="field-label">ID de registro</div>
<div class="field-val text-muted">#<?= (int)$envio['id'] ?></div>
</div>
<div class="hash-display"><?= esc3($hash) ?></div>
<form method="get" class="search-form mt-4">
<input type="text" name="h" class="form-control form-control-sm"
placeholder="Verificar otro código…">
<button class="btn btn-outline-secondary btn-sm w-100 mt-2">
<i class="fas fa-search me-1"></i>Verificar otro
</button>
</form>
<?php else: ?>
<!-- Inválido / no encontrado -->
<div class="text-center mb-4">
<div class="result-icon">❌</div>
<h5 class="fw-bold text-danger">Documento no verificado</h5>
<p class="text-muted small"><?= esc3($error ?: 'El código no corresponde a ningún documento.') ?></p>
</div>
<?php if ($hash): ?>
<div class="hash-display"><?= esc3($hash) ?></div>
<?php endif; ?>
<form method="get" class="search-form mt-4">
<input type="text" name="h" value="<?= esc3($hash) ?>"
class="form-control form-control-sm" placeholder="Código de verificación…">
<button class="btn btn-primary btn-sm w-100 mt-2">
<i class="fas fa-search me-1"></i>Intentar de nuevo
</button>
</form>
<?php endif; ?>
</div><!-- /card-body-p -->
<div style="padding: 12px 28px; background: #f8faff; border-top: 1px solid #e9ecef;
font-size: 11px; color: #6c757d; text-align: center;">
Sistema de verificación de documentos &mdash; Generado el <?= date('d/m/Y') ?>
</div>
</div>
</body>
</html>