ED02 - Mô hình tổ chức KMU: Tenant, Sphäre, Rolle
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, có thể truy vết và có thể kiểm toán?
Thực tiễn hiện nay trong lĩnh vực KMU không có sự tách biệt rõ ràng:
- Tất cả trong một chỗ - hồ sơ riêng và hồ sơ kinh doanh trộn lẫn trong một hộp thư, một ổ đĩa, một tài khoản đám mây.
- Không có tách biệt Tenant - một holding với nhiều công ty hạch toán tất cả sổ sách trong một instance, mà không rõ bản ghi nào thuộc công ty nào.
- Không có tách biệt Sphäre - trong hoạt động phi lợi nhuận, các nghiệp vụ ideell, vermögensverwaltend, zweckbetrieblich và wirtschaftlich trộn lẫn trong một tài khoản, một thư mục, một repo.
- Không có tách biệt Rolle - doanh nhân tự làm mọi việc (GF, Buchhalter, Lohn, F&E), nhưng repo không biết anh ta đang hành động trong Rolle nào.
- Không có danh tính rõ ràng - các bản ghi không có mã định danh duy nhất để gán chúng cho một tổ chức, một Sphäre, một Rolle.
Luận điểm cốt lõi
Cấu trúc một tổ chức như một 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à Rolle (chức năng của chủ thể) được định nghĩa là trường bắt buộc của mỗi artefact - không phải metadata tùy chọn. Git-Hooks kiểm tra ở mỗi commit rằng sự tách biệt là đầy đủ. Nhờ đó hình thành Compliance by Design: cấu trúc của tổ chức được neo vào cấu trúc của repo.
Compliance by Design: Tenant, Sphäre và Rolle không phải là nhãn gắn thêm về sau - chúng là các trường bắt buộc mang tính cấu trúc, mà nếu thiếu thì một artefact không được đưa vào repo.
Mô hình ba cấp độ: Tenant, Sphäre, Rolle
(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ó tư cách pháp nhân độc lập, có các nghĩa vụ ghi chép riêng. Trong GitCover-Verbund, mỗi Tenant được quản lý như một Organization (Git User) riêng với các Git-Repo được gán (hoặc namespace nhánh riêng).
| Loại Tenant | Ví dụ (placeholder) | Nghĩa vụ riêng |
|---|---|---|
| Doanh nghiệp tư nhân | ORG-1 (KMU) |
GoBD, AO, hóa đơn điện tử |
| Holding với các công ty con | ORG-1 (Holding), ORG-1a/ORG-1b (công ty con) |
Mỗi công ty có sổ sách riêng, báo cáo tài chính năm riêng |
| Tổ chức phi lợi nhuận | ORG-1 (gemeinnützig) |
Ngoài ra: tách biệt Sphäre, § 52 AO, VBG-Freistellung |
| Liên danh / liên kết | ORG-1, ORG-2, ORG-3 |
Mỗi tổ chức có Tenant riêng, tham chiếu chéo qua V7GUID |
Ví dụ thực tiễn: 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 tách biệt.
Cấp độ 2 - Sphäre (lĩnh vực hoạt động, chỉ trong trường hợp phi lợi nhuận)
Sphäre chỉ có ý nghĩa đối với các tổ chức phi lợi nhuận - nhưng khi đó là bắt buộc. Luật thuế (§ 51–68 AO) yêu cầu tách biệt bốn Sphäre để không đe dọa tư cách phi lợi nhuận.
| Sphäre | Ý nghĩa | Ví dụ |
|---|---|---|
| ideell | Hoạt động mục đích theo điều lệ, được 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ỹ, được miễn thuế | Lãi từ đầu tư, thu nhập cho thuê |
| zweckbetrieblich | Hoạt động kinh doanh có lợi nhuận nhưng phục vụ mục đích, được miễn thuế (§ 65 AO) | Phí thành viên, phí gia nhập |
| wirtschaftlich | Hoạt động kinh doanh có lợi nhuận không phục vụ mục đích, phải chịu thuế | Bán hàng thương hiệu, 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 tách biệt Sphäre: Việc trộn lẫn tài sản (§ 55 Abs. 1 Nr. 5 AO) là lý do bị tước tư cách phi lợi nhuận. Một tổ chức phi lợi nhuận không tách biệt các nghiệp vụ kinh tế và ideell sẽ đối mặt với việc bị tước tư cách phi lợi nhuận - và do đó phải truy thu thuế đối với các khoản dự trữ (truy hồi tới 15(!) năm).
Cấp độ 3 - Rolle (chức năng của chủ thể)
Rolle ghi lại chủ thể đã 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 đảm nhận nhiều Rolle (đặc biệt ở KMU) - và vì Rolle quyết định nghĩa vụ nào được áp dụng.
| Rolle | Chức năng | Nghĩa vụ điển hình |
|---|---|---|
| GF (Geschäftsführer) | Đại diện ra bên ngoài, chịu trách nhiệm tổng thể | GoBD, AO, thời hạn, quyền đại diện |
| Buchhalter | Kế toán, lưu trữ chứng từ | GoBD, hóa đơn điện tử, lưu giữ |
| Lohnverantwortlicher | Tính lương, báo cáo BHXH | SGB IV, DEÜV, LStDV |
| F&E-Leiter | Nghiên cứu, bảng giờ FZul | FZulG, BSFZ, F&E so với quản lý |
| Administrator | Quản lý repo, hooks, quyền truy cập | Git, GPG, quyền truy cập |
Ví dụ thực tiễn: Doanh nhân
E1đồng thời là GF, Buchhalter, nhà nghiên cứu, nhà phát triển và F&E-Leiter. Trong repo, mỗi artefact đều được ghi lại anh ta đã hành động trong Rolle nào - ví dụrole: "GF"trong một nghị quyết,role: "F&E-Leiter"trong một bảng giờ FZul. Nhờ đó có thể truy vết liệu một bản ghi được tạo ra từ góc nhìn GF (quản lý) hay góc nhìn F&E (nghiên cứu).
Rolle không phải là con người: Rolle mô tả chức năng (và trong các tuyên bố thì là bên được đại diện), không phải danh tính. Cùng một người có thể hành động hoặc ký một tài liệu với nhiều Rolle; danh tính thực thi kỹ thuật (tài khoản, khóa) lại là một cấp độ riêng. Năm cấp độ Person · Funktion · bên được đại diện · danh tính thực thi · hành vi ký được mô tả trong ED03.
Triển khai trong Git-Repo
Cấu trúc thư mục
ORG-1/ # Tenant: KMU
├── .gitcover/ # GitCover-Konfiguration
│ ├── LEGAL_ENTITY.gc.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/ # .gc.md Sidecars
├── checks/ # Fristen-Check, Sphären-Check
└── {weitere bei Bedarf}/
Artefact JSON với Tenant, Sphäre, Rolle
Mỗi artefact (bản ghi nhật ký, chứng từ, mục sổ địa chính) chứa Tenant, Sphäre và Rolle như các trường bắt buộc. Nguyên tắc cốt lõi trung tâm của khả năng truy vết theo thời gian: Thời điểm ghi nhận không phải là trường riêng, mà được neo ngay trong uuidV7 - như dấu thời gian 48 bit theo RFC 9562 §5.7. uuidV7 có thể được tạo từ một mốc thời gian được chỉ định trước (không chỉ now()) thông qua GitCover Helper (gc-v7guid), phần còn lại được lấp đầy bằng ngẫu nhiên. Nhờ đó, thời điểm ghi nhận được gắn kết mật mã với danh tính của artefact và không thể thay đổi về sau.
Quan trọng - Những gì được đưa vào Git-Repo: Chỉ những artefact 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 riêng tư 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 như một artefact. Những gì đã ở trong thì ở trong.
{
"$schema": "https://gitcover.org/schemas/diary-entry-1.0.schema.json",
"V7GUID": "<V7GUID-Class-aus-Registry>",
"docUid": "<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 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à mã định danh đối tượng cụ thể với mốc thời gian được chỉ đị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 đưa vào tầng dữ kiện - dấu thời gian 48 bit đã nằm tronguuidV7. Các biểu diễn chuỗi cho truyền tải DTO/HTMX là trách nhiệm của harness, không phải tầng dữ kiện.
Git-Hooks kiểm tra sự tách biệt
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ỉ 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 Rolle hoặc Rolle không xác định |
| Post-Commit | Tự động tạo chỉ mục theo Tenant và Sphäre | - |
Tenant-Verbund: 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 Tenant-Verbund (holding với công ty con, liên danh) được liên kết qua các tham chiếu V7GUID - không qua các repo dùng chung. Mỗi Tenant giữ sổ sách riêng, nhưng meta-repo của holding có thể tham chiếu đến chứng từ và mục của các công ty con mà không sao chép chúng.
Quan trọng: Meta-repo không chứa bút toán - chỉ có tham chiếu chéo. Việc hạch toán vẫn thuộc về mỗi 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
| Hiện nay (chi phí thấp) | Tương lai (an toàn kiểm toán) | Rủi ro được giảm thiểu |
|---|---|---|
Trường tenant cho mỗi artefact |
Phân định rõ ràng khi kiểm tra holding | Trộn lẫn tài sản giữa các công ty |
Trường sphere cho mỗi mục |
Bảo vệ tư cách phi lợi nhuận | 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 Rolle, đại diện không có quyền |
| Pre-Commit-Hook kiểm tra Sphäre | Tách biệt Sphäre không có lỗ hổng | Lỗi Sphäre thủ công |
| Tham chiếu V7GUID thay vì sao chép | Phân định duy nhất không trùng lặp | Không nhất quán khi sao chép |
Yêu cầu Harness (xem trước)
Có thể suy ra từ ED02:
| ID | Yêu cầu | Ư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 bắt buộc cho mỗi mục sổ địa chính 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ỉ 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 Tenant) | MUST |
Danh sách yêu cầu đầy đủ trong Harness-Anforderungen.md.
Nguồn
- AO (§§ 51–68 - tư cách phi lợi nhuận, tách biệt Sphäre, § 55 Abs. 1 Nr. 5 - trộn lẫn tài sản)
- EStG (§ 3 Nr. 26/26a - các khoản phụ cấp, liên quan Sphäre)
- GoBD (công văn BMF, tài liệu quy trình, tách biệt Tenant)
E1/agents/(ẩn danh) - khái niệm SSoT với Tenant, Sphäre, Rolle
Cấu trúc nguồn và liên kết tham chiếu CDN
| Rolle | Vị trí | Mục đích |
|---|---|---|
| Primary / SSoT | git.gitcover.org/GCC | Kho 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 định 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.