diff --git a/modules/turnero/api/get_display_global.php b/modules/turnero/api/get_display_global.php index 39602bc..d490986 100644 --- a/modules/turnero/api/get_display_global.php +++ b/modules/turnero/api/get_display_global.php @@ -76,6 +76,8 @@ if (empty($escritoriosRec)) { JOIN turnero_prioridades p ON p.id = t.prioridad_id WHERE t.sesion_id = ? AND t.estado = 'en_recepcion' + -- Misma regla que en los puestos: el turno vale hasta medianoche + AND DATE(t.llamado_recepcion_at) = CURDATE() ORDER BY t.llamado_recepcion_at DESC" ); $stmtRec->execute([$sesionId]); @@ -120,6 +122,10 @@ foreach ($lugares as $lugar) { WHERE t.sesion_id = ? AND t.estado = 'en_servicio' AND t.lugar_destino_id = ? + -- Un turno vale hasta la medianoche de su día. Quedan bastantes sin + -- cerrar, y sin este filtro el puesto mostraba como \"llamado ahora\" + -- a un paciente de días atrás en cuanto se cerraba el turno real. + AND DATE(t.llamado_lugar_at) = CURDATE() ORDER BY t.llamado_lugar_at DESC LIMIT 1" ); diff --git a/modules/turnero/views/display_global.php b/modules/turnero/views/display_global.php index a3eb8fa..50aead9 100644 --- a/modules/turnero/views/display_global.php +++ b/modules/turnero/views/display_global.php @@ -841,18 +841,16 @@ function renderSnapshot(snap) { }); lastSeenKeys = currentKeys; - if (_firstLoad) { - _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 || ''; - const key = t.codigo + '|' + t.destino + '|' + (t.llamado_at || ''); - const nomVoz = t.paciente_id ? t.paciente_nombre : null; - announcedCalls.add(key); - queueAnnouncement({ _key: key, codigo: t.codigo, destino: t.destino, paciente: nomVoz, color: c }); - } - } + // Al abrir la pantalla NO se anuncia nada por voz. Antes se llamaba al turno + // que estuviera arriba, pero eso no es un llamado nuevo: es el estado en que + // se encontró el puesto. Si allí había un turno sin cerrar de horas atrás, el + // televisor gritaba el nombre de un paciente que ya se había ido. Y como esta + // pantalla se recarga sola, cada recarga era una oportunidad de equivocarse. + // + // El recorrido de arriba ya dio por vistos los turnos presentes —registra la + // clave sin anunciar mientras _firstLoad siga en pie—, así que aquí solo hay + // que levantar la bandera: de la siguiente vuelta en adelante sí se anuncia. + if (_firstLoad) _firstLoad = false; if (anuncioNuevo) renderLlamados();