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'])) { $logMessage .= "Parametri mancanti: idbookingclass o token\n"; file_put_contents($logFile, $logMessage, FILE_APPEND); echo "
Parametri mancanti.
"; echo "Torna al portale"; $conn->close(); exit; } // Sanitizza idbookingclass $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 "Parametro idbookingclass non valido.
"; echo "Torna al portale"; $conn->close(); exit; } // 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); if (!$stmt) { $logMessage .= "Errore preparazione query per ID $idbookingclass: " . $conn->error . "\n"; file_put_contents($logFile, $logMessage, FILE_APPEND); 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) { $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(); 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 "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 "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 "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 "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
"; $messageedit = $messagecancel; $buttonedit = " YogiBook - YogaSoul "; 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; if (!file_exists('mail/emailtemplate2.php')) { throw new Exception("File emailtemplate2.php non trovato."); } 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 "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 "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"; } file_put_contents($logFile, $logMessage, FILE_APPEND); $updateStmt->close(); $stmt->close(); $conn->close(); exit; } $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); ?>Lezione: del