# PflegeFlow — Ambulante Pflege Management

**Version:** 1.3.0

Eigenständiges Management-System für ambulante Pflegedienste. Von der Verordnungs-Genehmigung über Auftrags-/Angebotsmanagement und Tourenplanung bis zur Splitrechnung (SGB XI + SGB V), Budget-Tracking und DTA-Export mit Genehmigungskennzeichen.

**Produktion:** https://pflege.c3po42.de
**Status:** v1.3.0 — **DTA 2027-ready + erste TI-Integration + Katalog-Service-Anbindung**. DTA-Versions-Tabelle kennt jetzt **v6.5.0 ab 2027-02-01** (TA1 §105 + TA5 + §302 HKP 1.1.0 vorbereitet). Kostenträger-Stammdaten + Leistungskataloge werden aus dem neuen **Katalog-Service** (`catalog.c3po42.de`) synchronisiert inkl. täglichem Update-Watch und neuer Admin-Seite „Katalog-Service". **TI-Konnektor-Anbindung v1** für KoCoBox MED+: Mock-/Real-Client, SMC-B-PIN Fernet-verschlüsselt, VSDM-Lesung am Konnektor legt automatisch `EgkErfassung(quelle=KARTENTERMINAL)` an. **eGK-Wizard v2** im Klienten-Modal (3 Steps: Status → Lesen → Ergebnis), KVNR-Vorschlag aus Stammdaten, TI-Ampel. **HKP 1.1.0 XML-Skeleton + TA5-Client-Stub** per Feature-Flag; volle Impl in v1.4 mit gematik-Spec. Flutter-App v1.3 bekommt **PoPP-Screen** (Stub). — Darunter die Zeitauswertung aus v1.3-intern: monatliches Stundenkonto pro Mitarbeiter mit Soll/Ist/Saldo, Überstunden-Übertrag in den Folgemonat, Zuschlagsberechnung §3b EStG (Sonntag 50%, Feiertag 125%, Nacht 20-06 Uhr 25%), bundeslandspezifischer Feiertagskalender (Ost-Algorithmus, Fronleichnam, Reformationstag, Buss- und Bettag…) und Lohn-Export in vier Formaten: **DATEV LODAS CSV**, **Generic CSV** (Lexware/Sage/Addison/SBS-kompatibel), **Lexware lohn+gehalt**, **Addison/Akademische**. Tägliche Rollierung im Hintergrund. Mandantenspezifisches Lohnarten-Mapping (8 Kategorien × 4 Formate = 32 Codes vordefiniert, anpassbar). Darunter v1.2.3 — Ärztekartei: eigene Stammdatentabelle für Haus- und Verordnungsärzte (LANR, BSNR, Praxisadresse, Kontakt), neue Seite **Pflege & Aufträge → Ärzte** mit Suche und CRUD. Verordnungs- und Klienten-Dialoge bekommen einen Ärzte-Picker (füllt LANR/BSNR automatisch). Altdaten-Migration zieht einmalig bestehende `arzt_name`/`physician_name`-Freitexte in die Kartei. Soft-Delete wenn der Arzt noch verknüpft ist. Darunter v1.2.2 — Häufigkeiten: Verordnungs-Erfassung bekommt pro Leistung einen Preset-Dropdown (1× täglich, 3× wöchentlich Mo/Mi/Fr, bei Bedarf …) plus optionales GKZ-Feld für Nacherfassung; Auftrags-Erfassung bekommt pro Position den vollen strukturierten Rhythmus-Editor mit Presets. v1.2.1 — Hotfix: manuelle Erfassung von Verordnungen und Aufträgen im Frontend; v1.2.0 — Groß-Release: neues Domänenmodell **Auftrag** als Dach über SGB V / SGB XI / Privat-Leistungen, strukturierter **Rhythmus** (statt Freitext) pro Position, automatischer **Besuchsplan** (3-Monats-Horizont mit Rollierung), **Einzel- und Sammelangebot** mit PDF + Mailversand, **Verordnungs-Workflow** (Einreichen/Genehmigung/Ablehnung/Widerspruch/Genehmigungsfiktion §13 Abs. 3a SGB V), **GKZ im DTA-SLLA + PDF-Rechnung**, Billing-Split nach Position-Quelle (nicht mehr rateheuristisch). Frontend komplett reorganisiert: Sidebar mit 4 Arbeitsbereichen + Dashboard-Cockpit + Breadcrumb + neue Screens für Verordnungen, Aufträge, Angebote und Besuche.

