← Retour aux cas d'études
Architecture Métier & Dématérialisation Documentaire

Concevoir un module de Signature Électronique Simple pour baux locatifs et états des lieux sous Symfony

Les points clés de ce retour d'expérience :

  • Cadrage produit et niveau eIDAS : Implémentation d'une signature électronique simple avec collecte de preuves (OTP SMS, horodatage, adresse IP) répondant au besoin d'engagement contractuel sans surcoût de prestataire tiers certifié.
  • Découplage et mutualisation : Conception d'un composant frontend autonome SignablePdfRenderer et d'une tâche backend CreateContractSignatureTask réutilisés à l'identique pour les baux et les états des lieux.
  • Contrôle des flux d'envoi SMS : Verrouillage d'intervalle à 45 secondes pour prévenir le spam et sécuriser la consommation de crédits d'envoi.
  • Rendu vectoriel des paraphes : Intégration dans le chroot Dompdf de la typographie cursive Birthstone pour insérer le nom des signataires dans le PDF final.

1. Exigences produit et problème d'origine

Sur notre plateforme de location, la formalisation du bail et de l'état des lieux est une étape fondamentale. Historiquement, les utilisateurs devaient télécharger un PDF vierge, l'imprimer, le signer à la main puis le scanner ou se le remettre en main propre.

Ce fonctionnement générait de l'insatisfaction : retards de confirmation, contrats jamais signés et litiges difficiles à arbitrer pour le support faute de document daté et validé par les deux parties.

La décision produit exigeait de digitaliser l'intégralité de la chaîne d'accord. Pour y répondre, j'ai développé un module complet de signature dématérialisée intégré dans la messagerie sous Symfony.

Note importante et confidentialité : Pour respecter mes obligations de confidentialité et préserver la propriété intellectuelle, l'ensemble des extraits et exemples de code présentés ici a été entièrement recréé et anonymisé. De ce fait, des imprécisions ou de légères erreurs peuvent exister dans les exemples : le but de cet article est d'illustrer la démarche d'architecture et la réflexion technique, et non de fournir du code prêt à l'emploi.

2. Cadrage produit : Signature Simple vs Tiers de Confiance

Lors du cadrage avec le Product Owner, la question du niveau juridique s'est posée. Selon le règlement européen eIDAS, une signature qualifiée via un tiers de confiance certifié engendre un coût récurrent par signature et une lourdeur de parcours importante.

Côté produit, le besoin était d'établir un engagement clair et opposable de bonne foi entre l'hôte et le locataire, avec des preuves solides :

  • Vérification préalable de l'identité du signataire (parcours KYC Veriff).
  • Vérification du numéro de téléphone mobile avec confirmation par code OTP SMS à usage unique.
  • Enregistrement immuable des métadonnées (horodatage serveur, statut, téléphone, adresse IP).
  • Génération d'un document PDF scellé avec paraphe textuel manuscrit.

Le choix s'est donc porté sur une Signature Électronique Simple maîtrisée en interne.

3. Tableau comparatif : Avant / Après

Axe d'analyse Avant (Processus manuel) Après (Module Signature Symfony)
Parcours utilisateur Téléchargement PDF, impression papier, signature stylo. Visualisation interactive sur un Canvas html5, signature en 2 clics par OTP SMS.
Traçabilité des accords Aucune traçabilité dans la base de données. Entité Signature dédiée, statut horodaté et logs SMS.

4. Architecture globale du système

J'ai architecturé le système autour de trois couches complémentaires :

1. Consultation
Visualiseur Canvas Rendu PDF.js page par page dans la messagerie
→
2. Déclenchement
Demande de signature Vérification KYC & génération de l'OTP SMS
→
3. Validation OTP
Contrôle du code Passage de l'entité Signature à l'état VALIDATED
→
4. Scellement PDF
Génération Dompdf Insertion du paraphe manuscrit et date dans le PDF

5. Organisation des sous-articles techniques

Pour détailler la mise en œuvre technique sans alourdir cette vue globale, j'ai découpé les explications en deux articles spécifiques :

Approfondissement 1 - Workflow Backend & Sécurité MFA :
Découvrez comment j'ai conçu le cycle de validation par Task, sécuriser l'envoi des codes OTP avec limitation d'intervalle anti-spam et enregistrer les métadonnées de preuve sous Symfony.
👉 Lire l'article sur le Cycle de validation par Task et l'authentification MFA par OTP SMS →

Approfondissement 2 - Frontend Canvas PDF.js & Rendu Dompdf :
Découvrez la conception du composant TypeScript SignablePdfRenderer, le rendu multi-pages sur Canvas et la configuration sécurisée du chroot Dompdf pour les polices manuscrites vectorielles.
👉 Lire l'article sur le Rendu PDF interactif et les signatures manuscrites sous Dompdf →

6. Retours d'expérience et bénéfices

La conception modulaire de ce système a apporté des gains significatifs en termes d'architecture et de vélocité de développement :

  • Réutilisation transversale du modèle de données et du frontend : La généricité de l'entité Doctrine Signature (table de base de données dédiée) et du composant TypeScript SignablePdfRenderer a permis d'étendre la signature électronique aux états des lieux d'entrée et de sortie (inventoryArrival / inventoryDeparture) sans aucune modification du moteur de rendu ni duplication de code backend.
  • Standardisation du parcours utilisateur contractuel : L'ensemble des documents légaux de la plateforme (baux de location et états des lieux) partage désormais une expérience utilisateur unifiée et fluide pour le propriétaire et le locataire (lecture du document, génération du code OTP SMS, validation et scellement du PDF).
  • Maintenabilité et vélocité d'évolution : L'encapsulation des règles de validation au sein des tâches (ValidateSignatureTask) garantit une séparation claire des responsabilités, facilitant la maintenance et l'intégration de nouveaux types de documents contractuels sans créer de dette technique.