diff --git a/public/userarea/future_sessions.php b/public/userarea/future_sessions.php
index 1c7fcb7..7e32d99 100644
--- a/public/userarea/future_sessions.php
+++ b/public/userarea/future_sessions.php
@@ -22,6 +22,19 @@ if (!$school) {
}
$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 = '';
@@ -34,7 +47,10 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Cancellazione lezione
if ($action === 'delete_session') {
$session_id = (int)($_POST['session_id'] ?? 0);
- $send_email = !empty($_POST['send_email']);
+ $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,
@@ -54,7 +70,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
SELECT au.email, au.first_name
FROM session_bookings sb
JOIN auth_users au ON sb.user_id = au.id
- WHERE sb.session_id = ? AND sb.status IN ('booked','attended','rescheduled')
+ WHERE sb.session_id = ?
");
$stmt2->execute([$session_id]);
$recipients = $stmt2->fetchAll(PDO::FETCH_ASSOC);
@@ -114,7 +130,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
SELECT au.email, au.first_name
FROM session_bookings sb
JOIN auth_users au ON sb.user_id = au.id
- WHERE sb.session_id = ? AND sb.status IN ('booked','attended','rescheduled')
+ WHERE sb.session_id = ?
");
$stmt->execute([$session_id]);
$recipients = $stmt->fetchAll(PDO::FETCH_ASSOC);
@@ -160,11 +176,93 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
";
}
+ // 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 = 'lost' 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 = $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.
';
}
@@ -192,9 +290,9 @@ $stmt = $pdo->prepare("
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.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','lost')) AS booked_students_details
+ (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
@@ -224,6 +322,9 @@ foreach ($sessions as $s) {
Lezioni Future -
+
+
+
@@ -291,11 +392,20 @@ foreach ($sessions as $s) {
Non assegnato'; ?>
- 0): ?>data-bs-toggle="modal" data-bs-target="#studentsModal-" >
-
+
+
+ 0) ? "{$bc}/{$max}" : "{$bc}/∞";
+ ?>
+
+
@@ -324,11 +434,12 @@ foreach ($sessions as $s) {
if (empty(trim($entry))) continue;
$parts = explode('|||', $entry);
$students_list[] = [
- 'booking_id' => $parts[0] ?? 0,
- 'name' => $parts[1] ?? '',
- 'email' => $parts[2] ?? '',
- 'phone' => $parts[3] ?? '—',
- 'status' => $parts[4] ?? 'booked'
+ 'booking_id' => (int)($parts[0] ?? 0),
+ 'user_id' => (int)($parts[1] ?? 0),
+ 'name' => $parts[2] ?? '',
+ 'email' => $parts[3] ?? '',
+ 'phone' => $parts[4] ?? '—',
+ 'status' => $parts[5] ?? 'booked'
];
}
}
@@ -343,6 +454,65 @@ foreach ($sessions as $s) {
+ 0 && $bookedCnt >= $maxCap) $isFull = true;
+ ?>
+
+
+
+ Aggiungi partecipante
+
+ Capienza: 0 ? ($bookedCnt . '/' . $maxCap) : ($bookedCnt . '/∞'); ?>
+
+
+
+
+
Lezione piena: non puoi aggiungere altri partecipanti.
+
+
Nessun utente disponibile (tutti già presenti o nessun utente associato alla scuola).
+
+
+
+
+
Nessuno prenotato.
@@ -363,12 +533,12 @@ foreach ($sessions as $s) {
-
-
+
+
-
+
P
C
@@ -432,54 +602,54 @@ foreach ($sessions as $s) {
-
-
+
-
-
-
Confermi la cancellazione della lezione:
-
- Classe:
- Data:
- Orario: -
- Prenotati:
-
- 0): ?>
-
-
-
- Invia email di avviso ai partecipanti?
-
-
-
-
-
+
+
-
+
+
@@ -538,6 +708,28 @@ Grazie per la comprensione,
+
+
+