## Neu in v1.3 (DTA 2027 / TI / Katalog-Service)

- **DTA v6.5.0 ab 2027-02-01**: UNH-Segmente automatisch auf `03:005:SL` (SLLA/SLGA) und `06:006:PF` (PLAA/PLGA), pro Abrechnungsmonat gewählt. Nachrechnungen für 2026 laufen weiter mit v6.4.
- **TA5 (TI-Einreichung §105 SGB XI)** als Skeleton — `services/ta5_client.py` mit Feature-Flag `ta5_enabled`, volle Nachrichten-Erzeugung in v1.4.
- **§302 Anlage HKP 1.1.0** als XML-Skeleton — `services/hkp_xml_builder.py` liefert Feature-Flag-gated Skeleton-XML; `choose_sgb_v_format(monat)` wählt automatisch EDIFACT vs XML ab 2027-02, solange `hkp_v11_enabled=True`.
- **Katalog-Service-Anbindung** (`catalog.c3po42.de`, Nachfolger vom alten Static-Server):
  - Leistungskataloge per `POST /api/v1/katalog/import` (public) wie bisher, zusätzlich **Kostenträger-Sync** per `POST /api/v1/katalog/kostentraeger/sync` (Tenant-API mit X-API-Key aus `catalog_api_key`).
  - Upsert nach IK; kundenspezifische Felder (Einreichfrist, Abrechnungsweg, manuelle E-Mail) bleiben unangetastet.
  - Neue Kostenträger-Felder `kassenart`, `dta_annahmestelle_ik`, `kim_adresse`, `vknr`, `stammdaten_quelle`, `stammdaten_sync_at`.
  - Täglicher Lifespan-Watch `_katalog_watch_loop` mit SHA256-Vergleich gegen `<upload_dir>/katalog_seen.json`; Badge + Liste in der Admin-UI.
  - Neue Admin-Seite **„Katalog-Service"** unter Abrechnung mit Status-Box, Import-Buttons, SGB V/XI-Sync-Buttons, Updates-Liste.
- **Abrechnungsstellen (Datenannahmestellen) im DTA-Export**:
  - Neue Tabelle `abrechnungsstellen` (IK, Name, Anschrift, `dfu_protokoll`, `dfu_adresse`).
  - `services/katalog_import.sync_abrechnungsstellen(verfahren)` holt pro gesyncter Kasse die VKG-Annahmestellen aus dem Katalog-Service (Datenart `21` für §302 SGB V, `26` für §105 SGB XI) und setzt `Kostentraeger.dta_annahmestelle_ik`.
  - `services/dta_export._empfaenger_ik(kt)` priorisiert die Annahmestelle in UNB/UNH, Fallback auf Kassen-IK für Selbstabrechner.
  - Admin-UI: neue Karte „📤 Abrechnungsstellen synchronisieren" mit SGB-V/SGB-XI-Buttons + Tabelle aller bekannten Annahmestellen.
- **TI-Konnektor-Paket** `services/ti/` (erste Version, KoCoBox MED+):
  - `ConnectorClient` mit Mock-Modus (Dev ohne Konnektor), `health()` + `request_vsd()`.
  - `vsdm.read_vsd()` gibt ein stabiles `VsdData`-Dataclass zurück.
  - `smcb.py` verschlüsselt SMC-B-PIN mit Fernet aus `CARE_TI_SECRET` (PBKDF2-SHA256, 100k Runden).
  - `TiConfig` + `VsdLesung` als neue Tabellen; `_ti_health_loop` cached Status alle 15 Minuten.
  - API-Routen `/ti/status`, `/ti/config`, `/ti/test-verbindung`, `/ti/vsd/read` (automatische EgkErfassung mit `quelle=KARTENTERMINAL`, wenn `client_id` mitgegeben wird).
  - **eGK-Wizard v2** im Klienten-Modal: 3-Step-Dialog (Status → Lesen → Ergebnis) + TI-Ampel + KVNR-Vorschlag aus `insurance_number`.
  - **TI-Einstellungs-Karte** auf der Einrichtungs-Seite: URL/Vendor/IK/SMC-B-PIN (Fernet-encrypted), Mock-Modus-Toggle, „Verbindung testen".
