Files
leocrm/docs/RECOVERY_SCOPE.md
T

6.4 KiB

LeoCRM Recovery Scope

Erstellt: 2026-08-03 Git-Tag: pre-recovery-current (3cbf921) Branch: recovery/minimal-finish Alembic-Head: 0096

Diese Datei ist die einzige verbindliche Quelle fuer den Reparatur- und Abschlussplan. Alle frueheren Umbau- und Abschlussdokumente sind ueberholt.


Verbindliche Regeln

  1. Keine neue Zielarchitektur entwerfen.
  2. Keine Microservices einfuehren.
  3. Keine neuen generischen Security-, Entity-, Storage- oder Agentenplattformen bauen.
  4. Bestehende Services nicht vollstaendig auf Commands umbauen.
  5. Keine Beispiele als Produktanforderungen behandeln.
  6. Keine Migration bis einschliesslich 0092 erneut veraendern.
  7. Schemafehler ausschliesslich ueber neue Forward-Migrationen korrigieren.
  8. Keine produktiven Daten automatisch zusammenfuehren oder loeschen.
  9. Keine manuellen Aenderungen in laufenden Coolify-Containern.
  10. Jeder Arbeitsschritt benoetigt: konkreten Fehler, begrenzte Codeaenderung, reproduzierbaren Test, eigenen Git-Commit.
  11. Der bisherige UMBAU_PLAN.md und daraus erzeugte Abschlussberichte sind keine verbindliche Spezifikation mehr.
  12. Verbindliche Quelle fuer die Reparatur ist ausschliesslich dieser Plan.

Was erhalten bleibt

Nicht zurueckbauen: FastAPI, React, PostgreSQL, Redis, ARQ, modularer Monolith, vorhandene Fachmodule, getrennte Datenbankrollen (crm_api, crm_auth, crm_worker, crm_migration), RLS und Tenant-Isolation, app.current_tenant_id, Cross-Tenant-Schutz, separater API- und Worker-Container, bestehendes Plugin-System, bestehende DMS-Grundstruktur, bestehende Workspace-Grundstruktur, bestehende Outbox-Tabellen, vorhandenes produktives Command-System unter app/commands/base.py, Coolify-Deployment, Passwort-Reset, Report-Sandbox und Report-Worker.


Phasen-Status

Phase Status Hinweis
0 — Stand sichern Abgeschlossen Tag + Branch + RECOVERY_SCOPE.md
1 — Migrationen & Zielschema Abgeschlossen Audit + Forward-Migrationen 0093-0096
2 — Security & Permissions Abgeschlossen Permissions registriert, Fallback entfernt, RLS in Produktion verifiziert
3 — Doppelte Command-Struktur Abgeschlossen core/commands.py + create_contact.py entfernt
4 — Workspaces 🔶 Teilweise erledigt Siehe unten
5 — AI & MCP Nicht begonnen Delegationstoken, Bearer-Auth, Pfadbegrenzung
6 — DMS & Attachments Nicht begonnen Streaming, Deduplikation, Alt-Migration
7 — Plugins, Worker, Outbox Nicht begonnen Plugin-Gate, Event-Envelope, Handler-Tracking
8 — CI, Restore, Coolify Nicht begonnen Merge-CI, Migrations-Gate, Restore-Test
9 — Abschluss Nicht begonnen RECOVERY_ACCEPTANCE_REPORT.md

Phase 4 — Workspaces

Verbindlicher Funktionsumfang

  1. Workspaces sind ausschliesslich UI- und Arbeitskontext.
  2. Workspaces veraendern keine Rechte.
  3. Module koennen je Workspace sichtbar oder ausgeblendet werden.
  4. Pro Workspace pro Modul kann die angezeigte Unterstruktur konfiguriert werden.
  5. Die Konfiguration erfolgt ueber workspace_modules.config (JSONB) — jedes Modul definiert selbst was in seiner config steht.
  6. Beispiel: Kontakte-Modul → config enthaelt sichtbare Ordner-IDs.
  7. Beispiel: DMS-Modul → config enthaelt sichtbare Ordner-IDs.
  8. Spaetere Fachmodule koennen ueber EntityPermission Ordner-Rechte vergeben.
  9. Kein Schema-Aenderung noetig — JSONB ist flexibel genug.
  10. Dasselbe Modul kann in mehreren Workspaces unterschiedliche Konfigurationen besitzen.
  11. Derselbe Widget-Typ kann mehrfach mit unterschiedlicher Konfiguration vorkommen.

