E-Rechnung und Kontoauszug-Dateien
ZUGFeRD, Factur-X und XRechnung (CII/UBL) exakt lesen, Kontoauszüge als CAMT oder Bank-CSV übernehmen – ohne KI-Schätzung.
Die Vorlage Belege & E-Rechnung liest zwei Dateiarten deterministisch, also direkt aus den Daten der Datei und ohne KI:
- E-Rechnungen: ZUGFeRD/Factur-X (PDF mit eingebetteter XML) und XRechnung als reine XML-Datei, in beiden Syntaxen (CII und UBL)
- Kontoauszug-Dateien: CAMT.053 (auch als ZIP) und die CSV-Exporte der großen Banken
Alles andere (normale PDF-Rechnungen, Fotos, Scans, Kontoauszüge als PDF) läuft wie bisher über Textebene bzw. Texterkennung und KI-Extraktion mit Betragsprüfung.
E-Rechnungen
Was gelesen wird
| Format | Woran erkannt | Bemerkung |
|---|---|---|
| ZUGFeRD 2.x / Factur-X | PDF mit eingebetteter factur-x.xml, zugferd-invoice.xml oder xrechnung.xml |
Profile EN 16931 (COMFORT), BASIC, EXTENDED, XRECHNUNG |
| ZUGFeRD 1.0 | PDF mit CrossIndustryDocument |
alte Lieferanten, wird noch gelesen |
| XRechnung CII | XML, Wurzel CrossIndustryInvoice |
Mail-Anhang oder Chat-Upload |
| XRechnung UBL / Peppol | XML, Wurzel Invoice oder CreditNote |
Gutschriften (CreditNote, Typ 381) werden als Gutschrift erfasst |
Übernommen werden Lieferant (mit USt-IdNr.), Empfänger, Rechnungsnummer, Rechnungs- und Fälligkeitsdatum, Leistungszeitraum, Netto/USt/Brutto je Steuersatz, Zahlart, IBAN, Verwendungszweck und die Positionen. Die XML schlägt den sichtbaren Text: Bei einem ZUGFeRD-PDF zählen die Beträge aus der XML, centgenau.
Was geprüft wird
- Netto + USt = Brutto, Summe der Positionen, Summe der Steueraufschlüsselung (±1 Cent)
- Pflichtfelder Rechnungsnummer, Datum, Betrag, Verkäufer
- Profil MINIMUM und BASIC WL sind nach § 14 UStG keine E-Rechnung (keine Positionen). Sie werden gelesen, der Beleg bekommt einen Hinweis.
Stimmt eine Summe nicht, wird der Beleg trotzdem übernommen, aber mit Status prüfen und dem Grund („E-Rechnung: Netto + USt ≠ Brutto …“).
Grenzen
- Keine vollständige Prüfung gegen den KoSIT-Validator (Schematron). Geprüft werden Summen und Pflichtfelder, nicht jede Geschäftsregel der Norm.
- Keine Prüfung von Signaturen. XML mit
DOCTYPE/ENTITYwird aus Sicherheitsgründen nicht gelesen. - Eine kaputte XML führt nicht zum Abbruch: der Beleg läuft dann über den normalen PDF-Weg.
- Die Original-Datei (XML bzw. ZUGFeRD-PDF) wird abgelegt. Keine Zusage „revisionssicher“ im Sinne der GoBD.
Woher die Dateien kommen
- Postfach:
collectDocumentsnimmt PDF- und XML-Anhänge. Sonstige XML-Anhänge (z. B. Signaturen) werden ignoriert. - Chat: Im Buchhaltungs-Chat hochgeladene PDF- oder XML-Dateien liest
ingestUpload. E-Rechnungen kosten dabei keine KI-Tokens.
Kontoauszug-Dateien (Ausweichweg zu finAPI)
Der Standardweg ist die Bankanbindung über finAPI (Banking). Wer kein Konto verbinden kann oder will, lädt den Monatsexport hoch.
| Bank / Format | Datei |
|---|---|
| CAMT.053 / .052 / .054 | XML oder ZIP mit mehreren XML (Tagesauszüge) |
| Sparkasse | „CSV-CAMT-Format“ und „CSV-MT940-Format“ |
| Volksbank / Raiffeisenbank | CSV-Export (mit „Saldo nach Buchung“) |
| DKB | CSV, neues Format (seit 2023) und altes Format |
| ING | CSV „Umsatzanzeige“ |
| Commerzbank | CSV |
| N26 | CSV (neues und altes Format) |
Dabei gilt:
- Vorgemerkte Umsätze werden übersprungen, nur gebuchte kommen in die Buchhaltung.
- Saldenprüfung: Enthält die Datei Salden (CAMT, Volksbank, ING), muss Anfangssaldo + Umsätze = Endsaldo sein. Sonst wird nichts übernommen, weil Zeilen fehlen oder falsch gelesen wären.
- Keine Dubletten: Umsätze, die schon über finAPI oder einen früheren Upload da sind (gleiches Konto, Datum, Betrag), werden nur mit dem Auszug verknüpft. Zwei echte identische Umsätze am selben Tag bleiben zwei.
- Das Konto erkennt das Tool an der IBAN in der Datei. N26-Exporte haben keine IBAN, dann im Chat die letzten 4 Ziffern nennen.
Unbekanntes CSV
Für ein anderes CSV-Format fragt das Tool einmal die KI nach der Spaltenzuordnung. Dafür bekommt sie nur die Kopfzeile und 5 Beispielzeilen, nicht alle Umsätze. Die Umsätze liest das Tool danach selbst. Der Standard-Prompt steht in config/tenants/_shared/accounting/prompts.php (accounting.prompts.bank_csv_mapping). Ein Workspace kann ihn in seiner Config ohne Code überschreiben:
'accounting' => [
'prompts' => [
'bank_csv_mapping' => 'Ordne die Spalten dieses Kontoauszugs zu … Antworte NUR mit JSON '
. '{"header_row": n, "bank": "", "columns": {"datum": "…", "betrag": "…", "gegenseite": "…", "zweck": "…"}}.',
],
],
Rollen in columns: datum, valuta, betrag (oder soll/haben bzw. soll_haben), waehrung, gegenseite, gegen_iban, zweck, buchungstext, status, konto_iban, saldo. Ist der Prompt leer, antwortet das Tool mit erkannt: false und nennt die Kopfzeile. Dann bleibt der Weg über den Kontoauszug als PDF.
Tools (für Builder und eigene Automationen)
| Tool | Wirkung | Args |
|---|---|---|
readEInvoice |
liest eine E-Rechnung, schreibt nichts. Ausgabe data im Format von parseInvoicePdf plus art, richtung, faellig_am, einvoice_format |
sha256 (Chat-Upload) oder attachment_id (Mail-Anhang), optional firma, privat |
parseBankStatement |
liest einen Kontoauszug, schreibt nichts | sha256 oder attachment_id, optional mapping |
importBankStatement |
übernimmt Auszug + Umsätze in die Buchhaltung (über recordsQuery), Original in die Ablage |
sha256 oder attachment_id, konto, mapping_prompt, neu_einlesen, dry_run |
Alle drei sind interne Tools (internal: true) mit derselben Zugriffsregel wie Bankdaten: Admins/Manager des Workspace bzw. eigene Automationen. Die Dateien verlassen den Server nicht, und an die KI geht bei E-Rechnungen nichts.
Qualität prüfen (Entwickler)
Zum Fixture-Monat 09/2026 der Vorlage gehören 15 Fälle, darunter ZUGFeRD, XRechnung CII/UBL, Sparkasse CSV-CAMT mit identischen Umsätzen und eine KK-Abrechnung. Er liegt unter tests/fixtures/templates/belege_erechnung/.
bin/cake template_eval belege_erechnung --selbsttest # Fixtures + Bewertung, ohne KI
bin/e2e-belege-erechnung.sh e2e_belege admin@example.com # echter Lauf in einem Test-Workspace
Schwellen: ≥ 85 % der Bewegungen zugeordnet, ≤ 10 % ohne Beleg. Der Bericht nennt auch die KI-Kosten des Laufs.