diff --git a/public/cancellazioni.php b/public/cancellazioni.php index 4050c24..6237eba 100644 --- a/public/cancellazioni.php +++ b/public/cancellazioni.php @@ -256,6 +256,8 @@ foreach ($rows as $r) { Omaggio + + Limite superato: lezione persa Sì (/) diff --git a/public/delete_lesson.php b/public/delete_lesson.php index 2361c5a..5e7e9f9 100644 --- a/public/delete_lesson.php +++ b/public/delete_lesson.php @@ -117,6 +117,7 @@ if ($classTime->format('Y-m-d') === $currentTime->format('Y-m-d')) { $idOrder = $bk['idorder'] !== null ? (int) $bk['idorder'] : null; $ord = null; $incremented = 'N'; +$ticketLost = false; try { $conn->begin_transaction(); @@ -132,9 +133,11 @@ try { if ($ord) { if ((int) $ord['reprogrammed'] >= (int) $ord['maxreschedule']) { - throw new RuntimeException('limit'); + // Limite raggiunto: può cancellare (libera il posto) ma il ticket va perso + $ticketLost = true; + } else { + $incremented = 'Y'; } - $incremented = 'Y'; } } @@ -150,7 +153,8 @@ try { FROM bookingclass WHERE idbookingclass = ? AND iduser = ? "); - $stmt->bind_param("isii", $userId, $incremented, $id, $userId); + $storicoFlag = $ticketLost ? 'L' : $incremented; + $stmt->bind_param("isii", $userId, $storicoFlag, $id, $userId); $stmt->execute(); $copied = $stmt->affected_rows; $stmt->close(); @@ -166,8 +170,14 @@ try { $stmt->close(); } - // Eliminazione della prenotazione - $stmt = $conn->prepare("DELETE FROM bookingclass WHERE idbookingclass = ? AND iduser = ?"); + // Limite raggiunto: la prenotazione resta come persa (status 'lost'), + // il posto in sala si libera ma il ticket non torna da programmare. + // Altrimenti eliminazione normale: il ticket torna disponibile. + if ($ticketLost) { + $stmt = $conn->prepare("UPDATE bookingclass SET status = 'lost', lostlesson = 'Y' WHERE idbookingclass = ? AND iduser = ?"); + } else { + $stmt = $conn->prepare("DELETE FROM bookingclass WHERE idbookingclass = ? AND iduser = ?"); + } $stmt->bind_param("ii", $id, $userId); $stmt->execute(); $deleted = $stmt->affected_rows; @@ -245,7 +255,8 @@ try { $mail->Body = "

Ciao " . htmlspecialchars($userName ?: 'Yogi') . ",

-

La tua lezione è stata cancellata.

+

La tua lezione è stata cancellata.

" . ($ticketLost ? " +

Avendo già usato tutte le riprogrammazioni del pacchetto, questa lezione non potrà essere recuperata.

" : "") . "

Lezione: " . htmlspecialchars($className) . "
Data/ora prevista: " . htmlspecialchars($classDateTxt) . "
@@ -265,5 +276,5 @@ try { } // Redirect -header("Location: userpanel.php?deleted=1"); +header("Location: userpanel.php?deleted=" . ($ticketLost ? 'lost' : '1')); exit(); diff --git a/public/logs/mail_cancel.log b/public/logs/mail_cancel.log index 6d6f3b8..f889b66 100644 --- a/public/logs/mail_cancel.log +++ b/public/logs/mail_cancel.log @@ -4,3 +4,7 @@ [2026-10-14 08:44:30] OK inviata. booking_id=70 user_id=2 to=info@claudiosironi.com lezione='Aerial Yoga - base' prevista='21-10-2026 18:30' cancellata='14-10-2026 08:44' [2026-10-14 08:46:52] SMTP in uso host=mail.yogasoul.it porta=465 enc=ssl user=info@yogasoul.it [2026-10-14 08:46:54] OK inviata. booking_id=60 user_id=2 to=info@claudiosironi.com lezione='Aerial Yoga - base' prevista='29-10-2026 20:15' cancellata='14-10-2026 08:46' +[2026-10-14 13:46:38] SMTP in uso host=mail.yogasoul.it porta=465 enc=ssl user=info@yogasoul.it +[2026-10-14 13:46:39] OK inviata. booking_id=58 user_id=2 to=info@claudiosironi.com lezione='Aerial Yoga - base' prevista='15-10-2026 20:15' cancellata='14-10-2026 13:46' +[2026-10-14 13:55:35] SMTP in uso host=mail.yogasoul.it porta=465 enc=ssl user=info@yogasoul.it +[2026-10-14 13:55:35] OK inviata. booking_id=71 user_id=2 to=info@claudiosironi.com lezione='Aerial Yoga - base' prevista='22-10-2026 20:15' cancellata='14-10-2026 13:55' diff --git a/public/situationusers.php b/public/situationusers.php index bdc3288..0173687 100644 --- a/public/situationusers.php +++ b/public/situationusers.php @@ -26,10 +26,10 @@ SELECT MAX(cert.ultima_scadenza) AS ultima_scadenza_cert, MAX(CASE WHEN cert.ultima_scadenza IS NULL OR cert.ultima_scadenza < CURDATE() THEN 1 ELSE 0 END) AS certificato_scaduto, COUNT(CASE WHEN bookingclass.bookingstart <= CURDATE() AND bookingclass.lostlesson = 'N' THEN 1 END) AS lezioni_praticate, - COUNT(CASE WHEN bookingclass.bookingstart > CURDATE() THEN 1 END) AS lezioni_programmate, + COUNT(CASE WHEN bookingclass.bookingstart > CURDATE() AND bookingclass.lostlesson = 'N' THEN 1 END)AS lezioni_programmate, COUNT(CASE WHEN bookingclass.lostlesson = 'Y' THEN 1 END) AS lezioni_perse, COALESCE(orderbook_lessons.lezioni_acquistate, 0) - - COUNT(CASE WHEN bookingclass.bookingstart > CURDATE() THEN 1 END) + - COUNT(CASE WHEN bookingclass.bookingstart > CURDATE() AND bookingclass.lostlesson = 'N' THEN 1 END) - COUNT(CASE WHEN bookingclass.bookingstart <= CURDATE() AND bookingclass.lostlesson = 'N' THEN 1 END) - COUNT(CASE WHEN bookingclass.lostlesson = 'Y' THEN 1 END) AS lezioni_da_programmare FROM auth_users diff --git a/public/userpanel.php b/public/userpanel.php index 5299a68..478a248 100644 --- a/public/userpanel.php +++ b/public/userpanel.php @@ -498,20 +498,23 @@ $italianMonths = [ }); } - function confirmDeleteOnly(idbookingclass, expirydate) { + function confirmDeleteOnly(idbookingclass, expirydate, ticketLost) { + var html = ticketLost ? + `Confermi di voler cancellare questa lezione?

+ Hai già usato tutte le riprogrammazioni del tuo pacchetto.
+ Cancellando liberi il posto in sala, ma + la lezione non potrà essere recuperata. ` : + `Confermi di voler cancellare questa lezione?

+ RICORDA: dovrai riprogrammarla entro la scadenza del tuo abbonamento per non perderla!

+ La cancellazione conta come una delle riprogrammazioni disponibili per il tuo pacchetto.

+ Scadenza: ${expirydate}`; + Swal.fire({ title: "Attenzione", - html: ` - Confermi di voler cancellare questa lezione?

- RICORDA: dovrai riprogrammarla entro la scadenza del tuo abbonamento per non perderla!

- La cancellazione conta come una delle riprogrammazioni disponibili per il tuo pacchetto.

- - Scadenza: ${expirydate} - - `, + html: html, icon: "warning", showCancelButton: true, - confirmButtonText: "Procedi", + confirmButtonText: ticketLost ? "Cancella comunque" : "Procedi", cancelButtonText: "Annulla", confirmButtonColor: "#d33", cancelButtonColor: "#3085d6" @@ -667,6 +670,13 @@ $italianMonths = [

+ + +