diff --git a/modules/turnero/api/cambiar_estado.php b/modules/turnero/api/cambiar_estado.php
index 656fdc6..ef92f56 100644
--- a/modules/turnero/api/cambiar_estado.php
+++ b/modules/turnero/api/cambiar_estado.php
@@ -39,8 +39,8 @@ if ($nuevoEstado === '') jsonError('nuevo_estado es requerido.');
const TRANSICIONES = [
'espera' => ['en_recepcion', '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'],
+ 'en_espera_lugar' => ['en_servicio', 'en_recepcion', 'ausente', 'cancelado'],
+ 'en_servicio' => ['finalizado', 'ausente', 'cancelado', 'en_espera_lugar', 'en_recepcion'],
];
$pdo = db();
@@ -116,6 +116,14 @@ try {
$sets[] = 'recepcion_desk_id = ?';
$binds[] = $deskId;
}
+ // Viene de un lugar: limpiar campos del lugar para que quede reasignable
+ if (in_array($estadoActual, ['en_espera_lugar', 'en_servicio'], true)) {
+ $sets[] = 'lugar_destino_id = NULL';
+ $sets[] = 'llamado_lugar_at = NULL';
+ $sets[] = 'inicio_lugar_at = NULL';
+ $sets[] = 'fin_recepcion_at = NULL';
+ $sets[] = 'atendido_lugar_por = NULL';
+ }
break;
case 'en_espera_lugar':
diff --git a/modules/turnero/views/lugar.php b/modules/turnero/views/lugar.php
index 9295378..6fcedfb 100644
--- a/modules/turnero/views/lugar.php
+++ b/modules/turnero/views/lugar.php
@@ -794,6 +794,9 @@ require_once __DIR__ . '/../../../shared/components/sidebar.php';
+
@@ -1733,6 +1736,25 @@ async function regresarCola() {
}
}
+async function devolverRecepcion() {
+ if (!turnoActivo) return;
+ if (!confirm(`¿Devolver turno ${turnoActivo.codigo} a recepción?`)) return;
+ try {
+ const res = await fetch(API + 'cambiar_estado.php', {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ turno_id: turnoActivo.id, nuevo_estado: 'en_recepcion' }),
+ });
+ const json = await res.json();
+ if (!json.ok) { mostrarError(json.error); return; }
+ mostrarToast('Turno devuelto a recepción', 'info', 3000);
+ resetFicha();
+ cargarCola();
+ } catch (err) {
+ mostrarError(err.message);
+ }
+}
+
async function cambiarEstadoTurno(nuevoEstado) {
try {
const res = await fetch(API + 'cambiar_estado.php', {
@@ -1800,6 +1822,7 @@ function resetFicha() {
document.getElementById('btn-finalizar').classList.add('d-none');
document.getElementById('btn-regresar').classList.add('d-none');
document.getElementById('btn-rellamar').classList.add('d-none');
+ document.getElementById('btn-devolver').classList.add('d-none');
volverACola();
}
@@ -1835,17 +1858,20 @@ function actualizarEstadoBadge(estado) {
const btnFin = document.getElementById('btn-finalizar');
const btnReg = document.getElementById('btn-regresar');
const btnRellamar = document.getElementById('btn-rellamar');
+ const btnDev = document.getElementById('btn-devolver');
if (estado === 'en_espera_lugar') {
btnIni.classList.remove('d-none'); btnIni.disabled = false;
btnFin.classList.add('d-none');
btnReg.classList.add('d-none');
btnRellamar.classList.add('d-none');
+ btnDev.classList.remove('d-none');
} else if (estado === 'en_servicio') {
btnIni.classList.add('d-none');
btnFin.classList.remove('d-none');
btnReg.classList.remove('d-none');
btnRellamar.classList.remove('d-none');
+ btnDev.classList.remove('d-none');
}
}