ED10 - Sphere Classification of Business Transactions (from Trade Registration, with Non-Profit Status)

Problem

A non-profit organization registers a trade - and from that moment on, sphere separation (§§ 51–68 AO) applies. But in practice:

Trigger A - Trade Registration: This obligation arises without employees - it is part of the organization, not of its existence as an employer. From the moment a non-profit organization registers a trade, every business transaction must be assigned to a sphere.

Core Statement

Sphere classification in the Git repo means:

  1. Every business transaction has a sphere field - mandatory field, not optional (for non-profit tenants)
  2. Four spheres - ideell, vermögensverwaltend, zweckbetrieblich, wirtschaftlich
  3. Pre-commit hook checks completeness - no commit without a sphere tag for non-profit tenants
  4. Sphere violation report - automatic warning for a wirtschaftlich transaction in an ideell context
  5. Allowances assigned - volunteer/instructor allowances (§ 3 Nr. 26/26a EStG) receive a sphere tag

Compliance by Design: Sphere separation does not come about through subsequent sorting, but through structural mandatory fields and pre-commit hooks that check every business transaction for sphere assignment.

The Four Spheres

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart TD GV["Business transaction
from trade registration"] GV --> I["ideell
§ 52 AO
tax-free"] GV --> V["vermögensverwaltend
tax-free"] GV --> Z["zweckbetrieblich
§ 65 AO
tax-free"] GV --> W["wirtschaftlich
§ 64 AO
taxable"] I --> IF["Examples:
workshops, educational offerings
donations, membership fees"] V --> VF["Examples:
interest, rental income
asset management"] Z --> ZF["Examples:
admission fees
purpose-related services"] W --> WF["Examples:
merchandising, advertising
non-purpose-related services"] I --> P["Allowances § 3 Nr. 26/26a
volunteer/instructor"] Z --> P style GV fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style I fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style V fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style Z fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style W fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style IF fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style VF fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style ZF fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style WF fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style P fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33
Sphere Legal Basis Tax Status Examples
ideell § 52 AO tax-free workshops, educational offerings, donations, membership fees
vermögensverwaltend § 58 Nr. 1 AO tax-free interest, rental income, asset management
zweckbetrieblich § 65 AO tax-free (if 4 criteria met) admission fees, purpose-related services
wirtschaftlich § 64 AO taxable merchandising, advertising, non-purpose-related services

Risk of Missing Sphere Separation: Asset mixing (§ 55 Abs. 1 Nr. 5 AO) is grounds for revocation of non-profit status. A non-profit organization that does not separate wirtschaftlich and ideell transactions risks revocation of its non-profit status - and with it, subsequent taxation of reserves (retroactively up to 15 years).

Sphere Classification in the JSON Artifact

Every business transaction (journal entry, diary entry, voucher) contains the sphere field as a mandatory field for non-profit tenants:

{
  "$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": "Buchhalter",
  "tenant": "ORG-1",
  "sphere": "ideell",
  "source": "E1",
  "source_sha256": "<SHA-256-...>",
  "tags": ["workshop", "bildungsangebot"]
}

Note: The uuidV7 is the DocID of the entry. The composite key V7GUID:uuidV7 is used for storage organization and DB queries. The sphere field is a mandatory field for non-profit tenants - the pre-commit hook checks its presence and validity.

Pre-Commit Hook Checks Sphere Completeness

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart TD C["Commit with business transaction"] C --> H["Pre-commit hook"] H --> P1{"Tenant
non-profit?"} P1 -->|no| OK1["Commit accepted
sphere not required"] P1 -->|yes| P2{"sphere field
present?"} P2 -->|no| R1["Commit rejected
sphere missing"] P2 -->|yes| P3{"sphere value
valid?"} P3 -->|no| R2["Commit rejected
invalid sphere"] P3 -->|yes| P4{"Sphere violation?
(wirtschaftlich in an ideell context)"} P4 -->|yes| W["Warning
+ commit accepted with note"] P4 -->|no| OK2["Commit accepted"] style C fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style H 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 OK1 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style OK2 fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style R1 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style R2 fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style W fill:#FDBA74,stroke:#C2410C,color:#0F1B33
Check Fails When GoBD/AO Reference
Tenant non-profit? - § 52 AO (non-profit status)
sphere field present Missing sphere for non-profit tenant § 55 Abs. 1 Nr. 5 AO (asset mixing)
sphere value valid Invalid sphere value § 52/64/65 AO (sphere definition)
Sphere violation wirtschaftlich in an ideell context § 55 AO (risk of revocation)

Important - Warning vs. Rejection: A sphere violation (wirtschaftlich transaction in an ideell context) results in a warning, not a rejection - the transaction may be legitimate (e.g., a commercial business that belongs to the corporation). But the warning forces the entrepreneur to consciously confirm the classification and document it in the commit.

Sphere Report

%%{init: {'theme':'base','themeVariables':{'primaryColor':'#FBFAF7','primaryTextColor':'#0F1B33','primaryBorderColor':'#6B7280','lineColor':'#6B7280'}}}%% flowchart LR R["Sphere report
(post-commit hook)"] R --> SI["ideell
count + sum"] R --> SV["vermögensverwaltend
count + sum"] R --> SZ["zweckbetrieblich
count + sum"] R --> SW["wirtschaftlich
count + sum"] SW --> PR["Check:
wirtschaftlich below threshold?
§ 64 Abs. 3 AO (45,000 EUR)"] PR -->|yes| OK["no corporation tax liability"] PR -->|no| KST["corporation tax liability
+ check VAT liability"] style R fill:#0F1B33,stroke:#0F1B33,color:#FBFAF7 style SI fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style SV fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style SZ fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style SW fill:#FDBA74,stroke:#C2410C,color:#0F1B33 style PR fill:#DBEAFE,stroke:#1D4ED8,color:#0F1B33 style OK fill:#D1FAE5,stroke:#0A7F5C,color:#0F1B33 style KST fill:#FDBA74,stroke:#C2410C,color:#0F1B33

The post-commit hook generates a sphere report per fiscal year:

Sphere Evaluation Tax Check
ideell count + sum of transactions tax-free, no check
vermögensverwaltend count + sum tax-free, no check
zweckbetrieblich count + sum tax-free under § 65 AO (4 criteria)
wirtschaftlich count + sum threshold § 64 Abs. 3 AO (45,000 EUR) - above that, corporation tax/VAT liability

Practical Example: The entrepreneur (E1) books a merchandising sale (wirtschaftlich, 500 EUR) and a workshop (ideell, 200 EUR). The pre-commit hook requires sphere: "wirtschaftlich" or sphere: "ideell" respectively. The post-commit hook generates a report: wirtschaftlich 500 EUR (below the threshold), ideell 200 EUR. If the threshold is exceeded, the report warns of corporation tax liability.

Allowances and Spheres

Volunteer and instructor allowances (§ 3 Nr. 26/26a EStG) must be assigned to the correct sphere:

Allowance Sphere Annual Tax-Free Allowance Legal Basis
Volunteer allowance ideell (regularly) 960 EUR/year § 3 Nr. 26a EStG
Instructor allowance ideell or zweckbetrieblich 3,300 EUR/year § 3 Nr. 26 EStG

Important: The allowances are tax-free - but only if they are assigned to the correct sphere. A volunteer allowance in the commercial business is not tax-free. The sphere field in the diary entry documents the assignment.

Articles of Association § 6a: The payout of the allowances requires an opening clause in the articles of association (§ 6a). Until the amendment to the articles of association is entered in the commercial register, the payout is to be deferred - the entitlement arises from the date of the amendment to the articles of association. See ED11 for details.

Risk Leverage

Today (cheap) Tomorrow (audit-proof) Risk Mitigated
sphere field per business transaction Sphere separation provable without gaps Revocation § 55 AO (asset mixing)
Pre-commit hook checks the sphere No transaction without a sphere tag GoBD violation "not orderly"
Sphere report per fiscal year Threshold § 64 Abs. 3 AO monitored Corporation tax/VAT back payments
Allowances with sphere tag Tax exemption under § 3 Nr. 26/26a EStG evidenced Tax liability of the allowances
Warning on sphere violation Conscious classification documented Covert asset mixing

Harness Requirement (Preview)

Derivable from ED10:

ID Requirement Priority
FA-3.1 Sphere tags: ideell/vermögensverwaltend/zweckbetrieblich/wirtschaftlich MUST (non-profit)
FA-3.2 Sphere tag mandatory per Grundbuch entry and diary entry MUST (non-profit)
FA-3.3 Pre-commit hook checks sphere tag completeness MUST (non-profit)
FA-3.4 Sphere violation report (wirtschaftlich in an ideell context) SHOULD (non-profit)
FA-8.2 Allowance tracking (§ 3 Nr. 26/26a EStG) with sphere tag SHOULD (non-profit)
FA-8.5 Sphere classification per business transaction (mandatory field, pre-commit checked) MUST (non-profit)
TA-2.3 Pre-commit hook: sphere tag check (non-profit only) MUST (non-profit)

The complete list of requirements in Harness-Anforderungen.md.

Sources

Role Location Purpose
Primary / SSoT git.gitcover.org/GCC Canonical repository (GPG-signed, versioned)
Public OSS Mirror / CDN codeberg.org/gitcover-commons Read-only mirror; FLOSS discovery
Community Hub github.com/gitcover-commons Issues & Discussions; source code reference on Codeberg

Note: This mapping of sources, mirror, and community hub reflects the current status and may change. Please check the respective canonical source on gitcover.org for the current state.