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:

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ò

%%{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 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
%%{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 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 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 lưu trong tầng dữ kiện - dấu thời gian 48-bit đã nằm sẵn trong uuidV7. 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

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

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

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.