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:

Kernaussage

GoBD-konforme Belegablage bedeutet:

  1. 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 Key V7GUID:uuidV7 dient der Ablage-Organisation (z. B. nach Belegart) und DB-Queries (z. B. bei EF Core in einer Vertical App) - nicht der Identität selbst.
  2. Jeder Beleg hat einen Sidecar - .v7g.md mit Klassifizierung (V7GUID), Objekt-Identität (uuidV7), Taxonomie, Obsoleszenz-Status, Erfassungszeit (in uuidV7 als 48-Bit-Zeitstempel)
  3. Jeder Buchungssatz referenziert seinen Beleg - source_sha256 im Tagebucheintrag → Beleg
  4. Retrograde Nachverfolgbarkeit - vom Buchungssatz → Beleg → Tagebucheintrag → uuidV7 auflösbar
  5. Progressive Nachverfolgbarkeit - vom Beleg → Buchungssatz → Grundbuch → Eröffnungsbilanz auflösbar
  6. 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

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart TD B["Beleg"] B --> P["Papierbeleg
(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 verankert
  • V7GUID (Class) - klassifiziert den Beleg-Typ aus .gitcover Registry (Belegart, Ablage-Organisation, DB-Query bei Vertical App mit EF Core)
  • v7g_taxonomy[].v7guid - Object ID des klassifizierten Belegs
  • gcpn.prima_nota_ref / journal_entry_ref - Querverweis auf Grundbuch/Journal (progressive Nachverfolgbarkeit)
  • Der Composite Key V7GUID:uuidV7 dient Ablage-Organisation und Query - die Identität des Belegs ist die uuidV7 allein
  • Kein separates datetime-Feld - die Zeit steckt in uuidV7

Retrograde und progressive Nachverfolgbarkeit

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart LR subgraph RET["Retrograd (Prüfer vom Buchungssatz rückwärts)"] direction LR BS["Buchungssatz
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

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart TD ER["E-Rechnung empfangen
(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ß.

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart LR EM["E-Mail empfangen
(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)

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart TD C["Commit mit Buchungssatz"] C --> H["Pre-Commit-Hook"] H --> P1{"source_sha256
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

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.