
# Architecture de l'application Voyageur

*Document généré et mis à jour automatiquement par le système.*

## Vue d'ensemble

Voyageur est une application de planification de voyage qui connecte les planificateurs et les voyageurs. Elle permet la gestion complète des itinéraires, des hébergements, des transports et des documents.

### Technologies utilisées

- React et React Router pour l'interface utilisateur
- Supabase pour l'authentification et la base de données
- Tailwind CSS et Shadcn UI pour les composants
- TypeScript pour le typage statique

## Structure des pages

| Chemin | Description | Accès |
|--------|-------------|-------|
| `/` | Page d'accueil | public |
| `/login` | Connexion | public |
| `/signup` | Inscription | public |
| `/about` | À propos | public |
| `/dashboard` | Tableau de bord du planificateur | planner |
| `/dashboard/trips/:tripId` | Détail d'un voyage (planificateur) | planner |
| `/voyageur/dashboard` | Tableau de bord du voyageur | traveler |
| `/voyageur/trips/:tripId` | Détail d'un voyage (voyageur) | traveler |
| `/auth/callback` | Callback d'authentification | public |
| `/auth/complete-signup` | Complétion de l'inscription | authenticated |
| `/dashboard/documents/:tripId` | Documents du voyage (planificateur) | planner |
| `/voyageur/documents/:tripId` | Documents du voyage (voyageur) | traveler |

## Composants principaux

### Composants de layout
- `MainLayout`: Layout principal pour les pages publiques
- `DashboardLayout`: Layout pour les pages de tableau de bord

### Composants fonctionnels
- `TripDetails`: Affichage des détails d'un voyage
- `TripItinerary`: Affichage de l'itinéraire du voyage
- `TripStepCard`: Carte affichant une étape de voyage
- `DocumentsForStep`: Affichage des documents liés à une étape

### Contextes et providers
- `AuthProvider`: Gestion de l'authentification
- `TripProvider`: Gestion des données de voyage

## Structure de la base de données

### Tables principales

#### profiles
- `id`: UUID (clé primaire)
- `email`: Adresse email
- `name`: Nom complet
- `role`: Rôle (planner/traveler)
- `id_planner`: compatibilité historique uniquement ; l’accès aux voyages passe par `trip_members`

#### trips
- `id`: UUID (clé primaire)
- `title`: Titre du voyage
- `destination`: Destination
- `start_date`: Date de début
- `end_date`: Date de fin
- `planner_id`: ID du planificateur
- `traveler_id` / `traveler_name`: compatibilité historique, non utilisées pour l’autorisation

#### trip_members
- `trip_id` + `user_id`: clé primaire relationnelle, un membre unique par voyage
- `status`: adhésion active
- `source`: origine (`legacy`, `assignment`, `invitation`)
- `invitation_id`: invitation acceptée éventuelle

#### trip_steps
- `id`: UUID (clé primaire)
- `trip_id`: ID du voyage
- `day`: Jour de l'étape
- `time`: Heure de l'étape
- `location`: Lieu
- `activity`: Activité
- `step_type`: Type d'étape (transport, hébergement, activité, etc.)
- `validation_status`: compatibilité historique de la décision mono-voyageur
- `is_validated` / `is_rejected`: colonnes legacy synchronisées par PostgreSQL, non utilisées par l'application
- `is_published`: État de publication (visibilité pour le voyageur)

#### step_validations
- `step_id` + `traveler_id`: une décision indépendante par voyageur et par étape
- `status`: décision (`pending`, `approved`, `rejected`)

#### documents
- `id`: UUID (clé primaire)
- `trip_id`: ID du voyage
- `step_id`: ID de l'étape (optionnel)
- `name`: Nom du document
- `type`: Type de document
- `url`: URL du fichier

## Flux d'authentification

1. L'utilisateur s'inscrit sur /signup (email + mot de passe)
2. Le système vérifie l'email et redirige vers /auth/complete-signup
3. L'utilisateur complète son profil (nom, rôle)
4. Le système redirige vers le tableau de bord approprié (/dashboard ou /voyageur/dashboard)

## Système de publication

Le système de publication permet aux planificateurs de contrôler ce que les voyageurs peuvent voir:

1. Par défaut, les nouvelles étapes sont créées non publiées
2. Le planificateur peut publier/masquer chaque étape individuellement
3. Les voyageurs ne voient que les étapes publiées
4. Un voyageur associé peut approuver ou refuser une étape publiée et modifier ensuite son choix

## API et intégrations

L'application utilise principalement l'API REST de Supabase pour:
- Authentification (supabase.auth)
- CRUD des voyages et étapes
- Stockage et récupération des documents

## Dernière mise à jour

Ce document est automatiquement mis à jour à chaque modification importante de l'architecture.