- **PoPP (TI 2.0) Stub**: Backend-Endpoint `/ti/popp/verify` liefert 501 bei `popp_enabled=False`; Flutter-App v1.3 hat einen klar gekennzeichneten PoPP-Screen mit „noch nicht verfügbar"-Hinweis (echte Signaturprüfung folgt in v1.4 mit gematik-Spec Mitte 2026).
- **Keine Drops**: v1.3 ist **additive Migration** — alle neuen Spalten werden über `_ensure_columns()` idempotent angehängt. Kein Backup-Zwang wie bei v1.2.

**Regulatorische Leitplanken:**

| Datum | Regel | Was PflegeFlow tut |
|---|---|---|
| Mitte 2026 | TI 2.0 PoPP | Flutter-Stub vorbereitet, v1.4 echter Scan |
| 2026-06-30 | HBA/SMC-B RSA-Ende | PIN-Verwaltung bereit, Karten-Ablauf im Dashboard |
| **2027-02-01** | TA1 §105 v6.5 + TA5 1.0.0 | UNH-Strings da, TA5-Client-Skeleton |
| **2027-02-01** | §302 HKP 1.1.0 | XML-Skeleton hinter Feature-Flag |
| 2027-04-30 | §302 Anlage 3 v21 Ende | Kostenträger-Sync aus Katalog-Service |

## Neu in v1.2

- **Auftrag + Auftragsposition**: zentrales Dach pro Klient, bündelt alle Leistungen unabhängig von der Quelle (SGB V / SGB XI §36 / SGB XI §45b / Privat)
- **Rhythmus-Editor**: strukturiert statt Freitext — Typ (täglich/wöchentlich/monatlich/einmalig/bei Bedarf), Wochentage, Uhrzeiten
- **Besuchsplan**: aus dem Rhythmus wird automatisch ein 3-Monats-Besuchsplan ausgerollt; Lifespan-Cron rolliert täglich
- **Einzel-Angebot** (`AN-JJJJ-####`) mit Snapshot-Positionen, PDF, Mailversand, Akzeptanz → aktiviert Auftrag
- **Sammelangebot**: Preisanpassung zum Stichtag mit Filter (Quelle/Kostenträger), Zwei-Klick-Freigabe, Retry bei Mailfehlern
- **Verordnungs-Workflow**: Status-Transitions + Fristen-Ampel (Einreichung/Kassenprüfung/Widerspruch/Ablauf); `POST /auftraege/aus-verordnung/{id}`
- **Genehmigungsfiktion** §13 Abs. 3a SGB V: Lifespan-Task prüft täglich, ob die Kassen-Prüfungsfrist überschritten ist; `FIKTION-{id}-{YYYYMMDD}` als Platzhalter-GKZ
- **GKZ in DTA** (SLLA-INV-Segment) **und PDF-Rechnung** (Fußzeile bei SGB-V-Rechnungen)
- **Billing-Engine auf Position-Quelle**: `LeistungsNachweis` → `TourStop.besuch_id` → `Auftragsposition.quelle` — eigene `RE-PRIV-`-Rechnung für reine Privat-Leistungen (vorher fehlte die)
- **Tour-Optimizer auf Besuch-Basis**: `VROOM`-Jobs verknüpft mit `besuch_id`, Commit legt Tours + TourStops an und setzt Besuch auf `ZU_TOUR_ZUGEWIESEN`
- **Frontend neu**: 4 kollabierbare Sidebar-Gruppen (Personal · Einsatzplanung · Pflege & Aufträge · Abrechnung) mit rollenbasiertem Ausblenden und Badge-Countern, Dashboard-Cockpit mit 4 klickbaren Bereichs-Kacheln, Breadcrumb + Farbakzent pro Bereich, neue Screens: Verordnungen (Fristen-Ampel, GKZ-Box, Status-Buttons), Aufträge (Tab-Ansicht nach Quelle mit Rhythmus-Editor), Angebote (Einzel + Sammel mit Batch-Detail), Besuche (Tagesplan + Leistungserfassung)

### Harte Migration v1.1 → v1.2

