So wurde mein CAO-Faktura 1.4.xF fit für die XRechnung (ZUGFeRD)

Einleitung: Die 2025-Falle und mein Plan B

Ab 2025 ist die elektronische Rechnungsstellung nach EN 16931 in Deutschland Pflicht. Für Nutzer alter, solider Warenwirtschaftssysteme (wie meinem geliebten, aber nicht mehr aktualisierten CAO Faktura 1.4.xF) stellt das ein Dilemma dar: Entweder auf die neue Version upgraden oder einen völlig neuen Workflow aufbauen.

Jeder vernünftige Mensch hätte nun für ca. 250€ einfach auf die aktuelle CAO-Version upgegraded, aber es hat mich einfach gereizt daher habe ich mich für Plan B entschieden: Ich habe eine kostenlose, selbstgebaute Brücke zwischen meiner alten CAO-Datenbank und dem strengen XRechnung-Standard gebaut.

Dieser Artikel zeigt den Workflow, die technischen Herausforderungen und wie ich es geschafft habe, eine 100% valide E-Rechnung zu erzeugen, ohne auf meinen bewährten Arbeitsablauf verzichten zu müssen.


1. Das Dilemma: Warum ein einfacher PDF-Drucker nicht reicht

Viele denken, eine E-Rechnung sei nur ein PDF. Falsch! Die XRechnung (oder ZUGFeRD) ist ein Hybrid-Dokument:

  • Optik: Ein normales, lesbares PDF (das sogenannte PDF/A-3b-Format).

  • Daten: Eine unsichtbar eingebettete, strukturierte XML-Datei (Cross Industry Invoice, CII), die alle Rechnungsdaten maschinenlesbar enthält.

Mein Ziel war klar: CAO soll das PDF erzeugen, und ein Python-Script soll die unsichtbaren XML-Daten aus der Datenbank holen und in das PDF „einbetten“.


2. Der 3-Schritte-Workflow: Vom CAO-Journal zur XRechnung

Mein Skript, das ich mit der Hilfe eines KI-Assistenten entwickelt habe, arbeitet nach folgendem Prinzip:

A. Der Trigger (PDF/A-3B aus CAO)

Anstatt die Rechnung direkt auf den Drucker zu schicken, nutze ich den PDF24 Creator. Das ist wichtig, weil nur dieser ein PDF/A-3B-Grundgerüst erzeugt, das stabil genug ist, die XML-Datei im nächsten Schritt aufzunehmen.

B. Die Datenquelle (Direkter SQL-Zugriff)

Das Herzstück ist die Datenbankverbindung. Mein Python-Skript greift direkt auf das CAO-Journal zu (datenbankname.journal und journalpos).

  • Der Clou: Über die FIRMA_ID im Journal kann das Skript feststellen, welche Steuernummer (national und international) zum Zeitpunkt der Rechnung gültig war, und lädt diese dynamisch.

C. Die Magie (Python & LXML)

Das Python-Skript kombiniert drei Open-Source-Bibliotheken:

Bibliothek Funktion
pymysql Verbindet sich mit der CAO-Datenbank (MySQL 5.1).
lxml Baut die komplexe, fehleranfällige XML-Struktur (CII) nach den Regeln der EN 16931.
facturxNimmt das PDF und die XML-Daten und „verheiratet“ sie zum fertigen Hybrid-Dokument.

3. Die harten Nüsse: XRechnung ist pingelig

Die größte Herausforderung war nicht die Programmierung, sondern die XML-Validierung. Der Validator der KoSIT (XRechnung) ist extrem strikt. Hier die wichtigsten Fixes, die das Skript jetzt beherrscht:

Validator-HürdeLösung im Skript
Element-ReihenfolgeJedes XML-Element (z.B. Käuferadresse, Steuern) muss in einer absolut starren Sequenz stehen. Falsche Reihenfolge = sofortiger Fehler.
Storno-ErkennungAutomatische Erkennung einer Gutschrift durch den negativen Betrag (BSUMME < 0) in der Datenbank. Setzt den TypeCode im XML auf 381 (Gutschrift).
KontoinhaberBereinigt den Kontoinhaber-Namen aus der DB für den korrekten Validation of Payee (Zahlungssicherheit).
BR-DE-21 (BT-24)Der „Specification Identifier“ muss den genauen String für XRechnung 3.0 enthalten. Das Skript fügt den notwendigen Code urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0 hinzu.
PflichtfelderErgänzt automatisch fehlende, aber vorgeschriebene Felder (wie z.B. die E-Mail-Adresse des Käufers) mit einem Platzhalter, falls diese in der CAO-Datenbank nicht gepflegt sind.

4. Fazit: Ein valides System für 0 €

Mein neuer Workflow ist jetzt:

  1. Rechnung in CAO schreiben.

  2. Ausdruck als PDF/A-3B mit PDF24 in den Jahresordner.

  3. Python-Script starten und Dateien auswählen.

  4. Die neue ZUGFeRD PDFs wird im Unterordner ZUGFeRD abgelegt.

Das Resultat ist ein Dokument, das alle 91 Regeln der EN 16931 besteht. Für mich bedeutet das: keine teuren Upgrades, volle Kontrolle über meine Daten und ein zu 100 % Go-Live-fähiges System für die E-Rechnungspflicht.