318 lines
15 KiB
PHP
318 lines
15 KiB
PHP
<?php
|
|
// Abilita visualizzazione errori PHP (solo per debug)
|
|
ini_set('display_errors', 1);
|
|
ini_set('display_startup_errors', 1);
|
|
error_reporting(E_ALL);
|
|
|
|
use PHPMailer\PHPMailer\PHPMailer;
|
|
use PHPMailer\PHPMailer\Exception;
|
|
|
|
// Connessione al database
|
|
include('include/headscript.php');
|
|
|
|
$conn = new mysqli($servername, $username, $password, $dbname);
|
|
if ($conn->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 "<h1>Cancellazione non possibile</h1>";
|
|
echo "<p>Parametri mancanti.</p>";
|
|
echo "<a href='https://yogibook.yogasoul.it'>Torna al portale</a>";
|
|
$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 "<h1>Cancellazione non possibile</h1>";
|
|
echo "<p>Parametro idbookingclass non valido.</p>";
|
|
echo "<a href='https://yogibook.yogasoul.it'>Torna al portale</a>";
|
|
$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 "<h1>Cancellazione non possibile</h1>";
|
|
echo "<p>Errore nella preparazione della query.</p>";
|
|
echo "<a href='https://yogibook.yogasoul.it'>Torna al portale</a>";
|
|
$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 "<h1>Cancellazione non possibile</h1>";
|
|
echo "<p>Non è possibile cancellare la lezione dopo le " . ($isBefore1700 ? "00:01" : "12:00") . " del giorno della lezione.</p>";
|
|
echo "<a href='https://yogibook.yogasoul.it'>Torna al portale</a>";
|
|
} else {
|
|
$logMessage .= "Tentativo di cancellazione fallito per ID $idbookingclass: link non valido o lezione non prenotata\n";
|
|
echo "<h1>Cancellazione non possibile</h1>";
|
|
echo "<p>Il link non è valido o la lezione non è prenotata.</p>";
|
|
echo "<a href='https://yogibook.yogasoul.it'>Torna al portale</a>";
|
|
}
|
|
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 "<h1>Cancellazione non possibile</h1>";
|
|
echo "<p>Non è possibile cancellare la lezione dopo le " . ($isBefore1700 ? "00:01" : "12:00") . " del giorno della lezione.</p>";
|
|
echo "<a href='https://yogibook.yogasoul.it'>Torna al portale</a>";
|
|
$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 "<h1>Cancellazione confermata</h1>";
|
|
echo "<p>La lezione del $newtimeformat è stata cancellata con successo, ma non è stato possibile inviare l'email di conferma.</p>";
|
|
echo "<p>Ricordati di riprenotare entro la scadenza del tuo abbonamento ($expireon).</p>";
|
|
echo "<a href='https://yogibook.yogasoul.it'>Torna al portale</a>";
|
|
$stmt->close();
|
|
$conn->close();
|
|
exit;
|
|
}
|
|
|
|
$cancellationDeadline = $isBefore1700 ? "00:01" : "12:00";
|
|
$messagecancel = "<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 18px; line-height: 34.2px;'><strong>Ciao $firstname,</strong></span></p>
|
|
<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 16px; line-height: 30.4px;'>La tua lezione ($servicename) del $newtimeformat è stata cancellata con successo!</span></p>
|
|
<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 16px; line-height: 30.4px;'>Hai cancellato la lezione entro il limite delle $cancellationDeadline del giorno della lezione.</span></p>
|
|
<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 16px; line-height: 30.4px;'>Ricordati di riprenotare entro la scadenza del tuo abbonamento ($expireon).</span></p>
|
|
<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 16px; line-height: 30.4px;'>Per vedere e gestire le tue lezioni clicca qui: <a href='https://yogibook.yogasoul.it'>YogiBook</a></span></p>
|
|
<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 16px; line-height: 30.4px;'>Ci vediamo sul tappetino!</span></p>
|
|
<p style='font-size: 14px; line-height: 190%;'><span style='font-size: 16px; line-height: 30.4px;'>Il Team Yogasoul</span></p>";
|
|
|
|
$messageedit = $messagecancel;
|
|
$buttonedit = "<a href='https://yogibook.yogasoul.it/' target='_blank' class='v-button v-font-size' style='box-sizing: border-box;display: inline-block;text-decoration: none;-webkit-text-size-adjust: none;text-align: center;color: #FFFFFF; background-color: #3AAEE0; border-radius: 4px;-webkit-border-radius: 4px; -moz-border-radius: 4px; width:auto; max-width:100%; overflow-wrap: break-word; word-break: break-word; word-wrap:break-word; mso-border-alt: none;font-size: 14px;'>
|
|
<span style='display:block;padding:10px 20px;line-height:120%;'><span style='line-height: 16.8px;'>YogiBook - YogaSoul</span></span>
|
|
</a>";
|
|
|
|
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 "<h1>Cancellazione confermata</h1>";
|
|
echo "<p>La lezione del $newtimeformat è stata cancellata con successo.</p>";
|
|
echo "<p>Ricordati di riprenotare entro la scadenza del tuo abbonamento ($expireon).</p>";
|
|
echo "<a href='https://yogibook.yogasoul.it'>Torna al portale</a>";
|
|
} catch (Exception $e) {
|
|
$logMessage .= "Cancellazione confermata per ID $idbookingclass ($newtimeformat), ma errore invio email a $emailuser: " . $mail->ErrorInfo . "\n";
|
|
echo "<h1>Cancellazione confermata</h1>";
|
|
echo "<p>La lezione del $newtimeformat è stata cancellata con successo, ma non è stato possibile inviare l'email di conferma.</p>";
|
|
echo "<p>Ricordati di riprenotare entro la scadenza del tuo abbonamento ($expireon).</p>";
|
|
echo "<a href='https://yogibook.yogasoul.it'>Torna al portale</a>";
|
|
}
|
|
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);
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="it">
|
|
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<title>YogiBook - Cancellazione Lezione</title>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
|
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@10"></script>
|
|
<link href="assets/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
|
|
<style>
|
|
body {
|
|
font-family: Arial, sans-serif;
|
|
text-align: center;
|
|
padding: 20px;
|
|
}
|
|
|
|
.container {
|
|
max-width: 600px;
|
|
margin: 0 auto;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body>
|
|
<div class="container">
|
|
<h1>Gestione Lezione</h1>
|
|
<p>Lezione: <?php echo htmlspecialchars($servicename); ?> del <?php echo htmlspecialchars($newtimeformat); ?></p>
|
|
<script>
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
console.log("Modale SweetAlert2 avviato per ID <?php echo $idbookingclass; ?>, token: <?php echo urlencode($token); ?>");
|
|
Swal.fire({
|
|
title: "Cosa vuoi fare?",
|
|
html: "Puoi cancellare la lezione del <?php echo htmlspecialchars($newtimeformat); ?> o riprogrammarla.<br>Scadenza abbonamento: <?php echo htmlspecialchars($expireon); ?><br><br><strong>Debug:</strong> Reindirizzamento previsto: rebook-from-cancel.php?idbookingclass=<?php echo $idbookingclass; ?>&token=<?php echo urlencode($token); ?>",
|
|
icon: "question",
|
|
showCancelButton: true,
|
|
confirmButtonColor: "#d33",
|
|
cancelButtonColor: "#3085d6",
|
|
confirmButtonText: "Cancella Lezione",
|
|
cancelButtonText: "Riprogramma Lezione",
|
|
showDenyButton: true,
|
|
denyButtonText: "Torna al Portale",
|
|
denyButtonColor: "#6c757d"
|
|
}).then((result) => {
|
|
if (result.isConfirmed) {
|
|
console.log("Cliccato 'Cancella Lezione' per ID <?php echo $idbookingclass; ?>");
|
|
Swal.fire({
|
|
title: "Attenzione!",
|
|
text: "La lezione sarà cancellata. Ricordati di riprenotare entro la scadenza del tuo abbonamento (<?php echo htmlspecialchars($expireon); ?>)!",
|
|
icon: "warning",
|
|
confirmButtonText: "Conferma Cancellazione",
|
|
showCancelButton: true,
|
|
cancelButtonText: "Annulla"
|
|
}).then((confirmResult) => {
|
|
if (confirmResult.isConfirmed) {
|
|
console.log("Conferma cancellazione, reindirizzamento a: ?idbookingclass=<?php echo $idbookingclass; ?>&token=<?php echo urlencode($token); ?>&action=cancel");
|
|
window.location.replace("?idbookingclass=<?php echo $idbookingclass; ?>&token=<?php echo urlencode($token); ?>&action=cancel");
|
|
} else {
|
|
console.log("Cancellazione annullata");
|
|
}
|
|
});
|
|
} else if (result.isCancel) {
|
|
console.log("Cliccato 'Riprogramma Lezione' per ID <?php echo $idbookingclass; ?>, reindirizzamento a: rebook-from-cancel.php?idbookingclass=<?php echo $idbookingclass; ?>&token=<?php echo urlencode($token); ?>");
|
|
try {
|
|
window.location.replace("rebook-from-cancel.php?idbookingclass=<?php echo $idbookingclass; ?>&token=<?php echo urlencode($token); ?>");
|
|
} catch (e) {
|
|
console.error("Errore durante il reindirizzamento: ", e);
|
|
alert("Errore: impossibile reindirizzare a rebook-from-cancel.php. Controlla la console del browser.");
|
|
}
|
|
} else if (result.isDenied) {
|
|
console.log("Cliccato 'Torna al Portale', reindirizzamento a: https://yogibook.yogasoul.it");
|
|
window.location.replace("rebook-from-cancel.php?idbookingclass=<?php echo $idbookingclass; ?>&token=<?php echo urlencode($token); ?>");
|
|
}
|
|
});
|
|
});
|
|
</script>
|
|
</div>
|
|
</body>
|
|
|
|
</html>
|
|
<?php
|
|
$stmt->close();
|
|
$conn->close();
|
|
?>
|