ED02 - Mô hình tổ chức doanh nghiệp nhỏ và vừa: Tenant, Phạm vi, Vai trò

Vấn đề

Một doanh nhân sáng 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 biệt rõ ràng, dễ kiểm chứng và an toàn kiểm toán?

Thực tiễn hiện nay trong lĩnh vực doanh nghiệp nhỏ và vừa 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 thành một khối liên kết GitCover có nghĩa là: Tenant (tổ chức), Phạm vi (lĩnh vực hoạt động khi có tư cách phi lợi nhuận) 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 artifact - chứ không phải là metadata tùy chọn. Git-Hooks kiểm tra ở mỗi commit rằng việc tách biệt là đầy đủ. Nhờ vậy mà 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, Phạm vi và Vai trò không phải là các nhãn gắn về sau - chúng là 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, Phạm vi, 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, lưu hồ sơ riêng. Trong khối liên kết GitCover, mỗi Tenant được quản lý như một Organization (Git User) riêng, cùng với các Git repo tương ứng (hoặc một Branch-Namespace riêng).

Loại Tenant Ví dụ (placeholder) Nghĩa vụ riêng
Doanh nghiệp cá thể ORG-1 (doanh nghiệp nhỏ và vừa) GoBD, AO, E-Rechnung
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ó bộ sổ sách 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: tách biệt phạm vi, § 52 AO, VBG-Freistellung
Liên minh / Khối 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 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 kết nối 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 - Phạm vi (Lĩnh vực hoạt động, chỉ khi có tư cách phi lợi nhuận)

Phạm vi chỉ có liên quan đối với các tổ chức phi lợi nhuận - nhưng khi đó thì bắt buộc. Luật thuế (§ 51–68 AO) đòi hỏi phải tách biệt bốn phạm vi để không làm tổn hại đến tư cách phi lợi nhuận.

Phạm vi Ý 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 quỹ, miễn thuế Tiền lãi từ các khoản đầ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í hội viên, phí gia nhập
wirtschaftlich Hoạt động kinh doanh không phục vụ mục đích, chịu thuế Merchandising, thu nhập từ 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 phạm vi: Trộn lẫn tài sản (§ 55 Abs. 1 Nr. 5 AO) là một 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 tách biệt các nghiệp vụ wirtschaftlich và ideell sẽ chịu rủi ro bị tước tư cách phi lợi nhuận - và kéo theo việc truy thu thuế đối với quỹ dự trữ (truy hồi tới 15(!) năm).

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

Vai trò ghi lại việc một 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 giữ nhiều vai trò cùng lúc (đặc biệt ở doanh nghiệp nhỏ và vừa) - 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 (Giám đốc điều hành) Đại diện đối ngoại, 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, E-Rechnung, bảo quản
Lohnverantwortlicher Tính lương, tờ khai SV SGB IV, DEÜV, LStDV
F&E-Leiter Nghiên cứu, bảng kê giờ FZul FZulG, BSFZ, F&E so với hành chính
Administrator Quản lý repo, hooks, 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 artifact đều được ghi lại việc anh ấy đã hành động với 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 bảng kê giờ FZul. Nhờ đó vẫn có thể kiểm chứng được một bản ghi ra đời 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, Phạm vi, Vai trò

Mỗi artifact (bản ghi nhật ký, chứng từ, bản ghi sổ địa bạ) đều chứa Tenant, Phạm vi và Vai trò với tư cách 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à 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 mốc thời gian định sẵn (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 điểm ghi nhận được liên kết về mặt 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 (bản ghi JSON, sidecar, chứng từ) mới được đưa vào Git repo. Tài liệu riêng tư sẽ không bao giờ được đưa vào repo, trừ khi chúng đã được đưa vào và phân loại một cách rõ ràng với tư cách artifact. Một khi đã vào rồi thì là đã vào.

{
  "$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 Composite Key: V7GUID (Class Identifier) phân loại tài liệu/Action dựa trên .gitcover Registry (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 sẵn (RFC 9562 §5.7, Unix-ms 48 bit). Cả hai cùng nhau tạo thành GCPN Sidecar Composite Key V7GUID:uuidV7. Một biểu diễn dạng chuỗi datetime hoặc date riêng biệt là dư thừa và không được đưa vào phần dữ kiện - dấu thời gian 48 bit đã nằm sẵn trong uuidV7. Các biểu diễn dạng chuỗi phục vụ truyền tải DTO/HTMX là trách nhiệm của Harness, không thuộc tầng dữ kiện.

Git-Hooks kiểm tra việc 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 Báo lỗi khi
Pre-Commit Trường tenant tồn tại và hợp lệ Tenant bị thiếu hoặc không xác định
Pre-Commit Trường sphere tồn tại (chỉ khi phi lợi nhuận) Thiếu phạm vi ở Tenant phi lợi nhuận
Pre-Commit Giá trị sphere hợp lệ (ideell/vermögensverwaltend/zweckbetrieblich/wirtschaftlich) Giá trị phạm vi không hợp lệ
Pre-Commit Trường role tồn tại và hợp lệ Vai trò bị thiếu hoặc không xác định
Post-Commit Tự động sinh chỉ mục cho từng Tenant và phạm vi -

Khối 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 khối liên kết Tenant (holding với các công ty con, liên minh) được kết nối với nhau 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ổ sách kế toán riêng, nhưng Meta-Repo của holding có thể tham chiếu đến chứng từ và bản ghi của các 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 toán - chỉ có tham chiếu chéo. Sổ sách kế toán 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

Hiện tại (rẻ) Mai 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 bản ghi 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 bản ghi Kiểm chứng đượ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 phạm vi Tách biệt phạm vi không còn lỗ hổng Lỗi phạm vi 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 Thiếu nhất quán ở các bản sao

Yêu cầu 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 bản ghi MUST
FA-3.1 Thẻ phạm vi: ideell/vermögensverwaltend/zweckbetrieblich/wirtschaftlich MUST (phi lợi nhuận)
FA-3.2 Thẻ phạm vi là bắt buộc cho mỗi bản ghi sổ địa bạ và bản ghi nhật ký MUST (phi lợi nhuận)
FA-3.3 Pre-Commit-Hook kiểm tra tính đầy đủ của thẻ phạm vi MUST (phi lợi nhuận)
TA-2.3 Pre-Commit-Hook: kiểm tra thẻ phạm vi (chỉ khi phi lợi nhuận) MUST (phi lợi nhuận)
FA-1.3 V7GUID cho mỗi bản ghi (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 Nơi lưu trữ chính tắc (ký GPG, có phiên bản)
Public OSS Mirror / CDN codeberg.org/gitcover-commons Mirror chỉ đọc; khám phá FLOSS
Community Hub github.com/gitcover-commons Issues & Discussions; tham chiếu mã nguồn về Codeberg

Lưu ý: Cách phân bổ này giữa các nguồn, mirror và community hub phản ánh tình trạng hiện tại và có thể thay đổi. Vui lòng kiểm tra nguồn chính tắc tương ứng trên gitcover.org để nắm trạng thái hiện hành.