- Legacy-Tabellen `pflegevertraege` + `vertragsleistungen` werden gedroppt (Alembic-Revision `0001_v1_2_schema_cleanup`).
- `verordnungsleistungen.haeufigkeit` (Freitext) wird gedroppt; der strukturierte Rhythmus lebt jetzt auf `Auftragsposition.rhythmus_json`.
- Daten-Migration (`app/services/migrate_v1_2.py`) läuft idempotent beim ersten Start: konvertiert aktive Pflegeverträge zu Aufträgen, parst Freitext-Häufigkeiten best-effort in strukturierte Rhythmen, rollt 90 Tage Besuche aus, verknüpft bestehende TourStops mit Besuchen.
- **Kein Downgrade**. Backup-Empfehlung vor dem Upgrade siehe `backend/alembic/migration_notes.md`.

## Architektur

```
Browser / Flutter App
   ↓ HTTPS (JWT-Auth)
Nginx → Docker → FastAPI :8100
   ↓ Async SQLAlchemy
PostgreSQL + Redis
```

- **Backend**: FastAPI + Async SQLAlchemy 2.0 + JWT
- **Datenbank**: SQLite (Entwicklung), PostgreSQL (Produktion)
- **Cache**: Redis (Session-/Token-Cache)
- **Migrationen**: Alembic
- **Frontend**: Single-File SPA (`static/index.html`), Dark Cyan Theme, Vanilla JS
- **App**: Flutter (Android), Package `de.c3po42.pflege`
- **Deploy**: Docker Compose auf Hostinger VPS

## Verzeichnisstruktur

```
CareOffice/
  backend/
    app/
      main.py              FastAPI App, Lifespan, Router
      config.py            Pydantic Settings
      database.py          Async SQLAlchemy Engine
      auth/jwt.py          JWT + bcrypt + Role-Guards
      models/
        user.py            Login, Rollen
        employee.py        Pflegekräfte
        client.py          Klienten/Patienten
        tour.py            Touren + Stopps
        insurance.py       Kostenträger
        contract.py        Pflegeverträge
        billing.py         Rechnungen, Leistungsnachweise
      api/
        auth.py            Login, Token-Refresh
        employees.py       CRUD Pflegekräfte
        clients.py         CRUD Klienten
        tours.py           Touren, Check-in/out
        leistungen.py      Leistungskomplex-Katalog
        billing.py         Rechnungen, DTA-Export
        insurance.py       Kostenträger
        verordnungen.py    SGB V Verordnungen (Muster 12)
        budgets.py         Budget-Tracking (§36, §45b, §39)
        dashboard.py       KPI-Dashboard
      services/
        billing_engine.py  Splitrechnung (bis 4 Rechnungen/Klient/Monat)
        dta_export.py      EDIFACT §302 SGB V + §105 SGB XI
        budget.py          Monats-/Jahresbudgets mit Höchstbeträgen
        verordnung.py      SGB V Muster 12, Status-Tracking, Fristen
      schemas.py           Pydantic Request/Response Schemas
    alembic/               DB-Migrationen
    requirements.txt
    Dockerfile
  static/
    index.html             Frontend SPA
    produkt.html           Produktseite
    favicon.svg
  app/                     Flutter App (Android)
  docker-compose.yml       Entwicklung
  docker-compose.prod.yml  Produktion
  deploy_vps.py            Paramiko-Deploy auf VPS
```

## Datenmodelle

| Modell | Beschreibung |
|---|---|
| **User** | Login-Daten, Rolle (ADMIN, PDL, PFLEGEKRAFT, VERWALTUNG) |
| **Employee** | Pflegekraft mit Qualifikation, Arbeitszeit, Führerschein |
| **Client** | Patient/Klient mit Pflegegrad, Versicherung, Adresse |
| **Kostenträger** | Krankenkasse/Sozialamt mit IK-Nummer + `einreichfrist_werktage` (§132a) |
| **Verordnung / VerordnungsLeistung** | SGB V Muster 12 mit 8-Status-Workflow, GKZ, Fristen-Properties |
| **Auftrag / Auftragsposition** *(v1.2)* | Zentrales Dach pro Klient; bündelt SGB V / SGB XI / Privat-Positionen, je mit strukturiertem `rhythmus_json` |
| **Angebot / Angebotsposition / AngebotBatch** *(v1.2)* | Kostenvoranschlag vor Leistungsbeginn; Snapshot-Preise, PDF, Mailversand; Batch für Sammelangebot |
| **Besuch** *(v1.2)* | Konkreter Soll-Termin (Datum + Uhrzeit) aus dem Auftrags-Rhythmus; 4 Status (GEPLANT/ZU_TOUR_ZUGEWIESEN/DURCHGEFUEHRT/ABGESAGT) |
| **Tour / TourStop** | Tagestour mit Stopps (Check-in/out); TourStop hat `besuch_id`-FK zum Soll-Termin |
| **Leistungskomplex / Verguetungsvereinbarung** | SGB XI + SGB V Katalog + individuelle Preise pro Kasse |
| **MonatsBudget / JahresBudget** | Budget-Tracking mit Höchstbeträgen (§36, §45b, §39) |
| **LeistungsNachweis** | Erbrachte Leistung mit Datum und Dauer, per `tour_stop_id` mit Besuch verknüpft |
| **Rechnung / Position** | Splitrechnung mit bis zu 5 Rechnungstypen (RE-XI, RE-V, RE-45B, RE-39, RE-PRIV) |

