From 2d83c9da130bc465dc35710b6760c0bd2b4036c5 Mon Sep 17 00:00:00 2001 From: Claudio Date: Fri, 5 Sep 2025 15:59:30 +0200 Subject: [PATCH] fixed orders and riprogrammazione con scadenza --- public/bookingpanel.php | 1063 +++++++++++++------------------ public/orders.php | 856 +++++++++++++++++-------- public/propagatesingleorder.php | 60 +- 3 files changed, 1046 insertions(+), 933 deletions(-) diff --git a/public/bookingpanel.php b/public/bookingpanel.php index a9b302d..ab6fc13 100644 --- a/public/bookingpanel.php +++ b/public/bookingpanel.php @@ -1,45 +1,13 @@ - - - -setQuery("SELECT * FROM option"); $optionquery->execute(); ?> -connect_error) { - die("Connessione al database fallita: " . $conn->connect_error); -} - -// ID dell'utente per cui eseguire la query -$iduser = 1; - -// Query per selezionare i valori della colonna idservice per lo specifico iduser -$sql = "SELECT idservice FROM orderbook WHERE iduser = $iduser"; -$result = $conn->query($sql); - -$idserviceordered = array(); - -if ($result->num_rows > 0) { - // Memorizza i valori della colonna idservice nell'array $idserviceordered - while ($row = $result->fetch_assoc()) { - $idserviceordered[] = $row['idservice']; - } -} else { - echo "Nessun risultato trovato."; -} - -// Chiudi la connessione al database -$conn->close(); - -// Esempio di stampa dei valori memorizzati nell'array $idserviceordered -print_r($idserviceordered); */ -?> -connect_error) { die("Connessione al database fallita: " . $conn->connect_error); } -// Prendi il valore di idservieordered dalla variabile GET +// Prendi il valore di idservieordered dalla variabile GET o POST if (isset($_GET['id'])) { $idpreviousbooking = $_GET['id']; } @@ -56,30 +24,42 @@ if (isset($_POST['idorder'])) { } if (isset($_GET['idserviceordered'])) { $idserviceordered = $_GET['idserviceordered']; -} +} if (isset($_POST['idserviceordered'])) { $idserviceordered = $_POST['idserviceordered']; - } +} +// Recupera la data di scadenza dell'ordine +$expiryQuery = "SELECT expireon FROM orderbook WHERE order_id = ?"; +$stmt = $conn->prepare($expiryQuery); +$stmt->bind_param("i", $idpreviousbooking); +$stmt->execute(); +$expiryResult = $stmt->get_result(); +$expiryDate = null; +if ($expiryResult->num_rows > 0) { + $row = $expiryResult->fetch_assoc(); + $expiryDate = new DateTime($row['expireon']); +} + +$stmt->close(); // Query sulla tabella associateclass -$sql = "SELECT idassociateservice FROM associateclass WHERE idmainservice = $idserviceordered"; -$result = $conn->query($sql); +$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) { - // Memorizza i valori della colonna idassociateservice nell'array $idassociateservices while ($row = $result->fetch_assoc()) { $idassociateservices[] = $row['idassociateservice']; } -} +} -// Chiudi la connessione al database +$stmt->close(); $conn->close(); - -// Esempio di stampa dei valori memorizzati nell'array $idassociateservices -//print_r($idassociateservices); ?> format('Y-m-d 23:59:59')}' OR serviceschedule.dateschedule = '{$expiryDate->format('Y-m-d')}')"; +} + $bookedclass->setQuery("SELECT * FROM serviceschedule LEFT JOIN service ON serviceschedule.idservice = service.idservice - WHERE serviceschedule.dateschedule BETWEEN '$currentMonthStart' AND DATE_ADD('$currentMonthEnd', INTERVAL 1 DAY) ORDER BY serviceschedule.dateschedule"); + WHERE serviceschedule.dateschedule BETWEEN '$currentMonthStart' AND DATE_ADD('$currentMonthEnd', INTERVAL 1 DAY) + $expiryCondition + ORDER BY serviceschedule.dateschedule"); $bookedclass->execute(); ?> -connect_error) { @@ -110,7 +98,7 @@ if ($conn->connect_error) { } // ID dell'utente per il quale vuoi filtrare gli ordini -$userid = 1; +$userid = 1; // Query per ottenere la somma dei ticket per ogni ordine dell'utente $query = "SELECT iduser, idorderbook, SUM(nticket) as total_tickets @@ -122,34 +110,30 @@ $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 { +} else { $totalTickets = 0; // Imposta a zero se non ci sono righe nella query } $conn->close(); ?> -connect_error) { die("Connessione al database fallita: " . $conn->connect_error); } -// ID dell'utente per il quale si desidera eseguire la query $iduser = 1; // 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' THEN 1 ELSE 0 END) AS passed, SUM(CASE WHEN serviceschedule.dateschedule > '$currentDateTime' THEN 1 ELSE 0 END) AS future @@ -163,628 +147,443 @@ if ($result) { $totalRecords = $row['total']; $passedRecords = $row['passed']; $futureRecords = $row['future']; +} - -} -// Chiusura della connessione $conn->close(); ?> - + + + YogiBook - Prenotazioni YogaSoul + + + + + + + + + - -YogiBook - Prenotazioni YogaSoul - - - - - - - - - - - - - - - - - - - - - - - - + .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; + } - -
-
- - - -
-
-
- - - +
+
+ -
- - -
- -
-
-
-
- -
-
-
-
- -
+
+
+
+
+
+
+
+
+
+
- -
-
+
+
+
0) { - echo ''; -} -?> - - -
- + echo ''; + } + ?> +
- -
- - - - - +
- - +
- - - + "Gennaio", + "February" => "Febbraio", + "March" => "Marzo", + "April" => "Aprile", + "May" => "Maggio", + "June" => "Giugno", + "July" => "Luglio", + "August" => "Agosto", + "September" => "Settembre", + "October" => "Ottobre", + "November" => "Novembre", + "December" => "Dicembre" + ]; + ?> +
+ + + +

