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 ── */
let lastSeenKeys = new Set();
let llamados = [];
let _firstLoad = true;
let lastSeenKeys = new Set();
let announcedCalls = new Set(); // dedup por id+llamado_at, evita anunciar mismo turno desde varios escritorios
let llamados = [];
let _firstLoad = true;
function renderSnapshot(snap) {
const codEl = document.getElementById('codigo-activo');
@@ -614,14 +615,15 @@ function renderSnapshot(snap) {
const currentKeys = new Set();
let anuncioNuevo = false;
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);
if (!lastSeenKeys.has(key)) {
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;
// En primera carga silenciar todos; el más reciente se anuncia abajo
if (!_firstLoad) {
if (!_firstLoad && !announcedCalls.has(callKey)) {
announcedCalls.add(callKey);
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 });
@@ -635,10 +637,12 @@ function renderSnapshot(snap) {
_firstLoad = false;
const sorted = allTurnos.slice().sort((a, b) => new Date(b.llamado_at || 0) - new Date(a.llamado_at || 0));
if (sorted.length > 0) {
const t = sorted[0];
const c = t.prioridad_color || '<?= $_labColor ?>';
const key = t.codigo + '|' + t.destino + '|' + (t.llamado_at || '');
const nomVoz = t.paciente_id ? t.paciente_nombre : null;
const t = sorted[0];
const c = t.prioridad_color || '<?= $_labColor ?>';
const key = t.codigo + '|' + t.destino + '|' + (t.llamado_at || '');
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 });
}
}