# 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 |
