fix(turnero): dos correcciones de estado y redirección
1. App::bacteDefaultUrl() ahora busca también por token cookie (antes solo buscaba por IP), consistente con login.php y lugar.php. 2. cambiarEstadoTurno(): cuando el servidor devuelve 422 (transición inválida porque otro operador cambió el estado), muestra mensaje claro y refresca la UI en lugar de mostrar el error técnico bruto "Transición 'en_recepcion' → 'finalizado' no está permitida". Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
88fd0e4151
commit
70fda3dacc
+19
-14
@@ -162,25 +162,30 @@ class App
|
|||||||
$base = '/erp.php?m=turnero&v=lugar&lugar_id=';
|
$base = '/erp.php?m=turnero&v=lugar&lugar_id=';
|
||||||
try {
|
try {
|
||||||
$pdo = Database::getInstance()->getConnection();
|
$pdo = Database::getInstance()->getConnection();
|
||||||
$ip = self::clientIp();
|
// 1. Por token de navegador
|
||||||
// ¿IP registrada?
|
$tok = trim($_COOKIE['turnero_token'] ?? '');
|
||||||
$dev = $pdo->prepare(
|
if ($tok) {
|
||||||
"SELECT lugar_id FROM turnero_dispositivos WHERE ip = ? AND activo = 1 LIMIT 1"
|
$s = $pdo->prepare(
|
||||||
);
|
"SELECT lugar_id FROM turnero_dispositivos WHERE token = ? AND activo = 1 LIMIT 1"
|
||||||
$dev->execute([$ip]);
|
);
|
||||||
$row = $dev->fetch(PDO::FETCH_ASSOC);
|
$s->execute([$tok]);
|
||||||
if ($row) {
|
$row = $s->fetch(PDO::FETCH_ASSOC);
|
||||||
return $base . (int)$row['lugar_id'];
|
if ($row) return $base . (int)$row['lugar_id'];
|
||||||
}
|
}
|
||||||
// Primer lugar de toma de muestras
|
// 2. Por IP
|
||||||
|
$ip = self::clientIp();
|
||||||
|
$s = $pdo->prepare(
|
||||||
|
"SELECT lugar_id FROM turnero_dispositivos WHERE ip = ? AND token IS NULL AND activo = 1 LIMIT 1"
|
||||||
|
);
|
||||||
|
$s->execute([$ip]);
|
||||||
|
$row = $s->fetch(PDO::FETCH_ASSOC);
|
||||||
|
if ($row) return $base . (int)$row['lugar_id'];
|
||||||
|
// 3. Primer lugar de toma de muestras
|
||||||
$first = $pdo->query(
|
$first = $pdo->query(
|
||||||
"SELECT id FROM turnero_lugares WHERE activo=1 AND tipo='muestras' ORDER BY sort_order LIMIT 1"
|
"SELECT id FROM turnero_lugares WHERE activo=1 AND tipo='muestras' ORDER BY sort_order LIMIT 1"
|
||||||
)->fetch(PDO::FETCH_ASSOC);
|
)->fetch(PDO::FETCH_ASSOC);
|
||||||
if ($first) {
|
if ($first) return $base . (int)$first['id'];
|
||||||
return $base . (int)$first['id'];
|
|
||||||
}
|
|
||||||
} catch (\Throwable $_) {}
|
} catch (\Throwable $_) {}
|
||||||
// Fallback: turnero sin vista específica
|
|
||||||
return '/erp.php?m=turnero';
|
return '/erp.php?m=turnero';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2014,7 +2014,17 @@ async function cambiarEstadoTurno(nuevoEstado) {
|
|||||||
body: JSON.stringify({ turno_id: turnoActivo.id, nuevo_estado: nuevoEstado }),
|
body: JSON.stringify({ turno_id: turnoActivo.id, nuevo_estado: nuevoEstado }),
|
||||||
});
|
});
|
||||||
const json = await res.json();
|
const json = await res.json();
|
||||||
if (!json.ok) { mostrarError(json.error); return; }
|
if (!json.ok) {
|
||||||
|
// Si el estado cambió por otro operador, refrescar UI en lugar de mostrar error técnico
|
||||||
|
if (res.status === 422) {
|
||||||
|
mostrarError('El estado del turno cambió desde otro puesto. Actualizando…');
|
||||||
|
await cargarCola();
|
||||||
|
await recuperarTurnoActivo();
|
||||||
|
} else {
|
||||||
|
mostrarError(json.error);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
resetFicha();
|
resetFicha();
|
||||||
cargarCola();
|
cargarCola();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|||||||
Reference in New Issue
Block a user