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