yogibook_aury_new/public/userpanel.php
2025-10-02 13:51:33 +02:00

777 lines
31 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php require_once('include/headscript.php'); ?>
<?php // require_once('Connections/bkngstm.php');
?>
<?php // require_once('webassist/mysqli/rsobj.php');
?>
<?php // require_once('webassist/mysqli/queryobj.php');
?>
<?php // optionquery
$optionquery = new WA_MySQLi_RS("optionquery", $bkngstm, 0);
$optionquery->setQuery("SELECT * FROM option");
$optionquery->execute();
?>
<?php
$bookedclass = new WA_MySQLi_RS("bookedclass", $bkngstm, 0);
// 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");
}
$currentDate = date("Y-m-d");
// Modifica: Se la data odierna è dopo l'inizio del mese corrente, imposta la data odierna come inizio
if ($currentDate > $currentMonthStart) {
$currentMonthStart = $currentDate;
}
$currentMonthEnd = date("Y-m-t", strtotime($currentMonthStart));
echo $currentMonthEnd;
$bookedclass->setQuery("SELECT * FROM bookingclass
LEFT JOIN service ON bookingclass.idservice = service.idservice
LEFT JOIN serviceschedule ON bookingclass.idserviceschedule = serviceschedule.idserviceschedule
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();
?>
<?php
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connessione fallita: " . $conn->connect_error);
}
// ID dell'utente per il quale vuoi filtrare gli ordini
$userid = $iduserlogin;
// Query per ottenere la somma dei ticket per ogni ordine dell'utente
$query = "SELECT iduser, idorderbook, SUM(nticket) as total_tickets
FROM orderbook
WHERE iduser = $userid
GROUP BY iduser";
$result = $conn->query($query);
if (!$result) {
die("Query fallita: " . $conn->error);
}
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$idOrdine = $row["idorderbook"];
$totalTickets = $row["total_tickets"];
}
} else {
$totalTickets = 0; // Imposta a zero se non ci sono righe nella query
}
$conn->close();
?>
<?php //check tickets
// Connessione al database
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connessione al database fallita: " . $conn->connect_error);
}
// ID dell'utente per il quale si desidera eseguire la query
$iduser = $iduserlogin; // Sostituisci con l'ID utente desiderato
// Data e ora attuali
$currentDateTime = date("Y-m-d H:i:s");
// Query per contare i record con data e ora passate e future
$query = "SELECT COUNT(*) AS total,
SUM(CASE WHEN serviceschedule.dateschedule <= '$currentDateTime' AND bookingclass.status = 'booked' AND bookingclass.lostlesson = 'N' THEN 1 ELSE 0 END) AS passed,
SUM(CASE WHEN serviceschedule.dateschedule > '$currentDateTime' AND bookingclass.status = 'booked' AND bookingclass.lostlesson = 'N' THEN 1 ELSE 0 END) AS future,
SUM(CASE WHEN bookingclass.lostlesson = 'Y' THEN 1 ELSE 0 END) AS lost,
SUM(CASE WHEN bookingclass.status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM bookingclass
LEFT JOIN serviceschedule ON bookingclass.idserviceschedule = serviceschedule.idserviceschedule
WHERE bookingclass.iduser = $iduser";
$result = $conn->query($query);
if ($result) {
$row = $result->fetch_assoc();
$totalRecords = $row['total'];
$passedRecords = $row['passed'];
$futureRecords = $row['future'];
$lost = $row['lost'];
$pending = $row['pending'];
}
// Chiusura della connessione
$conn->close();
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>YogiBook - Prenotazioni YogaSoul</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta content="YogiBook - Prenotazione facile YogaSOul" name="description" />
<meta content="Advanced Creative Solutions" name="author" />
<!-- App favicon -->
<link rel="shortcut icon" href="assets/images/favicon.ico">
<!-- Bootstrap Css -->
<link href="assets/css/bootstrap.min.css" id="bootstrap-style" rel="stylesheet" type="text/css" />
<!-- Icons Css -->
<link href="assets/css/icons.min.css" rel="stylesheet" type="text/css" />
<!-- App Css-->
<link href="assets/css/app.min.css" id="app-style" rel="stylesheet" type="text/css" />
<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>
<style>
.custom-card {
margin: 10px auto;
display: flex;
width: 90%;
max-width: 700px;
background-color: white;
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
border-radius: 8px;
overflow: hidden;
cursor: pointer;
transition: transform 0.2s;
}
.custom-card:hover {
transform: translateY(-5px);
}
.custom-date-box {
flex: 1;
background-color: red;
color: white;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 0;
font-size: 60px;
font-weight: bold;
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
}
.custom-day {
line-height: 1;
}
.custom-month {
font-size: 28px;
}
.custom-event-details {
flex: 2;
display: flex;
flex-direction: column;
padding: 10px 20px;
background-color: lightblue;
}
.custom-heading {
margin-top: 0;
font-size: 24px;
}
.custom-paragraph {
margin-bottom: 5px;
}
.custom-actions {
display: none;
flex-direction: row;
justify-content: space-between;
margin-top: 10px;
}
.custom-card.expanded .custom-actions {
display: flex;
}
.custom-action-button {
background-color: #f0f0f0;
border: none;
padding: 8px 12px;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.2s;
}
.custom-action-button:hover {
background-color: #e0e0e0;
}
@media (max-width: 768px) {
.custom-card {
flex-direction: column;
}
.custom-date-box,
.custom-event-details {
width: 100%;
border-radius: 0;
}
.custom-event-time {
font-size: 24px;
}
}
</style>
<style>
.month-navigation {
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 20px;
}
.month-nav-button {
background: none;
border: none;
font-size: 24px;
cursor: pointer;
}
.current-month {
font-size: 24px;
margin: 0 20px;
}
.card {
width: 100%;
}
</style>
<script>
function confirmDelete(id, idservice, deletePageUrl) {
Swal.fire({
title: "Sei sicuro?",
text: "Questa prenotazione verrà cancellata e ti verrà richiesto di programmare la lezione!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#d33",
cancelButtonColor: "#3085d6",
confirmButtonText: "Sì, riprogramma!",
cancelButtonText: "Annulla"
}).then((result) => {
if (result.isConfirmed) {
// Reindirizza direttamente alla pagina di cancellazione con l'ID e l'ID del servizio come parametri.
window.location.href = `${deletePageUrl}?id=${id}&idserviceordered=${idservice}`;
}
});
}
</script>
<style>
.pastel-color {
border: 1px solid #D1C4CC;
padding: 0px;
text-align: center;
border-radius: 10px;
margin-right: 20px;
/* Spazio tra i box */
font-size: 18px;
}
.pastel-color.acquistate {
background-color: #E2C4FB;
/* Azzurro pastello */
}
.pastel-color.praticate {
background-color: #C4E1FB;
/* Verde pastello */
}
.pastel-color.prenotate {
background-color: #CDFBC4;
/* Rosa pastello */
}
.pastel-color.conferma {
background-color: #FBFAC4;
/* Arancio pastello */
}
.pastel-color.programmare {
background-color: #FBE4C4;
/* Arancio pastello */
}
.pastel-color.perse {
background-color: #FBC7C4;
/* Arancio pastello */
}
}
@media (max-width: 768px) {
.pastel-color {
margin-right: 0;
/* Rimuovi lo spazio tra i box */
margin-bottom: 20px;
/* Spazio tra i box */
}
}
</style>
<body>
<!-- <body data-layout="horizontal"> -->
<!-- Begin page -->
<div id="layout-wrapper">
<!-- Top Bar -->
<header id="page-topbar" class="isvertical-topbar">
<div class="navbar-header">
<div class="d-flex">
<!-- LOGO -->
<?php include('include/logoarea.php'); ?>
<button type="button" class="btn btn-sm px-3 font-size-24 header-item waves-effect vertical-menu-btn">
<i class="bx bx-menu align-middle"></i>
</button>
<!-- start page title -->
<div class="page-title-box align-self-center d-none d-md-block">
<h4 class="page-title mb-0">Prenotazione Classi</h4>
</div>
<!-- end page title -->
</div>
<div class="d-flex">
<?php include('include/languageselection.php'); ?>
<!-- /searh on topbar
<div class="dropdown d-inline-block">
<button type="button" class="btn header-item noti-icon"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="bx bx-search icon-sm align-middle"></i>
</button>
<div class="dropdown-menu dropdown-menu-lg dropdown-menu-end p-0">
<form class="p-2">
<div class="search-box">
<div class="position-relative">
<input type="text" class="form-control rounded bg-light border-0" placeholder="Search...">
<i class="bx bx-search search-icon"></i>
</div>
</div>
</form>
</div>
</div> -->
<?php include('include/profiletopbar.php'); ?>
</div>
</div>
</header>
<?php include('include/sidebar.php'); ?>
<header class="ishorizontal-topbar">
<div class="navbar-header">
<div class="d-flex">
</div>
</div>
<div class="topnav">
<div class="container-fluid">
<nav class="navbar navbar-light navbar-expand-lg topnav-menu">
</nav>
</div>
</div>
</header>
<!-- ============================================================== -->
<!-- Start right Content here -->
<!-- ============================================================== -->
<div class="main-content">
<div class="page-content">
<div class="container-fluid">
<div class="row">
<div class="col-xl-12">
<div class="card">
<div class="card-body">
<h5>Benvenuta/o </h5>
<p>Di seguito puoi vedere lo stato delle tue prenotazioni</p>
<?php
$toprogram = $totalTickets - $passedRecords - $futureRecords - $pending - $lost;
?>
<div class="row">
<div class="col-md-2">
<div class="card pastel-color acquistate">
<div class="card-body">
<h5 style="font-size: 0.9em;">Lezioni acquistate</h5>
<p><?php echo $totalTickets; ?></p>
</div>
</div>
</div>
<div class="col-md-2">
<div class="card pastel-color praticate">
<div class="card-body">
<h5 style="font-size: 0.9em;">Praticate</h5>
<p><?php echo $passedRecords; ?></p>
</div>
</div>
</div>
<div class="col-md-2">
<div class="card pastel-color prenotate">
<div class="card-body">
<h5 style="font-size: 0.9em;">Prenotate</h5>
<p><?php echo $futureRecords; ?></p>
</div>
</div>
</div>
<div class="col-md-2">
<div class="card pastel-color conferma">
<div class="card-body">
<h5 style="font-size: 0.9em;">Da confermare</h5>
<p><?php echo $pending; ?></p>
</div>
</div>
</div>
<div class="col-md-2">
<div class="card pastel-color programmare">
<div class="card-body">
<h5 style="font-size: 0.9em;">Da programmare</h5>
<p><?php echo $toprogram; ?></p>
</div>
</div>
</div>
<div class="col-md-2">
<div class="card pastel-color perse">
<div class="card-body">
<h5 style="font-size: 0.9em;">Perse</h5>
<p><?php echo $lost; ?></p>
</div>
</div>
</div>
</div>
<div class="alert alert-warning alert-dismissible fade show" role="alert" style="text-align: center;">
<i class="mdi mdi-alert-outline me-2"></i>
Car* Yogi, ti ricordiamo che il pacchetto 4 lezioni ha validità entro le 5 settimane dall'acquisto e il pacchetto da 12 lezioni entro il <strong>20 dicembre 2025</strong> 🙏
</div>
</div>
</div>
</div>
</div>
</div>
<!-- container-fluid -->
</div>
<?php if (isset($_GET['reprogram'])) { ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<i class="mdi mdi-check-all me-2"></i>
Richiesta di riprogrammazione inviata con successo!
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php } ?>
<div class="container-fluid">
<div class="row">
<div class="col-xl-12">
<div class="card">
<div class="card-body">
<div class="">
<div class="row mb-2">
<div class="col-xl-3 col-md-12">
<div class="pb-3 pb-xl-0">
<form class="email-search">
<div class="position-relative">
<h3>Lezioni Programmate</h3>
</div>
</form>
</div>
</div>
<div class="col-xl-9 col-md-12">
<div class="text-sm-end">
<?php if ($toprogram > 0) { ?>
<a href="selectorder.php">
<button type="button" class="btn btn-primary btn-rounded waves-effect waves-light mb-2 me-2" data-bs-toggle="modal" data-bs-target=".create-task">
<i class="mdi mdi-plus me-1"></i> Programma lezioni rimanenti
</button>
</a>
<?php } ?>
<a href="https://yogasoul.it/shop-completo/">
<button type="button" class="btn btn-success btn-rounded waves-effect waves-light mb-2 me-2" data-bs-toggle="modal" data-bs-target=".create-task">
<i class="mdi mdi-plus me-1"></i> Acquista Pacchetto Lezioni
</button>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- container-fluid -->
<div class="container-fluid">
<!-- starts cards -->
<!-- Aggiungi le frecce per la navigazione tra i mesi -->
<?php
$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"
];
?>
<div class="month-navigation">
<a href="?prev_month=<?php echo date('Y-m', strtotime('-1 month', strtotime($currentMonthStart))); ?>" class="arrow-link">
<i class="fas fa-chevron-left fa-2x"></i>
</a>
<h2><?php echo $italianMonths[date("F", strtotime($currentMonthStart))] . ' ' . date("Y", strtotime($currentMonthStart)); ?></h2>
<a href="?next_month=<?php echo date('Y-m', strtotime('+1 month', strtotime($currentMonthStart))); ?>" class="arrow-link">
<i class="fas fa-chevron-right fa-2x"></i>
</a>
</div>
<div class="row">
<div class="col-xl-12">
<div class="card">
<div class="card-body">
<?php
$wa_startindex = 0;
if ($bookedclass->TotalRows == 0) {
echo "<p>Prenotazioni non presenti per questo mese</p>";
} else {
while (!$bookedclass->atEnd()) {
$wa_startindex = $bookedclass->Index;
?>
<?php
// Data dalla variabile $bookedclass->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];
?>
<?php
// Data dalla variabile $bookedclass->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);
?>
<div class="custom-card" onclick="toggleCard(this)">
<div class="custom-date-box" style="background-color:#1ebf73">
<div class="custom-day"><?php echo $dayInItalian; ?></div>
<div class="custom-month"><?php echo $monthInItalian; ?></div>
</div>
<div class="custom-event-details" style="background-color:<?php echo ($bookedclass->getColumnVal("colorclass")); ?>">
<h2 class="custom-heading"><?php echo ($bookedclass->getColumnVal("servicename")); ?></h2>
<p class="custom-paragraph">Quando: <?php echo $newDateFormat; ?></p>
<p class="custom-paragraph">Luogo: via Valassina 62/B Seregno - Sala Contesto Yoga</p>
<div class="custom-actions">
<button class="custom-action-button" onclick="addToCalendar(this)" data-eventname="<?php echo ($bookedclass->getColumnVal("servicename")); ?>" data-eventdate="<?php echo $newDateFormat; ?>">
<i class="far fa-calendar-plus"></i> Cal
</button>
<!-- <button class="custom-action-button"><i class="fas fa-edit"></i> Riprogramma</button> -->
<?php $idbookingclass = $bookedclass->getColumnVal("idbookingclass");
$idservice = $bookedclass->getColumnVal("idservice");
?>
<?php if ($canBeDeleted) : ?>
<button class="custom-action-button" onclick="confirmDelete(<?php echo $idbookingclass; ?>, <?php echo $idservice; ?>, 'bookingpanel.php')">
<i class="fas fa-calendar-alt"></i> Riprogramma
</button>
<?php else : ?>
<button class="custom-action-button"> <i class="fas fa-exclamation-circle"></i> Non puoi riprogrammare</button>
<?php endif; ?>
</div>
</div>
</div>
<?php
$bookedclass->moveNext();
}
}
$bookedclass->moveFirst(); // Ritorna all'inizio del recordset
unset($wa_startindex);
unset($wa_repeatcount);
?>
</div>
</div>
</div>
</div><br><br>
<!-- Aggiungi altre card qui con le stesse classi -->
<script>
function toggleCard(card) {
card.classList.toggle("expanded");
}
</script>
</div>
</div>
<!-- End Page-content -->
<?php include('include/footer.php'); ?>
</div>
<!-- end main content-->
</div>
<!-- END layout-wrapper -->
<!-- JAVASCRIPT -->
<script>
function addToCalendar(button) {
const eventName = button.getAttribute('data-eventname');
const eventDate = button.getAttribute('data-eventdate');
// Qui dovresti implementare la logica per aggiungere l'evento al calendario.
// Puoi gestire l'aggiunta sia a Google Calendar che a Outlook.
// Esempio: Aggiunta a Google Calendar (il link potrebbe variare)
const googleCalendarLink = `https://www.google.com/calendar/render?action=TEMPLATE&text=${encodeURIComponent(eventName)}&dates=${encodeURIComponent(eventDate)}`;
window.open(googleCalendarLink, '_blank');
// Esempio: Aggiunta a Outlook (il link potrebbe variare)
const outlookCalendarLink = `webcal://outlook.live.com/calendar/0/deeplink/compose?path=/calendar/action/compose&subject=${encodeURIComponent(eventName)}&startdt=${encodeURIComponent(eventDate)}`;
window.open(outlookCalendarLink, '_blank');
}
</script>
<script src="assets/libs/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="assets/libs/metismenujs/metismenujs.min.js"></script>
<script src="assets/libs/simplebar/simplebar.min.js"></script>
<script src="assets/libs/eva-icons/eva.min.js"></script>
<script src="assets/js/app.js"></script>
</body>
</html>