# OP-Planung — OP-Terminplanung für IKK Kliniken

> Zentrale OP-Terminplanung mit Warteliste, Kalender, Tagesplan und Kollisionsprüfung für alle IKK-Standorte.

## Was ist das?

OP-Planung ist ein webbasiertes System zur Planung und Koordination von Operationen in Kliniken. Es deckt den kompletten Workflow ab: OP-Anmeldung durch Chirurgen, Warteliste, Terminplanung im Kalender, Tagesplan-Übersicht und Team-Zuordnung (Chirurg, Anästhesist, OP-Pflege). Kollisionsprüfung verhindert Doppelbelegungen. Die Standort- und Saalstruktur ist identisch zu OP-Saalzeiten und ermöglicht eine nahtlose Integration.

Features:
- **OP-Anmeldung** — Chirurgen melden OPs mit Eingriff, OPS-Code, Diagnose, ICD-Code, Dringlichkeit und Narkoseart an
- **Warteliste** — Alle angemeldeten, aber noch nicht geplanten OPs, sortiert nach Dringlichkeit
- **Kalender/Termine** — Drag & Drop-Terminplanung mit Saal, Zeitraum und Team-Zuordnung
- **Tagesplan** — Strukturierte Übersicht aller Säle mit ihren OP-Terminen pro Tag
- **Kollisionsprüfung** — Automatische Erkennung von Doppelbelegungen im selben Saal
- **Equipment-Verwaltung** — Spezialgeräte (C-Bogen, Arthroskopie-Turm etc.) pro Standort
- **Patientenverwaltung** — Fallnummer, Station, Stammdaten
- **5 Rollen** — Admin, Koordinator, Chirurg, Anästhesie, Viewer
- **Live-Updates** — Server-Sent Events für Echtzeit-Benachrichtigungen
- **Integration** — Gleiche Standorte und Säle wie OP-Saalzeiten

## Architektur

```
┌───────────────────────────────────────────────────────┐
│          OP-Planung (FastAPI)                          │
│              localhost:8950                             │
├──────────┬────────────┬───────────┬──────────────────┤
│  Auth    │  OP-Mgmt   │   SSE     │   Static          │
│ /api/    │  /api/     │  /api/    │   /static/        │
│ auth/*   │  termine/* │  events   │   index.html      │
├──────────┴────────────┴───────────┴──────────────────┤
│                                                        │
│  ┌────────────────────────────────────────────────┐   │
│  │           SQLite (aiosqlite)                   │   │
│  │                                                │   │
│  │  standort ──< saal ──< op_termin              │   │
│  │  patient ──< op_anmeldung ──< op_termin       │   │
│  │  equipment ──< op_equipment                   │   │
│  │  benutzer (JWT + bcrypt)                      │   │
│  └────────────────────────────────────────────────┘   │
└───────────────────────────────────────────────────────┘
```

## Projektstruktur

```
OP-Planung/
├── main.py                  # FastAPI-Server (single-file Backend)
├── requirements.txt         # Python-Abhängigkeiten
├── op_planung.db            # SQLite-Datenbank (wird automatisch erstellt)
├── static/
│   ├── index.html           # Dashboard (Dark Cyan Theme, SSE)
│   └── produkt.html         # Produktseite
├── README.md                # Technische Dokumentation
├── BENUTZERHANDBUCH.md      # Benutzerhandbuch
├── CLAUDE.md                # Claude Code Projektkontext
├── install.ps1              # Windows-Einzeiler-Installer
├── deploy_vps.py            # Deploy auf VPS
└── deploy_downloads.py      # Download-Seite deployen
```

## Schnellstart

```bash
pip install -r requirements.txt
python main.py
```

Der Browser öffnet automatisch `http://localhost:8950`.

**Demo-Zugangsdaten:**

| Benutzer | Passwort | Rolle |
|----------|----------|-------|
| admin | admin | ADMIN |
| p.czaikowski | koord | KOORDINATOR |
| dr.mueller | chir | CHIRURG |
| dr.schmidt | chir | CHIRURG |
| dr.weber | anaes | ANAESTHESIE |
| dr.fischer | anaes | ANAESTHESIE |

## Datenmodell

