English | Deutsch
Einführung
eauXchange ist ein eigenständiger Server für den Datenaustausch mit dem GKV-Kommunikationsserver. Er versendet und empfängt die Daten automatisch und zeitgesteuert, hält die Krankenkassendaten aktuell und verwaltet die öffentlichen Schlüssel der Kommunikationspartner.
Unterstützt werden zwei Verfahren, die getrennt lizenziert werden:
- EAU (
/eau) -
elektronische Arbeitsunfähigkeitsbescheinigung.
- Vorerkrankung / LFZ (
/pre) -
Vorerkrankungsanfragen für die Entgeltfortzahlung (Entgeltersatzleistungen).
Jede Installation liefert ihre eigene Dokumentation mit: Unter /help liegt die interaktive
API-Referenz der laufenden Version, unter /changelog die Änderungen aller Versionen. Beides ist
ohne Token erreichbar.
|
Lizenzierung
Die Lizenzdatei wird von der Javiis GmbH auf Anfrage erstellt. Dafür wird die Betriebsnummer (BNR) benötigt, für die die Lizenz ausgestellt wird – Test oder Produktion. Alle Anfragen werden anschließend für diese Betriebsnummern gestellt. (Im Testbetrieb wird die Test-Betriebsnummer verwendet.)
Die Lizenz bestimmt außerdem, welche Verfahren die Installation nutzen darf (EAU, Vorerkrankung oder beides). Aufrufe eines nicht lizenzierten Verfahrens werden abgewiesen.
Betrieb des Dienstes
eauXchange wird als Docker-Container ausgeliefert und speichert alle relevanten Informationen in einer PostgreSQL-Datenbank.
config neben der docker-compose.yml:-
application.yml– die Serverkonfiguration (siehe unten) -
die Lizenzdatei der Javiis GmbH
-
Zertifikat und privater Schlüssel Ihrer Betriebsnummer (
<bnr>.p7c/<bnr>.pkey), aus denen der Keystoregkv.p12erzeugt wird
services:
eauxchange:
container_name: eauxchange_server
image: www.eauxchange.de/eauxchange:latest
ports:
- "8085:8085"
depends_on:
- db
environment:
- SPRING_CONFIG_LOCATION=/opt/app/config/application.yml
- DATABASE_CONNECTION=eauxchange_db
- DATABASE_PORT=5432
volumes:
- ./config:/opt/app/config
db:
container_name: eauxchange_db
image: postgres:14.12-bullseye
restart: unless-stopped
shm_size: 128mb
environment:
POSTGRES_DB: eauxchange
POSTGRES_PASSWORD: <passwort>
POSTGRES_USER: gkv_user
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
- <EXTERNER_PFAD>:/var/lib/postgresql/data
Das Image liegt in der Registry www.eauxchange.de; die Zugangsdaten erhalten Sie zusammen mit der Lizenz.
Das Datenbankschema wird beim Start automatisch angelegt und migriert.
Serverkonfiguration
Die Konfiguration steht in der application.yml im Ordner config. Die wichtigsten Einstellungen:
spring:
datasource:
username: gkv_user
password: <passwort>
url: jdbc:postgresql://eauxchange_db:5432/eauxchange
server:
port: 8085
com:
javiis:
gkv:
bnrTest: <Test-BNR>
bnrProductive: <Produktiv-BNR>
# true = es wird nichts an die Krankenkassen übertragen (Testbetrieb)
dryRunning: true
# false = Testzertifikat, true = Produktivzertifikat
use_production_certificate: false
product:
manufacturer: <Firma>
name: <Produktname>
version: <Version>
prodID: <Produktnummer>
modID: <Modulnummer>
contact: # technischer Ansprechpartner, geht mit jeder Anfrage mit
name: Max Mustermann
gender: M
street: Musterstrasse
streetNr: 74
zip: 12345
city: Berlin
tel: 0123456789
mail: kontakt@example.com
keystore:
test:
path: /opt/app/config/test/gkv.p12
password: <passwort>
keyPassword: <passwort>
alias: <BNR>
receivePath: /opt/app/config/receive
logSentFiles: true
xmlLogPath: /opt/app/config/sent
Zeitpläne
Die Hintergrundjobs laufen nach Cron-Ausdrücken. Die Voreinstellungen passen in der Regel, überschreiben lässt sich jede davon:
| Einstellung | Vorgabe | Aufgabe |
|---|---|---|
|
|
Versendet offene Anfragen an die Krankenkassen |
|
|
Fragt beim GKV-Server neue Antworten ab und lädt sie herunter |
|
|
Importiert die heruntergeladenen Antwortdateien |
|
|
Ordnet Antworten ohne verwertbare Referenz ihrer Anfrage zu |
|
|
Prüft die Restlaufzeit der Kommunikationszertifikate |
| Statusabfragen dürfen nicht häufiger als alle 15 Minuten laufen (Vorgabe des GKV-Kommunikationsservers). |
Benachrichtigungen
Mit com.javiis.gkv.mailSettings (host, port, sender, username, password, defaultRecipient) und
com.javiis.gkv.sendEmailOnError: true werden Sie über Fehler in den Hintergrundjobs und über
demnächst ablaufende Zertifikate informiert.
Anmeldung
Alle API-Aufrufe benötigen einen API-Token; nur die eingebaute Hilfe (/help, /api-docs) und die
Release Notes (/changelog) sind frei zugänglich. Ein Token ist ein JWT, das für die
Betriebsnummern gilt, für die es ausgestellt wurde, und ein Ablaufdatum trägt.
-
Beim allerersten Start legt der Server den Benutzer
rootan und schreibt dessen erzeugtes Passwort einmalig ins Log. Notieren Sie es; es wird nicht erneut angezeigt. -
Erstellen Sie mit diesem Benutzer einen API-Token (HTTP-Basic-Authentifizierung):
curl -u root:<Passwort aus dem Log> \ -X POST 'https://<host>/security/createAPIToken?expiryDate=2027-12-31T23:59:59¬e=ERP' \ -H 'Content-Type: application/json' \ -d '["<BNR>"]' -
Verwenden Sie den zurückgegebenen Token bei jedem weiteren Aufruf:
curl -X POST 'https://<host>/eau/getOpenEauResponses' \ -H 'Authorization: Bearer <Token>'
Tokens lassen sich auflisten, deaktivieren, wieder aktivieren und löschen (/security/getTokens,
/security/disableTokens, /security/enableTokens, /security/deleteTokens).
| Eine Anfrage, deren Betriebsnummer nicht vom Token abgedeckt ist, wird mit HTTP 403 abgewiesen. Wenn eine neue Betriebsnummer dazukommt, stellen Sie einen neuen Token dafür aus – sonst bleiben diese Anfragen unversendet liegen. |
Verwendung des Dienstes
Die vollständige Liste der Aufrufe und Datenstrukturen finden Sie in der eingebauten Hilfe Ihrer
Installation unter /help. Sie dokumentiert genau die Version, die bei Ihnen läuft.
Eine eAU-Anfrage anlegen
In der eingebauten Hilfe: createEauRequests
Für eine eAU-Anfrage wird ein Objekt vom Typ EauRequest gesendet. Das Feld startDate bezeichnet den Beginn der Abwesenheit.
Bleibt das Feld contactPerson leer, wird der zum Zeitpunkt der Erstellung hinterlegte Standard-Ansprechpartner verwendet.
Die Antwort enthält pro gesendeter Anfrage einen Fehlercode (NONE, wenn die Anfrage erfolgreich eingeplant wurde).
operation::createEauRequests[snippets='http-request,http-response']
Eine eAU-Antwort abholen
In der eingebauten Hilfe: getOpenEauResponses
Offene eAU-Antworten holen Sie mit der Methode getOpenEauResponses ab.
Zurückgegeben werden alle Antworten, die noch nicht als geprüft markiert sind.
operation::getOpenEauResponses[snippets='http-request,http-response']
Eine eAU-Antwort als erledigt markieren
In der eingebauten Hilfe: markEauResponsesAsChecked
Um Datenverlust zu vermeiden, müssen alle abgeholten eAU-Antworten anschließend als erledigt markiert werden. Das geschieht über die Methode markEauResponsesAsChecked.
operation::test-mark-eau-responses-as-checked[snippets='http-request,http-response']
Eine eAU-Anfrage stornieren
In der eingebauten Hilfe: stornoEauRequest
Mit stornoEauRequest brechen Sie eine eAU-Anfrage ab. Noch nicht übertragene Anfragen werden sofort verworfen, bereits versendete werden für die Stornierung im nächsten Abgleich vorgemerkt.
operation::stornoEauRequest[snippets='http-request,http-response']
Anfragen erneut senden
scheduleEauRequestsForResend stellt Anfragen erneut ein, etwa wenn eine Krankenkasse eine
Wiederholung angefordert hat. scheduleEauRequestsForResendWithContactPerson macht dasselbe und
ersetzt dabei den technischen Ansprechpartner – der richtige Aufruf, nachdem sich die
Kontaktdaten geändert haben.
Anfragen und Antworten suchen
getOpenEauRequests liefert alles, was noch auf eine Antwort wartet.
findEauRequestByCriteria und findEauResponseByCriteria suchen nach frei kombinierbaren
Kriterien (Name, Versichertennummer, Zeitraum, Status). getEauRequest und
getEauResponseFromRequestID holen einen einzelnen Datensatz.
Bleibt eine Anfrage offen, obwohl die Antwort bereits eingegangen ist, ordnet
syncResponsesWithRequests offene Antworten ihren Anfragen zu. Dasselbe läuft automatisch (siehe
Zeitpläne oben).
Sende- und Abholjob manuell ausführen
In der eingebauten Hilfe: manualexecuteRequestSending
Mit den Methoden manualExecuteRequestSending und manualExecuteStatusRequest unter /common
stoßen Sie das Senden beziehungsweise Abholen von Hand an. Üblicherweise braucht man das zum Testen
oder wenn eine Antwort vor dem nächsten geplanten Lauf benötigt wird.
operation::manualExecuteStatusRequest[snippets='http-request']
Vorerkrankungsanfragen (LFZ)
Setzt die Vorerkrankungs-Lizenz voraus. Der Ablauf entspricht dem EAU-Verfahren und nutzt die Endpunkte unter /pre.
-
createPreexistingConditionInfoRequestsplant die Anfragen ein. Doppelte Anfragen – gleiche Person, gleicher Zeitraum – werden sofort mit einer erklärenden Fehlermeldung abgewiesen, statt zweimal versendet zu werden. -
getOpenPreexistingConditionInfoRequestslistet alles auf, was noch auf eine Antwort wartet. -
getOpenPreexistingConditionInfoResponsesliefert die noch nicht als geprüft markierten Antworten. Der optionale Parameterlimitbegrenzt die Anzahl der Datensätze. -
markResponseAsCheckedbestätigt die Verarbeitung, genau wie im EAU-Verfahren.
getPreexistingConditionInfoRequest, getPreexistingConditionInfoResponse und
findPreexistingConditionInfoRequestsByAbAGDate holen einzelne Datensätze oder suchen nach dem
Datum der Arbeitgeberanfrage.
Zu jeder Anfrage stehen die von der Krankenkasse gelieferten Daten roh und aufbereitet zur
Verfügung: getRawRequest, getRawResponse, getRawResponseByRequest, getRawErrorResponse sowie
die entsprechenden getParsed…-Methoden. Das ist der schnellste Weg, eine Ablehnung ohne
Support-Anfrage zu klären – der Ablehnungsgrund der Krankenkasse ist Teil der Antwort.
Prüfdienst
Der Server prüft Betriebsnummern und Versichertennummern nach den üblichen Prüfregeln
(/validation/companyBnr, /validation/insuranceNr).
Mehr dazu: In der eingebauten Hilfe: validateInsuranceNr
Krankenkassen
Die Krankenkassendaten werden normalerweise automatisch abgeglichen. Sie können den Abgleich mit triggerInsuranceCompanyRefresh unter /insuranceCompany auch von Hand anstoßen. Dabei werden alle Krankenkassen, ihre öffentlichen Schlüssel und die Zuordnung zu ihren Datenannahmestellen aktualisiert.
findInsuranceCompanyByBnr, findInsuranceCompanyByCriteria und getAllValidInsuranceCompanies lesen die Daten.
Hinweise für den Betrieb
- Welche Version läuft?
-
/changelogzeigt die Version der Installation und die Änderungen aller Versionen;/changelog.jsonliefert dieselben Angaben maschinenlesbar. - Eine Antwortdatei ließ sich nicht importieren
-
Nicht verarbeitbare Dateien bleiben erhalten.
reimportFailedResponsesverarbeitet sie erneut, nachdem die Ursache behoben ist;manualTriggerResponseImportsstößt den Import aller heruntergeladenen Dateien an. - Es wird nichts übertragen
-
Prüfen Sie
dryRunning(im Produktivbetriebfalse), die Auswahl des Zertifikats (use_production_certificate) und ob der API-Token die Betriebsnummer der Anfragen abdeckt. - Zertifikate
-
Die Restlaufzeit wird täglich geprüft. Mit konfigurierten Mail-Einstellungen kommt die Warnung früh genug, um das Zertifikat vor dem Stillstand der Übertragung zu tauschen.
- Dateifolgenummer nachsehen
-
Dafür ist
POST /dav/getCurrentDAVFileCounterda – der liest nur. Der zurückgegebene Wert ist die Nummer der zuletzt erzeugten Datei. Jede Datenannahmestelle führt je Verfahren einen eigenen Zähler: Der optionale Parameterprocedurewählt ihn aus,EAA(Vorgabe) für die eAU undEELfür Vorerkrankungsanfragen. Das Modul des Verfahrens muss lizenziert sein –EAAsetzt EAU voraus,EELdas Modul VORERKRANKUNG –, sonst antwortet der Server mit 403.POST /dav/drawNextDAVFileCounterzieht die nächste Nummer und verbraucht sie. Die Nummer lässt sich nicht zurückgeben, und keine Ihrer Dateien trägt sie. Verwenden Sie den Aufruf nur in Wiederherstellungssituationen, niemals zum Nachsehen eines Wertes. Der ältere PfadgetCurrentFileCounterForBnrmacht dasselbe und funktioniert weiter, ist aber als veraltet gekennzeichnet – sein Name klingt wie eine Abfrage, obwohl der Aufruf Daten ändert.