Aller au contenu

Conformité ZUGFeRD / Factur-X : le profil de facture EN 16931 intégré

Énoncé de périmètre. NextPDF produit le profil XML intégré ; la validité fiscale et juridique est déterminée par l’autorité réceptrice, et non par la bibliothèque.

ZUGFeRD / Factur-X désigne une facture hybride : un PDF lisible par un humain (substrat d’archivage PDF/A-3) avec un XML Cross-Industry-Invoice (CII) lisible par une machine intégré, conforme au modèle de données sémantique EN 16931. NextPDF Core fournit le contrat de l’embedder (NextPDF\Contracts\EInvoice) ; le moteur concret Factur-X 1.08 est fourni dans le package Premium nextpdf/pro. La bibliothèque produit le XML intégré et la structure de pièce jointe PDF/A-3 ; un validateur EN 16931 / Schematron — ou l’autorité fiscale réceptrice — tranche la validité fiscale.

Fenêtre de terminal
composer require nextpdf/core:^3 # EInvoice contracts only
composer require nextpdf/pro # Factur-X 1.08 embedder engine

Core fournit EmbedderInterface, ProfileInterface, ProfileType, ValidatorInterface, et ValidationResult dans NextPDF\Contracts\EInvoice. Le docblock de l’interface le précise explicitement : le niveau Pro (moteur de réécriture d’octets Factur-X 1.08) et le niveau Enterprise (builder géré PDF/A) implémentent ce contrat. Core, à lui seul, n’intègre pas de facture — il définit le contrat byte-in/byte-out que ces niveaux satisfont.

NextPDF\Contracts\EInvoice\ProfileType est le discriminateur de conformité EN 16931 : MINIMUM, BASIC_WL, BASIC, EN16931, EXTENDED, XRECHNUNG. Sa méthode isEn16931Conformant() encode la règle directement à partir d’EN 16931-1. MINIMUM et BASIC_WL ne sont pas conformes à EN 16931 (ils ne satisfont pas à la cardinalité de l’identifiant de spécification BT-24 ni à l’exigence de ligne de facture). BASIC, EN16931, EXTENDED, XRECHNUNG sont conformes à EN 16931.

L’embedder (EmbedderInterface) est contractuellement tenu de :

  • analyser le XML CII fourni via XmlGuard (avec protection contre les XXE) ;
  • injecter le schéma d’extension XMP Factur-X pour le profil déclaré ;
  • attacher le XML comme fichier intégré avec la valeur correcte AFRelationship (Data / Alternative) pour que le substrat d’archivage PDF/A-3 (exigences de fichier intégré du §6.7.5 — clés F/UF) le porte.

NextPDF émet cette structure. Il n’affirme pas que la facture est fiscalement valide ; cette décision revient à l’autorité réceptrice, au regard des règles métier du §7 d’EN 16931 et de tout CIUS national.

SymboleEffet
Contracts\EInvoice\EmbedderInterfaceContrat byte-in/byte-out ; Pro/Enterprise l’implémentent.
Contracts\EInvoice\ProfileType (enum)Discriminateur de profil EN 16931.
ProfileType::isEn16931Conformant(): boolFalse pour MINIMUM/BASIC_WL ; true pour BASIC/EN16931/EXTENDED/XRECHNUNG.
Contracts\EInvoice\ValidatorInterfaceContrat de validation qui renvoie un ValidationResult contenant les violations de règles.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Contracts\EInvoice\ProfileType;
// Core: choose and check the profile before delegating embedding to Pro.
$profile = ProfileType::EN16931;
if (!$profile->isEn16931Conformant()) {
fwrite(STDERR, "Profile {$profile->value} is not EN 16931 conformant.\n");
exit(1);
}
// The concrete embedder is provided by nextpdf/pro:
// $embedder = /* the Factur-X embedder from nextpdf/pro; see the Premium docs */;
// $pdfWithInvoice = $embedder->embed($basePdfBytes, $ciiXml, $options);
echo "Profile {$profile->value} selected (embedding requires nextpdf/pro).\n";

