Init: RoggioApp Architecture, Prisma Schema, API MVP

This commit is contained in:
Clara Zetkin
2026-04-26 19:42:42 +02:00
commit 193b29e8a9
5256 changed files with 1446953 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
# 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.