getConnection();
// Forziamo l'id utente a intero: viene dalla sessione, ma è comunque
// buona norma non fidarsi mai e trattarlo come integer.
$iduserlogin = (int) $iduserlogin;
/* -------------------------------------------------------------------------
* 1) Calcolo del mese da visualizzare
* ---------------------------------------------------------------------- */
if (isset($_GET['prev_month'])) {
$currentMonthStart = preg_replace('/[^0-9\-]/', '', $_GET['prev_month']) . '-01';
} elseif (isset($_GET['next_month'])) {
$currentMonthStart = preg_replace('/[^0-9\-]/', '', $_GET['next_month']) . '-01';
} else {
$currentMonthStart = date("Y-m-01");
}
// Validazione: se la stringa non è una data valida, torna al mese corrente
$ts = strtotime($currentMonthStart);
if ($ts === false) {
$currentMonthStart = date("Y-m-01");
}
$currentDate = date("Y-m-d");
// Se oggi è dopo l'inizio del mese scelto, parti da oggi
if ($currentDate > $currentMonthStart) {
$currentMonthStart = $currentDate;
}
$currentMonthEnd = date("Y-m-t", strtotime($currentMonthStart));
/* -------------------------------------------------------------------------
* 2) Lezioni prenotate nel range del mese
* ---------------------------------------------------------------------- */
$sqlBooked = "SELECT bookingclass.*, service.*, serviceschedule.*, orderbook.expireon
FROM bookingclass
LEFT JOIN service ON bookingclass.idservice = service.idservice
LEFT JOIN serviceschedule ON bookingclass.idserviceschedule = serviceschedule.idserviceschedule
LEFT JOIN orderbook ON bookingclass.idorder = orderbook.idorderbook
WHERE bookingclass.iduser = :iduser
AND bookingclass.status = 'booked'
AND serviceschedule.dateschedule BETWEEN :monthStart AND DATE_ADD(:monthEnd, INTERVAL 1 DAY)
ORDER BY serviceschedule.dateschedule";
$stmtBooked = $pdo->prepare($sqlBooked);
$stmtBooked->execute([
':iduser' => $iduserlogin,
':monthStart' => $currentMonthStart,
':monthEnd' => $currentMonthEnd,
]);
$bookedRows = $stmtBooked->fetchAll();
/* -------------------------------------------------------------------------
* 3) Somma dei ticket acquistati dall'utente
* ---------------------------------------------------------------------- */
$sqlTickets = "SELECT SUM(nticket) AS total_tickets
FROM orderbook
WHERE iduser = :iduser";
$stmtTickets = $pdo->prepare($sqlTickets);
$stmtTickets->execute([':iduser' => $iduserlogin]);
$rowTickets = $stmtTickets->fetch();
$totalTickets = (int) ($rowTickets['total_tickets'] ?? 0);
/* -------------------------------------------------------------------------
* 4) Conteggio stati lezioni (praticate / future / perse / da confermare)
* ---------------------------------------------------------------------- */
$currentDateTime = date("Y-m-d H:i:s");
$sqlCounts = "SELECT
COUNT(*) AS total,
SUM(CASE WHEN serviceschedule.dateschedule <= :now1
AND bookingclass.status = 'booked'
AND bookingclass.lostlesson = 'N' THEN 1 ELSE 0 END) AS passed,
SUM(CASE WHEN serviceschedule.dateschedule > :now2
AND bookingclass.status = 'booked'
AND bookingclass.lostlesson = 'N' THEN 1 ELSE 0 END) AS future,
SUM(CASE WHEN bookingclass.lostlesson = 'Y'
AND bookingclass.status != 'cancelled' 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
AND bookingclass.status != 'cancelled'";
$stmtCounts = $pdo->prepare($sqlCounts);
$stmtCounts->execute([
':now1' => $currentDateTime,
':now2' => $currentDateTime,
':iduser' => $iduserlogin,
]);
$rowCounts = $stmtCounts->fetch();
$totalRecords = (int) ($rowCounts['total'] ?? 0);
$passedRecords = (int) ($rowCounts['passed'] ?? 0);
$futureRecords = (int) ($rowCounts['future'] ?? 0);
$lost = (int) ($rowCounts['lost'] ?? 0);
$pending = (int) ($rowCounts['pending'] ?? 0);
$toprogram = $totalTickets - $passedRecords - $futureRecords - $pending - $lost;
/* -------------------------------------------------------------------------
* 5) Pre-caricamento limiti di riprogrammazione per gli ordini coinvolti
* (una sola query invece di una per ogni card, dentro il loop)
* ---------------------------------------------------------------------- */
$reprogramInfo = [];
$orderIds = array_filter(array_unique(array_map(
fn($r) => (int) ($r['idorder'] ?? 0),
$bookedRows
)));
if (!empty($orderIds)) {
// Costruiamo i placeholder ?,?,? in numero pari agli id
$placeholders = implode(',', array_fill(0, count($orderIds), '?'));
$sqlReprog = "SELECT idorderbook, maxreschedule, reprogrammed
FROM orderbook
WHERE idorderbook IN ($placeholders)";
$stmtReprog = $pdo->prepare($sqlReprog);
$stmtReprog->execute(array_values($orderIds));
foreach ($stmtReprog->fetchAll() as $r) {
$reprogramInfo[(int) $r['idorderbook']] = [
'max' => (int) ($r['maxreschedule'] ?? 0),
'done' => (int) ($r['reprogrammed'] ?? 0),
];
}
}
/* -------------------------------------------------------------------------
* Helper output sicuro (evita XSS quando stampiamo dati DB nell'HTML)
* ---------------------------------------------------------------------- */
function e($value): string
{
return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8');
}
$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"
];
?>
YogiBook - Prenotazioni YogaSoul
Prenotazione Classi
Benvenuta/o
Di seguito puoi vedere lo stato delle tue prenotazioni
Lezioni acquistate
Praticate
Prenotate
Da confermare
Da programmare
Perse
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 20 dicembre 2025 🙏
Richiesta di riprogrammazione inviata con successo!
Lezione cancellata con successo! Grazie per aver liberato il posto!