diff --git a/public/cancella-prenotazione.php b/public/cancella-prenotazione.php index 2980324..9f76704 100644 --- a/public/cancella-prenotazione.php +++ b/public/cancella-prenotazione.php @@ -1,5 +1,5 @@ connect_error) { die("Connessione al database fallita: " . $conn->connect_error); } +// Inizializza log +$logFile = 'cancella_prenotazione_log.txt'; +$logMessage = "Esecuzione cancellazione: " . date('Y-m-d H:i:s') . "\n"; + // Recupera parametri GET: idbookingclass e token -if (isset($_GET['idbookingclass']) && isset($_GET['token'])) { - $idbookingclass = $_GET['idbookingclass']; - $token = $_GET['token']; +if (!isset($_GET['idbookingclass']) || !isset($_GET['token'])) { + $logMessage .= "Parametri mancanti: idbookingclass o token\n"; + file_put_contents($logFile, $logMessage, FILE_APPEND); + echo "

Cancellazione non possibile

"; + echo "

Parametri mancanti.

"; + echo "Torna al portale"; + $conn->close(); + exit; +} - // Verifica validità: token corrisponde, lezione futura e prima delle 12:00 del giorno - $query = "SELECT * FROM bookingclass - WHERE idbookingclass = ? - AND cancellation_token = ? - AND status = 'booked' - AND bookingstart > NOW() - AND NOW() <= DATE_ADD(DATE(bookingstart), INTERVAL 12 HOUR)"; - $stmt = $conn->prepare($query); +// Sanitizza idbookingclass +$idbookingclass = filter_var($_GET['idbookingclass'], FILTER_VALIDATE_INT); +$token = $_GET['token']; - if ($stmt) { - $stmt->bind_param("is", $idbookingclass, $token); - $stmt->execute(); - $result = $stmt->get_result(); +if (!$idbookingclass) { + $logMessage .= "Errore: idbookingclass non valido: " . $_GET['idbookingclass'] . "\n"; + file_put_contents($logFile, $logMessage, FILE_APPEND); + echo "

Cancellazione non possibile

"; + echo "

Parametro idbookingclass non valido.

"; + echo "Torna al portale"; + $conn->close(); + exit; +} - if ($result->num_rows > 0) { - $row = $result->fetch_assoc(); - $bookingstart = $row['bookingstart']; - $newtimeformat = date("d-m-Y H:i", strtotime($bookingstart)); +// Verifica validità: token corrisponde, lezione futura +$query = "SELECT bc.*, ob.expireon, au.email, au.first_name, s.servicename + FROM bookingclass bc + LEFT JOIN orderbook ob ON bc.idorder = ob.order_id + LEFT JOIN auth_users au ON bc.iduser = au.id + LEFT JOIN service s ON bc.idservice = s.idservice + WHERE bc.idbookingclass = ? + AND bc.cancellation_token = ? + AND bc.status = 'booked' + AND bc.bookingstart > NOW()"; +$stmt = $conn->prepare($query); - // Aggiorna status a 'cancelled' e invalida token - $updateQuery = "UPDATE bookingclass - SET status = 'cancelled', cancellation_token = NULL - WHERE idbookingclass = ?"; - $updateStmt = $conn->prepare($updateQuery); - $updateStmt->bind_param("i", $idbookingclass); - $updateStmt->execute(); +if (!$stmt) { + $logMessage .= "Errore preparazione query per ID $idbookingclass: " . $conn->error . "\n"; + file_put_contents($logFile, $logMessage, FILE_APPEND); + echo "

Cancellazione non possibile

"; + echo "

Errore nella preparazione della query.

"; + echo "Torna al portale"; + $conn->close(); + exit; +} - // Recupera dati utente e servizio - $dataQuery = "SELECT bookingclass.*, auth_users.*, service.* - FROM bookingclass - LEFT JOIN auth_users ON bookingclass.iduser = auth_users.id - LEFT JOIN service ON bookingclass.idservice = service.idservice - WHERE bookingclass.idbookingclass = ?"; - $dataStmt = $conn->prepare($dataQuery); - $dataStmt->bind_param("i", $idbookingclass); - $dataStmt->execute(); - $dataResult = $dataStmt->get_result(); - $dataRow = $dataResult->fetch_assoc(); +$stmt->bind_param("is", $idbookingclass, $token); +$stmt->execute(); +$result = $stmt->get_result(); - $emailuser = $dataRow['email']; - $firstname = $dataRow['first_name'] ?? 'Utente'; +if ($result->num_rows === 0) { + $checkQuery = "SELECT * FROM bookingclass + WHERE idbookingclass = ? + AND cancellation_token = ? + AND status = 'booked' + AND bookingstart > NOW()"; + $checkStmt = $conn->prepare($checkQuery); + $checkStmt->bind_param("is", $idbookingclass, $token); + $checkStmt->execute(); + $checkResult = $checkStmt->get_result(); - // Prepara messaggio email - $messagecancel = "