Le pipeline de production (niveau Pro) intègre le XML CII dans une base PDF/A-3. Il exécute ensuite un validateur Schematron EN 16931 (ou soumet le résultat à l’autorité réceptrice). Il traite ce rapport comme la barrière de contrôle. NextPDF émet le XML intégré et la pièce jointe PDF/A-3 ; le validateur ou l’autorité décide de la validité fiscale. Core seul ne peut pas exécuter ce pipeline — nextpdf/pro est requis pour le moteur d’embedder.

  • Core ne contient que des contrats. Sans nextpdf/pro, il n’y a aucun embedder concret. Le code appelant doit dépendre de l’interface et se dégrader clairement quand l’implémentation Pro est absente.
  • MINIMUM / BASIC_WL ne sont pas EN 16931. isEn16931Conformant() renvoie false pour ces profils ; n’annonce pas une facture EN 16931 quand tu les utilises.
  • Substrat PDF/A-3. Le XML intégré circule dans un conteneur d’archivage PDF/A-3 ; les clés de fichier intégré F/UF (PDF/A §6.7.5) doivent être présentes.
  • Le XML est parsé avec une protection contre les XXE. Le contrat exige un parsing via XmlGuard ; un embedder personnalisé ne doit pas introduire de vecteur d’injection XXE.
  • La validité n’est pas le verdict de la bibliothèque. Produire un fichier Factur-X structurellement correct ne signifie pas que l’autorité fiscale l’acceptera.

L’intégration réécrit le PDF pour ajouter la pièce jointe XML et le schéma d’extension XMP. Le budget est fixé à un temps écoulé ≤ 1500 ms, avec un pic ≤ 128 Mo pour une facture typique.

Le XML intégré est parsé avec une protection contre les XXE via XmlGuard. Le XML de facture contient par nature des données personnelles commerciales (parties, montants) — il est intégré, pas chiffré. La confidentialité de la facture relève de la responsabilité de l’intégrateur.

Résidence des données & mesures d’atténuation des données personnelles

Section intitulée « Résidence des données & mesures d’atténuation des données personnelles »

Le XML de facture transporte des données personnelles relatives aux parties et aux finances. L’intégration se fait dans le processus ; aucune donnée ne quitte le processus pendant l’intégration. La transmission à une autorité réceptrice est hors périmètre et relève de la responsabilité de résidence des données de l’intégrateur.

Ne journalise jamais le XML CII ni les octets du PDF intégré — ils contiennent des données personnelles de facture. Ne journalise que le nom du profil et un verdict structurel.

Un fichier Factur-X n’est pas soumis à un contrôle d’accès. Le XML intégré est lisible par quiconque dispose du fichier. Le format hybride garantit la lisibilité par machine de la facture, pas sa confidentialité ni son acceptation fiscale.

L’intégration n’effectue aucune cryptographie. Une facture Factur-X signée relève d’une recette de signature distincte et hérite de la posture FIPS de cette recette ; cette page ne fait aucune affirmation de signature.

AffirmationSpécClausereference_id
Une facture EN 16931 porte les termes métier du modèle de données sémantique.EN 16931-1§6.4
La conformité EN 16931 est régie par la cardinalité des règles métier qu’une facture conforme doit satisfaire.EN 16931-1§7
Le profil EN 16931 de Factur-X exige la conformité aux règles métier du XML CII.Factur-X 1.08Profil EN 16931
Le profil EN 16931 de Factur-X impose le contenu de facture requis.Factur-X 1.08Profil EN 16931
Factur-X est un hybride : un XML lisible par machine intégré à côté du PDF lisible par un humain.Factur-X 1.08Basic
Le XML intégré circule dans un substrat d’archivage PDF/A (clés de fichier intégré F/UF).ISO 19005-4§6.7.5

Les citations sont des pointeurs clause-id + reference_id vers le corpus de vérification. Aucun texte de norme n’est reproduit ; les clauses sont résumées avec les propres mots de NextPDF.