TFE 2025-2026 — Institut INRACI Bruxelles

FITFIVE Brussels Booking System

Une borne de réservation intelligente pour terrain de football à 5. Réservez, payez et accédez à votre terrain en quelques clics. Développée en Python avec une base de données MySQL en temps réel.

Terrain de football à 5 indoor Fit Five Brussels
Terrain indoor // Bruxelles
3+
Terrains gérés
8k
Lignes de code
7
Modules fonctionnels
100%
Solo project

Fonctionnalités
clés

📅
01
Réservation intelligente

Sélection de terrain, date et horaire avec vérification en temps réel des disponibilités via MySQL. Anti-doublon intégré par email.

💳
02
Paiement Stripe

Intégration d'un serveur Flask local relié à l'API Stripe. Session de paiement sécurisée ouverte dans le navigateur avec polling automatique.

📧
03
Emails & PDF auto

Génération automatique d'un reçu PDF avec ReportLab, envoyé par Gmail SMTP avec le code d'accès unique au terrain réservé.

🔐
04
Authentification

Système d'inscription et de connexion sécurisé avec validation côté client et serveur. Stockage en base de données MySQL hébergée sur AlwaysData.

🎉
05
Forfaits événementiels

Pack Anniversaire (1h30, goûter inclus) et Team Building (3h, 2 terrains). Vérification des chevauchements avec les réservations existantes.

⚙️
06
Dashboard admin

Interface protégée par mot de passe. Vue complète des réservations du mois, chiffre d'affaires, codes utilisés. Tableau scrollable avec statistiques.

Stack technique
Python 3 Tkinter MySQL Flask Stripe API SMTP Gmail ReportLab Pillow tkcalendar AlwaysData
v1.0 — TFE 2025-2026

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.

Ce projet est un Travail de Fin d'Études réalisé à l'Institut INRACI Bruxelles en 2025-2026. Il représente une application complète et déployable, connectée à une base de données MySQL hébergée.

Flux utilisateur

01
Accueil
02
Réservation
03
Connexion
04
Paiement
05
Confirmation

Modules principaux

FonctionTechnoRôle
ouvrir_reservation()tkinter + MySQLCalendrier, sélection horaire, calcul prix dynamique
afficher_connexion()tkinter + MySQLLogin et inscription, protection anti-doublon
afficher_paiement()Flask + StripeSession Stripe, polling de statut
envoyer_confirmation_client()SMTP + ReportLabGénération PDF et envoi email avec pièce jointe
ouvrir_annulation()tkinter + MySQLConsultation et annulation des réservations futures
ouvrir_admin()tkinter + MySQLDashboard admin, stats CA et codes utilisés
Architecture

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.

Python
# 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
Le serveur de paiement Flask doit être lancé séparément avec server_paiement.py sur le port 5000 avant d'ouvrir l'application principale.

Connexion Stripe

Flask
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"])
Données

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.

Config
DB_CONFIG = {
    "host":           "mysql-bebless.alwaysdata.net",
    "user":           "bebless",
    "database":       "bebless_tfe_foot",
    "auth_plugin":    "mysql_native_password",
    "connection_timeout": 10
}
Module

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

Python
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

SQL
SELECT terrain FROM reservations
WHERE email    = %s
  AND date_resa = %s
  AND horaire   = %s
Module

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.

App
POST /create-session
Flask
Stripe Checkout
User
Paiement navigateur
App
Polling statut
Le polling vérifie GET /check-status/{session_id} toutes les 2 secondes jusqu'à obtenir le statut "succeeded".
Module

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 PDFDescription
CLIENTNom et email du réservant
TERRAIN / DATEIdentifiant terrain et date de séance
HORAIREPlage horaire (début → fin calculée)
PRIXMontant total payé en EUR
CODECode d'accès à 4 chiffres (surligné en vert)
Python
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
Module

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.

Le mot de passe admin est défini en dur dans le code source. Pour un déploiement en production, il faudrait stocker ce hash en base de données avec bcrypt.
Référence

Schéma DB

Base de données MySQL — bebless_tfe_foot

🗄 users — comptes joueurs
idINTClé primaire auto-increment
nomVARCHARNom complet du joueur
emailVARCHARAdresse email (UNIQUE)
mdpVARCHARMot de passe (min 12 caractères)
🗄 reservations — créneaux réservés
idINTClé primaire auto-increment
emailVARCHAREmail client (ref. users)
terrainVARCHAR(5)T1, T2 ou T3
joueursINT6, 8 ou 10 joueurs
date_resaDATEDate de la séance (format MySQL)
horaireVARCHAR(5)Heure de début — ex: 18:00
prixDECIMALMontant payé en EUR
codeINT(4)Code d'accès terrain
code_utiliseTINYINT0 = non utilisé · 1 = utilisé
Guide

Installation

Prérequis : Python 3.10+, pip, accès internet pour la base MySQL.

Dépendances

Terminal
pip install mysql-connector-python tkcalendar \
            Pillow requests flask stripe \
            reportlab

Lancement

Terminal
# Terminal 1 — Serveur de paiement
python server_paiement.py

# Terminal 2 — Application principale
python main.py
Mettez à jour les chemins vers les images (fond_accueil.png, map.png) dans le code pour correspondre à votre arborescence locale.
Développeur — Étudiant INRACI

BEBLESS
IKALABA

Étudiant en Informatique · Bruxelles, Belgique

Passionné de football et de technologie, j'ai conçu Fit Five pour répondre à un besoin réel : simplifier la réservation de terrains de foot à 5 en Belgique. Ce TFE combine mes deux univers, avec une application desktop complète — de la gestion de base de données à l'envoi d'emails automatisés avec PDF.

Python
88%
MySQL
75%
Tkinter / UI
80%
API / Intégrations
65%
5
BI
FIT FIVE — TFE 2025-2026

Étapes du projet

Avril 2025
Naissance du concept

Idée née l'année précédente — choix de l'idée Fit Five qui était initialement une application Power Apps. Identification du besoin : les centres de foot à 5 bruxellois manquent d'un système de réservation moderne et autonome.

Oct. 2025
Architecture & base de données

Migration vers Python + Tkinter pour la borne physique. Conception du schéma MySQL hébergé sur AlwaysData. Mise en place de la connexion avec reconnexion automatique et gestion des timeouts.

Nov. 2025
Module de réservation

Développement du calendrier interactif avec tkcalendar, logique de disponibilité en temps réel, calcul de prix dynamique et système anti-doublon.

Janv. 2026
Intégration Stripe & PDF

Création du micro-serveur Flask pour Stripe Checkout, polling de statut, génération automatique de reçus PDF avec ReportLab et envoi Gmail.

Avril 2026
Présentation TFE

Finalisation de l'interface, ajout des forfaits événementiels et du dashboard admin. Présentation et défense du TFE à l'Institut INRACI Bruxelles.

Email
beblessikalaba243@gmail.com
📍
Localisation
Bruxelles, Belgique
🎓
École
Institut INRACI — Bruxelles