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 thể hiện tách bạch, có thể truy vết và an toàn 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:

Tuyên bố cốt lõi

Cấu trúc một tổ chức như một Liên hợp GitCover có nghĩa là: Tenant (tổ chức), Sphäre (lĩnh vực hoạt động với tổ chức công ích) và vai trò (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-Hook 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à vai trò không phải nhãn gắn sau - chúng là trường bắt buộc mang tính cấu trúc, mà thiếu chúng thì một artefact không được đưa vào repo.

Mô hình ba cấp: Tenant, Sphäre, vai trò

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart LR A["Artefakt
(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 lý độc lập, có các nghĩa vụ ghi chép riêng. Trong Liên hợp GitCover, mỗi Tenant được quản lý như một Organization riêng (Git User) 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 cá 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 công ích ORG-1 (công ích) Ngoài ra: tách biệt Sphäre, § 52 AO, VBG-Freistellung
Konsortium / Liên hợp 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 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ỉ với tổ chức công ích)

Sphäre chỉ liên quan với các tổ chức công ích - 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 gây nguy hiểm cho tính công ích.

Sphäre Ý nghĩa Ví dụ
ideell Hoạt động 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ế 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ế Bán hàng hóa thương hiệu, thu nhập quảng cáo
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart LR V["Geschäftsvorfall"] V --> I["ideell
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: Trộn lẫn tài sản (§ 55 Abs. 1 Nr. 5 AO) là căn cứ để thu hồi tính công ích. Một tổ chức công ích không tách biệt các giao dịch wirtschaftlich và ideell sẽ đối mặt với nguy cơ bị thu hồi trạng thái công ích - và do đó bị truy thu thuế đối với quỹ dự trữ (hồi tố tới 15(!) năm).

Cấp 3 - Vai trò (chức năng của chủ thể)

Vai trò 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, một người thường đảm nhận nhiều vai trò (đặc biệt ở KMU) - và vì vai trò quyết định nghĩa vụ nào được áp dụng.

Vai trò 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, thẩm quyền đại diện
Buchhalter Ghi sổ kế toán, lưu trữ chứng từ GoBD, hóa đơn điện tử, lưu trữ
Lohnverantwortlicher Tính lương, báo cáo BHXH SGB IV, DEÜV, LStDV
F&E-Leiter Nghiên cứu, bảng chấm công FZul FZulG, BSFZ, F&E so với hành chính
Administrator Quản lý repo, hook, 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, kế toán, nhà nghiên cứu, nhà phát triển và trưởng F&E. Trong repo, với mỗi artefact đều được ghi lại anh ta đã hành động với vai trò nào - ví dụ role: "GF" trong một nghị quyết, role: "F&E-Leiter" trong một bảng chấm công FZul. Nhờ đó có thể truy vết liệu một bản ghi được tạo ra từ góc nhìn GF (hành chính) hay góc nhìn F&E (nghiên cứu).

Vai trò không phải cá nhân: Vai trò mô tả chức năng (và trong các tuyên bố 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 vai trò; 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 cá nhân · chức năng · 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.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}/

Artefact JSON với Tenant, Sphäre, vai trò

Mỗi artefact (mục nhật ký, chứng từ, mục sổ địa chính) 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 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 một 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 định trước (không chỉ now()) qua GitCover Helper (UuidV7Gen), phần còn lại được điền 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ì nằm trong 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. Cái 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à định danh đối tượng cụ thể với mốc 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 Key V7GUID:uuidV7. Một biểu diễn chuỗi datetime hoặc date riêng 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 trong uuidV7. Các biểu diễn chuỗi cho truyền DTO/HTMX là trách nhiệm của Harness, không phải tầng dữ kiện.

Git-Hook kiểm tra sự tách biệt

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart TD C["Commit"] C --> H1["Pre-Commit-Hook"] H1 --> P1{"Tenant
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 hoặc không nhận diện Tenant
Pre-Commit Trường sphere tồn tại (chỉ công ích) Thiếu Sphäre ở Tenant công ích
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 hoặc không nhận diện vai trò
Post-Commit Tạo chỉ mục tự động theo Tenant và Sphäre -

Liên hợp Tenant: Nhiều tổ chức

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart TD H["ORG-1 (Holding)
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 hợp Tenant (holding với công ty con, consortium) được liên kết qua tham chiếu V7GUID - không qua 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. Sổ sách vẫn thuộc về 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) Ngày mai (an toàn kiểm toán) Rủi ro được giảm thiểu
Trường tenant cho mỗi artefact Gán 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ệ trạng thái công ích Bị thu hồi 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 không có thẩm 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 Gán 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 (công ích)
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 (công ích)
FA-3.3 Pre-Commit-Hook kiểm tra tính đầy đủ của thẻ Sphäre MUST (công ích)
TA-2.3 Pre-Commit-Hook: kiểm tra thẻ Sphäre (chỉ công ích) MUST (công ích)
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

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 tình trạng 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 tình trạng hiện tại.