ED05 - Belege, DMS, e-Rechnung: Ordnung, retrograde/progressive Nachverfolgbarkeit
Problem
Ein Unternehmer beginnt mit der Belegablage - und steht vor der Frage: Wie ordne ich Belege GoBD-konform, und wie mache ich sie nachverfolgbar?
Die heutige Praxis im KMU-Bereich:
- Papierbelege in Ordnern - nicht elektronisch, nicht maschinell auswertbar, nicht retrograd/progressiv nachverfolgbar
- PDFs in Cloud-Accounts - nicht GoBD-konform (keine Unveränderbarkeit, keine maschinelle Auswertbarkeit, Abhängigkeit vom Dienstleister)
- E-Mails mit PDF-Anhängen - nicht archiviert (E-Mail-Postfach ist kein Archiv), keine Beleg-Echtheit, keine Nachweiskette
- e-Rechnungen (XML) nicht verstanden - viele Unternehmer wissen nicht, dass seit 2025 die XML-Datei das Ur-Dokument ist, nicht das PDF
- (Oft) Keine Ordnung - Belege liegen nach Datum, nicht nach Vorgang; Buchungssätze haben keine Belegreferenz
- (Oft) Keine retrograde Nachverfolgbarkeit - vom Buchungssatz kann der Prüfer nicht zum Beleg auflösen, weil die Referenz fehlt
- (Oft) Keine progressive Nachverfolgbarkeit - vom Beleg kann nicht zum Buchungssatz aufgelöst werden, weil die Querverweise fehlen
Kernaussage
GoBD-konforme Belegablage bedeutet:
- Jeder Beleg hat eine eindeutige Identität (DocID) - die
uuidV7(Object ID) ist bereits allein die eindeutige Identität des Belegs, unabhängig vom Dateinamen. Zusätzlich erhält jeder Beleg einen SHA-256-Hash als kryptographische Integritätsprüfung. Der Composite KeyV7GUID:uuidV7dient der Ablage-Organisation (z. B. nach Belegart) und DB-Queries (z. B. bei EF Core in einer Vertical App) - nicht der Identität selbst. - Jeder Beleg hat einen Sidecar -
.v7g.mdmit Klassifizierung (V7GUID), Objekt-Identität (uuidV7), Taxonomie, Obsoleszenz-Status, Erfassungszeit (inuuidV7als 48-Bit-Zeitstempel) - Jeder Buchungssatz referenziert seinen Beleg -
source_sha256im Tagebucheintrag → Beleg - Retrograde Nachverfolgbarkeit - vom Buchungssatz → Beleg →
Tagebucheintrag →
uuidV7auflösbar - Progressive Nachverfolgbarkeit - vom Beleg → Buchungssatz → Grundbuch → Eröffnungsbilanz auflösbar
- E-Rechnung: XML ist das Ur-Dokument - nicht das PDF (seit 2025, § 14 UStG, EN 16931)
Compliance by Design: Beleg-Ordnung entsteht nicht durch nachträgliche Sortierung, sondern durch strukturelle Pflichtfelder (SHA-256, V7GUID, Sidecar) und Pre-Commit-Hooks, die jeden Buchungssatz auf Belegreferenz prüfen.
Beleg-Typen und ihre GoBD-Besonderheiten
(Scan erforderlich)"] B --> PDF["PDF-Beleg
(sonstige Rechnung)"] B --> EML["E-Mail
(EML + Anhang)"] B --> XML["E-Rechnung
(XML - Ur-Dokument)"] P --> S["Scan → SHA-256
+ Sidecar"] PDF --> SH["SHA-256
+ Sidecar"] EML --> EM["EML archiviert
+ Anhang extrahiert
+ Sidecar"] XML --> XV["XML unverändert
+ Sidecar
+ Validierung (EN 16931)"] style B fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style P fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style PDF fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style EML fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style XML fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style S fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style SH fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style EM fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style XV fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33
| Beleg-Typ | GoBD-Besonderheit | Aufbewahrungsfrist |
|---|---|---|
| Papierbeleg | Scan erforderlich (§ 147 Abs. 2 AO); Original kann vernichtet werden, wenn Scan GoBD-konform | 8 Jahre (§ 147 Abs. 3 AO) |
| PDF-Beleg ("sonstige Rechnung") | Seit 2025 nicht mehr "E-Rechnung"; SHA-256 + Sidecar; maschinell auswertbar? Nein - PDF ist unstrukturiert | 8 Jahre |
| E-Mail (EML + Anhang) | E-Mail-Postfach ist kein Archiv; EML muss mit Anhang archiviert werden; Absender-Verifikation | 6 Jahre (§ 147 Abs. 1 Nr. 2/3 AO) |
| E-Rechnung (XML) | XML ist das Ur-Dokument (seit 2025, § 14 UStG); unverändert aufbewahren; EN 16931-Validierung; maschinell auswertbar | 8 Jahre |
Wichtig - E-Rechnung seit 2025: Seit dem 1. Januar 2025 ist die E-Rechnung für B2B-Umsätze zwischen inländischen Unternehmen verpflichtend (§ 14 UStG). Ein einfaches PDF ist nicht mehr eine E-Rechnung - es ist eine "sonstige Rechnung". Die E-Rechnung liegt nur dann vor, wenn sie in einem strukturierten elektronischen Format (XML, EN 16931) ausgestellt, übermittelt und empfangen wird. Siehe ED01 "E-Rechnung: XML-Formate sind Ur-Dokumente in der AO".
Beleg-Klassifizierung im Git-Repo
Verzeichnisstruktur
ORG-1/sources/ # Belegarchiv (Tenant: ORG-1)
├── eingangsrechnungen/ # Eingangsrechnungen (Lieferanten)
│ ├── 260815/ # Nach Datum (YYMMDD)
│ │ ├── rechnung_001.xml # E-Rechnung (XRechnung)
│ │ ├── rechnung_001.xml.v7g.md # Sidecar
│ │ └── rechnung_002.pdf # Sonstige Rechnung (PDF)
│ │ └── rechnung_002.pdf.v7g.md # Sidecar
├── ausgangsrechnungen/ # Ausgangsrechnungen (Kunden)
├── lohnbelege/ # Lohnabrechnungen
├── sv-bescheide/ # SV-Bescheide, VBG-Bescheide
├── vertraege/ # Verträge (periodenübergreifend)
├── korrespondenz/ # E-Mails, Briefe
└── sonstige/ # Sonstige Belege
Sidecar pro Beleg (Pflicht)
Jeder Beleg erhält einen .v7g.md-Sidecar mit dem Composite Key
V7GUID:uuidV7:
{
"$schema": "https://gitcover.org/schemas/v7g-sidecar-1.0.schema.json",
"V7GUID": "<V7GUID-Class-aus-Registry>",
"uuidV7": "019f2c6f-0900-7001-8000-000000000001",
"sha256": "ab94670c0dd8499c27ef2feddd1d9c5925977d55a52150a6fca0f6567d2e5e79",
"title": "260815_Rechnung_001.xml",
"original_filename": "Rechnung_001.xml",
"locations": [
{
"unc_path": "./ORG-1/sources/eingangsrechnungen/260815/rechnung_001.xml",
"from": "260815",
"to": null,
"note": "Primärspeicherort"
}
],
"v7g_taxonomy": [
{
"v7guid": "019f2c6f-0900-7000-8000-000000000000",
"taxonomy": "ORG-1/Eingangsrechnung",
"valid_from": "260815",
"valid_to": null,
"note": "Tenant: ORG-1, Category: Eingangsrechnung, Sphäre: wirtschaftlich"
}
],
"gcpn": {
"prima_nota_ref": "GB-2026-08-001",
"journal_entry_ref": "J-2026-08-001"
},
"obsolescence": {
"status": "active",
"superseded_by": null,
"superseded_at": null
}
}
Composite Key
V7GUID:uuidV7- Ablage-Organisation und Query:
uuidV7(Object ID) - ist bereits allein die eindeutige Identität (DocID) des Belegs, generiert mit vorgegebener Zeitmarke, 48-Bit- Zeitstempel in der GUID verankertV7GUID(Class) - klassifiziert den Beleg-Typ aus.gitcoverRegistry (Belegart, Ablage-Organisation, DB-Query bei Vertical App mit EF Core)v7g_taxonomy[].v7guid- Object ID des klassifizierten Belegsgcpn.prima_nota_ref/journal_entry_ref- Querverweis auf Grundbuch/Journal (progressive Nachverfolgbarkeit)- Der Composite Key
V7GUID:uuidV7dient Ablage-Organisation und Query - die Identität des Belegs ist dieuuidV7allein- Kein separates
datetime-Feld - die Zeit steckt inuuidV7
Retrograde und progressive Nachverfolgbarkeit
SKR04 6000 an 1600"] BS --> SR["source_sha256
im Tagebucheintrag"] SR --> BE["Beleg
(SHA-256 match)"] BE --> SC["Sidecar .v7g.md
V7GUID:uuidV7"] SC --> DE["Tagebucheintrag
uuidV7"] end subgraph PRO["Progressiv (Prüfer vom Beleg vorwärts)"] direction LR BE2["Beleg
(SHA-256)"] BE2 --> SC2["Sidecar .v7g.md
gcpn.journal_entry_ref"] SC2 --> BS2["Buchungssatz
SKR04"] BS2 --> GB["Grundbuch
(JSON)"] GB --> EB["Eröffnungsbilanz"] end style BS fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style SR fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style BE fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style SC fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style DE fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style BE2 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style SC2 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style BS2 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style GB fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style EB fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33
| Richtung | Start | Auflösung über | Ziel | GoBD-Bezug |
|---|---|---|---|---|
| Retrograd | Buchungssatz (SKR04) | source_sha256 → Beleg → Sidecar uuidV7 |
Tagebucheintrag | Rz. 146 (Nachvollziehbarkeit) |
| Progressiv | Beleg (SHA-256) | Sidecar gcpn.journal_entry_ref → Buchungssatz → Grundbuch |
Eröffnungsbilanz | Rz. 147 (Nachprüfbarkeit) |
GoBD-Bezug: Die retrograde Nachverfolgbarkeit entspricht GoBD Rz. 146 (Nachvollziehbarkeit - "sachverständiger Dritter in angemessener Zeit"). Die progressive Nachverfolgbarkeit entspricht GoBD Rz. 147 (Nachprüfbarkeit). Beide sind by Design durch SHA-256 + V7GUID + Sidecar gewährleistet - nicht durch manuelle Querverweise.
E-Rechnung: XML ist das Ur-Dokument
(XML oder ZUGFeRD)"] ER --> V["Validierung
EN 16931 / XRechnung-Schema"] V -->|gültig| A["Ablage im Git-Repo
XML unverändert"] V -->|ungültig| R["Fehler-Logging
+ manuelle Prüfung"] A --> S["Sidecar .v7g.md
SHA-256 + V7GUID:uuidV7"] S --> B["Buchungssatz
source_sha256 → XML"] B --> N["Nachverfolgbarkeit
retrograd + progressiv"] style ER fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style V fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style A fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style R fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style S fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style B fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style N fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33
XRechnung vs. ZUGFeRD
| Format | Struktur | Ur-Dokument | Visualisierung |
|---|---|---|---|
| XRechnung | Reines XML (EN 16931) | XML-Datei | XML-Viewer erforderlich (z. B. ELSTER e-rechnung.elster.de) |
| ZUGFeRD | Hybrid: PDF + eingebettetes XML | XML-Teil (seit 2025 maßgebend, BMF FAQ 12a) | PDF-Bild (nur Hilfsanzeige) |
Wichtig - ZUGFeRD seit 2025: Bei Abweichungen zwischen XML-Teil und PDF-Bildteil ist seit 2025 der strukturierte (XML-)Teil maßgebend (BMF FAQ Frage 12a). Das PDF-Bild ist nicht mehr führend. Der Sidecar muss das XML als Ur-Dokument referenzieren, nicht das PDF.
Pre-Commit-Hook für E-Rechnungen
Der Pre-Commit-Hook prüft bei E-Rechnungen:
| Prüfung | Fehler bei |
|---|---|
| XML-Datei hat gültige XRechnung/ZUGFeRD-Struktur | Ungültige XML-Struktur |
Sidecar .v7g.md vorhanden |
Fehlender Sidecar |
sha256 im Sidecar matcht XML-Datei |
Hash-Mismatch (Datei verändert) |
v7g_taxonomy klassifiziert als E-Rechnung |
Fehlende Klassifizierung |
Kein datetime/date-Feld im Sidecar (Zeit in uuidV7) |
Redundantes Feld |
E-Mail-Archivierung
E-Mails sind Handels- oder Geschäftsbriefe im Sinne des § 147 Abs. 1 Nr. 2/3 AO und damit 6 Jahre aufzubewahren. Viele Unternehmer archivieren E-Mails nicht - das ist ein GoBD-Verstoß.
(EML/MBOX)"] EM --> EX["Anhang extrahiert
(PDF, XML)"] EM --> AR["EML archiviert
(unverändert)"] EX --> SH["SHA-256 pro Anhang"] AR --> SH2["SHA-256 der EML"] SH --> SC["Sidecar .v7g.md
pro Beleg"] SH2 --> SC2["Sidecar .v7g.md
für E-Mail"] style EM fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style EX fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style AR fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style SH fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style SH2 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style SC fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style SC2 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33
| Schritt | Aktion | GoBD-Bezug |
|---|---|---|
| E-Mail empfangen | EML-Datei unverändert speichern | § 147 Abs. 1 Nr. 2 AO (empfangene Handelsbriefe) |
| Anhang extrahieren | PDF/XML-Anhang separat ablegen + SHA-256 | Maschinelle Auswertbarkeit (§ 147 Abs. 6 AO) |
| Sidecar pro Beleg | .v7g.md für EML und für jeden Anhang |
Nachvollziehbarkeit (Rz. 146) |
| Absender-Verifikation | DKIM/SPF-Header im Sidecar dokumentiert | Beweiskraft der E-Mail |
Praxis-Tipp: Ein Git-Repo kann E-Mails (EML) und Anhänge (PDF, XML) parallel archivieren - mit klarer Trennung durch Beleg-Typ im Sidecar (
v7g_taxonomy). Der Pre-Commit-Hook prüft, dass jede EML einen Sidecar hat und jeder Anhang separat klassifiziert ist.
Beleg-Vollständigkeit (Pre-Commit-Hook)
vorhanden?"} P1 -->|nein| R1["Commit abgelehnt
Belegreferenz fehlt"] P1 -->|ja| P2{"Beleg existiert
im Repo?"} P2 -->|nein| R2["Commit abgelehnt
Beleg nicht gefunden"] P2 -->|ja| P3{"Sidecar .v7g.md
vorhanden?"} P3 -->|nein| R3["Commit abgelehnt
Sidecar fehlt"] P3 -->|ja| P4{"SHA-256 match?"} P4 -->|nein| R4["Commit abgelehnt
Beleg verändert"] P4 -->|ja| OK["Commit akzeptiert
Beleg-Vollständigkeit OK"] style C fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style H fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style P1 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style P2 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style P3 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style P4 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style R1 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R2 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R3 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R4 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style OK fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33
| Prüfung | Fehler bei | GoBD-Bezug |
|---|---|---|
source_sha256 vorhanden |
Fehlende Belegreferenz | Rz. 146 (Nachvollziehbarkeit) |
| Beleg existiert im Repo | Beleg nicht archiviert | § 147 Abs. 1 Nr. 4 AO (Buchungsbeleg) |
| Sidecar vorhanden | Fehlende Klassifizierung | Rz. 146 (Nachvollziehbarkeit) |
| SHA-256 match | Beleg nachträglich verändert | Rz. 146 (Unveränderbarkeit) |
Risiko-Leverage
| Heute (cheap) | Morgen (revisionssicher) | Risiko gemindert |
|---|---|---|
| SHA-256 pro Beleg | Eindeutige Beleg-ID, unabhängig vom Dateinamen | Bestreitung der Beleg-Echtheit |
Sidecar mit Composite Key V7GUID:uuidV7 |
Klassifizierungsakt nachvollziehbar | Bestreitung der Klassifizierung |
source_sha256 pro Buchungssatz |
Retrograde Nachverfolgbarkeit | Bestreitung der Beleg-Zuordnung |
gcpn.journal_entry_ref im Sidecar |
Progressive Nachverfolgbarkeit | Bestreitung der Buchung |
| E-Rechnung XML unverändert + Sidecar | § 14b UStG konform (Unversehrtheit) | Nichtabzugsfähigkeit Vorsteuer |
| E-Mail EML archiviert + Sidecar | § 147 Abs. 1 Nr. 2 AO konform | Beweisverlust bei Behörden-Streitigkeit |
| Pre-Commit-Hook prüft Beleg-Vollständigkeit | Kein Buchungssatz ohne Beleg | GoBD-Verstoß "nicht vollständig" |
Harness-Anforderung (Vorschau)
Aus ED05 ableitbar:
| ID | Anforderung | Priorität |
|---|---|---|
| FA-2.1 | SHA-256 als Beleg-ID | MUST |
| FA-2.2 | .v7g.md Sidecar-Pflicht pro Beleg |
MUST |
| FA-2.3 | Sidecar mit Composite Key V7GUID:uuidV7 |
MUST |
| FA-2.8 | DMS-Funktionalität: Beleg-Klassifikation | MUST |
| FA-2.9 | E-Rechnung-Integration: XRechnung/ZUGFeRD-Import, Validierung | SHOULD |
| FA-2.10 | E-Mail-Archivierung: EML + SHA-256 + Sidecar | MUST |
| FA-2.11 | GoBD-Ordnung: Index pro Geschäftsjahr | MUST |
| FA-2.12 | Retrograde Nachverfolgbarkeit | MUST |
| FA-2.13 | Progressive Nachverfolgbarkeit | MUST |
| FA-2.14 | Pre-Commit-Hook: Beleg-Vollständigkeit prüfen | MUST |
| FA-2.15 | Scan-Workflow: Papier → Scan → SHA-256 → Sidecar | SHOULD |
Die vollständige Anforderungsliste in Harness-Anforderungen.md.
Quellen
- GoBD (BMF-Schreiben, Rz. 146 - Nachvollziehbarkeit, Rz. 147 - Nachprüfbarkeit)
- AO (§ 147 Abs. 1 Nr. 2/3 - Handelsbriefe, § 147 Abs. 1 Nr. 4 - Buchungsbelege, § 147 Abs. 2 - maschinell auswertbar, § 147 Abs. 3 - Aufbewahrungsfristen)
- UStG (§ 14 - E-Rechnung, § 14b - Aufbewahrung)
- BMF-FAQ zur E-Rechnung (Stand März 2026)
- EN 16931 (CEN/TC 434 - XRechnung, ZUGFeRD)
AFJD/agents/(anonymisiert) - SSoT-Konzept mit Belegarchiv, Sidecars
Quellen-Topologie und CDN-Referenz-Links
| Rolle | Ort | Zweck |
|---|---|---|
| Primary / SSoT | git.gitcover.org/GCC | Kanonische Ablage (GPG-signiert, versioniert) |
| Public OSS Mirror / CDN | codeberg.org/gitcover-commons | Read-only-Spiegel; FLOSS-Discovery |
| Community Hub | github.com/gitcover-commons | Issues & Discussions; Quell-Code-Referenz auf Codeberg |
Hinweis: Diese Zuordnung von Quellen, Mirror und Community-Hub spiegelt den aktuellen Stand wider und kann sich ändern. Bitte prüfen Sie die jeweilige kanonische Quelle auf gitcover.org für den aktuellen Zustand.