+ + + +
- - "Gennaio", - "February" => "Febbraio", - "March" => "Marzo", - "April" => "Aprile", - "May" => "Maggio", - "June" => "Giugno", - "July" => "Luglio", - "August" => "Agosto", - "September" => "Settembre", - "October" => "Ottobre", - "November" => "Novembre", - "December" => "Dicembre" -]; + -
- - - - + if ($bookedclass->TotalRows == 0) { + echo "

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

"; + } else { + while (!$bookedclass->atEnd()) { + $wa_startindex = $bookedclass->Index; + $dateschedule = $bookedclass->getColumnVal("dateschedule"); + $dateObj = new DateTime($dateschedule); + $dayInItalian = $dateObj->format("d"); + $monthInItalian = $italianMonths[$dateObj->format("F")]; + $newDateFormat = $dateObj->format("d-m-Y H:i"); -

- - - -
+ $currentTime = new DateTime(); + $classTime = new DateTime($dateschedule); + $timeDifference = $classTime->diff($currentTime); + $hoursDifference = $timeDifference->h + $timeDifference->days * 24; + $timetocancel = $optionquery->getColumnVal("maxbeforetimecancell"); + $canBeDeleted = ($hoursDifference >= $timetocancel); - - - - -getColumnVal("idserviceschedule"); + $bookingQuery = "SELECT iduser FROM bookingclass WHERE bookingclass.idserviceschedule = ? AND bookingclass.status='booked'"; + $stmt = $mysqli->prepare($bookingQuery); + $stmt->bind_param("i", $eventId); + $stmt->execute(); + $bookingResult = $stmt->get_result(); + $countPersons = $bookingResult->num_rows; + $stmt->close(); -if ($bookedclass->TotalRows == 0) { - echo "

Classi non presenti per questo mese

"; -} else { - while (!$bookedclass->atEnd()) { - $wa_startindex = $bookedclass->Index; -?> - getColumnVal("dateschedule") -$dateschedule = $bookedclass->getColumnVal("dateschedule"); + $cardservice = $bookedclass->getColumnVal("idservice"); + if (in_array($cardservice, $idassociateservices)) { + $maxcapacity = $bookedclass->getColumnVal("maxcapacity"); + $freeplace = $maxcapacity - $countPersons; -// Converti la data in un oggetto DateTime -$dateObj = new DateTime($dateschedule); + $conn = new mysqli($servername, $username, $password, $dbname); + $idcheckservice = $bookedclass->getColumnVal("idserviceschedule"); + $iduser = $iduserlog; + $query = "SELECT * FROM bookingclass WHERE idserviceschedule = ? AND iduser = ?"; + $stmt = $conn->prepare($query); + $stmt->bind_param("ii", $idcheckservice, $iduser); + $stmt->execute(); + $resultcheck = $stmt->get_result(); + $alreadybooked = $resultcheck->num_rows > 0 ? 'Y' : 'N'; + $stmt->close(); + $conn->close(); + ?> +
+ +
+ 0) { ?> +
+ +
+ +
+
+
+ +
+ 0) { ?> +
"> + +
+ +

getColumnVal("servicename")); ?> -/getColumnVal("maxcapacity")); ?>

