ED06 - Comprobantes, DMS, e-factura: orden, trazabilidad retrógrada/progresiva

Problema

Un empresario comienza con el archivado de comprobantes - y se enfrenta a la pregunta: ¿Cómo organizo los comprobantes conforme a GoBD y cómo los hago trazables?

La práctica actual en el ámbito de las pymes:

Idea central

Un archivado de comprobantes conforme a GoBD significa:

  1. Cada comprobante tiene una identidad única (DocID) - la uuidV7 (Object ID) ya es por sí sola la identidad única del comprobante, independientemente del nombre de archivo. Además, cada comprobante recibe un hash SHA-256 como verificación criptográfica de integridad. La Composite Key V7GUID:uuidV7 sirve para la organización del archivado (p. ej., por tipo de comprobante) y para las DB-Queries (p. ej., con EF Core en una Vertical App) - no para la identidad misma.
  2. Cada comprobante tiene un Sidecar - .v7g.md con clasificación (V7GUID), identidad del objeto (uuidV7), taxonomía, estado de obsolescencia, momento de captura (en uuidV7 como marca de tiempo de 48 bits)
  3. Cada asiento contable referencia su comprobante - source_sha256 en la entrada de diario → comprobante
  4. Trazabilidad retrógrada - desde el asiento contable → comprobante → entrada de diario → uuidV7 se puede resolver
  5. Trazabilidad progresiva - desde el comprobante → asiento contable → libro diario → balance de apertura se puede resolver
  6. e-factura: el XML es el documento original - no el PDF (desde 2025, § 14 UStG, EN 16931)

Compliance by Design: el orden de los comprobantes no surge de una clasificación posterior, sino de campos obligatorios estructurales (SHA-256, V7GUID, Sidecar) y de Pre-Commit-Hooks que verifican cada asiento contable respecto a su referencia al comprobante.

Tipos de comprobantes y sus particularidades conforme a GoBD

