Cabinet Martin – Portail web patient
Contexte du projet
Cabinet Martin est un projet scolaire réalisé dans le cadre de mon BTS SIO option SLAM. L'objectif était de concevoir et développer un portail web complet pour un cabinet médical fictif situé à Laval, regroupant deux médecins généralistes.
J'ai pris en charge l'intégralité du cycle de développement : analyse du besoin, modélisation de la base de données, développement back-end et front-end, correction de bugs et mise en production partielle sur SQL Server.
Fonctionnalités développées
Authentification & espace patient
Inscription avec vérification d'email via lien signé (SymfonyCasts), connexion sécurisée avec gestion des rôles Symfony Security, et tableau de bord patient affichant les rendez-vous à venir, l'historique des commandes et les informations personnelles.
Pharmacie en ligne
Catalogue de médicaments organisé par catégories, fiches produits détaillées avec indicateur de stock en temps réel, panier hybride (session pour les visiteurs anonymes, base de données pour les connectés) avec fusion automatique à la connexion.
Commandes & factures
Processus de paiement simulé, génération automatique des lignes de commande, décrémentation des stocks, email de confirmation et téléchargement de factures PDF sécurisé (DomPDF) — chaque patient ne peut accéder qu'à ses propres factures.
Prise de rendez-vous
Calendrier dynamique affichant une semaine de créneaux de 30 minutes (8h–18h, lundi–vendredi), sélection du médecin et du créneau, confirmation par email avec récapitulatif complet.
Stack technique
PHP · Symfony 7.3 · Doctrine ORM · Microsoft SQL Server · Twig · Bootstrap 5 · DomPDF · Symfony Mailer · Git / GitHub
Difficultés et solutions
Le projet m'a confronté à plusieurs problèmes concrets : des contraintes NOT NULL sur SQL Server résolues via des valeurs DEFAULT dans les migrations, un conflit CSS entre le thème MediLab et Bootstrap résolu par des classes personnalisées, et la perte du panier à la connexion corrigée grâce à un subscriber sur LoginSuccessEvent fusionnant la session avec la base de données.