fix: sonido del turno se disparaba 3 veces en la pantalla TV

Dos causas:
1. sse_turno.php inicializaba \$lastPing = null, haciendo que la primera
   iteración del loop (2s después del emit inicial) siempre emitiera
   un snapshot extra aunque no hubiera cambios reales.
   Fix: inicializar \$lastPing con el sse_ping_at actual de la BD.

2. display.php comparaba activo.codigo para detectar nueva llamada.
   Si el poll y el SSE llegaban casi simultáneamente antes de que
   lastCodigoActivo se actualizara, ambos disparaban el sonido.
   Fix: comparar llamado_at en vez del código — el timestamp es
   único por llamada, por lo que sonidos duplicados son imposibles.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-06-24 00:48:33 -05:00
co-authored by Claude Sonnet 4.6
parent ae8d2cb13a
commit 4058cfe929
2 changed files with 14 additions and 7 deletions
+6 -1
View File
@@ -116,7 +116,6 @@ function buildSnapshot(PDO $pdo, int $sesionId, string $area, ?int $lugarId): ar
// ── Loop principal ────────────────────────────────────────────
$sesionId = obtenerOCrearSesionHoy();
$lastPing = null; // sse_ping_at de la última iteración
$lastKeepalive = time();
$lastEmit = 0;
@@ -124,6 +123,12 @@ $lastEmit = 0;
$snapshot = buildSnapshot($pdo, $sesionId, $area, $lugarId);
sseEvent('cola_update', $snapshot);
// Inicializar $lastPing con el valor ACTUAL (no null) para que la
// primera iteración del loop no emita un snapshot extra sin cambios
$stmt = $pdo->prepare('SELECT sse_ping_at FROM turnero_sesiones WHERE id = ?');
$stmt->execute([$sesionId]);
$lastPing = $stmt->fetchColumn() ?: null;
while (!connection_aborted()) {
sleep(2);