ED06 - Chứng từ, DMS, hóa đơn điện tử: Trật tự, truy vết ngược/xuôi

Vấn đề

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

Thực tế hiện nay trong lĩnh vực doanh nghiệp vừa và nhỏ:

Tuyên bố cốt lõi

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

  1. Mỗi chứng từ có một danh tính duy nhất (DocID) - uuidV7 (Object ID) đã tự nó là danh tính duy nhất của chứng từ, không phụ thuộc vào tên tệp. Ngoài ra, mỗi chứng từ nhận một mã băm SHA-256 như kiểm tra tính toàn vẹn bằng 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ụ với EF Core trong một Vertical App) - không phải bản thân danh tính.
  2. Mỗi chứng từ có một Sidecar - .gc.md với phân loại (V7GUID), danh tính đối tượng (uuidV7), taxonomy, trạng thái lỗi thời, thời điểm ghi nhận (trong uuidV7 dưới dạng dấu thời gian 48-bit). Ngoại lệ (từ 261011): chứng từ được đưa vào một quy trình ký (chứng từ tự lập kỹ thuật số, ví dụ chứng từ chiêu đãi), mang siêu dữ liệu Sidecar của chúng hoàn toàn trong *.gcsig.md (khối source tích hợp, schema gcsig-1.4); một .gc.md riêng bị bỏ — không có các Sidecar cạnh tranh.
  3. Mỗi bút toán tham chiếu chứng từ của nó - source_sha256 trong mục nhật ký → chứng từ
  4. Truy vết ngược - từ bút toán → chứng từ → mục nhật ký → uuidV7 có thể phân giải
  5. Truy vết xuôi - từ chứng từ → bút toán → sổ cái → bảng cân đối mở đầu có thể phân giải
  6. Hóa đơn điện tử: 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 hình thành qua việc sắp xếp về sau, mà qua các trường bắt buộc mang tính cấu trúc (SHA-256, V7GUID, Sidecar) và Pre-Commit-Hooks, kiểm tra mọi bút toán về tham chiếu chứng từ.

Các loại chứng từ và đặc điểm GoBD của chúng