Ciao $firstname ,

-

La tua lezione è stata cancellata con successo!

-

Dettaglio: $newtimeformat

-
-

Per vedere e gestire le tue lezioni clicca qui: https://yogibook.yogasoul.it

-
+ if ($checkResult->num_rows > 0) { + $row = $checkResult->fetch_assoc(); + $bookingstart = $row['bookingstart']; + $lessonTime = new DateTime($bookingstart); + $hour = (int)$lessonTime->format('H'); + $minute = (int)$lessonTime->format('i'); + $isBefore1700 = ($hour < 17) || ($hour === 17 && $minute === 0); + $logMessage .= "Tentativo di cancellazione fallito per ID $idbookingclass: orario oltre il limite (" . ($isBefore1700 ? "00:01" : "12:00") . ")\n"; + echo "

Cancellazione non possibile

"; + echo "

Non è possibile cancellare la lezione dopo le " . ($isBefore1700 ? "00:01" : "12:00") . " del giorno della lezione.

"; + echo "Torna al portale"; + } else { + $logMessage .= "Tentativo di cancellazione fallito per ID $idbookingclass: link non valido o lezione non prenotata\n"; + echo "

Cancellazione non possibile

"; + echo "

Il link non è valido o la lezione non è prenotata.

"; + echo "Torna al portale"; + } + file_put_contents($logFile, $logMessage, FILE_APPEND); + $checkStmt->close(); + $stmt->close(); + $conn->close(); + exit; +} + +$row = $result->fetch_assoc(); +$bookingstart = $row['bookingstart']; +$newtimeformat = date("d-m-Y H:i", strtotime($bookingstart)); +$expireon = $row['expireon'] ? date("d-m-Y", strtotime($row['expireon'])) : "sconosciuta"; +$emailuser = $row['email']; +$firstname = $row['first_name'] ?? 'Utente'; +$servicename = $row['servicename'] ?? 'Sconosciuta'; +$iduser = $row['iduser']; +$idservice = $row['idservice']; +$idorderbook = $row['idorder']; + +// Verifica il limite di cancellazione +$lessonTime = new DateTime($bookingstart); +$hour = (int)$lessonTime->format('H'); +$minute = (int)$lessonTime->format('i'); +$isBefore1700 = ($hour < 17) || ($hour === 17 && $minute === 0); +$currentTime = new DateTime(); +$lessonDate = $lessonTime->format('Y-m-d'); + +if ($isBefore1700) { + $deadline = new DateTime("$lessonDate 00:01:00"); +} else { + $deadline = new DateTime("$lessonDate 12:00:00"); +} + +if ($currentTime > $deadline) { + $logMessage .= "Tentativo di cancellazione fallito per ID $idbookingclass: orario oltre il limite (" . $deadline->format('Y-m-d H:i:s') . ")\n"; + file_put_contents($logFile, $logMessage, FILE_APPEND); + echo "

Cancellazione non possibile

"; + echo "

Non è possibile cancellare la lezione dopo le " . ($isBefore1700 ? "00:01" : "12:00") . " del giorno della lezione.

"; + echo "Torna al portale"; + $stmt->close(); + $conn->close(); + exit; +} + +// Gestisci azione di cancellazione +if (isset($_GET['action']) && $_GET['action'] === 'cancel') { + $updateQuery = "UPDATE bookingclass + SET status = 'cancelled' + WHERE idbookingclass = ? AND cancellation_token = ?"; + $updateStmt = $conn->prepare($updateQuery); + $updateStmt->bind_param("is", $idbookingclass, $token); + $updateStmt->execute(); + + if (!filter_var($emailuser, FILTER_VALIDATE_EMAIL)) { + $logMessage .= "Email non valida per ID $idbookingclass: $emailuser\n"; + file_put_contents($logFile, $logMessage, FILE_APPEND); + echo "

Cancellazione confermata

"; + echo "

La lezione del $newtimeformat è stata cancellata con successo, ma non è stato possibile inviare l'email di conferma.

"; + echo "

Ricordati di riprenotare entro la scadenza del tuo abbonamento ($expireon).

"; + echo "Torna al portale"; + $stmt->close(); + $conn->close(); + exit; + } + + $cancellationDeadline = $isBefore1700 ? "00:01" : "12:00"; + $messagecancel = "

Ciao $firstname,

+

La tua lezione ($servicename) del $newtimeformat è stata cancellata con successo!

+

Hai cancellato la lezione entro il limite delle $cancellationDeadline del giorno della lezione.

+

Ricordati di riprenotare entro la scadenza del tuo abbonamento ($expireon).

+

Per vedere e gestire le tue lezioni clicca qui: YogiBook

Ci vediamo sul tappetino!

Il Team Yogasoul

"; - // Definisci $messageedit per il template - $messageedit = $messagecancel; - - // Definisci $buttonedit (pulsante generico) - $buttonedit = " + $messageedit = $messagecancel; + $buttonedit = " YogiBook - YogaSoul "; - require 'phpmailer/src/Exception.php'; - require 'phpmailer/src/PHPMailer.php'; - require 'phpmailer/src/SMTP.php'; + require_once 'phpmailer/src/Exception.php'; + require_once 'phpmailer/src/PHPMailer.php'; + require_once 'phpmailer/src/SMTP.php'; - $mail = new PHPMailer(true); - try { - $mail->isSMTP(); - $mail->Host = 'mail.yogasoul.it'; - $mail->SMTPAuth = true; - $mail->Username = 'info@yogasoul.it'; - $mail->Password = '!Testolina88'; - $mail->SMTPSecure = 'tls'; - $mail->Port = 587; + $mail = new PHPMailer(true); + try { + $mail->isSMTP(); + $mail->Host = 'mail.yogasoul.it'; + $mail->SMTPAuth = true; + $mail->Username = 'info@yogasoul.it'; + $mail->Password = '!Testolina88'; + $mail->SMTPSecure = 'tls'; + $mail->Port = 587; - // Verifica esistenza file template - if (!file_exists('mail/emailtemplate2.php')) { - throw new Exception("File emailtemplate2.php non trovato."); - } - include('mail/emailtemplate2.php'); - - // Verifica che $mailmessage1 esista - if (!isset($mailmessage1)) { - throw new Exception("Variabile \$mailmessage1 non definita in emailtemplate2.php."); - } - - // Sostituisci placeholder (per compatibilità) - $htmlContent = str_replace('{message}', $messagecancel, $mailmessage1); - - $mail->From = 'info@yogasoul.it'; - $mail->FromName = 'YogiBook [YogaSoul]'; - $mail->addAddress($emailuser); - $mail->Subject = "YogiBook - Lezione cancellata con successo!"; - $mail->Body = $htmlContent; - $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; - - $mail->send(); - - // Mostra landing di conferma - echo "

Cancellazione confermata

"; - echo "

La lezione del $newtimeformat è stata cancellata con successo.

"; - echo "Torna al portale"; - } catch (Exception $e) { - echo "Errore invio email: " . $mail->ErrorInfo; - } - } else { - echo "Link non valido o scaduto."; + if (!file_exists('mail/emailtemplate2.php')) { + throw new Exception("File emailtemplate2.php non trovato."); } - $stmt->close(); - } else { - echo "Errore nella preparazione della query: " . $conn->error; + include('mail/emailtemplate2.php'); + + if (!isset($mailmessage1)) { + throw new Exception("Variabile \$mailmessage1 non definita in emailtemplate2.php."); + } + + $htmlContent = str_replace('{message}', $messagecancel, $mailmessage1); + + $mail->From = 'info@yogasoul.it'; + $mail->FromName = 'YogiBook [YogaSoul]'; + $mail->addAddress($emailuser); + $mail->Subject = "YogiBook - Lezione cancellata con successo!"; + $mail->Body = $htmlContent; + $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; + + $mail->send(); + $logMessage .= "Cancellazione confermata per ID $idbookingclass ($newtimeformat), email inviata a $emailuser\n"; + + echo "

Cancellazione confermata

"; + echo "

La lezione del $newtimeformat è stata cancellata con successo.

"; + echo "

Ricordati di riprenotare entro la scadenza del tuo abbonamento ($expireon).

"; + echo "Torna al portale"; + } catch (Exception $e) { + $logMessage .= "Cancellazione confermata per ID $idbookingclass ($newtimeformat), ma errore invio email a $emailuser: " . $mail->ErrorInfo . "\n"; + echo "

Cancellazione confermata

"; + echo "

La lezione del $newtimeformat è stata cancellata con successo, ma non è stato possibile inviare l'email di conferma.

"; + echo "

Ricordati di riprenotare entro la scadenza del tuo abbonamento ($expireon).

"; + echo "Torna al portale"; } -} else { - echo "Parametri mancanti."; + file_put_contents($logFile, $logMessage, FILE_APPEND); + $updateStmt->close(); + $stmt->close(); + $conn->close(); + exit; } -$conn->close(); +$logMessage .= "Accesso a modale per ID $idbookingclass, token: $token, opzione riprogrammazione: rebook-from-cancel.php?idbookingclass=$idbookingclass&token=" . urlencode($token) . "\n"; +file_put_contents($logFile, $logMessage, FILE_APPEND); +?> + + + + + YogiBook - Cancellazione Lezione + + + + + + + + +
+

Gestione Lezione

+

Lezione: del

+ +
+ + + +close(); +$conn->close(); +?> \ No newline at end of file diff --git a/public/promemoria-cron.php b/public/promemoria-cron.php index c120d85..b3c1540 100644 --- a/public/promemoria-cron.php +++ b/public/promemoria-cron.php @@ -1,5 +1,5 @@ connect_error) { @@ -21,13 +26,32 @@ $errors = []; $logFile = 'promemoria_cron_log.txt'; $logMessage = "Esecuzione cron: " . date('Y-m-d H:i:s') . "\n"; -// Seleziona prenotazioni per domani +// Genera UUID per tutti i record senza token +$updateQuery = "UPDATE bookingclass + SET cancellation_token = UUID() + WHERE status = 'booked' + AND cancellation_token IS NULL"; +$updateStmt = $conn->prepare($updateQuery); +if ($updateStmt) { + $updateStmt->execute(); + $affectedRows = $updateStmt->affected_rows; + $logMessage .= "Generati $affectedRows token UUID per prenotazioni senza token.\n"; +} else { + $errors[] = "Errore preparazione query per generazione token: " . $conn->error; + $logMessage .= "Errore generazione token: " . $conn->error . "\n"; +} + +// Seleziona prenotazioni per domani (dalle 17:00 in poi) e dopodomani (fino alle 16:59) $tomorrow = date('Y-m-d', strtotime('+1 day')); +$dayAfterTomorrow = date('Y-m-d', strtotime('+2 days')); $query = "SELECT bc.*, au.email, au.first_name, s.servicename FROM bookingclass bc LEFT JOIN auth_users au ON bc.iduser = au.id LEFT JOIN service s ON bc.idservice = s.idservice - WHERE DATE(bc.bookingstart) = ? AND bc.status = 'booked'"; + WHERE bc.status = 'booked' AND ( + (DATE(bc.bookingstart) = ? AND TIME(bc.bookingstart) >= '17:00:00') OR + (DATE(bc.bookingstart) = ? AND TIME(bc.bookingstart) <= '16:59:59') + )"; $stmt = $conn->prepare($query); if (!$stmt) { @@ -37,14 +61,14 @@ if (!$stmt) { exit; } -$stmt->bind_param("s", $tomorrow); +$stmt->bind_param("ss", $tomorrow, $dayAfterTomorrow); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows === 0) { - $logMessage .= "Nessuna prenotazione trovata per domani.\n"; + $logMessage .= "Nessuna prenotazione trovata per domani (dalle 17:00) o dopodomani (fino alle 16:59).\n"; file_put_contents($logFile, $logMessage, FILE_APPEND); - echo "Nessuna prenotazione trovata per domani.\n"; + echo "Nessuna prenotazione trovata.\n"; exit; } @@ -52,17 +76,11 @@ while ($row = $result->fetch_assoc()) { $idbookingclass = $row['idbookingclass']; $token = $row['cancellation_token']; - // Genera token se assente + // Verifica che il token esista if (empty($token)) { - $token = bin2hex(random_bytes(32)); - $updateQuery = "UPDATE bookingclass SET cancellation_token = ? WHERE idbookingclass = ?"; - $updateStmt = $conn->prepare($updateQuery); - if ($updateStmt) { - $updateStmt->bind_param("si", $token, $idbookingclass); - $updateStmt->execute(); - } else { - $errors[] = "Errore preparazione query token per ID $idbookingclass: " . $conn->error; - } + $errors[] = "Token mancante per ID $idbookingclass dopo aggiornamento UUID."; + $logMessage .= "Token mancante per ID $idbookingclass dopo aggiornamento UUID.\n"; + continue; } $firstname = $row['first_name'] ?? 'Utente'; @@ -71,6 +89,14 @@ while ($row = $result->fetch_assoc()) { $bookingstart = $row['bookingstart']; $dataformat = date("d-m-Y H:i", strtotime($bookingstart)); + // Determina il limite di cancellazione in base all'orario della lezione + $lessonTime = new DateTime($bookingstart); + $isTomorrow = $lessonTime->format('Y-m-d') === $tomorrow; + $hour = (int)$lessonTime->format('H'); + $minute = (int)$lessonTime->format('i'); + $isBefore1700 = ($hour < 17) || ($hour === 17 && $minute === 0); + $cancellationDeadline = $isBefore1700 ? "00:01" : "12:00"; + // Verifica email valida if (!filter_var($emailuser, FILTER_VALIDATE_EMAIL)) { $errors[] = "Email non valida per ID $idbookingclass: $emailuser"; @@ -83,8 +109,8 @@ while ($row = $result->fetch_assoc()) { // Messaggio email $message = "

Ciao $firstname,

-

Promemoria: domani hai la lezione $servicename del $dataformat.

-

Puoi cancellarla fino alle 12:00 cliccando qui:

+

Promemoria: hai la lezione $servicename del $dataformat.

+

Puoi cancellarla fino alle $cancellationDeadline del giorno della lezione cliccando qui:

Cancella prenotazione

Ci vediamo sul tappetino!

@@ -93,15 +119,11 @@ while ($row = $result->fetch_assoc()) { // Definisci $messageedit per il template $messageedit = $message; - // Definisci $buttonedit (vuoto o pulsante generico) + // Definisci $buttonedit $buttonedit = " YogiBook - YogaSoul "; - require 'phpmailer/src/Exception.php'; - require 'phpmailer/src/PHPMailer.php'; - require 'phpmailer/src/SMTP.php'; - $mail = new PHPMailer(true); try { $mail->isSMTP(); @@ -112,24 +134,21 @@ while ($row = $result->fetch_assoc()) { $mail->SMTPSecure = 'tls'; $mail->Port = 587; - // Verifica esistenza file template if (!file_exists('mail/emailtemplate2.php')) { throw new Exception("File emailtemplate2.php non trovato."); } include('mail/emailtemplate2.php'); - // Verifica che $mailmessage1 esista if (!isset($mailmessage1)) { throw new Exception("Variabile \$mailmessage1 non definita in emailtemplate2.php."); } - // Sostituisci placeholder (anche se non usato, per compatibilità) $htmlContent = str_replace('{message}', $message, $mailmessage1); $mail->From = 'info@yogasoul.it'; $mail->FromName = 'YogiBook [YogaSoul]'; $mail->addAddress($emailuser); - $mail->Subject = "YogiBook - Promemoria lezione domani!"; + $mail->Subject = "YogiBook - Promemoria lezione!"; $mail->Body = $htmlContent; $mail->AltBody = 'Promemoria lezione.'; @@ -141,7 +160,7 @@ while ($row = $result->fetch_assoc()) { $logMessage .= "Errore invio a $emailuser (ID $idbookingclass): " . $mail->ErrorInfo . "\n"; } - sleep(2); // Delay 2 secondi + sleep(2); } // Scrivi log diff --git a/public/rebook-from-cancel.php b/public/rebook-from-cancel.php new file mode 100644 index 0000000..f4e06a2 --- /dev/null +++ b/public/rebook-from-cancel.php @@ -0,0 +1,484 @@ +connect_error) { + die("Connessione al database fallita: " . $conn->connect_error); +} + +// Inizializza log +$logFile = 'rebook_from_cancel_log.txt'; +$logMessage = "Esecuzione riprogrammazione: " . date('Y-m-d H:i:s') . "\n"; + +// Recupera parametri GET +if (!isset($_GET['idbookingclass']) || !isset($_GET['token'])) { + $logMessage .= "Parametri mancanti: idbookingclass o token\n"; + file_put_contents($logFile, $logMessage, FILE_APPEND); + echo "

Riprogrammazione non possibile

"; + echo "

Parametri mancanti.

"; + echo "Torna al portale"; + $conn->close(); + exit; +} + +$idbookingclass = filter_var($_GET['idbookingclass'], FILTER_VALIDATE_INT); +$token = $_GET['token']; + +if (!$idbookingclass) { + $logMessage .= "Errore: idbookingclass non valido: " . $_GET['idbookingclass'] . "\n"; + file_put_contents($logFile, $logMessage, FILE_APPEND); + echo "

Riprogrammazione non possibile

"; + echo "

Parametro idbookingclass non valido.

"; + echo "Torna al portale"; + $conn->close(); + exit; +} + +// Verifica validità della prenotazione +$query = "SELECT bc.*, ob.expireon, au.email, au.first_name, s.servicename + FROM bookingclass bc + LEFT JOIN orderbook ob ON bc.idorder = ob.order_id + LEFT JOIN auth_users au ON bc.iduser = au.id + LEFT JOIN service s ON bc.idservice = s.idservice + WHERE bc.idbookingclass = ? + AND bc.cancellation_token = ? + AND bc.status = 'booked' + AND bc.bookingstart > NOW()"; +$stmt = $conn->prepare($query); + +if (!$stmt) { + $logMessage .= "Errore preparazione query per ID $idbookingclass: " . $conn->error . "\n"; + file_put_contents($logFile, $logMessage, FILE_APPEND); + echo "

Riprogrammazione non possibile

"; + echo "

Errore nella preparazione della query.

"; + echo "Torna al portale"; + $conn->close(); + exit; +} + +$stmt->bind_param("is", $idbookingclass, $token); +$stmt->execute(); +$result = $stmt->get_result(); + +if ($result->num_rows === 0) { + $logMessage .= "Tentativo di riprogrammazione fallito per ID $idbookingclass: link non valido o lezione non prenotata\n"; + file_put_contents($logFile, $logMessage, FILE_APPEND); + echo "

Riprogrammazione non possibile

"; + echo "

Il link non è valido o la lezione non è prenotata.

"; + echo "Torna al portale"; + $stmt->close(); + $conn->close(); + exit; +} + +$row = $result->fetch_assoc(); +$bookingstart = $row['bookingstart']; +$newtimeformat = date("d-m-Y H:i", strtotime($bookingstart)); +$expireon = $row['expireon'] ? date("d-m-Y", strtotime($row['expireon'])) : "sconosciuta"; +$emailuser = $row['email']; +$firstname = $row['first_name'] ?? 'Utente'; +$servicename = $row['servicename'] ?? 'Sconosciuta'; +$iduser = $row['iduser']; +$idserviceordered = $row['idservice']; +$idorder = $row['idorder']; + +// Verifica il limite di cancellazione/riprogrammazione +$lessonTime = new DateTime($bookingstart); +$hour = (int)$lessonTime->format('H'); +$minute = (int)$lessonTime->format('i'); +$isBefore1700 = ($hour < 17) || ($hour === 17 && $minute === 0); +$currentTime = new DateTime(); +$lessonDate = $lessonTime->format('Y-m-d'); + +if ($isBefore1700) { + $deadline = new DateTime("$lessonDate 00:01:00"); +} else { + $deadline = new DateTime("$lessonDate 12:00:00"); +} + +if ($currentTime > $deadline) { + $logMessage .= "Tentativo di riprogrammazione fallito per ID $idbookingclass: orario oltre il limite (" . $deadline->format('Y-m-d H:i:s') . ")\n"; + file_put_contents($logFile, $logMessage, FILE_APPEND); + echo "

Riprogrammazione non possibile

"; + echo "

Non è possibile riprogrammare la lezione dopo le " . ($isBefore1700 ? "00:01" : "12:00") . " del giorno della lezione.

"; + echo "Torna al portale"; + $stmt->close(); + $conn->close(); + exit; +} + +// Recupera la data di scadenza dell'ordine +$expiryDate = new DateTime($row['expireon']); + +// Query sulla tabella associateclass +$sql = "SELECT idassociateservice FROM associateclass WHERE idmainservice = ?"; +$stmt = $conn->prepare($sql); +$stmt->bind_param("i", $idserviceordered); +$stmt->execute(); +$result = $stmt->get_result(); + +$idassociateservices = array(); +array_push($idassociateservices, $idserviceordered); +if ($result->num_rows > 0) { + while ($row = $result->fetch_assoc()) { + $idassociateservices[] = $row['idassociateservice']; + } +} +$stmt->close(); + +// Verifica se è stata specificata una richiesta per cambiare il mese +if (isset($_GET['prev_month'])) { + $currentMonthStart = $_GET['prev_month'] . '-01'; +} elseif (isset($_GET['next_month'])) { + $currentMonthStart = $_GET['next_month'] . '-01'; +} else { + $currentMonthStart = date("Y-m-01"); +} + +$currentMonthEnd = date("Y-m-t", strtotime($currentMonthStart)); + +// Aggiungi filtro per la data di scadenza +$expiryCondition = ''; +if ($expiryDate) { + $expiryCondition = "AND serviceschedule.dateschedule <= '{$expiryDate->format('Y-m-d 23:59:59')}'"; +} + +// Query per le lezioni disponibili +$placeholders = implode(',', array_fill(0, count($idassociateservices), '?')); +$query = "SELECT ss.*, s.servicename, s.colorclass, s.maxcapacity + FROM serviceschedule ss + LEFT JOIN service s ON ss.idservice = s.idservice + WHERE ss.dateschedule BETWEEN ? AND DATE_ADD(?, INTERVAL 1 DAY) + $expiryCondition + AND ss.idservice IN ($placeholders) + ORDER BY ss.dateschedule"; +$stmt = $conn->prepare($query); + +$types = 'ss' . str_repeat('i', count($idassociateservices)); +$params = array_merge([$currentMonthStart, $currentMonthEnd], $idassociateservices); +$stmt->bind_param($types, ...$params); +$stmt->execute(); +$bookedclass = $stmt->get_result(); + +// Mappa dei mesi in italiano +$italianMonths = [ + "January" => "Gennaio", + "February" => "Febbraio", + "March" => "Marzo", + "April" => "Aprile", + "May" => "Maggio", + "June" => "Giugno", + "July" => "Luglio", + "August" => "Agosto", + "September" => "Settembre", + "October" => "Ottobre", + "November" => "Novembre", + "December" => "Dicembre" +]; + +$logMessage .= "Caricata pagina di riprogrammazione per ID $idbookingclass, mese: $currentMonthStart\n"; +file_put_contents($logFile, $logMessage, FILE_APPEND); +?> + + + + + + YogiBook - Riprogramma Lezione + + + + + + + + + + + + + +
+
+ +
+ +
+
+
+
+
+
+
+

Riprogrammazione Lezione

+

Lezione attuale: del

+

Scadenza abbonamento:

+
+
+
+
+
+ + + +

+ + + +
+ num_rows == 0): ?> +

Classi non presenti per questo mese o oltre la data di scadenza.

+ Torna al portale + + fetch_assoc()): ?> + format("d"); + $monthInItalian = $italianMonths[$dateObj->format("F")]; + $newDateFormat = $dateObj->format("d-m-Y H:i"); + + $eventId = $row['idserviceschedule']; + $bookingQuery = "SELECT iduser FROM bookingclass WHERE idserviceschedule = ? AND status='booked'"; + $stmtBooking = $conn->prepare($bookingQuery); + $stmtBooking->bind_param("i", $eventId); + $stmtBooking->execute(); + $bookingResult = $stmtBooking->get_result(); + $countPersons = $bookingResult->num_rows; + $stmtBooking->close(); + + $maxcapacity = $row['maxcapacity']; + $freeplace = $maxcapacity - $countPersons; + + $idcheckservice = $row['idserviceschedule']; + $query = "SELECT * FROM bookingclass WHERE idserviceschedule = ? AND iduser = ?"; + $stmtCheck = $conn->prepare($query); + $stmtCheck->bind_param("ii", $idcheckservice, $iduser); + $stmtCheck->execute(); + $resultcheck = $stmtCheck->get_result(); + $alreadybooked = $resultcheck->num_rows > 0 ? 'Y' : 'N'; + $stmtCheck->close(); + ?> +
+ +
+ 0): ?> +
+ +
+ +
+
+
+ +
+ 0): ?> +
+ +
+ +

