Tous les projets

Plateforme2025

Community Platform

Une plateforme unique où une communauté religieuse résidentielle gère sa vie quotidienne partagée : réservation des voitures communes, inscription au repas du dimanche, publication du bulletin hebdomadaire et envoi des demandes de maintenance.

Freelance - conception, developpement full-stack et deploiement

Tableau de bord d'un membre : prochain repas du dimanche, menu du jour, statistiques de la communaute, resume du bulletin hebdomadaire et activites a venir.
Tableau de bord d'un membre : prochain repas du dimanche, menu du jour, statistiques de la communaute, resume du bulletin hebdomadaire et activites a venir.

La communauté fonctionne sur des ressources partagées : quelques véhicules, un repas du dimanche, un bulletin hebdomadaire, des espaces communs à entretenir. Tout cela se coordonnait par email et sur un cahier papier, d'où des doubles réservations, des inscriptions oubliées et une information qui touchait certains membres et pas d'autres. Community Platform réunit ces flux dans une seule application web, accessible à chaque membre, avec un système de rôles qui distingue les membres ordinaires des personnes qui administrent les véhicules, les repas et la communication. Elle est en production depuis décembre 2025.

Le problème

Réserver une voiture communautaire passait par un email ou une ligne sur un cahier, sans vue partagée de qui avait quel véhicule et quand : deux personnes se présentaient régulièrement pour la même voiture. Les inscriptions au repas du dimanche se collectaient à la main et se perdaient facilement. Le bulletin hebdomadaire était assemblé et diffusé manuellement, et les problèmes de maintenance dans les espaces communs se signalaient à l'oral, puis s'oubliaient.

L’approche

J'ai cartographié les quatre flux récurrents (véhicules, repas, bulletin, maintenance) et je les ai construits comme des modules d'une seule application Laravel, avec une seule connexion et un seul modèle de rôles. Le planning des véhicules en est le cœur : une grille partagée qui montre chaque voiture par heure, rafraîchie toute seule, où réserver un créneau se fait en un clic et où le système refuse un créneau déjà pris. Les tâches récurrentes, comme ouvrir les quatre prochains repas du dimanche ou fermer les inscriptions le samedi soir, s'exécutent seules sur une planification, sans que personne ait à y penser.

Le résultat

  • La communauté gère ses véhicules, ses repas, son bulletin et ses demandes de maintenance via la plateforme depuis décembre 2025.
  • Les réservations de voiture sont dans un planning partagé que tout le monde voit, au lieu d'emails éparpillés, et le système bloque une double réservation au moment où elle se produit.
  • Les inscriptions au repas du dimanche et le bulletin hebdomadaire se gèrent dans l'application : l'information est la même pour tous et rien n'est ressaisi.
  • Les demandes de maintenance sont suivies de l'envoi à la résolution, avec un statut et une personne assignée, au lieu d'être signalées à l'oral.

Fonctionnalités clés

  • Planning véhicules partagé : grille heure par heure de chaque voiture, qui se rafraîchit toute seule, un clic pour réserver ou annuler un créneau, avec une lecture claire de ce qui est libre, pris par quelqu'un d'autre, ou à soi.
  • Pas de double réservation : le système refuse un créneau qui vient d'être pris par un autre membre, même quand deux personnes essaient en même temps.
  • Accès par rôle : chaque profil de membre (par exemple santé, formation, chauffeur) ne peut réserver que les catégories de véhicules qui lui sont autorisées.
  • Repas du dimanche : les quatre prochains dimanches s'ouvrent automatiquement, les membres s'inscrivent eux-mêmes avec leurs invités, et les inscriptions se ferment seules le samedi soir.
  • Bulletin hebdomadaire : édition modifiable avec les services de la semaine, les activités, les réflexions spirituelles et les anniversaires de la semaine calculés automatiquement ; publication en une action, lecture par tous les membres.
  • Menu de la semaine : midi et soir pour chaque jour, modifiable directement, avec le menu du jour affiché sur l'écran d'accueil.
  • Demandes de réparation et d'achat : un formulaire court pour toute réparation ou tout achat, puis une file admin avec statut, notes et personne assignée ; le demandeur est prévenu par email à chaque changement de statut.
  • Demandes d'adhésion : les personnes hors plateforme demandent un compte via un formulaire public ; un administrateur valide et le compte est créé.
  • Un email qui ne bloque jamais l'application : si une notification échoue, l'action passe quand même et l'échec est journalisé pour qu'un administrateur le revoie.
Ingénierie — Architecture, décisions et compromis

Architecture

