# 🏱 Expernet - SystĂšme de RĂ©servation de Salles SystĂšme complet de rĂ©servation de salles pour le centre de formation **Expernet**, dĂ©veloppĂ© avec **FastAPI** (Backend), **Next.js** (Frontend) et **PostgreSQL** (Base de donnĂ©es), orchestrĂ© avec Docker Compose. ## 📋 Stack Technique - **Backend**: FastAPI (Python) avec AsyncPG - **Frontend**: Next.js 14 + TypeScript + Tailwind CSS - **Base de donnĂ©es**: PostgreSQL 16 - **Containerisation**: Docker & Docker Compose ## ✹ FonctionnalitĂ©s ### đŸ›ïž Gestion des Salles - 5 salles prĂ©-configurĂ©es (Atlas, Horizon, Innovation, Connect, Digital) - Affichage des capacitĂ©s et Ă©quipements - Interface intuitive de sĂ©lection ### 📅 RĂ©servations - Formulaire de rĂ©servation complet - Champ email optionnel - SĂ©lection de date et horaires - **VĂ©rification en temps rĂ©el** de la disponibilitĂ© - DĂ©tection automatique des conflits d'horaires - **Bouton dĂ©sactivĂ©** si crĂ©neau occupĂ© - Validation des crĂ©neaux disponibles - Annulation de rĂ©servations ### 📊 Planning Visuel - **Grille de planning par jour** (8h-22h) - Vue d'ensemble de toutes les salles - Code couleur : ✅ Disponible / ❌ RĂ©servĂ© - Nom de l'utilisateur affichĂ© sur les crĂ©neaux rĂ©servĂ©s - Navigation par date - Liste dĂ©taillĂ©e des rĂ©servations du jour ### 📋 Suivi - Vue d'ensemble de toutes les rĂ©servations - Filtrage par salle et par date - Historique complet ## 🚀 DĂ©marrage Rapide ### PrĂ©requis - Docker et Docker Compose installĂ©s sur votre machine - Ports 3000, 8000 et 5432 disponibles ### Installation et lancement 1. **Cloner le projet** (si applicable) ```bash git clone cd dockezr ``` 2. **Lancer tous les services avec Docker Compose** ```bash docker-compose up -d ``` ou utilisez le script Windows : ```bash start.bat ``` Cette commande va : - CrĂ©er le rĂ©seau Docker `dockezr_network` - DĂ©marrer PostgreSQL sur le port 5432 - CrĂ©er automatiquement les tables et les 5 salles par dĂ©faut - DĂ©marrer le backend FastAPI sur le port 8000 - DĂ©marrer le frontend Next.js sur le port 3000 3. **AccĂ©der Ă  l'application** - **Frontend (Interface de rĂ©servation)**: http://localhost:3000 - **Backend API**: http://localhost:8000 - **Documentation API (Swagger)**: http://localhost:8000/docs - **Documentation API (ReDoc)**: http://localhost:8000/redoc ## 📁 Structure du Projet ``` dockezr/ ├── backend/ # API FastAPI │ ├── main.py # Point d'entrĂ©e de l'API │ ├── requirements.txt # DĂ©pendances Python │ └── Dockerfile # Configuration Docker │ ├── frontend/ # Application Next.js │ ├── app/ # Pages et composants Next.js 14 │ │ ├── layout.tsx │ │ ├── page.tsx │ │ └── globals.css │ ├── package.json # DĂ©pendances Node.js │ ├── tsconfig.json # Configuration TypeScript │ ├── tailwind.config.ts # Configuration Tailwind │ └── Dockerfile # Configuration Docker │ ├── docker-compose.yml # Orchestration des services ├── .dockerignore # Fichiers ignorĂ©s par Docker ├── .gitignore # Fichiers ignorĂ©s par Git └── README.md # Ce fichier ``` ## 🔧 Commandes Utiles ### DĂ©marrer les services ```bash docker-compose up -d ``` ### ArrĂȘter les services ```bash docker-compose down ``` ### Voir les logs ```bash # Tous les services docker-compose logs -f # Service spĂ©cifique docker-compose logs -f backend docker-compose logs -f frontend docker-compose logs -f db ``` ### Reconstruire les images ```bash docker-compose up -d --build ``` ### ArrĂȘter et supprimer les volumes (⚠ supprime les donnĂ©es) ```bash docker-compose down -v ``` ### AccĂ©der Ă  un conteneur ```bash # Backend docker exec -it dockezr_backend sh # Frontend docker exec -it dockezr_frontend sh # Base de donnĂ©es docker exec -it dockezr_db psql -U user -d dockezr ``` ## đŸ›ïž Salles PrĂ©-configurĂ©es Le systĂšme est livrĂ© avec 5 salles de formation : | Salle | CapacitĂ© | Équipements | |-------|----------|-------------| | **Salle Atlas** | 30 personnes | VidĂ©oprojecteur, Tableau blanc, WiFi | | **Salle Horizon** | 15 personnes | Écran TV, Tableau blanc, WiFi | | **Salle Innovation** | 50 personnes | VidĂ©oprojecteur, Sono, WiFi, Climatisation | | **Salle Connect** | 8 personnes | Écran TV, VisioconfĂ©rence, WiFi | | **Salle Digital** | 20 personnes | 20 postes informatiques, VidĂ©oprojecteur, WiFi | ## 🌐 API Endpoints ### Routes des Salles - `GET /rooms` - Liste toutes les salles - `GET /rooms/{room_id}` - RĂ©cupĂšre une salle spĂ©cifique - `POST /rooms` - CrĂ©e une nouvelle salle - `DELETE /rooms/{room_id}` - Supprime une salle ### Routes des RĂ©servations - `GET /reservations` - Liste toutes les rĂ©servations - `GET /reservations/room/{room_id}` - RĂ©servations d'une salle spĂ©cifique - `GET /reservations/date/{date}` - RĂ©servations pour une date donnĂ©e - `POST /reservations` - CrĂ©e une nouvelle rĂ©servation - `DELETE /reservations/{reservation_id}` - Annule une rĂ©servation ### Validation automatique L'API vĂ©rifie automatiquement : - ✅ La disponibilitĂ© de la salle - ✅ Les conflits d'horaires - ✅ La cohĂ©rence des horaires (dĂ©but < fin) - ✅ L'existence de la salle ### Documentation interactive - **Swagger UI**: http://localhost:8000/docs - **ReDoc**: http://localhost:8000/redoc ## đŸ—„ïž Base de DonnĂ©es ### Configuration - **Host**: localhost (ou `db` depuis les conteneurs) - **Port**: 5432 - **Utilisateur**: user - **Mot de passe**: password - **Base de donnĂ©es**: dockezr ### Structure des tables **Table `rooms`** - id (SERIAL PRIMARY KEY) - name (VARCHAR UNIQUE) - capacity (INTEGER) - equipment (TEXT) - description (TEXT) **Table `reservations`** - id (SERIAL PRIMARY KEY) - room_id (INTEGER FOREIGN KEY) - user_name (VARCHAR) - user_email (VARCHAR) - reservation_date (DATE) - start_time (TIME) - end_time (TIME) - purpose (TEXT) - created_at (TIMESTAMP) ### Connexion Ă  PostgreSQL ```bash docker exec -it dockezr_db psql -U user -d dockezr ``` ## 🎹 Frontend L'interface utilise : - **Next.js 14** avec App Router - **TypeScript** pour le typage statique - **Tailwind CSS** pour le styling moderne et responsive - **Axios** pour les requĂȘtes HTTP vers l'API ### FonctionnalitĂ©s de l'interface **Onglet Planning (par dĂ©faut)** - 📊 Grille de planning visuelle (8h-22h) - 🎹 Code couleur : vert (disponible) / rouge (rĂ©servĂ©) - 📅 SĂ©lecteur de date - đŸ‘€ Affichage du nom de l'utilisateur sur les crĂ©neaux - 📋 Liste dĂ©taillĂ©e des rĂ©servations du jour sĂ©lectionnĂ© - đŸ–±ïž Info-bulle au survol des crĂ©neaux rĂ©servĂ©s **Onglet RĂ©servation** - Liste visuelle des salles disponibles avec dĂ©tails - SĂ©lection interactive de salle - Formulaire de rĂ©servation complet - **Email optionnel** (pas obligatoire) - ⚡ **VĂ©rification en temps rĂ©el** de la disponibilitĂ© - ✅/❌ Indicateur visuel de disponibilitĂ© du crĂ©neau - 🔒 Bouton dĂ©sactivĂ© automatiquement si crĂ©neau occupĂ© **Onglet Mes RĂ©servations** - Affichage de toutes les rĂ©servations - Informations dĂ©taillĂ©es (salle, date, horaire, objet) - PossibilitĂ© d'annuler une rĂ©servation ## 🔄 DĂ©veloppement ### Mode dĂ©veloppement avec hot-reload Les deux services (backend et frontend) sont configurĂ©s en mode dĂ©veloppement avec rechargement automatique : - **Backend**: Uvicorn avec `--reload` - **Frontend**: Next.js avec `npm run dev` Les modifications de code sont automatiquement dĂ©tectĂ©es et appliquĂ©es. ### Variables d'environnement #### Backend - `DATABASE_URL`: URL de connexion PostgreSQL #### Frontend - `NEXT_PUBLIC_API_URL`: URL de l'API backend ## 🐛 DĂ©pannage ### Les conteneurs ne dĂ©marrent pas ```bash # VĂ©rifier les logs docker-compose logs # Reconstruire les images docker-compose up -d --build ``` ### La base de donnĂ©es n'est pas prĂȘte Le backend attend que PostgreSQL soit complĂštement dĂ©marrĂ© grĂące au healthcheck. ### Erreurs de connexion Ă  l'API VĂ©rifiez que : - Le backend est dĂ©marrĂ© : `docker-compose ps` - L'URL de l'API est correcte dans le frontend - Le rĂ©seau Docker fonctionne : `docker network ls` ## 📝 Personnalisation ### Ajouter de nouvelles salles Via l'API : ```bash curl -X POST http://localhost:8000/rooms \ -H "Content-Type: application/json" \ -d '{ "name": "Salle Formation", "capacity": 25, "equipment": "VidĂ©oprojecteur, WiFi", "description": "Salle de formation polyvalente" }' ``` Ou directement dans la base de donnĂ©es : ```sql INSERT INTO rooms (name, capacity, equipment, description) VALUES ('Ma Salle', 40, 'Équipements', 'Description'); ``` ### Modifier les ports Éditez le fichier `docker-compose.yml` et changez les mappings de ports : ```yaml ports: - "VOTRE_PORT:PORT_INTERNE" ``` ### Ajouter des dĂ©pendances **Backend (Python)**: 1. Ajoutez la dĂ©pendance dans `backend/requirements.txt` 2. Reconstruisez : `docker-compose up -d --build backend` **Frontend (Node.js)**: 1. Ajoutez la dĂ©pendance dans `frontend/package.json` 2. Reconstruisez : `docker-compose up -d --build frontend` ## 🎯 Cas d'Usage Ce systĂšme est idĂ©al pour : - ✅ Centres de formation - ✅ Espaces de coworking - ✅ Entreprises avec salles de rĂ©union - ✅ UniversitĂ©s et Ă©coles - ✅ BibliothĂšques avec salles d'Ă©tude ## 📩 Production Pour un dĂ©ploiement en production, modifiez : 1. Les mots de passe et secrets dans `docker-compose.yml` 2. DĂ©sactivez le mode debug/reload 3. Utilisez des variables d'environnement sĂ©curisĂ©es 4. Configurez HTTPS/SSL 5. Ajoutez un reverse proxy (Nginx, Traefik) 6. Mettez en place des sauvegardes de la base de donnĂ©es ## 🔐 SĂ©curitĂ© ⚠ **Important pour la production** : - Changez les identifiants PostgreSQL par dĂ©faut - Utilisez des secrets Docker pour les mots de passe - Activez l'authentification utilisateur - Configurez CORS correctement - Utilisez HTTPS ## 📄 Licence Ce projet est dĂ©veloppĂ© pour **Expernet** - Centre de Formation. --- **🏱 SystĂšme de rĂ©servation Expernet - Simplifions la gestion des salles ! 🚀**