ED02 - Le modèle d'organisation PME : Tenants, Sphères, Rôles

Problème

Un entrepreneur fonde une organisation - et se trouve confronté à la question : comment structurer mon organisation pour que les obligations de conformité soient représentées de manière clairement séparée, traçable et sûre en cas d'audit ?

La pratique actuelle dans le domaine des PME ne connaît pas de séparation nette :

Message clé

Structurer une organisation comme réseau GitCover signifie : Tenant (organisation), Sphère (domaine d'activité en cas d'utilité publique) et Rôle (fonction de l'acteur) sont définis comme champs obligatoires de chaque artefact - et non comme des métadonnées optionnelles. Les hooks Git vérifient à chaque commit que la séparation est complète. Il en résulte Compliance by Design : la structure de l'organisation est ancrée dans la structure du dépôt.

Compliance by Design : Tenant, Sphère et Rôle ne sont pas des étiquettes ajoutées après coup - ils sont des champs obligatoires structurels, sans lesquels un artefact n'est pas admis dans le dépôt.

Le modèle à trois niveaux : Tenant, Sphère, Rôle

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

Niveau 1 - Tenant (organisation)

Un Tenant est une unité organisationnelle juridiquement autonome pour laquelle il existe des obligations d'enregistrement propres. Dans le réseau GitCover, chaque Tenant est géré comme une Organization (Git User) distincte avec des dépôts Git associés (ou un espace de noms de branches propre).

Type de tenant Exemple (espace réservé) Obligations propres
Entreprise individuelle ORG-1 (PME) GoBD, AO, facturation électronique
Holding avec filiales ORG-1 (holding), ORG-1a/ORG-1b (filiales) Comptabilité propre et bilan annuel propre pour chaque société
Organisation d'utilité publique ORG-1 (utilité publique) En plus : séparation des sphères, § 52 AO, exonération VBG
Consortium / réseau ORG-1, ORG-2, ORG-3 Un Tenant propre par organisation, renvois croisés via V7GUID

Exemple pratique : Un entrepreneur (E1) dirige une holding (ORG-1) avec deux filiales (ORG-1a, ORG-1b). Chaque filiale est un Tenant propre avec son propre dépôt. La holding dispose d'un méta-dépôt qui relie les filiales via des références V7GUID - mais les livres des filiales restent séparés.

Niveau 2 - Sphère (domaine d'activité, uniquement en cas d'utilité publique)

La Sphère n'est pertinente que pour les organisations d'utilité publique - mais alors impérativement. Le droit fiscal (§ 51–68 AO) exige la séparation des quatre sphères afin de ne pas mettre en danger l'utilité publique.

Sphère Signification Exemple
idéelle Activité conforme à l'objet au sens des statuts, exonérée d'impôt Série d'ateliers, offre de formation
gestion patrimoniale Gestion du patrimoine de la fondation, exonérée d'impôt Intérêts de placements, revenus locatifs
activité conforme à l'objet Activité commerciale qui remplit l'objet, exonérée d'impôt (§ 65 AO) Cotisations de membres, frais d'adhésion
économique Activité commerciale qui ne remplit pas l'objet, soumise à l'impôt Merchandising, revenus publicitaires
%%{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

Risque en l'absence de séparation des sphères : le mélange de patrimoines (§ 55 Abs. 1 Nr. 5 AO) est un motif de retrait de l'utilité publique. Une organisation d'utilité publique qui ne sépare pas les opérations économiques et idéelles risque le retrait du statut d'utilité publique - et donc une imposition ultérieure des réserves (jusqu'à 15(!) ans rétroactivement).

Niveau 3 - Rôle (fonction de l'acteur)

Le Rôle documente la fonction dans laquelle un acteur a agi. Cela est important, car dans de nombreuses organisations une même personne occupe souvent plusieurs rôles (en particulier dans les PME) - et parce que le rôle détermine quelles obligations s'appliquent.

Rôle Fonction Obligations typiques
GF (directeur général) Représentation externe, responsabilité globale GoBD, AO, délais, pouvoir de représentation
Comptable Tenue de la comptabilité, archive des justificatifs GoBD, facturation électronique, conservation
Responsable de la paie Calcul des salaires, déclarations de sécurité sociale SGB IV, DEÜV, LStDV
Responsable R&D Recherche, justificatifs d'heures FZul FZulG, BSFZ, R&D vs administration
Administrateur Gestion du dépôt, hooks, accès Git, GPG, droits d'accès

Exemple pratique : L'entrepreneur E1 est à la fois GF, comptable, chercheur, développeur et responsable R&D. Dans le dépôt, chaque artefact documente dans quel rôle il a agi - p. ex. role: "GF" pour une décision, role: "F&E-Leiter" pour un justificatif d'heures FZul. Il reste ainsi possible de retracer si un enregistrement provient de la perspective GF (administration) ou de la perspective R&D (recherche).

Le rôle n'est pas la personne : le rôle décrit la fonction (et, pour les déclarations, la partie représentée), non l'identité. Une même personne peut agir ou signer sur un document en plusieurs rôles ; l'identité technique d'exécution (compte, clé) constitue à nouveau un niveau propre. Les cinq niveaux Personne · Fonction · partie représentée · identité d'exécution · acte de signature sont décrits dans ED03.

Mise en œuvre dans le dépôt Git

Structure des répertoires

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 avec Tenant, Sphère, Rôle

Chaque artefact (entrée de journal, justificatif, inscription au registre foncier) contient Tenant, Sphère et Rôle comme champs obligatoires. Principe central de la traçabilité temporelle : l'heure d'enregistrement n'est pas un champ séparé, mais est ancrée dans l'uuidV7 elle-même - comme horodatage 48 bits conformément à la RFC 9562 §5.7. L'uuidV7 peut être générée à partir d'un repère temporel prédéfini (pas seulement now()) via GitCover Helper (gc-v7guid), le reste étant complété aléatoirement. L'heure d'enregistrement est ainsi liée cryptographiquement à l'identité de l'artefact et non modifiable a posteriori.

Important - ce qui arrive dans le dépôt Git : seuls ces artefacts structurés (entrées JSON, sidecars, justificatifs) sont admis dans le dépôt Git. Les documents privés ne sont jamais admis dans le dépôt, sauf s'ils ont été explicitement introduits et classifiés comme artefact. Une fois dedans, c'est dedans.

{
  "$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"]
}

Explication de la clé composite : V7GUID (Class Identifier) classe le document/l'action au moyen du registre .gitcover (quoi/quel type). uuidV7 (Object ID) est l'identifiant concret de l'objet avec le repère temporel prédéfini (RFC 9562 §5.7, 48 bits Unix-ms). Les deux ensemble forment la GCPN Sidecar Composite Key V7GUID:uuidV7. Une représentation séparée sous forme de chaîne datetime ou date est redondante et n'est pas tenue dans les faits - l'horodatage 48 bits se trouve déjà dans l'uuidV7. Les représentations sous forme de chaîne pour le transfert DTO/HTMX relèvent de la responsabilité du harness, pas du niveau des faits.

Les hooks Git vérifient la séparation

%%{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 Vérification Erreur en cas de
Pre-Commit champ tenant présent et valide Tenant manquant ou inconnu
Pre-Commit champ sphere présent (uniquement utilité publique) Sphère manquante pour un Tenant d'utilité publique
Pre-Commit valeur sphere valide (ideell/vermögensverwaltend/zweckbetrieblich/wirtschaftlich) Valeur de sphère invalide
Pre-Commit champ role présent et valide Rôle manquant ou inconnu
Post-Commit génération automatique d'index par Tenant et Sphère -

Réseau de tenants : plusieurs organisations

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

Un réseau de tenants (holding avec filiales, consortium) est relié via des références V7GUID - et non via des dépôts communs. Chaque Tenant conserve sa propre comptabilité, mais le méta-dépôt de la holding peut renvoyer à des justificatifs et des entrées des filiales sans les copier.

Important : le méta-dépôt ne contient aucune écriture comptable - uniquement des renvois croisés. La comptabilité reste chez chaque Tenant. Le méta-dépôt est un

Levier de risque

Aujourd'hui (peu coûteux) Demain (sûr en cas d'audit) Risque réduit
champ tenant par artefact Rattachement clair lors du contrôle de la holding Mélange de patrimoines entre sociétés
champ sphere par entrée Statut d'utilité publique défendu Retrait § 55 AO (mélange de patrimoines)
champ role par entrée Permet de savoir dans quelle fonction on a agi Conflit de rôles, représentation non autorisée
Le hook pre-commit vérifie la sphère Séparation des sphères sans lacune Erreurs manuelles de sphère
Référence V7GUID au lieu d'une copie Rattachement unique sans doublons Incohérence en cas de copies

Exigence du harness (aperçu)

Déductible d'ED02 :

ID Exigence Priorité
FA-1.4 Rattachement au Tenant (tenant: "ORG-1") par entrée MUST
FA-3.1 Tags de sphère : ideell/vermögensverwaltend/zweckbetrieblich/wirtschaftlich MUST (utilité publique)
FA-3.2 Tag de sphère obligatoire par inscription au registre foncier et entrée de journal MUST (utilité publique)
FA-3.3 Le hook pre-commit vérifie l'exhaustivité du tag de sphère MUST (utilité publique)
TA-2.3 Hook pre-commit : vérification du tag de sphère (uniquement utilité publique) MUST (utilité publique)
FA-1.3 V7GUID par entrée (unicité inter-tenants) MUST

La liste complète des exigences se trouve dans Harness-Anforderungen.md.

Sources

Topologie des sources et liens de référence CDN

Rôle Lieu Objet
Primary / SSoT git.gitcover.org/GCC Stockage canonique (signé GPG, versionné)
Public OSS Mirror / CDN codeberg.org/gitcover-commons Miroir en lecture seule ; découverte FLOSS
Community Hub github.com/gitcover-commons Issues & Discussions ; référence du code source sur Codeberg

Remarque : cette répartition des sources, du miroir et du Community Hub reflète l'état actuel et peut changer. Veuillez vérifier la source canonique correspondante sur gitcover.org pour connaître l'état actuel.