ED06 - Documentos justificantes, DMS, factura electrónica: organización, trazabilidad retrogresiva/progresiva

Problema

Un empresario comienza con el archivo de documentos justificantes y se enfrenta a la pregunta: ¿Cómo ordeno los documentos justificantes conforme a GoBD y cómo los hago trazables?

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

Mensaje clave

El archivo de documentos justificantes conforme a GoBD significa:

  1. Cada documento justificante tiene una identidad única (DocID): la uuidV7 (ID de objeto) ya es por sí sola la identidad única del documento justificante, con independencia del nombre del archivo. Además, cada documento justificante recibe un hash SHA-256 como comprobación criptográfica de integridad. La clave compuesta V7GUID:uuidV7 sirve para la organización del almacenamiento (p. ej., por tipo de documento justificante) y las consultas de BD (p. ej., en EF Core en una aplicación vertical), no como identidad en sí misma.
  2. Cada documento justificante tiene un sidecar: .v7g.md con la clasificación (V7GUID), la identidad del objeto (uuidV7), la taxonomía, el estado de obsolescencia y el momento de captura (en uuidV7, como marca temporal de 48 bits). Excepción (a partir del 261011): los documentos justificantes que se transfieren a un proceso de firma (documento justificante digital propio, p. ej., justificante de gastos de representación) contienen todos sus metadatos sidecar en el *.gcsig.md (bloque source integrado, esquema gcsig-1.4); se prescinde de un .v7g.md independiente: sin sidecars concurrentes.
  3. Cada asiento contable hace referencia a su documento justificante: source_sha256 en el asiento del libro diario → documento justificante
  4. Trazabilidad retrogresiva: se puede rastrear desde el asiento contable → documento justificante → asiento del libro diario → uuidV7
  5. Trazabilidad progresiva: se puede rastrear desde el documento justificante → asiento contable → libro mayor → balance de apertura
  6. Factura electrónica: el XML es el documento original, no el PDF (desde 2025, § 14 UStG, EN 16931)

Cumplimiento por diseño: la organización de los documentos justificantes no se obtiene mediante una reordenación posterior, sino mediante campos obligatorios estructurales (SHA-256, V7GUID, sidecar) y Pre-Commit-Hooks que comprueban que cada asiento contable tenga una referencia de documento justificante.

Tipos de documentos justificantes 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 documento justificante Particularidad conforme a GoBD Plazo de conservación
Documento justificante en papel Es necesario escanearlo (§ 147 Abs. 2 AO); el original puede destruirse si el escaneo es conforme a GoBD 8 años (§ 147 Abs. 3 AO)
Documento justificante en PDF ("otra factura") Desde 2025 ya no es una "factura electrónica"; SHA-256 + sidecar; ¿evaluable mecánicamente? No: el PDF no está estructurado 8 años
Correo electrónico (EML + adjunto) Un buzón de correo electrónico no es un archivo; el EML debe archivarse con el adjunto; verificación del remitente 6 años (§ 147 Abs. 1 Nr. 2/3 AO)
Factura electrónica (XML) El XML es el documento original (desde 2025, § 14 UStG); conservar sin modificar; validación EN 16931; evaluable mecánicamente 8 años

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

Clasificación de documentos justificantes 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 documento justificante (obligatorio)

Cada documento justificante recibe un sidecar .v7g.md con la clave compuesta V7GUID:uuidV7:

{
  "$schema": "https://gitcover.org/schemas/v7g-sidecar-1.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
  }
}

Clave compuesta V7GUID:uuidV7: organización del almacenamiento y consulta:

  • uuidV7 (ID de objeto): ya es por sí sola la identidad única (DocID) del documento justificante, generada con una marca de tiempo predefinida, con una marca temporal de 48 bits anclada en el GUID
  • V7GUID (clase): clasifica el tipo de documento justificante a partir del registro .gitcover (tipo de documento justificante, organización del almacenamiento, consulta de BD en una aplicación vertical con EF Core)
  • v7g_taxonomy[].v7guid: ID de objeto del documento justificante clasificado
  • gcpn.prima_nota_ref / journal_entry_ref: referencia cruzada al libro mayor/diario (trazabilidad progresiva)
  • La clave compuesta V7GUID:uuidV7 sirve para la organización del almacenamiento y las consultas: la identidad del documento justificante es únicamente uuidV7
  • No hay un campo datetime independiente: el tiempo está contenido en uuidV7

Trazabilidad retrogresiva 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
Retrogresiva Asiento contable (SKR04) source_sha256 → documento justificante → sidecar uuidV7 Asiento del libro diario Rz. 146 (trazabilidad)
Progresiva Documento justificante (SHA-256) Sidecar gcpn.journal_entry_ref → asiento contable → libro mayor Balance de apertura Rz. 147 (verificabilidad)

Referencia GoBD: la trazabilidad retrogresiva corresponde a GoBD Rz. 146 (trazabilidad: "un tercero experto en un plazo razonable"). La trazabilidad progresiva corresponde a GoBD Rz. 147 (verificabilidad). Ambas están garantizadas por diseño mediante SHA-256 + V7GUID + sidecar, no mediante referencias cruzadas manuales.