- /

+

Quando:

+

Luogo: via Valassina 62/B Seregno - Sala Contesto Yoga

+
+ + + 0): ?> + + + + + + +
+
+
+ + +
+ + + +

+ + + +
+
+
+ +
+
+ + + + + + + + + +close(); +$conn->close(); +?> \ No newline at end of file diff --git a/public/userpanel.php b/public/userpanel.php index f67ee1f..f51f05b 100644 --- a/public/userpanel.php +++ b/public/userpanel.php @@ -11,7 +11,6 @@ $optionquery->setQuery("SELECT * FROM option"); $optionquery->execute(); ?> setQuery("SELECT * FROM bookingclass WHERE bookingclass.iduser = '$iduserlogin' AND bookingclass.status = 'booked' AND serviceschedule.dateschedule BETWEEN '$currentMonthStart' AND DATE_ADD('$currentMonthEnd', INTERVAL 1 DAY) ORDER BY serviceschedule.dateschedule"); $bookedclass->execute(); - ?> connect_error) { @@ -98,10 +95,6 @@ $query = "SELECT COUNT(*) AS total, LEFT JOIN serviceschedule ON bookingclass.idserviceschedule = serviceschedule.idserviceschedule WHERE bookingclass.iduser = $iduser"; - - - - $result = $conn->query($query); if ($result) { $row = $result->fetch_assoc(); @@ -119,7 +112,6 @@ $conn->close(); - YogiBook - Prenotazioni YogaSoul @@ -214,7 +206,6 @@ $conn->close(); border-radius: 4px; cursor: pointer; transition: background-color 0.2s; - } .custom-action-button:hover { @@ -261,6 +252,48 @@ $conn->close(); width: 100%; } + + - - - - - - - -
- -
-
- -
-
- +
+
+
+ +
- - -
- -
Benvenuta/o

Di seguito puoi vedere lo stato delle tue prenotazioni

- @@ -486,292 +408,193 @@ $conn->close();
-
- - -
- - - - -
- -
- - - -
- -
-
-
-
- -
-
-
-
- -
-
- - -
-
- - -
-
+ + - - - - - -
- +
- - - - - - "Gennaio", - "February" => "Febbraio", - "March" => "Marzo", - "April" => "Aprile", - "May" => "Maggio", - "June" => "Giugno", - "July" => "Luglio", - "August" => "Agosto", - "September" => "Settembre", - "October" => "Ottobre", - "November" => "Novembre", - "December" => "Dicembre" - ]; - - ?> -
- - - -

