ED05 - Chứng từ, DMS, e-Hóa đơn: Trật tự, Truy vết Retrograde/Progressive

Vấn đề

Một doanh nhân bắt đầu lưu trữ chứng từ - và đối mặt với câu hỏi: Tôi sắp xếp chứng từ tuân thủ GoBD thế nào, và làm cho chúng truy vết được ra sao?

Thực hành hiện nay trong lĩnh vực SME:

Tuyên bố cốt lõi

Lưu trữ chứng từ tuân thủ GoBD có nghĩa:

  1. Mỗi chứng từ có danh tính duy nhất (DocID) - uuidV7 (Object ID) đã một mình là danh tính duy nhất của chứng từ, độc lập tên tệp. Thêm mỗi chứng từ nhận hash SHA-256 làm kiểm tra toàn vẹn mật mã. Composite Key V7GUID:uuidV7 phục vụ tổ chức lưu trữ (ví dụ theo loại chứng từ) và truy vấn DB (ví dụ EF Core trong Vertical App) - không phải bản thân danh tính.
  2. Mỗi chứng từ có sidecar - .v7g.md với phân loại (V7GUID), danh tính đối tượng (uuidV7), taxonomy, trạng thái obsolescence, thời điểm ghi nhận (trong uuidV7 dạng timestamp 48-bit)
  3. Mỗi booking tham chiếu chứng từ - source_sha256 trong mục nhật ký → chứng từ
  4. Truy vết retrograde - giải quyết từ booking → chứng từ → mục nhật ký → uuidV7
  5. Truy vết progressive - giải quyết từ chứng từ → booking → sổ cái → bảng cân đối đầu kỳ
  6. e-hóa đơn: XML là tài liệu gốc - không phải PDF (từ 2025, § 14 UStG, EN 16931)

Compliance by Design: Trật tự chứng từ không phát sinh qua sắp xếp sau, mà qua trường bắt buộc mang tính cấu trúc (SHA-256, V7GUID, sidecar) và Pre-Commit hook kiểm tra mỗi booking có tham chiếu chứng từ.

Loại chứng từ và đặc thù 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
Loại chứng từ Đặc thù GoBD Thời hạn lưu trữ
Chứng từ giấy Cần scan (§ 147 Abs. 2 AO); bản gốc có thể tiêu hủy nếu scan tuân thủ GoBD 8 năm (§ 147 Abs. 3 AO)
Chứng từ PDF ("hóa đơn khác") Từ 2025 không còn là "e-hóa đơn"; SHA-256 + sidecar; đánh giá bằng máy? Không - PDF không cấu trúc 8 năm
E-mail (EML + đính kèm) Hộp thư e-mail không phải archive; EML phải lưu cùng đính kèm; xác minh người gửi 6 năm (§ 147 Abs. 1 Nr. 2/3 AO)
e-hóa đơn (XML) XML là tài liệu gốc (từ 2025, § 14 UStG); lưu không đổi; xác thực EN 16931; đánh giá bằng máy 8 năm

Quan trọng - e-hóa đơn từ 2025: Từ 1.1.2025 e-hóa đơn bắt buộc cho doanh thu B2B giữa doanh nghiệp trong nước (§ 14 UStG). Một PDF đơn giản không còn là e-hóa đơn - nó là "hóa đơn khác". E-hóa đơn chỉ tồn tại nếu được xuất, truyền và nhận trong định dạng điện tử có cấu trúc (XML, EN 16931). Xem ED01 "e-hóa đơn: định dạng XML là tài liệu gốc trong AO".

Phân loại chứng từ trong Git Repo

Cấu trúc thư mục

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 mỗi chứng từ (bắt buộc)

Mỗi chứng từ nhận một sidecar .v7g.md với 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 - tổ chức lưu trữ và truy vấn:

  • uuidV7 (Object ID) - đã một mình là danh tính duy nhất (DocID) của chứng từ, tạo với timestamp định sẵn, timestamp 48-bit neo trong GUID
  • V7GUID (Class) - phân loại loại chứng từ từ registry .gitcover (loại chứng từ, tổ chức lưu trữ, truy vấn DB trong Vertical App với EF Core)
  • v7g_taxonomy[].v7guid - Object ID của chứng từ được phân loại
  • gcpn.prima_nota_ref / journal_entry_ref - tham chiếu chéo đến sổ cái/journal (truy vết progressive)
  • Composite Key V7GUID:uuidV7 phục vụ tổ chức lưu trữ và truy vấn - danh tính của chứng từ là uuidV7 một mình
  • Không có trường datetime riêng - thời gian nằm trong uuidV7

Truy vết Retrograde và Progressive