Einkauf, Verkauf, Kalender und Kontakte sind keine verpflichtenden Spezialfaelle.

4.1 Bestehende Struktur behalten

Behalten: workspaces, workspace_modules, workspace_users, workspace_widgets, workspace_modules.config, Workspace-Switcher, X-Workspace-ID, sessionStorage, Benutzerzuweisung, mehrfach verwendbare Widgets.

Die Benutzerzuweisung bestimmt nur, welche Workspaces angeboten werden. Sie vergibt keine Datenrechte.

4.2 Keine Workspace-Manager-Berechtigung

Die vorhandene Spalte workspace_users.role wird nicht als Autorisierung verwendet. Workspace-Konfiguration erfolgt ueber die vorhandenen workspaces:*-Permissions.

4.3 Tenant-Integritaet der Workspace-Tabellen

Forward-Migration 0096: tenant-bound Foreign Keys auf allen Workspace-Kindtabellen.

4.4 Modulverwaltung

Hartcodierte Modulliste im Frontend entfernt. Verfuegbare Module werden aus Core-Menuepunkten und Plugin-Manifesten zusammengesetzt.

4.5 Modul-Konfiguration pro Workspace

Pro Workspace kann eingestellt werden:

  • Welche Module angezeigt werden (existiert bereits)
  • Pro Modul: Welche Unterstruktur angezeigt wird (ueber workspace_modules.config JSONB)

Die Mechanik ist generisch:

  • Das Backend liefert config im Workspace-Context an das Frontend
  • Das Frontend liest config und filtert die Unterstruktur (z.B. Ordner) entsprechend
  • Jedes Modul definiert selbst welche Felder in seiner config stehen
  • Die WorkspaceManager UI bekommt ein Konfigurations-Panel pro Modul

Sichtbarkeit: Plugin aktiv UND Benutzer besitzt Permission UND Workspace blendet Modul nicht aus.

4.6 Bestehende Workspace-Fehler beheben

  • Widget total: korrigiert (len statt hardcoded 0)
  • Widget Update/Delete: prueft workspace_id + tenant_id
  • Workspace Context: liefert alle Module mit is_visible Flag
  • Sidebar bei Workspacewechsel: neu berechnen (useMemo-Abhaengigkeit auf workspace context)

Abnahme Phase 4

  • Workspacewechsel veraendert keine Rechte
  • Module koennen je Workspace ein- und ausgeblendet werden
  • Pro Modul kann die Unterstruktur konfiguriert werden
  • Dasselbe Modul besitzt je Workspace unterschiedliche Konfiguration
  • Widgettypen koennen mehrfach vorkommen
  • Cross-Tenant-Zuweisungen sind durch DB-Constraints blockiert
  • Sidebar aktualisiert sich unmittelbar

Produktionsstand (Phase 0.1)

  • Git-Commit: 3eb11b1 (main)
  • Alembic-Version: 0096
  • Produktions-URL: https://crm.media-on.de — healthy
  • API: healthy, Worker: healthy
  • RLS-Tabellen: 109
  • Attachments (alt): 0
  • Entity-Attachments: 2
  • DMS-Dateien: 17
  • Workspaces: 2

Ueberholte Dokumente

Folgende Dokumente sind nicht mehr als Umsetzungsanweisung zu verwenden:

  • docs/ABSCHLUSSBERICHT_PHASE0_PHASE1.md — UEBERHOLT
  • SANIERUNGS_FORTSCHRITT.md — UEBERHOLT
  • docs/phase0_phase1_acceptance_report.md — UEBERHOLT