getConnection(); if (!isset($iduserlogin)) { die("Errore: ID utente non definito."); } $stmt = $pdo->prepare("SELECT id, name, logo FROM schools WHERE owner_id = ?"); $stmt->execute([$iduserlogin]); $school = $stmt->fetch(); if (!$school) { die("Errore: Nessuna scuola trovata."); } $school_id = $school['id']; $school_name = $school['name']; // === LISTA UTENTI DELLA SCUOLA (per dropdown "Aggiungi partecipante") === // NOTA: uso user_schools (come nel tuo progetto). Se la tabella si chiama diversamente, cambia qui. $stmtUsers = $pdo->prepare(" SELECT au.id, au.first_name, au.last_name, au.email FROM user_schools us JOIN auth_users au ON au.id = us.user_id WHERE us.school_id = ? AND us.status = 'active' ORDER BY au.first_name, au.last_name "); $stmtUsers->execute([$school_id]); $schoolUsers = $stmtUsers->fetchAll(PDO::FETCH_ASSOC); // === GESTIONE AZIONI === $feedback = ''; $showEmailModal = false; $emailData = null; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = $_POST['action'] ?? ''; // Cancellazione lezione if ($action === 'delete_session') { $session_id = (int)($_POST['session_id'] ?? 0); $send_email = isset($_POST['send_email']) && $_POST['send_email'] === '1'; error_log("DELETE_SESSION: session_id={$session_id} send_email_POST=" . var_export($_POST['send_email'] ?? null, true)); error_log("DELETE_SESSION: send_email_BOOL=" . var_export($send_email, true)); $stmt = $pdo->prepare(" SELECT cs.id, cs.session_date, cs.start_time, cs.end_time, c.name AS class_name, ct.level FROM class_sessions cs JOIN class_types ct ON cs.class_type_id = ct.id JOIN classes c ON ct.class_id = c.id WHERE cs.id = ? AND c.school_id = ? "); $stmt->execute([$session_id, $school_id]); $session = $stmt->fetch(); if ($session) { $recipients = []; if ($send_email) { $stmt2 = $pdo->prepare(" SELECT au.email, au.first_name FROM session_bookings sb JOIN auth_users au ON sb.user_id = au.id WHERE sb.session_id = ? "); $stmt2->execute([$session_id]); $recipients = $stmt2->fetchAll(PDO::FETCH_ASSOC); } // Se devo inviare email e ci sono destinatari -> apro modale (NON cancello ancora) if ($send_email && !empty($recipients)) { $showEmailModal = true; $emailData = [ 'session_id' => $session_id, 'class_name' => $session['class_name'], 'level' => $session['level'] ?? '', 'date' => date('d/m/Y', strtotime($session['session_date'])), 'time' => substr($session['start_time'], 0, 5) . ' - ' . substr($session['end_time'], 0, 5), 'recipients' => $recipients ]; } else { // Altrimenti cancello subito $stmt = $pdo->prepare("DELETE FROM class_sessions WHERE id = ? AND id IN ( SELECT cs.id FROM class_sessions cs JOIN class_types ct ON cs.class_type_id = ct.id JOIN classes c ON ct.class_id = c.id WHERE c.school_id = ? )"); $stmt->execute([$session_id, $school_id]); $feedback = '
Lezione cancellata con successo!
'; } } } // Invio email cancellazione elseif ($action === 'send_cancellation_email') { $session_id = (int)($_POST['session_id'] ?? 0); $body_text = $_POST['email_body'] ?? ''; $stmt = $pdo->prepare(" SELECT c.name AS class_name, ct.level, cs.session_date, cs.start_time, cs.end_time FROM class_sessions cs JOIN class_types ct ON cs.class_type_id = ct.id JOIN classes c ON ct.class_id = c.id WHERE cs.id = ? AND c.school_id = ? "); $stmt->execute([$session_id, $school_id]); $session = $stmt->fetch(); $class_info = $session['class_name'] . ($session['level'] ? ' (' . ucfirst($session['level']) . ')' : ''); $date = $session ? date('d/m/Y', strtotime($session['session_date'])) : ''; $time = $session ? substr($session['start_time'], 0, 5) . '-' . substr($session['end_time'], 0, 5) : ''; $stmt = $pdo->prepare(" SELECT au.email, au.first_name FROM session_bookings sb JOIN auth_users au ON sb.user_id = au.id WHERE sb.session_id = ? "); $stmt->execute([$session_id]); $recipients = $stmt->fetchAll(PDO::FETCH_ASSOC); $subject = "Lezione cancellata - {$school_name}"; $sent = 0; foreach ($recipients as $r) { $personal_body = str_replace( ['{nome}', '{classe}', '{data}', '{ora}'], [$r['first_name'] ?: 'Gentile utente', $class_info, $date, $time], $body_text ); $result = sendEmail($r['email'], $subject, $personal_body); if ($result['success']) $sent++; } // Cancella la lezione DOPO invio email $stmtDel = $pdo->prepare(" DELETE cs FROM class_sessions cs JOIN class_types ct ON cs.class_type_id = ct.id JOIN classes c ON ct.class_id = c.id WHERE cs.id = ? AND c.school_id = ? "); $stmtDel->execute([$session_id, $school_id]); $feedback = "
Email inviate a {$sent} partecipanti.
"; } elseif ($action === 'skip_cancellation_email') { $session_id = (int)($_POST['session_id'] ?? 0); $stmt = $pdo->prepare(" DELETE cs FROM class_sessions cs JOIN class_types ct ON cs.class_type_id = ct.id JOIN classes c ON ct.class_id = c.id WHERE cs.id = ? AND c.school_id = ? "); $stmt->execute([$session_id, $school_id]); $feedback = "
Lezione cancellata (email non inviata).
"; } // Aggiungi partecipante alla lezione elseif ($action === 'add_booking') { $session_id = (int)($_POST['session_id'] ?? 0); $user_id = (int)($_POST['user_id'] ?? 0); if ($session_id <= 0 || $user_id <= 0) { $feedback = '
Dati non validi.
'; } else { // 1) Verifica sessione appartiene alla scuola + capienza $stmt = $pdo->prepare(" SELECT cs.id, ct.max_capacity, (SELECT COUNT(*) FROM session_bookings sb WHERE sb.session_id = cs.id AND sb.status IN ('booked','attended','rescheduled') ) AS booked_count FROM class_sessions cs JOIN class_types ct ON cs.class_type_id = ct.id JOIN classes c ON ct.class_id = c.id WHERE cs.id = ? AND c.school_id = ? LIMIT 1 "); $stmt->execute([$session_id, $school_id]); $info = $stmt->fetch(PDO::FETCH_ASSOC); if (!$info) { $feedback = '
Lezione non trovata o non autorizzata.
'; } else { // 2) Verifica utente appartiene alla scuola $stmt = $pdo->prepare(" SELECT 1 FROM user_schools WHERE user_id = ? AND school_id = ? AND status = 'active' LIMIT 1 "); $stmt->execute([$user_id, $school_id]); $isMember = (bool)$stmt->fetchColumn(); if (!$isMember) { $feedback = '
Utente non associato a questa scuola.
'; } else { // 3) Verifica già prenotato (qualsiasi status) $stmt = $pdo->prepare("SELECT 1 FROM session_bookings WHERE session_id = ? AND user_id = ? LIMIT 1"); $stmt->execute([$session_id, $user_id]); $already = (bool)$stmt->fetchColumn(); if ($already) { $feedback = '
Questo utente è già presente nella lezione.
'; } else { // 4) Verifica capienza (se max_capacity valorizzato) $max = (int)($info['max_capacity'] ?? 0); $cnt = (int)($info['booked_count'] ?? 0); if ($max > 0 && $cnt >= $max) { $feedback = '
Lezione piena: capienza massima raggiunta.
'; } else { // 5) Inserimento (con fallback se non hai created_at/updated_at) try { $stmtIns = $pdo->prepare(" INSERT INTO session_bookings (session_id, user_id, status, created_at, updated_at) VALUES (?, ?, 'booked', NOW(), NOW()) "); $stmtIns->execute([$session_id, $user_id]); } catch (PDOException $e) { // fallback SOLO se l'errore è "Unknown column" if (stripos($e->getMessage(), 'Unknown column') !== false) { $stmtIns = $pdo->prepare(" INSERT INTO session_bookings (session_id, user_id, status) VALUES (?, ?, 'booked') "); $stmtIns->execute([$session_id, $user_id]); } else { throw $e; } } $feedback = '
Partecipante aggiunto alla lezione!
'; } } } } } } // Marca come persa elseif ($action === 'mark_lost') { $booking_id = (int)($_POST['booking_id'] ?? 0); $stmt = $pdo->prepare("UPDATE session_bookings SET status = 'missed' WHERE id = ? AND session_id IN (SELECT cs.id FROM class_sessions cs JOIN class_types ct ON cs.class_type_id = ct.id JOIN classes c ON ct.class_id = c.id WHERE c.school_id = ?)"); $stmt->execute([$booking_id, $school_id]); $feedback = '
Presenza segnata come persa.
'; } // Cancella prenotazione elseif ($action === 'cancel_booking') { $booking_id = (int)($_POST['booking_id'] ?? 0); $stmt = $pdo->prepare("DELETE FROM session_bookings WHERE id = ? AND session_id IN (SELECT cs.id FROM class_sessions cs JOIN class_types ct ON cs.class_type_id = ct.id JOIN classes c ON ct.class_id = c.id WHERE c.school_id = ?)"); $stmt->execute([$booking_id, $school_id]); $feedback = '
Prenotazione rimossa.
'; } } // Recupero lezioni future $stmt = $pdo->prepare(" SELECT cs.id AS session_id, cs.session_date, cs.start_time, cs.end_time, c.name AS class_name, ct.level, ct.room_name, ct.max_capacity, t.first_name, t.last_name, (SELECT COUNT(*) FROM session_bookings sb WHERE sb.session_id = cs.id AND sb.status IN ('booked','attended','rescheduled')) AS booked_count, (SELECT GROUP_CONCAT(CONCAT(sb.id,'|||',au.id,'|||',au.first_name,' ',au.last_name,'|||',au.email,'|||',COALESCE(au.phone,''),'|||',sb.status) SEPARATOR ';;;') FROM session_bookings sb JOIN auth_users au ON sb.user_id = au.id WHERE sb.session_id = cs.id AND sb.status IN ('booked','attended','rescheduled','missed')) AS booked_students_details FROM class_sessions cs JOIN class_types ct ON cs.class_type_id = ct.id JOIN classes c ON ct.class_id = c.id LEFT JOIN teachers t ON cs.teacher_id = t.id WHERE cs.session_date >= CURDATE() AND c.school_id = ? ORDER BY cs.session_date, cs.start_time "); $stmt->execute([$school_id]); $sessions = $stmt->fetchAll(); $grouped = []; foreach ($sessions as $s) { $date = new DateTime($s['session_date']); $month_key = $date->format('Y-m'); $month_name = ucfirst(strftime('%B %Y', $date->getTimestamp())); $grouped[$month_key]['name'] = $month_name; $grouped[$month_key]['sessions'][] = $s; } ?> Lezioni Future - <?php echo htmlspecialchars($school_name); ?>
Logo

Lezioni Future -

Gestione completa: lista prenotati, P/C, cancellazione con avviso email.

Nessuna lezione programmata nel futuro.
Data Classe Livello Orario Sala Insegnante Prenotati Azioni
Non assegnato'; ?>
(int)($parts[0] ?? 0), 'user_id' => (int)($parts[1] ?? 0), 'name' => $parts[2] ?? '', 'email' => $parts[3] ?? '', 'phone' => $parts[4] ?? '—', 'status' => $parts[5] ?? 'booked' ]; } } ?>