ParkLigue — Réservation de Parking

Application web Laravel pour la gestion des places de parking de la Maison des Ligues (M2L).

PHP 8.3 Laravel 11 MySQL 8 Eloquent ORM Bootstrap 5 Vite
← Retour au portfolio

Présentation du Projet

🏢 Contexte

ParkLigue est une application web développée dans le cadre du BTS SIO SLAM, pour la Maison des Ligues (M2L). Le projet répond à un problème concret : éliminer le stationnement sauvage dans les parkings de l'organisation en permettant à chaque membre du personnel de réserver une place numérotée.

Réalisation en équipe du 09/03/2026 au 02/04/2026 au Campus Charles de Foucauld, Paris.

💻 Voir le code source GitHub

🎯 Objectifs

  • Permettre à chaque agent de réserver une place libre
  • Gérer automatiquement une file d'attente en cas de saturation
  • Offrir un espace administrateur complet
  • Automatiser l'expiration des réservations

🛠️ Environnement Technique

Visual Studio Code Composer Git / GitHub Vite Tailwind CSS v4

Architecture MVC Laravel

Le projet suit le patron Model-View-Controller de Laravel, avec une séparation claire entre la logique métier, les données et les vues Blade.

🌐 Requête HTTPNavigateur
🛣️ Routerroutes/web.php
⚙️ Controllerapp/Http/Controllers
📦 ModelEloquent ORM
🗄️ MySQLBase de données
📄 Vue Bladeresources/views
⚙️ ControllerRetourne la vue

📁 Structure du projet

projet_parking/
├── app/
│   ├── Http/Controllers/
│   │   ├── ReservationController.php
│   │   ├── AdminController.php
│   │   └── Auth/
│   └── Models/
│       ├── User.php
│       ├── Place.php
│       ├── Reservation.php
│       └── PlaceListeAttente.php
├── database/migrations/
├── resources/views/
│   ├── dashboard.blade.php
│   ├── admin/
│   └── auth/
└── routes/web.php

🔒 Authentification

Utilisation du système d'authentification intégré de Laravel avec une couche de validation administrative : chaque nouveau compte doit être approuvé par l'administrateur avant de pouvoir accéder à l'application.

⚠️ Sécurité : Un middleware vérifie que le compte est validé à chaque requête. Les comptes non approuvés sont redirigés vers une page d'attente.

Fonctionnalités Développées

🖥️ Tableau de Bord Utilisateur

Le dashboard est le cœur de l'application pour l'agent. Il affiche en temps réel l'état de sa réservation.

📋 États possibles

  • Aucune réservation : bouton "Réserver une place"
  • Place attribuée : affichage du numéro + date d'expiration + bouton de clôture
  • En file d'attente : affichage du rang dans la file

📜 Historique

Chaque utilisateur dispose d'un historique complet de ses réservations passées avec les dates de début et de fin.

🎲 Attribution Aléatoire des Places

⚙️ Logique métier

Lorsqu'un utilisateur fait une demande, le système :

  1. Recherche toutes les places avec statut actif et non réservées
  2. En sélectionne une aléatoirement via inRandomOrder()->first()
  3. Crée une nouvelle Reservation liée à l'utilisateur et la place
  4. Calcule la date d'expiration selon le paramètre admin

📝 Extrait logique

// Cherche une place libre
$place = Place::where('statut', 'actif')
    ->whereDoesntHave('reservations', function($q) {
        $q->whereNull('date_fin');
    })
    ->inRandomOrder()
    ->first();

if (!$place) {
    // → Mise en file d'attente
}
⏳ Gestion Automatique de la File d'Attente

Si aucune place n'est disponible, l'utilisateur est automatiquement placé en file d'attente. Son rang est calculé en fonction de la date de sa demande.

🔄 Promotion automatique

À chaque libération de place (expiration ou clôture manuelle), le système :

  1. Recherche le premier utilisateur en attente (par date_demande)
  2. Lui attribue automatiquement la place libérée
  3. Le retire de la table place_liste_attentes
  4. Crée une nouvelle réservation en son nom

⏰ Expiration automatique

La durée de réservation est un paramètre configurable par l'administrateur (en heures). À l'expiration, la réservation est marquée comme terminée et la file d'attente est consultée.

👑 Espace Administrateur

L'administrateur dispose d'un panneau dédié avec accès complet à toutes les entités.

🗂️ Gestion des entités

  • Utilisateurs : validation des comptes, liste, suppression
  • Places : ajout, activation/désactivation, suppression
  • Réservations : visualisation globale, clôture manuelle
  • File d'attente : visualisation et gestion
  • Historique : consultation de toutes les réservations passées

⚙️ Paramètre de durée

L'administrateur peut modifier à tout moment la durée maximale d'une réservation. Ce paramètre est stocké en base et appliqué à toutes les nouvelles réservations créées après modification.

Modèle de Données (MCD)

Le schéma comprend quatre entités principales reliées par des associations. Les migrations Laravel (Eloquent Code First) ont été utilisées pour générer la base MySQL.

👤 UTILISATEUR (users)
idBIGINTPK
nameVARCHAR
emailVARCHAR UNIQUE
passwordVARCHAR (hashed)
roleENUM
is_validatedBOOLEAN
created_atTIMESTAMP
🅿️ PLACE (places)
idBIGINTPK
numeroVARCHAR UNIQUE
statutENUM actif/inactif
created_atTIMESTAMP
↕ Une place peut avoir 0..n réservations
📋 RESERVATION (reservations)
idBIGINTPK
user_idBIGINTFK → users
place_idBIGINTFK → places
date_debutTIMESTAMP
date_finTIMESTAMP NULL
Table de jointure UTILISATEUR ↔ PLACE
⏳ PLACE_LISTE_ATTENTE
idBIGINTPK
user_idBIGINTFK → users
date_demandeTIMESTAMP
Un utilisateur = 0..1 entrée en file

🔗 Relations Eloquent

Fichier : app/Models/User.php

class User extends Authenticatable {

  public function reservations() {
    return $this->hasMany(Reservation::class);
  }

  public function listeAttente() {
    return $this->hasOne(
      PlaceListeAttente::class
    );
  }
}

Fichier : app/Models/Place.php

class Place extends Model {

  public function reservations() {
    return $this->hasMany(Reservation::class);
  }

  public function reservationActive() {
    return $this->hasOne(Reservation::class)
      ->whereNull('date_fin');
  }
}

Bilan Technique E6

Ce projet m'a permis de maîtriser le cycle complet d'une application web Laravel en conditions réelles :

💻 Code Source GitHub 📄 Fiche de Situation