".tr('err_invalid_holiday_id')."

"; exit; } // Récupération des données du voyage $stmt = $pdo->prepare(" SELECT h.*, v.name as vehicle_name, v.consumption as vehicle_consumption, (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(amount), 0) FROM pf_holidays_items WHERE holiday_id = h.id AND is_paid = 1) as total_paid, (SELECT COALESCE(SUM(amount), 0) FROM pf_savings WHERE holiday_id = h.id) as total_saved, (SELECT COALESCE(SUM(amount), 0) FROM pf_holidays_items WHERE holiday_id = h.id AND (expense_context = 'transit' OR (category = 'transport' AND (name LIKE '%Essence%' OR name LIKE '%Carburant%')))) as total_fuel, (SELECT COALESCE(SUM(amount), 0) FROM pf_holidays_items WHERE holiday_id = h.id AND category = 'transport' AND (name LIKE '%Péage%' OR name LIKE '%Peage%')) as total_tolls FROM pf_holidays h LEFT JOIN pf_vehicles v ON h.vehicle_id = v.id WHERE h.id = ? "); $stmt->execute([$id]); $holiday = $stmt->fetch(PDO::FETCH_ASSOC); // Récupération des items (étapes et frais généraux) $stmtItems = $pdo->prepare("SELECT * FROM pf_holidays_items WHERE holiday_id = ? ORDER BY sort_order ASC, id ASC"); $stmtItems->execute([$id]); $items = $stmtItems->fetchAll(PDO::FETCH_ASSOC); // Favoris pour le géocodage $stmtFav = $pdo->query("SELECT content FROM pf_notes WHERE note_type = 'holiday_favorites'"); $favorites = json_decode($stmtFav->fetchColumn() ?: '[]', true); $steps = []; $generalItems = []; foreach ($items as $it) { if ($it['location_name'] !== null) { $orderKey = $it['sort_order']; if (!isset($steps[$orderKey])) { $steps[$orderKey] = [ 'location_name' => $it['location_name'], 'lat' => (float)$it['lat'], 'lng' => (float)$it['lng'], 'sort_order' => $it['sort_order'], 'step_start_date' => $it['step_start_date'], 'step_end_date' => $it['step_end_date'], 'step_type' => $it['step_type'] ?? 'stop', 'total_amount' => 0, 'items' => [] ]; } $steps[$orderKey]['items'][] = $it; $steps[$orderKey]['total_amount'] += (float)$it['amount']; } else { $generalItems[] = $it; } } ksort($steps); $mapPoints = array_values($steps); // Affichage de la date $dateDisplay = htmlspecialchars($holiday['period_hint'] ?? ''); if (empty($dateDisplay) && $holiday['start_date']) { // 💡 Format Jour/Mois uniquement $dateDisplay = date('d/m', strtotime($holiday['start_date'])); if ($holiday['end_date']) $dateDisplay .= ' → ' . date('d/m', 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; // Image de fond (API Pixabay ou fallback par défaut) $bgImage = !empty($holiday['image_url']) ? htmlspecialchars($holiday['image_url']) : '/modules/home/assets/img/background.jpg'; ?>

🗓️
🛣️ 0 km (⏱️ 0h00) 💳 (1.85€/L) ✏️ 0 || $holiday['total_tolls'] > 0): ?> 👁️ 🍔 🎁
: 💼 :

Itinéraire

Aller Retour

🏁 Retour
'🚗', 'accommodation' => '🏨', 'activity' => '🎫', default => '🏷️' }; // On vérifie si l'activité possède ses propres coordonnées GPS $hasCustomGps = (!empty($it['lat']) && !empty($it['lng']) && ((float)$it['lat'] !== (float)$step['lat'] || (float)$it['lng'] !== (float)$step['lng'])); ?>
📍

📝

📍 Ajouter une étape

📅 Planning Global

🛣️ Détail des trajets

Calcul en cours...

🧭 Y aller avec...

📎 Porte-documents

Ajoutez vos billets, réservations ou PDFs pour cette étape.

Aucun document pour cette étape.