Skip to main content

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)

facturation_fr.einvoicing et facturation_fr.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 (facturation_fr.ereporting, flux 10 des spécifications externes DGFiP v3.2, validé contre les XSD officiels fournis dans facturation_fr/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, avec leurs remises et leurs lignes (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 facturation_fr.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 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.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-facturation-fr 0.3.0
File Size Uploaded
django_facturation_fr-0.3.0.tar.gz 74.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-facturation-fr 0.3.0
File Interpreter ABI Platform
django_facturation_fr-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 169.3 kB

Release files / django_facturation_fr-0.3.0.tar.gz

Download URL django_facturation_fr-0.3.0.tar.gz
Size 74.8 kB
Tags Source
SHA-256 checksum
How to use checksums
438193e42ad2e5e2c6c0cab16865a24345036314d20c9fae4e25a08842194b44
BLAKE2b-256 checksum
How to use checksums
3ab8f092934dc27e42d0dd28b8e423303b846151b72baafe67fb425184ade4d7
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

Release files / django_facturation_fr-0.3.0-py3-none-any.whl

Download URL django_facturation_fr-0.3.0-py3-none-any.whl
Size 94.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a286e062455fa667082d7f4e52a3e26582ef5cd93210c61c796490526861ef89
BLAKE2b-256 checksum
How to use checksums
e1724a08aff29bcad647d00b73eb99681ef661be2e22ae03e556d86186541e4b
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

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page