query("SELECT DISTINCT YEAR(start_date) as yr FROM pf_holidays WHERE start_date IS NOT NULL ORDER BY yr DESC"); $availableYears = $yearStmt->fetchAll(PDO::FETCH_COLUMN); if (!in_array(date('Y'), $availableYears)) { $availableYears[] = date('Y'); rsort($availableYears); // Trie par ordre décroissant } // Construction de la condition de filtrage SQL $whereSQL = ""; $params = []; if ($selectedYear !== 'all') { // On affiche les voyages de l'année OU les voyages sans date (pour ne pas perdre les brouillons) $whereSQL = "WHERE YEAR(h.start_date) = ? OR h.start_date IS NULL"; $params[] = $selectedYear; } // 2. Récupération des voyages + Calculs $sql = " SELECT h.*, ( COALESCE(h.budget_food, 0) + COALESCE(h.budget_extra, 0) + COALESCE((SELECT SUM(amount) FROM pf_holidays_items WHERE holiday_id = h.id), 0) ) as total_cost, (SELECT COALESCE(SUM(ABS(amount)), 0) FROM pf_expenses WHERE holiday_id = h.id) as total_paid, (SELECT COALESCE(SUM(amount), 0) FROM pf_savings WHERE holiday_id = h.id) as total_saved FROM pf_holidays h $whereSQL ORDER BY COALESCE(start_date, '2999-12-31') ASC, FIELD(status, 'booked', 'planned', 'draft', 'passed', 'archived') "; $stmt = $pdo->prepare($sql); $stmt->execute($params); $holidays = $stmt->fetchAll(PDO::FETCH_ASSOC); // 3. Tri par statut $active = array_filter($holidays, fn($h) => in_array($h['status'], ['draft', 'planned', 'booked'])); $history = array_filter($holidays, fn($h) => in_array($h['status'], ['passed', 'archived'])); // 4. Calcul du Reste à Payer Global (uniquement sur les voyages Actifs affichés) $globalLeftToPay = 0; foreach ($active as $h) { $cost = (float)$h['total_cost']; $paid = (float)$h['total_paid']; $globalLeftToPay += max(0, $cost - $paid); } ?>
Aucun voyage en cours pour cette période. Planifions quelque chose !