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