%%{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
Hướng Bắt đầu Giải quyết qua Đích Tham chiếu GoBD
Retrograde Booking (SKR04) source_sha256 → chứng từ → sidecar uuidV7 Mục nhật ký Rz. 146 (truy vết)
Progressive Chứng từ (SHA-256) sidecar gcpn.journal_entry_ref → booking → sổ cái Bảng cân đối đầu kỳ Rz. 147 (kiểm toán)

Tham chiếu GoBD: Truy vết retrograde tương ứng GoBD Rz. 146 (truy vết - "bên thứ ba có hiểu biết trong thời gian hợp lý"). Truy vết progressive tương ứng GoBD Rz. 147 (kiểm toán). Cả hai được đảm bảo by Design qua SHA-256 + V7GUID + sidecar - không qua tham chiếu chéo thủ công.

e-Hóa đơn: XML là tài liệu gốc

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

Định dạng Cấu trúc Tài liệu gốc Hiển thị
XRechnung XML thuần (EN 16931) Tệp XML Cần XML viewer (ví dụ ELSTER e-rechnung.elster.de)
ZUGFeRD Hybrid: PDF + XML nhúng Phần XML (có thẩm quyền từ 2025, BMF FAQ 12a) Hình PDF (chỉ hiển thị phụ)

Quan trọng - ZUGFeRD từ 2025: Khi có sai lệch giữa phần XML và phần hình PDF, phần có cấu trúc (XML) có thẩm quyền từ 2025 (BMF FAQ câu 12a). Hình PDF không còn dẫn đầu. Sidecar phải tham chiếu XML làm tài liệu gốc, không phải PDF.

Pre-Commit Hook cho e-hóa đơn

Pre-Commit hook kiểm tra cho e-hóa đơn:

Kiểm tra Lỗi khi
Tệp XML có cấu trúc XRechnung/ZUGFeRD hợp lệ Cấu trúc XML không hợp lệ
Sidecar .v7g.md Thiếu sidecar
sha256 trong sidecar khớp tệp XML Hash mismatch (tệp đổi)
v7g_taxonomy phân loại là e-hóa đơn Thiếu phân loại
Không có trường datetime/date trong sidecar (thời gian trong uuidV7) Trường dư thừa

Lưu trữ E-mail

E-mail là thương thư hoặc thư kinh doanh theo § 147 Abs. 1 Nr. 2/3 AO và do đó phải lưu 6 năm. Nhiều doanh nhân không lưu e-mail - đây là vi phạm 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
Bước Hành động Tham chiếu GoBD
Nhận e-mail Lưu tệp EML không đổi § 147 Abs. 1 Nr. 2 AO (thương thư nhận)
Trích đính kèm Lưu riêng PDF/XML + SHA-256 Đánh giá bằng máy (§ 147 Abs. 6 AO)
Sidecar mỗi chứng từ .v7g.md cho EML và mỗi đính kèm Truy vết (Rz. 146)
Xác minh người gửi Header DKIM/SPF tài liệu trong sidecar Giá trị chứng minh của e-mail

Mẹo thực tế: Một Git repo có thể lưu e-mail (EML) và đính kèm (PDF, XML) song song - với tách biệt rõ theo loại chứng từ trong sidecar (v7g_taxonomy). Pre-Commit hook kiểm tra mỗi EML có sidecar và mỗi đính kèm được phân loại riêng.

Đầy đủ chứng từ (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
Kiểm tra Lỗi khi Tham chiếu GoBD
source_sha256 Thiếu tham chiếu chứng từ Rz. 146 (truy vết)
Chứng từ có trong repo Chứng từ không lưu § 147 Abs. 1 Nr. 4 AO (chứng từ booking)
Sidecar có Thiếu phân loại Rz. 146 (truy vết)
SHA-256 khớp Chứng từ đổi sau Rz. 146 (không thay đổi)

Đòn bẩy rủi ro

Hôm nay (rẻ) Ngày mai (kiểm toán được) Rủi ro giảm
SHA-256 mỗi chứng từ ID chứng từ duy nhất, độc lập tên tệp Tranh chấp xác thực chứng từ
Sidecar với Composite Key V7GUID:uuidV7 Hành động phân loại truy vết Tranh chấp phân loại
source_sha256 mỗi booking Truy vết retrograde Tranh chấp phân công chứng từ
gcpn.journal_entry_ref trong sidecar Truy vết progressive Tranh chấp booking
e-hóa đơn XML không đổi + sidecar Tuân thủ § 14b UStG (toàn vẹn) Không khấu trừ thuế đầu vào
E-mail EML lưu + sidecar Tuân thủ § 147 Abs. 1 Nr. 2 AO Mất bằng chứng trong tranh chấp cơ quan
Pre-Commit hook kiểm tra đầy đủ chứng từ Không booking không chứng từ Vi phạm GoBD "không đầy đủ"

Yêu cầu Harness (Xem trước)

Dẫn xuất từ ED05:

ID Yêu cầu Ưu tiên
FA-2.1 SHA-256 làm ID chứng từ MUST
FA-2.2 Nghĩa vụ sidecar .v7g.md mỗi chứng từ MUST
FA-2.3 Sidecar với Composite Key V7GUID:uuidV7 MUST
FA-2.8 Chức năng DMS: phân loại chứng từ MUST
FA-2.9 Tích hợp e-hóa đơn: nhập XRechnung/ZUGFeRD, xác thực SHOULD
FA-2.10 Lưu trữ e-mail: EML + SHA-256 + sidecar MUST
FA-2.11 Trật tự GoBD: index mỗi năm tài chính MUST
FA-2.12 Truy vết retrograde MUST
FA-2.13 Truy vết progressive MUST
FA-2.14 Pre-Commit hook: kiểm tra đầy đủ chứng từ MUST
FA-2.15 Workflow scan: giấy → scan → SHA-256 → sidecar SHOULD

Danh sách yêu cầu đầy đủ trong Harness-Anforderungen.md.

Nguồn

Topo nguồn và liên kết tham chiếu CDN

Role Địa điểm Mục đích
Primary / SSoT git.gitcover.org/GCC Lưu trữ chính thức (ký GPG, có phiên bản)
Public OSS Mirror / CDN codeberg.org/gitcover-commons Mirror chỉ đọc; khám phá FLOSS
Community Hub github.com/gitcover-commons Issues & Discussions; tham chiếu mã nguồn trên Codeberg

Lưu ý: Phân công nguồn, mirror và community hub này phản ánh trạng thái hiện tại và có thể thay đổi. Vui lòng kiểm tra nguồn chính thức tương ứng trên gitcover.org cho trạng thái hiện tại.