Étude de cas

GÉNÉRATEUR DE DEVIS ET FACTURES

Une application web pour créer des devis, les transformer en factures numérotées, suivre les paiements et produire des PDF figés, avec plusieurs entreprises isolées les unes des autres et des montants en F CFA.

RôleConception et développement complets
StackReact, TypeScript, Node.js, Express, Prisma, PostgreSQL
ContexteProjet personnel, démo avec données fictives

Sur la page de connexion, « Essayer la démo » ouvre votre propre espace, déjà rempli, sans compte. Il est supprimé au bout de 12 heures. L'API est hébergée sur un plan gratuit : le premier chargement peut prendre jusqu'à une minute.

Tableau de bord du Générateur de Devis et Factures : facturé, encaissé, à recevoir et devis en attente

LE DÉFI

Un devis ou une facture engage son émetteur : ses montants doivent être exacts, son numéro sans trou, et son contenu ne doit plus changer une fois le document envoyé.

Mon objectif : une application où les calculs sont exacts, où les documents envoyés sont figés et vérifiables, et où chaque entreprise ne voit que ses propres données.

CE QUE FAIT L'APPLICATION

  • Clients et catalogue de produits et services, avec TVA par ligne.
  • Devis : brouillon, envoi avec un numéro (DEV-AAAA-NNNNN), acceptation, refus, annulation et conversion en facture.
  • Factures numérotées par année (FAC-AAAA-NNNNN), avec échéance calculée, créées depuis un devis accepté ou à la main.
  • Plusieurs paiements par facture (virement, espèces, chèque, mobile money, carte), avec solde et état calculés. Un paiement n'est jamais supprimé, seulement annulé avec un motif.
  • PDF de devis et de factures, avec bon pour accord, conditions de règlement et PDF d'annulation.
  • Tableau de bord : facturé hors taxes, encaissé, à recevoir, en retard et devis en attente.
  • Paramètres de l'entreprise : identité, identifiants fiscaux, logo, devise, TVA, préfixes de numérotation et mentions légales.
  • Comptes avec plusieurs entreprises isolées, et espaces d'essai remplis de données fictives.

DÉCISIONS TECHNIQUES

Des calculs monétaires exacts

Les montants sont des bigint dans la plus petite unité de la devise, les quantités en milli-unités et les taux en points de base : aucun nombre flottant dans un calcul métier. Des tests de propriétés (fast-check) vérifient que totaux, remises et taxes restent cohérents quelles que soient les lignes saisies.

Des documents immuables

À l'envoi d'un devis ou à l'émission d'une facture, un instantané complet du document est figé avec son empreinte SHA-256. Des déclencheurs PostgreSQL empêchent ensuite de modifier ses champs métier, et un PDF manquant peut être régénéré à l'identique depuis l'instantané.

Une numérotation annuelle sans trou

Les numéros se suivent sans interruption, y compris quand plusieurs demandes arrivent en même temps. Ce cas est couvert par un test.

Concurrence optimiste et idempotence

Une modification exige un en-tête If-Match portant la version du document. L'enregistrement d'un paiement exige une clé d'idempotence valable 24 heures : un double clic ou une connexion instable ne crée pas deux paiements.

Une isolation stricte entre entreprises

Chaque requête est limitée à l'entreprise de l'utilisateur. Toucher au document d'une autre entreprise donne la même réponse qu'une action interdite, pour ne jamais révéler son existence. Des tests croisés le vérifient.

Une démo qui passe par la vraie logique

Le bouton « Essayer la démo » crée une entreprise isolée par l'API du serveur lui-même, donc par la logique de production. Des limites par adresse IP et un plafond d'espaces évitent les abus, et seuls les espaces d'essai peuvent être purgés.

APERÇU

ARCHITECTURE

  1. 01NavigateurNe parle qu'à un seul domaine, en HTTPS.
  2. 02VercelReact 19 et Vite. Réécrit /api/* vers l'API.
  3. 03RenderAPI Express 5 avec Prisma, génération des PDF.
  4. 04NeonPostgreSQL 16, migrations versionnées, déclencheurs d'immuabilité.

QUALITÉ ET SÉCURITÉ

  • Environ 80 tests : unitaires, de propriétés, d'intégration sur un vrai PostgreSQL et un parcours complet avec Playwright.
  • CI GitHub Actions : audit des dépendances, migrations, vérification des types, tests unitaires et d'intégration à chaque push.
  • Sécurité : cookies de session HttpOnly, Secure et SameSite, protection CSRF, jetons de rafraîchissement à rotation, verrouillage après 5 échecs de connexion, mots de passe hachés avec bcrypt, en-têtes de sécurité et journal d'audit.
  • PDF générés par le serveur avec pdfkit, sans navigateur : le rendu est identique d'une génération à l'autre.
  • Déploiement automatique sur Vercel, Render et Neon à chaque push.

Suite

UN PROJET
À DISCUTER ?