fix: display global sonaba 3 veces con 3 escritorios de recepción

Cuando recepcion_desk_id es NULL, el mismo turno aparecía en los 3
escritorios de recepción con claves distintas (incluían el nombre del
escritorio). Eso generaba 3 entradas nuevas en lastSeenKeys → 3 anuncios.

Fix: añadir announcedCalls Set con clave id|llamado_at (sin destino).
El sonido/anuncio solo se encola una vez por evento de llamada,
independientemente de cuántos escritorios devuelvan el mismo turno.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-06-24 00:54:56 -05:00
co-authored by Claude Sonnet 4.6
parent 4058cfe929
commit 92adee6285
+15 -11
View File
@@ -590,9 +590,10 @@ function showAnnouncement({ codigo, destino, paciente, color }) {
} }
/* ── State ── */ /* ── State ── */
let lastSeenKeys = new Set(); let lastSeenKeys = new Set();
let llamados = []; let announcedCalls = new Set(); // dedup por id+llamado_at, evita anunciar mismo turno desde varios escritorios
let _firstLoad = true; let llamados = [];
let _firstLoad = true;
function renderSnapshot(snap) { function renderSnapshot(snap) {
const codEl = document.getElementById('codigo-activo'); const codEl = document.getElementById('codigo-activo');
@@ -614,14 +615,15 @@ function renderSnapshot(snap) {
const currentKeys = new Set(); const currentKeys = new Set();
let anuncioNuevo = false; let anuncioNuevo = false;
allTurnos.forEach(t => { allTurnos.forEach(t => {
const key = t.codigo + '|' + t.destino + '|' + (t.llamado_at || ''); const key = t.codigo + '|' + t.destino + '|' + (t.llamado_at || '');
// Clave única por evento de llamada (id+llamado_at), independiente del escritorio
const callKey = (t.id || t.codigo) + '|' + (t.llamado_at || '');
currentKeys.add(key); currentKeys.add(key);
if (!lastSeenKeys.has(key)) { if (!lastSeenKeys.has(key)) {
const c = t.prioridad_color || '<?= $_labColor ?>'; const c = t.prioridad_color || '<?= $_labColor ?>';
// Solo decir el nombre en voz si el paciente está registrado en lab_pacientes
const nomVoz = t.paciente_id ? t.paciente_nombre : null; const nomVoz = t.paciente_id ? t.paciente_nombre : null;
// En primera carga silenciar todos; el más reciente se anuncia abajo if (!_firstLoad && !announcedCalls.has(callKey)) {
if (!_firstLoad) { announcedCalls.add(callKey);
queueAnnouncement({ _key: key, codigo: t.codigo, destino: t.destino, paciente: nomVoz, color: c }); queueAnnouncement({ _key: key, codigo: t.codigo, destino: t.destino, paciente: nomVoz, color: c });
} }
llamados.unshift({ codigo: t.codigo, destino: t.destino, paciente: t.paciente_nombre, color: c }); llamados.unshift({ codigo: t.codigo, destino: t.destino, paciente: t.paciente_nombre, color: c });
@@ -635,10 +637,12 @@ function renderSnapshot(snap) {
_firstLoad = false; _firstLoad = false;
const sorted = allTurnos.slice().sort((a, b) => new Date(b.llamado_at || 0) - new Date(a.llamado_at || 0)); const sorted = allTurnos.slice().sort((a, b) => new Date(b.llamado_at || 0) - new Date(a.llamado_at || 0));
if (sorted.length > 0) { if (sorted.length > 0) {
const t = sorted[0]; const t = sorted[0];
const c = t.prioridad_color || '<?= $_labColor ?>'; const c = t.prioridad_color || '<?= $_labColor ?>';
const key = t.codigo + '|' + t.destino + '|' + (t.llamado_at || ''); const key = t.codigo + '|' + t.destino + '|' + (t.llamado_at || '');
const nomVoz = t.paciente_id ? t.paciente_nombre : null; const callKey = (t.id || t.codigo) + '|' + (t.llamado_at || '');
const nomVoz = t.paciente_id ? t.paciente_nombre : null;
announcedCalls.add(callKey);
queueAnnouncement({ _key: key, codigo: t.codigo, destino: t.destino, paciente: nomVoz, color: c }); queueAnnouncement({ _key: key, codigo: t.codigo, destino: t.destino, paciente: nomVoz, color: c });
} }
} }