# Katalog-Service

**Version:** 1.4.10

Zentraler Katalog-Service für Leistungskomplexe (SGB V/XI), §302 HKP-Positionsnummern
und GKV-Kostenträger-Stammdaten. Läuft als SaaS unter `https://catalog.c3po42.de` mit
Admin-Oberfläche, Multi-Tenant-API und Abwärtskompatibilität zum alten Static-JSON-Server.

**Für Endnutzer:** [BENUTZERHANDBUCH.md](BENUTZERHANDBUCH.md) · **Datenquellen:** [DATENQUELLEN.md](DATENQUELLEN.md) · **Produktseite:** [/produkt.html](backend/static/produkt.html) · **Live:** <https://catalog.c3po42.de/produkt.html>

## Was ist drin?

- **SGB XI Leistungskataloge** pro Bundesland (LK 1–27, Preise, Punkte, Zeitwerte)
- **SGB V HKP-Katalog** (bundesweit)
- **§302 HKP-Positionsnummern** — bundeseinheitliches Positionsnummernverzeichnis (1293 Codes),
  direkt vom GKV-Spitzenverband per PDF-Parser importiert, mit Datumsstempel
- **GKV-Kostenträger-Stammdaten** (~1900 Kostenträger aus den offiziellen KOTR-Dateien der
  gkv-datenaustausch.de für SGB V und SGB XI, inkl. IK, Adresse, DFU-Anbindung, VKG-Verknüpfungen)
- **Datenquellen-Protokoll** mit URL, Dateiname, Hash, Verfahren, Importstatus und Abrufzeit
- **Regionale Quellen-Matrix** fuer SGB-XI-Leistungskomplexe und Rahmenvertraege
- **SGB-XI Staging + Diff** fuer pruefbare Katalogaenderungen vor dem Publizieren
- **Multi-Tenant mit API-Key** — jeder Kunde bekommt einen eigenen Key, feature-gatet
  (SGB XI / SGB V / Kostenträger / CSV / API / Webhook)
- **Admin-Frontend** (Dark Cyan Theme) für Pflege der Kataloge und Kundenverwaltung

## Architektur

```
Browser/Admin ─────┐
                   ├── FastAPI :8400 ── SQLite (catalog.db)
Kunden-Apps ───────┤        │
(z.B. PflegeFlow)  │        ├── LizenzServer (JWT validation)
                   │        └── GKV-Importer (monatlich, EDIFACT)
                   │
Static Fallback ───┘
/catalogs/v1/...   (abwärtskompatibel, kostenlos)
```

- **Backend:** FastAPI + Async SQLAlchemy 2.0 + bcrypt + JWT
- **DB:** SQLite für Entwicklung, Postgres-ready für Skalierung
- **Auth:** JWT für Admin, API-Key (Prefix + bcrypt-Hash) für Tenants

## Befehle

```bash
# Lokal starten (Port 8400, öffnet Browser im Dev)
cd backend && python -m app.main

# Deploy auf VPS (systemd, Nginx, SSL)
python deploy_vps.py

# GKV/HKP-Quellen lokal laden und live hochladen
set CATALOG_ADMIN_PASSWORD=admin
python sync_gkv_sources.py --base-url https://catalog.c3po42.de

# Nur pruefen, was lokal erreichbar ist
python sync_gkv_sources.py --dry-run --skip-hkp
```

## Lizenzmodell

| Tarif | Code | Features | Preis (Vorschlag) |
|---|---|---|---|
| **Basic** | `catalog-basic` | SGB XI + V Kataloge | 19 €/Monat |
| **Premium** | `catalog-premium` | + Kostenträger + CSV + API | 49 €/Monat |
| **Enterprise** | `catalog-enterprise` | + Webhook + Historie + White-Label | 149 €/Monat |

Trial 30 Tage pro Tenant. Features als Komma-Liste auf der Subscription gespeichert
(`sgb_xi,sgb_v,kostentraeger,api,csv,webhook,history`).

## API

### Public (abwärtskompatibel, ohne Auth)

Für bestehende PflegeFlow- und andere Integrationen, die gegen den alten Static-JSON-Server
gebaut haben. Bleibt permanent erreichbar.

```
GET /catalogs/v1/index.json          Manifest mit SHA256
GET /catalogs/v1/xi/{BL}.json        SGB XI Katalog eines Bundeslands
GET /catalogs/v1/v/BUND.json         SGB V HKP-Katalog
```

### Tenant (API-Key, feature-gated)

