django-facturation-fr
Application Django de facturation : factures et avoirs numérotés, mentions légales françaises, PDF et Factur-X (PDF/A-3 avec le XML UN/CEFACT CII au profil EN 16931, le format socle de la facturation électronique). Indépendante de tout autre module : le projet hôte lui décrit ses ventes via une API Python.
- Numérotation continue par série et par année (
F2026-00001,AV2026-00001), attribuée sous verrou. - Intangibilité : une facture émise ne se modifie ni ne se supprime ; elle s'annule par un avoir qui en reprend exactement les montants.
- Montants conformes à la norme : TVA par taux ; prix TTC (particuliers) ou HT (professionnels) ; remises de pied de facture par taux ; total à payer égal au prix payé, au centime.
- Mentions : identité complète du vendeur (figée à l'émission), SIREN et n° de TVA du client professionnel, adresse de livraison, nature des opérations, option pour les débits, exonération, pénalités de retard et indemnité de 40 € pour les professionnels, mention « acquittée ».
- Archivage : PDF enregistré à l'émission avec son empreinte SHA-256.
- Factur-X : XML vérifié par le schéma XSD officiel à chaque émission, polices intégrées, profil de couleurs sRGB et métadonnées PDF/A-3.
Installation
pip install django-facturation-fr
INSTALLED_APPS = [..., "facturation_fr"] # libellé d'application : « invoicing »
urlpatterns = [..., path("facturation/", include("facturation_fr.urls"))]
Pages réservées aux permissions invoicing.* ; le lien de téléchargement client
(/facturation/telecharger/<jeton>/) est public et doit être exempté d'une éventuelle connexion obligatoire.
API
from facturation_fr import api
invoice = api.issue_invoice(
"order:42", # clé unique : rejouer renvoie la même facture
api.Buyer("Martin SARL", "5 avenue Foch", "75016", "Paris", siren="732829320", vat_number="FR40732829320"),
[api.Item("T-shirt", 2, Decimal("25.00")), # prix TTC par défaut (prices_include_tax=False pour du HT)
api.Item("Livre", 1, Decimal("18.00"), Decimal("0.055")),
api.Item("Atelier", 1, Decimal("60.00"), nature="services")], # biens par défaut (nature des opérations)
[api.Allowance("Code promo DIX", Decimal("5.00"))],
paid_at=day, payment_method="Carte bancaire", document=("order", 42))
api.credit_invoice("order:42:credit", invoice, reason="Retour du colis")
api.invoices_for("order", 42)
Une identité de vendeur incomplète (raison sociale, adresse, SIREN, n° de TVA si la facture
comporte de la TVA) lève api.InvoicingError : rien n'est émis.
Intégration au projet hôte
INVOICING = {
"BASE_TEMPLATE": "monprojet/base.html", # bloc « content »
"SELLER": "monprojet.invoicing.seller", # f() -> {"name", "address", "postal_code", "city", "siret", ...}
"BRANDING": "monprojet.invoicing.branding", # f() -> {"logo_path", "color"}
"DOCUMENT_URL": "monprojet.invoicing.document_url",
"ON_ISSUED": ["monprojet.invoicing.on_issued"], # f(invoice) après chaque émission
}
Les paramètres saisis dans Paramètres de facturation priment sur SELLER.
Facturation électronique (plateforme agréée)
invoicing.einvoicing et invoicing.platforms :
- aiguillage : facture à un professionnel établi en France (SIREN de l'acheteur) → facture électronique, déposée sur la plateforme ; vente à un particulier ou à un professionnel étranger → e-reporting ;
- cycle de vie : les 14 statuts officiels (200 Déposée à 213 Rejetée ; obligatoires : 200, 210, 212, 213), historisés ; le statut 212 Encaissée est transmis dès que la facture est payée ;
- factures reçues : import ou réception d'un PDF Factur-X, d'un XML CII ou UBL, lecture des données EN 16931 (fournisseur, montants, TVA par taux, échéance), contrôle du destinataire, sans doublon ; statuts de l'acheteur (prise en charge, approuvée, en litige, refusée avec motif…) ; XML lu sans entités externes ni accès réseau ;
- e-reporting au format officiel (
invoicing.ereporting, flux 10 des spécifications externes DGFiP v3.2, validé contre les XSD officiels fournis dansinvoicing/xsd/ereporting) — deux transmissions par période :- transactions : ventes aux particuliers par jour, devise et catégorie (TLB1 biens, TPS1 services, TNT1 hors champ de la TVA française), ventilées par taux, avoirs déduits (10.3) ; factures aux professionnels établis hors de France, une à une (10.1) ;
- encaissements des prestations de services (sauf option pour la TVA sur les débits) : par jour pour les particuliers (10.4), par facture pour les professionnels étrangers (10.2), remboursements en négatif ;
- périodes selon le régime de TVA (réel mensuel : transactions par décade, encaissements par mois ; réel trimestriel et simplifié : par mois ; franchise : par bimestre civil) ;
- une période transmise dont les données changent est retransmise en rectificative (RE, version suivante), qui annule et remplace la précédente ; l'historique des transmissions est conservé ;
- émetteur : la plateforme agréée (matricule à 4 caractères, fourni par le connecteur ou saisi dans les paramètres) ; déclarant : le vendeur (SIREN) ;
python manage.py sync_einvoicing(planificateur) : statuts, dépôts, encaissements, factures reçues, e-reporting.
Plateformes fournies : Dépôt manuel (fichiers à déposer sur le portail de n'importe quelle plateforme agréée,
statuts reportés à la main) et Plateforme simulée (tests). Une plateforme réelle s'ajoute en sous-classant
invoicing.platforms.Platform (send_invoice, fetch_events, send_payment, fetch_incoming,
send_buyer_status, send_ereport) et en la déclarant dans INVOICING["PLATFORMS"], ses identifiants dans
INVOICING["PLATFORM_OPTIONS"]. INVOICING["ON_RECEIVED_STATUS"] permet de comptabiliser les factures reçues.
Limites
- Le contrôle schematron EN 16931 (règles métier) demande un moteur XSLT 2 (Saxon, Java) : non exécuté ici ; les règles principales (BR-CO-10/13/15/17, BR-S-02, BR-CO-25, mentions) sont garanties par le code et les tests. La conformité PDF/A n'a pas été vérifiée avec veraPDF.
- Aucun connecteur vers une plateforme agréée réelle n'est encore fourni (choix du prestataire à faire) ; en dépôt manuel, le flux 10 (XML) se télécharge pour être déposé sur le portail de la plateforme.
- E-reporting : les lignes de facture et les remises du bloc 10.1 (obligatoires en trajectoire « cible », à partir du 01/09/2027) ne sont pas encore transmises ; les acomptes (TVA exigible à l'encaissement sur les livraisons de biens) et le régime de la marge (TMA1) ne sont pas gérés.
Tests
python manage.py test invoicing
Licence
AGPL-3.0-or-later : voir LICENSE. Une licence commerciale (sans l'obligation de publier les modifications) peut être accordée par l'auteur : ouvrez une issue.
Metadata
Release files for django-facturation-fr 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django_facturation_fr-0.2.0.tar.gz | 74.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_facturation_fr-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 168.2 kB
Release files / django_facturation_fr-0.2.0.tar.gz
| Download URL | django_facturation_fr-0.2.0.tar.gz |
|---|---|
| Size | 74.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
638ea8bdbc0a5a3eb9c771594d968613a842a9a0953c2874f318019655d0dcd5
|
|
BLAKE2b-256 checksum How to use checksums |
51fe2426f74e28d7a4a5f55625412dc7ccffcafb8f844d257196990c38940ff4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.
Transparency logRelease files / django_facturation_fr-0.2.0-py3-none-any.whl
| Download URL | django_facturation_fr-0.2.0-py3-none-any.whl |
|---|---|
| Size | 93.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f8b2f661911d8157e6224a39c83537bfa8bc28d4f302bed7851907d612a4b5b1
|
|
BLAKE2b-256 checksum How to use checksums |
bd6e92f4d11e58b5e23258449684d7784a369cd082c314aa5d75277509b730fa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 5, 2026.
Transparency log