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:

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

%%{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 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
%%{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: 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 Key V7GUID:uuidV7. Một biểu diễn chuỗi datetime hoặc date riê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 trong uuidV7. 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

%%{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 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

%%{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 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

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.