%%{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
Tipo de comprobante Particularidad conforme a GoBD Plazo de conservación
Comprobante en papel Se requiere escaneo (§ 147 Abs. 2 AO); el original puede destruirse si el escaneo es conforme a GoBD 8 años (§ 147 Abs. 3 AO)
Comprobante PDF ("otra factura") Desde 2025 ya no es una "e-factura"; SHA-256 + Sidecar; ¿evaluable automáticamente? No - el PDF no está estructurado 8 años
Correo electrónico (EML + adjunto) El buzón de correo no es un archivo; el EML debe archivarse junto con el adjunto; verificación del remitente 6 años (§ 147 Abs. 1 Nr. 2/3 AO)
e-factura (XML) El XML es el documento original (desde 2025, § 14 UStG); conservar sin modificar; validación EN 16931; evaluable automáticamente 8 años

Importante - e-factura desde 2025: desde el 1 de enero de 2025, la e-factura es obligatoria para las operaciones B2B entre empresas nacionales (§ 14 UStG). Un PDF simple ya no es una e-factura - es una "otra factura". Solo existe una e-factura cuando se emite, transmite y recibe en un formato electrónico estructurado (XML, EN 16931). Véase ED01 "e-factura: los formatos XML son documentos originales en la AO".

Clasificación de comprobantes en el repositorio Git

Estructura de directorios

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 por comprobante (obligatorio)

Cada comprobante recibe un Sidecar .v7g.md con la 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 - organización del archivado y Query:

  • uuidV7 (Object ID) - ya es por sí sola la identidad única (DocID) del comprobante, generada con una marca de tiempo predefinida, con la marca de tiempo de 48 bits anclada en la GUID
  • V7GUID (Class) - clasifica el tipo de comprobante a partir del Registry .gitcover (tipo de comprobante, organización del archivado, DB-Query en Vertical App con EF Core)
  • v7g_taxonomy[].v7guid - Object ID del comprobante clasificado
  • gcpn.prima_nota_ref / journal_entry_ref - referencia cruzada al libro diario/journal (trazabilidad progresiva)
  • El Composite Key V7GUID:uuidV7 sirve para la organización del archivado y el Query - la identidad del comprobante es la uuidV7 sola
  • Sin campo datetime separado - el tiempo está contenido en uuidV7

Trazabilidad retrógrada y progresiva

%%{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
Dirección Inicio Resolución mediante Destino Referencia GoBD
Retrógrada Asiento contable (SKR04) source_sha256 → comprobante → Sidecar uuidV7 Entrada de diario Rz. 146 (comprensibilidad)
Progresiva Comprobante (SHA-256) Sidecar gcpn.journal_entry_ref → asiento contable → libro diario Balance de apertura Rz. 147 (verificabilidad)

Referencia GoBD: la trazabilidad retrógrada corresponde a GoBD Rz. 146 (comprensibilidad - "tercero experto en un plazo razonable"). La trazabilidad progresiva corresponde a GoBD Rz. 147 (verificabilidad). Ambas están garantizadas by Design mediante SHA-256 + V7GUID + Sidecar - no mediante referencias cruzadas manuales.

e-factura: el XML es el documento original

%%{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

Formato Estructura Documento original Visualización
XRechnung XML puro (EN 16931) Archivo XML Se requiere un visor XML (p. ej., ELSTER (e-rechnung.elster.de)[https://e-rechnung.elster.de]
ZUGFeRD Híbrido: PDF + XML incrustado Parte XML (prevalece desde 2025, BMF FAQ 12a) Imagen PDF (solo visualización auxiliar)

Importante - ZUGFeRD desde 2025: en caso de discrepancias entre la parte XML y la parte de imagen PDF, desde 2025 prevalece la parte estructurada (XML) (BMF FAQ pregunta 12a). La imagen PDF ya no es la determinante. El Sidecar debe referenciar el XML como documento original, no el PDF.

Pre-Commit-Hook para e-facturas

El Pre-Commit-Hook verifica en las e-facturas:

Verificación Error en caso de
El archivo XML tiene una estructura XRechnung/ZUGFeRD válida Estructura XML no válida
Sidecar .v7g.md presente Falta de Sidecar
sha256 en el Sidecar coincide con el archivo XML Hash-Mismatch (archivo modificado)
v7g_taxonomy clasifica como e-factura Falta de clasificación
Sin campo datetime/date en el Sidecar (tiempo en uuidV7) Campo redundante

Archivado de correos electrónicos

Los correos electrónicos son cartas comerciales o de negocios en el sentido del § 147 Abs. 1 Nr. 2/3 AO y, por tanto, deben conservarse durante 6 años. Muchos empresarios no archivan los correos electrónicos - eso constituye una infracción de GoBD.

%%{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
Paso Acción Referencia GoBD
Correo electrónico recibido Guardar el archivo EML sin modificar § 147 Abs. 1 Nr. 2 AO (cartas comerciales recibidas)
Extraer el adjunto Guardar el adjunto PDF/XML por separado + SHA-256 Posibilidad de evaluación automática (§ 147 Abs. 6 AO)
Sidecar por comprobante .v7g.md para el EML y para cada adjunto Comprensibilidad (Rz. 146)
Verificación del remitente Encabezados DKIM/SPF documentados en el Sidecar Valor probatorio del correo electrónico

Consejo práctico: un repositorio Git puede archivar en paralelo correos electrónicos (EML/MBOX) y adjuntos (PDF, XML) - con una separación clara por tipo de comprobante en el Sidecar (v7g_taxonomy). El Pre-Commit-Hook verifica que cada EML tenga un Sidecar y que cada adjunto esté clasificado por separado.

Completitud de los comprobantes (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
Verificación Error en caso de Referencia GoBD
source_sha256 presente Falta de referencia al comprobante Rz. 146 (comprensibilidad)
El comprobante existe en el repo Comprobante no archivado § 147 Abs. 1 Nr. 4 AO (justificante de asiento)
Sidecar presente Falta de clasificación Rz. 146 (comprensibilidad)
Coincidencia SHA-256 Comprobante modificado posteriormente Rz. 146 (inmutabilidad)

Apalancamiento de riesgo

Hoy (barato) Mañana (a prueba de auditoría) Riesgo mitigado
SHA-256 por comprobante ID de comprobante única, independiente del nombre de archivo Negación de la autenticidad del comprobante
Sidecar con Composite Key V7GUID:uuidV7 Acto de clasificación comprensible Negación de la clasificación
source_sha256 por asiento contable Trazabilidad retrógrada Negación de la asignación del comprobante
gcpn.journal_entry_ref en el Sidecar Trazabilidad progresiva Negación de la contabilización
e-factura XML sin modificar + Sidecar Conforme a § 14b UStG (integridad) Imposibilidad de deducir el IVA soportado
Correo electrónico EML archivado + Sidecar Conforme a § 147 Abs. 1 Nr. 2 AO Pérdida de pruebas en disputas con las autoridades
El Pre-Commit-Hook verifica la completitud de los comprobantes Ningún asiento contable sin comprobante Infracción de GoBD "incompleto"

Requisitos del Harness (vista previa)

Derivables de ED06:

ID Requisito Prioridad
FA-2.1 SHA-256 como ID de comprobante MUST
FA-2.2 Obligatoriedad del Sidecar .v7g.md por comprobante MUST
FA-2.3 Sidecar con Composite Key V7GUID:uuidV7 MUST
FA-2.8 Funcionalidad DMS: clasificación de comprobantes MUST
FA-2.9 Integración de e-factura: importación XRechnung/ZUGFeRD, validación SHOULD
FA-2.10 Archivado de correos electrónicos: EML + SHA-256 + Sidecar MUST
FA-2.11 Orden conforme a GoBD: índice por ejercicio fiscal MUST
FA-2.12 Trazabilidad retrógrada MUST
FA-2.13 Trazabilidad progresiva MUST
FA-2.14 Pre-Commit-Hook: verificar la completitud de los comprobantes MUST
FA-2.15 Flujo de trabajo de escaneo: papel → escaneo → SHA-256 → Sidecar SHOULD

La lista completa de requisitos en Harness-Anforderungen.md.

Fuentes

Topología de fuentes y enlaces de referencia CDN

Rol Ubicación Propósito
Primary / SSoT git.gitcover.org/GCC Archivo canónico (firmado con GPG, versionado)
Public OSS Mirror / CDN codeberg.org/gitcover-commons Espejo de solo lectura; descubrimiento FLOSS
Community Hub github.com/gitcover-commons Issues & Discussions; referencia del código fuente en Codeberg

Nota: esta asignación de fuentes, Mirror y Community Hub refleja el estado actual y puede cambiar. Por favor, compruebe la fuente canónica correspondiente en gitcover.org para conocer el estado actual.