%%{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 điểm GoBD Thời hạn lưu trữ
Chứng từ giấy Cần quét (§ 147 Abs. 2 AO); bản gốc có thể bị hủy nếu bản quét 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à "hóa đơn điện tử"; SHA-256 + Sidecar; có thể đánh giá bằng máy? Không - PDF không có cấu trúc 8 năm
Email (EML + tệp đính kèm) Hộp thư email không phải kho lưu trữ; EML phải được lưu trữ cùng tệp đính kèm; xác minh người gửi 6 năm (§ 147 Abs. 1 Nr. 2/3 AO)
Hóa đơn điện tử (XML) XML là tài liệu gốc (từ 2025, § 14 UStG); lưu giữ không thay đổi; xác thực EN 16931; có thể đánh giá bằng máy 8 năm

Quan trọng - Hóa đơn điện tử từ 2025: Từ ngày 1 tháng 1 năm 2025, hóa đơn điện tử là bắt buộc đối với giao dịch B2B giữa các doanh nghiệp trong nước (§ 14 UStG). Một PDF đơn giản không còn là hóa đơn điện tử - nó là "hóa đơn khác". Hóa đơn điện tử chỉ tồn tại khi được phát hành, truyền và nhận ở định dạng điện tử có cấu trúc (XML, EN 16931). Xem ED01 "Hóa đơn điện tử: Các đị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.gc.md  # Sidecar
│   │   └── rechnung_002.pdf      # Sonstige Rechnung (PDF)
│   │   └── rechnung_002.pdf.gc.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 cho mỗi chứng từ (bắt buộc)

Mỗi chứng từ nhận một Sidecar .gc.md với Composite Key V7GUID:uuidV7:

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

Composite Key V7GUID:uuidV7 - tổ chức lưu trữ và truy vấn:

  • uuidV7 (Object ID) - đã tự nó là danh tính duy nhất (DocID) của chứng từ, được tạo với dấu thời gian định trước, dấu thời gian 48-bit được 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/nhật ký (truy vết xuôi)
  • 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ừ chỉ là uuidV7
  • Không có trường datetime riêng - thời gian nằm trong uuidV7

Truy vết ngược và xuôi

%%{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 .gc.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 .gc.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 Điểm bắt đầu Phân giải qua Đích Liên quan GoBD
Ngược Bút toán (SKR04) source_sha256 → chứng từ → Sidecar uuidV7 Mục nhật ký Rz. 146 (khả năng truy vết)
Xuôi Chứng từ (SHA-256) Sidecar gcpn.journal_entry_ref → bút toán → sổ cái Bảng cân đối mở đầu Rz. 147 (khả năng kiểm tra)

Liên quan GoBD: Truy vết ngược tương ứng GoBD Rz. 146 (khả năng truy vết - "một bên thứ ba có chuyên môn trong thời gian hợp lý"). Truy vết xuôi tương ứng GoBD Rz. 147 (khả năng kiểm tra). Cả hai được bảo đảm by Design qua SHA-256 + V7GUID + Sidecar - không qua các tham chiếu chéo thủ công.

Khả năng tìm thấy: docUid thay vì tên/đường dẫn (261026)

Mỗi tham chiếu chứng từ trong một hóa đơn mang docUid của chứng từ gốc, không phải tên hoặc đường dẫn: trong XML là cac:AdditionalDocumentReference/cbc:ID (uuidV7), trong Sidecar/GCPN là docUid. Registry DMS tiếp nhận cùng docUid đó làm object_id - nó không tạo ra danh tính thứ hai. Nhờ đó, một chứng từ có thể được tìm thấy duy nhất qua docUid, ngay cả khi nó được đổi tên hoặc di chuyển.

Action tạo hoặc lưu một chứng từ được quản lý dưới dạng pgid (Process-Gateway, lớp V7GUID): produced_by_pgid cho việc tạo (ví dụ tạo hóa đơn 180), stored_by_pgid cho việc đăng ký DMS (ví dụ 183). Danh mục: GCUV/TOP/compliance/process_gateways.json; giá trị 8-bit chuẩn: OSS/TOP/.gitcover/dictionaries/gateway_ids.json.

GCPN một tệp: Với mỗi hóa đơn có một .gcpn.md, dẫn XML (tài liệu gốc) và PDF (chế độ xem) trong documents[], chứa workflow create→pdf→present→accept→sign→register cũng như events và relations (hợp đồng/chứng từ chi phí). XML/PDF vẫn là các tệp riêng biệt; một .gc.md riêng bị bỏ. Truy vết xuôi (Rz. 147) người ta đọc từ GCPN đến các tài liệu, truy vết ngược (Rz. 146) từ docUid trong DMS qua GCPN đến các chứng từ.

Quy tắc promote: Sau khi quét repo và tạo Sidecar, một .gc.md có thể được làm giàu vào GCPN; dữ liệu JSON Sidecar được nhúng (GCPN = tập cha, .gc.md = tập con). Sau đó, .gc.md riêng là dư thừa và có thể bị xóa; lịch sử Git vẫn là bằng chứng GoBD, GCPN là SSoT.

Danh tính hóa đơn: invoice_id là một uuidV7 (tiêu chí trật tự/tham chiếu); invoice_no chỉ là văn bản. Seller/Buyer được tham chiếu qua Party-uuidV7 của họ (creditor/vendor hoặc debitor/customer), không qua tên thật (PII).

Hóa đơn điện tử: 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 .gc.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 so với 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 trình xem XML (ví dụ ELSTER (e-rechnung.elster.de)[https://e-rechnung.elster.de]
ZUGFeRD Lai: PDF + XML được nhúng Phần XML (từ 2025 có tính quyết định, BMF FAQ 12a) Ảnh PDF (chỉ hiển thị phụ trợ)

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

Pre-Commit-Hook cho hóa đơn điện tử

Pre-Commit-Hook kiểm tra ở hóa đơn điện tử:

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 .gc.md tồn tại Thiếu Sidecar
sha256 trong Sidecar khớp tệp XML Hash không khớp (tệp bị thay đổi)
v7g_taxonomy được phân loại là hóa đơn điện tử 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ữ email

Email là thư thương mại hoặc thư kinh doanh theo nghĩa của § 147 Abs. 1 Nr. 2/3 AO và do đó phải được lưu giữ 6 năm. Nhiều doanh nhân không lưu trữ email - đó 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 .gc.md
pro Beleg"] SH2 --> SC2["Sidecar .gc.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 Liên quan GoBD
Nhận email Lưu tệp EML không thay đổi § 147 Abs. 1 Nr. 2 AO (thư thương mại nhận được)
Trích xuất tệp đính kèm Lưu riêng tệp đính kèm PDF/XML + SHA-256 Khả năng đánh giá bằng máy (§ 147 Abs. 6 AO)
Sidecar cho mỗi chứng từ .gc.md cho EML và cho mỗi tệp đính kèm Khả năng truy vết (Rz. 146)
Xác minh người gửi Header DKIM/SPF được ghi lại trong Sidecar Giá trị chứng cứ của email

Mẹo thực hành: Một Git-Repo có thể lưu trữ email (EML/MBOX) và tệp đính kèm (PDF, XML) song song - với sự phân tách rõ ràng theo loại chứng từ trong Sidecar (v7g_taxonomy). Pre-Commit-Hook kiểm tra rằng mỗi EML có một Sidecar và mỗi tệp đính kèm được phân loại riêng.

Tính đầy đủ của 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 .gc.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 Liên quan GoBD
source_sha256 tồn tại Thiếu tham chiếu chứng từ Rz. 146 (khả năng truy vết)
Chứng từ tồn tại trong repo Chứng từ không được lưu trữ § 147 Abs. 1 Nr. 4 AO (chứng từ hạch toán)
Sidecar tồn tại Thiếu phân loại Rz. 146 (khả năng truy vết)
SHA-256 khớp Chứng từ bị thay đổi về sau Rz. 146 (tính bất biến)

Đòn bẩy rủi ro

Hiện nay (tiết kiệm) Ngày mai (an toàn kiểm toán) Rủi ro được giảm thiểu
SHA-256 cho mỗi chứng từ ID chứng từ duy nhất, không phụ thuộc tên tệp Phản bác tính xác thực của chứng từ
Sidecar với Composite Key V7GUID:uuidV7 Hành vi phân loại có thể truy vết Phản bác việc phân loại
source_sha256 cho mỗi bút toán Truy vết ngược Phản bác việc gán chứng từ
gcpn.journal_entry_ref trong Sidecar Truy vết xuôi Phản bác việc hạch toán
XML hóa đơn điện tử không thay đổi + Sidecar Tuân thủ § 14b UStG (tính nguyên vẹn) Không được khấu trừ thuế GTGT đầu vào
Email EML được lưu trữ + Sidecar Tuân thủ § 147 Abs. 1 Nr. 2 AO Mất bằng chứng khi tranh chấp với cơ quan
Pre-Commit-Hook kiểm tra tính đầy đủ của chứng từ Không có bút toán nào không có chứng từ Vi phạm GoBD "không đầy đủ"

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

Có thể suy ra từ ED06:

ID Yêu cầu Ưu tiên
FA-2.1 SHA-256 làm ID chứng từ MUST
FA-2.2 Sidecar cho mỗi chứng từ — *.gc.md hoặc (với chứng từ đã ký/chứng từ tự lập) tích hợp trong *.gcsig.md 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 hóa đơn điện tử: nhập XRechnung/ZUGFeRD, xác thực SHOULD
FA-2.10 Lưu trữ email: EML + SHA-256 + Sidecar MUST
FA-2.11 Trật tự GoBD: chỉ mục theo năm tài chính MUST
FA-2.12 Truy vết ngược MUST
FA-2.13 Truy vết xuôi MUST
FA-2.14 Pre-Commit-Hook: kiểm tra tính đầy đủ của chứng từ MUST
FA-2.15 Workflow quét: giấy → bản quét → SHA-256 → Sidecar SHOULD

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

Nguồn

Cấu trúc nguồn và liên kết tham chiếu CDN

Vai trò Vị trí Mục đích
Primary / SSoT git.gitcover.org/GCC Lưu trữ chuẩn (ký GPG, có phiên bản)
Public OSS Mirror / CDN codeberg.org/gitcover-commons Bản sao 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 ý: Việc phân loại 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 chuẩn tương ứng trên gitcover.org để biết trạng thái hiện tại.