110 lines
3.8 KiB
PHP
110 lines
3.8 KiB
PHP
<?php
|
|
|
|
/**
|
|
* api_teacher_available_classes.php
|
|
* --------------------------------------------------------------------------
|
|
* Classi schedulate candidate come destinazione di una riprogrammazione.
|
|
* Solo staff (Admin=1 / teacher=3).
|
|
*
|
|
* Restituisce le classi FUTURE con posti liberi (non piene), escludendo
|
|
* quelle dove l'allievo indicato è già prenotato.
|
|
*
|
|
* Posizione: public/api/api_teacher_available_classes.php
|
|
* Metodo: GET
|
|
* Auth: Bearer token (Sanctum) via _bootstrap.php
|
|
* Query: ?booking_id=<int> (la prenotazione che si vuole spostare)
|
|
* --------------------------------------------------------------------------
|
|
*/
|
|
|
|
require_once __DIR__ . '/_bootstrap.php';
|
|
|
|
// Gate staff
|
|
$roleId = (int) $user->role_id;
|
|
if (!in_array($roleId, [1, 3], true)) {
|
|
http_response_code(403);
|
|
echo json_encode(['success' => false, 'message' => 'Forbidden']);
|
|
exit;
|
|
}
|
|
|
|
$bookingId = isset($_GET['booking_id']) ? (int) $_GET['booking_id'] : 0;
|
|
if ($bookingId <= 0) {
|
|
http_response_code(400);
|
|
echo json_encode(['success' => false, 'message' => 'ID prenotazione non valido']);
|
|
exit;
|
|
}
|
|
|
|
try {
|
|
// Trova utente e classe attuale della prenotazione da spostare
|
|
$stmt = $db->prepare(
|
|
"SELECT iduser, idserviceschedule
|
|
FROM bookingclass
|
|
WHERE idbookingclass = :id
|
|
LIMIT 1"
|
|
);
|
|
$stmt->execute([':id' => $bookingId]);
|
|
$booking = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$booking) {
|
|
http_response_code(404);
|
|
echo json_encode(['success' => false, 'message' => 'Prenotazione non trovata']);
|
|
exit;
|
|
}
|
|
|
|
$iduser = (int) $booking['iduser'];
|
|
$currentSchedule = (int) $booking['idserviceschedule'];
|
|
|
|
// Classi future con conteggio prenotati (status='booked', coerente col pannello)
|
|
$sql = "SELECT
|
|
ss.idserviceschedule,
|
|
ss.idservice,
|
|
s.servicename,
|
|
COALESCE(s.maxcapacity, 0) AS maxcapacity,
|
|
ss.dateschedule,
|
|
(SELECT COUNT(*) FROM bookingclass bc
|
|
WHERE bc.idserviceschedule = ss.idserviceschedule
|
|
AND bc.status = 'booked') AS booked_count,
|
|
(SELECT COUNT(*) FROM bookingclass bc2
|
|
WHERE bc2.idserviceschedule = ss.idserviceschedule
|
|
AND bc2.iduser = :iduser
|
|
AND bc2.status = 'booked') AS already_here
|
|
FROM serviceschedule ss
|
|
LEFT JOIN service s ON ss.idservice = s.idservice
|
|
WHERE ss.dateschedule >= NOW()
|
|
ORDER BY ss.dateschedule ASC";
|
|
$stmt = $db->prepare($sql);
|
|
$stmt->execute([':iduser' => $iduser]);
|
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
$classes = [];
|
|
foreach ($rows as $r) {
|
|
$sid = (int) $r['idserviceschedule'];
|
|
$maxcap = (int) $r['maxcapacity'];
|
|
$booked = (int) $r['booked_count'];
|
|
$alreadyHere = ((int) $r['already_here']) > 0;
|
|
$isFull = $maxcap > 0 && $booked >= $maxcap;
|
|
|
|
// Escludi: classe attuale, classi piene, classi dove è già iscritto
|
|
if ($sid === $currentSchedule) continue;
|
|
if ($isFull) continue;
|
|
if ($alreadyHere) continue;
|
|
|
|
$classes[] = [
|
|
'schedule_id' => $sid,
|
|
'service_id' => (int) $r['idservice'],
|
|
'class_name' => (string) ($r['servicename'] ?? ''),
|
|
'date_time' => $r['dateschedule'],
|
|
'max_capacity' => $maxcap,
|
|
'booked_count' => $booked,
|
|
];
|
|
}
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'classes' => $classes,
|
|
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
|
} catch (Throwable $ex) {
|
|
error_log('api_teacher_available_classes error: ' . $ex->getMessage());
|
|
http_response_code(500);
|
|
echo json_encode(['success' => false, 'message' => 'Errore recupero classi']);
|
|
}
|