Files

112 lines
3.0 KiB
PHP

<?php
/**
* Helper per la gestione della lista d'attesa (waiting list).
*/
/**
* La scuola ha attivato la lista d'attesa?
* Legge l'unico record della tabella option.
*/
function isWaitingListEnabled(mysqli $conn): bool
{
$res = $conn->query("SELECT waitinglist_enabled FROM `option` LIMIT 1");
if ($res && ($row = $res->fetch_assoc())) {
return $row['waitinglist_enabled'] === 'Y';
}
return false;
}
/**
* Capienza, posti impegnati (booked + pending) e posti liberi di una classe.
*
* @return array{maxcapacity:int, occupied:int, free:int}
*/
function getClassOccupancy(mysqli $conn, int $idserviceschedule): array
{
// Capienza (da service via serviceschedule)
$cap = 0;
$stmt = $conn->prepare(
"SELECT s.maxcapacity
FROM serviceschedule ss
JOIN service s ON ss.idservice = s.idservice
WHERE ss.idserviceschedule = ?"
);
$stmt->bind_param("i", $idserviceschedule);
$stmt->execute();
$res = $stmt->get_result();
if ($rowCap = $res->fetch_assoc()) {
$cap = (int) $rowCap['maxcapacity'];
}
$stmt->close();
// Posti impegnati: booked + pending
$occupied = 0;
$stmt = $conn->prepare(
"SELECT COUNT(*) AS occupied
FROM bookingclass
WHERE idserviceschedule = ?
AND status IN ('booked', 'pending')"
);
$stmt->bind_param("i", $idserviceschedule);
$stmt->execute();
$res = $stmt->get_result();
if ($rowOcc = $res->fetch_assoc()) {
$occupied = (int) $rowOcc['occupied'];
}
$stmt->close();
$free = $cap - $occupied;
return [
'maxcapacity' => $cap,
'occupied' => $occupied,
'free' => $free < 0 ? 0 : $free,
];
}
/**
* Decide lo stato di una nuova prenotazione:
* - 'pending' -> c'è posto (flusso normale, insegnante approva)
* - 'waiting' -> classe piena E waiting list attiva
* - 'full' -> classe piena E waiting list disattivata (NON prenotabile)
*/
function decideBookingStatus(mysqli $conn, int $idserviceschedule): string
{
$occ = getClassOccupancy($conn, $idserviceschedule);
if ($occ['free'] > 0) {
return 'pending';
}
return isWaitingListEnabled($conn) ? 'waiting' : 'full';
}
/**
* Posizione (1-based) di un utente nella coda waiting di una classe.
* 0 se non è in coda.
*/
function getWaitingPosition(mysqli $conn, int $idserviceschedule, int $iduser): int
{
$stmt = $conn->prepare(
"SELECT COUNT(*) AS pos
FROM bookingclass
WHERE idserviceschedule = ?
AND status = 'waiting'
AND created_at <= (
SELECT created_at FROM bookingclass
WHERE idserviceschedule = ? AND iduser = ? AND status = 'waiting'
ORDER BY created_at ASC LIMIT 1
)"
);
$stmt->bind_param("iii", $idserviceschedule, $idserviceschedule, $iduser);
$stmt->execute();
$res = $stmt->get_result();
$pos = 0;
if ($row = $res->fetch_assoc()) {
$pos = (int) $row['pos'];
}
$stmt->close();
return $pos;
}