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; }