+

Quando:

+

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

+ getColumnVal("idserviceschedule"); ?> + getColumnVal("idservice"); ?> +
+ + + 0) { ?> + + + + +
+
+
+ moveNext(); + } + } -// Estrai il giorno e il mese in italiano -$dayInItalian = $dateObj->format("d"); -$monthInItalian = $dateObj->format("F"); + $bookedclass->moveFirst(); + unset($wa_startindex); + unset($wa_repeatcount); + ?> +
+ + + +

+ + + +
+
+
-// 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("idserviceschedule"); - $bookingQuery = "SELECT iduser FROM bookingclass - WHERE bookingclass.idserviceschedule = $eventId AND bookingclass.status='booked'"; - $bookingResult = $mysqli->query($bookingQuery); - - // Calcola il numero di persone prenotate - $countPersons = $bookingResult->num_rows; - -?> -getColumnVal("servicename") -$cardservice = $bookedclass->getColumnVal("idservice"); - -// Verifica se il valore di $cardservice è presente nell'array $idassociateservices -if (in_array($cardservice, $idassociateservices)) { - // Il valore è presente, esegui il codice successivo - - ?> - getColumnVal("maxcapacity"); - $freeplace=$maxcapacity-$countPersons; - ?> - - getColumnVal("idserviceschedule"); // Sostituisci con il tuo valore -$iduser = $iduserlog; // Sostituisci con il tuo valore - -// Query per verificare l'esistenza del record -$query = "SELECT * FROM bookingclass WHERE idserviceschedule = $idcheckservice AND iduser = $iduser"; -$resultcheck = $conn->query($query); - -if ($resultcheck->num_rows > 0) { - $alreadybooked='Y'; // record found -} else { - $alreadybooked='N'; -} - - - -?> - - -
- - - - - -
- 0) { ?>
-
-
-
-
- -
- 0) { ?> -
"> -
-

getColumnVal("servicename")); ?> -/getColumnVal("maxcapacity")); ?>

-

Quando:

-

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

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

