112 lines
3.0 KiB
PHP
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;
|
|
}
|