diff --git a/app/Http/Controllers/Web/Auth/LoginController.php b/app/Http/Controllers/Web/Auth/LoginController.php index 7d8e042..e35c4e9 100644 --- a/app/Http/Controllers/Web/Auth/LoginController.php +++ b/app/Http/Controllers/Web/Auth/LoginController.php @@ -66,19 +66,18 @@ class LoginController extends Controller // Validazione del campo school $schoolSlug = $request->input('school'); + if ($schoolSlug) { $school = School::where('slug', $schoolSlug)->first(); - if (!$school) { - return redirect()->to('login' . $to) - ->withErrors(['school' => trans('auth.school_not_found')]); + + if ($school) { + // Se presente e valida → salva in sessione + $request->session()->put('school_id', $school->id); } - // Salva lo school_id nella sessione - $request->session()->put('school_id', $school->id); - } else { - // Se il campo school è vuoto, possiamo gestire il caso di default - return redirect()->to('login' . $to) - ->withErrors(['school' => trans('auth.school_required')]); + // ⚠️ se non esiste → NON blocchiamo il login } + // ⚠️ se è vuota → NON facciamo nulla + $credentials = $request->getCredentials(); @@ -125,7 +124,7 @@ class LoginController extends Controller if ($user->hasRole('Admin')) { return redirect()->to('userarea/admin.php'); } elseif ($user->hasRole('User')) { - return redirect()->to('userarea/index.php'); + return redirect()->to('userarea/select_school.php'); } elseif ($user->hasRole('teacher')) { return redirect()->to('userarea/teacher.php'); } elseif ($user->hasRole('school_owner')) { @@ -151,12 +150,48 @@ class LoginController extends Controller /** * Log the user out of the application. */ - public function logout(): RedirectResponse + + + public function logout(Request $request): RedirectResponse { event(new LoggedOut); + // 1) Logout Laravel Auth::logout(); + // 2) Pulisci + invalida session Laravel (NON solo forget) + $request->session()->forget(['school_id', 'school_name', 'school_selected']); + $request->session()->invalidate(); + $request->session()->regenerateToken(); + + // 3) Pulisci anche la session PHP nativa usata in userarea (PHPSESSID) + if (session_status() !== PHP_SESSION_ACTIVE) { + @session_start(); + } + + unset( + $_SESSION['school_id'], + $_SESSION['school_name'], + $_SESSION['school_selected'] + ); + + // Se vuoi essere ancora più “definitivo”, distruggi tutta la PHP session: + $_SESSION = []; + + if (ini_get('session.use_cookies')) { + $params = session_get_cookie_params(); + setcookie( + session_name(), + '', + time() - 42000, + $params['path'], + $params['domain'], + $params['secure'], + $params['httponly'] + ); + } + @session_destroy(); + return redirect('login'); } } diff --git a/app/Http/Controllers/Web/Auth/select_school.php b/app/Http/Controllers/Web/Auth/select_school.php new file mode 100644 index 0000000..d1ff57e --- /dev/null +++ b/app/Http/Controllers/Web/Auth/select_school.php @@ -0,0 +1,235 @@ +getConnection(); + +// === DATI UTENTE === +$stmt = $pdo->prepare("SELECT first_name, last_name, avatar FROM auth_users WHERE id = ?"); +$stmt->execute([$iduserlogin]); +$user = $stmt->fetch(); + +$avatar = $user['avatar'] ? '../upload/users/' . $user['avatar'] : '../assets/images/default-avatar.png'; +$first_name = htmlspecialchars($user['first_name'] ?? ''); + +// === PROCESSA SELEZIONE SCUOLA (POST) === +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['school_id'])) { + $school_id = (int)$_POST['school_id']; + + $stmt = $pdo->prepare("SELECT id, name, logo FROM schools WHERE id = ? AND status = 'active'"); + $stmt->execute([$school_id]); + $school = $stmt->fetch(); + + if ($school) { + // Iscrivi automaticamente se non era già iscritto + $stmtCheck = $pdo->prepare("SELECT 1 FROM user_schools WHERE user_id = ? AND school_id = ?"); + $stmtCheck->execute([$iduserlogin, $school_id]); + if (!$stmtCheck->fetch()) { + $pdo->prepare("INSERT INTO user_schools (user_id, school_id, status) VALUES (?, ?, 'active')") + ->execute([$iduserlogin, $school_id]); + } + + // Imposta sessione + $_SESSION['school_id'] = $school['id']; + $_SESSION['school_name'] = $school['name']; + + // Reindirizza alla dashboard finale + header('Location: user_dashboard.php'); + exit; + } +} + +// === RECUPERA SCUOLE DELL'UTENTE === +$stmt = $pdo->prepare(" + SELECT s.id, s.name, s.slug, s.logo, s.address_city + FROM user_schools us + JOIN schools s ON us.school_id = s.id + WHERE us.user_id = ? AND us.status = 'active' AND s.status = 'active' + ORDER BY s.name +"); +$stmt->execute([$iduserlogin]); +$userSchools = $stmt->fetchAll(); + +// Caso 1: ha esattamente 1 scuola → vai diretto +if (count($userSchools) === 1) { + $school = $userSchools[0]; + $_SESSION['school_id'] = $school['id']; + $_SESSION['school_name'] = $school['name']; + header('Location: user_dashboard.php'); + exit; +} + +// Caso 2: ha più scuole → mostra selezione +// Caso 3: nessuna scuola → mostra tutte le scuole pubbliche +if (empty($userSchools)) { + $stmt = $pdo->prepare(" + SELECT id, name, slug, logo, address_city + FROM schools + WHERE status = 'active' + ORDER BY name + "); + $stmt->execute(); + $schools = $stmt->fetchAll(); + + $title = "Benvenuto! Scegli la tua scuola di yoga"; + $subtitle = "Seleziona la scuola dove vuoi prenotare le lezioni"; +} else { + $schools = $userSchools; + $title = "Ciao $first_name!"; + $subtitle = "Seleziona la scuola in cui vuoi entrare oggi"; +} +?> + + + + + + + + Scegli la scuola - Yogiboook + + + + + + +
+ + + +
+
+
+ + +
+
+

