🚢 Voyage App

Choisissez un voyage

  • {{ v.nom || '(sans nom)' }} créé le {{ formatDateShort(v.createdAt.slice(0,10)) }}
  • Aucun voyage pour l'instant — créez-en un ci-dessous.

Chargement…

+ Nouveau voyage

{{ appVersion }}
📴 Mode hors-ligne — les modifications seront synchronisées au retour en ligne
{{ syncToast.message }}

⚠️ Conflit de synchronisation

Des modifications ont été faites hors-ligne et sur OneDrive en même temps pour {{ conflict.type }}. Que souhaitez-vous conserver ?

📱 Local (hors-ligne)
☁️ OneDrive

🧭 {{ voyage.nom || 'Voyage App' }}

{{ appVersion }}

{{ voyage.nom || 'Mon voyage' }}

{{ [voyage.compagnie, voyage.bateau].filter(Boolean).join(' · ') }}
{{ voyage.dateDepart || '?' }} → {{ voyage.dateRetour || '?' }}

{{ voyage.nom || 'Mon voyage' }}

Escales

  • Aujourd'hui Prochaine {{ escaleTypeIcon(e.type) }} {{ e.ville }} — {{ e.pays }}
    {{ e.date }} · Arrivée {{ e.heureArrivee || '?' }} · Départ à bord {{ e.heureDepartLimite || '?' }}
  • Aucune escale — ajoutez-en une ci-dessous.

+ Nouvelle escale

{{ escaleTypeIcon(selectedEscale.type) }} {{ selectedEscale.ville }} — {{ selectedEscale.pays }}

{{ selectedEscale.date }} · Arrivée {{ selectedEscale.heureArrivee || '?' }} · Départ à bord {{ selectedEscale.heureDepartLimite || '?' }}

Réservations

  • {{ r.type }} — {{ r.reference }}
    {{ r.date }} · {{ r.note }}
  • Aucune réservation liée à cette escale.

Adresses

  • {{ a.type }} {{ a.nom }}
    {{ a.adresse }}
    📝 {{ a.notes }}
  • Aucune adresse pour cette escale.

{{ editingAdresseId !== null ? '✏️ Modifier l\'adresse' : '+ Nouvelle adresse' }}

{{ formatDateLong(selectedActiviteDate) }} — Escale : {{ escaleForDate(selectedActiviteDate).ville }}

  • {{ a.heure }} --:-- {{ a.titre }} — {{ a.lieu }} {{ statutLabel(a.statut) }}
    ⏱ {{ a.duree }}
    📝 {{ a.notes }}
    • {{ s.heure }} {{ s.titre }} — {{ s.lieu }}
      ⏱ {{ s.duree }}
      📝 {{ s.notes }}
    • Aucune sous-activité.
  • Aucune activité pour cette journée.

{{ selectedActiviteDetail.titre }}

{{ formatDateLong(selectedActiviteDetail.date) }} · {{ selectedActiviteDetail.heure }} · {{ selectedActiviteDetail.lieu }} · {{ selectedActiviteDetail.duree }}

Dépenses liées

  • {{ depenseSummaryLabel(d) }} ⚠️ {{ depenseWarnings(d).join(' · ') }}
    Date
    Pays
    Fournisseur
    Type
    Montant
    Devise
    Code devise
    Taux vers CAD
    Michel
    Chantal
    Partagé
    Autres
    Écart {{ Math.abs(depenseRepartitionEcart(d)) > 0.01 ? formatMoney(depenseRepartitionEcart(d)) : '—' }}
    Notes
  • Aucune dépense liée à cette activité.
  • Checklist vide.
Total dev orig {{ formatMoney(depensesTotals(visibleDepenses).totalOriginal) }}
En CAD {{ formatMoney(depensesTotals(visibleDepenses).totalCAD) }} $
Douanes : Écart {{ depensesEcartTotal === null ? '—' : formatMoney(depensesEcartTotal) + ' $' }}

⚠️ {{ depensesTotals(visibleDepenses).excludedCount }} dépense(s) exclue(s) du total CAD — taux manquant

  • {{ depenseSummaryLabel(d) }} ⚠️ {{ depenseWarnings(d).join(' · ') }}
    Date
    Pays
    Fournisseur
    Type
    Montant
    Devise
    Code devise
    Taux vers CAD
    Michel
    Chantal
    Partagé
    Autres
    Écart {{ Math.abs(depenseRepartitionEcart(d)) > 0.01 ? formatMoney(depenseRepartitionEcart(d)) : '—' }}
    Escale
    Notes
  • Aucune dépense{{ selectedDepenseDate ? ' pour cette date' : ' enregistrée' }}.

⚠️ {{ depensesReport.excludedCount }} dépense(s) exclue(s) du total — taux de conversion manquant

Durée du voyage : {{ tripDurationDays }} jour(s)

{{ p.label }}

Total déclarable : {{ formatMoney(depensesReport[p.key].declarable) }} $ CAD
Total incl. « Autres » : {{ formatMoney(depensesReport[p.key].grand) }} $ CAD
Écart vs montant autorisé : {{ formatMoney(depensesReport[p.key].ecart) }} $ CAD
  • {{ r.type }} — {{ r.reference }}
    {{ escaleLabel(r.escaleId) }} · {{ r.date }} · {{ r.note }}
  • Aucune réservation enregistrée.

+ Nouvelle réservation

+ Nouvelle entrée

  • {{ c.date }}

    {{ c.texte }}

  • Aucune entrée de carnet.