# RoggioApp - Das Kollektiv als eigene Entität ## Die Erkenntnis: Das Kollektiv ist kein abstrakter "Gott", sondern nur eine Gruppe Wenn man konsequent abstrahiert, ist die Betreiber-Struktur (das Kollektiv) nichts anderes als eine ganz normale Entität im Graphen. ### 1. Das Kollektiv ist eine `Group` In unserer Datenbank-Tabelle `Group` existieren Gruppen für "Familie Rossi" (Gäste). Genau dort existiert auch ein Datensatz für "Das Kollektiv". Unterschieden wird dies nur durch das JSONB-Feld `traits`: * *Familie Rossi:* `{"group_type": "guest", "preferences": "quiet"}` * *Das Kollektiv:* `{"group_type": "operator", "bank_account": "DE123...", "tax_id": "DE999..."}` ### 2. Die Mitglieder sind `Person`-Entitäten mit Relationen Die Menschen, die das System betreiben (Sev, Sarah, etc.), sind normale `Person`-Einträge. Ihre Zugehörigkeit zum Kollektiv wird durch die reguläre Pivot-Tabelle `GroupMembership` definiert: * *Person ID (Sev)* + *Group ID (Das Kollektiv)* + *Rolle (`finance_admin`)* * *Person ID (Sarah)* + *Group ID (Das Kollektiv)* + *Rolle (`cleaning_crew`)* ### 3. Warum das absolut genial ist: Mandantenfähigkeit ("Multi-Tenancy") Wenn wir das Kollektiv als einfache Gruppe speichern, ist das System sofort **mandantenfähig**. Beispiel: In 5 Jahren wollt ihr neben dem Haupt-Gelände noch ein zweites Haus im Nachbardorf verwalten, das aber von einer anderen Genossenschaft (oder GmbH) betrieben wird. Wir müssen *keinen einzigen* Datenbankumbau vornehmen! Wir legen einfach eine zweite Operator-Gruppe an, ordnen dieser Gruppe ein paar Personen und die neuen "Units" (Räume) zu, und fertig. Die Rechnungen ziehen sich dann automatisch die Bankdaten von Gruppe B statt von Gruppe A. ## Fazit Das System kennt keinen "Super-Admin-Hardcode". Es kennt nur den Graphen. Das Kollektiv ist ein normaler Knotenpunkt, der sich über seine Beziehungen definiert. ### 4. B2B / Firmen als Kunden (Organisationen) Genau wie "Das Kollektiv" eine Operator-Gruppe ist, sind auch B2B-Kunden (Firmen, NGOs, Vereine) einfache Einträge in der Tabelle `Group`. * *Verein e.V.:* `{"group_type": "b2b_guest", "tax_id": "DE123...", "invoice_notes": "Vereinsrabatt"}` * Die Verknüpfung der tatsächlichen Gäste erfolgt wieder über `GroupMembership`. (Z.B. ist Peter der `invoice_contact` für den Verein, und Sarah, Tim und Lisa sind `guest`). * Auch Rechnungen können somit direkt an die Entität `Group` ausgestellt werden, da die Firmen-/Vereinsadresse in deren Traits liegt, anstatt an einer einzelnen Person zu kleben.