From e9c8cf7d9bfd7601037d9977945e0de8268cd9dd Mon Sep 17 00:00:00 2001
From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com>
Date: Thu, 12 Mar 2026 23:18:31 -0500
Subject: [PATCH] feat: crear nuevo paciente desde modal de agendamiento
(enfermero portal)
---
enfermero_portal.php | 121 +++++++++++++++++++++++++++++++++++++++++--
1 file changed, 116 insertions(+), 5 deletions(-)
diff --git a/enfermero_portal.php b/enfermero_portal.php
index cd55bf7..e9c92f0 100644
--- a/enfermero_portal.php
+++ b/enfermero_portal.php
@@ -743,6 +743,41 @@ document.addEventListener('DOMContentLoaded', () => {
+
+
+
+
+
+
+
+ Datos del nuevo paciente
+
+
+
+
+
+
+
+
+
+
+
@@ -894,6 +929,7 @@ document.addEventListener('DOMContentLoaded', () => {
const agendaNueva = {
_modal: null,
_buscarTimer: null,
+ _nuevoPac: false,
init() {
this._modal = new bootstrap.Modal('#modalNuevaAgenda');
@@ -924,6 +960,15 @@ const agendaNueva = {
document.getElementById('na-paciente-elegido').classList.add('d-none');
document.getElementById('na-paciente-buscar').classList.remove('d-none');
document.getElementById('na-error').classList.add('d-none');
+ // Reset panel nuevo paciente
+ this._nuevoPac = false;
+ document.getElementById('na-nuevo-pac-panel').classList.add('d-none');
+ document.getElementById('na-np-nombre').value = '';
+ document.getElementById('na-np-telefono').value = '';
+ document.getElementById('na-np-fnac').value = '';
+ document.getElementById('na-np-email').value = '';
+ document.getElementById('na-crear-toggle-txt').textContent = 'Crear nuevo paciente';
+ document.getElementById('na-paciente-buscar').disabled = false;
const btn = document.getElementById('na-btn-guardar');
btn.disabled = false;
btn.innerHTML = 'Agendar';
@@ -977,6 +1022,11 @@ const agendaNueva = {
nombre + (telefono ? ` · ${telefono}` : '');
document.getElementById('na-paciente-elegido').classList.remove('d-none');
document.getElementById('na-sugerencias').classList.add('d-none');
+ // Ocultar panel nuevo paciente si estaba abierto
+ this._nuevoPac = false;
+ document.getElementById('na-nuevo-pac-panel').classList.add('d-none');
+ document.getElementById('na-crear-toggle-txt').textContent = 'Crear nuevo paciente';
+ document.getElementById('na-paciente-buscar').disabled = false;
// Siempre rellenar la dirección del paciente (editable)
if (direccion) document.getElementById('na-direccion').value = direccion;
if (barrio) document.getElementById('na-barrio').value = barrio;
@@ -988,23 +1038,84 @@ const agendaNueva = {
document.getElementById('na-paciente-id').value = '';
document.getElementById('na-paciente-buscar').value = '';
document.getElementById('na-paciente-elegido').classList.add('d-none');
+ document.getElementById('na-paciente-buscar').disabled = false;
document.getElementById('na-paciente-buscar').focus();
},
+ toggleNuevoPac() {
+ this._nuevoPac = !this._nuevoPac;
+ const panel = document.getElementById('na-nuevo-pac-panel');
+ const txt = document.getElementById('na-crear-toggle-txt');
+ const buscar = document.getElementById('na-paciente-buscar');
+ if (this._nuevoPac) {
+ panel.classList.remove('d-none');
+ txt.textContent = '← Buscar paciente existente';
+ // Limpiar selección previa
+ document.getElementById('na-paciente-id').value = '';
+ document.getElementById('na-paciente-elegido').classList.add('d-none');
+ buscar.value = '';
+ buscar.disabled = true;
+ document.getElementById('na-sugerencias').classList.add('d-none');
+ document.getElementById('na-np-nombre').focus();
+ } else {
+ panel.classList.add('d-none');
+ txt.textContent = 'Crear nuevo paciente';
+ buscar.disabled = false;
+ buscar.focus();
+ }
+ },
+
async guardar() {
- const pacId = +document.getElementById('na-paciente-id').value;
- const direccion = document.getElementById('na-direccion').value.trim();
- const fecha = document.getElementById('na-fecha').value;
+ const pacIdInicial = +document.getElementById('na-paciente-id').value;
+ const direccion = document.getElementById('na-direccion').value.trim();
+ const fecha = document.getElementById('na-fecha').value;
document.getElementById('na-error').classList.add('d-none');
- if (!pacId) { this._mostrarError('Selecciona un paciente de la lista.'); return; }
+ // Validaciones básicas
+ if (!pacIdInicial && !this._nuevoPac) {
+ this._mostrarError('Selecciona un paciente de la lista o crea uno nuevo.');
+ return;
+ }
if (!direccion) { this._mostrarError('La dirección es obligatoria.'); return; }
- if (!fecha) { this._mostrarError('La fecha es obligatoria.'); return; }
+ if (!fecha) { this._mostrarError('La fecha es obligatoria.'); return; }
const btn = document.getElementById('na-btn-guardar');
btn.disabled = true;
btn.innerHTML = 'Guardando…';
+ let pacId = pacIdInicial;
+
+ // Si es paciente nuevo, crearlo primero
+ if (this._nuevoPac) {
+ const nombre = document.getElementById('na-np-nombre').value.trim();
+ if (!nombre) {
+ btn.disabled = false;
+ btn.innerHTML = 'Agendar';
+ this._mostrarError('El nombre del nuevo paciente es obligatorio.');
+ return;
+ }
+ try {
+ const rPac = await fetch('api/lab/save_paciente.php', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({
+ nombre_completo: nombre,
+ telefono: document.getElementById('na-np-telefono').value.trim() || null,
+ fecha_nacimiento: document.getElementById('na-np-fnac').value || null,
+ email: document.getElementById('na-np-email').value.trim() || null,
+ }),
+ });
+ const dPac = await rPac.json();
+ if (!dPac.success) throw new Error(dPac.error || 'Error al crear paciente');
+ pacId = dPac.id;
+ } catch (e) {
+ btn.disabled = false;
+ btn.innerHTML = 'Agendar';
+ this._mostrarError('No se pudo crear el paciente: ' + e.message);
+ return;
+ }
+ }
+
const datos = {
paciente_id: pacId,
direccion,