agendar domicilio: modo crear nuevo paciente desde el modal
This commit is contained in:
+101
-13
@@ -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 SÍ 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'),
|
||||
|
||||
Reference in New Issue
Block a user