diff --git a/classes/lab/Paciente.php b/classes/lab/Paciente.php index a30beef..413bc59 100644 --- a/classes/lab/Paciente.php +++ b/classes/lab/Paciente.php @@ -173,8 +173,22 @@ class Paciente { } } + // Registrar antes y después de lo que realmente cambia. Guardar solo el + // valor nuevo impide reconstruir el dato anterior si la corrección + // resultó equivocada, que es justo cuando hace falta consultarlo. + $antes = $this->db->fetch('SELECT * FROM lab_pacientes WHERE id = ?', [$id]) ?: []; + $cambios = []; + foreach ($campos as $campo => $nuevo) { + $previo = $antes[$campo] ?? null; + if ((string)$previo !== (string)$nuevo) { + $cambios[$campo] = ['antes' => $previo, 'despues' => $nuevo]; + } + } + $ok = $this->db->update('lab_pacientes', $campos, 'id = ?', [$id]); - $this->log->registrar($adminId, 'pacientes', 'editar', $id, $campos); + if ($cambios) { + $this->log->registrar($adminId, 'pacientes', 'editar', $id, $cambios); + } return $ok > 0; } diff --git a/modules/turnero/views/lugar.php b/modules/turnero/views/lugar.php index 12bef02..730a4d8 100644 --- a/modules/turnero/views/lugar.php +++ b/modules/turnero/views/lugar.php @@ -520,6 +520,15 @@ try { } /* Historial timeline */ .mpac-timeline { padding: 0; } + .mpac-lbl { font-size:.7rem; color:#64748b; font-weight:600; display:block; margin-bottom:2px; } + .mpac-aviso { font-size:.74rem; color:#1e40af; background:#eff6ff; border:1px solid #bfdbfe; + border-radius:8px; padding:7px 10px; margin-bottom:10px; } + .mpac-lock { background:#fffbeb; border:1px solid #fde68a; border-radius:8px; + padding:9px 11px; margin:4px 0 10px; } + .mpac-lock-txt { font-size:.72rem; color:#92400e; margin-bottom:7px; line-height:1.45; } + .mpac-aviso-firmados { font-size:.74rem; color:#7f1d1d; background:#fef2f2; + border:1px solid #fecaca; border-radius:8px; + padding:8px 11px; margin-bottom:10px; line-height:1.45; } .mtl-item { display:flex; gap:10px; align-items:flex-start; padding-bottom:12px; position:relative; @@ -949,6 +958,79 @@ require_once __DIR__ . '/../../../shared/components/sidebar.php';
Paciente embarazada
+
+ +
+ + + +
+
+ + Lo que corrija aquí cambia la ficha del paciente en todo el sistema. +
+ + + + + + + + + + + +
+
+ + Nombre, documento y fecha de nacimiento identifican al paciente en toda su + historia clínica. +
+ +
+ +
+ + + +
+
+ + +
+
+ + +
+
+ + + +
+ +
+ + Este turno ya tiene documentos firmados. Corregir la ficha + no modifica lo que ya se firmó: si un documento salió con datos + equivocados, hay que emitirlo de nuevo. +
+ +
+
+ + +
Historial de visitas
@@ -2386,6 +2468,103 @@ function abrirModalPaciente() { function cerrarModalPaciente() { document.getElementById('modal-pac-lugar').classList.remove('show'); + mpacEditar(false); +} + +/* ── Corrección de la ficha del paciente desde la estación ── + Los campos del formulario son vinculados: leen de la ficha. Por eso se + corrige la ficha y no el documento — así el dato queda bien en el turnero, + los domicilios y las órdenes, no solo en la hoja que se está llenando. */ + +function mpacEditar(abrir) { + document.getElementById('mpac-form').classList.toggle('d-none', !abrir); + document.getElementById('mpac-datos').classList.toggle('d-none', abrir); + document.getElementById('mpac-msg').textContent = ''; + + if (!abrir) { mpacBloquearIdentidad(); return; } + + const p = _pacienteActivo || {}; + document.getElementById('mpac-in-tel').value = p.telefono || p.celular || ''; + document.getElementById('mpac-in-dir').value = p.direccion || ''; + document.getElementById('mpac-in-eps').value = p.eps || ''; + document.getElementById('mpac-in-nombre').value = p.nombre_completo || ''; + document.getElementById('mpac-in-tipodoc').value = p.tipo_documento || 'CC'; + document.getElementById('mpac-in-doc').value = p.numero_documento || p.documento || ''; + document.getElementById('mpac-in-fnac').value = (p.fecha_nacimiento || '').slice(0, 10); + + mpacBloquearIdentidad(); + + // Si ya hay documentos firmados, advertir que corregir no los modifica. + // El botón "Ver firmado" solo se renderiza para consentimientos ya firmados. + const firmados = document.querySelectorAll('#lista-consent button[title="Ver firmado"]').length > 0; + document.getElementById('mpac-aviso-firmados').classList.toggle('d-none', !firmados); +} + +function mpacBloquearIdentidad() { + document.getElementById('mpac-identidad').classList.add('d-none'); + document.getElementById('mpac-identidad-lock').classList.remove('d-none'); +} + +function mpacDesbloquearIdentidad() { + if (!confirm('Nombre, documento y fecha de nacimiento identifican al paciente en toda su ' + + 'historia clínica.\n\n¿Confirma que quiere corregirlos?')) return; + document.getElementById('mpac-identidad').classList.remove('d-none'); + document.getElementById('mpac-identidad-lock').classList.add('d-none'); +} + +async function mpacGuardarFicha() { + if (!_pacienteActivo?.id) return; + const msg = document.getElementById('mpac-msg'); + const btn = document.getElementById('mpac-btn-guardar'); + const val = id => document.getElementById(id).value.trim(); + + const cuerpo = { + id: _pacienteActivo.id, + telefono: val('mpac-in-tel'), + direccion: val('mpac-in-dir'), + eps: val('mpac-in-eps'), + }; + // Los datos de identidad solo se envían si se desbloquearon + if (!document.getElementById('mpac-identidad').classList.contains('d-none')) { + cuerpo.nombre_completo = val('mpac-in-nombre'); + cuerpo.tipo_documento = val('mpac-in-tipodoc'); + cuerpo.numero_documento = val('mpac-in-doc'); + cuerpo.fecha_nacimiento = val('mpac-in-fnac') || null; + } + + btn.disabled = true; + msg.className = 'small mb-2 text-muted'; + msg.textContent = 'Guardando…'; + + try { + const r = await fetch(`${BASE_WA}api/lab/save_paciente.php`, { + method: 'POST', headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(cuerpo), + }); + const d = await r.json(); + if (!d.ok) { + msg.className = 'small mb-2 text-danger'; + msg.textContent = d.error || 'No se pudo guardar.'; + btn.disabled = false; + return; + } + // Reflejar el cambio sin recargar: ficha del modal, tarjeta del turno + // y el formulario abierto, cuyos campos vinculados leen de la ficha. + Object.assign(_pacienteActivo, cuerpo); + msg.className = 'small mb-2 text-success'; + msg.textContent = 'Ficha actualizada.'; + setTimeout(() => { + mpacEditar(false); + abrirModalPaciente(); + if (turnoActivo?.id) actualizarConsentimientos(turnoActivo.id); + const marco = document.querySelector('#modal-consent iframe'); + if (marco && marco.src) marco.src = marco.src; + }, 700); + } catch (_) { + msg.className = 'small mb-2 text-danger'; + msg.textContent = 'Error de conexión.'; + btn.disabled = false; + } } async function cargarHistorialModal(pacienteId) {