```sql
standort (id, name, adresse, aktiv, erstellt_am)
    └──< saal (id, standort_id, name, aktiv, erstellt_am)
              └──< op_termin (id, anmeldung_id, saal_id, datum, uhrzeit_von, uhrzeit_bis,
                              chirurg_id, anaesthesist_id, op_pflege, reihenfolge, bemerkung,
                              erstellt_von, erstellt_am)

patient (id, fallnummer, name, vorname, geburtsdatum, geschlecht, station, bemerkung, erstellt_am)
    └──< op_anmeldung (id, patient_id, eingriff, ops_code, diagnose, icd_code, seite,
                        geschaetzte_dauer, dringlichkeit, status, anmerkung, narkoseart,
                        aufklaerung_erfolgt, anmelder_id, standort_id, erstellt_am, aktualisiert_am)
              └──< op_termin (s.o.)
              └──< op_equipment (id, anmeldung_id, equipment_id)

equipment (id, name, beschreibung, standort_id, aktiv)

benutzer (id, username, password_hash, name, rolle, fachbereich, standort_id, aktiv, erstellt_am)
```

- **standort** — Klinikstandort (z.B. Ilmenau, Arnstadt), identisch zu OP-Saalzeiten
- **saal** — OP-Saal an einem Standort, eindeutig pro Standort
- **patient** — Patientenstammdaten mit Fallnummer
- **op_anmeldung** — OP-Anmeldung mit Eingriff, Diagnose, OPS/ICD-Codes, Dringlichkeit und Status
- **op_termin** — Geplanter Termin mit Saal, Zeitraum und zugewiesenem Team
- **equipment** — Spezialgeräte (C-Bogen, Arthroskopie-Turm etc.)
- **op_equipment** — Zuordnung Equipment ↔ OP-Anmeldung
- **benutzer** — Login mit bcrypt-Hash und JWT-Token (8h Gültigkeit)

## OP-Anmeldung — Status-Workflow

```
ANGEMELDET  →  GEPLANT  →  DURCHGEFÜHRT
     │              │
     └──────────────┴──→  ABGESETZT
```

- **ANGEMELDET** — Chirurg hat OP angemeldet, erscheint in der Warteliste
- **GEPLANT** — Koordinator hat Termin vergeben (Saal + Zeit)
- **DURCHGEFÜHRT** — OP wurde durchgeführt
- **ABGESETZT** — OP wurde abgesagt/storniert

## API-Endpunkte

### Authentifizierung

| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| POST | `/api/auth/login` | Login (username + password → JWT-Token) |
| GET | `/api/auth/me` | Aktueller Benutzer (Bearer-Token) |

### Patienten

| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| GET | `/api/patienten` | Alle Patienten (optional `?q=` Suche) |
| GET | `/api/patienten/{id}` | Einzelner Patient |
| POST | `/api/patienten` | Patient anlegen |
| PUT | `/api/patienten/{id}` | Patient bearbeiten |

### OP-Anmeldungen

| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| GET | `/api/anmeldungen` | Alle Anmeldungen (Filter: `status`, `dringlichkeit`, `standort_id`) |
| GET | `/api/anmeldungen/{id}` | Einzelne Anmeldung mit Patient/Anmelder |
| POST | `/api/anmeldungen` | OP anmelden (Chirurg/Koordinator/Admin) |
| PUT | `/api/anmeldungen/{id}` | Anmeldung bearbeiten |
| DELETE | `/api/anmeldungen/{id}` | Anmeldung absetzen (Soft-Delete, Status → ABGESETZT) |

### Warteliste

| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| GET | `/api/warteliste` | Angemeldete aber ungeplante OPs (optional `?standort_id=`) |

### OP-Termine (Kalender)

| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| GET | `/api/termine` | Termine mit Filtern (`datum`, `datum_von`, `datum_bis`, `saal_id`, `standort_id`) |
| POST | `/api/termine` | Termin planen (mit Kollisionsprüfung, Koordinator/Admin) |
| PUT | `/api/termine/{id}` | Termin verschieben/ändern |
| DELETE | `/api/termine/{id}` | Termin löschen (Anmeldung → ANGEMELDET falls kein weiterer Termin) |

### Tagesplan

| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| GET | `/api/tagesplan/{datum}` | Strukturierter Tagesplan: Säle mit Terminen (optional `?standort_id=`) |

