Application de gestion de planning complète construite avec Next.js, Firebase et Tailwind CSS.
- ✅ Multi-tenant : Isolation stricte entre organisations
- 🎉 Onboarding complet : Configuration complète en 6 étapes (NEW!)
- Configuration des jours ouvrés et segments horaires
- Personnalisation des rôles avec couleurs
- Ajout d'employés initiaux (optionnel)
- Valeurs par défaut selon l'industrie
- 👥 Gestion d'équipe : Employés, rôles, contrats
- 📆 Planning : Création et gestion des horaires par segments
- 🏖️ Congés : Demandes et approbation d'absences
- 🔐 Authentification : Firebase Auth avec rôles (owner, manager, employee)
- 📧 Invitations : Système d'invitation sécurisé
- 🎨 UI moderne : shadcn/ui + Tailwind CSS
- 📱 Mobile-first : Interface responsive
- Next.js 14 (App Router)
- TypeScript strict
- Tailwind CSS + shadcn/ui
- React Query pour le state management
- Firebase SDK (client)
- Firebase Auth : Authentification
- Firestore : Base de données NoSQL
- Cloud Functions : Logique métier serveur
- Storage : Stockage de fichiers
- Cloud Scheduler : Tâches périodiques
- Node.js 18+
- npm ou yarn
- Compte Firebase (plan Blaze pour Cloud Functions)
- Firebase CLI :
npm install -g firebase-tools
git clone <url-du-repo>
cd employee-scheduler# Frontend
npm install
# Functions
cd functions
npm install
cd ..-
Créer un projet Firebase sur console.firebase.google.com
-
Activer les services :
- Authentication (Email/Password)
- Firestore Database
- Storage
- Functions
-
Récupérer la configuration web :
- Projet Settings > General > Your apps
- Copier la configuration Firebase
-
Créer le fichier
.env.localà la racine :
cp .env.example .env.local- Remplir les variables :
NEXT_PUBLIC_FIREBASE_API_KEY=your-api-key
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your-project.firebaseapp.com
NEXT_PUBLIC_FIREBASE_PROJECT_ID=your-project-id
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=your-project.appspot.com
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=123456789
NEXT_PUBLIC_FIREBASE_APP_ID=your-app-id- Se connecter à Firebase CLI :
firebase login
firebase use --add# Terminal 1 : Émulateurs Firebase
npm run emulators# Terminal 2 : Seed
npm run seedCela crée :
- Un utilisateur :
demo@example.com/password123 - Une organisation : "Demo Bistro"
- 4 employés avec différents rôles
- 1 demande de congés en attente
# Terminal 3 : Next.js dev server
npm run devOuvrir http://localhost:3000
- Frontend : http://localhost:3000
- Emulator UI : http://localhost:4000
- Firestore Emulator : http://localhost:8080
- Auth Emulator : http://localhost:9099
- Functions Emulator : http://localhost:5001
/
├── src/
│ ├── app/ # Pages Next.js (App Router)
│ │ ├── login/ # Page de connexion
│ │ ├── onboarding/ # Wizard de création d'org
│ │ └── app/ # Dashboard principal
│ │ ├── planning/ # Gestion du planning
│ │ ├── employees/ # Gestion des employés
│ │ ├── leaves/ # Gestion des congés
│ │ └── settings/ # Paramètres
│ ├── components/ # Composants React
│ │ ├── ui/ # Composants shadcn/ui
│ │ └── auth/ # Guards d'authentification
│ ├── hooks/ # Hooks personnalisés
│ ├── lib/ # Utilitaires
│ └── types/ # Types TypeScript
├── functions/ # Cloud Functions
│ └── src/
│ ├── org/ # Fonctions organisations
│ ├── leave/ # Fonctions congés
│ ├── schedule/ # Fonctions planning
│ └── triggers/ # Triggers Firestore
├── docs/ # Documentation
├── scripts/ # Scripts utilitaires
├── firestore.rules # Règles de sécurité Firestore
├── firestore.indexes.json # Index Firestore
└── storage.rules # Règles de sécurité Storage
/orgs: Organisations/orgs/{orgId}/memberships: Membres d'une org/orgs/{orgId}/employees: Employés (profils internes)/orgs/{orgId}/roles: Rôles/postes/orgs/{orgId}/schedules: Plannings/orgs/{orgId}/leaveRequests: Demandes de congés/orgs/{orgId}/invites: Invitations en attente/users: Profils utilisateurs globaux
Voir docs/FIRESTORE_SCHEMA.md pour le schéma complet.
# Développement
npm run dev # Démarrer Next.js en mode dev
npm run emulators # Démarrer les émulateurs Firebase
npm run seed # Peupler l'émulateur avec des données de test
# Production
npm run build # Build Next.js
npm start # Démarrer en production
npm run functions:build # Compiler les Cloud Functions
npm run functions:deploy # Déployer les Functions
# Qualité
npm run lint # ESLint
npm run type-check # TypeScript
npm run format # Prettier
# Tests
npm test # Tests unitaires (Jest)
npm run test:watch # Tests en mode watch
npm run test:e2e # Tests E2E (Playwright)# Via CLI Vercel
npm i -g vercel
vercel
# Ou via Git (recommandé)
git push origin main
# → Auto-déployé sur VercelConfigurer les variables d'environnement sur Vercel :
- Settings > Environment Variables
- Copier toutes les variables de
.env.local
# Déployer les règles Firestore
firebase deploy --only firestore:rules
# Déployer les index Firestore
firebase deploy --only firestore:indexes
# Déployer les Cloud Functions
npm run functions:deploy
# Tout déployer
firebase deploy- ✅ Règles Firestore strictes par rôle
- ✅ Validation côté serveur (Cloud Functions)
- ✅ Isolation multi-tenant
- ✅ Authentification obligatoire
- ✅ System d'invitations sécurisé
- ✅ Audit logs pour traçabilité
- Identité de l'organisation
- Configuration des jours ouvrés
- Création des rôles
- Ajout des employés
- Gabarits d'horaires
- Validation
- Vue hebdomadaire du planning
- Glisser-déposer des affectations
- Gestion des demandes de congés
- Gestion de l'équipe
- Invitations de nouveaux membres
- Consultation du planning
- Demande de congés
- Suivi des demandes
cd functions
npm testnpm run test:e2e- Fork le projet
- Créer une branche (
git checkout -b feature/amazing-feature) - Commit (
git commit -m 'Add amazing feature') - Push (
git push origin feature/amazing-feature) - Ouvrir une Pull Request
MIT
- Compléter les 6 étapes du wizard d'onboarding
- Implémenter le glisser-déposer dans le planning
- Exports PDF/CSV
- Notifications push (PWA)
- Mode hors-ligne
- Intégrations externes (paie, RH)
- Application mobile (Capacitor)
- Pointeuse (heures réelles vs prévues)
Pour toute question ou problème :
- Ouvrir une issue sur GitHub
- Consulter la documentation Firebase
- Vérifier les logs dans Firebase Console
Construit avec ❤️ en France