```
GET /api/v1/tenant/me
GET /api/v1/tenant/kataloge?sgb=XI&bundesland=TH
GET /api/v1/tenant/leistungen?sgb=V&as_csv=true            # Feature: csv
GET /api/v1/tenant/kostentraeger?search=AOK&verfahren=SGB_V  # Feature: kostentraeger
GET /api/v1/tenant/kostentraeger/{ik}?verfahren=SGB_V         # inkl. VKG-Verknüpfungen
```

Key-Übergabe per `X-API-Key: <prefix>.<secret>` **oder** `Authorization: ApiKey <prefix>.<secret>`.

### Admin (JWT, Rolle ADMIN/REDAKTEUR/VIEWER)

```
POST /api/v1/auth/login                     → access_token
GET  /api/v1/admin/stats
GET  /api/v1/admin/kataloge                 → CRUD
GET  /api/v1/admin/tenants                  → CRUD + Key-Rotation
GET  /api/v1/admin/public-health            → Public-Manifest- und Quellenprüfung
POST /api/v1/admin/gkv/import-remote        → Import aller 12 Kostenträgerdateien
POST /api/v1/admin/gkv/import-upload        → Upload einer .ke0-Datei inkl. optionaler Quellen-URL
GET  /api/v1/admin/datenquellen             → Provenienz der importierten Quellen
GET  /api/v1/admin/regionale-quellen        → kuratierte Quellen-Matrix fuer SGB XI
POST /api/v1/admin/regionale-quellen/seed   → Startquellen idempotent anlegen/aktualisieren
GET  /api/v1/admin/sgb-xi-staging           → Entwurfslaeufe fuer SGB-XI-Kataloge
GET  /api/v1/admin/sgb-xi-staging/{id}/diff → Diff gegen publizierten Bundesland-Katalog
POST /api/v1/admin/sgb-xi-staging/{id}/publish → Entwurf als Katalog uebernehmen
GET  /api/v1/admin/audit                    → Zugriffsprotokoll
```

## GKV-Kostenträger-Import

Die EDIFACT-Dateien im Format `KOTR:02:001:KV` werden von zwei Landingpages geladen:

- **SGB V** (§302, sonstige Leistungserbringer): `gkv-datenaustausch.de/leistungserbringer/sonstige_leistungserbringer/kostentraegerdateien_sle/`
- **SGB XI** (§105, Pflege): `gkv-datenaustausch.de/leistungserbringer/pflege/kostentraegerdateien_pflege/`

Jeweils 6 Dateien (AOK, BKK, IKK, Ersatzkassen, Knappschaft, Landwirtschaft).
Parser in `app/services/gkv_parser.py`, Importer in `app/services/gkv_import.py`.
Dieselbe IK kann in SGB V und SGB XI unterschiedliche Annahmestellen haben → wir halten
`(ik, quelle_verfahren)` eindeutig.

## Abwärtskompatibilität zu Leistungskataloge/

Beim ersten Start liest die App `Leistungskataloge/catalogs/v1/**/*.json` ein und überführt
die 4 bestehenden Kataloge (NRW, BY, TH, BUND-V, zusammen 91 Leistungen) in die DB. Danach
können die alten JSON-Dateien gelöscht werden — die DB-Version wird byte-identisch
ausgeliefert, dank dem SHA256 stabil.

## Datenquellen

- Details und Importregeln stehen in [DATENQUELLEN.md](DATENQUELLEN.md).
- SGB XI Bundesland-Kataloge: aus den veröffentlichten Rahmenverträgen nach §75 SGB XI
  (PDF von vdek, AOK-Landesverbänden — manuelle Pflege im Admin-UI)
- SGB V HKP-Katalog: G-BA Häusliche-Krankenpflege-Richtlinie, Anlage
- **GKV-Kostenträger: direkter EDIFACT-Import von gkv-datenaustausch.de (öffentlich, kein Login)**

## Dev-Login

- User: `admin` / Passwort: `admin` (in `app/config.py` überschreibbar)
- Demo-Tenant wird beim ersten Start angelegt, der API-Key erscheint einmalig im Log

## Test des Parsers

```bash
python -c "
from pathlib import Path
from app.services.gkv_parser import parse_kostentraegerdatei
for f in Path('_gkv_input/sle').glob('*.ke0'):
    raw = f.read_bytes().decode('iso-8859-1')
    kts = parse_kostentraegerdatei(raw, f.name)
    print(f'{f.name}: {len(kts)}')
"
```

## Produktion

https://catalog.c3po42.de (SSL via Let's Encrypt, Nginx, systemd)
