feat: add admin-only guide sections to Anleitung page

Add 8 admin-specific accordion sections (CSV import, ICD import,
Coding queue, Disclosure management, Users, Invitations, Audit log,
Report generation) conditionally rendered via useAuth().isAdmin.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
CCS Admin 2026-02-28 12:03:28 +00:00
parent 61f95483d6
commit 1e3f705ed3

View file

@ -6,6 +6,7 @@ import {
} from '@/components/ui/accordion'
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
import { useAuth } from '@/context/AuthContext'
import {
LayoutDashboard,
Search,
@ -15,6 +16,11 @@ import {
FileBarChart,
FileOutput,
UserCog,
Upload,
ClipboardCheck,
Users,
Mail,
History,
} from 'lucide-react'
function Term({ children }: { children: React.ReactNode }) {
@ -26,6 +32,8 @@ function StepList({ children }: { children: React.ReactNode }) {
}
export function AnleitungPage() {
const { isAdmin } = useAuth()
return (
<div className="p-6 space-y-6 max-w-4xl">
<div>
@ -341,6 +349,304 @@ export function AnleitungPage() {
</CardContent>
</Card>
{/* Admin sections */}
{isAdmin && (
<Card>
<CardHeader className="pb-2">
<CardTitle className="text-lg">Administration</CardTitle>
<p className="text-sm text-muted-foreground">
Diese Funktionen sind nur für Administratoren sichtbar.
</p>
</CardHeader>
<CardContent>
<Accordion type="multiple" className="w-full">
{/* A1. CSV-Import */}
<AccordionItem value="admin-import-csv">
<AccordionTrigger className="text-left">
<span className="flex items-center gap-2">
<Upload className="h-4 w-4 text-primary shrink-0" />
Fälle importieren (CSV)
</span>
</AccordionTrigger>
<AccordionContent className="space-y-3 text-sm leading-relaxed">
<p>
Über die Seite <strong>Import</strong> können Sie Falldaten aus CRM-Exporten (Salesforce)
ins Portal laden. Der Import erfolgt als CSV-Datei mit Vorschau und Duplikaterkennung.
</p>
<h4 className="font-semibold">CSV-Datei vorbereiten</h4>
<ul className="list-disc list-inside space-y-1">
<li><strong>Format:</strong> <Term>.csv</Term> (UTF-8-BOM), Trennzeichen wird automatisch erkannt (Komma, Semikolon oder Tab).</li>
<li><strong>Hauptkontakt</strong> Pipe-getrennt: <Term>Nachname | Vorname | Geburtsdatum | KVNR</Term>. Geburtsdatum im Format TT.MM.JJJJ.</li>
<li><strong>Erstellungsdatum</strong> Format TT.MM.JJ HH:MM (falls leer: heutiges Datum).</li>
<li><strong>Modul</strong> Wird automatisch zur Fallgruppe zugeordnet (onko, kardio, intensiv, galle, sd).</li>
<li><strong>Name</strong> CRM-Ticket-ID (optional).</li>
</ul>
<h4 className="font-semibold">Import durchführen</h4>
<StepList>
<li>Öffnen Sie <strong>Import</strong> in der Sidebar und wählen Sie den Tab <strong>CSV-Import</strong>.</li>
<li>Ziehen Sie die CSV-Datei in den Upload-Bereich oder klicken Sie auf <strong>Datei auswählen</strong>.</li>
<li>Klicken Sie auf <strong>Vorschau laden</strong>. Das System zeigt: Gesamtzeilen, neue Fälle, Duplikate und eventuelle Fehler.</li>
<li>Prüfen Sie die Vorschau-Tabelle. Duplikate werden automatisch übersprungen.</li>
<li>Klicken Sie auf <strong>X Fälle importieren</strong> um den Import zu bestätigen.</li>
<li>Nach Abschluss sehen Sie eine Zusammenfassung: importiert, übersprungen, aktualisiert.</li>
</StepList>
<h4 className="font-semibold">Duplikaterkennung</h4>
<p>
Duplikate werden anhand von Nachname + Vorname + Datum + Fallgruppe erkannt.
Erkannte Duplikate werden in der Vorschau als <Badge variant="outline">Duplikat</Badge> markiert
und beim Import übersprungen.
</p>
</AccordionContent>
</AccordionItem>
{/* A2. ICD-Import */}
<AccordionItem value="admin-import-icd">
<AccordionTrigger className="text-left">
<span className="flex items-center gap-2">
<Upload className="h-4 w-4 text-primary shrink-0" />
ICD-Codes importieren (Excel)
</span>
</AccordionTrigger>
<AccordionContent className="space-y-3 text-sm leading-relaxed">
<p>
Neben der manuellen ICD-Eingabe können Sie ICD-Codes auch per Excel-Datei
in großer Menge aktualisieren.
</p>
<StepList>
<li>Öffnen Sie <strong>Import</strong> und wählen Sie den Tab <strong>ICD-Import</strong>.</li>
<li>Laden Sie eine <Term>.xlsx</Term> oder <Term>.xls</Term> Datei hoch.</li>
<li>Das System liest den ICD-Code aus der <strong>letzten Spalte</strong> kompatibel mit altem (7-spaltig) und neuem (5-spaltig) Template.</li>
<li>Klicken Sie auf <strong>ICD-Codes importieren</strong>. Die Zuordnung erfolgt automatisch.</li>
<li>Sie erhalten eine Zusammenfassung mit Anzahl aktualisierter Fälle und eventuellen Fehlern.</li>
</StepList>
<h4 className="font-semibold">Import-Verlauf</h4>
<p>
Im Tab <strong>Import-Verlauf</strong> sehen Sie eine chronologische Liste aller vergangenen
Importe mit Dateiname, Typ, Anzahl importierter/übersprungener Zeilen und Fehlern.
</p>
</AccordionContent>
</AccordionItem>
{/* A3. Coding */}
<AccordionItem value="admin-coding">
<AccordionTrigger className="text-left">
<span className="flex items-center gap-2">
<ClipboardCheck className="h-4 w-4 text-primary shrink-0" />
Coding-Warteschlange
</span>
</AccordionTrigger>
<AccordionContent className="space-y-3 text-sm leading-relaxed">
<p>
Auf der Seite <strong>Coding</strong> werden Fälle mit vorhandenem Gutachten klassifiziert.
Die Warteschlange zeigt alle Fälle, die noch codiert werden müssen.
</p>
<h4 className="font-semibold">Felder pro Fall</h4>
<ul className="list-disc list-inside space-y-1">
<li><strong>Gutachten-Typ</strong> <Term>Bestätigung</Term> (Erstmeinung bestätigt) oder <Term>Alternative</Term> (abweichende Empfehlung).</li>
<li><strong>Therapieänderung</strong> <Term>Ja</Term> oder <Term>Nein</Term>: Hat sich die Therapie aufgrund des Gutachtens geändert?</li>
<li><strong>Diagnosekorrektur</strong> Checkbox: Die Diagnose wurde korrigiert.</li>
<li><strong>Unterversorgung</strong> Checkbox: Es lag eine medizinische Unterversorgung vor.</li>
<li><strong>Übertherapie</strong> Checkbox: Es wurde eine Übertherapie festgestellt.</li>
</ul>
<h4 className="font-semibold">Fälle codieren</h4>
<StepList>
<li>Filtern Sie optional nach <strong>Jahr</strong> und/oder <strong>Fallgruppe</strong>.</li>
<li>Jeder Fall wird als Karte angezeigt mit Fall-ID, Name, Fallgruppe und ICD-Code.</li>
<li>Wählen Sie <strong>Gutachten-Typ</strong> und <strong>Therapieänderung</strong> aus den Dropdowns.</li>
<li>Setzen Sie bei Bedarf die Checkboxen für Diagnosekorrektur, Unterversorgung oder Übertherapie.</li>
<li>Klicken Sie auf <strong>Speichern</strong>. Die Karte wird grün markiert.</li>
</StepList>
<h4 className="font-semibold">Fortschritt</h4>
<p>
Der Fortschrittsbalken und das Badge oben zeigen, wie viele Fälle auf der aktuellen
Seite bereits codiert wurden. Pro Seite werden 50 Fälle angezeigt.
</p>
</AccordionContent>
</AccordionItem>
{/* A4. Freigabe-Anfragen */}
<AccordionItem value="admin-disclosures">
<AccordionTrigger className="text-left">
<span className="flex items-center gap-2">
<ShieldCheck className="h-4 w-4 text-primary shrink-0" />
Freigabe-Anfragen verwalten
</span>
</AccordionTrigger>
<AccordionContent className="space-y-3 text-sm leading-relaxed">
<p>
Wenn DAK-Mitarbeiter Zugriff auf Personendaten benötigen, stellen sie eine Freigabe-Anfrage.
Auf der Seite <strong>Freigabe-Anfragen</strong> prüfen und entscheiden Sie über diese Anfragen.
</p>
<h4 className="font-semibold">Tabs zur Filterung</h4>
<ul className="list-disc list-inside space-y-1">
<li><strong>Alle</strong> Sämtliche Anfragen unabhängig vom Status.</li>
<li><strong>Ausstehend</strong> Offene Anfragen, die Ihre Entscheidung erfordern.</li>
<li><strong>Genehmigt</strong> Aktive Freigaben (24h gültig).</li>
<li><strong>Abgelehnt</strong> Abgelehnte Anfragen.</li>
</ul>
<h4 className="font-semibold">Anfrage bearbeiten</h4>
<StepList>
<li>Wechseln Sie zum Tab <strong>Ausstehend</strong>.</li>
<li>Prüfen Sie <strong>Antragsteller</strong>, <strong>Fall-ID</strong> und <strong>Begründung</strong>.</li>
<li>Klicken Sie auf <strong>Genehmigen</strong> (24h Zugriff) oder <strong>Ablehnen</strong>.</li>
</StepList>
<h4 className="font-semibold">Weitere Aktionen</h4>
<ul className="list-disc list-inside space-y-1">
<li><strong>Entziehen</strong> Eine aktive Freigabe sofort widerrufen.</li>
<li><strong>Wieder aufleben</strong> Eine abgelaufene oder abgelehnte Freigabe erneut für 24h aktivieren.</li>
<li><strong>Verwerfen</strong> Abgelehnte oder abgelaufene Einträge aus der Liste entfernen.</li>
</ul>
</AccordionContent>
</AccordionItem>
{/* A5. Benutzer */}
<AccordionItem value="admin-users">
<AccordionTrigger className="text-left">
<span className="flex items-center gap-2">
<Users className="h-4 w-4 text-primary shrink-0" />
Benutzer verwalten
</span>
</AccordionTrigger>
<AccordionContent className="space-y-3 text-sm leading-relaxed">
<p>
Auf der Seite <strong>Benutzer</strong> können Sie Konten erstellen,
Rollen zuweisen und Benutzer deaktivieren.
</p>
<h4 className="font-semibold">Rollen</h4>
<ul className="list-disc list-inside space-y-1">
<li><Badge variant="outline">Admin</Badge> Vollzugriff auf alle Funktionen inkl. Import, Coding, Benutzerverwaltung.</li>
<li><Badge variant="outline">DAK Mitarbeiter</Badge> Kann Fälle einsehen, ICD-Codes eingeben und Freigaben beantragen.</li>
</ul>
<h4 className="font-semibold">Neuen Benutzer erstellen</h4>
<StepList>
<li>Klicken Sie auf <strong>Neuen Benutzer erstellen</strong>.</li>
<li>Geben Sie <strong>Benutzername</strong>, <strong>E-Mail</strong> und <strong>Passwort</strong> ein.</li>
<li>Wählen Sie die <strong>Rolle</strong> (DAK Mitarbeiter oder Admin).</li>
<li>Klicken Sie auf <strong>Erstellen</strong>. Der neue Benutzer kann sich sofort anmelden.</li>
</StepList>
<h4 className="font-semibold">Benutzer bearbeiten</h4>
<StepList>
<li>Klicken Sie auf das <strong>Stift-Symbol</strong> in der Benutzerzeile.</li>
<li>Ändern Sie Benutzername, E-Mail, Rolle oder Aktivstatus.</li>
<li>Klicken Sie auf <strong>Speichern</strong>. Änderungen wirken sofort.</li>
</StepList>
<p>
<strong>Hinweis:</strong> Deaktivierte Benutzer können sich nicht mehr anmelden,
ihr Konto bleibt aber erhalten.
</p>
</AccordionContent>
</AccordionItem>
{/* A6. Einladungen */}
<AccordionItem value="admin-invitations">
<AccordionTrigger className="text-left">
<span className="flex items-center gap-2">
<Mail className="h-4 w-4 text-primary shrink-0" />
Einladungen erstellen
</span>
</AccordionTrigger>
<AccordionContent className="space-y-3 text-sm leading-relaxed">
<p>
Alternativ zur direkten Benutzererstellung können Sie <strong>Einladungs-Tokens</strong> generieren.
Der eingeladene Benutzer registriert sich damit selbstständig.
</p>
<h4 className="font-semibold">Einladung erstellen</h4>
<StepList>
<li>Klicken Sie auf <strong>Einladung erstellen</strong>.</li>
<li>Optional: Geben Sie die <strong>E-Mail</strong> des Empfängers ein (nur zur Dokumentation, kein automatischer Versand).</li>
<li>Wählen Sie die <strong>Rolle</strong> (Standard: DAK Mitarbeiter).</li>
<li>Legen Sie die <strong>Gültigkeit</strong> fest (190 Tage, Standard: 7).</li>
<li>Klicken Sie auf <strong>Erstellen</strong>.</li>
<li>Kopieren Sie den angezeigten <strong>Token</strong> und teilen Sie ihn dem Empfänger mit.</li>
</StepList>
<h4 className="font-semibold">Token-Status</h4>
<ul className="list-disc list-inside space-y-1">
<li><Badge className="bg-green-100 text-green-800 hover:bg-green-100">Aktiv</Badge> Token ist gültig und wurde noch nicht verwendet.</li>
<li><Badge className="bg-orange-100 text-orange-800 hover:bg-orange-100">Abgelaufen</Badge> Gültigkeitszeitraum überschritten.</li>
<li><Badge className="bg-gray-100 text-gray-800 hover:bg-gray-100">Verwendet</Badge> Der Benutzer hat sich erfolgreich registriert.</li>
</ul>
<p>
<strong>Hinweis:</strong> Jeder Token kann nur einmal verwendet werden.
In der Tabelle können Sie den Token jederzeit über das Kopier-Symbol erneut kopieren.
</p>
</AccordionContent>
</AccordionItem>
{/* A7. Audit-Log */}
<AccordionItem value="admin-audit">
<AccordionTrigger className="text-left">
<span className="flex items-center gap-2">
<History className="h-4 w-4 text-primary shrink-0" />
Audit-Log einsehen
</span>
</AccordionTrigger>
<AccordionContent className="space-y-3 text-sm leading-relaxed">
<p>
Das <strong>Audit-Log</strong> protokolliert alle Systemaktionen Logins,
Datenänderungen, Importe und Admin-Aktionen für Compliance und Nachvollziehbarkeit.
</p>
<h4 className="font-semibold">Filtern</h4>
<ul className="list-disc list-inside space-y-1">
<li><strong>Benutzer-ID</strong> Aktionen eines bestimmten Benutzers anzeigen.</li>
<li><strong>Aktion</strong> Nach Aktionstyp suchen (z.B. login", „update_case", csv_imported").</li>
<li><strong>Datum von / bis</strong> Zeitraum eingrenzen.</li>
</ul>
<h4 className="font-semibold">Details anzeigen</h4>
<StepList>
<li>Öffnen Sie <strong>Audit-Log</strong> unter Administration in der Sidebar.</li>
<li>Nutzen Sie optional die Filter und klicken Sie auf <strong>Filtern</strong>.</li>
<li>Klicken Sie auf eine Zeile mit dem Pfeil-Symbol, um <strong>alte und neue Werte</strong> als JSON einzusehen.</li>
<li>Klicken Sie auf <strong>Zurücksetzen</strong>, um alle Filter zu entfernen.</li>
</StepList>
<h4 className="font-semibold">Protokollierte Informationen</h4>
<ul className="list-disc list-inside space-y-1">
<li><strong>Zeitpunkt</strong> Sekundengenauer Zeitstempel.</li>
<li><strong>Benutzer-ID</strong> Wer die Aktion ausgeführt hat.</li>
<li><strong>Aktion</strong> Art der Aktion (Login, Fallaktualisierung, Import etc.).</li>
<li><strong>Entität</strong> Betroffenes Objekt (z.B. case #123").</li>
<li><strong>IP-Adresse</strong> Von wo aus die Aktion erfolgte.</li>
</ul>
</AccordionContent>
</AccordionItem>
{/* A8. Berichte generieren */}
<AccordionItem value="admin-reports">
<AccordionTrigger className="text-left">
<span className="flex items-center gap-2">
<FileBarChart className="h-4 w-4 text-primary shrink-0" />
Berichte und Wochenübersichten generieren
</span>
</AccordionTrigger>
<AccordionContent className="space-y-3 text-sm leading-relaxed">
<p>
Als Administrator können Sie neue Berichte und Wochenübersichten generieren,
die dann allen Benutzern zum Download bereitstehen.
</p>
<h4 className="font-semibold">Bericht generieren</h4>
<StepList>
<li>Öffnen Sie <strong>Berichte</strong> in der Sidebar.</li>
<li>Geben Sie <strong>Jahr</strong> und <strong>Kalenderwoche</strong> ein.</li>
<li>Wählen Sie den <strong>Typ</strong>: Gesamt, Onko-Intensiv oder Galle-Schild.</li>
<li>Klicken Sie auf <strong>Bericht generieren</strong>. Der neue Bericht erscheint in der Tabelle.</li>
</StepList>
<h4 className="font-semibold">Wochenübersicht generieren</h4>
<StepList>
<li>Öffnen Sie <strong>Wochenübersicht</strong> in der Sidebar.</li>
<li>Geben Sie <strong>Jahr</strong>, <strong>KW von</strong> und <strong>KW bis</strong> ein.</li>
<li>Wählen Sie den <strong>Exporttyp</strong>: Onko-Intensiv oder Galle-Schild.</li>
<li>Klicken Sie auf <strong>Generieren</strong>.</li>
</StepList>
<p>
<strong>Hinweis:</strong> Generierte Berichte und Wochenübersichten können von Ihnen
auch wieder gelöscht werden (Papierkorb-Symbol bzw. Checkbox-Auswahl).
</p>
</AccordionContent>
</AccordionItem>
</Accordion>
</CardContent>
</Card>
)}
{/* Glossary */}
<Card>
<CardHeader className="pb-2">