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
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:
@@ -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 |
|
||||
|
||||
Reference in New Issue
Block a user