## Rollen

| Rolle | Berechtigungen |
|---|---|
| **ADMIN** | Vollzugriff, Benutzerverwaltung, Systemkonfiguration |
| **PDL** | Tourenplanung, Mitarbeiter, Klienten, Abrechnung, Dashboard |
| **PFLEGEKRAFT** | Eigene Touren, Check-in/out, Leistungserfassung |
| **VERWALTUNG** | Abrechnung, DTA-Export, Kostenträger, Rechnungen |

## API-Endpunkte

Alle unter `/api/v1/`. Swagger-Docs: `/api/docs`.

| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /auth/login | JWT-Login |
| POST | /auth/refresh | Token erneuern |
| GET/POST | /employees | Pflegekräfte CRUD |
| GET/POST | /clients | Klienten CRUD |
| GET/POST | /tours | Touren CRUD |
| POST | /tours/{id}/checkin | Check-in an Tour-Stopp |
| POST | /tours/{id}/checkout | Check-out an Tour-Stopp |
| GET | /leistungen | Leistungskomplex-Katalog |
| GET | /billing/invoices | Rechnungsübersicht |
| POST | /billing/generate | Rechnung generieren |
| GET | /billing/dta-export | DTA-Datei exportieren (EDIFACT §302/§105) |
| GET/POST | /verordnungen | Verordnungen (Muster 12) CRUD |
| GET | /budgets | Budget-Übersicht (§36, §45b, §39) |
| GET | /insurance | Kostenträger |
| GET | /dashboard | KPI-Dashboard |
| GET | /katalog/manifest | Katalog-Server Manifest (ADMIN/PDL) |
| POST | /katalog/import | Bundesland-Katalog importieren (ADMIN) |
| GET/POST | /zeitmodelle | Zeitmodelle (Arbeitszeit-Vorlagen) CRUD |
| GET/POST | /dienstplan | Dienstplan-Eintraege CRUD |
| GET | /dienstplan/woche | Wochenansicht (Mo-So) |
| POST | /dienstplan/validate | ArbZG-Pruefung fuer Zeitraum/Mitarbeiter |
| GET/POST | /abwesenheiten | Urlaubs-/Krankmeldungen CRUD |
| POST | /abwesenheiten/{id}/genehmigen | Antrag genehmigen (ADMIN/PDL) |
| POST | /abwesenheiten/{id}/ablehnen | Antrag ablehnen (ADMIN/PDL) |
| POST | /touren-optimieren | Tourenoptimierung via VROOM + OSRM (ADMIN/PDL) |
| GET | /touren-optimieren/status | VROOM- und OSRM-Liveness |
| GET/POST | /klienten/{id}/egk | eGK-Erfassungs-Historie + manuelle Erfassung (ADMIN/PDL/VERWALTUNG) |
| POST | /klienten/{id}/egk/upload | eGK-Scan hochladen (PDF/JPG/PNG, max 20 MB) |
| GET | /klienten/{id}/egk/{eid}/download | Scan herunterladen |
| POST | /clearing/einreichen/{id} | Rechnung an DMRZ SmartConnect einreichen (ADMIN/VERWALTUNG) |
| GET | /clearing/status/{id}?refresh=true | Aktueller Auftrags-Status |
| GET | /clearing/events/{id} | Clearing-Event-Historie |
| POST | /clearing/callback | Webhook für DMRZ Status-Updates (HMAC-SHA256) |
| GET | /billing/dta-versions | Liste bekannte DTA-Versionen + Stichtage |
| GET | /billing/dta-versions/{year}/{month} | Welche DTA-Version wird für Monat X genutzt? |
| GET | /billing/invoices/{id}/pdf | Rechnung als PDF zum Versenden/Archivieren |
| GET | /app/info | Aktuelle Flutter-APK-Version, Größe, Paketname |
| GET | /app/qrcode | QR-Code (PNG) auf den APK-Download |
| POST | /billing/invoices/{id}/send-mail | Rechnung als PDF-Anhang per SMTP versenden (ADMIN/VERWALTUNG) |
| POST | /billing/sammelrechnung/{kt_id}/{year}/{month} | Sammelrechnung aller Einzelrechnungen anlegen |
| GET | /billing/sammelrechnung | Sammelrechnungen filtern |
| GET | /billing/sammelrechnung/{id}/pdf | Sammelrechnungs-PDF (Deckblatt + Liste) |
| GET | /billing/sammelrechnung/{id}/einzelrechnungen | Einzelrechnungen einer Sammelrechnung |
| DELETE | /billing/sammelrechnung/{id} | Sammelrechnung auflösen |
| GET/POST | /dienstwunsch/wuensche | Wunschdienste (Pflegekraft sieht eigene, PDL/ADMIN alle) |
| POST | /dienstwunsch/wuensche/{id}/bearbeiten | PDL setzt Wunsch auf BERUECKSICHTIGT / ABGELEHNT |
| POST | /dienstwunsch/tausch/anbieten | Dienst zum Tausch anbieten |
| POST | /dienstwunsch/tausch/{id}/annehmen | Tausch annehmen (optional mit Gegentausch-Dienst) |
| POST | /dienstwunsch/tausch/{id}/pruefen | ArbZG-Check für einen angenommenen Tausch |
| POST | /dienstwunsch/tausch/{id}/durchfuehren | PDL führt Tausch durch (Dienstplan umbesetzen) |
| GET | /health | Health-Check (kein Auth) |
| **v1.2** | | |
| POST | /verordnungen/{id}/einreichen | ENTWURF → EINGEREICHT (startet Kassen-Prüfungsfrist) |
| POST | /verordnungen/{id}/genehmigung | Kasse hat genehmigt, GKZ pflichtig |
| POST | /verordnungen/{id}/ablehnung | Kasse hat abgelehnt, Grund pflichtig |
| POST | /verordnungen/{id}/widerspruch | Widerspruch einlegen (§84 SGG, 1 Monat) |
| GET/POST | /auftraege | Aufträge CRUD |
| POST | /auftraege/aus-verordnung/{id} | Auftrag aus genehmigter Verordnung erzeugen |
| POST | /auftraege/{id}/aktivieren | Auftrag aktivieren + Besuchsplan rollen |
| POST | /auftraege/{id}/pausieren | Auftrag pausieren (zukünftige GEPLANTE Besuche löschen) |
| POST | /auftraege/{id}/beenden | Auftrag beenden |
| GET/POST/PATCH/DELETE | /auftraege/{id}/positionen | Positions-CRUD |
| GET | /besuche | Besuche-Liste (Filter: datum/von/bis/status/auftrag_id/client_id) |
| POST | /besuche/{id}/absagen | Besuch absagen mit Grund |
| POST | /besuche/{id}/durchgefuehrt | Besuch als durchgeführt markieren |
| POST | /besuche/regenerieren/{auftrag_id} | Zukünftige GEPLANTE Besuche neu ausrollen |
| POST | /angebote/fuer-auftrag/{id} | Einzel-Angebot erzeugen (Snapshot) |
| GET | /angebote/{id}/pdf | Angebots-PDF |
| POST | /angebote/{id}/versenden | Per Mail versenden |
| POST | /angebote/{id}/akzeptieren | Triggert `auftrag_aktivieren` |
| POST | /angebote/{id}/ablehnen | Ablehnen mit optionalem Grund |
| POST | /angebote/batch | Sammelangebot anlegen (Filter + Preis-Overrides) |
| GET | /angebote/batch/{id}/angebote | Angebote eines Batches |
| POST | /angebote/batch/{id}/freigeben | Zwei-Klick-Freigabe |
| POST | /angebote/batch/{id}/versenden | Versand (erneuter Aufruf = Retry) |
| POST | /touren-optimieren/commit | VROOM-Ergebnis als Tour + TourStops persistieren, Besuch → ZU_TOUR_ZUGEWIESEN |

