Nom du projet : Nomado
Concept : Site web qui génère automatiquement un voyage complet (pays + hôtel + vol) basé sur le type de voyage souhaité, le budget, la durée et le nombre de passagers. L'utilisateur paie directement sur le site et Nomado s'occupe de tout.
Objectif : Simplifier la réservation de voyage en automatisant le choix de la destination et des services selon les préférences et le budget de l'utilisateur.
Durée du projet : 8-10 semaines
- L'utilisateur s'inscrit et se connecte au site
- L'utilisateur remplit un formulaire unique :
- Type de voyage (Aventure, Culture, Plage, Romantique, etc.)
- Budget total (€)
- Durée du séjour (en jours)
- Nombre de passagers
- Le système calcule automatiquement :
- Répartition du budget (Vols: 30%, Hôtel: 40%, Activités: 20%, Divers: 10%)
- Le système recommande :
- UN pays correspondant au type de voyage choisi
- UN hôtel selon le budget calculé pour l'hébergement
- Prix estimé des vols (calculé automatiquement)
- L'utilisateur voit le résultat avec le prix total
- L'utilisateur peut payer directement sur le site
- Le voyage est confirmé et sauvegardé dans son compte
- Pas de consultation sans compte
- Il faut obligatoirement créer un compte pour utiliser le site
- S'inscrire et se connecter
- Remplir le formulaire de génération de voyage
- Voir la recommandation (pays + hôtel + prix)
- Payer pour confirmer le voyage
- Voir ses voyages payés/confirmés
- Se connecter avec un compte admin
- Gérer les pays (CRUD)
- Gérer les hôtels (CRUD)
- Voir les réservations des utilisateurs
Étape 1 : L'utilisateur remplit le formulaire
- Type de voyage : (Aventure, Culture, Plage, Romantique, Nature, Shopping)
- Budget total : (ex: 2000€)
- Durée : (ex: 7 jours)
- Nombre de passagers : (ex: 2 personnes)
Étape 2 : Le système calcule la répartition du budget
Budget total = 2000€
Répartition automatique :
- Vols : 30% = 600€
- Hôtel : 40% = 800€
- Activités : 20% = 400€
- Divers : 10% = 200€
Étape 3 : Le système choisit le pays
- Chaque pays dans la base de données a un attribut "trip_type"
- Le système cherche les pays qui correspondent au type choisi
- Exemple : Si l'utilisateur choisit "Aventure" → Le système propose Maroc, Népal, Costa Rica...
Étape 4 : Le système choisit l'hôtel
- Calcul du budget hôtel par nuit :
Budget hôtel ÷ Nombre de nuits ÷ Nombre de passagers - Exemple : 800€ ÷ 7 nuits ÷ 2 personnes = 57€ par personne par nuit
- Le système trouve un hôtel dont le prix est proche de ce budget
Étape 5 : Le système calcule le prix total
Prix hôtel total = Prix par nuit × Nombre de nuits × Nombre de passagers
Prix vol estimé = Budget vol (30% du total)
Prix total = Prix hôtel + Prix vol
Page de résultat montre :
- 🌍 Pays recommandé (nom + photo + description)
- 🏨 Hôtel recommandé (nom + photo + prix par nuit)
✈️ Prix estimé des vols- 💰 Prix total du voyage
- 📝 Détail de la répartition du budget
- ✅ Bouton "Payer maintenant"
Important : Pas de vrai paiement !
- On simule juste le paiement
- L'utilisateur clique sur "Payer"
- Le système enregistre le voyage comme "Payé"
- Pas besoin d'intégrer Stripe ou PayPal (trop complexe)
L'utilisateur peut voir :
- Liste de tous ses voyages
- Statut : "En attente" ou "Payé"
- Détails de chaque voyage (pays, hôtel, prix)
- HTML5 : Structure des pages
- CSS3 + Tailwind CSS : Design et style
- JavaScript : Interactions basiques (afficher/cacher, validation formulaire)
- PHP 8 : Logique serveur
- Laravel : Framework PHP (utilisation basique)
- Routes
- Controllers
- Models (Eloquent)
- Blade (templates)
- MySQL : Base de données simple
- Hash des mots de passe (bcrypt)
- Protection CSRF (Laravel intégré)
- Validation des formulaires
- id (clé primaire)
- name (nom complet)
- email (unique)
- password (hashé)
- role (ENUM: 'user', 'admin')
- created_at
- updated_at- id (clé primaire)
- name (nom du pays: "Maroc", "Espagne", "Thaïlande")
- trip_type (ENUM: 'adventure', 'culture', 'beach', 'romantic', 'nature', 'shopping')
→ C'est le type de voyage qui correspond à ce pays
- description (texte court sur le pays)
- image (URL de l'image du pays)
- created_at
- updated_atExemple de données dans countries:
| id | name | trip_type | description |
|----|-----------|-------------|---------------------------------------|
| 1 | Maroc | adventure | Déserts, montagnes, et médinas |
| 2 | Espagne | culture | Architecture, musées, gastronomie |
| 3 | Maldives | beach | Plages paradisiaques et eau turquoise|
| 4 | France | romantic | Paris, la ville de l'amour |
- id (clé primaire)
- country_id (clé étrangère → countries.id)
- name (nom de l'hôtel)
- price_per_night (prix par nuit par personne en €)
- description (texte court)
- image (URL de l'image)
- created_at
- updated_atExemple de données dans hotels:
| id | country_id | name | price_per_night |
|----|------------|----------------|-----------------|
| 1 | 1 | Riad Marrakech | 50€ |
| 2 | 1 | Atlas Hotel | 80€ |
| 3 | 2 | Hotel Barcelona| 70€ |
- id (clé primaire)
- user_id (clé étrangère → users.id)
- country_id (clé étrangère → countries.id)
- hotel_id (clé étrangère → hotels.id)
- trip_type (type de voyage choisi par l'utilisateur)
- budget_total (budget total entré par l'utilisateur)
- duration (durée en jours)
- passengers (nombre de passagers)
- flight_budget (30% du budget total - pour les vols)
- hotel_budget (40% du budget total - pour l'hôtel)
- activities_budget (20% du budget total)
- misc_budget (10% du budget total)
- total_price (prix final calculé)
- status (ENUM: 'pending', 'paid')
→ 'pending' = en attente de paiement
→ 'paid' = voyage payé et confirmé
- created_at
- updated_atusers (1) ----< (N) bookings
countries (1) ----< (N) hotels
countries (1) ----< (N) bookings
hotels (1) ----< (N) bookings
Explication des relations :
- Un utilisateur peut avoir plusieurs réservations
- Un pays peut avoir plusieurs hôtels
- Un pays peut être réservé plusieurs fois
- Un hôtel peut être réservé plusieurs fois
US1 - En tant qu'utilisateur, je veux m'inscrire avec un email et mot de passe pour utiliser le site.
US2 - En tant qu'utilisateur, je veux me connecter pour accéder aux fonctionnalités.
US3 - En tant qu'utilisateur, je veux me déconnecter.
US4 - En tant qu'utilisateur, je veux choisir un type de voyage (Aventure, Culture, Plage, etc.).
US5 - En tant qu'utilisateur, je veux entrer mon budget total, la durée et le nombre de passagers.
US6 - En tant qu'utilisateur, je veux que le système calcule automatiquement la répartition de mon budget (30% vols, 40% hôtel, 20% activités, 10% divers).
US7 - En tant qu'utilisateur, je veux voir UN pays recommandé basé sur le type de voyage que j'ai choisi.
US8 - En tant qu'utilisateur, je veux voir UN hôtel recommandé dans ce pays selon mon budget.
US9 - En tant qu'utilisateur, je veux voir le prix total de mon voyage (hôtel + vols estimés).
US10 - En tant qu'utilisateur, je veux pouvoir "payer" mon voyage (simulation de paiement).
US11 - En tant qu'utilisateur, après paiement, je veux que mon voyage soit marqué comme "Payé".
US12 - En tant qu'utilisateur, je veux voir la liste de tous mes voyages (en attente et payés).
US13 - En tant qu'utilisateur, je veux voir les détails d'un voyage (pays, hôtel, prix, statut).
US14 - En tant qu'utilisateur, je veux supprimer un voyage en attente.
US15 - En tant qu'admin, je veux me connecter avec un compte administrateur.
US16 - En tant qu'admin, je veux voir la liste de tous les pays.
US17 - En tant qu'admin, je veux ajouter un nouveau pays avec son type de voyage (trip_type).
US18 - En tant qu'admin, je veux modifier les informations d'un pays.
US19 - En tant qu'admin, je veux supprimer un pays.
US20 - En tant qu'admin, je veux voir la liste des hôtels par pays.
US21 - En tant qu'admin, je veux ajouter un hôtel à un pays avec son prix par nuit.
US22 - En tant qu'admin, je veux modifier un hôtel existant.
US23 - En tant qu'admin, je veux supprimer un hôtel.
US24 - En tant qu'admin, je veux voir toutes les réservations des utilisateurs.
- ✅ Installer Laravel
- ✅ Créer la base de données (4 tables : users, countries, hotels, bookings)
- ✅ Design simple avec Tailwind CSS
- ✅ Créer les migrations Laravel
- ✅ Système d'inscription (Register)
- ✅ Système de connexion (Login)
- ✅ Logout
- ✅ Protection des routes (middleware)
- ✅ Formulaire de génération (type, budget, durée, passagers)
- ✅ Logique de répartition du budget (30%, 40%, 20%, 10%)
- ✅ Algorithme de sélection du pays selon trip_type
- ✅ Algorithme de sélection de l'hôtel selon budget
- ✅ Calcul du prix total
- ✅ Page de résultat avec détails
- ✅ Simulation de paiement
- ✅ Sauvegarde de la réservation
- ✅ Page admin pour gérer les pays (CRUD)
- ✅ Page admin pour gérer les hôtels (CRUD)
- ✅ Affichage des réservations
- ✅ Tests complets
- ✅ Corrections de bugs
- ✅ Amélioration du design
- ✅ Ajout de données test (10-15 pays, 30-40 hôtels)
- ✅ Préparation de la présentation
| id | name | trip_type | description |
|---|---|---|---|
| 1 | Maroc | adventure | Désert du Sahara, Atlas, Marrakech |
| 2 | Népal | adventure | Himalaya, trekking, temples |
| 3 | Espagne | culture | Gaudi, musées, flamenco |
| 4 | Italie | culture | Rome, Renaissance, gastronomie |
| 5 | Maldives | beach | Plages de rêve, eau turquoise |
| 6 | Thaïlande | beach | Îles paradisiaques, temples |
| 7 | France | romantic | Paris, châteaux de la Loire |
| 8 | Grèce | romantic | Santorin, coucher de soleil |
| id | country_id | name | price_per_night |
|---|---|---|---|
| 1 | 1 | Riad Marrakech | 50€ |
| 2 | 1 | Atlas Mountain | 70€ |
| 3 | 1 | Desert Camp | 45€ |
| 4 | 1 | Luxury Palace | 150€ |
- Ahmed s'inscrit sur Nomado
- Ahmed se connecte avec son compte
- Ahmed va sur "Générer un voyage"
- Ahmed remplit le formulaire :
- Type : "Aventure"
- Budget : 1500€
- Durée : 5 jours
- Passagers : 2 personnes
- Le système calcule :
- Vols : 450€ (30%)
- Hôtel : 600€ (40%)
- Activités : 300€ (20%)
- Divers : 150€ (10%)
- Le système cherche :
- Pays avec trip_type = "adventure" → Trouve : Maroc, Népal, Costa Rica
- Choisit au hasard → Maroc
- Le système cherche un hôtel au Maroc :
- Budget par nuit par personne : 600€ ÷ 5 jours ÷ 2 = 60€/nuit
- Trouve "Riad Marrakech" à 50€/nuit → Parfait !
- Ahmed voit le résultat :
- Pays : Maroc
- Hôtel : Riad Marrakech (50€/nuit)
- Prix total hôtel : 50€ × 5 × 2 = 500€
- Prix vols estimés : 450€
- Prix total : 950€
- Ahmed clique sur "Payer maintenant"
- Le système enregistre :
- Nouvelle réservation dans la table
bookings - Statut : "paid"
- Nouvelle réservation dans la table
- Ahmed peut voir sa réservation dans "Mes Réservations"
FIN DU CAHIER DES CHARGES