- - - -
- - - - + +
+
-
- - -
- - -
- - - - - - - - - - - - - - - - - + + + + + + \ No newline at end of file diff --git a/public/orders.php b/public/orders.php index 62382d9..d7099af 100644 --- a/public/orders.php +++ b/public/orders.php @@ -1,6 +1,7 @@ -setQuery("SELECT * FROM option"); $optionquery->execute(); ?> @@ -8,339 +9,644 @@ $optionquery->execute(); connect_error) { - die("Connessione al database fallita: " . $conn->connect_error); - } - - // Ottieni l'ID dell'utente (da dove viene?) - $iduserlogin = $_POST["iduserlogin"]; - - - - // Chiudi la connessione al database - $conn->close(); + if (isset($_FILES["fileToUpload"]) && $_FILES["fileToUpload"]["error"] === UPLOAD_ERR_OK) { + $conn = new mysqli($servername, $username, $password, $dbname); + if ($conn->connect_error) { + die("Connessione al database fallita: " . $conn->connect_error); } + $iduserlogin = $_POST["iduserlogin"]; + $conn->close(); + } } ?> - - connect_error) { - die("Connessione al database fallita: " . $conn->connect_error); + die("Connessione al database fallita: " . $conn->connect_error); } - - // Query per selezionare i dati filtrati per iduser -$query = "SELECT * FROM orderbook LEFT JOIN service ON orderbook.idservice=service.idservice WHERE iduser = '$iduserlogin'"; +$query = "SELECT o.*, s.servicename, s.day, s.time + FROM orderbook o + LEFT JOIN service s ON o.idservice = s.idservice + WHERE o.iduser = '$iduserlogin'"; $result = $conn->query($query); -// Array per memorizzare i risultati $documents = array(); - while ($row = $result->fetch_assoc()) { - $documents[] = $row; + // Get lesson details for each order + $order_id = $row['order_id']; + $lesson_query = "SELECT bc.bookingstart, bc.status, bc.lostlesson, bc.expirylesson, s.servicename + FROM bookingclass bc + LEFT JOIN service s ON bc.idservice = s.idservice + WHERE bc.idorder = '$order_id'"; + $lesson_result = $conn->query($lesson_query); + $lessons = array(); + while ($lesson_row = $lesson_result->fetch_assoc()) { + $lessons[] = $lesson_row; + } + $row['lessons'] = $lessons; + $documents[] = $row; } - ?> + - + + + YogiBook - Prenotazioni YogaSoul + + + + + + + + + + + + + - - - - - - - - - + .custom-actions { + display: none; + flex-direction: row; + justify-content: space-between; + margin-top: 10px; + } - -
+ .custom-card.expanded .custom-actions { + display: flex; + } - -
- -
- - -
- + .custom-modal .swal2-content { + padding: 20px; + } -
-
- -
-
-
+ .custom-modal .lesson-table { + width: 100% !important; + border-collapse: collapse !important; + font-size: 13px !important; + color: #333 !important; + } - - - -
-
-
- + .custom-modal .lesson-table th { + background-color: #e9ecef !important; + padding: 10px !important; + text-align: left !important; + font-weight: 600 !important; + border-bottom: 2px solid #dee2e6 !important; + border-right: 1px solid #dee2e6 !important; + } -
-
-
-
-
Benvenuta/o
-

Di seguito puoi visualizzare i tuoi ordini

-
- - - - - - - - - - - - - - - - - - - - - -
N. OrdineData OrdineClasseN. TicketScadenza
-
+ .custom-modal .lesson-table th:last-child { + border-right: none !important; + } - -
-
-
+ .custom-modal .lesson-table td { + padding: 8px !important; + line-height: 1.2 !important; + vertical-align: middle !important; + border-bottom: 1px solid #dee2e6 !important; + border-right: 1px solid #dee2e6 !important; + text-align: left !important; + } - + .custom-modal .lesson-table td:last-child { + border-right: none !important; + } - + .custom-modal .lesson-table .even-row { + background-color: #fff !important; + } -
- -
- - - + .custom-modal .lesson-table .odd-row { + background-color: #f8f9fa !important; + } - -
- + .custom-modal .lesson-table tr:hover { + background-color: #e9ecef !important; + } + .details-btn { + margin-left: 10px; + padding: 5px 10px; + font-size: 12px; + background-color: #007bff; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + transition: background-color 0.2s; + } + + .details-btn:hover { + background-color: #0056b3; + } + + + + +
+
+ +
+ +
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+
Benvenuta/o
+

Di seguito puoi visualizzare i tuoi ordini

+
+ + + + + + + + + + + + + + + + ' + data-total='' + data-order-id='' + data-is-expired=''> + + + + + + + + + + + +
N. OrdineData OrdineClasseGiorno/OraN. TicketPrima LezioneScadenzaStato
+ + + + +
+
+
+
+
+
+
+ +
+
+ + + + + + - - - - - - - - - - - - - - - - - \ No newline at end of file + +close(); ?> \ No newline at end of file diff --git a/public/propagatesingleorder.php b/public/propagatesingleorder.php index 75730ce..dfb9800 100644 --- a/public/propagatesingleorder.php +++ b/public/propagatesingleorder.php @@ -195,44 +195,52 @@ if ($service_schedule_result->num_rows > 0) { } $stmt_schedule->close(); -// Recupera il numero di settimane da expiryparameter -$expiry_class_query = "SELECT quantityclass, first_lesson_date FROM orderbook WHERE idorderbook = ?"; -$stmt_expiry = $conn->prepare($expiry_class_query); -$stmt_expiry->bind_param("i", $order_id); -$stmt_expiry->execute(); -$expiry_class_result = $stmt_expiry->get_result(); +// Recupera il numero di lezioni da expiryparameter (ora expirylessons) +$expiry_lessons_query = "SELECT expirylessons FROM expiryparameter WHERE quantityclass = ?"; +$stmt_expiry_lessons = $conn->prepare($expiry_lessons_query); +$stmt_expiry_lessons->bind_param("i", $quantity_class); +$stmt_expiry_lessons->execute(); +$expiry_lessons_result = $stmt_expiry_lessons->get_result(); -if ($expiry_class_result && $expiry_class_result->num_rows > 0) { - $row = $expiry_class_result->fetch_assoc(); - $quantity_class = $row['quantityclass']; - $first_lesson_date = $row['first_lesson_date']; +if ($expiry_lessons_result && $expiry_lessons_result->num_rows > 0) { + $expiry_row = $expiry_lessons_result->fetch_assoc(); + $expirylessons = $expiry_row['expirylessons']; - $expiry_weeks_query = "SELECT expiryweeks FROM expiryparameter WHERE quantityclass = ?"; - $stmt_expiry_weeks = $conn->prepare($expiry_weeks_query); - $stmt_expiry_weeks->bind_param("i", $quantity_class); - $stmt_expiry_weeks->execute(); - $expiry_weeks_result = $stmt_expiry_weeks->get_result(); + // Calcola la data della expirylessons-esima lezione disponibile + $expiry_date_query = "SELECT dateschedule FROM serviceschedule WHERE idservice = ? AND dateschedule >= ? ORDER BY dateschedule LIMIT ?, 1"; + $stmt_expiry_date = $conn->prepare($expiry_date_query); + $offset = $expirylessons - 1; // Per prendere la n-esima riga (0-based offset) + $stmt_expiry_date->bind_param("isi", $service_id, $first_lesson_date, $offset); + $stmt_expiry_date->execute(); + $expiry_date_result = $stmt_expiry_date->get_result(); - if ($expiry_weeks_result && $expiry_weeks_result->num_rows > 0) { - $expiry_row = $expiry_weeks_result->fetch_assoc(); - $expiry_weeks = $expiry_row['expiryweeks']; + if ($expiry_date_result->num_rows > 0) { + $date_row = $expiry_date_result->fetch_assoc(); + $expireon = $date_row['dateschedule']; - // Aggiorna la colonna expireon in orderbook basandosi su first_lesson_date - $update_expiry_query = "UPDATE orderbook SET expireon = DATE_ADD(first_lesson_date, INTERVAL ? WEEK) WHERE idorderbook = ?"; + // Aggiorna expireon in orderbook + $update_expiry_query = "UPDATE orderbook SET expireon = ? WHERE idorderbook = ?"; $stmt_update_expiry = $conn->prepare($update_expiry_query); - $stmt_update_expiry->bind_param("ii", $expiry_weeks, $order_id); + $stmt_update_expiry->bind_param("si", $expireon, $order_id); $stmt_update_expiry->execute(); $stmt_update_expiry->close(); - echo "Aggiornata la colonna expireon per l'ordine ID: $order_id\n"; + echo "Aggiornata la colonna expireon per l'ordine ID: $order_id (scadenza alla lezione n. $expirylessons: $expireon)\n"; } else { - echo "Nessun record trovato in expiryparameter per quantityclass: $quantity_class\n"; + // Non abbastanza lezioni: imposta a NULL o gestisci come preferisci + $update_expiry_query = "UPDATE orderbook SET expireon = NULL WHERE idorderbook = ?"; + $stmt_update_expiry = $conn->prepare($update_expiry_query); + $stmt_update_expiry->bind_param("i", $order_id); + $stmt_update_expiry->execute(); + $stmt_update_expiry->close(); + + echo "Non abbastanza lezioni disponibili per calcolare la scadenza per l'ordine ID: $order_id\n"; } - $stmt_expiry_weeks->close(); + $stmt_expiry_date->close(); } else { - echo "Nessun record trovato in orderbook per l'ordine ID: $order_id\n"; + echo "Nessun record trovato in expiryparameter per quantityclass: $quantity_class\n"; } -$stmt_expiry->close(); +$stmt_expiry_lessons->close(); // Recupera il numero da expiryparameter per maxreschedule $reschedule_number_query = "SELECT reschedulenumber FROM expiryparameter WHERE quantityclass = ?";