**DTA-Versionen (automatische Auswahl nach Abrechnungsmonat):**

| Version | Gültig ab | Gültig bis | SLLA/SLGA | PLAA/PLGA |
|---|---|---|---|---|
| v6.2.0 | 2020-01-01 | 2025-08-31 | `03:002:SL` | `06:003:PF` |
| v6.3.0 | 2025-09-01 | 2026-04-30 | `03:003:SL` | `06:004:PF` |
| v6.4.0 | 2026-05-01 | offen | `03:004:SL` | `06:005:PF` |

Die Auswahl erfolgt automatisch anhand des Abrechnungsmonats — Rechnungen für Juni 2025 nutzen v6.2.0, Rechnungen für September 2025 v6.3.0.

## Abrechnungslogik (Phase 2)

Die Abrechnung erzeugt pro Klient/Monat bis zu **5 Splitrechnungen**:

| Rechnungstyp | Kostenträger | Regelung | Limit |
|---|---|---|---|
| **RE-XI-** | Pflegekasse | §36 SGB XI Sachleistung | Höchstbetrag je Pflegegrad |
| **RE-V-** | Krankenkasse | SGB V HKP | Kein Budget-Limit, GKZ im DTA + PDF |
| **RE-45B-** | Pflegekasse | §45b Entlastung | 131 EUR/Monat |
| **RE-39-** | Pflegekasse | §39 Verhinderungspflege | Jahresbudget |
| **RE-PRIV-** | Klient (Sozialamt optional) | Eigenanteil + Investitionskosten | 3,5% Zuschlag auf §36 |

