ED06 - 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 - .gc.md mit Klassifizierung (V7GUID), Objekt-Identität (uuidV7), Taxonomie, Obsoleszenz-Status, Erfassungszeit (in uuidV7 als 48-Bit-Zeitstempel). Ausnahme (ab 261011): Belege, die in einen Signaturvorgang übernommen werden (digitaler Eigenbeleg, z. B. Bewirtungsbeleg), tragen ihre Sidecar-Metadaten vollständig im *.gcsig.md (integrierter source-Block, Schema gcsig-1.4); ein separates .gc.md entfällt — keine konkurrierenden Sidecars.
  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.gc.md  # Sidecar
│   │   └── rechnung_002.pdf      # Sonstige Rechnung (PDF)
│   │   └── rechnung_002.pdf.gc.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 .gc.md-Sidecar mit dem Composite Key V7GUID:uuidV7:

{
  "$schema": "https://gitcover.org/schemas/v7g-sidecar-2.0.schema.json",
  "V7GUID": "<V7GUID-Class-aus-Registry>",
  "docUid": "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 .gc.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 .gc.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.

Auffindbarkeit: docUid statt Name/Pfad (261026)

Jede Belegreferenz in einer Rechnung führt die docUid des Ur-Belegs, nicht Name oder Pfad: im XML als cac:AdditionalDocumentReference/cbc:ID (uuidV7), im Sidecar/GCPN als docUid. Die DMS-Registry übernimmt dieselbe docUid als object_id - sie erfindet keine zweite Identität. Ein Beleg ist damit eindeutig per docUid auffindbar, auch wenn er umbenannt oder verschoben wird.

Die Action, die einen Beleg erzeugt bzw. speichert, wird als pgid (Prozess-Gateway, V7GUID-Klasse) geführt: produced_by_pgid für die Erzeugung (z. B. Rechnungserstellung 180), stored_by_pgid für die DMS-Registrierung (z. B. 183). Katalog: GCUV/TOP/compliance/process_gateways.json; normative 8-Bit-Werte: OSS/TOP/.gitcover/dictionaries/gateway_ids.json.

Ein-Datei-GCPN: Für jede Rechnung liegt ein .gcpn.md vor, das XML (Ur-Doc) und PDF (Ansicht) in documents[] führt, den Workflow create→pdf→present→accept→sign→register sowie events und relations (Vertrag/Kostenbelege) enthält. XML/PDF bleiben separate Dateien; ein separates .gc.md entfällt. Progressiv (Rz. 147) liest man vom GCPN zu den Dokumenten, retrograd (Rz. 146) vom docUid im DMS über den GCPN zu den Belegen.

Promote-Regel: Nach Repo-Scan und Sidecar-Erstellung kann ein .gc.md in den GCPN angereichert werden; die Sidecar-JSON-Daten werden eingebettet (GCPN = Obermenge, .gc.md = Subset). Danach ist die separate .gc.md redundant und kann entfernt werden; die Git-Historie bleibt der GoBD-Nachweis, der GCPN ist SSoT.

Rechnungs-Identität: invoice_id ist eine uuidV7 (Ordnungs-/Referenzkriterium); invoice_no ist nur Text. Seller/Buyer werden über ihre Party-uuidV7 referenziert (creditor/vendor bzw. debitor/customer), nicht über Klarnamen (PII).

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 .gc.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)[https://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 .gc.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 .gc.md
pro Beleg"] SH2 --> SC2["Sidecar .gc.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 .gc.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/MBOX) 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 .gc.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 ED06 ableitbar:

ID Anforderung Priorität
FA-2.1 SHA-256 als Beleg-ID MUST
FA-2.2 Sidecar pro Beleg — *.gc.md oder (bei signierten Belegen/Eigenbelegen) integriert in *.gcsig.md 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.