### Statistik

| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| GET | `/api/statistik/uebersicht` | Dashboard-Übersicht: Anmeldungen nach Status, Termine heute/morgen, Warteliste, Notfälle |

### Stammdaten (teilweise nur Admin)

| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| GET | `/api/standorte` | Alle aktiven Standorte |
| POST | `/api/standorte` | Standort anlegen (Admin) |
| GET | `/api/saele` | Alle Säle (optional `?standort_id=`) |
| POST | `/api/saele` | Saal anlegen (Admin) |
| GET | `/api/benutzer` | Alle Benutzer (optional `?rolle=`) |
| POST | `/api/benutzer` | Benutzer anlegen (Admin) |
| GET | `/api/equipment` | Geräte-Liste (optional `?standort_id=`) |
| POST | `/api/equipment` | Gerät anlegen (Admin) |

### SSE & Status

| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| GET | `/api/events` | Server-Sent Events (Live-Updates bei Anmeldungen, Terminen etc.) |
| GET | `/api/health` | Health-Check (Version, Status) |

### Dokumentation

| Methode | Pfad | Beschreibung |
|---------|------|-------------|
| GET | `/docs/readme` | README als text/markdown |
| GET | `/docs/handbuch` | Benutzerhandbuch als text/markdown |
| GET | `/produkt` | Produktseite (HTML) |

## Rollen

| Rolle | Rechte |
|-------|--------|
| **ADMIN** | Alles: Standorte, Säle, Benutzer, Equipment verwalten + alle OP-Funktionen |
| **KOORDINATOR** | OP-Termine planen/ändern/löschen, Anmeldungen absetzen, an Standort gebunden |
| **CHIRURG** | OPs anmelden, Anmeldungen bearbeiten, Patienten verwalten |
| **ANAESTHESIE** | Leserechte, zugewiesene Termine einsehen |
| **VIEWER** | Nur lesen: Dashboard, Tagesplan, Kalender ansehen |

## Kollisionsprüfung

Beim Anlegen eines Termins prüft das Backend automatisch, ob der gewünschte Saal im gewünschten Zeitraum bereits belegt ist. Bei Überschneidung wird der Termin mit HTTP 409 abgelehnt und die kollidierenden OP-Informationen zurückgegeben.

## Integration mit OP-Saalzeiten

OP-Planung nutzt dieselben Standorte und Säle wie OP-Saalzeiten (Port 8900). Die `SAALZEITEN_URL`-Umgebungsvariable verweist auf die Saalzeiten-Instanz (Standard: `https://op-saalzeiten.c3po42.de`).

## Demo-Daten

Beim ersten Start werden automatisch Demo-Daten angelegt:

- **2 Standorte:** Ilmenau (4 Säle), Arnstadt (4 Säle)
- **6 Benutzer:** admin, p.czaikowski, dr.mueller, dr.schmidt, dr.weber, dr.fischer
- **10 Patienten** mit Fallnummern
- **10 OP-Anmeldungen** (verschiedene Eingriffe, Dringlichkeiten)
- **8 geplante Termine** für morgen und übermorgen
- **7 Geräte** (C-Bogen, Arthroskopie-Turm, Laparoskopie-Turm etc.)

## Deployment

### Produktion
- URL: https://op-planung.c3po42.de
- Port: 8950
- Deploy: `python deploy_vps.py`
- Downloads: `python deploy_downloads.py`

### Umgebungsvariablen

| Variable | Standard | Beschreibung |
|----------|----------|-------------|
| `DB_PATH` | `./op_planung.db` | Pfad zur SQLite-Datenbank |
| `JWT_SECRET` | (dev-secret) | JWT-Signatur-Schlüssel |
| `PORT` | `8950` | Server-Port |
| `SAALZEITEN_URL` | `https://op-saalzeiten.c3po42.de` | URL der OP-Saalzeiten-Instanz |

## Tech-Stack

- **Backend:** Python 3.10+, FastAPI, uvicorn
- **Datenbank:** SQLite mit aiosqlite (WAL-Modus, Foreign Keys)
- **Auth:** JWT (python-jose) + bcrypt (passlib)
- **Live-Updates:** Server-Sent Events (SSE)
- **Frontend:** Single-file HTML (static/index.html), Dark Cyan Theme
