Erreur.

"; exit; } $stmt = $pdo->prepare(" 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 WHERE h.id = ? "); $stmt->execute([$id]); $holiday = $stmt->fetch(PDO::FETCH_ASSOC); $stmtItems = $pdo->prepare("SELECT * FROM pf_holidays_items WHERE holiday_id = ? ORDER BY id ASC"); $stmtItems->execute([$id]); $items = $stmtItems->fetchAll(PDO::FETCH_ASSOC); // Récupération des favoris géographiques $stmtFav = $pdo->query("SELECT content FROM pf_notes WHERE note_type = 'holiday_favorites'"); $favorites = json_decode($stmtFav->fetchColumn() ?: '[]', true); // GROUPEMENT PAR LIEU (Pour la carte et l'affichage) $steps = []; $generalItems = []; foreach ($items as $it) { if (!empty($it['location_name'])) { $loc = $it['location_name']; if (!isset($steps[$loc])) { $steps[$loc] = [ 'location_name' => $loc, 'lat' => (float)$it['lat'], 'lng' => (float)$it['lng'], 'total_amount' => 0, 'items' => [] ]; } $steps[$loc]['items'][] = $it; $steps[$loc]['total_amount'] += (float)$it['amount']; } else { $generalItems[] = $it; } } $mapPoints = array_values($steps); // Calculs d'affichage (Dates & Finances) $dateDisplay = htmlspecialchars($holiday['period_hint'] ?? ''); if (empty($dateDisplay) && $holiday['start_date']) { $dateDisplay = date('d/m/Y', strtotime($holiday['start_date'])); if ($holiday['end_date']) $dateDisplay .= ' → ' . date('d/m/Y', strtotime($holiday['end_date'])); } $cost = (float)$holiday['total_cost']; $paid = (float)$holiday['total_paid']; $saved = (float)$holiday['total_saved']; $leftToPay = max(0, $cost - $paid); $pctPaid = $cost > 0 ? min(100, ($paid / $cost) * 100) : 0; $pctSaved = $cost > 0 ? min(100 - $pctPaid, ($saved / $cost) * 100) : 0; ?>
Période
Budget Food & Extras
🍔 € | 🎁
Coût Total Estimé
✓ Payé : 💼 Provisionné : ⏳ Reste à payer :

🗺️ Itinéraire & Checkpoints

📝 Détail des étapes

Aucune étape planifiée.

📍
Total Étape :
'🚗', 'accommodation' => '🏨', 'activity' => '🎫', default => '🏷️' }; ?>
Point de passage (Aucune dépense)

Notes du voyage :

📍 Placer une étape