Exigir Datos Toma de Muestras en solo_muestras; nombre+cédula del firmante en todos los formatos
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>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
86aea30f62
commit
fd8b83a588
@@ -29,9 +29,11 @@ if (!isUserLoggedIn()) {
|
||||
$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'] ?? '';
|
||||
$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');
|
||||
@@ -72,6 +74,8 @@ if (!$campoDef || ($campoDef['tipo'] ?? '') !== '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';
|
||||
|
||||
@@ -204,34 +204,9 @@ if ($incluirSolicitud) {
|
||||
$stmt->execute([$solicitud['id']]);
|
||||
$examenes = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// Visita de solo entrega de muestras: no requiere consentimientos ni formularios
|
||||
if (!empty($solicitud['solo_muestras'])) {
|
||||
$respuesta['consentimientos'] = [];
|
||||
$respuesta['solicitud'] = $solicitud;
|
||||
$respuesta['paciente'] = $paciente;
|
||||
$respuesta['examenes'] = $examenes;
|
||||
// Muestras pendientes de visitas anteriores
|
||||
$muestras = [];
|
||||
try {
|
||||
$stmtPrev = $pdo->prepare(
|
||||
"SELECT tm.id, tm.tipo_muestra, tm.estado, tm.motivo_rechazo, tm.recibida_at,
|
||||
COALESCE(lt.nombre, tm.tipo_muestra) AS label,
|
||||
1 AS es_pendiente_anterior,
|
||||
ts.numero_orden AS solicitud_orden_anterior
|
||||
FROM turnero_muestras tm
|
||||
JOIN turnero_solicitudes ts ON ts.id = tm.solicitud_id
|
||||
LEFT JOIN lab_tipos_muestra lt ON lt.codigo = tm.tipo_muestra
|
||||
WHERE ts.paciente_id = ?
|
||||
AND tm.solicitud_id != ?
|
||||
AND tm.estado = 'pendiente'
|
||||
ORDER BY tm.id ASC"
|
||||
);
|
||||
$stmtPrev->execute([$solicitud['paciente_id'], $solicitud['id']]);
|
||||
$muestras = $stmtPrev->fetchAll(PDO::FETCH_ASSOC);
|
||||
} catch (\Throwable $_) {}
|
||||
$respuesta['muestras'] = $muestras;
|
||||
jsonOk($respuesta);
|
||||
}
|
||||
// Nota: en visitas de "solo entrega de muestras" no hay exámenes, así que la
|
||||
// Fuente 1 (por examen) no aplica, pero la Fuente 2 (por lugar, ej. F-LAB-08
|
||||
// Datos Toma de Muestras) sigue siendo obligatoria — se procesa más abajo igual.
|
||||
|
||||
// Auto-crear consentimientos requeridos desde DOS fuentes:
|
||||
// 1. Por examen → exam_tipo_consentimientos
|
||||
|
||||
@@ -249,15 +249,18 @@ $compact = $embebido && isset($_GET['compact']);
|
||||
$autoprint = isset($_GET['autoprint']) && $_GET['autoprint'] === '1';
|
||||
|
||||
// Firma pre-guardada del profesional logueado (para botón de 1 clic)
|
||||
// Aplica tanto al turnero embebido como a la firma directa fuera del turnero
|
||||
// (staff logueado viendo/firmando un formulario por ?id=), para que el
|
||||
// nombre y cédula del firmante salgan en cualquier formato.
|
||||
$firmaProfPreguardada = null;
|
||||
$profNombre = null;
|
||||
$profDocumento = null;
|
||||
if ($modoTurnero && $embebido && isUserLoggedIn()) {
|
||||
if ((($modoTurnero && $embebido) || (!$modoTurnero && !$modoPublico)) && isUserLoggedIn()) {
|
||||
$uid = (int)($_SESSION['admin_user']['id'] ?? 0);
|
||||
if ($uid) {
|
||||
try {
|
||||
$stmt = $db->getConnection()->prepare(
|
||||
"SELECT au.firma_svg, au.full_name,
|
||||
"SELECT au.firma_svg, au.full_name, au.cedula AS au_cedula,
|
||||
le.nombre_completo AS pro_nombre, le.numero_documento AS pro_documento
|
||||
FROM admin_users au
|
||||
LEFT JOIN lab_enfermeras le ON le.id = au.enfermera_id
|
||||
@@ -267,7 +270,7 @@ if ($modoTurnero && $embebido && isUserLoggedIn()) {
|
||||
$pRow = $stmt->fetch(PDO::FETCH_ASSOC) ?: [];
|
||||
$firmaProfPreguardada = $pRow['firma_svg'] ?: null;
|
||||
$profNombre = $pRow['pro_nombre'] ?: ($pRow['full_name'] ?: null);
|
||||
$profDocumento = $pRow['pro_documento'] ?: null;
|
||||
$profDocumento = $pRow['au_cedula'] ?: ($pRow['pro_documento'] ?: null);
|
||||
} catch (\Throwable $_) {}
|
||||
}
|
||||
}
|
||||
@@ -2230,7 +2233,8 @@ function _guardarFirmaPro(widget, svg, msgEl) {
|
||||
? { turno_id: parseInt(turnoId), formulario_id: parseInt(formularioId), svg,
|
||||
datos_respuestas: datosRespuestas,
|
||||
...(soloPro ? { solo_profesional: true } : {}) }
|
||||
: { envio_id: envioId, campo_id: campoId, svg };
|
||||
: { envio_id: envioId, campo_id: campoId, svg,
|
||||
pro_nombre: window._profNombre || null, pro_cedula: window._profDocumento || null };
|
||||
|
||||
fetch(saveUrl, { method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(payload) })
|
||||
.then(r => r.json())
|
||||
|
||||
Reference in New Issue
Block a user