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>
254 lines
12 KiB
Markdown
254 lines
12 KiB
Markdown
# Whistleblower — Hinweisgebersystem
|
|
|
|
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 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 (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
|
|
|
|
### 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
|
|
|
|
### 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 |
|