feat: enhance whistleblower HinSchG content, fix control-library filter layout
All checks were successful
CI/CD / go-lint (push) Has been skipped
CI/CD / python-lint (push) Has been skipped
CI/CD / nodejs-lint (push) Has been skipped
CI/CD / test-go-ai-compliance (push) Successful in 34s
CI/CD / test-python-backend-compliance (push) Successful in 35s
CI/CD / test-python-document-crawler (push) Successful in 26s
CI/CD / test-python-dsms-gateway (push) Successful in 21s
CI/CD / validate-canonical-controls (push) Successful in 12s
CI/CD / Deploy (push) Successful in 2s

- Whistleblower page: expand overview tab with comprehensive HinSchG legal info
  (Gesetzliche Grundlage, Fristen-Cards, Anwendungsbereich, Schutz des Hinweisgebers)
- StepHeader: enrich whistleblower tips with detailed HinSchG paragraphs and sanctions
- Wiki: add migration 054 with 5 new/updated HinSchG articles (Anwendungsbereich,
  Hinweisgeberschutz, Meldestellen, Verfahrensablauf, Datenschutz-Anforderungen)
- MKDocs: rewrite whistleblower docs with full legal basis, architecture, API, DB schema
- Control library: fix filter dropdown overflow by splitting into search + filter rows

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-15 00:23:19 +01:00
parent 2ed1c08acf
commit f3e05c1bf7
5 changed files with 746 additions and 110 deletions

View File

