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-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>
|
||||
<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 class="card-body" id="detail-body">
|
||||
<div class="text-center py-5 text-muted">
|
||||
@@ -131,9 +137,9 @@ $domIdParam = (int)($_GET['id'] ?? 0);
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Modal Formulario -->
|
||||
<!-- Modal Formulario (Nuevo / Editar) -->
|
||||
<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-header">
|
||||
<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">
|
||||
<input type="hidden" name="id" id="dom-id">
|
||||
<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">
|
||||
<label class="form-label">Paciente <span class="text-danger">*</span></label>
|
||||
<input type="hidden" name="paciente_id" id="dom-paciente-id" value="<?= $pacIdParam ?>">
|
||||
@@ -152,10 +163,32 @@ $domIdParam = (int)($_GET['id'] ?? 0);
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<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 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">
|
||||
<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>
|
||||
</div>
|
||||
<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">
|
||||
</div>
|
||||
<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">
|
||||
</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">
|
||||
<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>
|
||||
@@ -178,10 +218,44 @@ $domIdParam = (int)($_GET['id'] ?? 0);
|
||||
<label class="form-label">Hora</label>
|
||||
<input type="time" class="form-control" name="hora_programada" id="dom-hora">
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label class="form-label">Notas</label>
|
||||
<textarea class="form-control" name="notas_admin" id="dom-notas" rows="2"></textarea>
|
||||
</div>
|
||||
|
||||
<!-- ── 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 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>
|
||||
</form>
|
||||
</div>
|
||||
@@ -305,6 +379,7 @@ async function verDomicilio(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('btn-editar-dom').classList.remove('d-none');
|
||||
|
||||
const r = await fetch(`api/lab/get_domicilios.php?id=${id}&no_stats=1`);
|
||||
const d = await r.json();
|
||||
@@ -427,6 +502,7 @@ function cerrarDetalle() {
|
||||
domSeleccionado = null;
|
||||
document.querySelectorAll('.dom-row').forEach(r => r.classList.remove('table-active'));
|
||||
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>';
|
||||
}
|
||||
|
||||
@@ -469,6 +545,9 @@ function abrirFormulario() {
|
||||
document.getElementById('form-domicilio').reset();
|
||||
document.getElementById('dom-id').value = '';
|
||||
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();
|
||||
|
||||
// Autocompletar paciente desde parámetros URL
|
||||
@@ -478,6 +557,42 @@ function abrirFormulario() {
|
||||
<?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() {
|
||||
const form = document.getElementById('form-domicilio');
|
||||
if (!form.checkValidity()) { form.reportValidity(); return; }
|
||||
@@ -496,7 +611,9 @@ async function guardarDomicilio() {
|
||||
if (d.success) {
|
||||
modal.hide();
|
||||
mostrarToast(d.message, 'success');
|
||||
cargarLista(paginaActual);
|
||||
const editadoId = datos.id ? parseInt(datos.id) : null;
|
||||
await cargarLista(paginaActual);
|
||||
if (editadoId) verDomicilio(editadoId);
|
||||
} else {
|
||||
mostrarToast(d.error||'Error', 'danger');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user