Vue d'ensemble
Fit Five Brussels est une application desktop développée en Python avec Tkinter. Elle sert de borne de réservation autonome pour un centre de football à 5, gérant l'ensemble du parcours client : de la sélection du terrain jusqu'à la confirmation par email avec reçu PDF.
Flux utilisateur
Modules principaux
| Fonction | Techno | Rôle |
|---|---|---|
| ouvrir_reservation() | tkinter + MySQL | Calendrier, sélection horaire, calcul prix dynamique |
| afficher_connexion() | tkinter + MySQL | Login et inscription, protection anti-doublon |
| afficher_paiement() | Flask + Stripe | Session Stripe, polling de statut |
| envoyer_confirmation_client() | SMTP + ReportLab | Génération PDF et envoi email avec pièce jointe |
| ouvrir_annulation() | tkinter + MySQL | Consultation et annulation des réservations futures |
| ouvrir_admin() | tkinter + MySQL | Dashboard admin, stats CA et codes utilisés |
Architecture
L'application repose sur une architecture client-serveur légère. Le client est l'application Tkinter (borne physique). Le serveur de paiement est un processus Flask local qui fait le pont avec l'API Stripe. La base de données MySQL est hébergée sur AlwaysData.
# Connexion DB avec reconnexion automatique def get_cursor(): global db, cursor try: if db is None or not db.is_connected(): connecter_db() db.ping(reconnect=True, attempts=3, delay=2) return cursor except Exception as e: print(f"Erreur : {e}") return None
Connexion Stripe
response = requests.post(
"http://localhost:5000/create-session",
json={"prix": prix_total, "terrain": terrain, "email": email},
timeout=5
)
data = response.json()
webbrowser.open(data["url"])
verifier_paiement(data["session_id"])
Base de données
MySQL hébergée sur AlwaysData. Deux tables principales : users pour les comptes et reservations pour les créneaux. Connexion via mysql-connector-python avec reconnexion automatique en cas de timeout.
DB_CONFIG = {
"host": "mysql-bebless.alwaysdata.net",
"user": "bebless",
"database": "bebless_tfe_foot",
"auth_plugin": "mysql_native_password",
"connection_timeout": 10
}
Réservation
Le module de réservation gère la sélection interactive du terrain, de la date et de l'horaire. Les créneaux déjà pris s'affichent en rouge, les créneaux libres en vert. Le prix est calculé dynamiquement selon le terrain, le nombre de joueurs et la tranche horaire.
Calcul de prix
PRIX_BASE = 60 # EUR TERRAIN_COEF = {"T1": 1.0, "T2": 1.1, "T3": 1.15} JOUEURS_COEF = {10: 1.0, 8: 0.85, 6: 0.7} supplement = 20 if h >= 20 else 10 if h >= 18 else 0 prix = round(PRIX_BASE * coef_t * coef_j + supplement, 2)
Anti-doublon
SELECT terrain FROM reservations WHERE email = %s AND date_resa = %s AND horaire = %s
Paiement Stripe
Le paiement passe par un micro-serveur Flask local qui dialogue avec l'API Stripe. Ce découplage garde la clé secrète côté serveur. Une fois le paiement validé, la réservation est insérée en DB.
Emails & PDF
À chaque réservation confirmée, deux emails sont envoyés : une alerte admin et une confirmation client avec reçu PDF généré à la volée par ReportLab.
| Champ PDF | Description |
|---|---|
| CLIENT | Nom et email du réservant |
| TERRAIN / DATE | Identifiant terrain et date de séance |
| HORAIRE | Plage horaire (début → fin calculée) |
| PRIX | Montant total payé en EUR |
| CODE | Code d'accès à 4 chiffres (surligné en vert) |
with smtplib.SMTP("smtp.gmail.com", 587) as server: server.starttls() server.login(GMAIL_USER, GMAIL_APP_PASSWORD) server.send_message(msg) os.remove(pdf_path) # nettoyage fichier temp
Administration
L'interface admin est accessible depuis l'écran d'accueil via un mot de passe. Elle affiche les réservations du mois en cours avec le CA total et le taux d'utilisation des codes d'accès.
Schéma DB
Base de données MySQL — bebless_tfe_foot
Installation
Prérequis : Python 3.10+, pip, accès internet pour la base MySQL.
Dépendances
pip install mysql-connector-python tkcalendar \
Pillow requests flask stripe \
reportlab
Lancement
# Terminal 1 — Serveur de paiement python server_paiement.py # Terminal 2 — Application principale python main.py