Dashboard del turnero: desglose por recepcionista y por bacteriólogo

This commit is contained in:
Lizandro Guarnizo
2026-08-17 18:50:43 -05:00
parent 29cbebfeb5
commit d4674f087d
2 changed files with 138 additions and 16 deletions
+44 -1
View File
@@ -287,6 +287,18 @@ try {
<div class="lugar-grid" id="lugarGrid"></div>
</div>
<!-- Desglose por recepcionista -->
<div class="section-card" id="sectionRecepcionista" style="display:none">
<div class="section-title"><i class="fas fa-user-check me-1"></i>Por recepcionista</div>
<div class="lugar-grid" id="recepcionistaGrid"></div>
</div>
<!-- Desglose por bacteriólogo -->
<div class="section-card" id="sectionBacteriologo" style="display:none">
<div class="section-title"><i class="fas fa-user-nurse me-1"></i>Por bacteriólogo</div>
<div class="lugar-grid" id="bacteriologoGrid"></div>
</div>
<!-- Tabla detalle de turnos -->
<div class="section-card">
<div class="d-flex align-items-center justify-content-between mb-3 flex-wrap gap-2">
@@ -445,7 +457,8 @@ function mostrarError(msg) {
// ── Render ───────────────────────────────────────────────────
function renderDashboard(json) {
const { sesion, resumen, por_prioridad, por_lugar, consent_stats = {}, turnos } = json;
const { sesion, resumen, por_prioridad, por_lugar, consent_stats = {}, turnos,
por_recepcionista = [], por_bacteriologo = [] } = json;
// ── Sesión info ────────────────────────────────────────
const si = document.getElementById('sesionInfo');
@@ -536,11 +549,41 @@ function renderDashboard(json) {
secLug.style.display = 'none';
}
// ── Tarjetas por persona ───────────────────────────────
renderPersonas('sectionRecepcionista', 'recepcionistaGrid', por_recepcionista, [
['Turnos', p => p.total],
['Atendidos', p => p.atendidos],
['Ausentes', p => p.ausentes],
['T. recepción prom.', p => p.tiempo_promedio_min !== null ? p.tiempo_promedio_min + ' min' : '—'],
]);
renderPersonas('sectionBacteriologo', 'bacteriologoGrid', por_bacteriologo, [
['Turnos', p => p.total],
['Finalizados', p => p.finalizados],
['En servicio', p => p.en_servicio],
['T. servicio prom.', p => p.tiempo_promedio_min !== null ? p.tiempo_promedio_min + ' min' : '—'],
]);
// ── Tabla de turnos ────────────────────────────────────
_turnos = turnos;
renderTabla(turnos);
}
// Tarjetas "quién atendió a cuántos". Reutiliza el grid de lugares para que
// las tres secciones se vean iguales.
function renderPersonas(sectionId, gridId, filas, columnas) {
const sec = document.getElementById(sectionId);
if (!filas || !filas.length) { sec.style.display = 'none'; return; }
sec.style.display = '';
document.getElementById(gridId).innerHTML = filas.map(p => `
<div class="lugar-card">
<div class="lc-name"><i class="fas fa-user text-primary me-1"></i>${escHtml(p.nombre || '—')}</div>
${columnas.map(([lbl, val]) =>
`<div class="lc-row"><span>${lbl}</span><span>${escHtml(String(val(p) ?? '—'))}</span></div>`
).join('')}
</div>`).join('');
}
function kpiCard(val, lbl, sub) {
return `<div class="kpi-card">
<div class="kpi-val">${val !== null && val !== undefined ? escHtml(String(val)) : '—'}</div>