Gym CRM
Une application de gestion de salle avec pointage QR, contrôle d’abonnement, rôles et caisse de stock.
Conçu comme une démonstration fonctionnelle pouvant servir de base à une solution métier personnalisée.
Consulter les preuves
Consultez le code, le modèle de données et les tests dans le dépôt.
Ce que j’ai construit
- Terminal de pointage d'accueil validant les pass QR numériques avec fenêtre anti-doublon de 2 minutes
- Annuaire des adhérents gérant profils, contacts d'urgence et statuts d'abonnement (ACTIF, EXPIRÉ, SUSPENDU)
- RBAC côté serveur sur 5 rôles (ADMIN, MANAGER, COACH, RÉCEPTIONNISTE, ADHÉRENT) avec inscription protégée
- Schéma PostgreSQL à 13 modèles via Prisma modélisant membres, forfaits, présences, entraînements et commandes
- Programmation sportive et cibles nutritionnelles avec Gemini 1.5 Flash et gabarits de secours déterministes
- Catalogue boutique POS suivant niveaux de stock, prix unitaires, commandes détaillées et génération de reçus
- Planning hebdomadaire des cours avec assignation des coachs et gestion des jauges de capacité
- Persistance des données bimode : PostgreSQL en production avec magasin de données déterministe de secours
- Interface responsive à fort contraste étudiée pour les postes d'accueil et la consultation mobile
Engorgement à l'Accueil, Accès Expirés & Manque de Cloisonnement
Aux heures de pointe, les salles de sport subissent des ralentissements dus à la recherche manuelle des membres, des entrées d'adhérents dont le forfait est expiré sans alerte immédiate, et des présences consignées sur des listes papier disparates. De plus, les équipes (accueil, coachs, direction) nécessitent des niveaux d'accès distincts des adhérents, mais les outils basiques exposent souvent les données administratives sans vérification serveur stricte.
Vérification des Accès d'Accueil & Flux Cloisonnés par Rôle
Gym CRM déploie un poste de pointage d'accueil validant en direct les pass QR et l'état des forfaits (Actif, Expiré, Suspendu) avant d'enregistrer l'accès, avec une protection anti-doublon de 2 minutes. Un contrôle RBAC côté serveur cloisonne 5 rôles (Admin, Manager, Coach, Réceptionniste, Adhérent), tandis que 13 modèles relationnels structurent profils, pointages, ventes comptoir et journaux d'audit.
03 / EXPÉRIENCE PRODUIT
Fonctionnalités & Parcours Utilisateur
Poste d'Accueil & Fréquentation de Salle
Un tableau de bord d'exploitation affichant les pointages du jour au comptoir, le décompte des abonnements actifs, la distribution horaire de fréquentation et les totaux d'adhésion.
Permet aux réceptionnistes de suivre l'occupation de la salle lors des pics d'affluence tout en fournissant à la direction un historique vérifié des présences.
Tableau de bord d'exploitation avec journal des pointages, adhérents actifs et métriques de revenus
Annuaire des Adhérents & Statuts d'Abonnement
Un registre structuré des adhérents gérant profils personnels, contacts d'urgence, identifiants de pass QR et statuts d'abonnement (ACTIF, EXPIRÉ, SUSPENDU) avec dates de fin.
Empêche les accès non autorisés en signalant immédiatement les forfaits expirés ou suspendus avant l'entrée sur le plateau sportif.
Annuaire CRM des adhérents avec recherche rapide, statuts d'abonnement et pass QR numériques
RBAC sur 5 Rôles & Inscription Cloisonnée
Contrôle d'accès côté serveur sur 5 rôles (ADMIN, MANAGER, COACH, RÉCEPTIONNISTE, ADHÉRENT), associé à une inscription publique cloisonnée (MEMBER ou ADMIN) prévenant l'escalade de privilèges.
Réserve les routes administratives, journaux d'audit et registres financiers au personnel qualifié tout en offrant aux membres un espace personnel dédié.
Inscription différenciée permettant de choisir un compte Administrateur ou Adhérent avec contrôle d'accès RBAC côté serveur
Planning des Cours & Gestion des Jauges
Une grille de planning pour les cours collectifs affichant les créneaux, les capacités de salle, les coachs assignés et le nombre d'inscrits.
Structure les capacités d'accueil des cours collectifs pour éviter la saturation et permet aux coachs de consulter les listes d'inscrits.
Programmation Sportive & Nutrition avec Replis Déterministes
Création de séances (séries, répétitions, groupes musculaires) et d'objectifs macronutritionnels journaliers propulsés par Google Gemini 1.5 Flash avec replis déterministes par règles métier.
Fournit des programmes sportifs et nutritionnels structurés aux coachs et adhérents même en l'absence de clé API ou en cas de coupure réseau externe.
Caisse Boutique d'Accueil & Facturation Détaillée
Une caisse de comptoir pour articles de boutique (compléments, boissons, accessoires) suivant stocks, prix unitaires, commandes détaillées et reçus en complément des abonnements.
Consigne les ventes de comptoir au sein d'un registre interne sans nécessiter de terminal point de vente physique externe.
Registre financier des transactions avec modes de paiement, instantanés de factures et reçus imprimables
04 / ARCHITECTURE TECHNIQUE
Fondations Techniques & Architecture
Vérification de Présence à l'Accueil & Verrou Anti-Doublon
Aux heures de pointe du matin et du soir, l'équipe d'accueil doit enregistrer les entrées rapidement tout en bloquant les forfaits expirés. La route de pointage recherche le membre via son code QR indexé, valide que le statut utilisateur est ACTIVE, et vérifie que le forfait le plus récent est ACTIVE avec une date de fin future. Pour contrer les double-scans causés par un balayage répété, le gestionnaire vérifie l'existence d'une entrée dans une fenêtre de 2 minutes et renvoie un statut HTTP 409 Conflict avant d'écrire l'entrée validée et l'enregistrement d'audit.
RBAC Côté Serveur sur 5 Rôles & Prévention d'Escalade
Une application de salle dessert du personnel administratif et des adhérents aux besoins distincts. Les autorisations sont modélisées sur 5 rôles : ADMIN, MANAGER, TRAINER, RECEPTIONIST et MEMBER. Au lieu de masquer des composants dans l'interface, les routes API appliquent une vérification serveur via requireRole(). La route d'inscription publique partitionne strictement les rôles autorisés (MEMBER ou ADMIN en démo) et interdit l'injection de rôles privilégiés. Les routes sensibles comme /api/audit-logs renvoient un statut HTTP 403 Forbidden aux jetons MEMBER, comme le prouvent les scripts de test.
Schéma Relationnel à 13 Modèles & Cycle de Vie des Forfaits
L'exploitation d'une salle relie identités, droits d'accès, transactions et présences physiques. Avec Prisma ORM et PostgreSQL, le système structure 13 entités relationnelles : User, MemberProfile, MembershipPlan, MemberMembership, Attendance, Exercise, WorkoutPlan, NutritionPlan, Payment, Product, OrderItem, Notification et AuditLog. Les contraintes de clés étrangères assurent que pointages et ventes de boutique renvoient à des fiches valides, évitant les enregistrements orphelins et modélisant les transitions d'état d'abonnement (ACTIVE, EXPIRED, FROZEN).
Génération Assistée par IA avec Replis Déterministes par Modèles
Les modules d'entraînement et de nutrition intègrent Google Gemini 1.5 Flash pour générer des programmes sportifs et des répartitions de macronutriments selon les objectifs de l'adhérent. Pour éviter tout blocage lié aux quotas d'API, aux latences réseau ou à l'absence de variable d'environnement, les appels sont validés par schéma Zod et basculent automatiquement sur une logique de repli déterministe par règles métier. Cela garantit aux coachs et aux membres des programmes cohérents et sans erreur dans toutes les conditions réseau.
05 / IMPLÉMENTATION VÉRIFIÉE
Preuves d'Ingénierie & Flux d'Accueil
Contrôle d'accès au comptoir, RBAC côté serveur et intégrité transactionnelle vérifiés directement dans le code source.
Validation Pré-Persistance au Pointage
L'accès est validé avant toute persistance. Chaque scan au comptoir vérifie que le compte est actif, que le forfait n'est ni expiré ni suspendu, et qu'aucun pointage n'est survenu dans les 120 secondes précédentes (évitant les doubles impulsions de scanner avec un code HTTP 409 Conflict).
Matrice d'Autorisation Côté Serveur sur 5 Rôles
| Rôle | Périmètre | Pointage | Caisse POS | Fiches Membres | Entraînements | Journal Audit |
|---|---|---|---|---|---|---|
| ADMIN | Supervision globale & réglages | ✓ | ✓ | ✓ | ✓ | ✓ |
| MANAGER | Gestion opérationnelle & audits | ✓ | ✓ | ✓ | ✓ | ✓ |
| TRAINER | Plateau sportif & programmation | ✓ | — | ✓ | ✓ | — |
| RECEPTIONIST | Accueil, pointage & caisse comptoir | ✓ | ✓ | ✓ | — | — |
| MEMBER | Portail adhérent (pass & séances) | — | — | Personnel | Personnel | — |
Cloisonnement strict à l'inscription publique : L'API d'inscription publique n'autorise que le rôle MEMBER (ou ADMIN en mode démo). Les rôles d'équipe (MANAGER, TRAINER, RECEPTIONIST) sont protégés contre toute auto-création et requièrent une provision explicite par un administrateur.
Validation d'accès avant persistance
Chaque scan au comptoir valide l'état du forfait et intercepte les balayages rapprochés par un verrou temporel de 120 secondes.
Caisse de comptoir & décrémentation atomique
Les ventes de boutique (boissons, compléments) décrémentent le stock, créent le paiement et l'audit sous transaction ACID sans dérive d'inventaire.
Garanties de Sécurité Côté Serveur
Sessions Cryptographiques
Les jetons de session sont signés par HMAC-SHA256 et comparés en temps constant (crypto.timingSafeEqual) pour neutraliser les attaques par canal auxiliaire.
Inscription Protégée
L'inscription publique filtre les entrées via schéma Zod et force le rôle MEMBER ou ADMIN démo, interdisant toute auto-attribution des rôles d'équipe.
Caviardage des Journaux
Les clés sensibles (mots de passe, jetons, cookies) sont automatiquement purgées avant insertion dans AuditLog. Consultation réservée aux rôles ADMIN et MANAGER.
L'exploitation de la salle ne dépend jamais de la disponibilité d'une API externe.
L'assistance sportive (séances) et diététique (macros) s'appuie sur Gemini 1.5 Flash avec troncature d'entrée (500 caractères) et validation stricte du format de sortie par schémas Zod.
Génération autonome par règles métier en cas de panne ou de quota épuisé.
En cas d'absence de clé API, de latence réseau ou de réponse invalide, le système bascule immédiatement sur des calculs déterministes locaux. Coachs et adhérents obtiennent toujours leur programme sans blocage.
Contrats d'Exécution & Intégrité sur 13 Modèles Relationnels
L'intégrité opérationnelle de Gym CRM repose sur la cohérence relationnelle de PostgreSQL, le typage strict de TypeScript, la validation de schéma Zod aux frontières des routes et des transactions atomiques pour l'accueil et la caisse de comptoir.
05 / DÉCISIONS TECHNIQUES
Choix techniques et compromis
Fenêtre Anti-Collision de Deux Minutes au Pointage d'Accueil
Appliquer un seuil anti-collision de 2 minutes sur la route /api/attendance/check-in rejetant les pointages répétés pour un même membre avec un statut HTTP 409 Conflict.
Aux heures de pointe, les lecteurs optiques émettent souvent des doubles impulsions ou le personnel passe le badge deux fois par inadvertance. Rejeter les scans consécutifs protège la fiabilité des statistiques de fréquentation.
Cloisonnement des Rôles à l'Inscription & RBAC par Route
Valider rigoureusement le rôle à l'inscription publique pour n'autoriser que MEMBER ou ADMIN (en mode démo), tout en exécutant requireRole() sur toutes les routes administratives.
Permettre l'attribution arbitraire de rôle à l'inscription ouvrirait la voie à des privilèges MANAGER ou RECEPTIONIST non autorisés. Le contrôle serveur garantit qu'un profil MEMBER ne peut accéder ni aux annuaires, ni aux audits, ni aux paramètres.
Modélisation Relationnelle Normalisée via Prisma ORM
Modéliser l'exploitation de salle sur 13 entités relationnelles avec clés étrangères reliant utilisateurs, forfaits, pointages, programmes et ventes boutique.
Les opérations de club sont intrinsèquement relationnelles : un pointage doit être lié à un adhérent avec abonnement valide, et une vente boutique à un article existant. Les contraintes relationnelles préviennent les orphelins et garantissent la traçabilité.
Persistance Bimode PostgreSQL avec Repli en Mémoire
Développer une couche d'abstraction connectée à PostgreSQL via Prisma en production, tout en intégrant un référentiel en mémoire pour les sessions de démonstration autonomes.
Les visiteurs de portfolio évaluent les applications dans des conditions réseau variables. L'architecture bimode garantit que pointage, fiches adhérents et entraînements restent testables sans subir de démarrage à froid de la base de données.
06 / ENSEIGNEMENTS & RETOUR D'EXPÉRIENCE
Ce que ce projet a démontré
Application des Frontières d'Autorisation au Niveau des Routes
Le développement de Gym CRM a confirmé que la sécurité d'un logiciel de gestion repose sur le filtrage des routes API plutôt que sur le masquage de composants côté client. Vérifier le rôle sur chaque requête et renvoyer un statut HTTP 403 Forbidden aux jetons non autorisés prévient les failles IDOR et protège les données membres.
Fiabilisation des Fonctions IA par Replis Déterministes
Dépendre d'un LLM tiers pour des fonctionnalités courantes expose l'application à des latences, des dépassements de quota et des coupures réseau. Associer Gemini à une validation Zod et à des gabarits déterministes par règles garantit des protocoles sportifs et nutritionnels fiables en toute circonstance.
Déploiement direct accessible en temps réel sur Vercel
Consultez l’implémentation et son historique.
Consultez les mises en page dans les captures et la démo.
Découvrez l’architecture et les choix de cette étude de cas.
Explorer l'Application en Direct
Accédez immédiatement au tableau de bord et aux fonctionnalités dans un environnement de test sécurisé.
🔒 Environnement en lecture seule · Données de test
OPÉRATIONS & DATA ANALYTICS
Intéressé par les outils opérationnels ou les tableaux de bord analytiques ?
Je serais ravi d'échanger sur la structuration des flux de fréquentation, la modélisation relationnelle de données ou des opportunités en développement logiciel.
Vous souhaitez adapter un système similaire pour votre établissement ? Découvrir notre offre de logiciel pour salle de sport →