ED02 - Le modèle d'organisation PME : tenants, sphères, rôles

Problème

Un entrepreneur crée 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 auditable ?

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

Message clé

Structurer une organisation en tant que groupement 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. Ainsi naît Compliance by Design : la structure de l'organisation est ancrée dans la structure du dépôt.

Compliance by Design : le tenant, la sphère et le rôle ne sont pas des étiquettes ajoutées après coup - ce sont des champs structurels obligatoires, 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 indépendante pour laquelle il existe des obligations d'enregistrement propres. Dans le groupement 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 branche propre).

Type de tenant Exemple (espace réservé) Obligations propres
Entreprise individuelle ORG-1 (PME) GoBD, AO, facture électronique
Holding avec filiales ORG-1 (holding), ORG-1a/ORG-1b (filiales) Comptabilité propre par société, bilan annuel propre
Organisation d'utilité publique ORG-1 (d'utilité publique) En plus : séparation des sphères, § 52 AO, exonération VBG
Consortium / groupement ORG-1, ORG-2, ORG-3 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 comptabilités des filiales restent séparées.

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 elle est alors impérative. Le droit fiscal (§ 51–68 AO) exige la séparation des quatre sphères afin de ne pas mettre en danger le caractère d'utilité publique.

Sphère Signification Exemple
idéale Activité conforme aux statuts, exonérée d'impôt Série d'ateliers, offre de formation
de gestion patrimoniale Gestion du patrimoine de la fondation, exonérée d'impôt Intérêts des placements, revenus locatifs
conforme à l'objet statutaire Activité économique qui remplit l'objet statutaire, exonérée d'impôt (§ 65 AO) Cotisations des membres, frais d'adhésion
économique Activité économique qui ne remplit pas l'objet statutaire, imposable 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 cas d'absence de séparation des sphères : la confusion des patrimoines (§ 55 Abs. 1 Nr. 5 AO) est un motif de retrait du caractère d'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 rétroactive des réserves (jusqu'à 15(!) ans en arrière).

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

Le rôle documente dans quelle fonction un acteur a agi. C'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
DG (directeur général) Représentation externe, responsabilité globale GoBD, AO, délais, pouvoir de représentation
Comptable Comptabilité, archivage des pièces GoBD, facture électronique, conservation
Responsable de la paie Paie, 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 DG, comptable, chercheur, développeur et responsable R&D. Dans le dépôt, chaque artefact documente dans quel rôle il a agi - par ex. role: "GF" pour une décision, role: "F&E-Leiter" pour un justificatif d'heures FZul. Ainsi reste traçable si un enregistrement provient de la perspective DG (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é. La 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.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}/

Artefact JSON avec tenant, sphère, rôle

Chaque artefact (entrée de journal, pièce, entrée de registre foncier) contient le tenant, la sphère et le rôle comme champs obligatoires. Principe central de la traçabilité temporelle : le moment d'enregistrement n'est pas un champ séparé, mais ancré dans la uuidV7 elle-même - comme horodatage 48 bits conformément à RFC 9562 §5.7. La uuidV7 peut être générée à partir d'un repère temporel prédéfini (pas seulement now()) via GitCover Helper (UuidV7Gen), le reste étant rempli avec de l'aléatoire. Ainsi, le moment d'enregistrement est cryptographiquement lié à l'identité de l'artefact et ne peut pas être modifié après coup.

Important - ce qui arrive dans le dépôt Git : seuls ces artefacts structurés (entrées JSON, sidecars, pièces) 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. Ce qui est une fois dedans 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 la 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 pour l'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 par sphère -

Groupement 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 groupement 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 pièces et des entrées des filiales sans les copier.

Important : le méta-dépôt ne contient aucune écriture comptable - seulement 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 (cheap) Demain (auditable) Risque réduit
champ tenant par artefact Affectation claire lors du contrôle de la holding Confusion des patrimoines entre sociétés
champ sphere par entrée Statut d'utilité publique défendu Retrait § 55 AO (confusion des patrimoines)
champ role par entrée Traçable quant à la fonction dans laquelle il a été agi Conflit de rôles, représentation non autorisée
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 Affectation univoque sans doublons Incohérence en cas de copies

Exigence du harness (aperçu)

Déductible d'ED02 :

ID Exigence Priorité
FA-1.4 Affectation 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 entrée de registre foncier et entrée de journal MUST (utilité publique)
FA-3.3 Le hook pre-commit vérifie la complétude 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 Emplacement Objet
Primaire / SSoT git.gitcover.org/GCC Stockage canonique (signé GPG, versionné)
Miroir OSS public / CDN codeberg.org/gitcover-commons Miroir en lecture seule ; découverte FLOSS
Hub communautaire github.com/gitcover-commons Issues & Discussions ; référence du code source sur Codeberg

Remarque : cette affectation des sources, du miroir et du hub communautaire reflète l'état actuel et peut changer. Veuillez vérifier la source canonique respective sur gitcover.org pour l'état actuel.