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:
- Comprobantes en papel en carpetas - no electrónicos, no evaluables automáticamente, no trazables de forma retrógrada/progresiva
- PDF en cuentas en la nube - no conforme a GoBD (sin inmutabilidad, sin posibilidad de evaluación automática, dependencia del proveedor de servicios)
- Correos electrónicos con adjuntos PDF - no archivados (el buzón de correo no es un archivo), sin autenticidad del comprobante, sin cadena de prueba
- e-facturas (XML) no comprendidas - muchos empresarios no saben que desde 2025 el archivo XML es el documento original, no el PDF
- (A menudo) Falta orden - los comprobantes se archivan por fecha, no por operación; los asientos contables no tienen referencia al comprobante
- (A menudo) Falta trazabilidad retrógrada - desde el asiento contable, el auditor no puede llegar al comprobante porque falta la referencia
- (A menudo) Falta trazabilidad progresiva - desde el comprobante no se puede llegar al asiento contable porque faltan las referencias cruzadas
Idea central
Un archivado de comprobantes conforme a GoBD significa:
- 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 KeyV7GUID:uuidV7sirve 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. - Cada comprobante tiene un Sidecar -
.v7g.mdcon clasificación (V7GUID), identidad del objeto (uuidV7), taxonomía, estado de obsolescencia, momento de captura (enuuidV7como marca de tiempo de 48 bits) - Cada asiento contable referencia su comprobante -
source_sha256en la entrada de diario → comprobante - Trazabilidad retrógrada - desde el asiento contable → comprobante → entrada de diario →
uuidV7se puede resolver - Trazabilidad progresiva - desde el comprobante → asiento contable → libro diario → balance de apertura se puede resolver
- 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
(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 GUIDV7GUID(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 clasificadogcpn.prima_nota_ref/journal_entry_ref- referencia cruzada al libro diario/journal (trazabilidad progresiva)- El Composite Key
V7GUID:uuidV7sirve para la organización del archivado y el Query - la identidad del comprobante es lauuidV7sola- Sin campo
datetimeseparado - el tiempo está contenido enuuidV7
Trazabilidad retrógrada y progresiva
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
(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.
(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)
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
- GoBD (escrito del BMF, Rz. 146 - comprensibilidad, Rz. 147 - verificabilidad)
- AO (§ 147 Abs. 1 Nr. 2/3 - cartas comerciales, § 147 Abs. 1 Nr. 4 - justificantes de asiento, § 147 Abs. 2 - evaluable automáticamente, § 147 Abs. 3 - plazos de conservación)
- UStG (§ 14 - e-factura, § 14b - conservación)
- BMF-FAQ sobre la e-factura (a marzo de 2026)
- EN 16931 (CEN/TC 434 - XRechnung, ZUGFeRD)
AFJD/agents/(anonimizado) - concepto SSoT con archivo de comprobantes, Sidecars
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.