📄 DOCUMENT MAÎTRE : OXA SPORTS (V2.0) Spécifications Fonctionnelles & Prompts d'Implémentation pour Claude Code PARTIE 1 : VISION ET IDENTITÉ DU PROJET OXA SPORTS est la première plateforme SaaS B2B2C "Mobile-First" dédiée aux clubs de sports canins (Canicross, Agility, Éducation, etc.). C'est un écosystème 3-en-1 : ERP Associatif : Gestion administrative, membres, cotisations, et surtout suivi sanitaire strict (vaccins). Espace Collaboratif : Outils de productivité internes (Drive, Chat, plannings) pour les bénévoles. Créateur No-Code : Générateur de site web public pour la vitrine du club. PARTIE 2 : ARCHITECTURE FONCTIONNELLE DÉTAILLÉE 1. Le Socle Obligatoire : OxaClub Adaptation Topographique : Mode Terrain Fixe : Gestion des zones clôturées, du gros matériel, accès autonomes. Mode Outdoor : Points de rendez-vous GPS (Google Maps/Waze), tracés GPX, suivi "Live Tracking" de sécurité. Module Sanitaire "Bloquant" : Suivi des vaccins (CHPPiL, Rage, Toux du chenil). Un chien dont les vaccins sont périmés est automatiquement bloqué lors du pointage des présences aux entraînements. Le Site Builder (No-Code) : Une page publique (/club/nom-du-club) éditable en mode "WYSIWYG" (cliquer-pour-modifier) par l'Admin ou le Président. Page RGPD Automatique : Mention des données stockées, durée de conservation légale, droit à l'oubli. 2. Le Module de Collaboration : Les Commissions Commissions Personnalisées : Créées par l'Admin (ex: Travaux, Événementiel). OxaChat : Messagerie instantanée type Messenger propre à chaque commission. OxaDrive : Espace de stockage partagé, soumis à un quota strict de 1 Go par commission. Commission Native "Entraînements" : Obligatoire et ineffaçable. Permet la création du calendrier des séances et l'attribution des rôles opérationnels (Poseur, Chronométreur, Coach). 3. Les Options Payantes (Add-ons) 🎓 OxaSchool : Pédagogie. Gestion des "Galops canins" (niveaux Bronze, Argent, Or), carnets de progression digitaux pour les enfants, gestion des autorisations parentales. ❤️ OxaCare : Santé. Suivi de la courbe de poids, hydratation, rappels automatiques (vermifuges, ostéo), journal post-effort. 🛍️ Boutique : E-commerce. Vente de matériel club/croquettes, gestion des stocks, Click & Collect. PARTIE 3 : HIÉRARCHIE DES RÔLES ET GOUVERNANCE (RBAC) Niveau Éditeur (Le Chef d'Entreprise) SuperAdmin (Oxa Sports) : Gère l'infrastructure. Crée les clubs, modifie les abonnements, gèle un espace (bloque l'accès pour non-paiement), active manuellement les options payantes. Accès au Chat B2B pour discuter avec les Présidents. Niveau Direction du Club Président / Vice-Président : Gestion souveraine. Édite le site public, attribue les rôles, discute avec le SuperAdmin via le Chat B2B, accède à la facturation Oxa Sports. Administrateur Technique : Configure l'espace (couleurs, logos), crée les commissions. Trésorier : Rôle financier. Édite les factures PDF pour les membres (cotisations, boutique). Accès partagé à la facturation B2B. Secrétaire : Gestion administrative pure (validation manuelle des licences, relances sanitaires). Niveau Opérationnel Responsables : Directeur OxaSchool, Responsable OxaCare, Responsable Boutique. Entraîneurs / Moniteurs : Gestion des présences sur le terrain (Mobile-First, mode hors-ligne). Membres / Enfants : Accès profil, gestion des chiens, inscriptions. PARTIE 4 : MODÈLE ÉCONOMIQUE ET FACTURATION (Zéro Stripe) Aucun flux financier automatique n'est intégré au code. La logique métier repose sur des booléens validés manuellement. 1. Flux B2B (Oxa Sports -> Club) Tarifs Annuels : Micro (80€), Active (180€), Grande (300€), Club (360€), Premium (500€). Options : School (+100€), Care (+50€), Shop (+80€). Process : Le SuperAdmin envoie un lien de paiement via Shine sur le Chat B2B. Une fois l'argent reçu, le SuperAdmin passe is_frozen = false et is_school_active = true dans son back-office. 2. Flux B2C (Club -> Membre) Process : Le membre paie le club (virement/chèque). Le Trésorier valide l'encaissement dans le logiciel et génère un reçu/facture PDF avec le logo du club. PARTIE 5 : INSTRUCTIONS POUR CLAUDE CODE (CLI) Note : Ces prompts doivent être copiés-collés directement dans le terminal de Claude Code. Ils sont séquentiels et incluent l'architecture MVC et la base de données. Prompt 1 : Initialisation & Modèle de Données (Fondations) "Tu agis en tant que Lead Backend Developer pour le projet SaaS 'OXA SPORTS'. Utilise Node.js, Express, et PostgreSQL (avec Prisma ou Sequelize). Crée la structure de dossiers MVC classique : /config, /controllers, /core/middlewares, /models, /routes, /services. Génère le schéma de base de données complet. J'ai besoin des entités suivantes avec leurs relations : SuperAdmin, Club (champs : plan_type, is_frozen, is_school_active, is_care_active, is_shop_active, mode_terrain, mode_outdoor), User (lié à un Club, avec un système de rôles basé sur un Enum ou une table pivot), Dog (lié à un User, multi-chiens possibles), et Vaccine (lié à Dog, avec date_expiration et type : CHPPiL, Rage, TouxChenil). Implémente le script de seed (seed.js) avec un profil SuperAdmin (admin@oxasports.com), un Club Actif, un Club Gelé, et deux Users avec des chiens (un chien à jour, un chien avec vaccin périmé)." Prompt 2 : Middlewares de Sécurité & RBAC "Dans le projet 'OXA SPORTS', implémente les middlewares de sécurité dans le dossier /core. Crée checkClubStatus.js : Ce middleware doit intercepter TOUTES les requêtes d'un club. Si club.is_frozen est true, il retourne une erreur 403 'Espace Gelé', sauf pour les routes publiques ou la route de facturation du Président. Crée requireRole.js : Un middleware RBAC dynamique pour vérifier si l'utilisateur possède le bon rôle (ex: Trésorier, Président, Secrétaire, Moniteur). Implémente la logique d'interdiction sanitaire : dans le contrôleur de gestion des Séances d'entraînement, un membre ne peut inscrire son chien QUE SI la date du jour est inférieure à la date_expiration de tous les vaccins obligatoires du chien." Prompt 3 : Module Commissions, Drive et Chat "Développe le module 'Commissions' pour OXA SPORTS. Modélise les tables Commission, Message (pour le Chat) et DriveFile. Assure-toi que lors de la création d'un club, une commission 'Entraînements' est automatiquement instanciée et marquée comme non-supprimable. Crée le service DriveService.js gérant l'upload de fichiers. Ce service doit OBLIGATOIREMENT interroger la base de données pour sommer la taille (en octets) des fichiers de la commission en cours. Si l'upload du nouveau fichier fait dépasser le quota strict de 1 Go (1073741824 bytes), l'upload est rejeté avec une erreur 400. Crée un websocket basique (Socket.io) pour le système OxaChat des commissions." Prompt 4 : Outils Financiers (B2B & B2C) "Implémente la logique de facturation manuelle d'OXA SPORTS (Zéro Stripe). Crée un SuperAdminController avec une méthode permettant d'uploader une facture PDF (générée via Shine) vers un Club et de basculer ses flags d'options (is_school_active, etc.). Crée un TreasurerController (accessible uniquement au rôle Trésorier). Utilise une librairie comme pdfkit dans le dossier /helpers pour générer une facture PDF à la volée lorsqu'un Trésorier encaisse la cotisation d'un membre. Le PDF doit inclure le logo du club, le montant, et le nom du membre. Crée la table StrategicThreads pour le 'Chat B2B' entre le SuperAdmin et les Présidents de clubs." Prompt 5 : Créateur de Site Web (No-Code Public) "Développe le 'Site Builder' d'OXA SPORTS. Crée un routeur public qui sert les pages via l'URL /club/:clubSlug. Modélise une table PublicPage stockant une structure JSON (Hero, Textes, Images). Côté frontend (crée un fichier HTML/JS simple de test dans /public), implémente une logique où, si l'utilisateur connecté a le rôle Président ou Admin, les balises textuelles deviennent contentEditable. Ajoute un bouton 'Sauvegarder' qui fait un PUT de la structure JSON modifiée vers l'API. Si l'utilisateur est un simple visiteur, affiche la page en lecture seule." Prompt 6 : Offline-First (PWA) pour le Terrain "OXA SPORTS doit fonctionner en mode forêt. Crée un Service Worker (sw.js) dans le dossier /public. Configure-le pour mettre en cache les requêtes de la route API GET /api/sessions/today (liste des chiens et membres prévus à l'entraînement du jour). Implémente une logique de synchronisation différée (Background Sync) : si un 'Moniteur' pointe une présence (POST /api/sessions/:id/attendance) alors qu'il n'a pas de réseau, la requête est stockée dans IndexedDB et envoyée automatiquement dès le retour du réseau."