ED02 - Mô hình tổ chức KMU: Tenant, Sphäre, Vai trò
Vấn đề
Một doanh nhân thành lập một tổ chức - và đứng trước câu hỏi: Làm thế nào để tôi cấu trúc tổ chức của mình sao cho các nghĩa vụ tuân thủ được phản ánh một cách tách bạch rõ ràng, dễ truy vết và an toàn khi kiểm toán?
Thực tiễn hiện nay trong lĩnh vực KMU không có sự phân tách rõ ràng:
- Tất cả nấu chung một nồi - tài liệu cá nhân và tài liệu kinh doanh lẫn lộn trong một hộp thư, một ổ đĩa, một tài khoản đám mây.
- Không phân tách Tenant - một holding với nhiều công ty con ghi sổ tất cả trong một instance duy nhất, mà không rõ bản ghi nào thuộc về công ty nào.
- Không phân tách Sphäre - ở các tổ chức phi lợi nhuận, các nghiệp vụ ideell, vermögensverwaltend, zweckbetrieblich và wirtschaftlich lẫn lộn trong một tài khoản, một thư mục, một repo.
- Không phân tách vai trò - doanh nhân tự làm mọi thứ (GF, kế toán, lương, F&E), nhưng repo không biết anh ấy đang hành động trong vai trò nào.
- Không có định danh rõ ràng - các bản ghi không có định danh duy nhất để gán chúng vào một tổ chức, một Sphäre, một vai trò.
Thông điệp cốt lõi
Cấu trúc một tổ chức theo mô hình GitCover-Verbund có nghĩa là: Tenant (tổ chức), Sphäre (lĩnh vực hoạt động trong trường hợp phi lợi nhuận) và vai trò (chức năng của tác nhân) được định nghĩa là trường bắt buộc của mọi artifact - chứ không phải là metadata tùy chọn. Git-Hooks kiểm tra ở mỗi commit rằng sự phân tách là đầy đủ. Nhờ đó hình thành Compliance by Design: Cấu trúc của tổ chức được neo giữ trong cấu trúc của repo.
Compliance by Design: Tenant, Sphäre và vai trò không phải là các nhãn dán bổ sung về sau - chúng là các trường bắt buộc mang tính cấu trúc, thiếu chúng thì artifact sẽ không được đưa vào repo.
Mô hình ba cấp: Tenant, Sphäre, Vai trò
(Beleg, Tagebucheintrag, Grundbuch-Eintrag)"] A --> T["Tenant
Welche Organisation?"] A --> S["Sphäre
Welcher Tätigkeitsbereich?
(nur gemeinnützig)"] A --> R["Rolle
In welcher Funktion handelt der Akteur?"] T --> T1["ORG-1 (KMU)"] T --> T2["ORG-1a (Tochter)"] T --> T3["ORG-1b (Tochter)"] S --> S1["ideell"] S --> S2["vermögensverwaltend"] S --> S3["zweckbetrieblich"] S --> S4["wirtschaftlich"] R --> R1["GF (Geschäftsführer)"] R --> R2["Buchhalter"] R --> R3["Lohnverantwortlicher"] R --> R4["F&E-Leiter"] R --> R5["Administrator"] style A fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style T fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style S fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style R fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style T1 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style T2 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style T3 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style S1 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style S2 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style S3 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style S4 fill:#D1FAE5,stroke:#0A7F5C,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 R5 fill:#FDBA74,stroke:#C2410C,color:#0F1B33
Cấp 1 - Tenant (Tổ chức)
Một Tenant là một đơn vị tổ chức độc lập về mặt pháp lý, có các nghĩa vụ ghi chép riêng của mình. Trong GitCover-Verbund, mỗi Tenant được quản lý như một Organization riêng (Git User) với các Git-repo tương ứng (hoặc branch-namespace riêng).
| Loại Tenant | Ví dụ (placeholder) | Nghĩa vụ riêng |
|---|---|---|
| Doanh nghiệp cá thể | ORG-1 (KMU) |
GoBD, AO, hóa đơn điện tử |
| Holding với công ty con | ORG-1 (Holding), ORG-1a/ORG-1b (công ty con) |
Mỗi công ty có bộ sổ kế toán riêng, báo cáo tài chính năm riêng |
| Tổ chức phi lợi nhuận | ORG-1 (phi lợi nhuận) |
Bổ sung: phân tách Sphäre, § 52 AO, VBG-Freistellung |
| Konsortium / liên kết | ORG-1, ORG-2, ORG-3 |
Mỗi tổ chức một Tenant riêng, tham chiếu chéo qua V7GUID |
Ví dụ thực tế: Một doanh nhân (
E1) điều hành một holding (ORG-1) với hai công ty con (ORG-1a,ORG-1b). Mỗi công ty con là một Tenant riêng với repo riêng. Holding có một meta-repo liên kết các công ty con qua các tham chiếu V7GUID - nhưng sổ sách của các công ty con vẫn được giữ tách biệt.
Cấp 2 - Sphäre (Lĩnh vực hoạt động, chỉ áp dụng cho tổ chức phi lợi nhuận)
Sphäre chỉ có liên quan đối với các tổ chức phi lợi nhuận - nhưng khi đó là bắt buộc. Pháp luật thuế (§ 51–68 AO) đòi hỏi phân tách bốn Sphäre để không đặt tư cách phi lợi nhuận vào nguy cơ.
| Sphäre | Ý nghĩa | Ví dụ |
|---|---|---|
| ideell | Hoạt động phục vụ mục đích theo điều lệ, miễn thuế | Chuỗi workshop, chương trình giáo dục |
| vermögensverwaltend | Quản lý tài sản của quỹ, miễn thuế | Tiền lãi từ đầu tư, thu nhập cho thuê |
| zweckbetrieblich | Hoạt động kinh doanh phục vụ mục đích, miễn thuế (§ 65 AO) | Phí thành viên, phí gia nhập |
| wirtschaftlich | Hoạt động kinh doanh không phục vụ mục đích, chịu thuế | Kinh doanh merchandising, thu nhập quảng cáo |
steuerfrei
§ 52 AO"] V --> VV["vermögensverwaltend
steuerfrei"] V --> Z["zweckbetrieblich
steuerfrei
§ 65 AO"] V --> W["wirtschaftlich
steuerpflichtig
§ 64 AO"] I --> F["Freibetrag
§ 3 Nr. 26/26a EStG"] Z --> F W --> ST["USt/KSt
pflichtig"] style V fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style I fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style VV fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style Z fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style W fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style F fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style ST fill:#FDBA74,stroke:#C2410C,color:#0F1B33
Rủi ro khi thiếu phân tách Sphäre: Trộn lẫn tài sản (§ 55 Abs. 1 Nr. 5 AO) là căn cứ tước tư cách phi lợi nhuận. Một tổ chức phi lợi nhuận không phân tách các nghiệp vụ kinh doanh và nghiệp vụ ideell sẽ đối mặt nguy cơ bị tước tư cách phi lợi nhuận - và kéo theo việc truy thu thuế đối với các quỹ dự trữ (hồi tố tới 15(!) năm).
Cấp 3 - Vai trò (Chức năng của tác nhân)
Vai trò ghi lại việc một tác nhân đã hành động với chức năng nào. Điều này quan trọng vì trong nhiều tổ chức, thường một người giữ nhiều vai trò (đặc biệt ở KMU) - và vì vai trò quyết định những nghĩa vụ nào được áp dụng.
| Vai trò | Chức năng | Nghĩa vụ điển hình |
|---|---|---|
| GF (giám đốc điều hành) | Đại diện ra bên ngoài, trách nhiệm tổng thể | GoBD, AO, thời hạn, quyền đại diện |
| Kế toán | Ghi sổ kế toán, lưu trữ chứng từ | GoBD, hóa đơn điện tử, lưu trữ |
| Người phụ trách lương | Tính lương, tờ khai bảo hiểm xã hội | SGB IV, DEÜV, LStDV |
| Trưởng bộ phận F&E | Nghiên cứu, chứng từ giờ FZul | FZulG, BSFZ, F&E so với hành chính |
| Quản trị viên | Quản lý repo, hooks, truy cập | Git, GPG, quyền truy cập |
Ví dụ thực tế: Doanh nhân
E1đồng thời là GF, kế toán, nhà nghiên cứu, nhà phát triển và trưởng bộ phận F&E. Trong repo, với mỗi artifact đều ghi rõ anh ấy đã hành động trong vai trò nào - ví dụrole: "GF"đối với một nghị quyết,role: "F&E-Leiter"đối với một chứng từ giờ FZul. Nhờ đó, vẫn truy vết được một bản ghi được tạo ra từ góc nhìn GF (hành chính) hay từ góc nhìn F&E (nghiên cứu).
Triển khai trong Git-repo
Cấu trúc thư mục
ORG-1/ # Tenant: KMU
├── .gitcover/ # GitCover-Konfiguration
│ ├── LEGAL_ENTITY.v7g.json # Tenant-Identität (V7GUID)
│ ├── dictionaries/ # Sphären, Rollen, Beleg-Typen
│ └── schemas/ # JSON-Schemata für Artefakte
├── diary/ # Tagebuch (SSoT)
│ ├── entries/ # Tages-Einträge
│ └── tenants/ # Tenant-Sichten (Symlinks)
├── registry/ # Behörden-Identifikatoren
├── sources/ # Belegarchiv (PDF, XML, EML)
├── sidecars/ # .v7g.md Sidecars
├── checks/ # Fristen-Check, Sphären-Check
└── {weitere bei Bedarf}/
Artifact JSON với Tenant, Sphäre, Vai trò
Mỗi artifact (mục nhật ký, chứng từ, mục sổ địa bạ) đều chứa Tenant, Sphäre và
vai trò như các trường bắt buộc. Nguyên tắc cốt lõi của khả năng truy vết
theo thời gian: Thời gian ghi nhận không phải là một trường riêng biệt,
mà được neo ngay trong chính uuidV7 - dưới dạng dấu thời gian 48-bit theo
RFC 9562 §5.7. uuidV7 có thể được sinh ra từ một dấu thời gian định trước
(không chỉ now()) thông qua GitCover Helper (UuidV7Gen), phần còn lại được
điền bằng giá trị ngẫu nhiên. Nhờ đó, thời gian ghi nhận được liên kết một cách
mật mã với định danh của artifact và không thể bị thay đổi về sau.
Quan trọng - Những gì được đưa vào Git-repo: Chỉ những artifact có cấu trúc này (mục JSON, sidecar, chứng từ) mới được đưa vào Git-repo. Tài liệu cá nhân không bao giờ được đưa vào repo, trừ khi chúng đã được đưa vào và phân loại rõ ràng với tư cách là artifact. Cái gì đã vào rồi thì ở luôn trong đó.
{
"$schema": "https://gitcover.org/schemas/diary-entry-1.0.schema.json",
"V7GUID": "<V7GUID-Class-aus-Registry>",
"uuidV7": "<uuidV7-Object-mit-vorgegebener-Zeitmarke>",
"author": "E1",
"role": "GF",
"tenant": "ORG-1",
"sphere": "ideell",
"source": "E1",
"source_sha256": "<SHA-256-...>",
"tags": ["lohnabrechnung", "sv-meldung"]
}
Giải thích về Composite Key:
V7GUID(Class Identifier) phân loại tài liệu/hành động dựa trên registry.gitcover(cái gì/loại nào).uuidV7(Object ID) là định danh đối tượng cụ thể với dấu thời gian định trước (RFC 9562 §5.7, 48-bit Unix-ms). Cả hai cùng nhau tạo thành GCPN Sidecar Composite KeyV7GUID:uuidV7. Một biểu diễn chuỗidatetimehoặcdateriêng biệt là dư thừa và không được lưu trong tầng dữ kiện - dấu thời gian 48-bit đã nằm sẵn tronguuidV7. Các biểu diễn chuỗi phục vụ truyền DTO/HTMX là trách nhiệm của Harness, không thuộc tầng dữ kiện.
Git-Hooks kiểm tra sự phân tách
vorhanden?"} P1 -->|nein| R1["Commit abgelehnt
Tenant fehlt"] P1 -->|ja| P2{"Sphäre
vorhanden?
(nur gemeinnützig)"} P2 -->|nein| R2["Commit abgelehnt
Sphäre fehlt"] P2 -->|ja| P3{"Rolle
vorhanden?"} P3 -->|nein| R3["Commit abgelehnt
Rolle fehlt"] P3 -->|ja| P4{"Sphäre
gültig?"} P4 -->|nein| R4["Commit abgelehnt
ungültige Sphäre"] P4 -->|ja| OK["Commit akzeptiert"] style C fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style H1 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
| Hook | Kiểm tra | Lỗi khi |
|---|---|---|
| Pre-Commit | Trường tenant tồn tại và hợp lệ |
Thiếu Tenant hoặc Tenant không xác định |
| Pre-Commit | Trường sphere tồn tại (chỉ khi phi lợi nhuận) |
Thiếu Sphäre ở Tenant phi lợi nhuận |
| Pre-Commit | Giá trị sphere hợp lệ (ideell/vermögensverwaltend/zweckbetrieblich/wirtschaftlich) |
Giá trị Sphäre không hợp lệ |
| Pre-Commit | Trường role tồn tại và hợp lệ |
Thiếu vai trò hoặc vai trò không xác định |
| Post-Commit | Tự động tạo chỉ mục theo từng Tenant và Sphäre | - |
Liên kết Tenant: Nhiều tổ chức
Meta-Repo"] H --> R1["ORG-1a (Tochter 1)
eigenes Repo"] H --> R2["ORG-1b (Tochter 2)
eigenes Repo"] H --> R3["ORG-1c (Tochter 3)
eigenes Repo"] R1 --> V1["V7GUID-Referenz
auf ORG-1"] R2 --> V2["V7GUID-Referenz
auf ORG-1"] R3 --> V3["V7GUID-Referenz
auf ORG-1"] H --> M["Meta-Repo
Querverweise über V7GUID
keine Buchungen"] style H fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style R1 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style R2 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style R3 fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style V1 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style V2 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style V3 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style M fill:#10A987,stroke:#0A7F5C,color:#FBFAF7
Một liên kết Tenant (holding với các công ty con, konsortium) được kết nối qua các tham chiếu V7GUID - chứ không qua các repo dùng chung. Mỗi Tenant vẫn giữ bộ sổ kế toán riêng, nhưng meta-repo của holding có thể tham chiếu đến các chứng từ và mục của công ty con mà không cần sao chép chúng.
Quan trọng: Meta-repo không chứa bất kỳ bút toán nào - chỉ có tham chiếu chéo. Bộ sổ kế toán vẫn nằm tại từng Tenant. Meta-repo là một tầng chỉ mục, không phải tầng kế toán.
Đòn bẩy rủi ro
| Hôm nay (chi phí thấp) | Sau này (an toàn kiểm toán) | Rủi ro được giảm thiểu |
|---|---|---|
Trường tenant cho mỗi artifact |
Phân định rõ ràng khi holding bị kiểm tra | Trộn lẫn tài sản giữa các công ty |
Trường sphere cho mỗi mục |
Tư cách phi lợi nhuận được bảo vệ | Bị tước tư cách theo § 55 AO (trộn lẫn tài sản) |
Trường role cho mỗi mục |
Truy vết được đã hành động với chức năng nào | Xung đột vai trò, đại diện trái quyền |
| Pre-Commit-Hook kiểm tra Sphäre | Phân tách Sphäre không có kẽ hở | Lỗi Sphäre do thao tác thủ công |
| Tham chiếu V7GUID thay vì bản sao | Phân định duy nhất, không trùng lặp | Không nhất quán giữa các bản sao |
Yêu cầu đối với Harness (xem trước)
Có thể suy ra từ ED02:
| ID | Yêu cầu | Mức ưu tiên |
|---|---|---|
| FA-1.4 | Gán Tenant (tenant: "ORG-1") cho mỗi mục |
MUST |
| FA-3.1 | Thẻ Sphäre: ideell/vermögensverwaltend/zweckbetrieblich/wirtschaftlich |
MUST (phi lợi nhuận) |
| FA-3.2 | Thẻ Sphäre là bắt buộc cho mỗi mục sổ địa bạ và mục nhật ký | MUST (phi lợi nhuận) |
| FA-3.3 | Pre-Commit-Hook kiểm tra tính đầy đủ của thẻ Sphäre | MUST (phi lợi nhuận) |
| TA-2.3 | Pre-Commit-Hook: kiểm tra thẻ Sphäre (chỉ khi phi lợi nhuận) | MUST (phi lợi nhuận) |
| FA-1.3 | V7GUID cho mỗi mục (tính duy nhất xuyên suốt các Tenant) | MUST |
Danh sách yêu cầu đầy đủ nằm trong Harness-Anforderungen.md.
Nguồn
- AO (§§ 51–68 - phi lợi nhuận, phân tách Sphäre, § 55 Abs. 1 Nr. 5 - trộn lẫn tài sản)
- EStG (§ 3 Nr. 26/26a - các mức khoán, liên quan đến Sphäre)
- GoBD (công văn BMF, tài liệu hóa quy trình, phân tách Tenant)
AFJD/agents/(đã ẩn danh) - khái niệm SSoT với Tenant, Sphäre, vai trò
Topology nguồn và các 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 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 bổ 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 hiện hành.