feat: edición completa de domicilio desde panel detalle
- Modal expandido: tipo_cliente, seguro, autorizacion, valor_domicilio, valor_copago, copago_laboratorio, indicaciones, fecha, hora, tipo_servicio, notas - Botón Editar en header del panel detalle (aparece al seleccionar un domicilio) - editarDomicilio(id): carga y pre-rellena todos los campos del modal - toggleSeguro(): muestra/oculta campo seguro_nombre según tipo_cliente - Tras guardar, el detalle se refresca automáticamente
This commit is contained in:
+128
-11
@@ -118,7 +118,13 @@ $domIdParam = (int)($_GET['id'] ?? 0);
|
|||||||
<div class="card border-0 shadow-sm">
|
<div class="card border-0 shadow-sm">
|
||||||
<div class="card-header bg-white border-0 d-flex justify-content-between align-items-center">
|
<div class="card-header bg-white border-0 d-flex justify-content-between align-items-center">
|
||||||
<h6 class="mb-0 fw-semibold">Detalle <span id="detail-id" class="text-muted"></span></h6>
|
<h6 class="mb-0 fw-semibold">Detalle <span id="detail-id" class="text-muted"></span></h6>
|
||||||
<button class="btn-close" onclick="cerrarDetalle()"></button>
|
<div class="d-flex gap-2">
|
||||||
|
<button class="btn btn-sm btn-outline-primary d-none" id="btn-editar-dom"
|
||||||
|
onclick="editarDomicilio(domSeleccionado)">
|
||||||
|
<i class="fas fa-edit me-1"></i>Editar
|
||||||
|
</button>
|
||||||
|
<button class="btn-close" onclick="cerrarDetalle()"></button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body" id="detail-body">
|
<div class="card-body" id="detail-body">
|
||||||
<div class="text-center py-5 text-muted">
|
<div class="text-center py-5 text-muted">
|
||||||
@@ -131,9 +137,9 @@ $domIdParam = (int)($_GET['id'] ?? 0);
|
|||||||
</div>
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<!-- Modal Formulario -->
|
<!-- Modal Formulario (Nuevo / Editar) -->
|
||||||
<div class="modal fade" id="modalDomicilio" tabindex="-1">
|
<div class="modal fade" id="modalDomicilio" tabindex="-1">
|
||||||
<div class="modal-dialog modal-lg">
|
<div class="modal-dialog modal-lg modal-dialog-scrollable">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h5 class="modal-title"><i class="fas fa-house-medical me-2"></i><span id="modal-titulo">Nuevo Domicilio</span></h5>
|
<h5 class="modal-title"><i class="fas fa-house-medical me-2"></i><span id="modal-titulo">Nuevo Domicilio</span></h5>
|
||||||
@@ -143,7 +149,12 @@ $domIdParam = (int)($_GET['id'] ?? 0);
|
|||||||
<form id="form-domicilio">
|
<form id="form-domicilio">
|
||||||
<input type="hidden" name="id" id="dom-id">
|
<input type="hidden" name="id" id="dom-id">
|
||||||
<input type="hidden" name="orden_id" id="dom-orden-id" value="<?= $ordenIdParam ?>">
|
<input type="hidden" name="orden_id" id="dom-orden-id" value="<?= $ordenIdParam ?>">
|
||||||
<div class="row g-3">
|
|
||||||
|
<!-- ── Paciente ── -->
|
||||||
|
<h6 class="text-muted text-uppercase small fw-semibold border-bottom pb-1 mb-3">
|
||||||
|
<i class="fas fa-user me-1"></i> Paciente y servicio
|
||||||
|
</h6>
|
||||||
|
<div class="row g-3 mb-3">
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<label class="form-label">Paciente <span class="text-danger">*</span></label>
|
<label class="form-label">Paciente <span class="text-danger">*</span></label>
|
||||||
<input type="hidden" name="paciente_id" id="dom-paciente-id" value="<?= $pacIdParam ?>">
|
<input type="hidden" name="paciente_id" id="dom-paciente-id" value="<?= $pacIdParam ?>">
|
||||||
@@ -152,10 +163,32 @@ $domIdParam = (int)($_GET['id'] ?? 0);
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<label class="form-label">Tipo de servicio</label>
|
<label class="form-label">Tipo de servicio</label>
|
||||||
<input type="text" class="form-control" name="tipo_servicio" id="dom-tipo">
|
<input type="text" class="form-control" name="tipo_servicio" id="dom-tipo" placeholder="Ej: toma de muestras">
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<label class="form-label">Tipo de cliente</label>
|
||||||
|
<select class="form-select" name="tipo_cliente" id="dom-tipo-cliente" onchange="toggleSeguro(this.value)">
|
||||||
|
<option value="particular">Particular</option>
|
||||||
|
<option value="seguro">Seguro / EPS</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4" id="bloque-seguro" style="display:none">
|
||||||
|
<label class="form-label">Nombre del seguro / EPS</label>
|
||||||
|
<input type="text" class="form-control" name="seguro_nombre" id="dom-seguro-nombre" placeholder="Ej: Sura, Nueva EPS…">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<label class="form-label">N° de autorización</label>
|
||||||
|
<input type="text" class="form-control" name="autorizacion" id="dom-autorizacion" placeholder="Número de autorización">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ── Dirección ── -->
|
||||||
|
<h6 class="text-muted text-uppercase small fw-semibold border-bottom pb-1 mb-3">
|
||||||
|
<i class="fas fa-map-marker-alt me-1"></i> Dirección
|
||||||
|
</h6>
|
||||||
|
<div class="row g-3 mb-3">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<label class="form-label">Dirección <span class="text-danger">*</span></label>
|
<label class="form-label">Dirección completa <span class="text-danger">*</span></label>
|
||||||
<input type="text" class="form-control" name="direccion" id="dom-dir" required>
|
<input type="text" class="form-control" name="direccion" id="dom-dir" required>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
@@ -167,9 +200,16 @@ $domIdParam = (int)($_GET['id'] ?? 0);
|
|||||||
<input type="text" class="form-control" name="barrio" id="dom-barrio">
|
<input type="text" class="form-control" name="barrio" id="dom-barrio">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<label class="form-label">Indicaciones de la dirección</label>
|
<label class="form-label">Indicaciones adicionales</label>
|
||||||
<input type="text" class="form-control" name="indicaciones_dir" id="dom-indic" placeholder="Ej: apto 302, tocar campanilla">
|
<input type="text" class="form-control" name="indicaciones_dir" id="dom-indic" placeholder="Ej: apto 302, tocar campanilla">
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ── Fecha / hora ── -->
|
||||||
|
<h6 class="text-muted text-uppercase small fw-semibold border-bottom pb-1 mb-3">
|
||||||
|
<i class="fas fa-calendar-alt me-1"></i> Programación
|
||||||
|
</h6>
|
||||||
|
<div class="row g-3 mb-3">
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<label class="form-label">Fecha programada <span class="text-danger">*</span></label>
|
<label class="form-label">Fecha programada <span class="text-danger">*</span></label>
|
||||||
<input type="date" class="form-control" name="fecha_programada" id="dom-fecha" required>
|
<input type="date" class="form-control" name="fecha_programada" id="dom-fecha" required>
|
||||||
@@ -178,10 +218,44 @@ $domIdParam = (int)($_GET['id'] ?? 0);
|
|||||||
<label class="form-label">Hora</label>
|
<label class="form-label">Hora</label>
|
||||||
<input type="time" class="form-control" name="hora_programada" id="dom-hora">
|
<input type="time" class="form-control" name="hora_programada" id="dom-hora">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12">
|
</div>
|
||||||
<label class="form-label">Notas</label>
|
|
||||||
<textarea class="form-control" name="notas_admin" id="dom-notas" rows="2"></textarea>
|
<!-- ── Cobros ── -->
|
||||||
|
<h6 class="text-muted text-uppercase small fw-semibold border-bottom pb-1 mb-3">
|
||||||
|
<i class="fas fa-cash-register me-1"></i> Cobros
|
||||||
|
</h6>
|
||||||
|
<div class="row g-3 mb-3">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<label class="form-label">Valor domicilio</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-text">$</span>
|
||||||
|
<input type="number" class="form-control" name="valor_domicilio" id="dom-valor-dom"
|
||||||
|
min="0" step="1000" placeholder="0">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<label class="form-label">Copago cliente</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-text">$</span>
|
||||||
|
<input type="number" class="form-control" name="valor_copago" id="dom-valor-cop"
|
||||||
|
min="0" step="1000" placeholder="0">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<label class="form-label">Copago laboratorio</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-text">$</span>
|
||||||
|
<input type="number" class="form-control" name="copago_laboratorio" id="dom-copago-lab"
|
||||||
|
min="0" step="1000" placeholder="0">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ── Notas ── -->
|
||||||
|
<div class="mb-2">
|
||||||
|
<label class="form-label">Notas internas</label>
|
||||||
|
<textarea class="form-control" name="notas_admin" id="dom-notas" rows="2"
|
||||||
|
placeholder="Observaciones para el equipo…"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@@ -305,6 +379,7 @@ async function verDomicilio(id) {
|
|||||||
|
|
||||||
document.getElementById('detail-id').textContent = `#${id}`;
|
document.getElementById('detail-id').textContent = `#${id}`;
|
||||||
document.getElementById('detail-body').innerHTML = '<div class="text-center py-3"><i class="fas fa-spinner fa-spin"></i></div>';
|
document.getElementById('detail-body').innerHTML = '<div class="text-center py-3"><i class="fas fa-spinner fa-spin"></i></div>';
|
||||||
|
document.getElementById('btn-editar-dom').classList.remove('d-none');
|
||||||
|
|
||||||
const r = await fetch(`api/lab/get_domicilios.php?id=${id}&no_stats=1`);
|
const r = await fetch(`api/lab/get_domicilios.php?id=${id}&no_stats=1`);
|
||||||
const d = await r.json();
|
const d = await r.json();
|
||||||
@@ -427,6 +502,7 @@ function cerrarDetalle() {
|
|||||||
domSeleccionado = null;
|
domSeleccionado = null;
|
||||||
document.querySelectorAll('.dom-row').forEach(r => r.classList.remove('table-active'));
|
document.querySelectorAll('.dom-row').forEach(r => r.classList.remove('table-active'));
|
||||||
document.getElementById('detail-id').textContent = '';
|
document.getElementById('detail-id').textContent = '';
|
||||||
|
document.getElementById('btn-editar-dom').classList.add('d-none');
|
||||||
document.getElementById('detail-body').innerHTML = '<div class="text-center py-5 text-muted"><i class="fas fa-arrow-left me-2"></i>Selecciona un domicilio</div>';
|
document.getElementById('detail-body').innerHTML = '<div class="text-center py-5 text-muted"><i class="fas fa-arrow-left me-2"></i>Selecciona un domicilio</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -469,6 +545,9 @@ function abrirFormulario() {
|
|||||||
document.getElementById('form-domicilio').reset();
|
document.getElementById('form-domicilio').reset();
|
||||||
document.getElementById('dom-id').value = '';
|
document.getElementById('dom-id').value = '';
|
||||||
document.getElementById('dom-fecha').value = document.getElementById('filtro-fecha').value || '<?= date('Y-m-d') ?>';
|
document.getElementById('dom-fecha').value = document.getElementById('filtro-fecha').value || '<?= date('Y-m-d') ?>';
|
||||||
|
document.getElementById('dom-tipo-cliente').value = 'particular';
|
||||||
|
toggleSeguro('particular');
|
||||||
|
document.getElementById('modal-titulo').textContent = 'Nuevo Domicilio';
|
||||||
modal.show();
|
modal.show();
|
||||||
|
|
||||||
// Autocompletar paciente desde parámetros URL
|
// Autocompletar paciente desde parámetros URL
|
||||||
@@ -478,6 +557,42 @@ function abrirFormulario() {
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── Editar domicilio existente ─────────────────────────────────────────────
|
||||||
|
async function editarDomicilio(id) {
|
||||||
|
if (!id) return;
|
||||||
|
const r = await fetch(`api/lab/get_domicilios.php?id=${id}&no_stats=1`);
|
||||||
|
const d = await r.json();
|
||||||
|
const dom = d.domicilio;
|
||||||
|
if (!dom) { mostrarToast('No se pudo cargar el domicilio', 'danger'); return; }
|
||||||
|
|
||||||
|
document.getElementById('modal-titulo').textContent = `Editar Domicilio #${dom.id}`;
|
||||||
|
document.getElementById('dom-id').value = dom.id;
|
||||||
|
document.getElementById('dom-orden-id').value = dom.orden_id || '';
|
||||||
|
document.getElementById('dom-paciente-id').value = dom.paciente_id;
|
||||||
|
document.getElementById('dom-paciente-nombre').value = dom.paciente_nombre || '';
|
||||||
|
document.getElementById('dom-tipo').value = dom.tipo_servicio || '';
|
||||||
|
document.getElementById('dom-dir').value = dom.direccion || '';
|
||||||
|
document.getElementById('dom-ciudad').value = dom.ciudad || '';
|
||||||
|
document.getElementById('dom-barrio').value = dom.barrio || '';
|
||||||
|
document.getElementById('dom-indic').value = dom.indicaciones_dir || '';
|
||||||
|
document.getElementById('dom-fecha').value = dom.fecha_programada || '';
|
||||||
|
document.getElementById('dom-hora').value = (dom.hora_programada || '').slice(0, 5);
|
||||||
|
document.getElementById('dom-tipo-cliente').value = dom.tipo_cliente || 'particular';
|
||||||
|
toggleSeguro(dom.tipo_cliente || 'particular');
|
||||||
|
document.getElementById('dom-seguro-nombre').value = dom.seguro_nombre || '';
|
||||||
|
document.getElementById('dom-autorizacion').value = dom.autorizacion || '';
|
||||||
|
document.getElementById('dom-valor-dom').value = dom.valor_domicilio || '';
|
||||||
|
document.getElementById('dom-valor-cop').value = dom.valor_copago || '';
|
||||||
|
document.getElementById('dom-copago-lab').value = dom.copago_laboratorio || '';
|
||||||
|
document.getElementById('dom-notas').value = dom.notas_admin || '';
|
||||||
|
modal.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mostrar/ocultar campo seguro según tipo_cliente
|
||||||
|
function toggleSeguro(val) {
|
||||||
|
document.getElementById('bloque-seguro').style.display = val === 'seguro' ? '' : 'none';
|
||||||
|
}
|
||||||
|
|
||||||
async function guardarDomicilio() {
|
async function guardarDomicilio() {
|
||||||
const form = document.getElementById('form-domicilio');
|
const form = document.getElementById('form-domicilio');
|
||||||
if (!form.checkValidity()) { form.reportValidity(); return; }
|
if (!form.checkValidity()) { form.reportValidity(); return; }
|
||||||
@@ -496,7 +611,9 @@ async function guardarDomicilio() {
|
|||||||
if (d.success) {
|
if (d.success) {
|
||||||
modal.hide();
|
modal.hide();
|
||||||
mostrarToast(d.message, 'success');
|
mostrarToast(d.message, 'success');
|
||||||
cargarLista(paginaActual);
|
const editadoId = datos.id ? parseInt(datos.id) : null;
|
||||||
|
await cargarLista(paginaActual);
|
||||||
|
if (editadoId) verDomicilio(editadoId);
|
||||||
} else {
|
} else {
|
||||||
mostrarToast(d.error||'Error', 'danger');
|
mostrarToast(d.error||'Error', 'danger');
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user