Administration & Governance · Global

Änderungsprotokoll: wann das Modul im Produktalltag Sinn ergibt.

Wer was wann geändert hat nachvollziehen. Das Modul hat einen eigenen Einstiegspfad innerhalb des Produkts: /admin/logs.

  • Änderungsprotokoll erklärt kompakt, wofür der Bereich gedacht ist und wann er im Arbeitsalltag relevant wird.
  • Der Bereich spielt in der Praxis besonders mit Administration und Berechtigungen zusammen.
  • Rollen, Sichtbarkeit und angrenzende Bereiche bestimmen, wie gut das Modul im Alltag funktioniert.
Modulzweck

Wofür das Modul gedacht ist

Änderungsprotokoll ist Teil des aktiven Modul-Katalogs und deckt einen klaren Ausschnitt des Produktalltags ab.

Wer was wann geändert hat nachvollziehen. Im tenantweiten Kontext sorgt der Bereich dafür, dass wiederkehrende Entscheidungen, Stammdaten oder Übersichten nicht in Nebensysteme ausweichen müssen.

Änderungsprotokoll ist als eigenständiger Produktbaustein gedacht. Gerade deshalb lohnt sich ein Blick darauf, wie der Bereich mit Rollen, Datenkontext und angrenzenden Modulen zusammenspielt.

Das Modul hat einen eigenen Einstiegspfad innerhalb des Produkts: /admin/logs.
Praxisbezug

Typische Einsatzfälle

Diese Situationen zeigen, wann der Bereich in einem sauberen Rollout oder im laufenden Betrieb konkret Mehrwert liefert.

Tenant sauber aufsetzen

Das Modul hilft dabei, organisatorische Regeln und Stammdaten an einer kontrollierten Stelle zu pflegen.

Verantwortung eingrenzen

Governance-Bereiche sollten nur wenige Personen pflegen, damit die Struktur stabil bleibt.

Rollouts belastbar machen

Eine klare Administrationsstruktur vereinfacht Onboarding, Rechtestruktur und spätere Produkterweiterungen.

Modulverbindungen

Wie das Modul mit anderen Bereichen zusammenspielt

struct-i-vio ist als zusammenhängende Plattform gedacht. Diese Module liegen fachlich am nächsten bei diesem Bereich.

Sichtbarkeit

Berechtigungen und Sichtbarkeit

Die öffentliche Dokumentation beschreibt die Logik auf Produktniveau - nicht als technische Policy-Liste, sondern als Rollout-Leitfaden.

Die Sichtbarkeit wird tenantweit bzw. organisationsweit freigeschaltet und sollte zu Rolle und Verantwortungsbereich passen.
Strukturverändernde oder tenantweite Einstellungen gehören in einen kleinen Administrationskreis und sollten nicht breit ausgerollt werden.
Empfohlener Einsatz

Best Practices

So bleibt der Bereich bei Einführung und Nutzung anschlussfähig an den restlichen Produktfluss.

Nur wenige Personen sollten tenantweite Struktur- oder Berechtigungsbereiche pflegen dürfen.
Vor größeren Änderungen prüfen, welche angrenzenden Module oder Automationen mit betroffen sind.
Administrative Einstellungen immer zusammen mit Rollenmodell und Rollout-Plan dokumentieren.
Tiefer einsteigen

Entwickler Info

Zwei Permissions (view_all + view_own) mit echter Asymmetrie: view_all gates 2 Tabellen (activity_logs + audit_log), view_own gates NUR activity_logs. Drei-Schichten-Enforcement für view_all (API + zwei RLS-Pfade). admin_logging ist die EFFEKTIVE Permission für die System-Logs-Page — admin_logs.view_logs ist tot.

Entwickler-Info aufklappen (3)

⚠ KRITISCHAsymmetrie: view_own greift NICHT auf audit_log

Die RLS-Policy activity_logs_select_own filtert auf tenant + employee_id=current + Permission. ABER: audit_log hat KEINE _select_own-Policy. Wer view_own hat, sieht NIE audit_log-Einträge — auch nicht die eigenen. Wer alle eigenen Aktivitäten sehen will, braucht view_all (was dann aber auch fremde sieht). Live-Preview sollte beim Öffnen von view_own warnen: "Diese Permission deckt nur in-app-Änderungen, keine DB-Trigger-Logs."

  • supabase/migrations/20251210234001_squash_baseline.sql:23373 (activity_logs_select_own)
  • supabase/migrations/20251210234001_squash_baseline.sql:25902 (audit_log RLS — NUR view_all)

⚠ KRITISCHDrei-Schichten-Enforcement für view_all

view_all wird an drei Stellen geprüft: (1) API /api/audit-log:25 als primary gate mit klarem 403-String, (2) RLS auf activity_logs_select_all, (3) RLS auf audit_log via _audit_log_authorized_tenant_id() Wrapper-Funktion. Die Wrapper-Funktion ist eine Performance-Optimierung — sie ruft can_perform_action EINMAL pro Statement statt pro Row.

  • pages/api/audit-log/index.ts:25
  • supabase/migrations/20251210234001_squash_baseline.sql:367-396 (Wrapper-Funktion)

⚠ KRITISCHadmin_logs.view_logs ist tot — diese Permission ist die echte

In dim_modules existiert ein zweites Modul admin_logs mit der Permission view_logs. Dieses Modul ist deaktiviert (is_active=false). Die System-Logs-Page (pages/admin/logs.tsx:116) nutzt hasAccess('admin_logging'), nicht admin_logs. admin_logs.view_logs ist ein vestigial Toggle aus dem alten Logging-Schema und sollte als DEAD markiert werden.

  • pages/admin/logs.tsx:116
  • supabase/migrations/20251211000000_seed_dim_modules.sql:24 (is_active=false)