Personal project

VNTP Facturation

Simple, compliant invoicing for freelancers, e-invoicing included.

Role
Founder, solo full-stack design and development
Period
Dec 2025 – ongoing · 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

Context

France's e-invoicing reform requires companies to issue B2B invoices in a structured format, through a certified platform. Existing tools are often heavy or expensive for a micro-entrepreneur. I wanted a simple, compliant application designed for freelancers, especially in home services.

Features

  • Quotes with deposits, invoices, credit notes, PDFs, and e-mail sending from the company's own address (per-company SMTP, encrypted credentials).
  • Annual tax certificates generated automatically for home-service clients (tax credit).
  • Social contributions (URSSAF) and VAT tracking: revenue, contributions, alerts before the VAT exemption thresholds are exceeded, guided regime switch. A regulatory watch checks the rates and thresholds published by official sources and proposes the update.
  • E-invoicing: each B2B invoice converted to EN 16931 (UBL, French CTC profile), validated then filed through the Super PDP API, with its lifecycle tracked.
  • Accountant space: firm invitation, document export.
  • Stripe subscription, Web Push notifications, installable mobile app.
  • GDPR: data export, account deletion and anonymisation, purge of unverified accounts.

Architecture

  • Symfony 8 on PHP 8.5, served by FrankenPHP in worker mode: services keep no state between requests, and that is tested.
  • Multi-company: each company has its own credentials (SMTP, certified platform), encrypted at rest with libsodium; the key is never stored in the database.
  • Asynchronous processing with Symfony Messenger (e-mails, e-invoice filing), with automatic retries on network errors and tracking of failed sends.
  • Lean front end: Twig, reusable Twig components, Stimulus and AssetMapper, no JavaScript build.
  • Uploaded files antivirus-scanned, rate limiting on sensitive forms.

Technical challenges

  • EN 16931 mapping: an invoice from a VAT-exempt micro-entrepreneur and one from a VAT-registered company both produce documents validated with zero errors by the platform, checked for real in the sandbox, not just in theory.
  • Living with imperfect SDKs: a bug in the official client silently broke the validation call (a header forced on a multipart request). I diagnosed it, worked around it cleanly and documented it.
  • Time in tests: all date logic goes through an injectable clock, to test due dates, yearly thresholds and fixed-date reminders.

Quality

PHPUnit unit and functional tests, test database rebuilt and transactions rolled back, PHPStan, PHP-CS-Fixer, and continuous integration on every push to a self-hosted forge. One-command deploys, Doctrine migrations run automatically.

← Back to the portfolio