Files
yogibook_aury_new/public/api/api_teacher_available_classes.php
2026-08-23 11:30:40 +02:00

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']);
}