**v1.2**: Die Billing-Engine ordnet Nachweise jetzt über `TourStop.besuch_id → Auftragsposition.quelle` zu — nicht mehr rateheuristisch nach `Leistungskomplex.sgb_paragraph`. Damit landen Leistungen, die aus Privat-Aufträgen stammen, in einer eigenen `RE-PRIV-`-Rechnung mit dem `preis_cent_override` der Position.

**Kombinationsleistung §38:** Automatische Berechnung des anteiligen Pflegegeldes.

**Budget-Tracking:** Monatsbudgets (§36, §45b, SGB V) und Jahresbudgets (§39 Verhinderungspflege) mit Höchstbeträgen 2025.

**Verordnungen:** SGB V Muster 12 mit Status-Tracking (beantragt, genehmigt, abgelehnt) und Fristenwarnungen.

**DTA-Export:** EDIFACT-Dateien nach §302 SGB V (SLGA/SLLA) und §105 SGB XI (PLGA/PLAA).

Beträge werden intern in **Cent** gespeichert (Integer), nicht Euro (Float).

## Befehle

```bash
# Lokal starten (SQLite, kein Docker nötig)
cd backend && python -m app.main

# Docker Entwicklung
docker compose up

# Deploy auf VPS
python deploy_vps.py
```

## Login-Daten (Entwicklung)

| Benutzer | Passwort | Rolle |
|---|---|---|
| admin | admin | ADMIN |
| m.weber | pflege | PDL |
| t.mueller | pflege | PFLEGEKRAFT |

## Konfiguration

Über Umgebungsvariablen oder `.env`-Datei:

| Variable | Standard | Beschreibung |
|---|---|---|
| `DB_USE_SQLITE` | `True` | SQLite statt PostgreSQL |
| `DB_HOST` | `localhost` | PostgreSQL Host |
| `DB_PORT` | `5432` | PostgreSQL Port |
| `DB_NAME` | `pflegeflow` | Datenbankname |
| `DB_USER` | `app` | DB-Benutzer |
| `DB_PASSWORD` | — | DB-Passwort |
| `REDIS_URL` | `redis://localhost:6379/0` | Redis-URL |
| `JWT_SECRET_KEY` | dev-key | JWT-Secret (in Produktion ändern!) |
| `APP_ENV` | `development` | `development` oder `production` |
| `APP_DEBUG` | `True` | Debug-Logging |
| `CORS_ORIGINS` | `localhost:3000,8100` | Erlaubte Origins |

## Produktion

- **URL**: https://pflege.c3po42.de
- **VPS**: Hostinger KVM2 (187.77.84.94)
- **Docker**: `docker-compose.prod.yml`
- **SSL**: Certbot + Nginx
- **Deploy**: `python deploy_vps.py` (Paramiko SSH)