- - - -
- -
- - - TotalRows == 0) { - echo "

Prenotazioni non presenti per questo mese

"; - } else { - while (!$bookedclass->atEnd()) { - $wa_startindex = $bookedclass->Index; - ?> - getColumnVal("dateschedule") - $dateschedule = $bookedclass->getColumnVal("dateschedule"); - - // Converti la data in un oggetto DateTime - $dateObj = new DateTime($dateschedule); - - // Estrai il giorno e il mese in italiano - $dayInItalian = $dateObj->format("d"); - $monthInItalian = $dateObj->format("F"); - - // Mappa dei nomi dei mesi in italiano - $italianMonths = [ - "January" => "Gennaio", - "February" => "Febbraio", - "March" => "Marzo", - "April" => "Aprile", - "May" => "Maggio", - "June" => "Giugno", - "July" => "Luglio", - "August" => "Agosto", - "September" => "Settembre", - "October" => "Ottobre", - "November" => "Novembre", - "December" => "Dicembre" - ]; - - // Sostituisci il nome del mese con la versione italiana - $monthInItalian = $italianMonths[$monthInItalian]; - ?> - getColumnVal("dateschedule") - $dateschedule = $bookedclass->getColumnVal("dateschedule"); - - // Converti la data in un oggetto DateTime - $dateObj = new DateTime($dateschedule); - - // Formatta la data nel nuovo formato desiderato - $newDateFormat = $dateObj->format("d-m-Y H:i"); - - // Calculate the time difference in hours - $currentTime = new DateTime(); - $classTime = new DateTime($dateschedule); - $timeDifference = $classTime->diff($currentTime); - $hoursDifference = $timeDifference->h + $timeDifference->days * 24; - - // Check if the time difference is less than 6 hours - $timetocancel = $optionquery->getColumnVal("maxbeforetimecancell"); - $canBeDeleted = ($hoursDifference > $timetocancel); - - ?> - - - -
-
-
-
-
-
"> -

getColumnVal("servicename")); ?>

