My Motoclub
Le contrôle d’accès d’un événement, entre les mains de ceux qui sont à l’entrée.
iOS · Android

Liste des événements 
Formulaire d’engagement 
Laissez-passer 
Engagements pilotes 
Liste des invités 
Rôles d’accès 
Licence numérique
L’accès à un événement de sport mécanique n’est pas une simple liste. Pilotes licenciés, accompagnants, officiels, équipes de stand et spectateurs sont autorisés dans des zones différentes — vérifiés par quelqu’un à l’entrée, avec un téléphone et sans temps à perdre.
Définition du produit, design d’interface, architecture applicative, application Flutter pour les deux stores, backend et modèle de données Supabase, règles d’accès, de licences et de vérification technique, impression thermique, notifications — et les mises à jour successives depuis.
- App Store
- Google Play
Les deux fiches sont en cours de publication sous le nom actuel de l’application. L’application, elle, tourne déjà.
- iOS
- Android
- Application
- Flutter
- Dart
- BLoC
- Clean Architecture
- Backend
- Supabase
- PostgreSQL
- Row Level Security
- Postgres RPC
- Infrastructure
- Firebase Cloud Messaging
- Supabase Storage
- Stratégie produit
- Design UI/UX
- Architecture technique
- Développement mobile
- Développement backend
- Conception de la base de données
- Intégrations
- Tests & assurance qualité
- Mise en production
- Maintenance
Ce que ça fait
Chaque élément répond à une tâche réelle le jour de l’épreuve, pas à une liste de fonctionnalités. Le site du produit les détaille un par un.
Événements
Créés avec leur date, leur capacité, leurs classes et leurs tarifs, puis comptant les entrées en direct à mesure que le public passe la porte.
Engagements & classes
Les pilotes s’inscrivent eux-mêmes — nom, âge, numéro de pièce d’identité, groupe sanguin, contact d’urgence — en auto ou en moto, en proto, promosport, maxisport ou supersport. Un copilote peut être ajouté ensuite depuis la page de l’événement.
Droits & clôture
Le droit d’engagement et le prix du transpondeur de la classe choisie sont affichés avant l’inscription, qui ne se termine qu’une fois acceptés par le pilote. Chaque événement porte une date de clôture, après laquelle le formulaire se ferme seul.
Laissez-passer QR signés
Chaque laissez-passer porte un code signé cryptographiquement, validé côté serveur et utilisable une seule fois. Une capture d’écran ne fait pas entrer une deuxième personne.
Scan à l’entrée
L’appareil photo lit le code et répond accepté ou refusé d’un seul geste, motif à l’appui. Pensé pour une file à l’entrée, pas pour un bureau.
Impression de bracelets
Une imprimante thermique Bluetooth ou USB s’appaire au téléphone et imprime le bracelet d’accès sur place, au fur et à mesure des admissions.
Vérification des véhicules
Suspension, direction, roues, pneus, batterie et permis de conduire passés en revue à côté de la voiture, avec la marque, le modèle et la puissance déclarée relevés dans la foulée. Le commissaire technique et le participant signent tous deux sur l’appareil, puis la voiture reçoit son groupe.
Licences numériques
Délivrées, renouvelées, révoquées et rétablies dans l’application, avec l’historique complet, les dates de validité et le contrôle des numéros de course.
Enregistrement des invités
Les invités s’enregistrent eux-mêmes, leurs accompagnants rattachés au participant qui les amène, les numéros repris directement des contacts, et chaque personne décomptée de la capacité de l’événement.
Rôles d’accès
Neuf permissions distinctes — événements, licences, utilisateurs, scan, tarifs, vérification manuelle, vérification des voitures, attribution des groupes et notifications — accordées personne par personne.
Notifications push
Une licence approuvée, une nouvelle invitation, un événement modifié : pilotes et staff sont prévenus au lieu d’être relancés.
Exports & archives
Listes d’invités, licences et annuaires des membres exportés en CSV ou PDF et partagés directement depuis le téléphone.
Une entrée, retracée
Un pilote se présente à l’entrée, son laissez-passer sur son téléphone. Voici tout ce qui se passe entre le moment où la caméra le voit et celui où la barrière s’ouvre — ou non.
Lu dans scan_ticket_page.dart, participation_repository.dart et la liste des fonctions Supabase. Chaque nom ci-dessous figure tel quel dans le code source.
- 01
Le laissez-passer est sur le téléphone du pilote
Le code ne porte que trois champs : quel événement, quel billet, quel numéro de téléphone. L’écran passe à la luminosité maximale pour rester lisible en plein soleil, et le système reçoit l’ordre de refuser toute capture d’écran.
- qr_flutter
- screen_protector
- FLAG_SECURE
- 02
Un commissaire le scanne
La caméra lit le code et le téléphone vibre dès qu’il tient quelque chose — avant tout verdict. Cette première vibration dit au commissaire de ne plus bouger plutôt que de continuer à viser, et c’est l’essentiel de ce qui fait avancer une file.
- mobile_scanner
- 03
Deux contrôles avant même le réseau
Un code auquel il manque l’un de ses trois champs est refusé sur place, tout comme un laissez-passer parfaitement valide mais destiné à un autre événement. Ni l’un ni l’autre ne demande un aller-retour : les erreurs courantes reçoivent une réponse immédiate.
- eventId
- ticketCode
- phoneNumber
Ce qui s’affiche en cas de refus
« Invalid ticket » ou « Ticket does not belong to this event ». Ce sont deux refus, et tous deux sont consignés.
- 04
L’événement est relu depuis le serveur
La décision ne repose jamais sur ce que le téléphone qui scanne a en mémoire. L’événement est rechargé avec ses invitations, leurs accompagnants, ses équipes, leurs membres et son journal de scans — le tout sous row-level security, si bien que les droits du commissaire décident de ce qui revient.
- events
- event_invites
- event_invite_companions
- event_teams
- event_team_members
- event_scan_logs
Ce qui s’affiche en cas de refus
Au bout de douze secondes, « Verification timeout ». L’échec est fermé : un réseau lent ne devient jamais une barrière ouverte.
- 05
Le porteur est identifié
Le code du billet et le numéro de téléphone sont confrontés aux invitations, aux accompagnants qui y sont rattachés et aux membres d’équipe. Si ce numéro correspond à un compte enregistré, le nom du compte remplace celui saisi sur l’invitation — le commissaire lit donc le vrai nom de la personne.
- profiles
- 06
L’historique du billet est vérifié
Chaque scan antérieur de ce code est examiné. Une seule validation précédente, ou une seule dérogation de superviseur, et le laissez-passer est épuisé. C’est ce qui empêche la capture d’écran d’un QR valide de faire entrer trois amis.
- event_scan_logs
Ce qui s’affiche en cas de refus
« Ticket already used » — affiché avec qui l’a scanné et quand, pour que le commissaire tranche sur place.
- 07
La règle de licence est posée à la base de données
Pour un concurrent, la licence doit être valide le jour de l’événement. Cette règle est une procédure stockée, pas du code applicatif : elle ne se discute pas à l’entrée et une ancienne version de l’application ne peut pas la contourner.
- participation_entry_check
Ce qui s’affiche en cas de refus
« Licence not valid on the event date », avec le motif renvoyé par la base.
- 08
Le verdict, et la trace
Accordé ou refusé, avec la liste des accompagnants auxquels le porteur a droit. Une vibration légère pour l’acceptation, forte pour le refus, afin de le sentir sans regarder. Puis chaque tentative est consignée — refus compris, et une dérogation de superviseur enregistrée sous son propre statut plutôt que discrètement comme une réussite.
- record_scan_log
- success
- failed
- overriden
Détail technique
Relevé dans le code source du projet, pas dans une plaquette commerciale.
- Architecture
- Clean Architecture avec gestion d’état BLoC, structure orientée fonctionnalités, pattern repository
- Backend
- Supabase — PostgreSQL avec politiques de sécurité au niveau des lignes et RPC serveur pour les règles de licence et d’admission
- Modèle de données
- 26 migrations versionnées couvrant le cycle de vie des licences, l’historique des révocations, les renouvellements, les dates de clôture, l’acceptation des droits, les impressions de bracelets, l’admission manuelle et le temps réel
- Capacités de l’appareil
- Scan par appareil photo, génération de QR codes, contrôle de la luminosité, protection contre les captures d’écran, impression thermique Bluetooth et USB, génération de PDF, import de contacts
- Notifications
- Firebase Cloud Messaging pour le push, avec notifications locales sur l’appareil
- Diffusion
- Une seule base Flutter pour iOS et Android ; version 1.5.1, build 59 à ce jour
Le contrôle d’accès d’un événement, entre les mains de ceux qui sont à l’entrée.