Community Platform est une application Laravel 10 unique (PHP 8, MySQL) qui sert des pages Blade rendues côté serveur, déployée d'un seul tenant. L'authentification est par session ; l'autorisation repose sur un modèle de rôles maison stocké en colonne JSON sur l'utilisateur, vérifié par middleware, avec quatre rôles plateforme (admin, communication, membre, autre) distincts du profil fonctionnel du membre, qui est ce qui régit l'accès aux véhicules. La logique métier qui n'a pas sa place dans les contrôleurs vit dans des services dédiés (repas du dimanche, anniversaires, notifications, QR codes). Le planning des véhicules tient sa grille à jour via une petite API de polling auto-hébergée, ce sur quoi la production tourne ; une couche de broadcasting Laravel Echo et Pusher est câblée pour l'instantané et peut être activée sans toucher aux pages, et chaque appel de broadcast est encapsulé pour qu'un échec temps réel ne casse jamais la réservation sous-jacente. Les tâches récurrentes passent par le planificateur Laravel : trois commandes de maintenance (générer les prochains repas, fermer les inscriptions, purger les anciennes notifications) plus un worker de file d'attente sur base de données que le planificateur relance chaque minute, ce qui évite d'avoir un processus worker permanent sur le serveur. L'email sortant passe par un wrapper qui capture chaque échec d'envoi, l'enregistre dans une table dédiée, et laisse la requête aboutir.

Défis d’ingénierie

  • Deux membres qui réservent la même voiture à la même seconde. Vérifier la disponibilité puis insérer une réservation, c'est une situation de course. J'ai encapsulé la réservation dans une transaction avec un verrou de ligne sur le véhicule et ajouté un index unique en base sur le créneau actif : la seconde écriture est rejetée par la base elle-même et l'utilisateur reçoit un message clair "vient d'être pris" au lieu d'un chevauchement silencieux.
  • Le planning clignotait à chaque rafraîchissement. La grille était rechargée et re-rendue sur un minuteur, ce qui la faisait clignoter. J'ai centralisé la récupération des données dans une source unique qui met la grille à jour sur place, pour qu'une nouvelle réservation apparaisse sans redessiner toute la table.
  • Tenir la grille à jour sans dépendre d'un service temps réel. Pusher ajoute une dépendance externe qui n'est pas garantie sur place : la production fait donc tourner le planning sur une API de polling auto-hébergée ; la couche Echo/Pusher reste dans le code, activable au besoin, et chaque appel de broadcast est encapsulé pour qu'un échec temps réel ne casse jamais la réservation sous-jacente.
  • Des tâches qui dépendent de la mémoire de quelqu'un. Ouvrir les prochains repas et fermer les inscriptions étaient manuels. Les passer en commandes artisan planifiées, et faire tourner la file d'attente depuis le planificateur, a rendu la partie récurrente de l'application autonome.

Décisions techniques

  • Colonne de rôles JSON maison plutôt qu'un package de permissions complet. La communauté a un jeu de rôles réduit et stable. Une colonne roles en JSON sur l'utilisateur avec une vérification par middleware suffit, sans le poids de schéma et de requêtes d'une librairie de permissions générale, et garde les rôles plateforme bien séparés du profil fonctionnel qui pilote l'accès aux véhicules.
  • Blade rendu côté serveur plutôt qu'un front-end séparé. Un seul développeur, une seule cible de déploiement, un public qui a surtout besoin de formulaires et de listes. Blade avec un peu de JavaScript sur le planning se livre plus vite et s'héberge et se transmet bien plus simplement qu'une API plus une application monopage.
  • Polling en production plutôt qu'un service temps réel hébergé. Le planning doit refléter les réservations des autres en quelques secondes, pas en millisecondes. Un endpoint de polling auto-hébergé y suffit, sans compte tiers, sans coût supplémentaire et sans rien qui puisse tomber ; le chemin Echo/Pusher reste prêt pour le jour où l'instantané vaudra la dépendance.
  • File d'attente en base et worker piloté par le planificateur plutôt qu'un service de file dédié. L'email part de façon asynchrone pour qu'un serveur SMTP lent ne bloque jamais un membre, mais lancer le worker depuis le planificateur évite d'ajouter un processus supervisé (ou une dépendance Redis) sur un serveur modeste.

Stack

  • Laravel 10
  • PHP 8
  • MySQL
  • Blade
  • JavaScript
  • Laravel Sanctum
  • DomPDF
  • Taches planifiees (cron)
  • File d'attente base de donnees
  • Laravel Echo + Pusher (temps reel, optionnel)

Freelance - conception, developpement full-stack et deploiement — Une communaute religieuse residentielle (anonymise) (2025)

Projet suivantAlouwato