einvoice / Im Browser prüfen

Rechnung im Browser prüfen

Legen Sie hier eine XRechnung-XML ab — UBL oder UN/CEFACT CII, beide offiziellen Syntaxen — oder ein ZUGFeRD / Factur-X-PDF: dieselbe EN 16931-Engine, die auch die Kommandozeile antreibt, bewertet sie mit ihren 297 Regeln — ohne Konto, ohne Installation. Die Engine läuft in Ihrem Browser (CPython auf WebAssembly via Pyodide), die Rechnung selbst wird also nie hochgeladen: nach dem einmaligen Laden der Laufzeitumgebung stellt die Prüfung keine Netzwerkanfrage mehr, die Ihre Datei überträgt.

Schritt 1 — Validator laden

Bis zu Ihrem Klick wird nichts geladen. Der Knopf holt die gepinnte Pyodide-Laufzeit vom jsDelivr-CDN (exakte Version 314.0.2, per Subresource Integrity geprüft) und die Engine-Module von dieser Website — rund 13 MB unkomprimiert, weniger auf der Leitung. Bei langsamer Verbindung kann der erste Start etwa eine Minute dauern; danach macht der Browser-Cache es schnell.

Was Sie bekommen — und die ehrlichen Grenzen

Ausgegeben wird der Konformitätsbericht der Engine selbst: ein Urteil bestanden/durchgefallen (durchgefallen heißt, dass eine fatale Regel ausgelöst hat), die Zähler für fatale Befunde und Warnungen sowie eine Zeile je Befund mit Schweregrad, Regel-ID und Meldung. Wo der mitgelieferte Korrekturkatalog einen Eintrag zur Regel hat, trägt die Zeile zusätzlich dessen allgemeinverständlichen Titel und den einzeiligen Behebung-Hinweis — genau den Wortlaut, den auch der --json-Bericht der Kommandozeile und die Regelseiten verwenden, wörtlich weitergereicht, im Browser nie umformuliert. Jede Regel-ID mit eigener Referenzseite wird verlinkt — auf dieselben Seiten unter dem Regelverzeichnis (englischsprachig), mit dem offiziellen Schematron-Assert, den BT-/BG-Begriffen und einer konkreten Korrektur auf Englisch und Deutsch.

Wo die Engine einen Befund in der Datei verorten kann, trägt die Zeile auch eine Zeilennummer — in einer von zwei bewusst verschiedenen Formen, weil sie Verschiedenes bedeuten. in Zeile 28 heißt: das beanstandete Element steht in Zeile 28. (Einfügepunkt Zeile 28) heißt das Gegenteil: in Zeile 28 ist nichts falsch, dort gehört lediglich das fehlende Element hin — die Unterscheidung entspricht genau dem Textbericht der Kommandozeile. Befunde, die die Engine nicht ehrlich verorten kann, tragen gar keine Zeilennummer statt einer geratenen; eine 0-te Zeile und ein „:1“-Notbehelf sind beide schlechter als Schweigen.

Jedes Ergebnis — bestanden wie durchgefallen — bietet zusätzlich den Link Diesen Bericht herunterladen. Diese Datei ist dasselbe einzelne, in sich geschlossene HTML-Dokument, das einvoice validate --format html auf der Kommandozeile schreibt: kein Skript, kein externes Stylesheet, keine Webschrift, nichts nachzuladen — sie öffnet sich in fünf Jahren genauso wie hinter einem Firmen-Proxy. Sie wird von der Engine in diesem Tab aus der soeben gelaufenen Prüfung gebaut und Ihnen als lokale blob:-Datei übergeben — Ihre Rechnung wird weiterhin nicht hochgeladen, der Bericht ebenso wenig. Leiten Sie ihn an die Stelle weiter, der die Leitweg-ID gehört, oder hängen Sie ihn ans ERP-Ticket.

Neben diesem Link schaltet das Auswahlfeld Sprache des heruntergeladenen Berichts genau diese eine Datei zwischen Englisch (Voreinstellung) und Deutsch um — beide baut die Engine aus derselben einen Prüfung, das Umschalten validiert also nichts neu und lädt nichts hoch. Genau gesagt: die deutsche Datei trägt deutsche Regeltitel und deutsche Behebung-Hinweise zu allen 297 katalogisierten Regeln, dazu den offiziellen deutschen KoSIT-Wortlaut des <sch:assert> bei den 50 Regeln, die einen veröffentlichen; eine EN 16931-Kernregel ohne offizielles Deutsch behält ihre englische Meldung, was die Engine selbst mit [en] kennzeichnet und in einer Anmerkung erklärt, statt maschinell zu übersetzen. Voreingestellt ist das englische Dokument; wählen Sie „Deutsch“, wenn Sie die deutsche Fassung brauchen. Die Seite, die Sie gerade lesen, bleibt in beiden Fällen deutsch.

Dieselben Grenzen wie auf der Kommandozeile, klar gesagt: keine strukturelle XSD-Validierung; UBL Invoice und UBL 2.1 CreditNote laufen beide durch dieselbe EN-16931-Engine, ebenso UN/CEFACT CII — sowohl als reine .xml-Datei mit dem Wurzelelement CrossIndustryInvoice (die zweite offizielle XRechnung-Syntax, und das, was ZUGFeRD und Factur-X transportieren) als auch als das in einem ZUGFeRD-/Factur-X-.pdf eingebettete XML, das die Seite vor der Bewertung für Sie extrahiert. Jedes andere Wurzelelement wird weiterhin vorab mit der strukturellen fatalen Regel S-ROOT abgelehnt statt halb bewertet. Jede auslösbare offizielle BR-CL-*-Codelistenprüfung ist inzwischen in beiden Syntaxen implementiert. Ein grünes Ergebnis bedeutet „keine implementierte fatale Regel hat ausgelöst“, nicht „rechtsverbindlich konform zertifiziert“. Browser-spezifisch: die rund 13 MB Laufzeitumgebung sind real — bei getaktetem oder sehr langsamem Netz ist der Weg über das Terminal weiter unten das bessere Werkzeug. Verschlüsselte oder exotische PDF-Container, die der abhängigkeitsfreie Extraktor nicht öffnen kann, werden ehrlich als unsupported-container gemeldet, nie stillschweigend durchgewunken.

Lieber im Terminal?

Browser-Seite und Paket führen dieselben Engine-Module aus — die Kopien unter engine/ sind byte-identisch mit dem veröffentlichten Paket, per sha256 in einem mitversionierten Manifest gepinnt. Lokal ist das:

python3 -m pip install verifyhash-einvoice
einvoice validate --profile xrechnung invoice.xml
einvoice validate --json --profile xrechnung invoice.xml

Fangen Sie mit dem Praxisbeispiel in fünf Minuten an, oder lesen Sie den ehrlichen Vergleich mit dem offiziellen KoSIT-Validator und Mustangproject (englischsprachig).