Projet personnel · SaaS · En cours de développement

Un SaaS de location, pensé multi-tenant dès le premier module.

Nexora Rent est un projet personnel : un espace unique pour agences de location de voitures, avec isolation des données par agence. Le back-office d’exploitation est en grande partie en place ; paiement par carte et 2FA restent ouverts.

StatutProjet perso · en cours
RôleConception produit · full-stack
StackPHP 8.3 · Symfony 7.4 · MySQL

Surface 01

Espace agence

Interface Twig d’exploitation : flotte, clients, réservations, locations, contrats, paiements, facturation et maintenance.

Surface 02

Back-office SaaS

EasyAdmin pour l’opérateur de la plateforme : tenants, plans, comptes et suivi — séparé de l’espace agence.

IsolationMulti-tenant · filtre Doctrine
QualitéPHPUnit · PHPStan · GitHub Actions
LivraisonDocker · GitHub Actions

Captures de l’espace Twig, sur un tenant de démonstration. Le produit n’est pas figé.

Problème métier

Véhicules, clients, contrats et paiements vivent souvent dans des tableurs et des outils disjoints. Une agence a besoin d’un seul espace, tout en restant isolée des autres agences sur la même application.

Architecture

Monolithe modulaire, découpé en contextes métier (Domain / Application / Infrastructure / UI). Le multi-tenant n’est pas un add-on : chaque enregistrement métier porte l’agence, un filtre Doctrine isole les requêtes, le back-office plateforme contourne le filtre à dessein.

  1. TenantsAgences isolées (schéma partagé, tenant_id, sous-domaine ou compte)
  2. DomainesFlotte · Clients · Réservations · Locations · Contrats · Paiements · Facturation · Maintenance
  3. ApplicationPHP 8.3 · Symfony 7.4 LTS · Doctrine ORM 3 · Messenger · Redis
  4. UITwig + Stimulus (agence) · EasyAdmin 5 (plateforme) · PDF Dompdf · e-mail

Points forts

Multi-tenant dès le modèle

Isolation par filtre Doctrine et contexte de requête. Un agent ne voit que son agence ; l’opérateur SaaS gère les tenants à part.

Droits réels, pas un seul ROLE_ADMIN

Rôles agence (owner, manager, agent, comptable, flotte) et permissions par domaine, contrôlées par voters.

Découpage métier lisible

Chaque contexte a son dossier. Les contrats, la flotte ou l’abonnement SaaS ne se mélangent pas dans un Controller/ fourre-tout.

Barre de qualité d’un produit soigné

PHPStan, PHP CS Fixer, PHPUnit, lint Twig/YAML, CI GitHub Actions (MySQL + Redis), Docker Compose et healthcheck.

Encore ouvert

Projet personnel, pas un SaaS commercial fermé. Le back-office agence (opérations quotidiennes) est largement en place. Paiement par carte, double authentification et inspections de remise / retour restent à faire — volontairement dit ici.

Mon rôle

Seul : produit, modèle de données, Symfony, UI agence, back-office, tests et CI.

Livrables et résultats

Réalisé dans le cadre de ma mission

  • Back-office agence en place : tableau de bord, planning, réservations, locations, contrats, flotte, clients, paiements, factures, maintenance, rapports et paramètres.
  • Stack actuelle : PHP 8.3, Symfony 7.4, MySQL, Redis, EasyAdmin 5.
  • CI : analyse statique, tests et schéma Doctrine.
  • Reste ouvert : paiement par carte, 2FA et inspections de remise / retour.

Stack

Backend

  • PHP 8.3
  • Symfony 7.4
  • Doctrine ORM 3
  • MySQL 8
  • Messenger
  • Redis

Front

  • Twig
  • EasyAdmin 5
  • Stimulus
  • Turbo
  • Bootstrap 5

Livraison

  • Docker
  • PHPUnit
  • PHPStan
  • GitHub Actions
  • Dompdf

Autres études de cas