+

+
+
+ + + +
+ +

Nessuna scuola disponibile al momento

+
+ +
+ +
+ +
+
+
+ + + + + + +
+
+
+ +

+ +

+ +
+ +
+ +
+ +
+
+ + +
+
+
+ + +
+ + + + + + + \ No newline at end of file diff --git a/public/userarea/include/topbar.php b/public/userarea/include/topbar.php index 058b18f..8c50911 100644 --- a/public/userarea/include/topbar.php +++ b/public/userarea/include/topbar.php @@ -337,7 +337,7 @@ $cart_count = array_sum(array_column($_SESSION['cart'], 'quantity'));
  • -
  • Logout
  • +
  • Logout
  • diff --git a/public/userarea/my_lessons.php b/public/userarea/my_lessons.php index eeceea7..e34ec24 100644 --- a/public/userarea/my_lessons.php +++ b/public/userarea/my_lessons.php @@ -5,44 +5,52 @@ if (!isset($iduserlogin)) header('Location: login.php'); $dbHandler = DBHandlerSelect::getInstance(); $pdo = $dbHandler->getConnection(); -// Scuola corrente $school_id = session('school_id'); if (!$school_id) die("Nessuna scuola selezionata"); -// Dati utente $stmt = $pdo->prepare("SELECT first_name FROM auth_users WHERE id = ?"); $stmt->execute([$iduserlogin]); $user = $stmt->fetch(); -// === LEZIONI FUTURE DELL'UTENTE (prenotate) === +$stmt = $pdo->prepare("SELECT name, address_street, address_city, address_province FROM schools WHERE id = ?"); +$stmt->execute([$school_id]); +$school = $stmt->fetch(); + +$currentMonth = $_GET['month'] ?? date('Y-m'); +$monthDate = DateTime::createFromFormat('Y-m', $currentMonth) ?: new DateTime(); +$prevMonth = (clone $monthDate)->modify('-1 month')->format('Y-m'); +$nextMonth = (clone $monthDate)->modify('+1 month')->format('Y-m'); + +setlocale(LC_TIME, 'it_IT.UTF-8', 'Italian'); +$monthName = ucfirst(utf8_encode(strftime('%B %Y', $monthDate->getTimestamp()))); + +$startOfMonth = $monthDate->format('Y-m-01'); +$endOfMonth = (clone $monthDate)->modify('first day of next month')->format('Y-m-d'); + $stmt = $pdo->prepare(" SELECT sb.id as booking_id, - sb.booked_at, sb.status, cs.session_date, cs.start_time, cs.end_time, + cs.room_name, c.name as class_name, ct.level, - ct.day_of_week, - t.first_name as teacher_name, - o.id as order_id, o.available_entries, - o.total_entries, o.available_recoveries FROM session_bookings sb JOIN class_sessions cs ON sb.session_id = cs.id 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 JOIN orders o ON sb.order_id = o.id WHERE sb.user_id = ? AND cs.school_id = ? - AND cs.session_date >= CURDATE() + AND cs.session_date >= ? + AND cs.session_date < ? ORDER BY cs.session_date ASC, cs.start_time ASC "); -$stmt->execute([$iduserlogin, $school_id]); +$stmt->execute([$iduserlogin, $school_id, $startOfMonth, $endOfMonth]); $bookings = $stmt->fetchAll(); ?> @@ -52,51 +60,132 @@ $bookings = $stmt->fetchAll(); - Le mie lezioni - Yogiboook + Le mie lezioni @@ -107,96 +196,88 @@ $bookings = $stmt->fetchAll();
    -
    +
    -
    -
    -

    - Le tue lezioni future -

    -

    - , ecco tutte le lezioni che hai prenotato -

    +
    +
    + +

    +
    +
    + +
    -
    - -

    Nessuna lezione prenotata

    -

    Quando acquisterai un carnet o un abbonamento, potrai prenotare qui le tue lezioni!

    - Vai ai corsi +
    + +

    Nessuna lezione prenotata

    +

    Le tue lezioni appariranno qui

    + Vedi i corsi
    -
    - -
    -
    -
    - -
    -
    -
    -

    -
    - - - -
    - - -

    -

    - - -

    - -
    -

    - - - -

    - -

    - Con -

    - -
    - - -
    - - Ingressi: - / - 0): ?> - • Recuperi: - - -
    - - -
    - time() + 86400): // più di 24h prima - ?> - - - - - -
    -
    + +
    +
    +
    +
    +
    - -
    + +
    +

    + + - +

    + +
    + + - +
    + +
    + + + - +
    + +
    + + +
    + + 0 || $b['available_recoveries'] > 0): ?> +
    + 0): ?> + Ingressi disponibili: + + 0): ?> + 0 ? ' • ' : '' ?> + Recuperi: + +
    + + + time() + 86400): ?> +
    + + +
    + +
    + Non modificabile (entro 24 ore) +
    + +
    +
    + +
    @@ -205,52 +286,31 @@ $bookings = $stmt->fetchAll();
    - diff --git a/public/userarea/school_dashboard.php b/public/userarea/school_dashboard.php index 9123815..e98d2ef 100644 --- a/public/userarea/school_dashboard.php +++ b/public/userarea/school_dashboard.php @@ -932,6 +932,7 @@ $daily_sessions = $stmt->fetchAll(); + + +
    + + +
    +
    +
    + \ No newline at end of file diff --git a/public/userarea/select_school.php b/public/userarea/select_school.php new file mode 100644 index 0000000..990ad0f --- /dev/null +++ b/public/userarea/select_school.php @@ -0,0 +1,421 @@ +has('school_id')) { +// $_SESSION['school_id'] = session('school_id'); +// if (session()->has('school_name')) { +// $_SESSION['school_name'] = session('school_name'); +// } +// } + + +// se PHP ha school_id e Laravel no → copio in Laravel +if (isset($_SESSION['school_id']) && function_exists('session') && !session()->has('school_id')) { + session([ + 'school_id' => $_SESSION['school_id'], + 'school_name' => $_SESSION['school_name'] ?? null, + ]); +} + + +/* +|-------------------------------------------------------------------------- +| AUTH CHECK +|-------------------------------------------------------------------------- +*/ +if (!isset($_SESSION['iduserlogin'])) { + header('Location: login.php'); + exit; +} + +/* +|-------------------------------------------------------------------------- +| SE SCHOOL GIÀ IN SESSIONE → VAI AVANTI +|-------------------------------------------------------------------------- +*/ +// Se ho già una school_id in sessione, vado avanti SOLO se l'utente ha 1 scuola sola. +// Se ne ha >1, devo sempre mostrare la selezione. +if (!empty($_SESSION['school_id'])) { + // Non faccio redirect qui: lo decido DOPO aver caricato $userSchools + // (vedi sotto, dopo la query delle scuole utente) +} + + +$iduserlogin = $_SESSION['iduserlogin']; + +$dbHandler = DBHandlerSelect::getInstance(); +$pdo = $dbHandler->getConnection(); + +/* +|-------------------------------------------------------------------------- +| DATI UTENTE +|-------------------------------------------------------------------------- +*/ +$stmt = $pdo->prepare("SELECT first_name, avatar FROM auth_users WHERE id = ?"); +$stmt->execute([$iduserlogin]); +$user = $stmt->fetch(); + +$first_name = htmlspecialchars($user['first_name'] ?? ''); + +/* +|-------------------------------------------------------------------------- +| POST → SELEZIONE SCUOLA +|-------------------------------------------------------------------------- +*/ +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['school_id'])) { + $school_id = (int) $_POST['school_id']; + + $stmt = $pdo->prepare(" + SELECT id, name + FROM schools + WHERE id = ? AND status = 'active' + "); + $stmt->execute([$school_id]); + $school = $stmt->fetch(); + + if ($school) { + + // Iscrizione automatica se non esiste + $check = $pdo->prepare(" + SELECT 1 FROM user_schools + WHERE user_id = ? AND school_id = ? + "); + $check->execute([$iduserlogin, $school_id]); + + if (!$check->fetch()) { + $pdo->prepare(" + INSERT INTO user_schools (user_id, school_id, status) + VALUES (?, ?, 'active') + ")->execute([$iduserlogin, $school_id]); + } + + // Sessione + $_SESSION['school_id'] = $school['id']; + $_SESSION['school_name'] = $school['name']; + $_SESSION['school_selected'] = 1; + + + if (function_exists('session')) { + session([ + 'school_id' => $school['id'], + 'school_name' => $school['name'], + ]); + } + + + header('Location: user_dashboard.php'); + exit; + } +} + +/* +|-------------------------------------------------------------------------- +| RECUPERO SCUOLE UTENTE +|-------------------------------------------------------------------------- +*/ +$stmt = $pdo->prepare(" + SELECT s.id, s.name, s.logo, s.address_city + FROM user_schools us + JOIN schools s ON us.school_id = s.id + WHERE us.user_id = ? + AND us.status = 'active' + AND s.status = 'active' + ORDER BY s.name +"); +$stmt->execute([$iduserlogin]); +$userSchools = $stmt->fetchAll(); +// --- VALIDAZIONE school_id: se non appartiene all'utente, la resetto --- +$allowedIds = array_map(fn($r) => (int)$r['id'], $userSchools); + +if (!empty($_SESSION['school_id']) && !in_array((int)$_SESSION['school_id'], $allowedIds, true)) { + unset($_SESSION['school_id'], $_SESSION['school_name'], $_SESSION['school_selected']); + if (function_exists('session')) { + session()->forget('school_id'); + session()->forget('school_name'); + } +} + +// Caso 1: una sola scuola -> auto-select e vado in dashboard +if (count($userSchools) === 1) { + $_SESSION['school_id'] = (int)$userSchools[0]['id']; + $_SESSION['school_name'] = $userSchools[0]['name']; + $_SESSION['school_selected'] = 1; + + if (function_exists('session')) { + session([ + 'school_id' => (int)$userSchools[0]['id'], + 'school_name' => $userSchools[0]['name'], + ]); + } + + header('Location: user_dashboard.php'); + exit; +} + +// Caso 2: più scuole -> se school_id è presente MA non c'è selezione esplicita, mostro comunque la select +// Se invece school_id + school_selected sono presenti, posso andare in dashboard +if (count($userSchools) > 1 && !empty($_SESSION['school_id']) && !empty($_SESSION['school_selected'])) { + header('Location: user_dashboard.php'); + exit; +} + +/* + + +/* +|-------------------------------------------------------------------------- +| CASO: NESSUNA SCUOLA → MOSTRA PUBBLICHE +|-------------------------------------------------------------------------- +*/ +if (empty($userSchools)) { + $stmt = $pdo->query(" + SELECT id, name, logo, address_city + FROM schools + WHERE status = 'active' + ORDER BY name + "); + $schools = $stmt->fetchAll(); + + $title = "Benvenuto!"; + $subtitle = "Scegli la scuola dove vuoi prenotare le lezioni"; +} else { + $schools = $userSchools; + $title = "Ciao $first_name!"; + $subtitle = "Seleziona la scuola in cui entrare oggi"; +} +?> + + + + + + + + Scegli la scuola - Yogiboook + + + + + + + + + + +
    + + + +
    +
    +
    + + +
    +
    +
    + + Selezione scuola +
    + +

    +

    + +
    + Utente: +
    +
    +
    + + + +
    + +

    Nessuna scuola disponibile al momento

    +

    Riprova più tardi oppure contatta l’assistenza.

    +
    + +
    +
    + + + +
    +
    + +
    + + + + + +
    + +
    +
    + + +

    + +

    + +
    + + + +
    + + +
    + + +
    +
    + + +
    +
    +
    + + +
    + + + + + + + + \ No newline at end of file diff --git a/public/userarea/user_dashboard.php b/public/userarea/user_dashboard.php index 71f6cbe..534d3d6 100644 --- a/public/userarea/user_dashboard.php +++ b/public/userarea/user_dashboard.php @@ -1,6 +1,9 @@ getConnection(); +/* +|-------------------------------------------------------------------------- +| 1) Carico le scuole attive dell'utente +|-------------------------------------------------------------------------- +*/ +$stmt = $pdo->prepare(" + SELECT s.id, s.name, s.logo + FROM user_schools us + JOIN schools s ON us.school_id = s.id + WHERE us.user_id = ? + AND us.status = 'active' + AND s.status = 'active' + ORDER BY s.name +"); +$stmt->execute([(int)$iduserlogin]); +$userSchools = $stmt->fetchAll(PDO::FETCH_ASSOC); + +/* +|-------------------------------------------------------------------------- +| 2) Cambio scuola da modale (POST) +|-------------------------------------------------------------------------- +*/ +if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'change_school') { + $newSchoolId = (int)($_POST['school_id'] ?? 0); + + $allowedIds = array_map(fn($r) => (int)$r['id'], $userSchools); + + if ($newSchoolId > 0 && in_array($newSchoolId, $allowedIds, true)) { + // imposto sessione + $_SESSION['school_id'] = $newSchoolId; + + // imposto anche il nome (comodo per UI) + foreach ($userSchools as $r) { + if ((int)$r['id'] === $newSchoolId) { + $_SESSION['school_name'] = $r['name']; + break; + } + } + + // flag: selezione esplicita + $_SESSION['school_selected'] = 1; + + header('Location: user_dashboard.php'); + exit; + } +} + +/* +|-------------------------------------------------------------------------- +| 3) Validazione school_id in sessione +|-------------------------------------------------------------------------- +*/ +$allowedIds = array_map(fn($r) => (int)$r['id'], $userSchools); + +// Se l'utente non ha scuole -> vai alla select (dove vedrà le pubbliche) +if (count($userSchools) === 0) { + header('Location: select_school.php'); + exit; +} + +// Se school_id esiste ma NON appartiene all'utente -> reset +if (!empty($_SESSION['school_id']) && !in_array((int)$_SESSION['school_id'], $allowedIds, true)) { + unset($_SESSION['school_id'], $_SESSION['school_name'], $_SESSION['school_selected']); +} + +// Caso: una sola scuola -> auto-select (OK) +if (count($userSchools) === 1 && empty($_SESSION['school_id'])) { + $_SESSION['school_id'] = (int)$userSchools[0]['id']; + $_SESSION['school_name'] = $userSchools[0]['name']; + $_SESSION['school_selected'] = 1; +} + +// Caso: più scuole -> OBBLIGO selezione esplicita +if (count($userSchools) > 1) { + if (empty($_SESSION['school_id']) || empty($_SESSION['school_selected'])) { + header('Location: select_school.php'); + exit; + } +} + + // === DATI UTENTE === $stmt = $pdo->prepare("SELECT first_name, last_name, email, avatar FROM auth_users WHERE id = ?"); $stmt->execute([$iduserlogin]); @@ -16,7 +100,14 @@ $user = $stmt->fetch(); $avatar = $user['avatar'] ? '../upload/users/' . $user['avatar'] : '../assets/images/default-avatar.png'; // === SCUOLA CORRENTE === -$school_id = session('school_id'); +$school_id = (int)($_SESSION['school_id'] ?? 0); + +if ($school_id <= 0) { + header('Location: select_school.php'); + exit; +} + + $school_name = 'Nessuna scuola selezionata'; $school_logo_path = null; // niente default @@ -286,14 +377,55 @@ $active_orders = count(array_filter($orders, fn($o) => $o['status'] === 'complet
    - diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index 73c1f07..1e76972 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -34,13 +34,11 @@
    - + value="{{ $school_slug ?? '' }}"> +