agendar domicilio: modo crear nuevo paciente desde el modal

This commit is contained in:
Lizandro Guarnizo
2026-03-20 15:18:14 -05:00
parent 47d5adbb50
commit 0e9dedd78a
+101 -13
View File
@@ -6673,19 +6673,26 @@ if (!isUserLoggedIn()) {
<button class="btn btn-outline-secondary" type="button" onclick="labDomicilio.buscarPaciente()"><i class="fas fa-search"></i></button>
</div>
<div id="labdom-pac-list" class="list-group mt-1 shadow" style="position:relative;z-index:1060;max-height:165px;overflow-y:auto;display:none"></div>
<div class="mt-2">
<button id="labdom-btn-contacto" class="btn btn-sm btn-outline-success w-100" type="button" onclick="labDomicilio.usarContacto()">
<i class="fab fa-whatsapp me-1"></i> Usar contacto de la conversación
<div class="mt-2 d-flex gap-2">
<button id="labdom-btn-contacto" class="btn btn-sm btn-outline-success flex-grow-1" type="button" onclick="labDomicilio.usarContacto()">
<i class="fab fa-whatsapp me-1"></i> Usar contacto
</button>
<div id="labdom-contacto-spin" class="text-center py-1 d-none">
<span class="spinner-border spinner-border-sm text-success"></span>
<span class="small text-muted ms-1">Buscando contacto…</span>
</div>
<button class="btn btn-sm btn-outline-secondary" type="button" onclick="labDomicilio.crearNuevo()" title="Registrar paciente nuevo que no está en el sistema">
<i class="fas fa-user-plus me-1"></i>Nuevo
</button>
</div>
<div id="labdom-contacto-spin" class="text-center py-1 d-none">
<span class="spinner-border spinner-border-sm text-success"></span>
<span class="small text-muted ms-1">Buscando contacto…</span>
</div>
</div>
<!-- Tarjeta paciente seleccionado (visible cuando hay paciente) -->
<div id="labdom-pac-card" class="d-none">
<!-- Indicador modo nuevo paciente -->
<div id="labdom-nuevo-badge" class="d-none mb-2">
<span class="badge bg-warning text-dark"><i class="fas fa-user-plus me-1"></i>Nuevo paciente se registrará al guardar</span>
</div>
<div class="d-flex align-items-start gap-2">
<div class="rounded-circle bg-primary text-white d-flex align-items-center justify-content-center flex-shrink-0 mt-1" style="width:36px;height:36px;font-size:1rem">
<i class="fas fa-user"></i>
@@ -6865,6 +6872,7 @@ const labDomicilio = (() => {
let _newOrderFile = null; // nuevo archivo de orden cargado desde el modal
let _convId = null;
let _pacienteId = null;
let _isNewPaciente = false; // true = paciente nuevo (no existe en BD aún)
let _pacNombre = '';
let _histDirs = []; // direcciones únicas previas del paciente
let _bsModal = null;
@@ -6992,6 +7000,8 @@ const labDomicilio = (() => {
if ($('labdom-pac-nombre')) $('labdom-pac-nombre').value = '';
if ($('labdom-pac-cedula')) $('labdom-pac-cedula').value = '';
if ($('labdom-pac-tipodoc')) $('labdom-pac-tipodoc').value = 'CC';
_isNewPaciente = false;
if ($('labdom-nuevo-badge')) $('labdom-nuevo-badge').classList.add('d-none');
// Resetear tipo cliente a "particular" por defecto
const tc = document.getElementById('tc-particular');
if (tc) tc.checked = true;
@@ -7213,8 +7223,9 @@ const labDomicilio = (() => {
},
limpiarPaciente() {
_pacienteId = null;
_pacNombre = '';
_pacienteId = null;
_isNewPaciente = false;
_pacNombre = '';
$('labdom-pac-buscar').classList.remove('d-none');
$('labdom-pac-card').classList.add('d-none');
$('labdom-btn-cambiar-pac').classList.add('d-none');
@@ -7222,6 +7233,7 @@ const labDomicilio = (() => {
$('labdom-pac-contacto').classList.add('d-none');
$('labdom-hist-cont').classList.add('d-none');
$('labdom-header-pac').textContent = '';
if ($('labdom-nuevo-badge')) $('labdom-nuevo-badge').classList.add('d-none');
if ($('labdom-pac-fnac')) $('labdom-pac-fnac').value = '';
if ($('labdom-pac-correo')) $('labdom-pac-correo').value = '';
if ($('labdom-pac-nombre')) $('labdom-pac-nombre').value = '';
@@ -7230,6 +7242,30 @@ const labDomicilio = (() => {
// Mantener dirección/notas para no perder lo escrito
},
/* Modo nuevo paciente: oculta el buscador y muestra la tarjeta vacía para registrar */
crearNuevo() {
_pacienteId = null;
_isNewPaciente = true;
_pacNombre = '';
_histDirs = [];
$('labdom-pac-buscar').classList.add('d-none');
$('labdom-pac-card').classList.remove('d-none');
$('labdom-btn-cambiar-pac').classList.remove('d-none');
$('labdom-pac-contacto').classList.add('d-none');
$('labdom-hist-cont').classList.add('d-none');
$('labdom-pac-eps-row') && ($('labdom-pac-eps-row').style.display = 'none');
if ($('labdom-nuevo-badge')) $('labdom-nuevo-badge').classList.remove('d-none');
// Limpiar campos del paciente
if ($('labdom-pac-nombre')) { $('labdom-pac-nombre').value = ''; $('labdom-pac-nombre').focus(); }
if ($('labdom-pac-cedula')) $('labdom-pac-cedula').value = '';
if ($('labdom-pac-tipodoc')) $('labdom-pac-tipodoc').value = 'CC';
if ($('labdom-pac-fnac')) $('labdom-pac-fnac').value = '';
if ($('labdom-pac-correo')) $('labdom-pac-correo').value = '';
$('labdom-header-pac').textContent = 'Nuevo paciente';
},
/* Aplica una dirección histórica al formulario */
usarDireccion(idx) {
const dir = _histDirs[idx];
@@ -7291,18 +7327,70 @@ const labDomicilio = (() => {
/* ── Guardar domicilio ── */
async guardar() {
if (!_pacienteId) {
$('labdom-pac-busq').focus();
$('labdom-pac-busq').classList.add('is-invalid');
setTimeout(() => $('labdom-pac-busq').classList.remove('is-invalid'), 2000);
// Validar paciente
if (!_pacienteId && !_isNewPaciente) {
$('labdom-pac-busq')?.focus();
$('labdom-pac-busq')?.classList.add('is-invalid');
setTimeout(() => $('labdom-pac-busq')?.classList.remove('is-invalid'), 2000);
return;
}
if (_isNewPaciente) {
const nom = fv('labdom-pac-nombre');
if (!nom) {
$('labdom-pac-nombre').classList.add('is-invalid');
$('labdom-pac-nombre').focus();
setTimeout(() => $('labdom-pac-nombre').classList.remove('is-invalid'), 2200);
return;
}
}
if (!validar()) return;
const btn = $('labdom-btn-guardar');
btn.disabled = true;
btn.innerHTML = '<span class="spinner-border spinner-border-sm me-1"></span>Guardando…';
// ── Crear paciente nuevo si aplica ────────────────────────────
if (_isNewPaciente) {
try {
const tipodoc = $('labdom-pac-tipodoc')?.value || 'CC';
const cedula = fv('labdom-pac-cedula');
const fnac = fv('labdom-pac-fnac');
const correo = fv('labdom-pac-correo');
const payload = {
nombre_completo: fv('labdom-pac-nombre'),
tipo_documento: tipodoc,
};
if (cedula) payload.numero_documento = cedula;
if (fnac) payload.fecha_nacimiento = fnac;
if (correo) payload.email = correo;
const r = await fetch('api/lab/save_paciente.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
const d = await r.json();
if (d.success && d.id) {
_pacienteId = d.id;
_isNewPaciente = false;
if ($('labdom-nuevo-badge')) $('labdom-nuevo-badge').classList.add('d-none');
} else {
const errDiv = document.createElement('div');
errDiv.className = 'alert alert-danger alert-dismissible mt-2 py-2';
errDiv.innerHTML = `<i class="fas fa-exclamation-circle me-1"></i>${escLab(d.error||'No se pudo registrar el paciente')}
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>`;
$('labdom-form-panel').prepend(errDiv);
btn.disabled = false;
btn.innerHTML = '<i class="fas fa-calendar-check me-1"></i> Agendar Domicilio';
return;
}
} catch (err) {
btn.disabled = false;
btn.innerHTML = '<i class="fas fa-calendar-check me-1"></i> Agendar Domicilio';
return;
}
}
const datos = {
paciente_id: _pacienteId,
fecha_programada: fv('labdom-fecha'),