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:
- Documentos justificantes en papel, en carpetas: no son electrónicos, no se pueden evaluar mecánicamente y no permiten una trazabilidad retrogresiva/progresiva
- PDF en cuentas en la nube: no conformes con GoBD (sin inmutabilidad, sin evaluabilidad mecánica, dependencia del prestador de servicios)
- Correos electrónicos con adjuntos PDF: no se archivan (un buzón de correo electrónico no es un archivo), no existe autenticidad del documento justificante ni cadena de prueba
- No se entienden las facturas electrónicas (XML): muchos empresarios no saben que, desde 2025, el archivo XML es el documento original, no el PDF
- (A menudo) No hay organización: los documentos justificantes están ordenados por fecha, no por operación; los asientos contables no tienen referencia del documento justificante
- (A menudo) No hay trazabilidad retrogresiva: desde el asiento contable, el auditor no puede resolver hasta el documento justificante porque falta la referencia
- (A menudo) No hay trazabilidad progresiva: desde el documento justificante no se puede resolver hasta el asiento contable porque faltan las referencias cruzadas
Mensaje clave
El archivo de documentos justificantes conforme a GoBD significa:
- 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 compuestaV7GUID:uuidV7sirve 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. - Cada documento justificante tiene un sidecar:
.v7g.mdcon la clasificación (V7GUID), la identidad del objeto (uuidV7), la taxonomía, el estado de obsolescencia y el momento de captura (enuuidV7, 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(bloquesourceintegrado, esquemagcsig-1.4); se prescinde de un.v7g.mdindependiente: sin sidecars concurrentes. - Cada asiento contable hace referencia a su documento justificante:
source_sha256en el asiento del libro diario → documento justificante - Trazabilidad retrogresiva: se puede rastrear desde el asiento contable → documento justificante → asiento del libro diario →
uuidV7 - Trazabilidad progresiva: se puede rastrear desde el documento justificante → asiento contable → libro mayor → balance de apertura
- 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
(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 GUIDV7GUID(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 clasificadogcpn.prima_nota_ref/journal_entry_ref: referencia cruzada al libro mayor/diario (trazabilidad progresiva)- La clave compuesta
V7GUID:uuidV7sirve para la organización del almacenamiento y las consultas: la identidad del documento justificante es únicamenteuuidV7- No hay un campo
datetimeindependiente: el tiempo está contenido enuuidV7
Trazabilidad retrogresiva 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 |
|---|---|---|---|---|
| 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
(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.
(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)
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
- GoBD (circular del BMF, Rz. 146: trazabilidad, Rz. 147: verificabilidad)
- AO (§ 147 Abs. 1 Nr. 2/3: cartas comerciales, § 147 Abs. 1 Nr. 4: documentos justificantes contables, § 147 Abs. 2: evaluable mecánicamente, § 147 Abs. 3: plazos de conservación)
- UStG (§ 14: factura electrónica, § 14b: conservación)
- FAQ del BMF sobre la factura electrónica (estado: marzo de 2026)
- EN 16931 (CEN/TC 434: XRechnung, ZUGFeRD)
E1/agents/(anonimizado): concepto SSoT con archivo de documentos justificantes y sidecars
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.