get_consentimientos.php ya no salta la autocreación del formulario F-LAB-08 (Datos Toma de Muestras) cuando la visita es "solo entrega de muestras" — solo se omitían los formularios por examen, los de lugar deben seguir exigiéndose igual. ver_formulario_enviado.php cargaba nombre/cédula del profesional firmante solo dentro del turnero embebido; se amplía también a la firma directa fuera de turnero (staff logueado). firmar_profesional.php (usado por los formatos no-turnero) no recibía esos datos del frontend y se perdían; ahora los guarda en datos_cliente igual que el flujo turnero. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
89 lines
3.7 KiB
PHP
89 lines
3.7 KiB
PHP
<?php
|
|
/**
|
|
* firmar_profesional.php — Guarda la firma del profesional en un envío ya completado.
|
|
* Requiere: sesión activa (admin o enfermero).
|
|
* POST { envio_id: int, campo_id: string, svg: string }
|
|
*/
|
|
require_once __DIR__ . '/../../config/config.php';
|
|
require_once __DIR__ . '/../../classes/Database.php';
|
|
|
|
header('Content-Type: application/json');
|
|
|
|
// ── Helpers ─────────────────────────────────────────────────────────
|
|
function ok(array $data = []): void {
|
|
echo json_encode(['ok' => true] + $data);
|
|
exit;
|
|
}
|
|
function err(string $msg, int $code = 400): void {
|
|
http_response_code($code);
|
|
echo json_encode(['ok' => false, 'error' => $msg]);
|
|
exit;
|
|
}
|
|
|
|
// ── Auth ─────────────────────────────────────────────────────────────
|
|
if (!isUserLoggedIn()) {
|
|
err('No autenticado', 401);
|
|
}
|
|
|
|
// ── Input ────────────────────────────────────────────────────────────
|
|
$body = json_decode(file_get_contents('php://input'), true);
|
|
if (!$body) $body = $_POST;
|
|
|
|
$envioId = (int)($body['envio_id'] ?? 0);
|
|
$campoId = trim($body['campo_id'] ?? '');
|
|
$svg = $body['svg'] ?? '';
|
|
$proNombre = trim($body['pro_nombre'] ?? '');
|
|
$proCedula = trim($body['pro_cedula'] ?? '');
|
|
|
|
if (!$envioId) err('envio_id requerido');
|
|
if ($campoId === '') err('campo_id requerido');
|
|
if ($svg === '') err('svg requerido');
|
|
|
|
// Validar que el SVG sea data URI de imagen (evita inyección de contenido)
|
|
if (!preg_match('/^data:image\/(svg\+xml|png|jpeg|webp);base64,/i', $svg)) {
|
|
err('Formato de firma no válido');
|
|
}
|
|
|
|
// ── Cargar envío ─────────────────────────────────────────────────────
|
|
$db = Database::getInstance();
|
|
$envio = $db->fetch('SELECT id, datos_cliente, estado, formulario_id FROM lab_form_envios WHERE id = ?', [$envioId]);
|
|
|
|
if (!$envio) err('Envío no encontrado', 404);
|
|
|
|
// Enfermero: solo puede firmar sus propios envíos
|
|
if (isEnfermero()) {
|
|
$uid = (int)($_SESSION['admin_user']['id'] ?? 0);
|
|
$propio = $db->fetch('SELECT id FROM lab_form_envios WHERE id = ? AND enviado_por = ?', [$envioId, $uid]);
|
|
if (!$propio) err('Sin acceso', 403);
|
|
}
|
|
|
|
// ── Validar que campo_id corresponde a una firma_profesional ─────────
|
|
$form = $db->fetch('SELECT esquema FROM lab_formularios WHERE id = ?', [$envio['formulario_id']]);
|
|
if (!$form) err('Formulario no encontrado', 404);
|
|
|
|
$esquema = json_decode($form['esquema'], true) ?? [];
|
|
$campoDef = null;
|
|
foreach ($esquema as $c) {
|
|
if (($c['id'] ?? '') === $campoId) { $campoDef = $c; break; }
|
|
}
|
|
|
|
if (!$campoDef || ($campoDef['tipo'] ?? '') !== 'firma_profesional') {
|
|
err('El campo no es una firma_profesional');
|
|
}
|
|
|
|
// ── Actualizar datos_cliente: guardar solo en el campo firmado ──
|
|
$datos = json_decode($envio['datos_cliente'] ?? '{}', true) ?? [];
|
|
$datos[$campoId . '_svg'] = $svg;
|
|
if ($proNombre !== '') $datos['_pro_nombre'] = $proNombre;
|
|
if ($proCedula !== '') $datos['_pro_cedula'] = $proCedula;
|
|
|
|
$nuevosDatos = json_encode($datos, JSON_UNESCAPED_UNICODE);
|
|
$nuevoEstado = $envio['estado'] === 'firmado' ? 'firmado' : 'firmado';
|
|
|
|
$db->query(
|
|
'UPDATE lab_form_envios SET datos_cliente = ?, estado = ?, completado_en = COALESCE(completado_en, NOW()) WHERE id = ?',
|
|
[$nuevosDatos, $nuevoEstado, $envioId]
|
|
);
|
|
|
|
ok(['mensaje' => 'Firma del profesional guardada correctamente']);
|