-

Quando:

-

Luogo: via Valassina 62/B Seregno - Sala Contesto Yoga

-
- - - - getColumnVal("idbookingclass"); - $idservice = $bookedclass->getColumnVal("idservice"); - ?> - - - - - - - - - -
+
+
+
+
+
- - moveNext(); - } - } - - $bookedclass->moveFirst(); // Ritorna all'inizio del recordset - unset($wa_startindex); - unset($wa_repeatcount); - ?> + +
+
-


- +
+
+
+ "Gennaio", + "February" => "Febbraio", + "March" => "Marzo", + "April" => "Aprile", + "May" => "Maggio", + "June" => "Giugno", + "July" => "Luglio", + "August" => "Agosto", + "September" => "Settembre", + "October" => "Ottobre", + "November" => "Novembre", + "December" => "Dicembre" + ]; + ?> + + + +

+ + + +
+
+
+
+
+ TotalRows == 0) { + echo "

Prenotazioni non presenti per questo mese

"; + } else { + while (!$bookedclass->atEnd()) { + $wa_startindex = $bookedclass->Index; + $dateschedule = $bookedclass->getColumnVal("dateschedule"); + $dateObj = new DateTime($dateschedule); + $dayInItalian = $dateObj->format("d"); + $monthInItalian = $dateObj->format("F"); + $monthInItalian = $italianMonths[$monthInItalian]; + $newDateFormat = $dateObj->format("d-m-Y H:i"); - - + // Calcola se la lezione può essere riprogrammata + $currentTime = new DateTime(); + $classTime = new DateTime($dateschedule); + $isSameDay = $classTime->format('Y-m-d') === $currentTime->format('Y-m-d'); + $classHour = (int)$classTime->format('H'); + $classMinute = (int)$classTime->format('i'); + $isBefore1700 = ($classHour < 17) || ($classHour === 17 && $classMinute === 0); + // Definisci il limite per la riprogrammazione + if ($isSameDay) { + if ($isBefore1700) { + // Lezioni prima delle 17:00: cancellazione valida fino alle 00:01 dello stesso giorno + $deadline = new DateTime($classTime->format('Y-m-d 00:01:00')); + } else { + // Lezioni alle 17:00 o dopo: cancellazione valida fino alle 12:00 dello stesso giorno + $deadline = new DateTime($classTime->format('Y-m-d 12:00:00')); + } + $canBeDeleted = $currentTime <= $deadline; + } else { + // Per lezioni in giorni futuri, la riprogrammazione è sempre consentita + $canBeDeleted = true; + } + ?> +
+
+
+
+
+
"> +

getColumnVal("servicename")); ?>

+

Quando:

+

Luogo: via Valassina 62/B Seregno - Sala Contesto Yoga

+
+ + getColumnVal("idbookingclass"); ?> + getColumnVal("idservice"); ?> + + + + + +
+
+
+ moveNext(); + } + } + $bookedclass->moveFirst(); + unset($wa_startindex); + unset($wa_repeatcount); + ?> +
+
+
+


+
+ +
- - -
- -
- + - - - - - - - - - - - - - - - - - - + + + + + \ No newline at end of file