Factura electrónica: 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 frente a 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 (determinante 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 imagen PDF, desde 2025 la parte estructurada (XML) es determinante (BMF FAQ, pregunta 12a). La imagen PDF ya no prevalece. El sidecar debe referenciar el XML como documento original, no el PDF.

Pre-Commit-Hook para facturas electrónicas

El Pre-Commit-Hook comprueba en las facturas electrónicas:

Comprobación Error si
El archivo XML tiene una estructura XRechnung/ZUGFeRD válida Estructura XML no válida
Existe el sidecar .v7g.md Sidecar ausente
El sha256 del sidecar coincide con el archivo XML Discrepancia de hash (archivo modificado)
v7g_taxonomy lo clasifica como factura electrónica Falta la clasificación
No hay ningún campo datetime/date en el sidecar (el tiempo está en uuidV7) Campo redundante

Archivado de correos electrónicos

Los correos electrónicos son cartas comerciales o de negocio en el sentido del § 147 Abs. 1 Nr. 2/3 AO y, por tanto, deben conservarse 6 años. Muchos empresarios no archivan los correos electrónicos: esto infringe 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
Recibir el correo electrónico Guardar el archivo EML sin modificar § 147 Abs. 1 Nr. 2 AO (cartas comerciales recibidas)
Extraer el adjunto Guardar por separado el adjunto PDF/XML + SHA-256 Evaluabilidad mecánica (§ 147 Abs. 6 AO)
Sidecar por documento justificante .v7g.md para el EML y para cada adjunto Trazabilidad (Rz. 146)
Verificación del remitente Cabeceras DKIM/SPF documentadas en el sidecar Valor probatorio del correo electrónico

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

Integridad de los documentos justificantes (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
Comprobación Error si Referencia GoBD
source_sha256 presente Falta la referencia del documento justificante Rz. 146 (trazabilidad)
El documento justificante existe en el repositorio El documento justificante no está archivado § 147 Abs. 1 Nr. 4 AO (documento justificante contable)
Sidecar presente Falta la clasificación Rz. 146 (trazabilidad)
El SHA-256 coincide El documento justificante fue modificado a posteriori Rz. 146 (inmutabilidad)

Palancas de reducción de riesgos

Hoy (barato) Mañana (a prueba de revisiones) Riesgo mitigado
SHA-256 por documento justificante ID único del documento justificante, con independencia del nombre del archivo Impugnación de la autenticidad del documento justificante
Sidecar con clave compuesta V7GUID:uuidV7 El acto de clasificación es trazable Impugnación de la clasificación
source_sha256 por asiento contable Trazabilidad retrogresiva Impugnación de la asignación del documento justificante
gcpn.journal_entry_ref en el sidecar Trazabilidad progresiva Impugnación del asiento
XML de factura electrónica sin modificar + sidecar Conforme con § 14b UStG (integridad) Imposibilidad de deducir el IVA soportado
Correo electrónico EML archivado + sidecar Conforme con § 147 Abs. 1 Nr. 2 AO Pérdida de pruebas en una controversia con la autoridad
El Pre-Commit-Hook comprueba la integridad de los documentos justificantes Ningún asiento contable sin documento justificante Incumplimiento de GoBD "incompleto"

Requisito del harness (vista previa)

Derivables de ED06:

ID Requisito Prioridad
FA-2.1 SHA-256 como ID del documento justificante MUST
FA-2.2 Sidecar por documento justificante: *.v7g.md o (para documentos justificantes firmados/propios) integrado en *.gcsig.md MUST
FA-2.3 Sidecar con clave compuesta V7GUID:uuidV7 MUST
FA-2.8 Funcionalidad del DMS: clasificación de documentos justificantes MUST
FA-2.9 Integración de facturas electrónicas: importación y validación de XRechnung/ZUGFeRD SHOULD
FA-2.10 Archivado de correos electrónicos: EML + SHA-256 + sidecar MUST
FA-2.11 Organización conforme a GoBD: índice por ejercicio fiscal MUST
FA-2.12 Trazabilidad retrogresiva MUST
FA-2.13 Trazabilidad progresiva MUST
FA-2.14 Pre-Commit-Hook: comprobar la integridad de los documentos justificantes MUST
FA-2.15 Flujo de escaneo: papel → escaneo → SHA-256 → sidecar SHOULD

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

Fuentes

Topología de fuentes y enlaces de referencia al CDN

Rol Ubicación Propósito
Primario / SSoT git.gitcover.org/GCC Repositorio canónico (firmado con GPG, versionado)
Espejo OSS público / CDN codeberg.org/gitcover-commons Espejo de solo lectura; descubrimiento FLOSS
Centro comunitario github.com/gitcover-commons Issues & Discussions; referencia al código fuente en Codeberg

Nota: esta asignación de fuentes, espejo y centro comunitario refleja el estado actual y puede cambiar. Consulte la fuente canónica respectiva en gitcover.org para conocer el estado actual.