Projet personnel

VNTP Facturation

La facturation simple et conforme des indépendants, facture électronique comprise.

Rôle
Fondateur, conception et développement full-stack, seul
Période
déc. 2025 – en cours · VNTP
Stack
  • PHP 8.5
  • Symfony 8
  • Doctrine ORM 3
  • PostgreSQL
  • Symfony Messenger
  • Redis
  • FrankenPHP
  • Stimulus
  • Bootstrap 5
  • Stripe
  • Super PDP
  • EN 16931 / UBL
  • Dompdf
  • Web Push
  • ClamAV
  • PHPUnit
  • PHPStan
  • Forgejo CI
  • Docker

Contexte

La réforme française de la facturation électronique impose aux entreprises d'émettre leurs factures B2B dans un format structuré, via une plateforme agréée. Les outils existants sont souvent lourds ou chers pour un auto-entrepreneur. J'ai voulu une application simple, conforme et pensée pour les indépendants, notamment dans le service à la personne.

Fonctionnalités

  • Devis avec acompte, factures, avoirs, PDF et envoi par e-mail depuis l'adresse de l'entreprise (SMTP propre à chaque entreprise, identifiants chiffrés).
  • Attestations fiscales annuelles générées automatiquement pour les clients du service à la personne (crédit d'impôt).
  • Suivi URSSAF et TVA : chiffre d'affaires, cotisations, alertes avant le dépassement des seuils de franchise de TVA, bascule de régime guidée. Une veille réglementaire vérifie les taux et les seuils publiés par les sources officielles et propose la mise à jour.
  • Facturation électronique : conversion de chaque facture B2B au format EN 16931 (UBL, profil CTC français), validation puis dépôt via l'API de Super PDP, et suivi du cycle de vie de la facture.
  • Espace expert-comptable : invitation du cabinet, export des pièces.
  • Abonnement Stripe, notifications Web Push, application installable sur mobile.
  • RGPD : export des données, suppression et anonymisation des comptes, purge des comptes non vérifiés.

Architecture

  • Symfony 8 sur PHP 8.5, servi par FrankenPHP en mode worker : les services ne gardent aucun état entre deux requêtes, et c'est testé.
  • Multi-entreprise : chaque entreprise a ses identifiants (SMTP, plateforme agréée), chiffrés au repos avec libsodium, la clé n'étant jamais stockée en base.
  • Traitements asynchrones avec Symfony Messenger (e-mails, dépôt des factures électroniques), avec nouvelle tentative automatique sur les erreurs réseau et suivi des échecs d'envoi.
  • Front sobre : Twig, composants Twig réutilisables, Stimulus et AssetMapper, sans build JavaScript.
  • Fichiers déposés analysés par antivirus, limitation de débit sur les formulaires sensibles.

Défis techniques

  • Le mapping EN 16931 : une facture d'auto-entrepreneur en franchise de TVA et celle d'une société assujettie produisent des documents validés sans erreur par la plateforme, vérifiés en conditions réelles dans le bac à sable et pas seulement en théorie.
  • Composer avec des SDK imparfaits : un bug du client officiel cassait silencieusement l'appel de validation (en-tête imposé sur une requête multipart). Je l'ai diagnostiqué, contourné proprement et documenté.
  • Le temps dans les tests : toute logique datée passe par une horloge injectable, pour tester les échéances, les seuils annuels et les relances à date fixe.

Qualité

Tests unitaires et fonctionnels PHPUnit, base de test réinitialisée et transactions annulées, PHPStan, PHP-CS-Fixer, et intégration continue à chaque push sur une forge auto-hébergée. Déploiement en une commande, migrations Doctrine jouées automatiquement.

← Retour au portfolio