feat(turnero): cambio de estado y reapertura de turnos desde historial
Agrega botón de cambio de estado en cada fila del historial de turnos. Admins (sin role_id) pueden reabrir turnos finalizados/ausentes/cancelados. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
339ca8a40d
commit
9749d726fa
@@ -64,10 +64,60 @@ try {
|
||||
|
||||
$estadoActual = $turno['estado'];
|
||||
|
||||
// Estados finales no modificables
|
||||
// Estados finales — solo admin (sin role_id) puede reabrir
|
||||
if (in_array($estadoActual, ['finalizado', 'ausente', 'cancelado'], true)) {
|
||||
$pdo->rollBack();
|
||||
jsonError("El turno ya está en estado '{$estadoActual}' y no puede modificarse.", 422);
|
||||
$roleId = $_SESSION['admin_user']['role_id'] ?? null;
|
||||
if (!empty($roleId)) {
|
||||
$pdo->rollBack();
|
||||
jsonError("El turno ya está en estado '{$estadoActual}' y no puede modificarse.", 422);
|
||||
}
|
||||
|
||||
$permitidosAdmin = ['en_servicio', 'en_espera_lugar', 'en_recepcion', 'espera'];
|
||||
if (!in_array($nuevoEstado, $permitidosAdmin, true)) {
|
||||
$pdo->rollBack();
|
||||
jsonError("Estado destino inválido para reapertura. Opciones: " . implode(', ', $permitidosAdmin), 422);
|
||||
}
|
||||
|
||||
$sets = ['estado = ?'];
|
||||
$binds = [$nuevoEstado];
|
||||
|
||||
if ($nuevoEstado === 'en_servicio') {
|
||||
$sets[] = 'fin_lugar_at = NULL';
|
||||
$sets[] = 'inicio_lugar_at = COALESCE(inicio_lugar_at, NOW())';
|
||||
$sets[] = 'atendido_lugar_por = COALESCE(atendido_lugar_por, ?)';
|
||||
$binds[] = adminId();
|
||||
} elseif ($nuevoEstado === 'en_espera_lugar') {
|
||||
$sets[] = 'fin_lugar_at = NULL';
|
||||
$sets[] = 'inicio_lugar_at = NULL';
|
||||
$sets[] = 'llamado_lugar_at = NULL';
|
||||
} elseif ($nuevoEstado === 'espera') {
|
||||
$sets[] = 'llamado_recepcion_at = NULL';
|
||||
$sets[] = 'inicio_recepcion_at = NULL';
|
||||
$sets[] = 'fin_recepcion_at = NULL';
|
||||
$sets[] = 'llamado_lugar_at = NULL';
|
||||
$sets[] = 'inicio_lugar_at = NULL';
|
||||
$sets[] = 'fin_lugar_at = NULL';
|
||||
$sets[] = 'atendido_recepcion_por = NULL';
|
||||
$sets[] = 'atendido_lugar_por = NULL';
|
||||
$sets[] = 'recepcion_desk_id = NULL';
|
||||
}
|
||||
|
||||
$sql = 'UPDATE turnero_turnos SET ' . implode(', ', $sets) . ' WHERE id = ?';
|
||||
$binds[] = $turnoId;
|
||||
$pdo->prepare($sql)->execute($binds);
|
||||
$pdo->commit();
|
||||
|
||||
$stmt = $pdo->prepare(
|
||||
'SELECT t.*, p.codigo AS prioridad_codigo, p.nombre AS prioridad_nombre, p.color AS prioridad_color
|
||||
FROM turnero_turnos t
|
||||
JOIN turnero_prioridades p ON p.id = t.prioridad_id
|
||||
WHERE t.id = ?'
|
||||
);
|
||||
$stmt->execute([$turnoId]);
|
||||
$turnoActualizado = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
notificarSSE((int) $turnoActualizado['sesion_id']);
|
||||
jsonOk(['turno' => $turnoActualizado], "Turno reabierto: estado actualizado a '{$nuevoEstado}'");
|
||||
}
|
||||
|
||||
// Verificar que la transición sea válida
|
||||
|
||||
Reference in New Issue
Block a user