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 :
- Tout dans le même panier - les documents privés et professionnels se mélangent dans une boîte aux lettres, un lecteur, un compte cloud.
- Aucune séparation des tenants - une holding avec plusieurs sociétés tient tous les livres dans une seule instance, sans qu'il soit clair à quelle société appartient chaque enregistrement.
- Aucune séparation des sphères - en cas d'utilité publique, les opérations idéelles, de gestion patrimoniale, d'activité conforme à l'objet et économiques se mélangent dans un compte, un dossier, un dépôt.
- Aucune séparation des rôles - l'entrepreneur fait tout lui-même (GF, comptable, paie, R&D), mais le dépôt ne sait pas dans quel rôle il agit à ce moment-là.
- Aucune identité claire - les enregistrements n'ont pas d'identifiant unique qui les rattache à une organisation, une sphère, un rôle.
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
(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 |
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
E1est à 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 KeyV7GUID:uuidV7. Une représentation séparée sous forme de chaînedatetimeoudateest 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
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
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
- niveau d'index*, pas un niveau de comptabilité.
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
- AO (§§ 51–68 - utilité publique, séparation des sphères, § 55 Abs. 1 Nr. 5 - mélange de patrimoines)
- EStG (§ 3 Nr. 26/26a - forfaits, lien avec les sphères)
- GoBD (lettre BMF, documentation des procédures, séparation des tenants)
E1/agents/(anonymisé) - concept SSoT avec Tenant, Sphère, Rôle
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.