Zum Inhalt springen

Zeiterfassung für Wirtschaftsprüfer

Zeiterfassung für Projekte und Mitarbeiter einer Prüfungsgesellschaft · Von Grund auf gebaut, allein

Aktualisiert

Vorher

Mandanten, Projekte und Stunden lagen an einem Ort, an dem in der Firma jeder alles sehen und ändern konnte.

Nachher

87

Berechtigungs-Kästchen vor jedem Deploy gegen die Datenbank belegt; die 30 ohne Wirkung wurden ausgeblendet.

So funktioniert es
  1. 1Person:Inhaber

    Baut Rollen mit Häkchen je Bereich (Mandanten, Projekte, Zeiten, Berichte) für Ansehen, Anlegen, Bearbeiten und Löschen.

  2. 2Person:Mitarbeiter

    Bucht Stunden auf Mandant, Projekt und Aufgabe oder trägt Abwesenheit ein.

    Software:Web-App

    Erinnert alle, deren Zeitnachweis vor der Frist noch leer ist.

  3. 3Person:Projektleiter

    Genehmigt oder lehnt den Wochennachweis seines Projektteams ab.

  4. 4Software:Datenbank

    Zeigt jeder Person nur, was ihre Rolle erlaubt: Mitarbeiter sehen ihre eigenen Stunden, Projektleiter ihr Team, Inhaber jeden Mandanten.

  5. 5Person:Inhaber

    Liest Stunden nach Mandant, Projekt und Person in Dashboards und Berichten.

Gilt immer

  • Früher konnte jeder in der Firma jeden Mandanten und die Stunden aller öffnen. Jetzt verweigert die Datenbank alles, was eine Rolle nicht erlaubt, selbst wenn die Oberfläche es anfragt.
  • Vor jedem Push wird jede Rolle gegen eine isolierte Kopie der Datenbank getestet.

Problem

Eine Prüfungsgesellschaft verwaltete Mandanten, Projekte und Mitarbeiterstunden in einem Tool, in dem jede Person jeden Mandanten und die Zeiten aller anderen öffnen konnte.

Diagnose

Zugriffskontrolle versagt unbemerkt, wenn sie nur in der Oberfläche steckt. Deshalb musste jede Regel in die Datenbank und durch Tests belegt werden.

Abgewogene Optionen

  1. Jede Rolle sieht andere Daten. Wo liegen die Zugriffsregeln?

    Gewählt

    In der Datenbank selbst, vor jedem Deploy für jede Rolle getestet

    Die Oberfläche kann nichts preisgeben, was die Datenbank verweigert. Preis: ein Testlauf auf einer isolierten Kopie vor jedem Push.

    • Verworfen

      Nur in der Oberfläche

      Jemand konnte Daten sehen oder ändern, die die Oberfläche verbergen sollte.

  2. Ein Datensatz wird nicht mehr gebraucht. Löschen oder behalten?

    Gewählt

    Archivieren und anonymisieren

    Die Historie der Zeitnachweise bleibt erhalten.

    • Verworfen

      Löschen

      Löschen zieht die Historie der Zeitnachweise mit.

Lösung

Eine Single-Page-Web-App auf verwaltetem Postgres. Jede Zugriffsregel liegt in der Datenbank und wird vor jedem Deploy durch eine automatische Rollenmatrix belegt.

App
  • React
  • Vite
  • TanStack Router
  • TanStack Query
  • shadcn/ui
  • Chart.js
Daten und Sicherheit
  • Supabase
  • PostgreSQL row-level security
  • Edge Functions (Deno)
Hosting
  • Cloudflare
Qualität
  • GitHub Actions
  • Role-matrix tests
  • Vitest
  • Property-based tests
  • Accessibility tests

Kennzahlen: Automatischer Rollentest, 2026-09-25