@@ -1,33 +1,253 @@
# Whistleblower — Hinweisgebersystem
HinSchG-konformes Hinweisgebersystem fuer anonyme Meldungen und sichere Fallbearbeitung.
HinSchG-konformes Hinweisgebersystem fuer anonyme und namentliche Meldungen, sichere Fallbearbeitung und automatische Fristenueberwachung.
## Gesetzliche Grundlage
### Hinweisgeberschutzgesetz (HinSchG)
Das **Hinweisgeberschutzgesetz (HinSchG)** setzt die EU-Whistleblowing-Richtlinie (EU) 2019/1937 in deutsches Recht um. Es ist seit dem **2. Juli 2023** in Kraft.
| Datum | Pflicht |
|-------|---------|
| 02.07.2023 | Inkrafttreten fuer Unternehmen ab 250 Beschaeftigten |
| 17.12.2023 | Erweiterung auf Unternehmen ab 50 Beschaeftigten (ss 12 HinSchG) |
### Sachlicher Anwendungsbereich (ss 2 HinSchG)
Das Gesetz schuetzt Hinweisgeber, die Informationen ueber **Verstoesse** melden, die unter anderem folgende Bereiche betreffen:
- **Strafrecht** — Straftaten nach StGB und Nebenstrafrecht
- **Datenschutz** — Verstoesse gegen DSGVO und BDSG
- **Geldwaesche** — Verstoesse gegen das Geldwaeschegesetz (GwG)
- **Produktsicherheit** — Verstoesse gegen Produktsicherheitsvorschriften
- **Umweltschutz** — Verstoesse gegen Umweltauflagen und -gesetze
- **Arbeitsschutz** — Verstoesse gegen Arbeitnehmerrechte und Arbeitsschutzvorschriften
- **Lebensmittelsicherheit** — Verstoesse gegen lebensmittelrechtliche Vorgaben
- **Wettbewerbs- und Kartellrecht** — Unlauterer Wettbewerb, Marktmanipulation
- **Verbraucherschutz** — Verstoesse gegen Verbraucherschutzvorschriften
- **Steuerrecht** — Steuerverstoesse bei Unternehmen
### Geschuetzte Personengruppen (ss 1 HinSchG)
- Arbeitnehmerinnen und Arbeitnehmer
- Beamtinnen und Beamte
- Auszubildende und Praktikanten
- Freiwillige und ehrenamtlich Taetige
- Selbststaendige und Anteilseigner
- Mitglieder von Leitungs- und Aufsichtsorganen
- Personen, die im Rahmen einer Bewerbung Informationen erlangt haben
### Fristen und Pflichten
| Pflicht | Frist | Rechtsgrundlage |
|---------|-------|-----------------|
| Eingangsbestaetigung | **7 Tage** nach Meldungseingang | ss 17 Abs. 1 S. 2 HinSchG |
| Rueckmeldung ueber Folgemaßnahmen | **3 Monate** nach Eingangsbestaetigung | ss 17 Abs. 2 HinSchG |
| Aufbewahrung der Dokumentation | **3 Jahre** nach Abschluss des Verfahrens | ss 11 Abs. 5 HinSchG |
### Schutz des Hinweisgebers
| Schutzmechanismus | Rechtsgrundlage | Beschreibung |
|-------------------|-----------------|--------------|
| **Repressalienverbot** | ss 36 HinSchG | Jede Benachteiligung wegen einer Meldung ist verboten |
| **Beweislastumkehr** | ss 36 Abs. 2 HinSchG | Arbeitgeber muss beweisen, dass Maßnahmen nicht mit Meldung zusammenhaengen |
| **Schadensersatz** | ss 37 HinSchG | Hinweisgeber hat Anspruch auf Ersatz des erlittenen Schadens |
| **Vertraulichkeit** | ss 8 HinSchG | Identitaet darf nur mit Einwilligung oder bei gesetzlicher Pflicht offengelegt werden |
### Sanktionen (ss 40 HinSchG)
| Verstoß | Bussgeld |
|---------|----------|
| Keine interne Meldestelle eingerichtet | Bis zu **20.000 EUR** |
| Behinderung einer Meldung | Bis zu **50.000 EUR** |
| Verstoß gegen Vertraulichkeitsgebot | Bis zu **50.000 EUR** |
| Repressalien gegen Hinweisgeber | Bis zu **50.000 EUR** |
---
## Features
- **Anonyme Meldungen** — Sichere, anonyme Eingabe von Hinweisen
- **Fallbearbeitung** — Workflow fuer Sichtung, Untersuchung und Abschluss
- **Fristen-Management** — Automatische Ueberwachung der gesetzlichen Bearbeitungsfristen (7 Tage Eingangsbestaetigung, 3 Monate Rueckmeldung)
- **Kommunikationskanal** — Anonymer Austausch zwischen Hinweisgeber und Ombudsperson
- **Audit-Trail** — Lueckenlose Dokumentation aller Bearbeitungsschritte
- **Anonyme und namentliche Meldungen** — Sichere Eingabe von Hinweisen, wahlweise anonym oder mit Kontaktdaten
- **Mehrstufiger Fallbearbeitungs-Workflow** — Neu → Bestaetigt → In Pruefung Untersuchung → Massnahmen → Abgeschlossen
- **Automatisches Fristen-Management** — Ueberwachung der 7-Tage- und 3-Monate-Fristen gemaess ss 17 HinSchG mit Warnungen bei drohender Ueberschreitung
- **Anonymer Kommunikationskanal** — Sicherer Austausch zwischen Hinweisgeber und Ombudsperson ohne Identitaetspreisgabe
- **Massnahmen-Tracking** — Dokumentation und Nachverfolgung von Folgemaßnahmen
- **Prioritaetsstufen** — Klassifizierung nach Niedrig, Normal, Hoch, Kritisch
- **Audit-Trail** — Lueckenlose, revisionssichere Dokumentation aller Bearbeitungsschritte
- **Kategorisierung** — Vordefinierte Meldekategorien (Korruption, Betrug, Datenschutz, Diskriminierung, Umwelt, Wettbewerb, Produktsicherheit, Steuerhinterziehung)
- **Statistik-Dashboard** — Ueberblick ueber Meldungsaufkommen, Bearbeitungsstand und Fristeneinhaltung
---
## Architektur
### Bearbeitungs-Workflow
```mermaid
stateDiagram-v2
[*] --> Neu: Meldung eingereicht
Neu --> Bestaetigt: Eingangsbestaetigung (≤ 7 Tage)
Bestaetigt --> InPruefung: Inhaltliche Pruefung
InPruefung --> Untersuchung: Formelle Untersuchung
Untersuchung --> Massnahmen: Folgemaßnahmen eingeleitet
Massnahmen --> Abgeschlossen: Rueckmeldung (≤ 3 Monate)
InPruefung --> Abgelehnt: Unbegruendet / nicht zustaendig
Abgeschlossen --> [*]
Abgelehnt --> [*]
```
### Komponenten
| Komponente | Technologie | Beschreibung |
|------------|-------------|--------------|
| Frontend (Admin) | Next.js / React | SDK-Seite unter `/sdk/whistleblower` mit Tabs: Uebersicht, Neue Meldungen, In Untersuchung, Abgeschlossen, Einstellungen |
| API-Proxy | Next.js API Route | `/api/sdk/v1/whistleblower/[[...path]]/route.ts` — Proxy zum Backend |
| Backend-Handlers | Go / Gin | `whistleblower_handlers.go` — REST API fuer Meldungen, Nachrichten, Statistiken |
| Datenschicht | Go | `store.go` — PostgreSQL-Operationen, prepared statements |
| Datenmodell | Go | `models.go` — Structs fuer Report, Message, Measure, AuditEntry |
| TypeScript Types | TypeScript | `lib/sdk/whistleblower/types.ts` — Frontend-Typen, Deadline-Utilities |
| API Client | TypeScript | `lib/sdk/whistleblower/api.ts` — SDK-API-Aufrufe |
| DB-Schema | SQL | `migrations/009_whistleblower_schema.sql` |
---
## API Endpoints
Alle unter `/api/v1/whistleblower/`, benoetigen `X-Tenant-ID` Header.
### Admin-Endpoints
| Method | Endpoint | Beschreibung |
|--------|----------|-------------|
| GET | `/reports` | Meldungen auflisten |
| POST | `/reports` | Neue Meldung erstellen |
| GET | `/reports/{id}` | Meldungsdetails |
| PUT | `/reports/{id}/status` | Status aktualisieren |
| POST | `/reports/{id}/messages` | Nachricht hinzufuegen |
| GET | `/reports/{id}/messages` | Nachrichten abrufen |
| GET | `/statistics` | Statistiken |
| GET | `/reports` | Meldungen auflisten (mit Filter und Paginierung) |
| POST | `/reports` | Neue Meldung erfassen |
| GET | `/reports/{id}` | Meldungsdetails inkl. Nachrichten, Massnahmen, Audit-Trail |
| PUT | `/reports/{id}` | Meldung aktualisieren (Status, Prioritaet, Zuweisung) |
| DELETE | `/reports/{id}` | Meldung loeschen |
| POST | `/reports/{id}/messages` | Nachricht an Hinweisgeber senden (Ombudsperson-Rolle) |
| GET | `/reports/{id}/messages` | Nachrichten-Verlauf abrufen |
| GET | `/statistics` | Statistiken (Gesamt, nach Kategorie, nach Status, ueberfaellige) |
### Oeffentliche Endpoints (fuer Hinweisgeber)
| Method | Endpoint | Beschreibung |
|--------|----------|-------------|
| POST | `/public/reports` | Anonyme/namentliche Meldung einreichen |
| GET | `/public/reports/{accessKey}` | Meldungsstatus mit Zugangscode abfragen |
| POST | `/public/reports/{accessKey}/messages` | Nachricht als Hinweisgeber senden |
---
## Frontend
Seite unter `/sdk/whistleblower` mit Meldungsuebersicht, Falldetails und Statistik-Dashboard.
### SDK Admin-Seite (`/sdk/whistleblower`)
Die Seite bietet fuenf Tabs:
| Tab | Inhalt |
|-----|--------|
| **Uebersicht** | Statistik-Cards, HinSchG-Info-Box mit Fristen und Anwendungsbereich, Fristenwarnungen, alle Meldungen |
| **Neue Meldungen** | Gefilterte Ansicht: nur Status "Neu" — Eingangsbestaetigung steht aus |
| **In Untersuchung** | Gefilterte Ansicht: Status "Bestaetigt", "In Pruefung", "Untersuchung", "Massnahmen" |
| **Abgeschlossen** | Gefilterte Ansicht: Status "Abgeschlossen" und "Abgelehnt" |
| **Einstellungen** | Konfiguration (in spaeteren Versionen) |
### Funktionen
- **Meldung erfassen**: Modal-Dialog fuer Titel, Beschreibung, Kategorie, Prioritaet, anonym/namentlich
- **Falldetail-Drawer**: Seitenleiste mit Beschreibung, Badges, Status-Transitions, Zuweisungen, Kommentare, Nachrichten-Verlauf
- **Filter**: Kategorie, Status, Prioritaet — kombinierbar
- **Sortierung**: Ueberfaellige Meldungen zuerst, dann nach Prioritaet, dann nach Datum
- **Fristenwarnungen**: Rote Alerts bei ueberschrittenen 7-Tage- oder 3-Monate-Fristen
---
## Datenbank
Migration `009_whistleblower_schema.sql` erstellt Tabellen fuer Meldungen, Nachrichten und Bearbeitungsschritte.
### Schema (Migration `009_whistleblower_schema.sql`)
#### Tabelle: `whistleblower_reports`
| Spalte | Typ | Beschreibung |
|--------|-----|--------------|
| `id` | UUID | Primaerschluessel |
| `tenant_id` | UUID | Mandanten-Zuordnung |
| `reference_number` | VARCHAR | Referenznummer (z.B. "WB-2026-000042") |
| `access_key` | VARCHAR | Anonymer Zugangscode (XXXX-XXXX-XXXX) |
| `category` | VARCHAR | Meldekategorie |
| `status` | VARCHAR | Bearbeitungsstatus |
| `priority` | VARCHAR | Prioritaetsstufe |
| `title` | VARCHAR | Meldungstitel |
| `description` | TEXT | Detailbeschreibung |
| `is_anonymous` | BOOLEAN | Anonyme Meldung |
| `reporter_name` | VARCHAR | Name (optional) |
| `reporter_email` | VARCHAR | E-Mail (optional) |
| `assigned_to` | VARCHAR | Zustaendige Person |
| `received_at` | TIMESTAMP | Eingangszeitpunkt |
| `acknowledged_at` | TIMESTAMP | Eingangsbestaetigung |
| `deadline_acknowledgment` | TIMESTAMP | 7-Tage-Frist (automatisch berechnet) |
| `deadline_feedback` | TIMESTAMP | 3-Monate-Frist (automatisch berechnet) |
| `closed_at` | TIMESTAMP | Abschlusszeitpunkt |
#### Tabelle: `whistleblower_messages`
Anonymer Kommunikationskanal zwischen Hinweisgeber und Ombudsperson.
#### Tabelle: `whistleblower_measures`
Dokumentation von Folgemaßnahmen mit Status-Tracking (geplant, in Bearbeitung, abgeschlossen).
#### Tabelle: `whistleblower_audit_trail`
Lueckenlose, revisionssichere Protokollierung aller Bearbeitungsschritte.
---
## Meldekategorien
| Kategorie | Beschreibung | Beispiele |
|-----------|--------------|-----------|
| Korruption | Bestechung, Vorteilsnahme | Schmiergeldzahlungen, Kickback-Vereinbarungen |
| Betrug | Vermoegensdelikte | Urkundenfaelschung, Bilanzbetrug |
| Datenschutz | DSGVO/BDSG-Verstoesse | Unerlaubte Datenweitergabe, fehlende Einwilligung |
| Diskriminierung | Benachteiligung | Mobbing, sexuelle Belaestigung, AGG-Verstoesse |
| Umwelt | Umweltvergehen | Illegale Entsorgung, Emissionsverstoesse |
| Wettbewerb | Kartellrecht | Preisabsprachen, Marktmanipulation |
| Produktsicherheit | Sicherheitsmaengel | Mangelhafte Produkte, fehlende Warnhinweise |
| Steuerhinterziehung | Steuerverstoesse | Steuerhinterziehung, illegale Steuergestaltung |
| Sonstiges | Weitere Verstoesse | Interne Richtlinienverstoesse |
---
## Fristen-Tracking
Das System berechnet Fristen automatisch und warnt bei drohender Ueberschreitung:
| Frist | Berechnung | Warnstufe |
|-------|------------|-----------|
| 7-Tage-Eingangsbestaetigung | `received_at + 7 Tage` | Orange ab 2 Tage vorher, Rot bei Ueberschreitung |
| 3-Monate-Rueckmeldung | `acknowledged_at + 3 Monate` | Orange ab 14 Tage vorher, Rot bei Ueberschreitung |
Utility-Funktionen in `types.ts`:
- `getDaysUntilAcknowledgment(report)` — Verbleibende Tage bis Eingangsbestaetigung
- `getDaysUntilFeedback(report)` — Verbleibende Tage bis Rueckmeldungsfrist
- `isAcknowledgmentOverdue(report)` — Prueft 7-Tage-Frist
- `isFeedbackOverdue(report)` — Prueft 3-Monate-Frist
- `generateAccessKey()` — Erzeugt Zugangscode im Format XXXX-XXXX-XXXX
---
## Datei-Referenz
| Datei | Beschreibung |
|-------|--------------|
| `admin-compliance/app/sdk/whistleblower/page.tsx` | Frontend-Seite (Tabs, Filter, Modals, Detail-Drawer) |
| `admin-compliance/app/api/sdk/v1/whistleblower/[[...path]]/route.ts` | API-Proxy zum Backend |
| `admin-compliance/lib/sdk/whistleblower/types.ts` | TypeScript-Typen, Enums, Deadline-Utilities |
| `admin-compliance/lib/sdk/whistleblower/api.ts` | API-Client fuer SDK-Backend |
| `ai-compliance-sdk/internal/whistleblower/models.go` | Go-Datenmodelle |
| `ai-compliance-sdk/internal/whistleblower/store.go` | PostgreSQL-Store (CRUD, Queries) |
| `ai-compliance-sdk/internal/api/handlers/whistleblower_handlers.go` | REST-API-Handler |
| `ai-compliance-sdk/migrations/009_whistleblower_schema.sql` | Datenbankschema |