- App.php: clientIp() público resuelve X-Forwarded-For/X-Real-IP
- module.php: usa el mismo IP resolution en sidebar de recepcionista
- chat.php: botón Menú regresa al desk solo si rol=recepcionista con IP
registrada; bacteriólogo no aplica lógica de IP en este flujo
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- module.php: si la IP está registrada en turnero_dispositivos para un
lugar de tipo recepción, el sidebar muestra solo ese desk; resto de
vistas (chat, verificar, TV) siempre visibles
- App.php: guard que redirige al recepcionista a su desk si intenta
acceder manualmente a otro desk_id; IP libre no tiene restricción
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Auth: agrega isBacteriologo()
- App: guard que bloquea dashboard e historial para bacteriólogo y
redirige según IP (turnero_dispositivos); IP registrada → ese lugar,
IP libre → primer lugar de muestras
- module.php: sidebar bacteriólogo sin Dashboard/Historial; IP
registrada muestra solo ese lugar, IP libre muestra TV + todos los
lugares muestras
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>