ED05 - Chứng từ, DMS, hóa đơn điện tử: Trật tự, khả năng truy vết ngược/xuôi
Vấn đề
Một doanh nghiệp bắt đầu việc lưu trữ chứng từ - và đứng trước câu hỏi: Làm thế nào để sắp xếp chứng từ tuân thủ GoBD, và làm thế nào để chúng có thể truy vết?
Thực tiễn hiện nay trong lĩnh vực doanh nghiệp vừa và nhỏ (KMU):
- Chứng từ giấy trong các thư mục - không điện tử, không thể đánh giá bằng máy, không truy vết được ngược/xuôi
- PDF trong tài khoản Cloud - không tuân thủ GoBD (không có tính bất biến, không thể đánh giá bằng máy, phụ thuộc vào nhà cung cấp dịch vụ)
- Email có tệp PDF đính kèm - không được lưu trữ (hộp thư email không phải là kho lưu trữ), không có tính xác thực của chứng từ, không có chuỗi bằng chứng
- Hóa đơn điện tử (XML) chưa được hiểu đúng - nhiều doanh nghiệp không biết rằng từ năm 2025, tệp XML mới là tài liệu gốc, chứ không phải PDF
- (Thường) Không có trật tự - chứng từ xếp theo ngày tháng, không theo nghiệp vụ; bút toán không có tham chiếu chứng từ
- (Thường) Không có khả năng truy vết ngược - từ bút toán, kiểm toán viên không thể truy ngược về chứng từ vì thiếu tham chiếu
- (Thường) Không có khả năng truy vết xuôi - từ chứng từ không thể truy tới bút toán vì thiếu tham chiếu chéo
Thông điệp cốt lõi
Lưu trữ chứng từ tuân thủ GoBD có nghĩa là:
- Mỗi chứng từ có một định danh duy nhất (DocID) -
uuidV7(Object ID) một mình đã là định danh duy nhất của chứng từ, độc lập với tên tệp. Ngoài ra, mỗi chứng từ nhận một giá trị băm SHA-256 làm kiểm tra toàn vẹn bằng mật mã. Composite KeyV7GUID:uuidV7phục vụ cho 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) - chứ không phục vụ cho bản thân định danh. - Mỗi chứng từ có một Sidecar -
.v7g.mdchứa phân loại (V7GUID), định danh đối tượng (uuidV7), taxonomy, trạng thái lỗi thời (obsolescence), thời điểm ghi nhận (tronguuidV7dưới dạng dấu thời gian 48 bit) - Mỗi bút toán tham chiếu chứng từ của nó -
source_sha256trong bản ghi nhật ký → chứng từ - Khả năng truy vết ngược - từ bút toán → chứng từ → bản ghi nhật ký →
uuidV7đều truy được - Khả năng truy vết xuôi - từ chứng từ → bút toán → sổ cái → bảng cân đối mở đầu đều truy được
- Hóa đơn điện tử: XML là tài liệu gốc - chứ 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 từ việc sắp xếp sau này, mà từ các trường bắt buộc mang tính cấu trúc (SHA-256, V7GUID, Sidecar) và các Pre-Commit-Hook kiểm tra tham chiếu chứng từ của mỗi bút toán.
Các loại chứng từ và đặc thù GoBD của chúng
(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 quét (§ 147 Abs. 2 AO); bản gốc có thể 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 là phi cấu trúc | 8 năm |
| Email (EML + tệp đính kèm) | Hộp thư email không phải là 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 trữ 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 tệp PDF đơn thuần không còn là hóa đơn điện tử - nó là một "hóa đơn khác". Hóa đơn điện tử chỉ được coi là tồn tại khi nó được lập, 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ử: Định dạng XML là tài liệu gốc theo 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 cho 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à định danh duy nhất (DocID) của chứng từ, được tạo với dấu thời gian định sẵn, dấu thời gian 48 bit được neo trong GUIDV7GUID(Class) - phân loại loại chứng từ từ.gitcoverRegistry (loại chứng từ, tổ chức lưu trữ, truy vấn DB khi dùng Vertical App với EF Core)v7g_taxonomy[].v7guid- Object ID của chứng từ đã được phân loạigcpn.prima_nota_ref/journal_entry_ref- tham chiếu chéo tới sổ cái/nhật ký (khả năng truy vết xuôi)- Composite Key
V7GUID:uuidV7phục vụ cho tổ chức lưu trữ và truy vấn - định danh của chứng từ chỉ làuuidV7một mình- Không có trường
datetimeriêng - thời gian nằm tronguuidV7
Khả năng truy vết ngược và xuôi
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 | Điểm bắt đầu | Truy qua | Đích | Liên hệ GoBD |
|---|---|---|---|---|
| Ngược (retrograde) | Bút toán (SKR04) | source_sha256 → chứng từ → Sidecar uuidV7 |
Bản ghi nhật ký | Rz. 146 (khả năng truy nguyên) |
| Xuôi (progressive) | 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 chứng) |
Liên hệ GoBD: Khả năng truy vết ngược tương ứng với GoBD Rz. 146 (Nachvollziehbarkeit - "bên thứ ba có chuyên môn trong thời gian hợp lý"). Khả năng truy vết xuôi tương ứng với GoBD Rz. 147 (Nachprüfbarkeit). Cả hai đều được bảo đảm by Design nhờ SHA-256 + V7GUID + Sidecar - chứ không phải bằng các tham chiếu chéo thủ công.
Hóa đơn điện tử: XML là tài liệu gốc
(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 so với ZUGFeRD
| Định dạng | Cấu trúc | Tài liệu gốc | Trực quan hóa |
|---|---|---|---|
| XRechnung | XML thuần (EN 16931) | Tệp XML | Cần XML-Viewer (ví dụ: ELSTER (e-rechnung.elster.de)[https://e-rechnung.elster.de] |
| ZUGFeRD | Lai: PDF + XML nhúng | Phần XML (từ 2025 là phần quyết định, BMF FAQ 12a) | Hình PDF (chỉ là hiển thị hỗ trợ) |
Quan trọng - ZUGFeRD từ 2025: Khi có sai khác giữa phần XML và phần hình PDF, từ 2025 phần có cấu trúc (XML) là phần quyết định (BMF FAQ câu hỏi 12a). Hình PDF không còn là phần dẫn chiếu chính. Sidecar phải tham chiếu XML là tài liệu gốc, chứ không phải PDF.
Pre-Commit-Hook cho hóa đơn điện tử
Pre-Commit-Hook kiểm tra đối với hóa đơn điện tử:
| Kiểm tra | Báo 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ệ |
Có Sidecar .v7g.md |
Thiếu Sidecar |
sha256 trong Sidecar khớp với tệp XML |
Hash không khớp (tệp đã bị thay đổi) |
v7g_taxonomy 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 nằm trong uuidV7) |
Trường dư thừa |
Lưu trữ email
Email là thư từ thương mại hoặc thư từ kinh doanh theo nghĩa của § 147 Abs. 1 Nr. 2/3 AO và do đó phải được lưu trữ 6 năm. Nhiều doanh nghiệp không lưu trữ email - đó là một vi phạm 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
| Bước | Hành động | Liên hệ 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 tệp đính kèm PDF/XML riêng + SHA-256 | Khả năng đánh giá bằng máy (§ 147 Abs. 6 AO) |
| Sidecar cho mỗi chứng từ | .v7g.md cho EML và cho từng tệp đính kèm |
Khả năng truy nguyên (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 tế: Một Git-Repo có thể lưu trữ song song email (EML/MBOX) và tệp đính kèm (PDF, XML) - 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)
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 | Báo lỗi khi | Liên hệ GoBD |
|---|---|---|
Có source_sha256 |
Thiếu tham chiếu chứng từ | Rz. 146 (khả năng truy nguyên) |
| Chứng từ tồn tại trong Repo | Chứng từ chưa được lưu trữ | § 147 Abs. 1 Nr. 4 AO (chứng từ hạch toán) |
| Có Sidecar | Thiếu phân loại | Rz. 146 (khả năng truy nguyên) |
| SHA-256 khớp | Chứng từ bị thay đổi sau đó | Rz. 146 (tính bất biến) |
Đòn bẩy rủi ro
| Hôm nay (rẻ) | 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, độc lập với tên tệp | Phủ nhận 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 nguyên được | Phủ nhận việc phân loại |
source_sha256 cho mỗi bút toán |
Khả năng truy vết ngược | Phủ nhận việc đối chiếu chứng từ |
gcpn.journal_entry_ref trong Sidecar |
Khả năng truy vết xuôi | Phủ nhận việc hạch toán |
| Hóa đơn điện tử XML không thay đổi + Sidecar | Tuân thủ § 14b UStG (tính nguyên vẹn) | Mất quyền khấu trừ thuế đầ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 trong tranh chấp với cơ quan nhà nước |
| Pre-Commit-Hook kiểm tra tính đầy đủ của chứng từ | Không có bút toán nào thiếu chứng từ | Vi phạm GoBD "không đầy đủ" |
Yêu cầu Harness (xem trước)
Có thể suy ra từ ED05:
| ID | Yêu cầu | Mức ưu tiên |
|---|---|---|
| FA-2.1 | SHA-256 làm ID chứng từ | MUST |
| FA-2.2 | Bắt buộc Sidecar .v7g.md cho 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 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 cho mỗi năm tài chính | MUST |
| FA-2.12 | Khả năng truy vết ngược | MUST |
| FA-2.13 | Khả năng 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 | Quy trình quét: giấy → quét → SHA-256 → Sidecar | SHOULD |
Danh sách yêu cầu đầy đủ nằm trong Harness-Anforderungen.md.
Nguồn
- GoBD (Công văn BMF, Rz. 146 - khả năng truy nguyên, Rz. 147 - khả năng kiểm chứng)
- AO (§ 147 Abs. 1 Nr. 2/3 - thư từ thương mại, § 147 Abs. 1 Nr. 4 - chứng từ hạch toán, § 147 Abs. 2 - có thể đánh giá bằng máy, § 147 Abs. 3 - thời hạn lưu trữ)
- UStG (§ 14 - hóa đơn điện tử, § 14b - lưu trữ)
- BMF-FAQ về hóa đơn điện tử (cập nhật tháng 3/2026)
- EN 16931 (CEN/TC 434 - XRechnung, ZUGFeRD)
AFJD/agents/(ẩn danh) - khái niệm SSoT với kho lưu trữ chứng từ, Sidecar
Cấu trúc nguồn và liên kết tham chiếu CDN
| Vai trò | Địa điểm | Mục đích |
|---|---|---|
| Primary / SSoT | git.gitcover.org/GCC | Kho lưu trữ chính tắc (ký GPG, có phiên bản) |
| Public OSS Mirror / CDN | codeberg.org/gitcover-commons | Bản mirror chỉ đọc; khám phá FLOSS |
| Community Hub | github.com/gitcover-commons | Issues & Discussions; tham chiếu mã nguồn về Codeberg |
Lưu ý: Cách phân vai này giữa nguồn, Mirror và Community-Hub phản ánh hiện trạng và có thể thay đổi. Vui lòng kiểm tra nguồn chính tắc tương ứng trên gitcover.org để biết trạng thái mới nhất.