ED02 - Mô hình Tổ chức SME: Tenant, Sphere, Role

Vấn đề

Một doanh nhân thành lập một tổ chức - và đối mặt với câu hỏi: Làm sao tôi cấu trúc tổ chức của mình để các nghĩa vụ tuân thủ được tách biệt sạch sẽ, có thể truy vết và kiểm toán được?

Thực hành hiện nay trong lĩnh vực SME không có sự tách biệt sạch:

Tuyên bố cốt lõi

Cấu trúc một tổ chức như một liên minh GitCover có nghĩa: Tenant (tổ chức), Sphere (lĩnh vực hoạt động cho phi lợi nhuận) và Role (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 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 hoàn chỉnh. Như vậy tạo ra Compliance by Design: cấu trúc của tổ chức được neo trong cấu trúc của repo.

Compliance by Design: Tenant, Sphere và Role không phải nhãn dán sau sự cố - chúng là trường bắt buộc mang tính cấu trúc, không có chúng một artefact không được nhận vào repo.

Mô hình ba cấp: Tenant, Sphere, Role

%%{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à đơn vị tổ chức độc lập về mặt pháp lý, có nghĩa vụ lưu trữ hồ sơ riêng. Trong liên minh GitCover, mỗi tenant được duy trì như một Git repo riêng (hoặc một không gian branch riêng).

Loại Tenant Ví dụ (placeholder) Nghĩa vụ riêng
Doanh nghiệp cá nhân ORG-1 (SME) GoBD, AO, e-invoice
Holding với công ty con ORG-1 (holding), ORG-1a/ORG-1b (công ty con) Mỗi công ty: kế toán riêng, báo cáo năm riêng
Tổ chức phi lợi nhuận ORG-1 (phi lợi nhuận) Thêm: tách sphere, § 52 AO, miễn VBG
Liên danh / liên minh ORG-1, ORG-2, ORG-3 Mỗi tổ chức một tenant, 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 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 - Sphere (Lĩnh vực hoạt động, chỉ cho phi lợi nhuận)

Sphere chỉ liên quan cho tổ chức phi lợi nhuận - nhưng khi đó bắt buộc. Luật thuế (§ 51-68 AO) yêu cầu tách bốn sphere để không đe dọa địa vị phi lợi nhuận.

Sphere Ý nghĩa Ví dụ
ideell (ideal) Hoạt động mục đích theo điều lệ, miễn thuế Loạt workshop, đề xuất giáo dục
vermögensverwaltend (quản lý tài sản) Quản lý tài sản quỹ, miễn thuế Lãi đầu tư, thu nhập cho thuê
zweckbetrieblich (mục đích kinh doanh) Kinh doanh thương mại thực hiện mục đích, miễn thuế (§ 65 AO) Phí thành viên, phí nhập cảnh
wirtschaftlich (thương mại) Kinh doanh thương mại không thực hiện mục đích, chịu thuế Merchandising, doanh thu 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 sphere: Trộn tài sản (§ 55 Abs. 1 Nr. 5 AO) là lý do tước địa vị phi lợi nhuận. Một tổ chức phi lợi nhuận không tách hoạt động thương mại và ideal có nguy cơ mất địa vị phi lợi nhuận - và do đó đánh thuế lại quỹ dự trữ (tối đa 15 năm hồi cứu).

Cấp 3 - Role (Chức năng của tác nhân)

Role ghi nhận tác nhân đã hành động trong 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 giữ nhiều role (đặc biệt ở SME) - và vì role xác định nghĩa vụ nào áp dụng.

Role Chức năng Nghĩa vụ điển hình
GF (Giám đốc) Đại diện bên ngoài, trách nhiệm tổng thể GoBD, AO, thời hạn, quyền đại diện
Buchhalter (Kế toán) Kế toán, lưu trữ chứng từ GoBD, e-invoice, lưu trữ
Lohnverantwortlicher (Quản lý bảng lương) Kế toán lương, thông báo bảo hiểm xã hội SGB IV, DEÜV, LStDV
F&E-Leiter (Trưởng R&D) Nghiên cứu, ghi giờ FZul FZulG, BSFZ, R&D vs. hành chính
Administrator Quản trị repo, hook, 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, nghiên cứu, phát triển và trưởng R&D. Trong repo, mỗi artefact ghi nhận họ đã hành động trong role nào - ví dụ role: "GF" cho một nghị quyết, role: "F&E-Leiter" cho một ghi giờ FZul. Như vậy có thể truy vết hồ sơ xuất phát từ góc nhìn GF (hành chính) hay góc nhìn R&D (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

Artefact JSON với Tenant, Sphere, Role

Mỗi artefact (mục nhật ký, chứng từ, mục sổ cái) chứa Tenant, Sphere và Role như trường bắt buộc. Nguyên lý trung tâm của khả năng truy vết thời gian: thời điểm ghi nhận không phải một trường riêng, mà được neo trong chính uuidV7 - như timestamp 48-bit theo RFC 9562 §5.7. uuidV7 được tạo từ một timestamp định sẵn (không phải now()) qua GitCover helper (UuidV7Gen), phần còn lại điền ngẫu nhiên. Như vậy thời điểm ghi nhận được liên kết mật mã với danh tính của artefact và không thể thay đổi sau đó.

Quan trọng - cái gì vào Git repo: Chỉ các artefact có cấu trúc (mục JSON, sidecar, chứng từ) mới được nhận vào Git repo. Tài liệu cá nhân không bao giờ được nhận vào repo trừ khi được giới thiệu và phân loại rõ ràng như artefact.

{
  "$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/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 timestamp định sẵn (RFC 9562 §5.7, 48-bit Unix-ms). Cả hai cùng tạo 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 giữ trong facts - timestamp 48-bit đã có sẵn trong uuidV7. Biểu diễn chuỗi cho DTO/HTMX transfer là trách nhiệm của harness, không phải lớp facts.

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 có và hợp lệ Tenant thiếu hoặc không rõ
Pre-Commit Trường sphere có (chỉ phi lợi nhuận) Sphere thiếu cho tenant phi lợi nhuận
Pre-Commit Giá trị sphere hợp lệ (ideell/vermögensverwaltend/zweckbetrieblich/wirtschaftlich) Giá trị sphere không hợp lệ
Pre-Commit Trường role có và hợp lệ Role thiếu hoặc không rõ
Post-Commit Tự sinh index theo tenant và sphere -

Liên minh 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 minh tenant (holding với công ty con, liên danh) được liên kết qua tham chiếu V7GUID - không qua repo chung. Mỗi tenant giữ kế toán riêng, nhưng meta-repo của holding có thể tham chiếu chứng từ và mục của công ty con mà không sao chép.

Quan trọng: Meta-repo không chứa booking - chỉ tham chiếu chéo. Kế toán vẫn ở mỗi tenant. Meta-repo là lớp index, không phải lớp kế toán.

Đòn bẩy rủi ro

Hôm nay (rẻ) Ngày mai (kiểm toán được) Rủi ro giảm
Trường tenant mỗi artefact Phân công rõ trong kiểm toán holding Trộn tài sản giữa công ty
Trường sphere mỗi mục Bảo vệ địa vị phi lợi nhuận Tước § 55 AO (trộn tài sản)
Trường role mỗi mục Truy vết hành động trong chức năng nào Xung đột role, đại diện không ủy quyền
Pre-Commit hook kiểm tra sphere Tách sphere không lỗ hổng Lỗi sphere thủ công
Tham chiếu V7GUID thay vì sao chép Phân công duy nhất không trùng lặp Không nhất quán trong bản sao

Yêu cầu Harness (Xem trước)

Dẫn xuất từ ED02:

ID Yêu cầu Ưu tiên
FA-1.4 Phân công tenant (tenant: "ORG-1") mỗi mục MUST
FA-3.1 Sphere tag: ideell/vermögensverwaltend/zweckbetrieblich/wirtschaftlich MUST (phi lợi nhuận)
FA-3.2 Sphere tag bắt buộc mỗi mục sổ cái và mục nhật ký MUST (phi lợi nhuận)
FA-3.3 Pre-Commit hook kiểm tra đầy đủ sphere tag MUST (phi lợi nhuận)
TA-2.3 Pre-Commit hook: kiểm tra sphere tag (chỉ phi lợi nhuận) MUST (phi lợi nhuận)
FA-1.3 V7GUID 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

Topo nguồn và liên kết tham chiếu CDN

Role Địa điểm Mục đích
Primary / SSoT git.gitcover.org/GCC Lưu trữ chính thứ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 trên Codeberg

Lưu ý: Phân công 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 chính thức tương ứng trên gitcover.org cho trạng thái hiện tại.