Eine Rechnung, die fragt, bevor sie fordert
Jedes andere Dokument hier erreicht eine Norm, indem es sie erklärt: Die Datei sagt, sie sei Factur-X, und wird als Factur-X geschrieben. Erklären ist leicht; richtig sein nicht. Ein Dokument kann eine Rechnung nennen, die es nie angehängt hat, einen Detaillierungsgrad beanspruchen, dem das XML darin nicht folgt, und in einem Container stecken, den die Norm nicht erlaubt — und mit allen dreien hinausgehen, um von der Buchhaltung, an die es geschickt wurde, abgelehnt zurückzukommen.
Also fragt dieses hier zuerst. Die Bibliothek liest das Dokument, wie es ist, schreibt nichts, ändert nichts und gibt alles zurück, was ihres Wissens zwischen diesem Dokument und der genannten Norm steht — alles auf einmal, jeder Befund mit der Klausel, aus der er stammt, und der Datei, um die es geht. Nicht der erste Fehler und dann Schluss: die Liste, sodass eine Arbeitsrunde die Sache erledigt.
Die Rechnung hier ist so zusammengestellt, wie jemand sie zuerst schreibt, und was zurückkommt, wird gedruckt. Zwei Dinge stehen im Weg: Sie beansprucht keine Archivierungsnorm, und sie nennt factur-x.xml, ohne eine Datei unter diesem Namen zu tragen. Behebt man das, bleibt eines — sie beansprucht die Detailstufe EN 16931, wo das XML Basic folgt —, denn eine Datei, die nicht da ist, kann nichts lesen. Behebt man das, steht nichts mehr im Weg, und das PDF wird geschrieben. Solange etwas im Weg steht, wird nichts geschrieben.
Ein leerer Bericht ist kein Zertifikat. Er sagt, dass nichts im Weg steht, wonach diese Bibliothek zu suchen weiß, und das ist nicht dasselbe wie Konformität: Das sagt veraPDF, ein kostenloses Programm, das am Schreiben der Datei nicht beteiligt war. Was der Bericht klärt, ist, ob das Dokument sich selbst widerspricht, der eine Fehler, den niemand weiter hinten beheben kann. Dieselben drei Durchgänge laufen aus Rust und aus Python.
Was dieses Beispiel zeigt
- Alle Befunde auf einmal, jeder mit der Klausel, aus der er stammt, und der Datei, um die es geht.
- Zwei im Weg in der ursprünglichen Fassung, einer, sobald die Datei getragen und die Archivierungsnorm beansprucht wird, keiner, sobald der beanspruchte Detaillierungsgrad der ist, dem das XML folgt.
- Das Dokument wird gemessen, bevor ein Byte davon hinausgeht, und abgelehnt statt geschrieben, solange etwas im Weg steht.
Der Quellcode, vollständig
Nichts ist weggelassen und nichts vereinfacht: Das ist das Programm genau so, wie es läuft, für den Entwickler, der diese Bibliothek nutzt.
Die dritte ist die Beschreibung selbst: eine schlichte Liste dessen, was die Seite sagen muss, und das wird dem Dienst gesendet.
Den Rust-Quellcode lesen
Den Python-Quellcode lesen
Den JSON-Quellcode lesen
Das Dokument selbst
Das Dokument auf Englisch öffnen
Das Dokument auf Französisch öffnen
Das Dokument auf Deutsch öffnen
Das Dokument auf Spanisch öffnen
Das Dokument auf Italienisch öffnen
Das Dokument auf Portugiesisch öffnen