Application de facturation pour Windows. Génère des factures PDF Factur-X à partir de modèles Excel, en embarquant un XML CII conforme aux spécifications de l'administration française pour la facturation électronique.
L'application fonctionne entièrement en mode local (numéros de facture stockés sur disque).
EzFacture garantit une numérotation chronologique, continue et sans rupture de séquence des factures, sans jamais « réserver » un numéro qui pourrait ensuite être perdu, voir Numérotation des factures.
- Windows (obligatoire — l'app pilote Excel via COM/xlwings).
- Microsoft Excel desktop installé, version minimale recommandée : 2021.
Peut fonctionner avec des versions plus anciennes, à partir de 2010, mais nécessite dans ce cas des adaptations des formules dans les templates (RECHERCHEX-> INDEX / EQUIV). - Python 3.13 (le projet est développé et testé sous 3.13).
- Les fichiers de données (fournis, à adapter) doivent être présents à la racine du projet :
clients.xlsx— liste des clientsproduits.xlsx— catalogue produitsconfig.xlsx— configuration vendeur (SIRET, TVA, adresse…)
- Télécharger la dernière version de l'éxécutable ici : https://github.com/serialiser/ezfacture/releases/.
- Extraire l'archive sur votre disque dur.
- Si vous avez des travaux excel en cours, enregistrez vos document et quittez Excel.
- Lancer
ezfacture-1.0.0.exe. - La documentation est disponible ici : https://www.ezfacture.fr/documentation.
Les numéros validés sont stockés dans invoices.jsonl, un fichier append-only
(on n'ajoute qu'à la fin, jamais de modification ni de suppression). Chaque numéro
suit le format FAC-AAAA-MM-NNNNN (ou AV-… pour un avoir), où NNNNN est un
compteur strictement croissant : le prochain numéro est toujours dernier + 1.
Le numéro n'est inscrit sur disque qu'à l'ultime étape, après que toutes les opérations ont abouti :
- calcul du prochain numéro (
dernier + 1) — lecture seule, aucune écriture ; - génération du XML et contrôle avec le schéma XSD ;
- génération du PDF à partir de la feuille Excel ;
- embarquement du XML dans le PDF (Factur-X) ;
- seulement alors, écriture définitive du numéro dans
invoices.jsonl.
Si une seule de ces étapes échoue (Excel fermé, XML invalide, erreur PDF…), la transaction est annulée (rollback) : le numéro n'a jamais été écrit. Comme rien n'a été consommé, le même numéro sera réattribué à la tentative suivante.
A chaque écriture, le fichier invoices.jsonl est sauvegardé dans un répertoire à préciser dans le fichier config.xlsx (par défaut même répertoire que l'application).
N'éditez JAMAIS manuellement le fichier
invoices.jsonl, il deviendrait corrompu, ce qui bloqurait la production de nouvelles factures.
Pour rendre toute altération détectable, chaque entrée est protégée par une double chaîne de hachage :
file_hash_before: SHA-256 du fichier avant l'ajout de cette entrée (chaînage — chaque ligne dépend de tout ce qui précède) ;self_hash: SHA-256 denuméro + type + horodatage + file_hash_before.
À cela s'ajoute un sceau dans le registre Windows (nombre d'entrées + dernier
self_hash), écrit à chaque validation. Au démarrage, verify_local_file()
recalcule toute la chaîne et la compare au sceau. Supprimer, modifier ou réordonner
une ligne casse le chaînage : l'application détecte l'incohérence, affiche une
erreur et bloque la création de nouveaux documents tant que le fichier n'est pas rétabli.
git clone <url-du-depot> ezfacture
cd ezfacturepython -m venv venv
.\venv\Scripts\Activate.ps1Si l'activation est bloquée par la politique d'exécution PowerShell :
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned(une seule fois), puis réessayez. En invitecmd, utilisezvenv\Scripts\activate.bat.
python -m pip install --upgrade pip
pip install -r requirements.txtPour activer en plus le mode API (nécessite le sous-module privé) :
pip install -r controller/backends/api/requirements.txtDepuis la racine du projet, avec le venv activé :
python main.pyLe build utilise main.spec, qui gère les imports cachés
(xlwings, tzdata), les données de la bibliothèque factur-x et le logo.
pyinstaller est déjà inclus dans requirements.txt.
build.py lance PyInstaller et copie les fichiers nécessaires à côté de l'exécutable :
python build.pyLe script :
- exécute
pyinstaller main.spec --clean; - copie les dossiers
templates/,images/etassets/dansdist/; - copie les fichiers de données
clients.xlsx,produits.xlsx,config.xlsx; - crée les dossiers de travail
brouillons/etpdf/.
Le résultat se trouve dans dist/ : lancez l'exécutable
dist/ezfacture-<version>.exe (ex. dist/ezfacture-1.0.0.exe).
pyinstaller main.spec --cleanPuis, manuellement, copiez à côté de dist/ezfacture-<version>.exe :
- les dossiers
templates/,images/etassets/ - les fichiers
clients.xlsx,produits.xlsx,config.xlsx - créez les dossiers vides
brouillons/etpdf/
Sans ces fichiers, l'exécutable démarre mais ne trouve pas ses modèles ni ses données. L'option A automatise cette étape.
Distribué sous licence Apache, version 2.0. Voir LICENSE.md.