@@ -548,7 +548,7 @@ $conn->close();
0) { ?>
">
-
+
getColumnVal("servicename")); ?> -/getColumnVal("maxcapacity")); ?>
Quando:
@@ -561,7 +561,11 @@ $conn->close();
0) { ?>
-
+ getColumnVal("waitinglist_enabled") === 'Y') { ?>
+
+
+
+
diff --git a/public/bookingpanelorder.php b/public/bookingpanelorder.php
index 4a248d0..77a9c94 100644
--- a/public/bookingpanelorder.php
+++ b/public/bookingpanelorder.php
@@ -742,7 +742,7 @@ $conn->close();
?>
-
+
diff --git a/public/deleteorder.php b/public/deleteorder.php
new file mode 100644
index 0000000..d9d34aa
--- /dev/null
+++ b/public/deleteorder.php
@@ -0,0 +1,43 @@
+connect_error) {
+ die("Connessione fallita: " . $conn->connect_error);
+}
+
+if (!isset($_GET['id']) || !is_numeric($_GET['id'])) {
+ header("Location: riepilogo.php?message=error_delete");
+ exit();
+}
+
+$idorder = (int) $_GET['id'];
+
+$conn->begin_transaction();
+
+try {
+ // 1. Cancella tutte le prenotazioni di questo ordine
+ $stmt1 = $conn->prepare("DELETE FROM bookingclass WHERE idorder = ?");
+ $stmt1->bind_param("i", $idorder);
+ $stmt1->execute();
+ $stmt1->close();
+
+ // 2. Cancella l'ordine
+ $stmt2 = $conn->prepare("DELETE FROM orderbook WHERE idorderbook = ?");
+ $stmt2->bind_param("i", $idorder);
+ $stmt2->execute();
+ $stmt2->close();
+
+ $conn->commit();
+ header("Location: riepilogo.php?message=success_delete");
+ exit();
+} catch (Exception $e) {
+ $conn->rollback();
+ header("Location: riepilogo.php?message=error_delete");
+ exit();
+}
+
+$conn->close();
diff --git a/public/include/sidebar.php b/public/include/sidebar.php
index 6d71f8e..fb428d5 100644
--- a/public/include/sidebar.php
+++ b/public/include/sidebar.php
@@ -120,6 +120,12 @@
+
+
+
+
+
+
diff --git a/public/include/waitinglist.php b/public/include/waitinglist.php
new file mode 100644
index 0000000..418feae
--- /dev/null
+++ b/public/include/waitinglist.php
@@ -0,0 +1,111 @@
+query("SELECT waitinglist_enabled FROM `option` LIMIT 1");
+ if ($res && ($row = $res->fetch_assoc())) {
+ return $row['waitinglist_enabled'] === 'Y';
+ }
+ return false;
+}
+
+/**
+ * Capienza, posti impegnati (booked + pending) e posti liberi di una classe.
+ *
+ * @return array{maxcapacity:int, occupied:int, free:int}
+ */
+function getClassOccupancy(mysqli $conn, int $idserviceschedule): array
+{
+ // Capienza (da service via serviceschedule)
+ $cap = 0;
+ $stmt = $conn->prepare(
+ "SELECT s.maxcapacity
+ FROM serviceschedule ss
+ JOIN service s ON ss.idservice = s.idservice
+ WHERE ss.idserviceschedule = ?"
+ );
+ $stmt->bind_param("i", $idserviceschedule);
+ $stmt->execute();
+ $res = $stmt->get_result();
+ if ($rowCap = $res->fetch_assoc()) {
+ $cap = (int) $rowCap['maxcapacity'];
+ }
+ $stmt->close();
+
+ // Posti impegnati: booked + pending
+ $occupied = 0;
+ $stmt = $conn->prepare(
+ "SELECT COUNT(*) AS occupied
+ FROM bookingclass
+ WHERE idserviceschedule = ?
+ AND status IN ('booked', 'pending')"
+ );
+ $stmt->bind_param("i", $idserviceschedule);
+ $stmt->execute();
+ $res = $stmt->get_result();
+ if ($rowOcc = $res->fetch_assoc()) {
+ $occupied = (int) $rowOcc['occupied'];
+ }
+ $stmt->close();
+
+ $free = $cap - $occupied;
+
+ return [
+ 'maxcapacity' => $cap,
+ 'occupied' => $occupied,
+ 'free' => $free < 0 ? 0 : $free,
+ ];
+}
+
+/**
+ * Decide lo stato di una nuova prenotazione:
+ * - 'pending' -> c'è posto (flusso normale, insegnante approva)
+ * - 'waiting' -> classe piena E waiting list attiva
+ * - 'full' -> classe piena E waiting list disattivata (NON prenotabile)
+ */
+function decideBookingStatus(mysqli $conn, int $idserviceschedule): string
+{
+ $occ = getClassOccupancy($conn, $idserviceschedule);
+
+ if ($occ['free'] > 0) {
+ return 'pending';
+ }
+
+ return isWaitingListEnabled($conn) ? 'waiting' : 'full';
+}
+
+/**
+ * Posizione (1-based) di un utente nella coda waiting di una classe.
+ * 0 se non è in coda.
+ */
+function getWaitingPosition(mysqli $conn, int $idserviceschedule, int $iduser): int
+{
+ $stmt = $conn->prepare(
+ "SELECT COUNT(*) AS pos
+ FROM bookingclass
+ WHERE idserviceschedule = ?
+ AND status = 'waiting'
+ AND created_at <= (
+ SELECT created_at FROM bookingclass
+ WHERE idserviceschedule = ? AND iduser = ? AND status = 'waiting'
+ ORDER BY created_at ASC LIMIT 1
+ )"
+ );
+ $stmt->bind_param("iii", $idserviceschedule, $idserviceschedule, $iduser);
+ $stmt->execute();
+ $res = $stmt->get_result();
+ $pos = 0;
+ if ($row = $res->fetch_assoc()) {
+ $pos = (int) $row['pos'];
+ }
+ $stmt->close();
+ return $pos;
+}
diff --git a/public/leavewaiting.php b/public/leavewaiting.php
new file mode 100644
index 0000000..0eb2c41
--- /dev/null
+++ b/public/leavewaiting.php
@@ -0,0 +1,26 @@
+connect_error) {
+ header("Location: userpanel.php");
+ exit();
+}
+
+$iduserlogin = (int) $iduserlogin;
+$idbookingclass = isset($_GET['id']) ? (int) $_GET['id'] : 0;
+
+if ($idbookingclass > 0) {
+ // Cancella solo se è una riga waiting DELL'utente loggato (sicurezza)
+ $stmt = $conn->prepare(
+ "DELETE FROM bookingclass
+ WHERE idbookingclass = ? AND iduser = ? AND status = 'waiting'"
+ );
+ $stmt->bind_param("ii", $idbookingclass, $iduserlogin);
+ $stmt->execute();
+ $stmt->close();
+}
+
+$conn->close();
+header("Location: userpanel.php?leftwaiting=Y");
+exit();
diff --git a/public/options_save.php b/public/options_save.php
new file mode 100644
index 0000000..a00e691
--- /dev/null
+++ b/public/options_save.php
@@ -0,0 +1,33 @@
+connect_error) {
+ header("Location: options.php?message=error");
+ exit();
+}
+
+// Checkbox non spuntata = nessun invio -> default 'N'
+$waitingEnabled = (isset($_POST['waitinglist_enabled']) && $_POST['waitinglist_enabled'] === 'Y') ? 'Y' : 'N';
+$maxCancel = isset($_POST['maxbeforetimecancell']) ? (string) (int) $_POST['maxbeforetimecancell'] : '0';
+
+// Aggiorna l'unico record di option (idption = 1)
+$stmt = $conn->prepare("UPDATE `option` SET waitinglist_enabled = ?, maxbeforetimecancell = ? WHERE idption = 1");
+$stmt->bind_param("ss", $waitingEnabled, $maxCancel);
+
+if ($stmt->execute()) {
+ $stmt->close();
+ $conn->close();
+ header("Location: optionsschool.php?message=success");
+ exit();
+} else {
+ $stmt->close();
+ $conn->close();
+ header("Location: optionsschool.php?message=error");
+ exit();
+}
diff --git a/public/optionsschool.php b/public/optionsschool.php
new file mode 100644
index 0000000..2c707bd
--- /dev/null
+++ b/public/optionsschool.php
@@ -0,0 +1,190 @@
+connect_error) {
+ die("Connessione fallita: " . $conn->connect_error);
+}
+
+function e($value): string
+{
+ return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
+}
+
+$message = $_GET['message'] ?? 'n';
+
+// Carica l'unico record di option
+$opt = $conn->query("SELECT * FROM `option` LIMIT 1")->fetch_assoc();
+$conn->close();
+
+$waitingEnabled = ($opt['waitinglist_enabled'] ?? 'N') === 'Y';
+$maxCancel = $opt['maxbeforetimecancell'] ?? '0';
+?>
+
+
+
+
+
+
YogiBook - Opzioni
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Impostazioni salvate con successo.
+
+
Errore durante il salvataggio.
+
+
+
+
+
+
+
Impostazioni prenotazioni
+
Configura il comportamento del sistema di prenotazione.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/ordersummary.php b/public/ordersummary.php
index 78b4085..bfa4886 100644
--- a/public/ordersummary.php
+++ b/public/ordersummary.php
@@ -172,23 +172,38 @@ if ($result_dayoff->num_rows > 0) {
});
}
- // Funzione per confermare la cancellazione
- function confirmDelete(id, deletePageUrl) {
+ // Funzione per confermare la cancellazione di un ordine e delle sue prenotazioni
+ window.confirmDeleteOrder = function(id) {
Swal.fire({
title: "Sei sicuro?",
- text: "Questa prenotazione verrà cancellata definitivamente! Ricordati poi di riprogrammare la tua lezione!",
+ text: "Verranno cancellati l'ordine e TUTTE le prenotazioni collegate a questa persona. L'azione è irreversibile!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#d33",
cancelButtonColor: "#3085d6",
- confirmButtonText: "Sì, cancella!",
+ confirmButtonText: "Sì, cancella tutto!",
cancelButtonText: "Annulla"
}).then((result) => {
if (result.isConfirmed) {
- window.location.href = `deleteclass.php?id=${id}`;
+ window.location.href = `deleteorder.php?id=${id}`;
}
});
}
+ Swal.fire({
+ title: "Sei sicuro?",
+ text: "Questa prenotazione verrà cancellata definitivamente! Ricordati poi di riprogrammare la tua lezione!",
+ icon: "warning",
+ showCancelButton: true,
+ confirmButtonColor: "#d33",
+ cancelButtonColor: "#3085d6",
+ confirmButtonText: "Sì, cancella!",
+ cancelButtonText: "Annulla"
+ }).then((result) => {
+ if (result.isConfirmed) {
+ window.location.href = `deleteclass.php?id=${id}`;
+ }
+ });
+ }
});