diff --git a/public/userarea/cancel_booking.php b/public/userarea/cancel_booking.php new file mode 100644 index 0000000..88df63c --- /dev/null +++ b/public/userarea/cancel_booking.php @@ -0,0 +1,51 @@ + false, 'message' => 'Non autorizzato']); + exit; +} + +$dbHandler = DBHandlerSelect::getInstance(); +$pdo = $dbHandler->getConnection(); + +$booking_id = (int)($_POST['booking_id'] ?? 0); +$user_id = (int)$_SESSION['iduserlogin']; + +if ($booking_id <= 0) { + echo json_encode(['success' => false, 'message' => 'ID prenotazione non valido']); + exit; +} + +// Verifica che la prenotazione appartenga all'utente e sia cancellabile +$stmt = $pdo->prepare(" + SELECT sb.id + FROM session_bookings sb + JOIN class_sessions cs ON sb.session_id = cs.id + WHERE sb.id = ? + AND sb.user_id = ? + AND sb.status = 'booked' + AND cs.session_date > DATE_ADD(NOW(), INTERVAL 24 HOUR) +"); +$stmt->execute([$booking_id, $user_id]); +if (!$stmt->fetch()) { + echo json_encode(['success' => false, 'message' => 'Prenotazione non trovata, non tua, già annullata o non più cancellabile (entro 24 ore)']); + exit; +} + +// Aggiorna status a 'cancelled' +$stmt = $pdo->prepare(" + UPDATE session_bookings + SET status = 'cancelled', + updated_at = CURRENT_TIMESTAMP + WHERE id = ? +"); +$success = $stmt->execute([$booking_id]); + +echo json_encode([ + 'success' => $success, + 'message' => $success ? 'Prenotazione annullata con successo' : 'Errore durante l\'aggiornamento' +]); diff --git a/public/userarea/certificate/2-1768570828-Coordinate_bancarie_tascabili_CAI_20260115110218.pdf b/public/userarea/certificate/2-1768570828-Coordinate_bancarie_tascabili_CAI_20260115110218.pdf new file mode 100644 index 0000000..31552d2 Binary files /dev/null and b/public/userarea/certificate/2-1768570828-Coordinate_bancarie_tascabili_CAI_20260115110218.pdf differ diff --git a/public/userarea/certificate/2-1768570849-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf b/public/userarea/certificate/2-1768570849-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf new file mode 100644 index 0000000..51dd137 Binary files /dev/null and b/public/userarea/certificate/2-1768570849-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf differ diff --git a/public/userarea/certificate/2-1768570933-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf b/public/userarea/certificate/2-1768570933-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf new file mode 100644 index 0000000..51dd137 Binary files /dev/null and b/public/userarea/certificate/2-1768570933-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf differ diff --git a/public/userarea/certificate/2-1768571003-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf b/public/userarea/certificate/2-1768571003-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf new file mode 100644 index 0000000..51dd137 Binary files /dev/null and b/public/userarea/certificate/2-1768571003-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf differ diff --git a/public/userarea/certificate/2-1768571467-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf b/public/userarea/certificate/2-1768571467-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf new file mode 100644 index 0000000..51dd137 Binary files /dev/null and b/public/userarea/certificate/2-1768571467-CONTRATTO_CONTO_DEPOSITO_5_Novembre_2024.pdf differ diff --git a/public/userarea/my_certificates.php b/public/userarea/my_certificates.php index 8d6bd01..7ff3cf4 100644 --- a/public/userarea/my_certificates.php +++ b/public/userarea/my_certificates.php @@ -50,10 +50,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['certificate']) && $_ (user_id, filename, stored_path, document_name, expiry_date, notes, uploaded_at) VALUES (?, ?, ?, ?, ?, ?, NOW()) "); + $stmt->execute([ $iduserlogin, $file['name'], - 'certificate/' . $new_filename, + 'userarea/certificate/' . $new_filename, // ← solo questo $document_name, $expiry_date, $notes @@ -151,6 +152,21 @@ $user = $stmt->fetch(); .file-link:hover { color: #0056b3; } + + /* Riga rosa tenue per scaduti */ + tr.expired-row { + background-color: #ffebee !important; + /* rosa molto chiaro / rosso tenue */ + } + + /* Badge scaduto */ + .badge-expired { + background-color: #dc3545; + color: white; + font-size: 0.8rem; + padding: 0.4em 0.8em; + border-radius: 50px; + } @@ -238,10 +254,11 @@ $user = $stmt->fetch(); - + @@ -252,7 +269,9 @@ $user = $stmt->fetch(); - SCADUTO' : '' ?> + + SCADUTO + 100 ? '...' : '') : '—' ?> diff --git a/public/userarea/my_lessons.php b/public/userarea/my_lessons.php index 895dc99..4f05d4d 100644 --- a/public/userarea/my_lessons.php +++ b/public/userarea/my_lessons.php @@ -46,12 +46,26 @@ $stmt = $pdo->prepare(" JOIN orders o ON sb.order_id = o.id WHERE sb.user_id = ? AND cs.school_id = ? + AND sb.status = 'booked' AND cs.session_date >= ? AND cs.session_date < ? ORDER BY cs.session_date ASC, cs.start_time ASC "); $stmt->execute([$iduserlogin, $school_id, $startOfMonth, $endOfMonth]); $bookings = $stmt->fetchAll(); + +// === CONTROLLA CERTIFICATI VALIDI === +$stmt_cert = $pdo->prepare(" + SELECT COUNT(*) AS valid_count + FROM user_medical_certificates + WHERE user_id = ? + AND expiry_date IS NOT NULL + AND expiry_date >= CURDATE() + AND is_valid = 1 +"); +$stmt_cert->execute([$iduserlogin]); +$cert_result = $stmt_cert->fetch(PDO::FETCH_ASSOC); +$has_valid_cert = ($cert_result['valid_count'] > 0); ?> @@ -207,7 +221,16 @@ $bookings = $stmt->fetchAll();
- + + +
@@ -264,7 +287,7 @@ $bookings = $stmt->fetchAll(); -
@@ -288,29 +311,52 @@ $bookings = $stmt->fetchAll(); diff --git a/public/userarea/remove_school.php b/public/userarea/remove_school.php new file mode 100644 index 0000000..3636348 --- /dev/null +++ b/public/userarea/remove_school.php @@ -0,0 +1,59 @@ + false, 'message' => 'Non autorizzato']); + exit; +} + +$dbHandler = DBHandlerSelect::getInstance(); +$pdo = $dbHandler->getConnection(); + +$school_id = (int)($_POST['school_id'] ?? 0); +$user_id = (int)$_SESSION['iduserlogin']; + +if ($school_id <= 0) { + echo json_encode(['success' => false, 'message' => 'Scuola non valida']); + exit; +} + +// Verifica iscrizione attiva +$stmt = $pdo->prepare(" + SELECT id FROM user_schools + WHERE user_id = ? AND school_id = ? AND status = 'active' +"); +$stmt->execute([$user_id, $school_id]); +if (!$stmt->fetch()) { + echo json_encode(['success' => false, 'message' => 'Non sei iscritto a questa scuola']); + exit; +} + +// Soft-delete: imposta status = 'inactive' +$stmt = $pdo->prepare(" + UPDATE user_schools + SET status = 'inactive', updated_at = CURRENT_TIMESTAMP + WHERE user_id = ? AND school_id = ? +"); +$stmt->execute([$user_id, $school_id]); + +// Opzionale: resetta scuola corrente in sessione +if (isset($_SESSION['school_id']) && $_SESSION['school_id'] == $school_id) { + unset($_SESSION['school_id'], $_SESSION['school_name'], $_SESSION['school_selected']); +} + +// (Opzionale) cancella dati associati - commenta se NON vuoi eliminare +// Esempio cancellazione prenotazioni: +$pdo->prepare(" + DELETE sb FROM session_bookings sb + JOIN class_sessions cs ON sb.session_id = cs.id + WHERE sb.user_id = ? AND cs.school_id = ? +")->execute([$user_id, $school_id]); + +// Esempio cancellazione ordini: +$pdo->prepare("DELETE FROM orders WHERE user_id = ? AND school_id = ?") + ->execute([$user_id, $school_id]); + +echo json_encode(['success' => true]); diff --git a/public/userarea/user_dashboard.php b/public/userarea/user_dashboard.php index 80eb319..e63a275 100644 --- a/public/userarea/user_dashboard.php +++ b/public/userarea/user_dashboard.php @@ -126,8 +126,18 @@ if ($school_id) { if ($school) { $school_name = $school['name']; - if (!empty($school['logo']) && file_exists("photoschool/" . $school['logo'])) { - $school_logo_path = "photoschool/" . $school['logo']; + $logoRaw = trim($school['logo'] ?? ''); + if (!empty($logoRaw)) { + // Percorso fisico per verificare esistenza + $physicalPath = __DIR__ . '/../' . $logoRaw; // da userarea/ sale a public/ + photoschool/... + + if (file_exists($physicalPath)) { + // Percorso web corretto (root-relative) + $school_logo_path = '/' . $logoRaw; + } else { + // Debug: scrivi nel log se il file non esiste + error_log("LOGO SCUOLA NON TROVATO - school_id: $school_id | path fisico: $physicalPath"); + } } } } @@ -147,6 +157,54 @@ $stmt = $pdo->prepare(" $stmt->execute([$iduserlogin, $school_id]); $orders = $stmt->fetchAll(); +// 1. Lezioni acquistate totali (somma total_entries da ordini completati) +$stmt_total_lessons = $pdo->prepare(" + SELECT COALESCE(SUM(total_entries), 0) AS total_lessons + FROM orders + WHERE user_id = ? AND school_id = ? AND status = 'completed' +"); +$stmt_total_lessons->execute([$iduserlogin, $school_id]); +$total_lessons = $stmt_total_lessons->fetchColumn() ?: 0; + +// 2. Lezioni da praticare (booked + data futura) +$stmt_to_practice = $pdo->prepare(" + SELECT COUNT(sb.id) AS to_practice + FROM session_bookings sb + JOIN class_sessions cs ON sb.session_id = cs.id + WHERE sb.user_id = ? + AND cs.school_id = ? + AND sb.status = 'booked' + AND cs.session_date >= CURDATE() +"); +$stmt_to_practice->execute([$iduserlogin, $school_id]); +$to_practice = $stmt_to_practice->fetchColumn() ?: 0; + +// 3. Lezioni perse (missed + data passata) +$stmt_missed = $pdo->prepare(" + SELECT COUNT(sb.id) AS missed + FROM session_bookings sb + JOIN class_sessions cs ON sb.session_id = cs.id + WHERE sb.user_id = ? + AND cs.school_id = ? + AND sb.status = 'missed' + AND cs.session_date < CURDATE() +"); +$stmt_missed->execute([$iduserlogin, $school_id]); +$missed = $stmt_missed->fetchColumn() ?: 0; + +// === CONTROLLA CERTIFICATI VALIDI === +$stmt_cert = $pdo->prepare(" + SELECT COUNT(*) AS valid_count + FROM user_medical_certificates + WHERE user_id = ? + AND expiry_date IS NOT NULL + AND expiry_date >= CURDATE() + AND is_valid = 1 +"); +$stmt_cert->execute([$iduserlogin]); +$cert_result = $stmt_cert->fetch(PDO::FETCH_ASSOC); +$has_valid_cert = ($cert_result['valid_count'] > 0); + // === STATISTICHE RAPIDE === $total_spent = array_sum(array_column($orders, 'price')); $total_entries = array_sum(array_column($orders, 'total_entries')); @@ -228,8 +286,9 @@ $active_orders = count(array_filter($orders, fn($o) => $o['status'] === 'complet
- - + Logo <?php echo htmlspecialchars($school_name); ?> @@ -256,42 +315,53 @@ $active_orders = count(array_filter($orders, fn($o) => $o['status'] === 'complet
- + + + +
-
-
-
- Avatar -
-

+ +
+
+
+

+

Lezioni acquistate totali

-
-
-
-
-
-

-

Ordini totali

-
-
+ + +
+
+
+

+

Lezioni da praticare

-
-
-
-

-

Speso in totale

-
-
+
+
+ + +
+
+
+

+

Lezioni perse

-
-
-
-

-

Ingressi disponibili

-
-
+
+
+ + +
+
+
+

Prossimamente...

@@ -370,6 +440,18 @@ $active_orders = count(array_filter($orders, fn($o) => $o['status'] === 'complet
+ + +
+ + + Rimuovimi da questa scuola + +

+ (azione irreversibile: perderai lezioni, crediti e storico associato) +

+
@@ -377,6 +459,57 @@ $active_orders = count(array_filter($orders, fn($o) => $o['status'] === 'complet
+ +