This commit is contained in:
Lizandro Guarnizo
2026-06-16 08:53:28 -05:00
parent 42ccb1d436
commit cef40a7a43
4 changed files with 53 additions and 3 deletions
+2
View File
@@ -210,6 +210,7 @@ function siguienteTurnoEnCola(string $estado, ?int $lugarId = null): ?array
AND t.lugar_destino_id = ?
ORDER BY p.orden_peso ASC, t.creado_at ASC
LIMIT 1
FOR UPDATE
';
$stmt = $pdo->prepare($sql);
$stmt->execute([$estado, $lugarId]);
@@ -221,6 +222,7 @@ function siguienteTurnoEnCola(string $estado, ?int $lugarId = null): ?array
WHERE t.estado = ?
ORDER BY p.orden_peso ASC, t.creado_at ASC
LIMIT 1
FOR UPDATE
';
$stmt = $pdo->prepare($sql);
$stmt->execute([$estado]);
+8 -1
View File
@@ -37,7 +37,7 @@ if ($nuevoEstado === '') jsonError('nuevo_estado es requerido.');
// Mapa de transiciones válidas [estado_actual => [estados_destino_permitidos]]
const TRANSICIONES = [
'espera' => ['en_recepcion', 'ausente', 'cancelado'],
'en_recepcion' => ['en_espera_lugar', 'ausente', 'cancelado'],
'en_recepcion' => ['en_espera_lugar', 'espera', 'ausente', 'cancelado'],
'en_espera_lugar' => ['en_servicio', 'ausente', 'cancelado'],
'en_servicio' => ['finalizado', 'ausente', 'cancelado', 'en_espera_lugar'],
];
@@ -139,6 +139,13 @@ try {
$binds[] = adminId();
break;
case 'espera':
// Soltar: liberar el turno para que otro escritorio lo llame
$sets[] = 'recepcion_desk_id = NULL';
$sets[] = 'inicio_recepcion_at = NULL';
$sets[] = 'atendido_recepcion_por = NULL';
break;
case 'ausente':
case 'cancelado':
// Sin timestamps adicionales; simplemente cambio de estado
+1
View File
@@ -66,6 +66,7 @@ $stmt = $pdo->prepare(
t.numero,
t.estado,
t.paciente_nombre,
t.recepcion_desk_id,
t.creado_at,
t.llamado_recepcion_at,
t.llamado_lugar_at,
+42 -2
View File
@@ -300,10 +300,14 @@ require_once __DIR__ . '/../../../shared/components/sidebar.php';
justify-content:center;font-size:1.6rem;font-weight:900;color:#fff;background:#3b82f6">
</div>
<div>
<div class="flex-grow-1">
<div class="h4 mb-0 fw-bold" id="ficha-codigo">—</div>
<div class="text-muted small" id="ficha-prio-nombre">—</div>
</div>
<button class="btn btn-outline-primary btn-sm" onclick="rellamarActivo()"
title="Volver a llamar este turno (suena en pantalla)">
<i class="fas fa-bell"></i> Re-llamar
</button>
</div>
<!-- ── Sección 1: Paciente ── -->
@@ -428,6 +432,9 @@ require_once __DIR__ . '/../../../shared/components/sidebar.php';
<button class="btn btn-warning d-none" id="btn-enviar-consent" onclick="enviarConsentimientos()">
<i class="fas fa-paper-plane me-1"></i>Enviar consentimientos
</button>
<button class="btn btn-outline-secondary" id="btn-soltar" onclick="soltarTurno()" title="Liberar turno para que otro escritorio lo llame">
<i class="fas fa-undo-alt me-1"></i>Soltar
</button>
<button class="btn btn-secondary ms-auto" onclick="marcarAusente()">
<i class="fas fa-user-slash me-1"></i>Ausente
</button>
@@ -489,7 +496,7 @@ async function cargarCola() {
function renderCola(snap) {
const lista = document.getElementById('cola-items');
const todos = snap.cola || [];
const espera = todos.filter(t => t.estado === 'espera' || t.estado === 'en_recepcion');
const espera = todos.filter(t => t.estado === 'espera');
const badge = document.getElementById('badge-count');
badge.textContent = espera.length;
@@ -594,6 +601,19 @@ async function llamarTurnoEspecifico(turnoId, estadoActual) {
}
}
// ── Re-llamar desde la ficha ────────────────────────────────
async function rellamarActivo() {
if (!turnoActivo) return;
mostrarLlamando(turnoActivo.codigo);
try {
await fetch(API + 'rellamar.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ turno_id: turnoActivo.id, desk_id: DESK_ID }),
});
} catch (_) {}
}
// ── Abrir ficha ───────────────────────────────────────────────
function abrirFicha(turno) {
turnoActivo = turno;
@@ -948,6 +968,26 @@ async function marcarAusente() {
cargarCola();
}
// ── Soltar turno ──────────────────────────────────────────────
async function soltarTurno() {
if (!turnoActivo) return;
if (!confirm(`¿Soltar turno ${turnoActivo.codigo}? Otro escritorio podrá llamarlo.`)) return;
await fetch(API + 'cambiar_estado.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ turno_id: turnoActivo.id, nuevo_estado: 'espera' }),
});
turnoActivo = null;
solicitudActiva = null;
document.getElementById('ficha-turno').classList.add('d-none');
document.getElementById('ficha-placeholder').classList.remove('d-none');
document.getElementById('badge-turno-activo').classList.add('d-none');
mostrarToast('Turno liberado', 'success');
cargarCola();
}
// ── Helpers ───────────────────────────────────────────────────
function resetCheckboxes() {
document.querySelectorAll('.exam-chk').forEach(c => c.checked = false);