diff --git a/.dockerignore b/.dockerignore index 94810d006..d89b06ed8 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,4 +2,5 @@ !target/*-runner !target/*-runner.jar !target/lib/* -!target/quarkus-app/* \ No newline at end of file +!target/quarkus-app/* +!KBV_FHIR_eRP_V1_1_0 diff --git a/.github/workflows/ci-pull-request.yml b/.github/workflows/ci-pull-request.yml index 2ae91978b..a9f287c71 100644 --- a/.github/workflows/ci-pull-request.yml +++ b/.github/workflows/ci-pull-request.yml @@ -11,11 +11,11 @@ jobs: ERE_CONNECTOR_TLS_CERT_TRUST_STORE_PWD: "00" ERE_VALIDATOR_VALIDATE_SIGN_REQUEST_BUNDLES_ENABLED: false steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Build with Maven run: mvn -B verify diff --git a/.github/workflows/ci-push.yml b/.github/workflows/ci-push.yml index a0ab0ca8c..b1e30e067 100644 --- a/.github/workflows/ci-push.yml +++ b/.github/workflows/ci-push.yml @@ -11,14 +11,14 @@ jobs: ERE_CONNECTOR_TLS_CERT_TRUST_STORE_PWD: "00" ERE_VALIDATOR_VALIDATE_SIGN_REQUEST_BUNDLES_ENABLED: false steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: '17' distribution: 'adopt' - name: Cache Maven packages - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: ~/.m2 key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} diff --git a/.gitignore b/.gitignore index 422cc1fcb..6da451541 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,15 @@ yarn-error.log # Test generated file user.properties + +# Generate secrets folder, but don't commit files +src/test/resources/secret/* +!src/test/resources/secret/.gitkeep +src/test/resources/secret/bundles-v1-1-0/* +!src/test/resources/secret/bundles-v1-1-0/.gitkeep +src/test/resources/secret/bundles-multiples-v1-1-0/* +!src/test/resources/secret/bundles-multiples-v1-1-0/.gitkeep + +# Log folder +logs/* +!logs/.gitkeep diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index ffdc10e59..5418cd848 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,2 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/CONFIGURATION.md b/CONFIGURATION.md index f62972356..631a05294 100644 --- a/CONFIGURATION.md +++ b/CONFIGURATION.md @@ -1,9 +1,93 @@ # Configuration -The ere-health application read configuration is the following order from most important to least important: - * RuntimeConfiguration as part of a web socket message or a HTTP header - * user.properties - * Java process parameter e.g. -Dquarkus.http.port=8081 - * Environment variables e.g. export ERE_DIRECTORY_WATCHER_DIR="my-watch-dir" - * application.properties outside of the jar - * application.properties in the java class path (inside the jar) +[Back to Readme](README.md) + +## List of parameters + +### Quarkus Dev UI + +If you started the application with `mvn quarkus:dev` you can access the quarkus Dev UI under `http://localhost:8080/q/dev/` + +- The Config Editor shows the current configuration of the application, including the environment variables, with a handy search function. + - e.g. `connector.client-system-id` shows the settings in different profiles (if preceded with %'name-of-profile') and the current setting without it. +- ArC links allow to see the current state of the application and the beans in the application. + +--- + +### Startup parameters + +If you want to use a special profile ("%RU." prefix in files for "RU" profile) use: +> mvn -Dquarkus.profile=RU quarkus:dev + +- If you want to see the SOAP message between ere-ps-app and the konnektor use: +> mvn -Djvm.args="-Dcom.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true -Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true -Dcom.sun.xml.ws.transport.http.HttpAdapter.dump=true -Dcom.sun.xml.internal.ws.transport.http.HttpAdapter.dump=true -Dcom.sun.xml.ws.transport.http.HttpAdapter.dumpTreshold=999999" quarkus:dev + +- If you want so see the SSL Handshake use: +> mvn -Djvm.args="-Djavax.net.debug=ssl:handshake" quarkus:dev + +- If you want to use a certain version of a JDK use: +> JAVA_HOME=/usr/lib/jvm/java-1.11.0-openjdk-amd64/ mvn quarkus:dev + +--- + +### Environment Variables + +For Quarkus specific variables, please refer to the [Quarkus documentation](https://quarkus.io/guides/config-reference), +keep version in mind, as the documentation might change. + +#### List of Application Environment Variables + +* **ERE_DIRECTORY_WATCHER_DIR** + + > directory-watcher.dir=${ERE_DIRECTORY_WATCHER_DIR:watch-pdf} + + Specifies the path of the watch-folder for new muster 16 PDFs. Paths can be absolute or + relative to the path location of the ere-ps-app.jar executable. For Windows environments, make + sure to use the double backslash characters to represent Windows specific file separators + (i.e. \\). + + +* **ERE_CONNECTOR_TLS_CERT_TRUST_STORE_FILE** + + Specifies the path of the Titus Connector TLS certificate trust store. Paths can be + absolute or relative to the path location of the ere-ps-app.jar executable. For Windows + environments, make sure to use the double backslash characters to represent Windows specific + file separators (i.e. \\). + + +* **ERE_CONNECTOR_TLS_CERT_TRUST_STORE_PWD** + + Password for the Titus TLS certificate trust store. For Windows environments, make sure to use + double quotes around numeric values that are to be interpreted as a string. + + +* **MUSTER16_TEMPLATE_CONFIGURATION** + + Allows for configuring which parsing profile the SVGExtractor module should use on startup of + the application. + +In the development `dev` profile, all environment variables have default values, provided through the +`application.properties` file. Under other profiles, certain variable values are required to be explicitly provided +as an environment variable. +Namely, `ERE_CONNECTOR_TLS_CERT_TRUST_STORE_FILE` and `ERE_CONNECTOR_TLS_CERT_TRUST_STORE_PWD`. + +The .env file should be located in the root project folder (ere-ps-app). + +> Important! Configure the .env file to be ignored and not checked into the source code repository. + +In regard to file and directory paths, configure the values for the environment variables in the +.env file to reference paths on your local computer. + +An example of the layout of the contents in the .env file is shown below: + +``` +ERE_DIRECTORY_WATCHER_DIR=/watch-pdf +ERE_CONNECTOR_TLS_CERT_TRUST_STORE_FILE=/ere-ps-app/src/test/resources/certs/ps_erp_incentergy_01.p12 +ERE_CONNECTOR_TLS_CERT_TRUST_STORE_PWD= +``` + +#### Table + +--- + +[Back to Readme](README.md) diff --git a/INSTALL.md b/INSTALL.md index 5b2b53e0f..8e054b832 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,15 +1,20 @@ # INSTALLATION +[Back to Readme](README.md) + +--- + ## Windows -Download and execute the following file: -https://ere.health/ere-health-installer.bat +Download and execute the following https://ere.health/ere-health-installer.bat on Windows 10. This will: * Install a JDK if not available * Install Chrome if not available * Install ere-health and add it to autostart +--- + ## Linux (systemd service) Prequisite: @@ -41,4 +46,10 @@ Check the log sudo journalctl -f -u ere-health ``` -Based on: https://dzone.com/articles/run-your-java-application-as-a-service-on-ubuntu \ No newline at end of file +Based on: https://dzone.com/articles/run-your-java-application-as-a-service-on-ubuntu + + + +--- + +[Back to Readme](README.md) \ No newline at end of file diff --git a/README.md b/README.md index 2a69ac642..59dc06ff1 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,33 @@ # ere-ps-app ERE Primary System Desktop Client Application for the Gematik TI -## Installer +### The ere-ps-app comprises two main components. -Download and execute the following https://ere.health/ere-health-installer.bat on Windows 10. +* The ere-ps-app back-end which is a Java 17 Quarkus (https://quarkus.io/) application. +* The ere-ps-app front-end UI, which is a browser based HTML, CSS and JavaScript application. -[Details on Installation](INSTALL.md) +The repository for the front-end UI can be found [here](https://github.com/ere-health/front-end-ere.health) -### Overview -The ere-ps-app comprises two main components. +[A playlist with 22 short videos: ere.health Integration Program](https://www.youtube.com/playlist?list=PL-xPLOh9MOSDGPV8HmlWMmkH-6VNhP9H5) -* The ere-ps-app back-end which is a Java 11 Quarkus (https://quarkus.io/) application. -* The ere-ps-app front-end UI, which is a browser based HTML, CSS and JavaScript application. +## Documentation +1. [Installation](#Installation) +2. [Configuration](#Configuration) + 1. [Configuring the ERE-PS-App Front-End UI](#Configuring-the-ERE-PS-App-Front-End-UI) + 2. [Configuring the ERE-PS-App Back-End](#Configuring-the-ERE-PS-App-Back-End) +3. [Running the Application](#Running-the-ERE-PS-App-Application) +4. [Using the Application](#Using-the-Application) +5. [Additional Information](#Additional-Information) -The repository for the front-end UI can be found [here](https://github.com/ere-health/front-end-ere.health) +--- + +## Installation + +[Find details to installation on Windows and Linux systems in the INSTALL.md file](INSTALL.md) +--- + +## Configuration ### Configuring the ERE-PS-App Front-End UI @@ -52,16 +65,31 @@ below from the ere-ps-app directory: 4. >rm -rf src/main/resources/META-INF/resources/frontend 5. >git submodule add -b < branch name > https://github.com/ere-health/front-end-ere.health.git src/main/resources/META-INF/resources/frontend +### Configuring the ERE-PS-App Back-End + +#### Providing parameters + +The ere-health application read configuration is the following order from most important to least important: +* RuntimeConfiguration as part of a web socket message or a HTTP header +* user.properties +* Java process parameter e.g. -Dquarkus.http.port=8081 on startup +* Environment variables e.g. export ERE_DIRECTORY_WATCHER_DIR="my-watch-dir" +* application.properties outside of the jar +* application.properties in the java class path (inside the jar) +[Find details to environment variables in the CONFIGURATION.md file](CONFIGURATION.md) +--- + +[Back to top](#Table-of-Contents) ### Running the ERE-PS-App Application * #### Software Requirements - 1. Download and install the latest version of the OpenJDK 11 SDK. You can use your preferred + 1. Download and install the latest version of the OpenJDK 17 SDK. You can use your preferred package manager software on your computer to handle this, or simply download an archive or installer from a publishing site such as AdoptOpenJDK (https://adoptopenjdk.net/). Make sure - to choose OpenJDK 11 (LTS) and the HotSpot version of the JVM. + to choose OpenJDK 17 (LTS) and the HotSpot version of the JVM. 2. Download and install the latest version of Apache Maven (https://maven.apache.org/). @@ -81,27 +109,35 @@ below from the ere-ps-app directory: Then run: > mvn quarkus:dev - + + [(Examples to start the application in different profiles and example CLI Parameters can be found in the CONFIGURATION.md file)](CONFIGURATION.md) + + At this point, the application should be running as highlighted below. ```shell - __ ____ __ _____ ___ __ ____ ______ - --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ - -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ - --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ - 2021-06-08 15:45:41,324 INFO [ca.uhn.fhi.uti.VersionUtil] (Quarkus Main Thread) HAPI FHIR version 5.3.0 - Rev 919c1dbddc - 2021-06-08 15:45:41,325 INFO [ca.uhn.fhi.con.FhirContext] (Quarkus Main Thread) Creating new FHIR context for FHIR version [R4] - 2021-06-08 15:45:41,571 INFO [io.und.websockets] (Quarkus Main Thread) UT026003: Adding annotated server endpoint class health.ere.ps.websocket.Websocket for path /websocket - 2021-06-08 15:45:41,665 INFO [hea.ere.ps.ser.fs.DirectoryWatcher] (Quarkus Main Thread) Watching directory: /Users/douglas/my-indie-projects-work-area/ere-ps-app/watch-pdf - 2021-06-08 15:45:41,758 INFO [io.quarkus] (Quarkus Main Thread) ere-ps-app 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.13.1.Final) started in 2.158s. Listening on: http://0.0.0.0:8080 - 2021-06-08 15:45:41,760 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. - 2021-06-08 15:45:41,761 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, rest-client, resteasy, resteasy-jsonb, scheduler, servlet, websockets] + Listening for transport dt_socket at address: 43411 + __ ____ __ _____ ___ __ ____ ______ + --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ + -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ + --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ + 2024-05-14 17:26:26,620 INFO [ca.uhn.fhi.uti.VersionUtil] (Quarkus Main Thread) HAPI FHIR version 7.0.2 - Rev 95beaec894 + 2024-05-14 17:26:26,623 INFO [ca.uhn.fhi.con.FhirContext] (Quarkus Main Thread) Creating new FHIR context for FHIR version [R4] + 2024-05-14 17:26:26,647 INFO [io.und.websockets] (Quarkus Main Thread) UT026003: Adding annotated server endpoint class health.ere.ps.websocket.Websocket for path /websocket + 2024-05-14 17:26:26,954 INFO [io.qua.sch.run.SimpleScheduler] (Quarkus Main Thread) No scheduled business methods found - Simple scheduler will not be started + 2024-05-14 17:26:27,053 INFO [hea.ere.ps.ser.idp.cli.IdpClient] (Quarkus Main Thread) Initializing using url: https://idp-ref.zentral.idp.splitdns.ti-dienste.de//.well-known/openid-configuration + 2024-05-14 17:26:28,270 INFO [ca.uhn.fhi.con.FhirContext] (Quarkus Main Thread) Creating new FHIR context for FHIR version [R4] + 2024-05-14 17:26:29,012 INFO [io.quarkus] (Quarkus Main Thread) ere-ps-app 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.9.4) started in 5.855s. Listening on: http://0.0.0.0:8080 and https://0.0.0.0:8443 + 2024-05-14 17:26:29,013 INFO [io.quarkus] (Quarkus Main Thread) Profile RU activated. Live Coding activated. + 2024-05-14 17:26:29,014 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy, resteasy-client, resteasy-jsonb, scheduler, servlet, smallrye-context-propagation, smallrye-openapi, swagger-ui, vertx, websockets, websockets-client] ``` You can access the front-end UI of the application by making reference to the following URL > http://localhost:8080/frontend/app/src/index.html + To use the swagger ui go to: + http://localhost:8080/q/swagger-ui/ #### Verify Correct Reference to the Latest Front-End UI Version @@ -116,51 +152,72 @@ revision number: > 7887a70e4dbe35cede4d286dc57bc3bba608a48d src/main/resources/META-INF/resources/frontend (heads/main) -### Environment Variables -#### List of Application Environment Variables -* **ERE_DIRECTORY_WATCHER_DIR** +--- +[Back to top](#Table-of-Contents) - Specifies the path of the watch-folder for new muster 16 PDFs. Paths can be absolute or - relative to the path location of the ere-ps-app.jar executable. For Windows environments, make - sure to use the double backslash characters to represent Windows specific file separators - (i.e. \\). - - -* **ERE_CONNECTOR_TLS_CERT_TRUST_STORE_FILE** - - Specifies the path of the Titus Connector TLS certificate trust store. Paths can be - absolute or relative to the path location of the ere-ps-app.jar executable. For Windows - environments, make sure to use the double backslash characters to represent Windows specific - file separators (i.e. \\). - - -* **ERE_CONNECTOR_TLS_CERT_TRUST_STORE_PWD** +## Using-the-Application - Password for the Titus TLS certificate trust store. For Windows environments, make sure to use - double quotes around numeric values that are to be interpreted as a string. - +### For prescribing -* **MUSTER16_TEMPLATE_CONFIGURATION** +#### REST - Allows for configuring which parsing profile the SVGExtractor module should use on startup of - the application. +[Example with JavaScript](src/test/resources/javascript/create-e-prescription-with-runtime-config.js) -In the development `dev` profile, all environment variables have default values, provided through the -`application.properties` file. Under other profiles, certain variable values are required to be explicitly provided -as an environment variable. -Namely, `ERE_CONNECTOR_TLS_CERT_TRUST_STORE_FILE` and `ERE_CONNECTOR_TLS_CERT_TRUST_STORE_PWD`. +Use the swagger UI: +http://localhost:8080/q/swagger-ui/ -The .env file should be located in the root project folder (ere-ps-app). +![](img/Swagger-UI.png?raw=true) -> Important! Configure the .env file to be ignored and not checked into the source code repository. -In regard to file and directory paths, configure the values for the environment variables in the -.env file to reference paths on your local computer. +##### ... with comfort signature -An example of the layout of the contents in the .env file is shown below: +The comfort signature can be enabled by sending an [ActivateComfortSignature](src/test/resources/websocket-messages/ActivateComfortSignature-2-With-EHBA.json) message through the websocket. The [response](src/test/resources/websocket-messages/ActivateComfortSignature-2-Response.json) will contain a userId that has to be used afterwards in the userId field to enable the usage of the comfort signature. + +Another way of enabling the comfort signature is posting to the workflow/comfortsignature/activate endpoint with passing the ehba card handle in the header "X-eHBAHandle". The endpoint will return the userId. + +#### Websocket + +[Right now details in the README.md file in the websocket message folder](src/test/resources/websocket-messages/README.md) + +##### ... with comfort signature + +If you want to use the comfort signature you have to pass the user id that you got from the ActivateComfortSignature message in the connector.user-id field e.g.: + +```json +{ +... + "runtimeConfig": { + ... + "connector.user-id": "50aa5d2a-6f14-43bc-85ea-d03f9bd49441" + ... + } +... +} ``` -ERE_DIRECTORY_WATCHER_DIR=/watch-pdf -ERE_CONNECTOR_TLS_CERT_TRUST_STORE_FILE=/ere-ps-app/src/test/resources/certs/ps_erp_incentergy_01.p12 -ERE_CONNECTOR_TLS_CERT_TRUST_STORE_PWD= -``` + + + +#### Frontend + + + +##### ... with comfort signature + + + + +### For pharmacies +#### with CardLink + +--- +[Back to top](#Table-of-Contents) + +## Additional Information + +For general information and understanding the eRezept / prescribing workflow the [gematik E-Rezept API-Dokumentation](https://github.com/gematik/api-erp) +is a valuable source. + + +--- +[Back to top](#Documentation) diff --git a/azure-pipelines.yml b/azure-pipelines.yml new file mode 100644 index 000000000..2c1fded00 --- /dev/null +++ b/azure-pipelines.yml @@ -0,0 +1,22 @@ +# Maven +# Build your Java project and run tests with Apache Maven. +# Add steps that analyze code, save build artifacts, deploy, and more: +# https://docs.microsoft.com/azure/devops/pipelines/languages/java + +trigger: +- main + +pool: + vmImage: ubuntu-latest + +steps: +- task: Maven@3 + inputs: + mavenPomFile: 'pom.xml' + mavenOptions: '-Xmx3072m' + javaHomeOption: 'JDKVersion' + jdkVersionOption: '1.17' + jdkArchitectureOption: 'x64' + publishJUnitResults: true + testResultsFiles: '**/surefire-reports/TEST-*.xml' + goals: 'package' diff --git a/build-and-run-docker-image.sh b/build-and-run-docker-image.sh new file mode 100755 index 000000000..358eb5624 --- /dev/null +++ b/build-and-run-docker-image.sh @@ -0,0 +1,9 @@ +#!/bin/sh +docker rm ere-ps-app +docker build . -t ere-ps-app -f src/main/docker/Dockerfile.jvm +docker run -d \ + --name ere-ps-app \ + -p 8080:8080 -p 8443:8443 \ + -e QUARKUS_PROFILE=RU \ + -v `pwd`/src/main/resources/:/deployments/config ere-ps-app +echo "docker image ere-ps-app running. \n Status with: 'docker ps' \n Logs with: 'docker logs ere-ps-app' \n Kill with: 'docker kill ere-ps-app'" diff --git a/img/Swagger-UI.png b/img/Swagger-UI.png new file mode 100644 index 000000000..dd2b84d3c Binary files /dev/null and b/img/Swagger-UI.png differ diff --git a/launcher/pom.xml b/launcher/pom.xml index 703f55dc0..8957043e5 100644 --- a/launcher/pom.xml +++ b/launcher/pom.xml @@ -17,13 +17,13 @@ org.update4j update4j - 1.5.7 + 1.5.9 me.tongfei progressbar - 0.9.2 + 0.10.0 diff --git a/linux-service/installer.sh b/linux-service/installer.sh index cc792bdd7..74b09ca4a 100755 --- a/linux-service/installer.sh +++ b/linux-service/installer.sh @@ -1,8 +1,9 @@ #!/bin/bash -cp -r ../target/quarkus-app /opt/ere-health +mkdir /opt/ere-health/ +cp -r ../target/quarkus-app /opt/ere-health/ mkdir /opt/ere-health/config cp ../src/main/resources/application.properties /opt/ere-health/config -cp run.sh /opt/ere-health +cp run.sh /opt/ere-health/ cp ere-health.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable ere-health.service diff --git a/logs/.gitkeep b/logs/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/logs/2021-10-11-create-xml-prescription.log b/logs/2021-10-11-create-xml-prescription.log deleted file mode 100644 index 2d29a45d9..000000000 --- a/logs/2021-10-11-create-xml-prescription.log +++ /dev/null @@ -1,67 +0,0 @@ -Warning: Nashorn engine is planned to be removed from a future JDK release -Okt. 11, 2021 3:48:01 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: ProxySelector Request for http://localhost:8080/workflow/task -Okt. 11, 2021 3:48:01 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: Proxy used: DIRECT -Okt. 11, 2021 3:48:01 NACHM. sun.net.www.protocol.http.HttpURLConnection writeRequests -FEIN: sun.net.www.MessageHeader@7d1cfb8b7 pairs: {POST /workflow/task HTTP/1.1: null}{Accept: application/xml}{User-Agent: Java/11.0.11}{Host: localhost:8080}{Connection: keep-alive}{Content-type: application/x-www-form-urlencoded}{Content-Length: 0} -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.http.HttpClient logFinest -AM FEINSTEN: KeepAlive stream used: http://localhost:8080/workflow/task -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.protocol.http.HttpURLConnection getInputStream0 -FEIN: sun.net.www.MessageHeader@3d1848cc3 pairs: {null: HTTP/1.1 200 OK}{Content-Type: application/xml;charset=UTF-8}{Content-Length: 1123} - -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: ProxySelector Request for http://localhost:8080/workflow/task -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.http.HttpClient logFinest -AM FEINSTEN: KeepAlive stream retrieved from the cache, sun.net.www.http.HttpClient(http://localhost:8080/workflow/task) -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: Proxy used: DIRECT -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.protocol.http.HttpURLConnection writeRequests -FEIN: sun.net.www.MessageHeader@5d1659ea7 pairs: {POST /workflow/task HTTP/1.1: null}{Accept: application/json}{User-Agent: Java/11.0.11}{Host: localhost:8080}{Connection: keep-alive}{Content-type: application/x-www-form-urlencoded}{Content-Length: 0} -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.http.HttpClient logFinest -AM FEINSTEN: KeepAlive stream used: http://localhost:8080/workflow/task -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.protocol.http.HttpURLConnection getInputStream0 -FEIN: sun.net.www.MessageHeader@793138bd3 pairs: {null: HTTP/1.1 200 OK}{Content-Type: application/json}{Content-Length: 927} -{"resourceType":"Task","id":"160.000.069.949.359.34","meta":{"profile":["https://gematik.de/fhir/StructureDefinition/ErxTask"]},"extension":[{"url":"https://gematik.de/fhir/StructureDefinition/PrescriptionType","valueCoding":{"system":"https://gematik.de/fhir/CodeSystem/Flowtype","code":"160","display":"Muster 16 (Apothekenpflichtige Arzneimittel)"}}],"identifier":[{"use":"official","system":"https://gematik.de/fhir/NamingSystem/PrescriptionID","value":"160.000.069.949.359.34"},{"use":"official","system":"https://gematik.de/fhir/NamingSystem/AccessCode","value":"309b58453e4e39f88ab4e599580bf5953a2f0d68c45765df7c036c32380ce7f6"}],"status":"draft","intent":"order","authoredOn":"2021-10-11T13:48:09.319+00:00","lastModified":"2021-10-11T13:48:09.319+00:00","performerType":[{"coding":[{"system":"urn:ietf:rfc:3986","code":"urn:oid:1.2.276.0.76.4.54","display":"�ffentliche Apotheke"}],"text":"�ffentliche Apotheke"}]} -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: ProxySelector Request for http://localhost:8080/workflow/sign -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.http.HttpClient logFinest -AM FEINSTEN: KeepAlive stream retrieved from the cache, sun.net.www.http.HttpClient(http://localhost:8080/workflow/task) -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: Proxy used: DIRECT -Okt. 11, 2021 3:48:09 NACHM. sun.net.www.protocol.http.HttpURLConnection writeRequests -FEIN: sun.net.www.MessageHeader@baf1bb37 pairs: {POST /workflow/sign HTTP/1.1: null}{Accept: text/plain}{Content-Type: application/xml}{User-Agent: Java/11.0.11}{Host: localhost:8080}{Connection: keep-alive}{Content-Length: 15296} -Okt. 11, 2021 3:48:25 NACHM. sun.net.www.protocol.http.HttpURLConnection getInputStream0 -FEIN: sun.net.www.MessageHeader@25d958c63 pairs: {null: HTTP/1.1 200 OK}{Content-Type: text/plain;charset=UTF-8}{Transfer-Encoding: chunked} -MII9EQYJKoZIhvcNAQcCoII9AjCCPP4CAQUxDzANBglghkgBZQMEAgEFADCCLf8GCSqGSIb3DQEHAaCCLfAEgi3sPEJ1bmRsZSB4bWxucz0iaHR0cDovL2hsNy5vcmcvZmhpciI+PGlkIHZhbHVlPSI5ZjI0MjQxNS1jODM3LTRmZmEtYjNjZC0zOWZlNDhkNzU5ZDMiPjwvaWQ+PG1ldGE+PGxhc3RVcGRhdGVkIHZhbHVlPSIyMDIxLTA0LTA2VDA4OjMwOjAwWiI+PC9sYXN0VXBkYXRlZD48cHJvZmlsZSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL0tCVl9QUl9FUlBfQnVuZGxlfDEuMC4xIj48L3Byb2ZpbGU+PC9tZXRhPjxpZGVudGlmaWVyPjxzeXN0ZW0gdmFsdWU9Imh0dHBzOi8vZ2VtYXRpay5kZS9maGlyL05hbWluZ1N5c3RlbS9QcmVzY3JpcHRpb25JRCI+PC9zeXN0ZW0+PHZhbHVlIHZhbHVlPSIxNjAuMDAwLjA2OS45NDkuMzU5LjM0Ij48L3ZhbHVlPjwvaWRlbnRpZmllcj48dHlwZSB2YWx1ZT0iZG9jdW1lbnQiPjwvdHlwZT48dGltZXN0YW1wIHZhbHVlPSIyMDIxLTA0LTA2VDA4OjMwOjAwWiI+PC90aW1lc3RhbXA+PGVudHJ5PjxmdWxsVXJsIHZhbHVlPSJodHRwOi8vcHZzLnByYXhpcy5sb2NhbC9maGlyL0NvbXBvc2l0aW9uL2EwNTRjMmYzLTAxMjMtNGQzMy1hMGIzLWJlZGVjMmY3ZDFlYSI+PC9mdWxsVXJsPjxyZXNvdXJjZT48Q29tcG9zaXRpb24+PGlkIHZhbHVlPSJhMDU0YzJmMy0wMTIzLTRkMzMtYTBiMy1iZWRlYzJmN2QxZWEiPjwvaWQ+PG1ldGE+PHByb2ZpbGUgdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9LQlZfUFJfRVJQX0NvbXBvc2l0aW9ufDEuMC4xIj48L3Byb2ZpbGU+PC9tZXRhPjxleHRlbnNpb24gdXJsPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vS0JWX0VYX0ZPUl9MZWdhbF9iYXNpcyI+PHZhbHVlQ29kaW5nPjxzeXN0ZW0gdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvQ29kZVN5c3RlbS9LQlZfQ1NfU0ZISVJfS0JWX1NUQVRVU0tFTk5aRUlDSEVOIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iMDAiPjwvY29kZT48L3ZhbHVlQ29kaW5nPjwvZXh0ZW5zaW9uPjxzdGF0dXMgdmFsdWU9ImZpbmFsIj48L3N0YXR1cz48dHlwZT48Y29kaW5nPjxzeXN0ZW0gdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvQ29kZVN5c3RlbS9LQlZfQ1NfU0ZISVJfS0JWX0ZPUk1VTEFSX0FSVCI+PC9zeXN0ZW0+PGNvZGUgdmFsdWU9ImUxNkEiPjwvY29kZT48L2NvZGluZz48L3R5cGU+PHN1YmplY3Q+PHJlZmVyZW5jZSB2YWx1ZT0iUGF0aWVudC81MTJhYjViYy1hN2FiLTRmZDctODFjYy0xNmE1OTRmNzQ3YTYiPjwvcmVmZXJlbmNlPjwvc3ViamVjdD48ZGF0ZSB2YWx1ZT0iMjAyMS0wNC0wNVQwODowMDowMFoiPjwvZGF0ZT48YXV0aG9yPjxyZWZlcmVuY2UgdmFsdWU9IlByYWN0aXRpb25lci9lMzNkMmFmZC00NGM4LTQ2MmItODBlNS01MmRiZTVlYmYzNTkiPjwvcmVmZXJlbmNlPjx0eXBlIHZhbHVlPSJQcmFjdGl0aW9uZXIiPjwvdHlwZT48L2F1dGhvcj48YXV0aG9yPjx0eXBlIHZhbHVlPSJEZXZpY2UiPjwvdHlwZT48aWRlbnRpZmllcj48c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL05hbWluZ1N5c3RlbS9LQlZfTlNfRk9SX1BydWVmbnVtbWVyIj48L3N5c3RlbT48dmFsdWUgdmFsdWU9IlkvNDEwLzIxMDcvMzYvOTk5Ij48L3ZhbHVlPjwvaWRlbnRpZmllcj48L2F1dGhvcj48dGl0bGUgdmFsdWU9ImVsZWt0cm9uaXNjaGUgQXJ6bmVpbWl0dGVsdmVyb3JkbnVuZyI+PC90aXRsZT48Y3VzdG9kaWFuPjxyZWZlcmVuY2UgdmFsdWU9Ik9yZ2FuaXphdGlvbi9kMmIzMGE3MC05ODMwLTQ5NjgtYWI5Ny02ODg0NzJiNmY5YTMiPjwvcmVmZXJlbmNlPjwvY3VzdG9kaWFuPjxzZWN0aW9uPjxjb2RlPjxjb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9Db2RlU3lzdGVtL0tCVl9DU19FUlBfU2VjdGlvbl9UeXBlIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iUHJlc2NyaXB0aW9uIj48L2NvZGU+PC9jb2Rpbmc+PC9jb2RlPjxlbnRyeT48cmVmZXJlbmNlIHZhbHVlPSJNZWRpY2F0aW9uUmVxdWVzdC8wNmRjMTU5NC01MDlhLTRmNGMtYWRhNy1kZmQ0NzdhMDJkODYiPjwvcmVmZXJlbmNlPjwvZW50cnk+PC9zZWN0aW9uPjxzZWN0aW9uPjxjb2RlPjxjb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9Db2RlU3lzdGVtL0tCVl9DU19FUlBfU2VjdGlvbl9UeXBlIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iQ292ZXJhZ2UiPjwvY29kZT48L2NvZGluZz48L2NvZGU+PGVudHJ5PjxyZWZlcmVuY2UgdmFsdWU9IkNvdmVyYWdlL2RmMGYyNTM2LTk3YjktNGJhZS05OWNjLTgzYmEyZTgzNzFlNCI+PC9yZWZlcmVuY2U+PC9lbnRyeT48L3NlY3Rpb24+PC9Db21wb3NpdGlvbj48L3Jlc291cmNlPjwvZW50cnk+PGVudHJ5PjxmdWxsVXJsIHZhbHVlPSJodHRwOi8vcHZzLnByYXhpcy5sb2NhbC9maGlyL01lZGljYXRpb25SZXF1ZXN0LzA2ZGMxNTk0LTUwOWEtNGY0Yy1hZGE3LWRmZDQ3N2EwMmQ4NiI+PC9mdWxsVXJsPjxyZXNvdXJjZT48TWVkaWNhdGlvblJlcXVlc3Q+PGlkIHZhbHVlPSIwNmRjMTU5NC01MDlhLTRmNGMtYWRhNy1kZmQ0NzdhMDJkODYiPjwvaWQ+PG1ldGE+PHByb2ZpbGUgdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9LQlZfUFJfRVJQX1ByZXNjcmlwdGlvbnwxLjAuMSI+PC9wcm9maWxlPjwvbWV0YT48ZXh0ZW5zaW9uIHVybD0iaHR0cHM6Ly9maGlyLmtidi5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL0tCVl9FWF9FUlBfU3RhdHVzQ29QYXltZW50Ij48dmFsdWVDb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9Db2RlU3lzdGVtL0tCVl9DU19FUlBfU3RhdHVzQ29QYXltZW50Ij48L3N5c3RlbT48Y29kZSB2YWx1ZT0iMSI+PC9jb2RlPjwvdmFsdWVDb2Rpbmc+PC9leHRlbnNpb24+PGV4dGVuc2lvbiB1cmw9Imh0dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9LQlZfRVhfRVJQX0VtZXJnZW5jeVNlcnZpY2VzRmVlIj48dmFsdWVCb29sZWFuIHZhbHVlPSJmYWxzZSI+PC92YWx1ZUJvb2xlYW4+PC9leHRlbnNpb24+PGV4dGVuc2lvbiB1cmw9Imh0dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9LQlZfRVhfRVJQX0JWRyI+PHZhbHVlQm9vbGVhbiB2YWx1ZT0iZmFsc2UiPjwvdmFsdWVCb29sZWFuPjwvZXh0ZW5zaW9uPjxleHRlbnNpb24gdXJsPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vS0JWX0VYX0VSUF9NdWx0aXBsZV9QcmVzY3JpcHRpb24iPjxleHRlbnNpb24gdXJsPSJLZW5uemVpY2hlbiI+PHZhbHVlQm9vbGVhbiB2YWx1ZT0iZmFsc2UiPjwvdmFsdWVCb29sZWFuPjwvZXh0ZW5zaW9uPjwvZXh0ZW5zaW9uPjxzdGF0dXMgdmFsdWU9ImFjdGl2ZSI+PC9zdGF0dXM+PGludGVudCB2YWx1ZT0ib3JkZXIiPjwvaW50ZW50PjxtZWRpY2F0aW9uUmVmZXJlbmNlPjxyZWZlcmVuY2UgdmFsdWU9Ik1lZGljYXRpb24vZjU2ODM5N2QtN2JhMi00NmFjLTkwNGItMDJjYWVjOTMzYjQyIj48L3JlZmVyZW5jZT48L21lZGljYXRpb25SZWZlcmVuY2U+PHN1YmplY3Q+PHJlZmVyZW5jZSB2YWx1ZT0iUGF0aWVudC81MTJhYjViYy1hN2FiLTRmZDctODFjYy0xNmE1OTRmNzQ3YTYiPjwvcmVmZXJlbmNlPjwvc3ViamVjdD48YXV0aG9yZWRPbiB2YWx1ZT0iMjAyMC0wNC0wNiI+PC9hdXRob3JlZE9uPjxyZXF1ZXN0ZXI+PHJlZmVyZW5jZSB2YWx1ZT0iUHJhY3RpdGlvbmVyL2UzM2QyYWZkLTQ0YzgtNDYyYi04MGU1LTUyZGJlNWViZjM1OSI+PC9yZWZlcmVuY2U+PC9yZXF1ZXN0ZXI+PGluc3VyYW5jZT48cmVmZXJlbmNlIHZhbHVlPSJDb3ZlcmFnZS9kZjBmMjUzNi05N2I5LTRiYWUtOTljYy04M2JhMmU4MzcxZTQiPjwvcmVmZXJlbmNlPjwvaW5zdXJhbmNlPjxkb3NhZ2VJbnN0cnVjdGlvbj48ZXh0ZW5zaW9uIHVybD0iaHR0cHM6Ly9maGlyLmtidi5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL0tCVl9FWF9FUlBfRG9zYWdlRmxhZyI+PHZhbHVlQm9vbGVhbiB2YWx1ZT0idHJ1ZSI+PC92YWx1ZUJvb2xlYW4+PC9leHRlbnNpb24+PHRleHQgdmFsdWU9IjJtYWwgdMOkZ2wuIDVtbCI+PC90ZXh0PjwvZG9zYWdlSW5zdHJ1Y3Rpb24+PGRpc3BlbnNlUmVxdWVzdD48cXVhbnRpdHk+PHZhbHVlIHZhbHVlPSIxIj48L3ZhbHVlPjxzeXN0ZW0gdmFsdWU9Imh0dHA6Ly91bml0c29mbWVhc3VyZS5vcmciPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSJ7UGFja2FnZX0iPjwvY29kZT48L3F1YW50aXR5PjwvZGlzcGVuc2VSZXF1ZXN0PjxzdWJzdGl0dXRpb24+PGFsbG93ZWRCb29sZWFuIHZhbHVlPSJ0cnVlIj48L2FsbG93ZWRCb29sZWFuPjwvc3Vic3RpdHV0aW9uPjwvTWVkaWNhdGlvblJlcXVlc3Q+PC9yZXNvdXJjZT48L2VudHJ5PjxlbnRyeT48ZnVsbFVybCB2YWx1ZT0iaHR0cDovL3B2cy5wcmF4aXMubG9jYWwvZmhpci9NZWRpY2F0aW9uL2Y1NjgzOTdkLTdiYTItNDZhYy05MDRiLTAyY2FlYzkzM2I0MiI+PC9mdWxsVXJsPjxyZXNvdXJjZT48TWVkaWNhdGlvbj48aWQgdmFsdWU9ImY1NjgzOTdkLTdiYTItNDZhYy05MDRiLTAyY2FlYzkzM2I0MiI+PC9pZD48bWV0YT48cHJvZmlsZSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL0tCVl9QUl9FUlBfTWVkaWNhdGlvbl9QWk58MS4wLjEiPjwvcHJvZmlsZT48L21ldGE+PGV4dGVuc2lvbiB1cmw9Imh0dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9LQlZfRVhfRVJQX01lZGljYXRpb25fQ2F0ZWdvcnkiPjx2YWx1ZUNvZGluZz48c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL0NvZGVTeXN0ZW0vS0JWX0NTX0VSUF9NZWRpY2F0aW9uX0NhdGVnb3J5Ij48L3N5c3RlbT48Y29kZSB2YWx1ZT0iMDAiPjwvY29kZT48L3ZhbHVlQ29kaW5nPjwvZXh0ZW5zaW9uPjxleHRlbnNpb24gdXJsPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vS0JWX0VYX0VSUF9NZWRpY2F0aW9uX1ZhY2NpbmUiPjx2YWx1ZUJvb2xlYW4gdmFsdWU9ImZhbHNlIj48L3ZhbHVlQm9vbGVhbj48L2V4dGVuc2lvbj48ZXh0ZW5zaW9uIHVybD0iaHR0cDovL2ZoaXIuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9ub3JtZ3JvZXNzZSI+PHZhbHVlQ29kZSB2YWx1ZT0iTjEiPjwvdmFsdWVDb2RlPjwvZXh0ZW5zaW9uPjxjb2RlPjxjb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cDovL2ZoaXIuZGUvQ29kZVN5c3RlbS9pZmEvcHpuIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iMDg1ODU5OTciPjwvY29kZT48L2NvZGluZz48dGV4dCB2YWx1ZT0iUHJvc3BhbsKuIEh1c3RlbnNhZnQgMTAwbWwgTjEiPjwvdGV4dD48L2NvZGU+PGZvcm0+PGNvZGluZz48c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL0NvZGVTeXN0ZW0vS0JWX0NTX1NGSElSX0tCVl9EQVJSRUlDSFVOR1NGT1JNIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iRkxFIj48L2NvZGU+PC9jb2Rpbmc+PC9mb3JtPjwvTWVkaWNhdGlvbj48L3Jlc291cmNlPjwvZW50cnk+PGVudHJ5PjxmdWxsVXJsIHZhbHVlPSJodHRwOi8vcHZzLnByYXhpcy5sb2NhbC9maGlyL1BhdGllbnQvNTEyYWI1YmMtYTdhYi00ZmQ3LTgxY2MtMTZhNTk0Zjc0N2E2Ij48L2Z1bGxVcmw+PHJlc291cmNlPjxQYXRpZW50PjxpZCB2YWx1ZT0iNTEyYWI1YmMtYTdhYi00ZmQ3LTgxY2MtMTZhNTk0Zjc0N2E2Ij48L2lkPjxtZXRhPjxwcm9maWxlIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vS0JWX1BSX0ZPUl9QYXRpZW50fDEuMC4zIj48L3Byb2ZpbGU+PC9tZXRhPjxpZGVudGlmaWVyPjx0eXBlPjxjb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cDovL2ZoaXIuZGUvQ29kZVN5c3RlbS9pZGVudGlmaWVyLXR5cGUtZGUtYmFzaXMiPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSJHS1YiPjwvY29kZT48L2NvZGluZz48L3R5cGU+PHN5c3RlbSB2YWx1ZT0iaHR0cDovL2ZoaXIuZGUvTmFtaW5nU3lzdGVtL2drdi9rdmlkLTEwIj48L3N5c3RlbT48dmFsdWUgdmFsdWU9Ik0zMTAxMTk4MDAiPjwvdmFsdWU+PC9pZGVudGlmaWVyPjxuYW1lPjx1c2UgdmFsdWU9Im9mZmljaWFsIj48L3VzZT48ZmFtaWx5IHZhbHVlPSJFcmJwcmluemVzc2luIHZvbiB1bmQgenUgZGVyIFNjaGltbWVscGZlbm5pZy1IYW1tZXJzY2htaWR0IEZlZGVybWFubnNzb2huIj48ZXh0ZW5zaW9uIHVybD0iaHR0cDovL2ZoaXIuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9odW1hbm5hbWUtbmFtZW5zenVzYXR6Ij48dmFsdWVTdHJpbmcgdmFsdWU9IkVyYnByaW56ZXNzaW4iPjwvdmFsdWVTdHJpbmc+PC9leHRlbnNpb24+PGV4dGVuc2lvbiB1cmw9Imh0dHA6Ly9obDcub3JnL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9odW1hbm5hbWUtb3duLXByZWZpeCI+PHZhbHVlU3RyaW5nIHZhbHVlPSJ2b24gdW5kIHp1IGRlciI+PC92YWx1ZVN0cmluZz48L2V4dGVuc2lvbj48ZXh0ZW5zaW9uIHVybD0iaHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL2h1bWFubmFtZS1vd24tbmFtZSI+PHZhbHVlU3RyaW5nIHZhbHVlPSJTY2hpbW1lbHBmZW5uaWctSGFtbWVyc2NobWlkdCBGZWRlcm1hbm5zc29obiI+PC92YWx1ZVN0cmluZz48L2V4dGVuc2lvbj48L2ZhbWlseT48Z2l2ZW4gdmFsdWU9IkluZ3JpZCI+PC9naXZlbj48L25hbWU+PGJpcnRoRGF0ZSB2YWx1ZT0iMjAxMC0wMS0zMSI+PC9iaXJ0aERhdGU+PGFkZHJlc3M+PHR5cGUgdmFsdWU9ImJvdGgiPjwvdHlwZT48bGluZSB2YWx1ZT0iQW5uZWxpZXNlLSB1bmQgR2Vvcmctdm9uLUdyb3NjdXJ0aC1QbGFldHpjaGVuIDE0OS1DIj48ZXh0ZW5zaW9uIHVybD0iaHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL2lzbzIxMDkwLUFEWFAtaG91c2VOdW1iZXIiPjx2YWx1ZVN0cmluZyB2YWx1ZT0iMTQ5LUMiPjwvdmFsdWVTdHJpbmc+PC9leHRlbnNpb24+PGV4dGVuc2lvbiB1cmw9Imh0dHA6Ly9obDcub3JnL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9pc28yMTA5MC1BRFhQLXN0cmVldE5hbWUiPjx2YWx1ZVN0cmluZyB2YWx1ZT0iQW5uZWxpZXNlLSB1bmQgR2Vvcmctdm9uLUdyb3NjdXJ0aC1QbGFldHpjaGVuIj48L3ZhbHVlU3RyaW5nPjwvZXh0ZW5zaW9uPjwvbGluZT48bGluZSB2YWx1ZT0iNS4gT0cgLSBIaW50ZXJob2YiPjxleHRlbnNpb24gdXJsPSJodHRwOi8vaGw3Lm9yZy9maGlyL1N0cnVjdHVyZURlZmluaXRpb24vaXNvMjEwOTAtQURYUC1hZGRpdGlvbmFsTG9jYXRvciI+PHZhbHVlU3RyaW5nIHZhbHVlPSI1LiBPRyAtIEhpbnRlcmhvZiI+PC92YWx1ZVN0cmluZz48L2V4dGVuc2lvbj48L2xpbmU+PGNpdHkgdmFsdWU9IkJhZCBIb21idXJnIj48L2NpdHk+PHBvc3RhbENvZGUgdmFsdWU9IjYwNDM3Ij48L3Bvc3RhbENvZGU+PGNvdW50cnkgdmFsdWU9IkQiPjwvY291bnRyeT48L2FkZHJlc3M+PC9QYXRpZW50PjwvcmVzb3VyY2U+PC9lbnRyeT48ZW50cnk+PGZ1bGxVcmwgdmFsdWU9Imh0dHA6Ly9wdnMucHJheGlzLmxvY2FsL2ZoaXIvUHJhY3RpdGlvbmVyL2UzM2QyYWZkLTQ0YzgtNDYyYi04MGU1LTUyZGJlNWViZjM1OSI+PC9mdWxsVXJsPjxyZXNvdXJjZT48UHJhY3RpdGlvbmVyPjxpZCB2YWx1ZT0iZTMzZDJhZmQtNDRjOC00NjJiLTgwZTUtNTJkYmU1ZWJmMzU5Ij48L2lkPjxtZXRhPjxwcm9maWxlIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vS0JWX1BSX0ZPUl9QcmFjdGl0aW9uZXJ8MS4wLjMiPjwvcHJvZmlsZT48L21ldGE+PGlkZW50aWZpZXI+PHR5cGU+PGNvZGluZz48c3lzdGVtIHZhbHVlPSJodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL3YyLTAyMDMiPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSJMQU5SIj48L2NvZGU+PC9jb2Rpbmc+PC90eXBlPjxzeXN0ZW0gdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvTmFtaW5nU3lzdGVtL0tCVl9OU19CYXNlX0FOUiI+PC9zeXN0ZW0+PHZhbHVlIHZhbHVlPSI0NTY0NTY1MzQiPjwvdmFsdWU+PC9pZGVudGlmaWVyPjxuYW1lPjx1c2UgdmFsdWU9Im9mZmljaWFsIj48L3VzZT48ZmFtaWx5IHZhbHVlPSJXZWJlciI+PGV4dGVuc2lvbiB1cmw9Imh0dHA6Ly9obDcub3JnL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9odW1hbm5hbWUtb3duLW5hbWUiPjx2YWx1ZVN0cmluZyB2YWx1ZT0iV2ViZXIiPjwvdmFsdWVTdHJpbmc+PC9leHRlbnNpb24+PC9mYW1pbHk+PGdpdmVuIHZhbHVlPSJNYXhpbWlsaWFuIj48L2dpdmVuPjxwcmVmaXggdmFsdWU9IkRyLiI+PGV4dGVuc2lvbiB1cmw9Imh0dHA6Ly9obDcub3JnL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9pc28yMTA5MC1FTi1xdWFsaWZpZXIiPjx2YWx1ZUNvZGUgdmFsdWU9IkFDIj48L3ZhbHVlQ29kZT48L2V4dGVuc2lvbj48L3ByZWZpeD48L25hbWU+PHF1YWxpZmljYXRpb24+PGNvZGU+PGNvZGluZz48c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL0NvZGVTeXN0ZW0vS0JWX0NTX0ZPUl9RdWFsaWZpY2F0aW9uX1R5cGUiPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSIwMCI+PC9jb2RlPjwvY29kaW5nPjwvY29kZT48L3F1YWxpZmljYXRpb24+PHF1YWxpZmljYXRpb24+PGNvZGU+PHRleHQgdmFsdWU9IkZhY2hhcnp0IGbDvHIgS2luZGVyLSB1bmQgSnVnZW5kbWVkaXppbiI+PC90ZXh0PjwvY29kZT48L3F1YWxpZmljYXRpb24+PC9QcmFjdGl0aW9uZXI+PC9yZXNvdXJjZT48L2VudHJ5PjxlbnRyeT48ZnVsbFVybCB2YWx1ZT0iaHR0cDovL3B2cy5wcmF4aXMubG9jYWwvZmhpci9Pcmdhbml6YXRpb24vZDJiMzBhNzAtOTgzMC00OTY4LWFiOTctNjg4NDcyYjZmOWEzIj48L2Z1bGxVcmw+PHJlc291cmNlPjxPcmdhbml6YXRpb24+PGlkIHZhbHVlPSJkMmIzMGE3MC05ODMwLTQ5NjgtYWI5Ny02ODg0NzJiNmY5YTMiPjwvaWQ+PG1ldGE+PHByb2ZpbGUgdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9LQlZfUFJfRk9SX09yZ2FuaXphdGlvbnwxLjAuMyI+PC9wcm9maWxlPjwvbWV0YT48aWRlbnRpZmllcj48dHlwZT48Y29kaW5nPjxzeXN0ZW0gdmFsdWU9Imh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjItMDIwMyI+PC9zeXN0ZW0+PGNvZGUgdmFsdWU9IkJTTlIiPjwvY29kZT48L2NvZGluZz48L3R5cGU+PHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9OYW1pbmdTeXN0ZW0vS0JWX05TX0Jhc2VfQlNOUiI+PC9zeXN0ZW0+PHZhbHVlIHZhbHVlPSI2ODc3Nzc3MDAiPjwvdmFsdWU+PC9pZGVudGlmaWVyPjxuYW1lIHZhbHVlPSJLaW5kZXJhcnp0cHJheGlzIj48L25hbWU+PHRlbGVjb20+PHN5c3RlbSB2YWx1ZT0icGhvbmUiPjwvc3lzdGVtPjx2YWx1ZSB2YWx1ZT0iMDk0MTEyMzQ1NjciPjwvdmFsdWU+PC90ZWxlY29tPjxhZGRyZXNzPjx0eXBlIHZhbHVlPSJib3RoIj48L3R5cGU+PGxpbmUgdmFsdWU9IllvcmNrc3RyYcOfZSAxNSI+PGV4dGVuc2lvbiB1cmw9Imh0dHA6Ly9obDcub3JnL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9pc28yMTA5MC1BRFhQLWhvdXNlTnVtYmVyIj48dmFsdWVTdHJpbmcgdmFsdWU9IjE1Ij48L3ZhbHVlU3RyaW5nPjwvZXh0ZW5zaW9uPjxleHRlbnNpb24gdXJsPSJodHRwOi8vaGw3Lm9yZy9maGlyL1N0cnVjdHVyZURlZmluaXRpb24vaXNvMjEwOTAtQURYUC1zdHJlZXROYW1lIj48dmFsdWVTdHJpbmcgdmFsdWU9IllvcmNrc3RyYcOfZSI+PC92YWx1ZVN0cmluZz48L2V4dGVuc2lvbj48L2xpbmU+PGxpbmUgdmFsdWU9IkhpbnRlcmhhdXMiPjxleHRlbnNpb24gdXJsPSJodHRwOi8vaGw3Lm9yZy9maGlyL1N0cnVjdHVyZURlZmluaXRpb24vaXNvMjEwOTAtQURYUC1hZGRpdGlvbmFsTG9jYXRvciI+PHZhbHVlU3RyaW5nIHZhbHVlPSJIaW50ZXJoYXVzIj48L3ZhbHVlU3RyaW5nPjwvZXh0ZW5zaW9uPjwvbGluZT48Y2l0eSB2YWx1ZT0iUmVnZW5zYnVyZyI+PC9jaXR5Pjxwb3N0YWxDb2RlIHZhbHVlPSI5MzA0OSI+PC9wb3N0YWxDb2RlPjxjb3VudHJ5IHZhbHVlPSJEIj48L2NvdW50cnk+PC9hZGRyZXNzPjwvT3JnYW5pemF0aW9uPjwvcmVzb3VyY2U+PC9lbnRyeT48ZW50cnk+PGZ1bGxVcmwgdmFsdWU9Imh0dHA6Ly9wdnMucHJheGlzLmxvY2FsL2ZoaXIvQ292ZXJhZ2UvZGYwZjI1MzYtOTdiOS00YmFlLTk5Y2MtODNiYTJlODM3MWU0Ij48L2Z1bGxVcmw+PHJlc291cmNlPjxDb3ZlcmFnZT48aWQgdmFsdWU9ImRmMGYyNTM2LTk3YjktNGJhZS05OWNjLTgzYmEyZTgzNzFlNCI+PC9pZD48bWV0YT48cHJvZmlsZSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL0tCVl9QUl9GT1JfQ292ZXJhZ2V8MS4wLjMiPjwvcHJvZmlsZT48L21ldGE+PGV4dGVuc2lvbiB1cmw9Imh0dHA6Ly9maGlyLmRlL1N0cnVjdHVyZURlZmluaXRpb24vZ2t2L2Jlc29uZGVyZS1wZXJzb25lbmdydXBwZSI+PHZhbHVlQ29kaW5nPjxzeXN0ZW0gdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvQ29kZVN5c3RlbS9LQlZfQ1NfU0ZISVJfS0JWX1BFUlNPTkVOR1JVUFBFIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iMDAiPjwvY29kZT48L3ZhbHVlQ29kaW5nPjwvZXh0ZW5zaW9uPjxleHRlbnNpb24gdXJsPSJodHRwOi8vZmhpci5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL2drdi9kbXAta2VubnplaWNoZW4iPjx2YWx1ZUNvZGluZz48c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL0NvZGVTeXN0ZW0vS0JWX0NTX1NGSElSX0tCVl9ETVAiPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSIwMCI+PC9jb2RlPjwvdmFsdWVDb2Rpbmc+PC9leHRlbnNpb24+PGV4dGVuc2lvbiB1cmw9Imh0dHA6Ly9maGlyLmRlL1N0cnVjdHVyZURlZmluaXRpb24vZ2t2L3dvcCI+PHZhbHVlQ29kaW5nPjxzeXN0ZW0gdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvQ29kZVN5c3RlbS9LQlZfQ1NfU0ZISVJfSVRBX1dPUCI+PC9zeXN0ZW0+PGNvZGUgdmFsdWU9IjcyIj48L2NvZGU+PC92YWx1ZUNvZGluZz48L2V4dGVuc2lvbj48ZXh0ZW5zaW9uIHVybD0iaHR0cDovL2ZoaXIuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9na3YvdmVyc2ljaGVydGVuYXJ0Ij48dmFsdWVDb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9Db2RlU3lzdGVtL0tCVl9DU19TRkhJUl9LQlZfVkVSU0lDSEVSVEVOU1RBVFVTIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iMyI+PC9jb2RlPjwvdmFsdWVDb2Rpbmc+PC9leHRlbnNpb24+PHN0YXR1cyB2YWx1ZT0iYWN0aXZlIj48L3N0YXR1cz48dHlwZT48Y29kaW5nPjxzeXN0ZW0gdmFsdWU9Imh0dHA6Ly9maGlyLmRlL0NvZGVTeXN0ZW0vdmVyc2ljaGVydW5nc2FydC1kZS1iYXNpcyI+PC9zeXN0ZW0+PGNvZGUgdmFsdWU9IkdLViI+PC9jb2RlPjwvY29kaW5nPjwvdHlwZT48YmVuZWZpY2lhcnk+PHJlZmVyZW5jZSB2YWx1ZT0iUGF0aWVudC81MTJhYjViYy1hN2FiLTRmZDctODFjYy0xNmE1OTRmNzQ3YTYiPjwvcmVmZXJlbmNlPjwvYmVuZWZpY2lhcnk+PHBlcmlvZD48ZW5kIHZhbHVlPSIyMDQwLTA0LTAxIj48L2VuZD48L3BlcmlvZD48cGF5b3I+PGlkZW50aWZpZXI+PHN5c3RlbSB2YWx1ZT0iaHR0cDovL2ZoaXIuZGUvTmFtaW5nU3lzdGVtL2FyZ2UtaWsvaWtuciI+PC9zeXN0ZW0+PHZhbHVlIHZh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 -Okt. 11, 2021 3:48:25 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: ProxySelector Request for http://localhost:8080/workflow/update -Okt. 11, 2021 3:48:25 NACHM. sun.net.www.http.HttpClient logFinest -AM FEINSTEN: KeepAlive stream retrieved from the cache, sun.net.www.http.HttpClient(http://localhost:8080/workflow/sign) -Okt. 11, 2021 3:48:25 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: Proxy used: DIRECT -Okt. 11, 2021 3:48:25 NACHM. sun.net.www.protocol.http.HttpURLConnection writeRequests -FEIN: sun.net.www.MessageHeader@1be59f287 pairs: {POST /workflow/update HTTP/1.1: null}{Accept: text/plain}{Content-Type: application/json}{User-Agent: Java/11.0.11}{Host: localhost:8080}{Connection: keep-alive}{Content-Length: 20984} -Okt. 11, 2021 3:48:25 NACHM. sun.net.www.protocol.http.HttpURLConnection getInputStream0 -FEIN: sun.net.www.MessageHeader@2ce45a7b2 pairs: {null: HTTP/1.1 200 OK}{Content-Length: 0} -[{"accessCode":"309b58453e4e39f88ab4e599580bf5953a2f0d68c45765df7c036c32380ce7f6","mimeType":"application/xml","bundle":"\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n <custodian>\r\n <reference value=\"Organization/d2b30a70-9830-4968-ab97-688472b6f9a3\" />\r\n </custodian>\r\n <section>\r\n <code>\r\n <coding>\r\n <system value=\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type\" />\r\n <code value=\"Prescription\" />\r\n </coding>\r\n </code>\r\n <entry>\r\n <!-- Referenz auf Verordnung (MedicationRequest) -->\r\n <reference value=\"MedicationRequest/06dc1594-509a-4f4c-ada7-dfd477a02d86\" />\r\n </entry>\r\n </section>\r\n <section>\r\n <code>\r\n <coding>\r\n <system value=\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type\" />\r\n <code value=\"Coverage\" />\r\n </coding>\r\n </code>\r\n <entry>\r\n <!-- Referenz auf Krankenkasse/Kostenträger -->\r\n <reference value=\"Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4\" />\r\n </entry>\r\n </section>\r\n </Composition>\r\n </resource>\r\n </entry>\r\n <entry>\r\n <fullUrl value=\"http://pvs.praxis.local/fhir/MedicationRequest/06dc1594-509a-4f4c-ada7-dfd477a02d86\" />\r\n <resource>\r\n <MedicationRequest xmlns=\"http://hl7.org/fhir\">\r\n <!--Beispiel MedicationRequest für eine PZN-Verordnung -->\r\n <id value=\"06dc1594-509a-4f4c-ada7-dfd477a02d86\" />\r\n <meta>\r\n <profile value=\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.0.1\" />\r\n </meta>\r\n <extension url=\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_StatusCoPayment\">\r\n <valueCoding>\r\n <system value=\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_StatusCoPayment\" />\r\n <code value=\"1\" />\r\n </valueCoding>\r\n </extension>\r\n <extension url=\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee\">\r\n <valueBoolean value=\"false\" />\r\n </extension>\r\n <extension url=\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG\">\r\n <valueBoolean value=\"false\" />\r\n </extension>\r\n <extension url=\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription\">\r\n <extension url=\"Kennzeichen\">\r\n <valueBoolean value=\"false\" />\r\n </extension>\r\n </extension>\r\n <status value=\"active\" />\r\n <intent value=\"order\" />\r\n <medicationReference>\r\n <reference value=\"Medication/f568397d-7ba2-46ac-904b-02caec933b42\" />\r\n </medicationReference>\r\n <subject>\r\n <reference value=\"Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6\" />\r\n </subject>\r\n <authoredOn value=\"2020-04-06\" />\r\n <requester>\r\n <reference value=\"Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359\" />\r\n </requester>\r\n <insurance>\r\n <reference value=\"Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4\" />\r\n </insurance>\r\n <dosageInstruction>\r\n <extension url=\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag\">\r\n <valueBoolean value=\"true\" />\r\n </extension>\r\n <text value=\"2mal tägl. 5ml\" />\r\n </dosageInstruction>\r\n <dispenseRequest>\r\n <quantity>\r\n <value value=\"1\" />\r\n <system value=\"http://unitsofmeasure.org\" />\r\n <code value=\"{Package}\" />\r\n </quantity>\r\n </dispenseRequest>\r\n <substitution>\r\n <allowedBoolean value=\"true\" />\r\n </substitution>\r\n </MedicationRequest>\r\n </resource>\r\n </entry>\r\n <entry>\r\n <fullUrl value=\"http://pvs.praxis.local/fhir/Medication/f568397d-7ba2-46ac-904b-02caec933b42\" />\r\n <resource>\r\n <Medication xmlns=\"http://hl7.org/fhir\">\r\n <id value=\"f568397d-7ba2-46ac-904b-02caec933b42\" />\r\n <meta>\r\n <profile value=\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_PZN|1.0.1\" />\r\n </meta>\r\n <extension url=\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category\">\r\n <valueCoding>\r\n <system value=\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category\" />\r\n <code value=\"00\" />\r\n </valueCoding>\r\n </extension>\r\n <extension url=\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine\">\r\n <valueBoolean value=\"false\" />\r\n </extension>\r\n <extension url=\"http://fhir.de/StructureDefinition/normgroesse\">\r\n <valueCode value=\"N1\" />\r\n </extension>\r\n <code>\r\n <coding>\r\n <system value=\"http://fhir.de/CodeSystem/ifa/pzn\" />\r\n <code value=\"08585997\" />\r\n </coding>\r\n <text value=\"Prospan® Hustensaft 100ml N1\" />\r\n </code>\r\n <form>\r\n <coding>\r\n <system value=\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DARREICHUNGSFORM\" />\r\n <code value=\"FLE\" />\r\n </coding>\r\n </form>\r\n </Medication>\r\n </resource>\r\n </entry>\r\n <entry>\r\n <fullUrl value=\"http://pvs.praxis.local/fhir/Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6\" />\r\n <resource>\r\n <Patient xmlns=\"http://hl7.org/fhir\">\r\n <id value=\"512ab5bc-a7ab-4fd7-81cc-16a594f747a6\" />\r\n <meta>\r\n <profile value=\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.0.3\" />\r\n </meta>\r\n <identifier>\r\n <type>\r\n <coding>\r\n <system value=\"http://fhir.de/CodeSystem/identifier-type-de-basis\" />\r\n <code value=\"GKV\" />\r\n </coding>\r\n </type>\r\n <system value=\"http://fhir.de/NamingSystem/gkv/kvid-10\" />\r\n <value value=\"M310119800\" />\r\n </identifier>\r\n <name>\r\n <use value=\"official\" />\r\n <family value=\"Erbprinzessin von und zu der Schimmelpfennig-Hammerschmidt Federmannssohn\">\r\n <extension url=\"http://fhir.de/StructureDefinition/humanname-namenszusatz\">\r\n <valueString value=\"Erbprinzessin\" />\r\n </extension>\r\n <extension url=\"http://hl7.org/fhir/StructureDefinition/humanname-own-prefix\">\r\n <valueString value=\"von und zu der\" />\r\n </extension>\r\n <extension url=\"http://hl7.org/fhir/StructureDefinition/humanname-own-name\">\r\n <valueString value=\"Schimmelpfennig-Hammerschmidt Federmannssohn\" />\r\n </extension>\r\n </family>\r\n <given value=\"Ingrid\" />\r\n </name>\r\n <birthDate value=\"2010-01-31\" />\r\n <address>\r\n <type value=\"both\" />\r\n <line value=\"Anneliese- und Georg-von-Groscurth-Plaetzchen 149-C\">\r\n <extension url=\"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber\">\r\n <valueString value=\"149-C\" />\r\n </extension>\r\n <extension url=\"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName\">\r\n <valueString value=\"Anneliese- und Georg-von-Groscurth-Plaetzchen\" />\r\n </extension>\r\n </line>\r\n <line value=\"5. OG - Hinterhof\">\r\n <extension url=\"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator\">\r\n <valueString value=\"5. OG - Hinterhof\" />\r\n </extension>\r\n </line>\r\n <city value=\"Bad Homburg\" />\r\n <postalCode value=\"60437\" />\r\n <country value=\"D\" />\r\n </address>\r\n </Patient>\r\n </resource>\r\n </entry>\r\n <entry>\r\n <fullUrl value=\"http://pvs.praxis.local/fhir/Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359\" />\r\n <resource>\r\n <Practitioner xmlns=\"http://hl7.org/fhir\">\r\n <id value=\"e33d2afd-44c8-462b-80e5-52dbe5ebf359\" />\r\n <meta>\r\n <profile value=\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.0.3\" />\r\n </meta>\r\n <identifier>\r\n <type>\r\n <coding>\r\n <system value=\"http://terminology.hl7.org/CodeSystem/v2-0203\" />\r\n <code value=\"LANR\" />\r\n </coding>\r\n </type>\r\n <system value=\"https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR\" />\r\n <value value=\"456456534\" />\r\n </identifier>\r\n <name>\r\n <use value=\"official\" />\r\n <family value=\"Weber\">\r\n <extension url=\"http://hl7.org/fhir/StructureDefinition/humanname-own-name\">\r\n <valueString value=\"Weber\" />\r\n </extension>\r\n </family>\r\n <given value=\"Maximilian\" />\r\n <prefix value=\"Dr.\">\r\n <extension url=\"http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier\">\r\n <valueCode value=\"AC\" />\r\n </extension>\r\n </prefix>\r\n </name>\r\n <qualification>\r\n <code>\r\n <coding>\r\n <system value=\"https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type\" />\r\n <code value=\"00\" />\r\n </coding>\r\n </code>\r\n </qualification>\r\n <qualification>\r\n <code>\r\n <text value=\"Facharzt für Kinder- und Jugendmedizin\" />\r\n </code>\r\n </qualification>\r\n </Practitioner>\r\n </resource>\r\n </entry>\r\n <entry>\r\n <fullUrl value=\"http://pvs.praxis.local/fhir/Organization/d2b30a70-9830-4968-ab97-688472b6f9a3\" />\r\n <resource>\r\n <Organization xmlns=\"http://hl7.org/fhir\">\r\n <id value=\"d2b30a70-9830-4968-ab97-688472b6f9a3\" />\r\n <meta>\r\n <profile value=\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.0.3\" />\r\n </meta>\r\n <identifier>\r\n <type>\r\n <coding>\r\n <system value=\"http://terminology.hl7.org/CodeSystem/v2-0203\" />\r\n <code value=\"BSNR\" />\r\n </coding>\r\n </type>\r\n <system value=\"https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR\" />\r\n <value value=\"687777700\" />\r\n </identifier>\r\n <name value=\"Kinderarztpraxis\" />\r\n <telecom>\r\n <system value=\"phone\" />\r\n <value value=\"09411234567\" />\r\n </telecom>\r\n <address>\r\n <type value=\"both\" />\r\n <line value=\"Yorckstraße 15\">\r\n <extension url=\"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber\">\r\n <valueString value=\"15\" />\r\n </extension>\r\n <extension url=\"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName\">\r\n <valueString value=\"Yorckstraße\" />\r\n </extension>\r\n </line>\r\n <line value=\"Hinterhaus\">\r\n <extension url=\"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator\">\r\n <valueString value=\"Hinterhaus\" />\r\n </extension>\r\n </line>\r\n <city value=\"Regensburg\" />\r\n <postalCode value=\"93049\" />\r\n <country value=\"D\" />\r\n </address>\r\n </Organization>\r\n </resource>\r\n </entry>\r\n <entry>\r\n <fullUrl value=\"http://pvs.praxis.local/fhir/Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4\" />\r\n <resource>\r\n <Coverage xmlns=\"http://hl7.org/fhir\">\r\n <id value=\"df0f2536-97b9-4bae-99cc-83ba2e8371e4\" />\r\n <meta>\r\n <profile value=\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.0.3\" />\r\n </meta>\r\n <extension url=\"http://fhir.de/StructureDefinition/gkv/besondere-personengruppe\">\r\n <valueCoding>\r\n <system value=\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE\" />\r\n <code value=\"00\" />\r\n </valueCoding>\r\n </extension>\r\n <extension url=\"http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen\">\r\n <valueCoding>\r\n <system value=\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP\" />\r\n <code value=\"00\" />\r\n </valueCoding>\r\n </extension>\r\n <extension url=\"http://fhir.de/StructureDefinition/gkv/wop\">\r\n <valueCoding>\r\n <system value=\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP\" />\r\n <code value=\"72\" />\r\n </valueCoding>\r\n </extension>\r\n <extension url=\"http://fhir.de/StructureDefinition/gkv/versichertenart\">\r\n <valueCoding>\r\n <system value=\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS\" />\r\n <code value=\"3\" />\r\n </valueCoding>\r\n </extension>\r\n <status value=\"active\" />\r\n <type>\r\n <coding>\r\n <system value=\"http://fhir.de/CodeSystem/versicherungsart-de-basis\" />\r\n <code value=\"GKV\" />\r\n </coding>\r\n </type>\r\n <beneficiary>\r\n <reference value=\"Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6\" />\r\n </beneficiary>\r\n <period>\r\n <end value=\"2040-04-01\" />\r\n </period>\r\n <payor>\r\n <identifier>\r\n <system value=\"http://fhir.de/NamingSystem/arge-ik/iknr\" />\r\n <value value=\"108416214\" />\r\n </identifier>\r\n <display value=\"AOK Bayern\" />\r\n </payor>\r\n </Coverage>\r\n </resource>\r\n </entry>\r\n</Bundle>"}] -Okt. 11, 2021 3:48:25 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: ProxySelector Request for http://localhost:8080/document/bundles -Okt. 11, 2021 3:48:25 NACHM. sun.net.www.http.HttpClient logFinest -AM FEINSTEN: KeepAlive stream retrieved from the cache, sun.net.www.http.HttpClient(http://localhost:8080/workflow/update) -Okt. 11, 2021 3:48:25 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: Proxy used: DIRECT -Okt. 11, 2021 3:48:25 NACHM. sun.net.www.protocol.http.HttpURLConnection writeRequests -FEIN: sun.net.www.MessageHeader@7318daf87 pairs: {POST /document/bundles HTTP/1.1: null}{Accept: application/pdf}{Content-Type: application/json}{User-Agent: Java/11.0.11}{Host: localhost:8080}{Connection: keep-alive}{Content-Length: 16524} -Okt. 11, 2021 3:48:27 NACHM. sun.net.www.protocol.http.HttpURLConnection getInputStream0 -FEIN: sun.net.www.MessageHeader@70f313223 pairs: {null: HTTP/1.1 200 OK}{Content-Type: application/pdf}{Transfer-Encoding: chunked} -Okt. 11, 2021 3:48:27 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: ProxySelector Request for http://localhost:8080/workflow/abort -Okt. 11, 2021 3:48:27 NACHM. sun.net.www.http.HttpClient logFinest -AM FEINSTEN: KeepAlive stream retrieved from the cache, sun.net.www.http.HttpClient(http://localhost:8080/document/bundles) -Okt. 11, 2021 3:48:27 NACHM. sun.net.www.protocol.http.HttpURLConnection plainConnect0 -AM FEINSTEN: Proxy used: DIRECT -Okt. 11, 2021 3:48:27 NACHM. sun.net.www.protocol.http.HttpURLConnection writeRequests -FEIN: sun.net.www.MessageHeader@7a7cc52c7 pairs: {POST /workflow/abort HTTP/1.1: null}{Accept: text/plain}{Content-Type: application/json}{User-Agent: Java/11.0.11}{Host: localhost:8080}{Connection: keep-alive}{Content-Length: 115} -Okt. 11, 2021 3:48:27 NACHM. sun.net.www.protocol.http.HttpURLConnection getInputStream0 -FEIN: sun.net.www.MessageHeader@5853495b2 pairs: {null: HTTP/1.1 200 OK}{Content-Length: 0} diff --git a/openapi/openapi.json b/openapi/openapi.json index c1d94ae4b..3f4d6b7bf 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -1,12 +1,121 @@ { "openapi" : "3.0.3", "info" : { - "title" : "Generated API", - "version" : "1.0" + "title" : "ere-ps-app API", + "version" : "1.0.0-SNAPSHOT" }, "paths" : { + "/card/change-pin" : { + "post" : { + "tags" : [ "Card Resource" ], + "requestBody" : { + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/ChangePinParameter" + } + } + } + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/ChangePinResponse" + } + } + } + } + } + } + }, + "/card/pin-status" : { + "get" : { + "tags" : [ "Card Resource" ], + "parameters" : [ { + "name" : "cardHandle", + "in" : "query", + "schema" : { + "type" : "string" + } + }, { + "name" : "pinType", + "in" : "query", + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/GetPinStatusResponse" + } + } + } + } + } + } + }, + "/card/unblock-pin" : { + "post" : { + "tags" : [ "Card Resource" ], + "requestBody" : { + "content" : { + "text/plain" : { + "schema" : { + "type" : "string" + } + } + } + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/UnblockPinResponse" + } + } + } + } + } + } + }, + "/card/verify-pin" : { + "post" : { + "tags" : [ "Card Resource" ], + "requestBody" : { + "content" : { + "text/plain" : { + "schema" : { + "type" : "string" + } + } + } + }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/VerifyPinResponse" + } + } + } + } + } + } + }, "/config" : { "get" : { + "tags" : [ "User Configurations Resource" ], "responses" : { "200" : { "description" : "OK" @@ -14,6 +123,7 @@ } }, "put" : { + "tags" : [ "User Configurations Resource" ], "requestBody" : { "content" : { "application/json" : { @@ -32,9 +142,10 @@ }, "/document/bundles" : { "post" : { + "tags" : [ "Document Resource" ], "requestBody" : { "content" : { - "application/json" : { + "text/plain" : { "schema" : { "type" : "string" } @@ -48,21 +159,14 @@ } } }, - "/ipp/{queue}" : { + "/kbv/transform" : { "post" : { - "parameters" : [ { - "name" : "queue", - "in" : "path", - "required" : true, - "schema" : { - "type" : "string" - } - } ], + "tags" : [ "XSLT Resource" ], "requestBody" : { "content" : { - "application/json" : { + "text/plain" : { "schema" : { - "$ref" : "#/components/schemas/InputStream" + "type" : "string" } } } @@ -74,17 +178,89 @@ } } }, - "/kbv/transform" : { + "/pharmacy/Accept" : { + "get" : { + "tags" : [ "Pharmacy Resource" ], + "parameters" : [ { + "name" : "token", + "in" : "query", + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Bundle" + } + } + } + } + } + } + }, + "/pharmacy/Task" : { + "get" : { + "tags" : [ "Pharmacy Resource" ], + "parameters" : [ { + "name" : "egkHandle", + "in" : "query", + "schema" : { + "type" : "string" + } + }, { + "name" : "smcbHandle", + "in" : "query", + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/Bundle" + } + } + } + } + } + } + }, + "/preview/generate" : { "post" : { + "tags" : [ "Preview Resource" ], "requestBody" : { "content" : { - "application/json" : { + "text/plain" : { "schema" : { "type" : "string" } } } }, + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "text/plain" : { + "schema" : { + "type" : "string" + } + } + } + } + } + } + }, + "/status" : { + "get" : { + "tags" : [ "Status Resource" ], "responses" : { "200" : { "description" : "OK" @@ -94,6 +270,7 @@ }, "/validate" : { "post" : { + "tags" : [ "Prescription Bundle Validator Resource" ], "requestBody" : { "content" : { "application/xml" : { @@ -103,7 +280,10 @@ }, "application/json" : { "schema" : { - "type" : "object" + "type" : "object", + "additionalProperties" : { + "$ref" : "#/components/schemas/JsonValue" + } } } } @@ -117,6 +297,7 @@ }, "/workflow/abort" : { "post" : { + "tags" : [ "E Rezept Workflow Resource" ], "requestBody" : { "content" : { "application/json" : { @@ -135,9 +316,10 @@ }, "/workflow/batch-sign" : { "post" : { + "tags" : [ "E Rezept Workflow Resource" ], "requestBody" : { "content" : { - "application/json" : { + "text/plain" : { "schema" : { "type" : "string" } @@ -153,6 +335,7 @@ }, "/workflow/cards" : { "get" : { + "tags" : [ "E Rezept Workflow Resource" ], "responses" : { "200" : { "description" : "OK", @@ -169,6 +352,7 @@ }, "/workflow/comfortsignature/activate" : { "post" : { + "tags" : [ "E Rezept Workflow Resource" ], "responses" : { "200" : { "description" : "OK" @@ -178,6 +362,7 @@ }, "/workflow/comfortsignature/deactivate" : { "post" : { + "tags" : [ "E Rezept Workflow Resource" ], "responses" : { "200" : { "description" : "OK" @@ -187,6 +372,7 @@ }, "/workflow/comfortsignature/user-id" : { "get" : { + "tags" : [ "E Rezept Workflow Resource" ], "responses" : { "200" : { "description" : "OK" @@ -194,9 +380,10 @@ } }, "post" : { + "tags" : [ "E Rezept Workflow Resource" ], "requestBody" : { "content" : { - "application/json" : { + "text/plain" : { "schema" : { "type" : "string" } @@ -210,11 +397,29 @@ } } }, + "/workflow/idp-token" : { + "get" : { + "tags" : [ "E Rezept Workflow Resource" ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "text/plain" : { + "schema" : { + "type" : "string" + } + } + } + } + } + } + }, "/workflow/sign" : { "post" : { + "tags" : [ "E Rezept Workflow Resource" ], "requestBody" : { "content" : { - "application/json" : { + "text/plain" : { "schema" : { "type" : "string" } @@ -228,8 +433,43 @@ } } }, + "/workflow/signature-mode" : { + "get" : { + "tags" : [ "E Rezept Workflow Resource" ], + "responses" : { + "200" : { + "description" : "OK", + "content" : { + "application/json" : { + "schema" : { + "$ref" : "#/components/schemas/GetSignatureModeResponseEvent" + } + } + } + } + } + } + }, "/workflow/task" : { "post" : { + "tags" : [ "E Rezept Workflow Resource" ], + "parameters" : [ { + "name" : "flowtype", + "in" : "query", + "schema" : { + "type" : "string" + } + } ], + "responses" : { + "200" : { + "description" : "OK" + } + } + } + }, + "/workflow/test-prescription" : { + "post" : { + "tags" : [ "E Rezept Workflow Resource" ], "responses" : { "200" : { "description" : "OK" @@ -239,6 +479,7 @@ }, "/workflow/update" : { "post" : { + "tags" : [ "E Rezept Workflow Resource" ], "requestBody" : { "content" : { "application/json" : { @@ -257,9 +498,10 @@ }, "/xmlPrescription" : { "post" : { + "tags" : [ "Xml Prescription Resource" ], "requestBody" : { "content" : { - "application/json" : { + "text/plain" : { "schema" : { "type" : "string" } @@ -279,425 +521,6068 @@ "AbortERezept" : { "type" : "object", "properties" : { - "accessCode" : { + "taskId" : { "type" : "string" }, - "taskId" : { + "accessCode" : { "type" : "string" } } }, - "CardInfoType" : { + "Address" : { "type" : "object", "properties" : { - "cardHandle" : { - "type" : "string", - "xml" : { - "name" : "CardHandle" + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" } }, - "cardType" : { - "allOf" : [ { - "$ref" : "#/components/schemas/CardTypeType" - }, { - "xml" : { - "name" : "CardType" - } - } ] + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } }, - "cardVersion" : { - "allOf" : [ { - "$ref" : "#/components/schemas/CardVersion" - }, { - "xml" : { - "name" : "CardVersion" - } - } ] + "userData" : { + "type" : "object", + "additionalProperties" : { } }, - "iccsn" : { - "type" : "string", - "xml" : { - "name" : "Iccsn" - } + "primitive" : { + "type" : "boolean" }, - "ctId" : { - "type" : "string", - "xml" : { - "name" : "CtId" - } + "booleanPrimitive" : { + "type" : "boolean" }, - "slotId" : { - "type" : "integer", - "xml" : { - "name" : "SlotId" - } + "dateTime" : { + "type" : "boolean" }, - "insertTime" : { - "allOf" : [ { - "$ref" : "#/components/schemas/XMLGregorianCalendar" - }, { - "xml" : { - "name" : "InsertTime" - } - } ] + "metadataBased" : { + "type" : "boolean" }, - "cardHolderName" : { - "type" : "string", - "xml" : { - "name" : "CardHolderName" - } + "resource" : { + "type" : "boolean" }, - "kvnr" : { - "type" : "string", - "xml" : { - "name" : "Kvnr" - } + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" }, - "certificateExpirationDate" : { - "allOf" : [ { + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "use" : { + "$ref" : "#/components/schemas/EnumerationAddressUse" + }, + "type" : { + "$ref" : "#/components/schemas/EnumerationAddressType" + }, + "text" : { + "$ref" : "#/components/schemas/StringType" + }, + "line" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/StringType" + } + }, + "city" : { + "$ref" : "#/components/schemas/StringType" + }, + "district" : { + "$ref" : "#/components/schemas/StringType" + }, + "state" : { + "$ref" : "#/components/schemas/StringType" + }, + "postalCode" : { + "$ref" : "#/components/schemas/StringType" + }, + "country" : { + "$ref" : "#/components/schemas/StringType" + }, + "period" : { + "$ref" : "#/components/schemas/Period" + }, + "useElement" : { + "$ref" : "#/components/schemas/EnumerationAddressUse" + }, + "typeElement" : { + "$ref" : "#/components/schemas/EnumerationAddressType" + }, + "textElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "cityElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "districtElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "stateElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "postalCodeElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "countryElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "AddressType" : { + "enum" : [ "POSTAL", "PHYSICAL", "BOTH", "NULL" ], + "type" : "string" + }, + "AddressUse" : { + "enum" : [ "HOME", "WORK", "TEMP", "OLD", "BILLING", "NULL" ], + "type" : "string" + }, + "Base64BinaryType" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "format" : "binary", + "type" : "string", + "items" : { + "format" : "byte", + "type" : "string" + } + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myValue" : { + "format" : "binary", + "type" : "string" + }, + "valueAsString" : { + "type" : "string" + }, + "value" : { + "format" : "binary", + "type" : "string" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "BaseCalendar" : { + "type" : "object", + "properties" : { + "name" : { + "type" : "string" + }, + "eras" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Era" + } + }, + "calendarDate" : { + "$ref" : "#/components/schemas/CalendarDate" + } + } + }, + "BaseDateTimeType" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "valueAsString" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/Date" + }, + "myStringValue" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/Date" + }, + "empty" : { + "type" : "boolean" + }, + "primitive" : { + "type" : "boolean" + }, + "myFractionalSeconds" : { + "type" : "string" + }, + "myPrecision" : { + "$ref" : "#/components/schemas/TemporalPrecisionEnum" + }, + "myTimeZone" : { + "$ref" : "#/components/schemas/TimeZone" + }, + "myTimeZoneZulu" : { + "type" : "boolean" + }, + "day" : { + "format" : "int32", + "type" : "integer" + }, + "defaultPrecisionForDatatype" : { + "$ref" : "#/components/schemas/TemporalPrecisionEnum" + }, + "hour" : { + "format" : "int32", + "type" : "integer" + }, + "millis" : { + "format" : "int32", + "type" : "integer" + }, + "minute" : { + "format" : "int32", + "type" : "integer" + }, + "month" : { + "format" : "int32", + "type" : "integer" + }, + "secondsMilli" : { + "format" : "float", + "type" : "number" + }, + "nanos" : { + "format" : "int64", + "type" : "integer" + }, + "precision" : { + "$ref" : "#/components/schemas/TemporalPrecisionEnum" + }, + "second" : { + "format" : "int32", + "type" : "integer" + }, + "timeZone" : { + "$ref" : "#/components/schemas/TimeZone" + }, + "valueAsCalendar" : { + "$ref" : "#/components/schemas/GregorianCalendar" + }, + "year" : { + "format" : "int32", + "type" : "integer" + }, + "timeZoneZulu" : { + "type" : "boolean" + }, + "today" : { + "type" : "boolean" + }, + "valueAsV3String" : { + "type" : "string" + }, + "dateTime" : { + "type" : "boolean" + }, + "highEdge" : { + "$ref" : "#/components/schemas/BaseDateTimeType" + } + } + }, + "BooleanType" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "type" : "boolean" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + } + } + }, + "Bundle" : { + "type" : "object", + "properties" : { + "meta" : { + "$ref" : "#/components/schemas/IBaseMetaType" + }, + "idElement" : { + "$ref" : "#/components/schemas/IIdType" + }, + "structureFhirVersionEnum" : { + "$ref" : "#/components/schemas/FhirVersionEnum" + }, + "deleted" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "resource" : { + "type" : "boolean" + }, + "id" : { + "$ref" : "#/components/schemas/IdType" + }, + "implicitRules" : { + "$ref" : "#/components/schemas/UriType" + }, + "language" : { + "$ref" : "#/components/schemas/CodeType" + }, + "idPart" : { + "type" : "string" + }, + "implicitRulesElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "languageElement" : { + "$ref" : "#/components/schemas/CodeType" + }, + "idBase" : { + "type" : "string" + }, + "identifier" : { + "$ref" : "#/components/schemas/Identifier" + }, + "type" : { + "$ref" : "#/components/schemas/EnumerationBundleType" + }, + "timestamp" : { + "$ref" : "#/components/schemas/InstantType" + }, + "total" : { + "$ref" : "#/components/schemas/UnsignedIntType" + }, + "link" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/BundleLinkComponent" + } + }, + "entry" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/BundleEntryComponent" + } + }, + "signature" : { + "$ref" : "#/components/schemas/Signature" + }, + "typeElement" : { + "$ref" : "#/components/schemas/EnumerationBundleType" + }, + "timestampElement" : { + "$ref" : "#/components/schemas/InstantType" + }, + "totalElement" : { + "$ref" : "#/components/schemas/UnsignedIntType" + }, + "linkFirstRep" : { + "$ref" : "#/components/schemas/BundleLinkComponent" + }, + "entryFirstRep" : { + "$ref" : "#/components/schemas/BundleEntryComponent" + }, + "empty" : { + "type" : "boolean" + }, + "resourceType" : { + "$ref" : "#/components/schemas/ResourceType" + } + } + }, + "BundleEntryComponent" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "modifierExtension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "modifierExtensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "link" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/BundleLinkComponent" + } + }, + "fullUrl" : { + "$ref" : "#/components/schemas/UriType" + }, + "resource" : { + "$ref" : "#/components/schemas/Resource" + }, + "search" : { + "$ref" : "#/components/schemas/BundleEntrySearchComponent" + }, + "request" : { + "$ref" : "#/components/schemas/BundleEntryRequestComponent" + }, + "response" : { + "$ref" : "#/components/schemas/BundleEntryResponseComponent" + }, + "linkFirstRep" : { + "$ref" : "#/components/schemas/BundleLinkComponent" + }, + "fullUrlElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "BundleEntryRequestComponent" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "modifierExtension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "modifierExtensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "method" : { + "$ref" : "#/components/schemas/EnumerationHTTPVerb" + }, + "url" : { + "$ref" : "#/components/schemas/UriType" + }, + "ifNoneMatch" : { + "$ref" : "#/components/schemas/StringType" + }, + "ifModifiedSince" : { + "$ref" : "#/components/schemas/InstantType" + }, + "ifMatch" : { + "$ref" : "#/components/schemas/StringType" + }, + "ifNoneExist" : { + "$ref" : "#/components/schemas/StringType" + }, + "methodElement" : { + "$ref" : "#/components/schemas/EnumerationHTTPVerb" + }, + "urlElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "ifNoneMatchElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "ifModifiedSinceElement" : { + "$ref" : "#/components/schemas/InstantType" + }, + "ifMatchElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "ifNoneExistElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "BundleEntryResponseComponent" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "modifierExtension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "modifierExtensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "status" : { + "$ref" : "#/components/schemas/StringType" + }, + "location" : { + "$ref" : "#/components/schemas/UriType" + }, + "etag" : { + "$ref" : "#/components/schemas/StringType" + }, + "lastModified" : { + "$ref" : "#/components/schemas/InstantType" + }, + "outcome" : { + "$ref" : "#/components/schemas/Resource" + }, + "statusElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "locationElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "etagElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "lastModifiedElement" : { + "$ref" : "#/components/schemas/InstantType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "BundleEntrySearchComponent" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "modifierExtension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "modifierExtensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "mode" : { + "$ref" : "#/components/schemas/EnumerationSearchEntryMode" + }, + "score" : { + "$ref" : "#/components/schemas/DecimalType" + }, + "modeElement" : { + "$ref" : "#/components/schemas/EnumerationSearchEntryMode" + }, + "scoreElement" : { + "$ref" : "#/components/schemas/DecimalType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "BundleLinkComponent" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "modifierExtension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "modifierExtensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "relation" : { + "$ref" : "#/components/schemas/StringType" + }, + "url" : { + "$ref" : "#/components/schemas/UriType" + }, + "relationElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "urlElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "BundleType" : { + "enum" : [ "DOCUMENT", "MESSAGE", "TRANSACTION", "TRANSACTIONRESPONSE", "BATCH", "BATCHRESPONSE", "HISTORY", "SEARCHSET", "COLLECTION", "NULL" ], + "type" : "string" + }, + "CalendarDate" : { + "type" : "object", + "properties" : { + "era" : { + "$ref" : "#/components/schemas/Era" + }, + "year" : { + "format" : "int32", + "type" : "integer" + }, + "month" : { + "format" : "int32", + "type" : "integer" + }, + "dayOfMonth" : { + "format" : "int32", + "type" : "integer" + }, + "dayOfWeek" : { + "format" : "int32", + "type" : "integer" + }, + "leapYear" : { + "type" : "boolean" + }, + "hours" : { + "format" : "int32", + "type" : "integer" + }, + "minutes" : { + "format" : "int32", + "type" : "integer" + }, + "seconds" : { + "format" : "int32", + "type" : "integer" + }, + "millis" : { + "format" : "int32", + "type" : "integer" + }, + "fraction" : { + "format" : "int64", + "type" : "integer" + }, + "normalized" : { + "type" : "boolean" + }, + "zoneinfo" : { + "$ref" : "#/components/schemas/TimeZone" + }, + "zoneOffset" : { + "format" : "int32", + "type" : "integer" + }, + "daylightSaving" : { + "format" : "int32", + "type" : "integer" + }, + "forceStandardTime" : { + "type" : "boolean" + }, + "locale" : { + "$ref" : "#/components/schemas/Locale" + }, + "timeOfDay" : { + "format" : "int64", + "type" : "integer" + }, + "standardTime" : { + "type" : "boolean" + }, + "daylightTime" : { + "type" : "boolean" + }, + "zone" : { + "$ref" : "#/components/schemas/TimeZone" + } + } + }, + "CanonicalType" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "type" : "string" + }, + "myStringValue" : { + "type" : "string" + }, + "value" : { + "type" : "string" + }, + "valueAsString" : { + "type" : "string" + }, + "empty" : { + "type" : "boolean" + }, + "primitive" : { + "type" : "boolean" + } + } + }, + "CardInfoType" : { + "type" : "object", + "properties" : { + "cardHandle" : { + "type" : "string", + "xml" : { + "name" : "CardHandle" + } + }, + "cardType" : { + "type" : "string", + "allOf" : [ { + "$ref" : "#/components/schemas/CardTypeType" + } ], + "xml" : { + "name" : "CardType" + } + }, + "cardVersion" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/CardVersion" + } ], + "xml" : { + "name" : "CardVersion" + } + }, + "iccsn" : { + "type" : "string", + "xml" : { + "name" : "Iccsn" + } + }, + "ctId" : { + "type" : "string", + "xml" : { + "name" : "CtId" + } + }, + "slotId" : { + "type" : "integer", + "xml" : { + "name" : "SlotId" + } + }, + "insertTime" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/XMLGregorianCalendar" + } ], + "xml" : { + "name" : "InsertTime" + } + }, + "cardHolderName" : { + "type" : "string", + "xml" : { + "name" : "CardHolderName" + } + }, + "kvnr" : { + "type" : "string", + "xml" : { + "name" : "Kvnr" + } + }, + "certificateExpirationDate" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/XMLGregorianCalendar" + } ], + "xml" : { + "name" : "CertificateExpirationDate" + } + } + } + }, + "CardTypeType" : { + "enum" : [ "EGK", "HBA_Q_SIG", "HBA", "SMC_B", "HSM_B", "SMC_KT", "KVK", "ZOD_2_0", "UNKNOWN", "HB_AX", "SM_B" ], + "type" : "string" + }, + "CardVersion" : { + "type" : "object", + "properties" : { + "cosVersion" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/VersionInfoType" + } ], + "xml" : { + "name" : "COSVersion" + } + }, + "objectSystemVersion" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/VersionInfoType" + } ], + "xml" : { + "name" : "ObjectSystemVersion" + } + }, + "cardPTPersVersion" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/VersionInfoType" + } ], + "xml" : { + "name" : "CardPTPersVersion" + } + }, + "dataStructureVersion" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/VersionInfoType" + } ], + "xml" : { + "name" : "DataStructureVersion" + } + }, + "loggingVersion" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/VersionInfoType" + } ], + "xml" : { + "name" : "LoggingVersion" + } + }, + "atrVersion" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/VersionInfoType" + } ], + "xml" : { + "name" : "ATRVersion" + } + }, + "gdoVersion" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/VersionInfoType" + } ], + "xml" : { + "name" : "GDOVersion" + } + }, + "keyInfoVersion" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/VersionInfoType" + } ], + "xml" : { + "name" : "KeyInfoVersion" + } + } + } + }, + "Cards" : { + "type" : "object", + "properties" : { + "card" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/CardInfoType" + }, + "xml" : { + "name" : "Card" + } + } + } + }, + "ChangePinParameter" : { + "type" : "object", + "properties" : { + "cardHandle" : { + "type" : "string" + }, + "pinType" : { + "type" : "string" + } + } + }, + "ChangePinResponse" : { + "type" : "object", + "properties" : { + "status" : { + "$ref" : "#/components/schemas/Status" + }, + "pinResultEnum" : { + "$ref" : "#/components/schemas/PinResultEnum" + }, + "leftTries" : { + "type" : "integer" + } + } + }, + "CodeType" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "type" : "string" + }, + "myStringValue" : { + "type" : "string" + }, + "value" : { + "type" : "string" + }, + "valueAsString" : { + "type" : "string" + }, + "empty" : { + "type" : "boolean" + }, + "primitive" : { + "type" : "boolean" + }, + "valueNotNull" : { + "type" : "string" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "display" : { + "type" : "string" + }, + "code" : { + "type" : "string" + } + } + }, + "CodeableConcept" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "coding" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Coding" + } + }, + "text" : { + "$ref" : "#/components/schemas/StringType" + }, + "codingFirstRep" : { + "$ref" : "#/components/schemas/Coding" + }, + "textElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "Coding" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "system" : { + "$ref" : "#/components/schemas/UriType" + }, + "version" : { + "$ref" : "#/components/schemas/StringType" + }, + "code" : { + "$ref" : "#/components/schemas/CodeType" + }, + "display" : { + "$ref" : "#/components/schemas/StringType" + }, + "userSelected" : { + "$ref" : "#/components/schemas/BooleanType" + }, + "systemElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "versionElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "codeElement" : { + "$ref" : "#/components/schemas/CodeType" + }, + "displayElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "userSelectedElement" : { + "$ref" : "#/components/schemas/BooleanType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "ComfortSignatureStatusEnum" : { + "enum" : [ "ENABLED", "DISABLED" ], + "type" : "string" + }, + "ContactPoint" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "system" : { + "$ref" : "#/components/schemas/EnumerationContactPointSystem" + }, + "value" : { + "$ref" : "#/components/schemas/StringType" + }, + "use" : { + "$ref" : "#/components/schemas/EnumerationContactPointUse" + }, + "rank" : { + "$ref" : "#/components/schemas/PositiveIntType" + }, + "period" : { + "$ref" : "#/components/schemas/Period" + }, + "systemElement" : { + "$ref" : "#/components/schemas/EnumerationContactPointSystem" + }, + "valueElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "useElement" : { + "$ref" : "#/components/schemas/EnumerationContactPointUse" + }, + "rankElement" : { + "$ref" : "#/components/schemas/PositiveIntType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "ContactPointSystem" : { + "enum" : [ "PHONE", "FAX", "EMAIL", "PAGER", "URL", "SMS", "OTHER", "NULL" ], + "type" : "string" + }, + "ContactPointUse" : { + "enum" : [ "HOME", "WORK", "TEMP", "OLD", "MOBILE", "NULL" ], + "type" : "string" + }, + "Date" : { + "format" : "date", + "type" : "string", + "example" : "2022-03-10" + }, + "Date1" : { + "type" : "object", + "properties" : { + "era" : { + "$ref" : "#/components/schemas/Era" + }, + "year" : { + "format" : "int32", + "type" : "integer" + }, + "month" : { + "format" : "int32", + "type" : "integer" + }, + "dayOfMonth" : { + "format" : "int32", + "type" : "integer" + }, + "dayOfWeek" : { + "format" : "int32", + "type" : "integer" + }, + "leapYear" : { + "type" : "boolean" + }, + "hours" : { + "format" : "int32", + "type" : "integer" + }, + "minutes" : { + "format" : "int32", + "type" : "integer" + }, + "seconds" : { + "format" : "int32", + "type" : "integer" + }, + "millis" : { + "format" : "int32", + "type" : "integer" + }, + "fraction" : { + "format" : "int64", + "type" : "integer" + }, + "normalized" : { + "type" : "boolean" + }, + "zoneinfo" : { + "$ref" : "#/components/schemas/TimeZone" + }, + "zoneOffset" : { + "format" : "int32", + "type" : "integer" + }, + "daylightSaving" : { + "format" : "int32", + "type" : "integer" + }, + "forceStandardTime" : { + "type" : "boolean" + }, + "locale" : { + "$ref" : "#/components/schemas/Locale" + }, + "timeOfDay" : { + "format" : "int64", + "type" : "integer" + }, + "standardTime" : { + "type" : "boolean" + }, + "daylightTime" : { + "type" : "boolean" + }, + "zone" : { + "$ref" : "#/components/schemas/TimeZone" + }, + "cachedYear" : { + "format" : "int32", + "type" : "integer" + }, + "cachedFixedDateJan1" : { + "format" : "int64", + "type" : "integer" + }, + "cachedFixedDateNextJan1" : { + "format" : "int64", + "type" : "integer" + }, + "normalizedYear" : { + "format" : "int32", + "type" : "integer" + }, + "cachedJan1" : { + "format" : "int64", + "type" : "integer" + } + } + }, + "DateTimeType" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "valueAsString" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/Date" + }, + "myStringValue" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/Date" + }, + "empty" : { + "type" : "boolean" + }, + "primitive" : { + "type" : "boolean" + }, + "myFractionalSeconds" : { + "type" : "string" + }, + "myPrecision" : { + "$ref" : "#/components/schemas/TemporalPrecisionEnum" + }, + "myTimeZone" : { + "$ref" : "#/components/schemas/TimeZone" + }, + "myTimeZoneZulu" : { + "type" : "boolean" + }, + "day" : { + "format" : "int32", + "type" : "integer" + }, + "hour" : { + "format" : "int32", + "type" : "integer" + }, + "millis" : { + "format" : "int32", + "type" : "integer" + }, + "minute" : { + "format" : "int32", + "type" : "integer" + }, + "month" : { + "format" : "int32", + "type" : "integer" + }, + "secondsMilli" : { + "format" : "float", + "type" : "number" + }, + "nanos" : { + "format" : "int64", + "type" : "integer" + }, + "precision" : { + "$ref" : "#/components/schemas/TemporalPrecisionEnum" + }, + "second" : { + "format" : "int32", + "type" : "integer" + }, + "timeZone" : { + "$ref" : "#/components/schemas/TimeZone" + }, + "valueAsCalendar" : { + "$ref" : "#/components/schemas/GregorianCalendar" + }, + "year" : { + "format" : "int32", + "type" : "integer" + }, + "timeZoneZulu" : { + "type" : "boolean" + }, + "today" : { + "type" : "boolean" + }, + "valueAsV3String" : { + "type" : "string" + }, + "highEdge" : { + "$ref" : "#/components/schemas/BaseDateTimeType" + }, + "defaultPrecisionForDatatype" : { + "$ref" : "#/components/schemas/TemporalPrecisionEnum" + }, + "tzSign" : { + "type" : "boolean" + }, + "tzHour" : { + "format" : "int32", + "type" : "integer" + }, + "tzMin" : { + "format" : "int32", + "type" : "integer" + }, + "asV3" : { + "type" : "string" + }, + "dateTime" : { + "type" : "boolean" + } + } + }, + "DecimalType" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "type" : "number" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "valueAsInteger" : { + "format" : "int32", + "type" : "integer" + }, + "valueAsNumber" : { + "type" : "number" + }, + "value" : { + "format" : "int64", + "type" : "integer" + } + } + }, + "Detail" : { + "type" : "object", + "properties" : { + "value" : { + "type" : "string" + }, + "encoding" : { + "type" : "string", + "xml" : { + "name" : "Encoding", + "attribute" : true + } + } + } + }, + "Duration" : { + "type" : "object", + "properties" : { + "xMLSchemaType" : { + "$ref" : "#/components/schemas/QName" + }, + "sign" : { + "format" : "int32", + "type" : "integer" + }, + "years" : { + "format" : "int32", + "type" : "integer" + }, + "months" : { + "format" : "int32", + "type" : "integer" + }, + "days" : { + "format" : "int32", + "type" : "integer" + }, + "hours" : { + "format" : "int32", + "type" : "integer" + }, + "minutes" : { + "format" : "int32", + "type" : "integer" + }, + "seconds" : { + "format" : "int32", + "type" : "integer" + } + } + }, + "Endpoint" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "id" : { + "type" : "string" + }, + "idElement" : { + "$ref" : "#/components/schemas/IIdType" + }, + "languageElement" : { + "$ref" : "#/components/schemas/IPrimitiveTypeString" + }, + "meta" : { + "$ref" : "#/components/schemas/IBaseMetaType" + }, + "structureFhirVersionEnum" : { + "$ref" : "#/components/schemas/FhirVersionEnum" + }, + "deleted" : { + "type" : "boolean" + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "resource" : { + "type" : "boolean" + }, + "implicitRules" : { + "$ref" : "#/components/schemas/UriType" + }, + "language" : { + "$ref" : "#/components/schemas/CodeType" + }, + "idPart" : { + "type" : "string" + }, + "implicitRulesElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "idBase" : { + "type" : "string" + }, + "text" : { + "$ref" : "#/components/schemas/Narrative" + }, + "contained" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Resource" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "modifierExtension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "identifier" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Identifier" + } + }, + "status" : { + "$ref" : "#/components/schemas/EnumerationEndpointStatus" + }, + "connectionType" : { + "$ref" : "#/components/schemas/Coding" + }, + "name" : { + "$ref" : "#/components/schemas/StringType" + }, + "managingOrganization" : { + "$ref" : "#/components/schemas/Reference" + }, + "managingOrganizationTarget" : { + "$ref" : "#/components/schemas/Organization" + }, + "contact" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/ContactPoint" + } + }, + "period" : { + "$ref" : "#/components/schemas/Period" + }, + "payloadType" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/CodeableConcept" + } + }, + "payloadMimeType" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/CodeType" + } + }, + "address" : { + "$ref" : "#/components/schemas/UrlType" + }, + "header" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/StringType" + } + }, + "identifierFirstRep" : { + "$ref" : "#/components/schemas/Identifier" + }, + "statusElement" : { + "$ref" : "#/components/schemas/EnumerationEndpointStatus" + }, + "nameElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "contactFirstRep" : { + "$ref" : "#/components/schemas/ContactPoint" + }, + "payloadTypeFirstRep" : { + "$ref" : "#/components/schemas/CodeableConcept" + }, + "addressElement" : { + "$ref" : "#/components/schemas/UrlType" + }, + "empty" : { + "type" : "boolean" + }, + "resourceType" : { + "$ref" : "#/components/schemas/ResourceType" + } + } + }, + "EndpointStatus" : { + "enum" : [ "ACTIVE", "SUSPENDED", "ERROR", "OFF", "ENTEREDINERROR", "TEST", "NULL" ], + "type" : "string" + }, + "EnumFactoryAddressType" : { + "type" : "object" + }, + "EnumFactoryAddressUse" : { + "type" : "object" + }, + "EnumFactoryBundleType" : { + "type" : "object" + }, + "EnumFactoryContactPointSystem" : { + "type" : "object" + }, + "EnumFactoryContactPointUse" : { + "type" : "object" + }, + "EnumFactoryEndpointStatus" : { + "type" : "object" + }, + "EnumFactoryHTTPVerb" : { + "type" : "object" + }, + "EnumFactoryIdentifierUse" : { + "type" : "object" + }, + "EnumFactoryNameUse" : { + "type" : "object" + }, + "EnumFactoryNarrativeStatus" : { + "type" : "object" + }, + "EnumFactorySearchEntryMode" : { + "type" : "object" + }, + "EnumerationAddressType" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/AddressType" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/AddressType" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myEnumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryAddressType" + }, + "enumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryAddressType" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + } + } + }, + "EnumerationAddressUse" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/AddressUse" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/AddressUse" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myEnumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryAddressUse" + }, + "enumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryAddressUse" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + } + } + }, + "EnumerationBundleType" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/BundleType" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/BundleType" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myEnumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryBundleType" + }, + "enumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryBundleType" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + } + } + }, + "EnumerationContactPointSystem" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/ContactPointSystem" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/ContactPointSystem" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myEnumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryContactPointSystem" + }, + "enumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryContactPointSystem" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + } + } + }, + "EnumerationContactPointUse" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/ContactPointUse" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/ContactPointUse" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myEnumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryContactPointUse" + }, + "enumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryContactPointUse" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + } + } + }, + "EnumerationEndpointStatus" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/EndpointStatus" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/EndpointStatus" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myEnumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryEndpointStatus" + }, + "enumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryEndpointStatus" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + } + } + }, + "EnumerationHTTPVerb" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/HTTPVerb" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/HTTPVerb" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myEnumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryHTTPVerb" + }, + "enumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryHTTPVerb" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + } + } + }, + "EnumerationIdentifierUse" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/IdentifierUse" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/IdentifierUse" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myEnumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryIdentifierUse" + }, + "enumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryIdentifierUse" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + } + } + }, + "EnumerationNameUse" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/NameUse" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/NameUse" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myEnumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryNameUse" + }, + "enumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryNameUse" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + } + } + }, + "EnumerationNarrativeStatus" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/NarrativeStatus" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/NarrativeStatus" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myEnumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryNarrativeStatus" + }, + "enumFactory" : { + "$ref" : "#/components/schemas/EnumFactoryNarrativeStatus" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + } + } + }, + "EnumerationSearchEntryMode" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/SearchEntryMode" + }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/SearchEntryMode" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myEnumFactory" : { + "$ref" : "#/components/schemas/EnumFactorySearchEntryMode" + }, + "enumFactory" : { + "$ref" : "#/components/schemas/EnumFactorySearchEntryMode" + }, + "system" : { + "type" : "string" + }, + "version" : { + "type" : "string" + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + } + } + }, + "Era" : { + "type" : "object", + "properties" : { + "name" : { + "type" : "string" + }, + "abbr" : { + "type" : "string" + }, + "since" : { + "format" : "int64", + "type" : "integer" + }, + "sinceDate" : { + "$ref" : "#/components/schemas/CalendarDate" + }, + "localTime" : { + "type" : "boolean" + }, + "hash" : { + "format" : "int32", + "type" : "integer" + }, + "abbreviation" : { + "type" : "string" + } + } + }, + "Error" : { + "type" : "object", + "properties" : { + "messageID" : { + "type" : "string", + "xml" : { + "name" : "MessageID" + } + }, + "timestamp" : { + "type" : "object", + "allOf" : [ { "$ref" : "#/components/schemas/XMLGregorianCalendar" - }, { - "xml" : { - "name" : "CertificateExpirationDate" - } - } ] + } ], + "xml" : { + "name" : "Timestamp" + } + }, + "trace" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Trace" + }, + "xml" : { + "name" : "Trace" + } + } + } + }, + "Extension" : { + "type" : "object", + "properties" : { + "extension" : { + "type" : "array", + "items" : { } + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "valueAsPrimitive" : { + "$ref" : "#/components/schemas/IPrimitiveTypeObject" + }, + "url" : { + "$ref" : "#/components/schemas/UriType" + }, + "value" : { + "$ref" : "#/components/schemas/Type" + }, + "urlElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "FhirVersionEnum" : { + "enum" : [ "DSTU2", "DSTU2_HL7ORG", "DSTU2_1", "DSTU3", "R4", "R4B", "R5" ], + "type" : "string" + }, + "GetCardsResponse" : { + "type" : "object", + "properties" : { + "status" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/Status" + } ], + "xml" : { + "name" : "Status" + } + }, + "cards" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/Cards" + } ], + "xml" : { + "name" : "Cards" + } + } + } + }, + "GetPinStatusResponse" : { + "type" : "object", + "properties" : { + "status" : { + "$ref" : "#/components/schemas/Status" + }, + "pinResultEnum" : { + "$ref" : "#/components/schemas/PinStatusEnum" + }, + "leftTries" : { + "type" : "integer" + }, + "pinStatusEnum" : { + "$ref" : "#/components/schemas/PinStatusEnum" + } + } + }, + "GetSignatureModeResponseEvent" : { + "type" : "object", + "properties" : { + "status" : { + "$ref" : "#/components/schemas/Status" + }, + "comfortSignatureStatus" : { + "$ref" : "#/components/schemas/ComfortSignatureStatusEnum" + }, + "comfortSignatureMax" : { + "format" : "int32", + "type" : "integer" + }, + "comfortSignatureTimer" : { + "$ref" : "#/components/schemas/Duration" + }, + "sessionInfo" : { + "$ref" : "#/components/schemas/SessionInfo" + }, + "userId" : { + "type" : "string" + }, + "answertToActivateComfortSignature" : { + "type" : "boolean" + } + } + }, + "GregorianCalendar" : { + "type" : "object", + "properties" : { + "fields" : { + "type" : "array", + "items" : { + "format" : "int32", + "type" : "integer" + } + }, + "isSet" : { + "type" : "array", + "items" : { + "type" : "boolean" + } + }, + "time" : { + "format" : "int64", + "type" : "integer" + }, + "isTimeSet" : { + "type" : "boolean" + }, + "areFieldsSet" : { + "type" : "boolean" + }, + "lenient" : { + "type" : "boolean" + }, + "zone" : { + "$ref" : "#/components/schemas/TimeZone" + }, + "firstDayOfWeek" : { + "format" : "int32", + "type" : "integer" + }, + "minimalDaysInFirstWeek" : { + "format" : "int32", + "type" : "integer" + }, + "nextStamp" : { + "format" : "int32", + "type" : "integer" + }, + "serialVersionOnStream" : { + "format" : "int32", + "type" : "integer" + }, + "timeInMillis" : { + "format" : "int64", + "type" : "integer" + }, + "setStateFields" : { + "format" : "int32", + "type" : "integer" + }, + "fieldsComputed" : { + "format" : "int32", + "type" : "integer" + }, + "fieldsNormalized" : { + "format" : "int32", + "type" : "integer" + }, + "partiallyNormalized" : { + "type" : "boolean" + }, + "fullyNormalized" : { + "type" : "boolean" + }, + "zoneShared" : { + "type" : "boolean" + }, + "weekCountData" : { + "$ref" : "#/components/schemas/Locale" + }, + "gregorianCutover" : { + "format" : "int64", + "type" : "integer" + }, + "gregorianChange" : { + "$ref" : "#/components/schemas/Date" + }, + "calendarType" : { + "type" : "string" + }, + "yearOffsetInMillis" : { + "format" : "int64", + "type" : "integer" + }, + "timeZone" : { + "$ref" : "#/components/schemas/TimeZone" + }, + "weekDateSupported" : { + "type" : "boolean" + }, + "weekYear" : { + "format" : "int32", + "type" : "integer" + }, + "weeksInWeekYear" : { + "format" : "int32", + "type" : "integer" + }, + "normalizedCalendar" : { + "$ref" : "#/components/schemas/GregorianCalendar" + }, + "cutoverCalendarSystem" : { + "$ref" : "#/components/schemas/BaseCalendar" + }, + "invalidWeek1" : { + "type" : "boolean" + }, + "lastJulianDate" : { + "$ref" : "#/components/schemas/Date1" + }, + "currentFixedDate" : { + "format" : "int64", + "type" : "integer" + } + } + }, + "HTTPVerb" : { + "enum" : [ "GET", "HEAD", "POST", "PUT", "DELETE", "PATCH", "NULL" ], + "type" : "string" + }, + "HumanName" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "use" : { + "$ref" : "#/components/schemas/EnumerationNameUse" + }, + "text" : { + "$ref" : "#/components/schemas/StringType" + }, + "family" : { + "$ref" : "#/components/schemas/StringType" + }, + "given" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/StringType" + } + }, + "prefix" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/StringType" + } + }, + "suffix" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/StringType" + } + }, + "period" : { + "$ref" : "#/components/schemas/Period" + }, + "useElement" : { + "$ref" : "#/components/schemas/EnumerationNameUse" + }, + "textElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "familyElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "givenAsSingleString" : { + "type" : "string" + }, + "prefixAsSingleString" : { + "type" : "string" + }, + "suffixAsSingleString" : { + "type" : "string" + }, + "nameAsSingleString" : { + "type" : "string" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "IBaseCoding" : { + "type" : "object", + "properties" : { + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "code" : { + "type" : "string" + }, + "display" : { + "type" : "string" + }, + "system" : { + "type" : "string" + }, + "userSelected" : { + "type" : "boolean" + }, + "version" : { + "type" : "string" + } + } + }, + "IBaseDatatype" : { + "type" : "object", + "properties" : { + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + } + } + }, + "IBaseExtensionObjectObject" : { + "type" : "object", + "properties" : { + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { } + }, + "url" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/IBaseDatatype" + } + } + }, + "IBaseMetaType" : { + "type" : "object", + "properties" : { + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "lastUpdated" : { + "$ref" : "#/components/schemas/Date" + }, + "profile" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IPrimitiveTypeString" + } + }, + "security" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseCoding" + } + }, + "tag" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseCoding" + } + }, + "versionId" : { + "type" : "string" + } + } + }, + "IIdType" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "baseUrl" : { + "type" : "string" + }, + "idPart" : { + "type" : "string" + }, + "idPartAsLong" : { + "format" : "int64", + "type" : "integer" + }, + "resourceType" : { + "type" : "string" + }, + "value" : { + "type" : "string" + }, + "versionIdPart" : { + "type" : "string" + }, + "versionIdPartAsLong" : { + "format" : "int64", + "type" : "integer" + }, + "absolute" : { + "type" : "boolean" + }, + "empty" : { + "type" : "boolean" + }, + "idPartValid" : { + "type" : "boolean" + }, + "idPartValidLong" : { + "type" : "boolean" + }, + "local" : { + "type" : "boolean" + }, + "versionIdPartValidLong" : { + "type" : "boolean" + } + } + }, + "IPrimitiveTypeObject" : { + "type" : "object", + "properties" : { + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "valueAsString" : { + "type" : "string" + }, + "value" : { } + } + }, + "IPrimitiveTypeString" : { + "type" : "object", + "properties" : { + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "valueAsString" : { + "type" : "string" + }, + "value" : { + "type" : "string" + } + } + }, + "IdType" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "type" : "string" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + }, + "myBaseUrl" : { + "type" : "string" + }, + "myHaveComponentParts" : { + "type" : "boolean" + }, + "myResourceType" : { + "type" : "string" + }, + "myUnqualifiedId" : { + "type" : "string" + }, + "myUnqualifiedVersionId" : { + "type" : "string" + }, + "baseUrl" : { + "type" : "string" + }, + "idPart" : { + "type" : "string" + }, + "idPartAsBigDecimal" : { + "type" : "number" + }, + "idPartAsLong" : { + "format" : "int64", + "type" : "integer" + }, + "resourceType" : { + "type" : "string" + }, + "value" : { + "type" : "string" + }, + "valueAsString" : { + "type" : "string" + }, + "versionIdPart" : { + "type" : "string" + }, + "versionIdPartAsLong" : { + "format" : "int64", + "type" : "integer" + }, + "absolute" : { + "type" : "boolean" + }, + "empty" : { + "type" : "boolean" + }, + "idPartValid" : { + "type" : "boolean" + }, + "idPartValidLong" : { + "type" : "boolean" + }, + "local" : { + "type" : "boolean" + }, + "urn" : { + "type" : "boolean" + }, + "versionIdPartValidLong" : { + "type" : "boolean" + } + } + }, + "Identifier" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "use" : { + "$ref" : "#/components/schemas/EnumerationIdentifierUse" + }, + "type" : { + "$ref" : "#/components/schemas/CodeableConcept" + }, + "system" : { + "$ref" : "#/components/schemas/UriType" + }, + "value" : { + "$ref" : "#/components/schemas/StringType" + }, + "period" : { + "$ref" : "#/components/schemas/Period" + }, + "assigner" : { + "$ref" : "#/components/schemas/Reference" + }, + "assignerTarget" : { + "$ref" : "#/components/schemas/Organization" + }, + "useElement" : { + "$ref" : "#/components/schemas/EnumerationIdentifierUse" + }, + "systemElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "valueElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "IdentifierUse" : { + "enum" : [ "USUAL", "OFFICIAL", "TEMP", "SECONDARY", "OLD", "NULL" ], + "type" : "string" + }, + "InstantType" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "valueAsString" : { + "type" : "string" + }, + "myCoercedValue" : { + "$ref" : "#/components/schemas/Date" + }, + "myStringValue" : { + "type" : "string" + }, + "value" : { + "$ref" : "#/components/schemas/Date" + }, + "empty" : { + "type" : "boolean" + }, + "primitive" : { + "type" : "boolean" + }, + "myFractionalSeconds" : { + "type" : "string" + }, + "myPrecision" : { + "$ref" : "#/components/schemas/TemporalPrecisionEnum" + }, + "myTimeZone" : { + "$ref" : "#/components/schemas/TimeZone" + }, + "myTimeZoneZulu" : { + "type" : "boolean" + }, + "day" : { + "format" : "int32", + "type" : "integer" + }, + "hour" : { + "format" : "int32", + "type" : "integer" + }, + "millis" : { + "format" : "int32", + "type" : "integer" + }, + "minute" : { + "format" : "int32", + "type" : "integer" + }, + "month" : { + "format" : "int32", + "type" : "integer" + }, + "secondsMilli" : { + "format" : "float", + "type" : "number" + }, + "nanos" : { + "format" : "int64", + "type" : "integer" + }, + "precision" : { + "$ref" : "#/components/schemas/TemporalPrecisionEnum" + }, + "second" : { + "format" : "int32", + "type" : "integer" + }, + "timeZone" : { + "$ref" : "#/components/schemas/TimeZone" + }, + "valueAsCalendar" : { + "$ref" : "#/components/schemas/GregorianCalendar" + }, + "year" : { + "format" : "int32", + "type" : "integer" + }, + "timeZoneZulu" : { + "type" : "boolean" + }, + "today" : { + "type" : "boolean" + }, + "valueAsV3String" : { + "type" : "string" + }, + "dateTime" : { + "type" : "boolean" + }, + "highEdge" : { + "$ref" : "#/components/schemas/BaseDateTimeType" + }, + "defaultPrecisionForDatatype" : { + "$ref" : "#/components/schemas/TemporalPrecisionEnum" + } + } + }, + "JsonValue" : { + "type" : "object", + "properties" : { + "valueType" : { + "$ref" : "#/components/schemas/ValueType" + } + } + }, + "Locale" : { + "type" : "object", + "properties" : { + "language" : { + "type" : "string" + }, + "script" : { + "type" : "string" + }, + "country" : { + "type" : "string" + }, + "variant" : { + "type" : "string" + }, + "extensionKeys" : { + "uniqueItems" : true, + "type" : "array", + "items" : { + "format" : "byte", + "type" : "string" + } + }, + "unicodeLocaleAttributes" : { + "uniqueItems" : true, + "type" : "array", + "items" : { + "type" : "string" + } + }, + "unicodeLocaleKeys" : { + "uniqueItems" : true, + "type" : "array", + "items" : { + "type" : "string" + } + }, + "iSO3Language" : { + "type" : "string" + }, + "iSO3Country" : { + "type" : "string" + }, + "displayLanguage" : { + "type" : "string" + }, + "displayScript" : { + "type" : "string" + }, + "displayCountry" : { + "type" : "string" + }, + "displayVariant" : { + "type" : "string" + }, + "displayName" : { + "type" : "string" + } + } + }, + "Location" : { + "type" : "object", + "properties" : { + "line" : { + "format" : "int32", + "type" : "integer" + }, + "column" : { + "format" : "int32", + "type" : "integer" + } + } + }, + "Meta" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "versionId" : { + "$ref" : "#/components/schemas/IdType" + }, + "lastUpdated" : { + "$ref" : "#/components/schemas/InstantType" + }, + "source" : { + "$ref" : "#/components/schemas/UriType" + }, + "profile" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/CanonicalType" + } + }, + "security" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Coding" + } + }, + "tag" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Coding" + } + }, + "versionIdElement" : { + "$ref" : "#/components/schemas/IdType" + }, + "lastUpdatedElement" : { + "$ref" : "#/components/schemas/InstantType" + }, + "sourceElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "securityFirstRep" : { + "$ref" : "#/components/schemas/Coding" + }, + "tagFirstRep" : { + "$ref" : "#/components/schemas/Coding" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "NameUse" : { + "enum" : [ "USUAL", "OFFICIAL", "TEMP", "NICKNAME", "ANONYMOUS", "OLD", "MAIDEN", "NULL" ], + "type" : "string" + }, + "Narrative" : { + "type" : "object", + "properties" : { + "divAsString" : { + "type" : "string" + }, + "statusAsString" : { + "type" : "string" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "status" : { + "$ref" : "#/components/schemas/EnumerationNarrativeStatus" + }, + "div" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "statusElement" : { + "$ref" : "#/components/schemas/EnumerationNarrativeStatus" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "NarrativeStatus" : { + "enum" : [ "GENERATED", "EXTENSIONS", "ADDITIONAL", "EMPTY", "NULL" ], + "type" : "string" + }, + "NodeType" : { + "enum" : [ "Element", "Text", "Comment", "DocType", "Document", "Instruction" ], + "type" : "string" + }, + "Organization" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "id" : { + "type" : "string" + }, + "idElement" : { + "$ref" : "#/components/schemas/IIdType" + }, + "languageElement" : { + "$ref" : "#/components/schemas/IPrimitiveTypeString" + }, + "meta" : { + "$ref" : "#/components/schemas/IBaseMetaType" + }, + "structureFhirVersionEnum" : { + "$ref" : "#/components/schemas/FhirVersionEnum" + }, + "deleted" : { + "type" : "boolean" + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "resource" : { + "type" : "boolean" + }, + "implicitRules" : { + "$ref" : "#/components/schemas/UriType" + }, + "language" : { + "$ref" : "#/components/schemas/CodeType" + }, + "idPart" : { + "type" : "string" + }, + "implicitRulesElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "idBase" : { + "type" : "string" + }, + "text" : { + "$ref" : "#/components/schemas/Narrative" + }, + "contained" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Resource" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "modifierExtension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "identifier" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Identifier" + } + }, + "active" : { + "$ref" : "#/components/schemas/BooleanType" + }, + "type" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/CodeableConcept" + } + }, + "name" : { + "$ref" : "#/components/schemas/StringType" + }, + "alias" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/StringType" + } + }, + "telecom" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/ContactPoint" + } + }, + "address" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Address" + } + }, + "partOf" : { + "$ref" : "#/components/schemas/Reference" + }, + "partOfTarget" : { + "$ref" : "#/components/schemas/Organization" + }, + "contact" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/OrganizationContactComponent" + } + }, + "endpoint" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Reference" + } + }, + "endpointTarget" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Endpoint" + } + }, + "identifierFirstRep" : { + "$ref" : "#/components/schemas/Identifier" + }, + "activeElement" : { + "$ref" : "#/components/schemas/BooleanType" + }, + "typeFirstRep" : { + "$ref" : "#/components/schemas/CodeableConcept" + }, + "nameElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "telecomFirstRep" : { + "$ref" : "#/components/schemas/ContactPoint" + }, + "addressFirstRep" : { + "$ref" : "#/components/schemas/Address" + }, + "contactFirstRep" : { + "$ref" : "#/components/schemas/OrganizationContactComponent" + }, + "endpointFirstRep" : { + "$ref" : "#/components/schemas/Reference" + }, + "empty" : { + "type" : "boolean" + }, + "resourceType" : { + "$ref" : "#/components/schemas/ResourceType" + } + } + }, + "OrganizationContactComponent" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "modifierExtension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "modifierExtensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "purpose" : { + "$ref" : "#/components/schemas/CodeableConcept" + }, + "name" : { + "$ref" : "#/components/schemas/HumanName" + }, + "telecom" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/ContactPoint" + } + }, + "address" : { + "$ref" : "#/components/schemas/Address" + }, + "telecomFirstRep" : { + "$ref" : "#/components/schemas/ContactPoint" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "Period" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "start" : { + "$ref" : "#/components/schemas/DateTimeType" + }, + "end" : { + "$ref" : "#/components/schemas/DateTimeType" + }, + "startElement" : { + "$ref" : "#/components/schemas/DateTimeType" + }, + "endElement" : { + "$ref" : "#/components/schemas/DateTimeType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "PinResultEnum" : { + "enum" : [ "ERROR", "OK", "REJECTED", "WASBLOCKED", "NOWBLOCKED", "TRANSPORT_PIN" ], + "type" : "string" + }, + "PinStatusEnum" : { + "enum" : [ "VERIFIED", "TRANSPORT_PIN", "EMPTY_PIN", "BLOCKED", "VERIFIABLE" ], + "type" : "string" + }, + "PositiveIntType" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "format" : "int32", + "type" : "integer" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + } + } + }, + "QName" : { + "type" : "object", + "properties" : { + "namespaceURI" : { + "type" : "string" + }, + "localPart" : { + "type" : "string" + }, + "prefix" : { + "type" : "string" + } + } + }, + "Reference" : { + "type" : "object", + "properties" : { + "referenceElement" : { + "$ref" : "#/components/schemas/IIdType" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "reference" : { + "$ref" : "#/components/schemas/StringType" + }, + "type" : { + "$ref" : "#/components/schemas/UriType" + }, + "identifier" : { + "$ref" : "#/components/schemas/Identifier" + }, + "display" : { + "$ref" : "#/components/schemas/StringType" + }, + "referenceElement_" : { + "$ref" : "#/components/schemas/StringType" + }, + "typeElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "displayElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "Resource" : { + "type" : "object", + "properties" : { + "structureFhirVersionEnum" : { + "$ref" : "#/components/schemas/FhirVersionEnum" + }, + "deleted" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "resource" : { + "type" : "boolean" + }, + "id" : { + "$ref" : "#/components/schemas/IdType" + }, + "meta" : { + "$ref" : "#/components/schemas/Meta" + }, + "implicitRules" : { + "$ref" : "#/components/schemas/UriType" + }, + "language" : { + "$ref" : "#/components/schemas/CodeType" + }, + "idElement" : { + "$ref" : "#/components/schemas/IdType" + }, + "idPart" : { + "type" : "string" + }, + "implicitRulesElement" : { + "$ref" : "#/components/schemas/UriType" + }, + "languageElement" : { + "$ref" : "#/components/schemas/CodeType" + }, + "empty" : { + "type" : "boolean" + }, + "idBase" : { + "type" : "string" + }, + "resourceType" : { + "$ref" : "#/components/schemas/ResourceType" + } + } + }, + "ResourceType" : { + "enum" : [ "Account", "ActivityDefinition", "AdverseEvent", "AllergyIntolerance", "Appointment", "AppointmentResponse", "AuditEvent", "Basic", "Binary", "BiologicallyDerivedProduct", "BodyStructure", "Bundle", "CapabilityStatement", "CarePlan", "CareTeam", "CatalogEntry", "ChargeItem", "ChargeItemDefinition", "Claim", "ClaimResponse", "ClinicalImpression", "CodeSystem", "Communication", "CommunicationRequest", "CompartmentDefinition", "Composition", "ConceptMap", "Condition", "Consent", "Contract", "Coverage", "CoverageEligibilityRequest", "CoverageEligibilityResponse", "DetectedIssue", "Device", "DeviceDefinition", "DeviceMetric", "DeviceRequest", "DeviceUseStatement", "DiagnosticReport", "DocumentManifest", "DocumentReference", "EffectEvidenceSynthesis", "Encounter", "Endpoint", "EnrollmentRequest", "EnrollmentResponse", "EpisodeOfCare", "EventDefinition", "Evidence", "EvidenceVariable", "ExampleScenario", "ExplanationOfBenefit", "FamilyMemberHistory", "Flag", "Goal", "GraphDefinition", "Group", "GuidanceResponse", "HealthcareService", "ImagingStudy", "Immunization", "ImmunizationEvaluation", "ImmunizationRecommendation", "ImplementationGuide", "InsurancePlan", "Invoice", "Library", "Linkage", "List", "Location", "Measure", "MeasureReport", "Media", "Medication", "MedicationAdministration", "MedicationDispense", "MedicationKnowledge", "MedicationRequest", "MedicationStatement", "MedicinalProduct", "MedicinalProductAuthorization", "MedicinalProductContraindication", "MedicinalProductIndication", "MedicinalProductIngredient", "MedicinalProductInteraction", "MedicinalProductManufactured", "MedicinalProductPackaged", "MedicinalProductPharmaceutical", "MedicinalProductUndesirableEffect", "MessageDefinition", "MessageHeader", "MolecularSequence", "NamingSystem", "NutritionOrder", "Observation", "ObservationDefinition", "OperationDefinition", "OperationOutcome", "Organization", "OrganizationAffiliation", "Parameters", "Patient", "PaymentNotice", "PaymentReconciliation", "Person", "PlanDefinition", "Practitioner", "PractitionerRole", "Procedure", "Provenance", "Questionnaire", "QuestionnaireResponse", "RelatedPerson", "RequestGroup", "ResearchDefinition", "ResearchElementDefinition", "ResearchStudy", "ResearchSubject", "RiskAssessment", "RiskEvidenceSynthesis", "Schedule", "SearchParameter", "ServiceRequest", "Slot", "Specimen", "SpecimenDefinition", "StructureDefinition", "StructureMap", "Subscription", "Substance", "SubstanceNucleicAcid", "SubstancePolymer", "SubstanceProtein", "SubstanceReferenceInformation", "SubstanceSourceMaterial", "SubstanceSpecification", "SupplyDelivery", "SupplyRequest", "Task", "TerminologyCapabilities", "TestReport", "TestScript", "ValueSet", "VerificationResult", "VisionPrescription" ], + "type" : "string" + }, + "SearchEntryMode" : { + "enum" : [ "MATCH", "INCLUDE", "OUTCOME", "NULL" ], + "type" : "string" + }, + "SessionInfo" : { + "type" : "object", + "properties" : { + "signatureMode" : { + "type" : "string", + "allOf" : [ { + "$ref" : "#/components/schemas/SignatureModeEnum" + } ], + "xml" : { + "name" : "SignatureMode" + } + }, + "countRemaining" : { + "format" : "int32", + "type" : "integer", + "xml" : { + "name" : "CountRemaining" + } + }, + "timeRemaining" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/Duration" + } ], + "xml" : { + "name" : "TimeRemaining" + } + } + } + }, + "Signature" : { + "type" : "object", + "properties" : { + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Extension" + } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "type" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/Coding" + } + }, + "when" : { + "$ref" : "#/components/schemas/InstantType" + }, + "who" : { + "$ref" : "#/components/schemas/Reference" + }, + "whoTarget" : { + "$ref" : "#/components/schemas/Resource" + }, + "onBehalfOf" : { + "$ref" : "#/components/schemas/Reference" + }, + "onBehalfOfTarget" : { + "$ref" : "#/components/schemas/Resource" + }, + "targetFormat" : { + "$ref" : "#/components/schemas/CodeType" + }, + "sigFormat" : { + "$ref" : "#/components/schemas/CodeType" + }, + "data" : { + "$ref" : "#/components/schemas/Base64BinaryType" + }, + "typeFirstRep" : { + "$ref" : "#/components/schemas/Coding" + }, + "whenElement" : { + "$ref" : "#/components/schemas/InstantType" + }, + "targetFormatElement" : { + "$ref" : "#/components/schemas/CodeType" + }, + "sigFormatElement" : { + "$ref" : "#/components/schemas/CodeType" + }, + "dataElement" : { + "$ref" : "#/components/schemas/Base64BinaryType" + }, + "empty" : { + "type" : "boolean" + } + } + }, + "SignatureModeEnum" : { + "enum" : [ "PIN", "COMFORT" ], + "type" : "string" + }, + "Status" : { + "type" : "object", + "properties" : { + "result" : { + "type" : "string", + "xml" : { + "name" : "Result" + } + }, + "error" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/Error" + } ], + "xml" : { + "name" : "Error" + } } } }, - "CardTypeType" : { - "enum" : [ "EGK", "HBA", "HBA_Q_SIG", "HB_AX", "HSM_B", "KVK", "SMC_B", "SMC_KT", "SM_B", "UNKNOWN", "ZOD_2_0" ], - "type" : "string" - }, - "CardVersion" : { + "StringType" : { "type" : "object", "properties" : { - "cosVersion" : { - "allOf" : [ { - "$ref" : "#/components/schemas/VersionInfoType" - }, { - "xml" : { - "name" : "COSVersion" - } - } ] + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } }, - "objectSystemVersion" : { - "allOf" : [ { - "$ref" : "#/components/schemas/VersionInfoType" - }, { - "xml" : { - "name" : "ObjectSystemVersion" - } - } ] + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } }, - "cardPTPersVersion" : { - "allOf" : [ { - "$ref" : "#/components/schemas/VersionInfoType" - }, { - "xml" : { - "name" : "CardPTPersVersion" - } - } ] + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } }, - "dataStructureVersion" : { - "allOf" : [ { - "$ref" : "#/components/schemas/VersionInfoType" - }, { - "xml" : { - "name" : "DataStructureVersion" - } - } ] + "userData" : { + "type" : "object", + "additionalProperties" : { } }, - "loggingVersion" : { - "allOf" : [ { - "$ref" : "#/components/schemas/VersionInfoType" - }, { - "xml" : { - "name" : "LoggingVersion" - } - } ] + "booleanPrimitive" : { + "type" : "boolean" }, - "atrVersion" : { - "allOf" : [ { - "$ref" : "#/components/schemas/VersionInfoType" - }, { - "xml" : { - "name" : "ATRVersion" - } - } ] + "dateTime" : { + "type" : "boolean" }, - "gdoVersion" : { - "allOf" : [ { - "$ref" : "#/components/schemas/VersionInfoType" - }, { - "xml" : { - "name" : "GDOVersion" - } - } ] + "metadataBased" : { + "type" : "boolean" }, - "keyInfoVersion" : { - "allOf" : [ { - "$ref" : "#/components/schemas/VersionInfoType" - }, { - "xml" : { - "name" : "KeyInfoVersion" - } - } ] + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "type" : "string" + }, + "myStringValue" : { + "type" : "string" + }, + "value" : { + "type" : "string" + }, + "valueAsString" : { + "type" : "string" + }, + "empty" : { + "type" : "boolean" + }, + "primitive" : { + "type" : "boolean" + }, + "valueNotNull" : { + "type" : "string" } } }, - "Cards" : { + "TemporalPrecisionEnum" : { + "enum" : [ "YEAR", "MONTH", "DAY", "MINUTE", "SECOND", "MILLI" ], + "type" : "string" + }, + "TimeZone" : { "type" : "object", "properties" : { - "card" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/CardInfoType" - }, - "xml" : { - "name" : "Card" - } + "ID" : { + "type" : "string" + }, + "rawOffset" : { + "format" : "int32", + "type" : "integer" + }, + "iD" : { + "type" : "string" + }, + "displayName" : { + "type" : "string" + }, + "dSTSavings" : { + "format" : "int32", + "type" : "integer" } } }, - "Detail" : { + "Trace" : { "type" : "object", "properties" : { - "value" : { - "type" : "string" + "eventID" : { + "type" : "string", + "xml" : { + "name" : "EventID" + } }, - "encoding" : { + "instance" : { "type" : "string", "xml" : { - "name" : "Encoding", - "attribute" : true + "name" : "Instance" + } + }, + "logReference" : { + "type" : "string", + "xml" : { + "name" : "LogReference" + } + }, + "compType" : { + "type" : "string", + "xml" : { + "name" : "CompType" + } + }, + "code" : { + "type" : "integer", + "xml" : { + "name" : "Code" + } + }, + "severity" : { + "type" : "string", + "xml" : { + "name" : "Severity" + } + }, + "errorType" : { + "type" : "string", + "xml" : { + "name" : "ErrorType" + } + }, + "errorText" : { + "type" : "string", + "xml" : { + "name" : "ErrorText" + } + }, + "detail" : { + "type" : "object", + "allOf" : [ { + "$ref" : "#/components/schemas/Detail" + } ], + "xml" : { + "name" : "Detail" } } } }, - "Error" : { + "Type" : { "type" : "object", "properties" : { - "messageID" : { - "type" : "string", - "xml" : { - "name" : "MessageID" + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" } }, - "timestamp" : { - "allOf" : [ { - "$ref" : "#/components/schemas/XMLGregorianCalendar" - }, { - "xml" : { - "name" : "Timestamp" - } - } ] + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } }, - "trace" : { + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "primitive" : { + "type" : "boolean" + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "extension" : { "type" : "array", "items" : { - "$ref" : "#/components/schemas/Trace" - }, - "xml" : { - "name" : "Trace" + "$ref" : "#/components/schemas/Extension" } + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" } } }, - "GetCardsResponse" : { + "UnblockPinResponse" : { "type" : "object", "properties" : { "status" : { - "allOf" : [ { - "$ref" : "#/components/schemas/Status" - }, { - "xml" : { - "name" : "Status" - } - } ] + "$ref" : "#/components/schemas/Status" }, - "cards" : { - "allOf" : [ { - "$ref" : "#/components/schemas/Cards" - }, { - "xml" : { - "name" : "Cards" - } - } ] + "pinResultEnum" : { + "$ref" : "#/components/schemas/PinResultEnum" + }, + "leftTries" : { + "type" : "integer" } } }, - "InputStream" : { - "type" : "object" + "UnsignedIntType" : { + "type" : "object", + "properties" : { + "valueAsString" : { + "type" : "string" + }, + "value" : { }, + "empty" : { + "type" : "boolean" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "format" : "int32", + "type" : "integer" + }, + "myStringValue" : { + "type" : "string" + }, + "primitive" : { + "type" : "boolean" + } + } }, - "QName" : { + "UpdateERezept" : { "type" : "object", "properties" : { - "localPart" : { + "taskId" : { "type" : "string" }, - "namespaceURI" : { + "accessCode" : { "type" : "string" }, - "prefix" : { + "signedBytes" : { "type" : "string" } } }, - "Status" : { + "UriType" : { "type" : "object", "properties" : { - "result" : { - "type" : "string", - "xml" : { - "name" : "Result" + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" } }, - "error" : { - "allOf" : [ { - "$ref" : "#/components/schemas/Error" - }, { - "xml" : { - "name" : "Error" - } - } ] + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "booleanPrimitive" : { + "type" : "boolean" + }, + "dateTime" : { + "type" : "boolean" + }, + "metadataBased" : { + "type" : "boolean" + }, + "resource" : { + "type" : "boolean" + }, + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { + "type" : "string" + }, + "myCoercedValue" : { + "type" : "string" + }, + "myStringValue" : { + "type" : "string" + }, + "value" : { + "type" : "string" + }, + "valueAsString" : { + "type" : "string" + }, + "empty" : { + "type" : "boolean" + }, + "primitive" : { + "type" : "boolean" } } }, - "Trace" : { + "UrlType" : { "type" : "object", "properties" : { - "eventID" : { - "type" : "string", - "xml" : { - "name" : "EventID" + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" } }, - "instance" : { - "type" : "string", - "xml" : { - "name" : "Instance" + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" } }, - "logReference" : { - "type" : "string", - "xml" : { - "name" : "LogReference" + "extension" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/IBaseExtensionObjectObject" } }, - "compType" : { - "type" : "string", - "xml" : { - "name" : "CompType" - } + "userData" : { + "type" : "object", + "additionalProperties" : { } }, - "code" : { - "type" : "integer", - "xml" : { - "name" : "Code" - } + "booleanPrimitive" : { + "type" : "boolean" }, - "severity" : { - "type" : "string", - "xml" : { - "name" : "Severity" - } + "dateTime" : { + "type" : "boolean" }, - "errorType" : { - "type" : "string", - "xml" : { - "name" : "ErrorType" - } + "metadataBased" : { + "type" : "boolean" }, - "errorText" : { - "type" : "string", - "xml" : { - "name" : "ErrorText" - } + "resource" : { + "type" : "boolean" }, - "detail" : { - "allOf" : [ { - "$ref" : "#/components/schemas/Detail" - }, { - "xml" : { - "name" : "Detail" - } - } ] - } - } - }, - "UpdateERezept" : { - "type" : "object", - "properties" : { - "accessCode" : { + "xhtml" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "id" : { + "$ref" : "#/components/schemas/StringType" + }, + "disallowExtensions" : { + "type" : "boolean" + }, + "idElement" : { + "$ref" : "#/components/schemas/StringType" + }, + "extensionFirstRep" : { + "$ref" : "#/components/schemas/Extension" + }, + "idBase" : { "type" : "string" }, - "signedBytes" : { + "myCoercedValue" : { "type" : "string" }, - "taskId" : { + "myStringValue" : { + "type" : "string" + }, + "value" : { + "type" : "string" + }, + "valueAsString" : { "type" : "string" + }, + "empty" : { + "type" : "boolean" + }, + "primitive" : { + "type" : "boolean" } } }, "UserConfigurations" : { "type" : "object", "properties" : { - "connector.basic-auth-password" : { + "erixa.hotfolder" : { "type" : "string" }, - "connector.basic-auth-username" : { + "erixa.drugstore.email" : { "type" : "string" }, - "connector.client-certificate" : { + "erixa.user.email" : { "type" : "string" }, - "connector.client-certificate-password" : { + "erixa.user.password" : { "type" : "string" }, - "connector.client-system-id" : { + "erixa.api.key" : { "type" : "string" }, - "connector.base-url" : { + "extractor.template.profile" : { "type" : "string" }, - "erixa.api.key" : { + "connector.base-url" : { "type" : "string" }, - "erixa.drugstore.email" : { + "connector.mandant-id" : { "type" : "string" }, - "erixa.hotfolder" : { + "connector.workplace-id" : { "type" : "string" }, - "erixa.user.email" : { + "connector.client-system-id" : { "type" : "string" }, - "erixa.user.password" : { + "connector.user-id" : { "type" : "string" }, - "connector.mandant-id" : { + "connector.version" : { "type" : "string" }, - "extractor.template.profile" : { + "connector.tvMode" : { "type" : "string" }, - "kbv.pruefnummer" : { + "connector.client-certificate" : { "type" : "string" }, - "connector.tvMode" : { + "connector.client-certificate-password" : { "type" : "string" }, - "connector.user-id" : { + "connector.basic-auth-username" : { "type" : "string" }, - "connector.version" : { + "connector.basic-auth-password" : { "type" : "string" }, - "connector.workplace-id" : { + "kbv.pruefnummer" : { "type" : "string" } } }, + "ValueType" : { + "enum" : [ "ARRAY", "OBJECT", "STRING", "NUMBER", "TRUE", "FALSE", "NULL" ], + "type" : "string" + }, + "VerifyPinResponse" : { + "type" : "object", + "properties" : { + "status" : { + "$ref" : "#/components/schemas/Status" + }, + "pinResultEnum" : { + "$ref" : "#/components/schemas/PinResultEnum" + }, + "leftTries" : { + "type" : "integer" + } + } + }, "VersionInfoType" : { "type" : "object", "properties" : { @@ -727,24 +6612,22 @@ "XMLGregorianCalendar" : { "type" : "object", "properties" : { - "day" : { - "format" : "int32", + "year" : { "type" : "integer" }, - "eon" : { + "month" : { + "format" : "int32", "type" : "integer" }, - "eonAndYear" : { + "day" : { + "format" : "int32", "type" : "integer" }, - "fractionalSecond" : { - "type" : "number" - }, - "hour" : { + "timezone" : { "format" : "int32", "type" : "integer" }, - "millisecond" : { + "hour" : { "format" : "int32", "type" : "integer" }, @@ -752,29 +6635,120 @@ "format" : "int32", "type" : "integer" }, - "month" : { + "second" : { "format" : "int32", "type" : "integer" }, - "second" : { + "millisecond" : { "format" : "int32", "type" : "integer" }, - "timezone" : { - "format" : "int32", + "fractionalSecond" : { + "type" : "number" + }, + "eon" : { + "type" : "integer" + }, + "eonAndYear" : { "type" : "integer" }, "xMLSchemaType" : { "$ref" : "#/components/schemas/QName" }, - "year" : { - "format" : "int32", - "type" : "integer" - }, "valid" : { "type" : "boolean" } } + }, + "XhtmlNode" : { + "type" : "object", + "properties" : { + "location" : { + "$ref" : "#/components/schemas/Location" + }, + "nodeType" : { + "$ref" : "#/components/schemas/NodeType" + }, + "name" : { + "type" : "string" + }, + "attributes" : { + "type" : "object", + "additionalProperties" : { + "type" : "string" + } + }, + "childNodes" : { + "$ref" : "#/components/schemas/XhtmlNodeList" + }, + "content" : { + "type" : "string" + }, + "notPretty" : { + "type" : "boolean" + }, + "seperated" : { + "type" : "boolean" + }, + "emptyExpanded" : { + "type" : "boolean" + }, + "namedParams" : { + "type" : "object", + "additionalProperties" : { + "$ref" : "#/components/schemas/XhtmlNode" + } + }, + "namedParamValues" : { + "type" : "object", + "additionalProperties" : { + "type" : "string" + } + }, + "userData" : { + "type" : "object", + "additionalProperties" : { } + }, + "firstElement" : { + "$ref" : "#/components/schemas/XhtmlNode" + }, + "empty" : { + "type" : "boolean" + }, + "nsDecl" : { + "type" : "string" + }, + "valueAsString" : { + "type" : "string" + }, + "value" : { + "type" : "string" + }, + "formatCommentsPre" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "formatCommentsPost" : { + "type" : "array", + "items" : { + "type" : "string" + } + }, + "noPretty" : { + "type" : "boolean" + }, + "para" : { + "type" : "boolean" + } + } + }, + "XhtmlNodeList" : { + "type" : "array", + "items" : { + "$ref" : "#/components/schemas/XhtmlNode" + } } } } diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml index be33410d1..aad238c47 100644 --- a/openapi/openapi.yaml +++ b/openapi/openapi.yaml @@ -1,61 +1,182 @@ --- openapi: 3.0.3 info: - title: Generated API - version: "1.0" + title: ere-ps-app API + version: 1.0.0-SNAPSHOT paths: + /card/change-pin: + post: + tags: + - Card Resource + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ChangePinParameter" + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/ChangePinResponse" + /card/pin-status: + get: + tags: + - Card Resource + parameters: + - name: cardHandle + in: query + schema: + type: string + - name: pinType + in: query + schema: + type: string + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/GetPinStatusResponse" + /card/unblock-pin: + post: + tags: + - Card Resource + requestBody: + content: + text/plain: + schema: + type: string + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/UnblockPinResponse" + /card/verify-pin: + post: + tags: + - Card Resource + requestBody: + content: + text/plain: + schema: + type: string + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/VerifyPinResponse" /config: get: + tags: + - User Configurations Resource responses: "200": description: OK put: + tags: + - User Configurations Resource requestBody: content: application/json: schema: - $ref: '#/components/schemas/UserConfigurations' + $ref: "#/components/schemas/UserConfigurations" responses: "200": description: OK /document/bundles: post: + tags: + - Document Resource requestBody: content: - application/json: + text/plain: schema: type: string responses: "200": description: OK - /ipp/{queue}: + /kbv/transform: post: - parameters: - - name: queue - in: path - required: true - schema: - type: string + tags: + - XSLT Resource requestBody: content: - application/json: + text/plain: schema: - $ref: '#/components/schemas/InputStream' + type: string responses: "200": description: OK - /kbv/transform: + /pharmacy/Accept: + get: + tags: + - Pharmacy Resource + parameters: + - name: token + in: query + schema: + type: string + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/Bundle" + /pharmacy/Task: + get: + tags: + - Pharmacy Resource + parameters: + - name: egkHandle + in: query + schema: + type: string + - name: smcbHandle + in: query + schema: + type: string + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/Bundle" + /preview/generate: post: + tags: + - Preview Resource requestBody: content: - application/json: + text/plain: schema: type: string responses: "200": description: OK + content: + text/plain: + schema: + type: string + /status: + get: + tags: + - Status Resource + responses: + "200": + description: OK /validate: post: + tags: + - Prescription Bundle Validator Resource requestBody: content: application/xml: @@ -64,24 +185,30 @@ paths: application/json: schema: type: object + additionalProperties: + $ref: "#/components/schemas/JsonValue" responses: "200": description: OK /workflow/abort: post: + tags: + - E Rezept Workflow Resource requestBody: content: application/json: schema: - $ref: '#/components/schemas/AbortERezept' + $ref: "#/components/schemas/AbortERezept" responses: "200": description: OK /workflow/batch-sign: post: + tags: + - E Rezept Workflow Resource requestBody: content: - application/json: + text/plain: schema: type: string responses: @@ -89,67 +216,119 @@ paths: description: OK /workflow/cards: get: + tags: + - E Rezept Workflow Resource responses: "200": description: OK content: application/json: schema: - $ref: '#/components/schemas/GetCardsResponse' + $ref: "#/components/schemas/GetCardsResponse" /workflow/comfortsignature/activate: post: + tags: + - E Rezept Workflow Resource responses: "200": description: OK /workflow/comfortsignature/deactivate: post: + tags: + - E Rezept Workflow Resource responses: "200": description: OK /workflow/comfortsignature/user-id: get: + tags: + - E Rezept Workflow Resource responses: "200": description: OK post: + tags: + - E Rezept Workflow Resource requestBody: content: - application/json: + text/plain: schema: type: string responses: "200": description: OK + /workflow/idp-token: + get: + tags: + - E Rezept Workflow Resource + responses: + "200": + description: OK + content: + text/plain: + schema: + type: string /workflow/sign: post: + tags: + - E Rezept Workflow Resource requestBody: content: - application/json: + text/plain: schema: type: string responses: "200": description: OK + /workflow/signature-mode: + get: + tags: + - E Rezept Workflow Resource + responses: + "200": + description: OK + content: + application/json: + schema: + $ref: "#/components/schemas/GetSignatureModeResponseEvent" /workflow/task: post: + tags: + - E Rezept Workflow Resource + parameters: + - name: flowtype + in: query + schema: + type: string + responses: + "200": + description: OK + /workflow/test-prescription: + post: + tags: + - E Rezept Workflow Resource responses: "200": description: OK /workflow/update: post: + tags: + - E Rezept Workflow Resource requestBody: content: application/json: schema: - $ref: '#/components/schemas/UpdateERezept' + $ref: "#/components/schemas/UpdateERezept" responses: "200": description: OK /xmlPrescription: post: + tags: + - Xml Prescription Resource requestBody: content: - application/json: + text/plain: schema: type: string responses: @@ -160,187 +339,4039 @@ components: AbortERezept: type: object properties: - accessCode: - type: string taskId: type: string - CardInfoType: + accessCode: + type: string + Address: type: object properties: - cardHandle: - type: string - xml: - name: CardHandle - cardType: - allOf: - - $ref: '#/components/schemas/CardTypeType' - - xml: - name: CardType - cardVersion: - allOf: - - $ref: '#/components/schemas/CardVersion' - - xml: - name: CardVersion - iccsn: - type: string - xml: - name: Iccsn - ctId: - type: string - xml: - name: CtId - slotId: - type: integer - xml: - name: SlotId - insertTime: - allOf: - - $ref: '#/components/schemas/XMLGregorianCalendar' - - xml: - name: InsertTime - cardHolderName: - type: string - xml: - name: CardHolderName - kvnr: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: type: string - xml: - name: Kvnr - certificateExpirationDate: - allOf: - - $ref: '#/components/schemas/XMLGregorianCalendar' - - xml: - name: CertificateExpirationDate - CardTypeType: + use: + $ref: "#/components/schemas/EnumerationAddressUse" + type: + $ref: "#/components/schemas/EnumerationAddressType" + text: + $ref: "#/components/schemas/StringType" + line: + type: array + items: + $ref: "#/components/schemas/StringType" + city: + $ref: "#/components/schemas/StringType" + district: + $ref: "#/components/schemas/StringType" + state: + $ref: "#/components/schemas/StringType" + postalCode: + $ref: "#/components/schemas/StringType" + country: + $ref: "#/components/schemas/StringType" + period: + $ref: "#/components/schemas/Period" + useElement: + $ref: "#/components/schemas/EnumerationAddressUse" + typeElement: + $ref: "#/components/schemas/EnumerationAddressType" + textElement: + $ref: "#/components/schemas/StringType" + cityElement: + $ref: "#/components/schemas/StringType" + districtElement: + $ref: "#/components/schemas/StringType" + stateElement: + $ref: "#/components/schemas/StringType" + postalCodeElement: + $ref: "#/components/schemas/StringType" + countryElement: + $ref: "#/components/schemas/StringType" + empty: + type: boolean + AddressType: enum: - - EGK - - HBA - - HBA_Q_SIG - - HB_AX - - HSM_B - - KVK - - SMC_B - - SMC_KT - - SM_B - - UNKNOWN - - ZOD_2_0 + - POSTAL + - PHYSICAL + - BOTH + - "NULL" type: string - CardVersion: - type: object - properties: - cosVersion: - allOf: - - $ref: '#/components/schemas/VersionInfoType' - - xml: - name: COSVersion - objectSystemVersion: - allOf: - - $ref: '#/components/schemas/VersionInfoType' - - xml: - name: ObjectSystemVersion - cardPTPersVersion: - allOf: - - $ref: '#/components/schemas/VersionInfoType' - - xml: - name: CardPTPersVersion - dataStructureVersion: - allOf: - - $ref: '#/components/schemas/VersionInfoType' - - xml: - name: DataStructureVersion - loggingVersion: - allOf: - - $ref: '#/components/schemas/VersionInfoType' - - xml: - name: LoggingVersion - atrVersion: - allOf: - - $ref: '#/components/schemas/VersionInfoType' - - xml: - name: ATRVersion - gdoVersion: - allOf: - - $ref: '#/components/schemas/VersionInfoType' - - xml: - name: GDOVersion - keyInfoVersion: - allOf: - - $ref: '#/components/schemas/VersionInfoType' - - xml: - name: KeyInfoVersion - Cards: + AddressUse: + enum: + - HOME + - WORK + - TEMP + - OLD + - BILLING + - "NULL" + type: string + Base64BinaryType: type: object properties: - card: + formatCommentsPre: type: array items: - $ref: '#/components/schemas/CardInfoType' - xml: - name: Card - Detail: - type: object - properties: - value: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: type: string - encoding: + myCoercedValue: + format: binary type: string - xml: - name: Encoding - attribute: true - Error: + items: + format: byte + type: string + myStringValue: + type: string + primitive: + type: boolean + myValue: + format: binary + type: string + valueAsString: + type: string + value: + format: binary + type: string + empty: + type: boolean + BaseCalendar: type: object properties: - messageID: + name: type: string - xml: - name: MessageID - timestamp: - allOf: - - $ref: '#/components/schemas/XMLGregorianCalendar' - - xml: - name: Timestamp - trace: + eras: type: array items: - $ref: '#/components/schemas/Trace' - xml: - name: Trace - GetCardsResponse: - type: object - properties: - status: - allOf: - - $ref: '#/components/schemas/Status' - - xml: - name: Status - cards: - allOf: - - $ref: '#/components/schemas/Cards' - - xml: - name: Cards - InputStream: - type: object - QName: + $ref: "#/components/schemas/Era" + calendarDate: + $ref: "#/components/schemas/CalendarDate" + BaseDateTimeType: type: object properties: - localPart: - type: string - namespaceURI: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: type: string - prefix: + valueAsString: type: string - Status: - type: object - properties: - result: + myCoercedValue: + $ref: "#/components/schemas/Date" + myStringValue: type: string - xml: + value: + $ref: "#/components/schemas/Date" + empty: + type: boolean + primitive: + type: boolean + myFractionalSeconds: + type: string + myPrecision: + $ref: "#/components/schemas/TemporalPrecisionEnum" + myTimeZone: + $ref: "#/components/schemas/TimeZone" + myTimeZoneZulu: + type: boolean + day: + format: int32 + type: integer + defaultPrecisionForDatatype: + $ref: "#/components/schemas/TemporalPrecisionEnum" + hour: + format: int32 + type: integer + millis: + format: int32 + type: integer + minute: + format: int32 + type: integer + month: + format: int32 + type: integer + secondsMilli: + format: float + type: number + nanos: + format: int64 + type: integer + precision: + $ref: "#/components/schemas/TemporalPrecisionEnum" + second: + format: int32 + type: integer + timeZone: + $ref: "#/components/schemas/TimeZone" + valueAsCalendar: + $ref: "#/components/schemas/GregorianCalendar" + year: + format: int32 + type: integer + timeZoneZulu: + type: boolean + today: + type: boolean + valueAsV3String: + type: string + dateTime: + type: boolean + highEdge: + $ref: "#/components/schemas/BaseDateTimeType" + BooleanType: + type: object + properties: + valueAsString: + type: string + value: {} + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + type: boolean + myStringValue: + type: string + primitive: + type: boolean + booleanPrimitive: + type: boolean + Bundle: + type: object + properties: + meta: + $ref: "#/components/schemas/IBaseMetaType" + idElement: + $ref: "#/components/schemas/IIdType" + structureFhirVersionEnum: + $ref: "#/components/schemas/FhirVersionEnum" + deleted: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + resource: + type: boolean + id: + $ref: "#/components/schemas/IdType" + implicitRules: + $ref: "#/components/schemas/UriType" + language: + $ref: "#/components/schemas/CodeType" + idPart: + type: string + implicitRulesElement: + $ref: "#/components/schemas/UriType" + languageElement: + $ref: "#/components/schemas/CodeType" + idBase: + type: string + identifier: + $ref: "#/components/schemas/Identifier" + type: + $ref: "#/components/schemas/EnumerationBundleType" + timestamp: + $ref: "#/components/schemas/InstantType" + total: + $ref: "#/components/schemas/UnsignedIntType" + link: + type: array + items: + $ref: "#/components/schemas/BundleLinkComponent" + entry: + type: array + items: + $ref: "#/components/schemas/BundleEntryComponent" + signature: + $ref: "#/components/schemas/Signature" + typeElement: + $ref: "#/components/schemas/EnumerationBundleType" + timestampElement: + $ref: "#/components/schemas/InstantType" + totalElement: + $ref: "#/components/schemas/UnsignedIntType" + linkFirstRep: + $ref: "#/components/schemas/BundleLinkComponent" + entryFirstRep: + $ref: "#/components/schemas/BundleEntryComponent" + empty: + type: boolean + resourceType: + $ref: "#/components/schemas/ResourceType" + BundleEntryComponent: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + modifierExtension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + modifierExtensionFirstRep: + $ref: "#/components/schemas/Extension" + link: + type: array + items: + $ref: "#/components/schemas/BundleLinkComponent" + fullUrl: + $ref: "#/components/schemas/UriType" + resource: + $ref: "#/components/schemas/Resource" + search: + $ref: "#/components/schemas/BundleEntrySearchComponent" + request: + $ref: "#/components/schemas/BundleEntryRequestComponent" + response: + $ref: "#/components/schemas/BundleEntryResponseComponent" + linkFirstRep: + $ref: "#/components/schemas/BundleLinkComponent" + fullUrlElement: + $ref: "#/components/schemas/UriType" + empty: + type: boolean + BundleEntryRequestComponent: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + modifierExtension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + modifierExtensionFirstRep: + $ref: "#/components/schemas/Extension" + method: + $ref: "#/components/schemas/EnumerationHTTPVerb" + url: + $ref: "#/components/schemas/UriType" + ifNoneMatch: + $ref: "#/components/schemas/StringType" + ifModifiedSince: + $ref: "#/components/schemas/InstantType" + ifMatch: + $ref: "#/components/schemas/StringType" + ifNoneExist: + $ref: "#/components/schemas/StringType" + methodElement: + $ref: "#/components/schemas/EnumerationHTTPVerb" + urlElement: + $ref: "#/components/schemas/UriType" + ifNoneMatchElement: + $ref: "#/components/schemas/StringType" + ifModifiedSinceElement: + $ref: "#/components/schemas/InstantType" + ifMatchElement: + $ref: "#/components/schemas/StringType" + ifNoneExistElement: + $ref: "#/components/schemas/StringType" + empty: + type: boolean + BundleEntryResponseComponent: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + modifierExtension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + modifierExtensionFirstRep: + $ref: "#/components/schemas/Extension" + status: + $ref: "#/components/schemas/StringType" + location: + $ref: "#/components/schemas/UriType" + etag: + $ref: "#/components/schemas/StringType" + lastModified: + $ref: "#/components/schemas/InstantType" + outcome: + $ref: "#/components/schemas/Resource" + statusElement: + $ref: "#/components/schemas/StringType" + locationElement: + $ref: "#/components/schemas/UriType" + etagElement: + $ref: "#/components/schemas/StringType" + lastModifiedElement: + $ref: "#/components/schemas/InstantType" + empty: + type: boolean + BundleEntrySearchComponent: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + modifierExtension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + modifierExtensionFirstRep: + $ref: "#/components/schemas/Extension" + mode: + $ref: "#/components/schemas/EnumerationSearchEntryMode" + score: + $ref: "#/components/schemas/DecimalType" + modeElement: + $ref: "#/components/schemas/EnumerationSearchEntryMode" + scoreElement: + $ref: "#/components/schemas/DecimalType" + empty: + type: boolean + BundleLinkComponent: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + modifierExtension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + modifierExtensionFirstRep: + $ref: "#/components/schemas/Extension" + relation: + $ref: "#/components/schemas/StringType" + url: + $ref: "#/components/schemas/UriType" + relationElement: + $ref: "#/components/schemas/StringType" + urlElement: + $ref: "#/components/schemas/UriType" + empty: + type: boolean + BundleType: + enum: + - DOCUMENT + - MESSAGE + - TRANSACTION + - TRANSACTIONRESPONSE + - BATCH + - BATCHRESPONSE + - HISTORY + - SEARCHSET + - COLLECTION + - "NULL" + type: string + CalendarDate: + type: object + properties: + era: + $ref: "#/components/schemas/Era" + year: + format: int32 + type: integer + month: + format: int32 + type: integer + dayOfMonth: + format: int32 + type: integer + dayOfWeek: + format: int32 + type: integer + leapYear: + type: boolean + hours: + format: int32 + type: integer + minutes: + format: int32 + type: integer + seconds: + format: int32 + type: integer + millis: + format: int32 + type: integer + fraction: + format: int64 + type: integer + normalized: + type: boolean + zoneinfo: + $ref: "#/components/schemas/TimeZone" + zoneOffset: + format: int32 + type: integer + daylightSaving: + format: int32 + type: integer + forceStandardTime: + type: boolean + locale: + $ref: "#/components/schemas/Locale" + timeOfDay: + format: int64 + type: integer + standardTime: + type: boolean + daylightTime: + type: boolean + zone: + $ref: "#/components/schemas/TimeZone" + CanonicalType: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + type: string + myStringValue: + type: string + value: + type: string + valueAsString: + type: string + empty: + type: boolean + primitive: + type: boolean + CardInfoType: + type: object + properties: + cardHandle: + type: string + xml: + name: CardHandle + cardType: + type: string + allOf: + - $ref: "#/components/schemas/CardTypeType" + xml: + name: CardType + cardVersion: + type: object + allOf: + - $ref: "#/components/schemas/CardVersion" + xml: + name: CardVersion + iccsn: + type: string + xml: + name: Iccsn + ctId: + type: string + xml: + name: CtId + slotId: + type: integer + xml: + name: SlotId + insertTime: + type: object + allOf: + - $ref: "#/components/schemas/XMLGregorianCalendar" + xml: + name: InsertTime + cardHolderName: + type: string + xml: + name: CardHolderName + kvnr: + type: string + xml: + name: Kvnr + certificateExpirationDate: + type: object + allOf: + - $ref: "#/components/schemas/XMLGregorianCalendar" + xml: + name: CertificateExpirationDate + CardTypeType: + enum: + - EGK + - HBA_Q_SIG + - HBA + - SMC_B + - HSM_B + - SMC_KT + - KVK + - ZOD_2_0 + - UNKNOWN + - HB_AX + - SM_B + type: string + CardVersion: + type: object + properties: + cosVersion: + type: object + allOf: + - $ref: "#/components/schemas/VersionInfoType" + xml: + name: COSVersion + objectSystemVersion: + type: object + allOf: + - $ref: "#/components/schemas/VersionInfoType" + xml: + name: ObjectSystemVersion + cardPTPersVersion: + type: object + allOf: + - $ref: "#/components/schemas/VersionInfoType" + xml: + name: CardPTPersVersion + dataStructureVersion: + type: object + allOf: + - $ref: "#/components/schemas/VersionInfoType" + xml: + name: DataStructureVersion + loggingVersion: + type: object + allOf: + - $ref: "#/components/schemas/VersionInfoType" + xml: + name: LoggingVersion + atrVersion: + type: object + allOf: + - $ref: "#/components/schemas/VersionInfoType" + xml: + name: ATRVersion + gdoVersion: + type: object + allOf: + - $ref: "#/components/schemas/VersionInfoType" + xml: + name: GDOVersion + keyInfoVersion: + type: object + allOf: + - $ref: "#/components/schemas/VersionInfoType" + xml: + name: KeyInfoVersion + Cards: + type: object + properties: + card: + type: array + items: + $ref: "#/components/schemas/CardInfoType" + xml: + name: Card + ChangePinParameter: + type: object + properties: + cardHandle: + type: string + pinType: + type: string + ChangePinResponse: + type: object + properties: + status: + $ref: "#/components/schemas/Status" + pinResultEnum: + $ref: "#/components/schemas/PinResultEnum" + leftTries: + type: integer + CodeType: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + type: string + myStringValue: + type: string + value: + type: string + valueAsString: + type: string + empty: + type: boolean + primitive: + type: boolean + valueNotNull: + type: string + system: + type: string + version: + type: string + display: + type: string + code: + type: string + CodeableConcept: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + coding: + type: array + items: + $ref: "#/components/schemas/Coding" + text: + $ref: "#/components/schemas/StringType" + codingFirstRep: + $ref: "#/components/schemas/Coding" + textElement: + $ref: "#/components/schemas/StringType" + empty: + type: boolean + Coding: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + system: + $ref: "#/components/schemas/UriType" + version: + $ref: "#/components/schemas/StringType" + code: + $ref: "#/components/schemas/CodeType" + display: + $ref: "#/components/schemas/StringType" + userSelected: + $ref: "#/components/schemas/BooleanType" + systemElement: + $ref: "#/components/schemas/UriType" + versionElement: + $ref: "#/components/schemas/StringType" + codeElement: + $ref: "#/components/schemas/CodeType" + displayElement: + $ref: "#/components/schemas/StringType" + userSelectedElement: + $ref: "#/components/schemas/BooleanType" + empty: + type: boolean + ComfortSignatureStatusEnum: + enum: + - ENABLED + - DISABLED + type: string + ContactPoint: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + system: + $ref: "#/components/schemas/EnumerationContactPointSystem" + value: + $ref: "#/components/schemas/StringType" + use: + $ref: "#/components/schemas/EnumerationContactPointUse" + rank: + $ref: "#/components/schemas/PositiveIntType" + period: + $ref: "#/components/schemas/Period" + systemElement: + $ref: "#/components/schemas/EnumerationContactPointSystem" + valueElement: + $ref: "#/components/schemas/StringType" + useElement: + $ref: "#/components/schemas/EnumerationContactPointUse" + rankElement: + $ref: "#/components/schemas/PositiveIntType" + empty: + type: boolean + ContactPointSystem: + enum: + - PHONE + - FAX + - EMAIL + - PAGER + - URL + - SMS + - OTHER + - "NULL" + type: string + ContactPointUse: + enum: + - HOME + - WORK + - TEMP + - OLD + - MOBILE + - "NULL" + type: string + Date: + format: date + type: string + example: 2022-03-10 + Date1: + type: object + properties: + era: + $ref: "#/components/schemas/Era" + year: + format: int32 + type: integer + month: + format: int32 + type: integer + dayOfMonth: + format: int32 + type: integer + dayOfWeek: + format: int32 + type: integer + leapYear: + type: boolean + hours: + format: int32 + type: integer + minutes: + format: int32 + type: integer + seconds: + format: int32 + type: integer + millis: + format: int32 + type: integer + fraction: + format: int64 + type: integer + normalized: + type: boolean + zoneinfo: + $ref: "#/components/schemas/TimeZone" + zoneOffset: + format: int32 + type: integer + daylightSaving: + format: int32 + type: integer + forceStandardTime: + type: boolean + locale: + $ref: "#/components/schemas/Locale" + timeOfDay: + format: int64 + type: integer + standardTime: + type: boolean + daylightTime: + type: boolean + zone: + $ref: "#/components/schemas/TimeZone" + cachedYear: + format: int32 + type: integer + cachedFixedDateJan1: + format: int64 + type: integer + cachedFixedDateNextJan1: + format: int64 + type: integer + normalizedYear: + format: int32 + type: integer + cachedJan1: + format: int64 + type: integer + DateTimeType: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + valueAsString: + type: string + myCoercedValue: + $ref: "#/components/schemas/Date" + myStringValue: + type: string + value: + $ref: "#/components/schemas/Date" + empty: + type: boolean + primitive: + type: boolean + myFractionalSeconds: + type: string + myPrecision: + $ref: "#/components/schemas/TemporalPrecisionEnum" + myTimeZone: + $ref: "#/components/schemas/TimeZone" + myTimeZoneZulu: + type: boolean + day: + format: int32 + type: integer + hour: + format: int32 + type: integer + millis: + format: int32 + type: integer + minute: + format: int32 + type: integer + month: + format: int32 + type: integer + secondsMilli: + format: float + type: number + nanos: + format: int64 + type: integer + precision: + $ref: "#/components/schemas/TemporalPrecisionEnum" + second: + format: int32 + type: integer + timeZone: + $ref: "#/components/schemas/TimeZone" + valueAsCalendar: + $ref: "#/components/schemas/GregorianCalendar" + year: + format: int32 + type: integer + timeZoneZulu: + type: boolean + today: + type: boolean + valueAsV3String: + type: string + highEdge: + $ref: "#/components/schemas/BaseDateTimeType" + defaultPrecisionForDatatype: + $ref: "#/components/schemas/TemporalPrecisionEnum" + tzSign: + type: boolean + tzHour: + format: int32 + type: integer + tzMin: + format: int32 + type: integer + asV3: + type: string + dateTime: + type: boolean + DecimalType: + type: object + properties: + valueAsString: + type: string + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + type: number + myStringValue: + type: string + primitive: + type: boolean + valueAsInteger: + format: int32 + type: integer + valueAsNumber: + type: number + value: + format: int64 + type: integer + Detail: + type: object + properties: + value: + type: string + encoding: + type: string + xml: + name: Encoding + attribute: true + Duration: + type: object + properties: + xMLSchemaType: + $ref: "#/components/schemas/QName" + sign: + format: int32 + type: integer + years: + format: int32 + type: integer + months: + format: int32 + type: integer + days: + format: int32 + type: integer + hours: + format: int32 + type: integer + minutes: + format: int32 + type: integer + seconds: + format: int32 + type: integer + Endpoint: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + id: + type: string + idElement: + $ref: "#/components/schemas/IIdType" + languageElement: + $ref: "#/components/schemas/IPrimitiveTypeString" + meta: + $ref: "#/components/schemas/IBaseMetaType" + structureFhirVersionEnum: + $ref: "#/components/schemas/FhirVersionEnum" + deleted: + type: boolean + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + resource: + type: boolean + implicitRules: + $ref: "#/components/schemas/UriType" + language: + $ref: "#/components/schemas/CodeType" + idPart: + type: string + implicitRulesElement: + $ref: "#/components/schemas/UriType" + idBase: + type: string + text: + $ref: "#/components/schemas/Narrative" + contained: + type: array + items: + $ref: "#/components/schemas/Resource" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + modifierExtension: + type: array + items: + $ref: "#/components/schemas/Extension" + identifier: + type: array + items: + $ref: "#/components/schemas/Identifier" + status: + $ref: "#/components/schemas/EnumerationEndpointStatus" + connectionType: + $ref: "#/components/schemas/Coding" + name: + $ref: "#/components/schemas/StringType" + managingOrganization: + $ref: "#/components/schemas/Reference" + managingOrganizationTarget: + $ref: "#/components/schemas/Organization" + contact: + type: array + items: + $ref: "#/components/schemas/ContactPoint" + period: + $ref: "#/components/schemas/Period" + payloadType: + type: array + items: + $ref: "#/components/schemas/CodeableConcept" + payloadMimeType: + type: array + items: + $ref: "#/components/schemas/CodeType" + address: + $ref: "#/components/schemas/UrlType" + header: + type: array + items: + $ref: "#/components/schemas/StringType" + identifierFirstRep: + $ref: "#/components/schemas/Identifier" + statusElement: + $ref: "#/components/schemas/EnumerationEndpointStatus" + nameElement: + $ref: "#/components/schemas/StringType" + contactFirstRep: + $ref: "#/components/schemas/ContactPoint" + payloadTypeFirstRep: + $ref: "#/components/schemas/CodeableConcept" + addressElement: + $ref: "#/components/schemas/UrlType" + empty: + type: boolean + resourceType: + $ref: "#/components/schemas/ResourceType" + EndpointStatus: + enum: + - ACTIVE + - SUSPENDED + - ERROR + - "OFF" + - ENTEREDINERROR + - TEST + - "NULL" + type: string + EnumFactoryAddressType: + type: object + EnumFactoryAddressUse: + type: object + EnumFactoryBundleType: + type: object + EnumFactoryContactPointSystem: + type: object + EnumFactoryContactPointUse: + type: object + EnumFactoryEndpointStatus: + type: object + EnumFactoryHTTPVerb: + type: object + EnumFactoryIdentifierUse: + type: object + EnumFactoryNameUse: + type: object + EnumFactoryNarrativeStatus: + type: object + EnumFactorySearchEntryMode: + type: object + EnumerationAddressType: + type: object + properties: + valueAsString: + type: string + value: + $ref: "#/components/schemas/AddressType" + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + $ref: "#/components/schemas/AddressType" + myStringValue: + type: string + primitive: + type: boolean + myEnumFactory: + $ref: "#/components/schemas/EnumFactoryAddressType" + enumFactory: + $ref: "#/components/schemas/EnumFactoryAddressType" + system: + type: string + version: + type: string + code: + type: string + display: + type: string + EnumerationAddressUse: + type: object + properties: + valueAsString: + type: string + value: + $ref: "#/components/schemas/AddressUse" + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + $ref: "#/components/schemas/AddressUse" + myStringValue: + type: string + primitive: + type: boolean + myEnumFactory: + $ref: "#/components/schemas/EnumFactoryAddressUse" + enumFactory: + $ref: "#/components/schemas/EnumFactoryAddressUse" + system: + type: string + version: + type: string + code: + type: string + display: + type: string + EnumerationBundleType: + type: object + properties: + valueAsString: + type: string + value: + $ref: "#/components/schemas/BundleType" + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + $ref: "#/components/schemas/BundleType" + myStringValue: + type: string + primitive: + type: boolean + myEnumFactory: + $ref: "#/components/schemas/EnumFactoryBundleType" + enumFactory: + $ref: "#/components/schemas/EnumFactoryBundleType" + system: + type: string + version: + type: string + code: + type: string + display: + type: string + EnumerationContactPointSystem: + type: object + properties: + valueAsString: + type: string + value: + $ref: "#/components/schemas/ContactPointSystem" + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + $ref: "#/components/schemas/ContactPointSystem" + myStringValue: + type: string + primitive: + type: boolean + myEnumFactory: + $ref: "#/components/schemas/EnumFactoryContactPointSystem" + enumFactory: + $ref: "#/components/schemas/EnumFactoryContactPointSystem" + system: + type: string + version: + type: string + code: + type: string + display: + type: string + EnumerationContactPointUse: + type: object + properties: + valueAsString: + type: string + value: + $ref: "#/components/schemas/ContactPointUse" + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + $ref: "#/components/schemas/ContactPointUse" + myStringValue: + type: string + primitive: + type: boolean + myEnumFactory: + $ref: "#/components/schemas/EnumFactoryContactPointUse" + enumFactory: + $ref: "#/components/schemas/EnumFactoryContactPointUse" + system: + type: string + version: + type: string + code: + type: string + display: + type: string + EnumerationEndpointStatus: + type: object + properties: + valueAsString: + type: string + value: + $ref: "#/components/schemas/EndpointStatus" + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + $ref: "#/components/schemas/EndpointStatus" + myStringValue: + type: string + primitive: + type: boolean + myEnumFactory: + $ref: "#/components/schemas/EnumFactoryEndpointStatus" + enumFactory: + $ref: "#/components/schemas/EnumFactoryEndpointStatus" + system: + type: string + version: + type: string + code: + type: string + display: + type: string + EnumerationHTTPVerb: + type: object + properties: + valueAsString: + type: string + value: + $ref: "#/components/schemas/HTTPVerb" + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + $ref: "#/components/schemas/HTTPVerb" + myStringValue: + type: string + primitive: + type: boolean + myEnumFactory: + $ref: "#/components/schemas/EnumFactoryHTTPVerb" + enumFactory: + $ref: "#/components/schemas/EnumFactoryHTTPVerb" + system: + type: string + version: + type: string + code: + type: string + display: + type: string + EnumerationIdentifierUse: + type: object + properties: + valueAsString: + type: string + value: + $ref: "#/components/schemas/IdentifierUse" + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + $ref: "#/components/schemas/IdentifierUse" + myStringValue: + type: string + primitive: + type: boolean + myEnumFactory: + $ref: "#/components/schemas/EnumFactoryIdentifierUse" + enumFactory: + $ref: "#/components/schemas/EnumFactoryIdentifierUse" + system: + type: string + version: + type: string + code: + type: string + display: + type: string + EnumerationNameUse: + type: object + properties: + valueAsString: + type: string + value: + $ref: "#/components/schemas/NameUse" + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + $ref: "#/components/schemas/NameUse" + myStringValue: + type: string + primitive: + type: boolean + myEnumFactory: + $ref: "#/components/schemas/EnumFactoryNameUse" + enumFactory: + $ref: "#/components/schemas/EnumFactoryNameUse" + system: + type: string + version: + type: string + code: + type: string + display: + type: string + EnumerationNarrativeStatus: + type: object + properties: + valueAsString: + type: string + value: + $ref: "#/components/schemas/NarrativeStatus" + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + $ref: "#/components/schemas/NarrativeStatus" + myStringValue: + type: string + primitive: + type: boolean + myEnumFactory: + $ref: "#/components/schemas/EnumFactoryNarrativeStatus" + enumFactory: + $ref: "#/components/schemas/EnumFactoryNarrativeStatus" + system: + type: string + version: + type: string + code: + type: string + display: + type: string + EnumerationSearchEntryMode: + type: object + properties: + valueAsString: + type: string + value: + $ref: "#/components/schemas/SearchEntryMode" + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + $ref: "#/components/schemas/SearchEntryMode" + myStringValue: + type: string + primitive: + type: boolean + myEnumFactory: + $ref: "#/components/schemas/EnumFactorySearchEntryMode" + enumFactory: + $ref: "#/components/schemas/EnumFactorySearchEntryMode" + system: + type: string + version: + type: string + code: + type: string + display: + type: string + Era: + type: object + properties: + name: + type: string + abbr: + type: string + since: + format: int64 + type: integer + sinceDate: + $ref: "#/components/schemas/CalendarDate" + localTime: + type: boolean + hash: + format: int32 + type: integer + abbreviation: + type: string + Error: + type: object + properties: + messageID: + type: string + xml: + name: MessageID + timestamp: + type: object + allOf: + - $ref: "#/components/schemas/XMLGregorianCalendar" + xml: + name: Timestamp + trace: + type: array + items: + $ref: "#/components/schemas/Trace" + xml: + name: Trace + Extension: + type: object + properties: + extension: + type: array + items: {} + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + valueAsPrimitive: + $ref: "#/components/schemas/IPrimitiveTypeObject" + url: + $ref: "#/components/schemas/UriType" + value: + $ref: "#/components/schemas/Type" + urlElement: + $ref: "#/components/schemas/UriType" + empty: + type: boolean + FhirVersionEnum: + enum: + - DSTU2 + - DSTU2_HL7ORG + - DSTU2_1 + - DSTU3 + - R4 + - R4B + - R5 + type: string + GetCardsResponse: + type: object + properties: + status: + type: object + allOf: + - $ref: "#/components/schemas/Status" + xml: + name: Status + cards: + type: object + allOf: + - $ref: "#/components/schemas/Cards" + xml: + name: Cards + GetPinStatusResponse: + type: object + properties: + status: + $ref: "#/components/schemas/Status" + pinResultEnum: + $ref: "#/components/schemas/PinStatusEnum" + leftTries: + type: integer + pinStatusEnum: + $ref: "#/components/schemas/PinStatusEnum" + GetSignatureModeResponseEvent: + type: object + properties: + status: + $ref: "#/components/schemas/Status" + comfortSignatureStatus: + $ref: "#/components/schemas/ComfortSignatureStatusEnum" + comfortSignatureMax: + format: int32 + type: integer + comfortSignatureTimer: + $ref: "#/components/schemas/Duration" + sessionInfo: + $ref: "#/components/schemas/SessionInfo" + userId: + type: string + answertToActivateComfortSignature: + type: boolean + GregorianCalendar: + type: object + properties: + fields: + type: array + items: + format: int32 + type: integer + isSet: + type: array + items: + type: boolean + time: + format: int64 + type: integer + isTimeSet: + type: boolean + areFieldsSet: + type: boolean + lenient: + type: boolean + zone: + $ref: "#/components/schemas/TimeZone" + firstDayOfWeek: + format: int32 + type: integer + minimalDaysInFirstWeek: + format: int32 + type: integer + nextStamp: + format: int32 + type: integer + serialVersionOnStream: + format: int32 + type: integer + timeInMillis: + format: int64 + type: integer + setStateFields: + format: int32 + type: integer + fieldsComputed: + format: int32 + type: integer + fieldsNormalized: + format: int32 + type: integer + partiallyNormalized: + type: boolean + fullyNormalized: + type: boolean + zoneShared: + type: boolean + weekCountData: + $ref: "#/components/schemas/Locale" + gregorianCutover: + format: int64 + type: integer + gregorianChange: + $ref: "#/components/schemas/Date" + calendarType: + type: string + yearOffsetInMillis: + format: int64 + type: integer + timeZone: + $ref: "#/components/schemas/TimeZone" + weekDateSupported: + type: boolean + weekYear: + format: int32 + type: integer + weeksInWeekYear: + format: int32 + type: integer + normalizedCalendar: + $ref: "#/components/schemas/GregorianCalendar" + cutoverCalendarSystem: + $ref: "#/components/schemas/BaseCalendar" + invalidWeek1: + type: boolean + lastJulianDate: + $ref: "#/components/schemas/Date1" + currentFixedDate: + format: int64 + type: integer + HTTPVerb: + enum: + - GET + - HEAD + - POST + - PUT + - DELETE + - PATCH + - "NULL" + type: string + HumanName: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + use: + $ref: "#/components/schemas/EnumerationNameUse" + text: + $ref: "#/components/schemas/StringType" + family: + $ref: "#/components/schemas/StringType" + given: + type: array + items: + $ref: "#/components/schemas/StringType" + prefix: + type: array + items: + $ref: "#/components/schemas/StringType" + suffix: + type: array + items: + $ref: "#/components/schemas/StringType" + period: + $ref: "#/components/schemas/Period" + useElement: + $ref: "#/components/schemas/EnumerationNameUse" + textElement: + $ref: "#/components/schemas/StringType" + familyElement: + $ref: "#/components/schemas/StringType" + givenAsSingleString: + type: string + prefixAsSingleString: + type: string + suffixAsSingleString: + type: string + nameAsSingleString: + type: string + empty: + type: boolean + IBaseCoding: + type: object + properties: + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + code: + type: string + display: + type: string + system: + type: string + userSelected: + type: boolean + version: + type: string + IBaseDatatype: + type: object + properties: + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + IBaseExtensionObjectObject: + type: object + properties: + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: {} + url: + type: string + value: + $ref: "#/components/schemas/IBaseDatatype" + IBaseMetaType: + type: object + properties: + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + lastUpdated: + $ref: "#/components/schemas/Date" + profile: + type: array + items: + $ref: "#/components/schemas/IPrimitiveTypeString" + security: + type: array + items: + $ref: "#/components/schemas/IBaseCoding" + tag: + type: array + items: + $ref: "#/components/schemas/IBaseCoding" + versionId: + type: string + IIdType: + type: object + properties: + valueAsString: + type: string + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + baseUrl: + type: string + idPart: + type: string + idPartAsLong: + format: int64 + type: integer + resourceType: + type: string + value: + type: string + versionIdPart: + type: string + versionIdPartAsLong: + format: int64 + type: integer + absolute: + type: boolean + empty: + type: boolean + idPartValid: + type: boolean + idPartValidLong: + type: boolean + local: + type: boolean + versionIdPartValidLong: + type: boolean + IPrimitiveTypeObject: + type: object + properties: + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + valueAsString: + type: string + value: {} + IPrimitiveTypeString: + type: object + properties: + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + valueAsString: + type: string + value: + type: string + IdType: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + type: string + myStringValue: + type: string + primitive: + type: boolean + myBaseUrl: + type: string + myHaveComponentParts: + type: boolean + myResourceType: + type: string + myUnqualifiedId: + type: string + myUnqualifiedVersionId: + type: string + baseUrl: + type: string + idPart: + type: string + idPartAsBigDecimal: + type: number + idPartAsLong: + format: int64 + type: integer + resourceType: + type: string + value: + type: string + valueAsString: + type: string + versionIdPart: + type: string + versionIdPartAsLong: + format: int64 + type: integer + absolute: + type: boolean + empty: + type: boolean + idPartValid: + type: boolean + idPartValidLong: + type: boolean + local: + type: boolean + urn: + type: boolean + versionIdPartValidLong: + type: boolean + Identifier: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + use: + $ref: "#/components/schemas/EnumerationIdentifierUse" + type: + $ref: "#/components/schemas/CodeableConcept" + system: + $ref: "#/components/schemas/UriType" + value: + $ref: "#/components/schemas/StringType" + period: + $ref: "#/components/schemas/Period" + assigner: + $ref: "#/components/schemas/Reference" + assignerTarget: + $ref: "#/components/schemas/Organization" + useElement: + $ref: "#/components/schemas/EnumerationIdentifierUse" + systemElement: + $ref: "#/components/schemas/UriType" + valueElement: + $ref: "#/components/schemas/StringType" + empty: + type: boolean + IdentifierUse: + enum: + - USUAL + - OFFICIAL + - TEMP + - SECONDARY + - OLD + - "NULL" + type: string + InstantType: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + valueAsString: + type: string + myCoercedValue: + $ref: "#/components/schemas/Date" + myStringValue: + type: string + value: + $ref: "#/components/schemas/Date" + empty: + type: boolean + primitive: + type: boolean + myFractionalSeconds: + type: string + myPrecision: + $ref: "#/components/schemas/TemporalPrecisionEnum" + myTimeZone: + $ref: "#/components/schemas/TimeZone" + myTimeZoneZulu: + type: boolean + day: + format: int32 + type: integer + hour: + format: int32 + type: integer + millis: + format: int32 + type: integer + minute: + format: int32 + type: integer + month: + format: int32 + type: integer + secondsMilli: + format: float + type: number + nanos: + format: int64 + type: integer + precision: + $ref: "#/components/schemas/TemporalPrecisionEnum" + second: + format: int32 + type: integer + timeZone: + $ref: "#/components/schemas/TimeZone" + valueAsCalendar: + $ref: "#/components/schemas/GregorianCalendar" + year: + format: int32 + type: integer + timeZoneZulu: + type: boolean + today: + type: boolean + valueAsV3String: + type: string + dateTime: + type: boolean + highEdge: + $ref: "#/components/schemas/BaseDateTimeType" + defaultPrecisionForDatatype: + $ref: "#/components/schemas/TemporalPrecisionEnum" + JsonValue: + type: object + properties: + valueType: + $ref: "#/components/schemas/ValueType" + Locale: + type: object + properties: + language: + type: string + script: + type: string + country: + type: string + variant: + type: string + extensionKeys: + uniqueItems: true + type: array + items: + format: byte + type: string + unicodeLocaleAttributes: + uniqueItems: true + type: array + items: + type: string + unicodeLocaleKeys: + uniqueItems: true + type: array + items: + type: string + iSO3Language: + type: string + iSO3Country: + type: string + displayLanguage: + type: string + displayScript: + type: string + displayCountry: + type: string + displayVariant: + type: string + displayName: + type: string + Location: + type: object + properties: + line: + format: int32 + type: integer + column: + format: int32 + type: integer + Meta: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + versionId: + $ref: "#/components/schemas/IdType" + lastUpdated: + $ref: "#/components/schemas/InstantType" + source: + $ref: "#/components/schemas/UriType" + profile: + type: array + items: + $ref: "#/components/schemas/CanonicalType" + security: + type: array + items: + $ref: "#/components/schemas/Coding" + tag: + type: array + items: + $ref: "#/components/schemas/Coding" + versionIdElement: + $ref: "#/components/schemas/IdType" + lastUpdatedElement: + $ref: "#/components/schemas/InstantType" + sourceElement: + $ref: "#/components/schemas/UriType" + securityFirstRep: + $ref: "#/components/schemas/Coding" + tagFirstRep: + $ref: "#/components/schemas/Coding" + empty: + type: boolean + NameUse: + enum: + - USUAL + - OFFICIAL + - TEMP + - NICKNAME + - ANONYMOUS + - OLD + - MAIDEN + - "NULL" + type: string + Narrative: + type: object + properties: + divAsString: + type: string + statusAsString: + type: string + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + status: + $ref: "#/components/schemas/EnumerationNarrativeStatus" + div: + $ref: "#/components/schemas/XhtmlNode" + statusElement: + $ref: "#/components/schemas/EnumerationNarrativeStatus" + empty: + type: boolean + NarrativeStatus: + enum: + - GENERATED + - EXTENSIONS + - ADDITIONAL + - EMPTY + - "NULL" + type: string + NodeType: + enum: + - Element + - Text + - Comment + - DocType + - Document + - Instruction + type: string + Organization: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + id: + type: string + idElement: + $ref: "#/components/schemas/IIdType" + languageElement: + $ref: "#/components/schemas/IPrimitiveTypeString" + meta: + $ref: "#/components/schemas/IBaseMetaType" + structureFhirVersionEnum: + $ref: "#/components/schemas/FhirVersionEnum" + deleted: + type: boolean + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + resource: + type: boolean + implicitRules: + $ref: "#/components/schemas/UriType" + language: + $ref: "#/components/schemas/CodeType" + idPart: + type: string + implicitRulesElement: + $ref: "#/components/schemas/UriType" + idBase: + type: string + text: + $ref: "#/components/schemas/Narrative" + contained: + type: array + items: + $ref: "#/components/schemas/Resource" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + modifierExtension: + type: array + items: + $ref: "#/components/schemas/Extension" + identifier: + type: array + items: + $ref: "#/components/schemas/Identifier" + active: + $ref: "#/components/schemas/BooleanType" + type: + type: array + items: + $ref: "#/components/schemas/CodeableConcept" + name: + $ref: "#/components/schemas/StringType" + alias: + type: array + items: + $ref: "#/components/schemas/StringType" + telecom: + type: array + items: + $ref: "#/components/schemas/ContactPoint" + address: + type: array + items: + $ref: "#/components/schemas/Address" + partOf: + $ref: "#/components/schemas/Reference" + partOfTarget: + $ref: "#/components/schemas/Organization" + contact: + type: array + items: + $ref: "#/components/schemas/OrganizationContactComponent" + endpoint: + type: array + items: + $ref: "#/components/schemas/Reference" + endpointTarget: + type: array + items: + $ref: "#/components/schemas/Endpoint" + identifierFirstRep: + $ref: "#/components/schemas/Identifier" + activeElement: + $ref: "#/components/schemas/BooleanType" + typeFirstRep: + $ref: "#/components/schemas/CodeableConcept" + nameElement: + $ref: "#/components/schemas/StringType" + telecomFirstRep: + $ref: "#/components/schemas/ContactPoint" + addressFirstRep: + $ref: "#/components/schemas/Address" + contactFirstRep: + $ref: "#/components/schemas/OrganizationContactComponent" + endpointFirstRep: + $ref: "#/components/schemas/Reference" + empty: + type: boolean + resourceType: + $ref: "#/components/schemas/ResourceType" + OrganizationContactComponent: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + modifierExtension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + modifierExtensionFirstRep: + $ref: "#/components/schemas/Extension" + purpose: + $ref: "#/components/schemas/CodeableConcept" + name: + $ref: "#/components/schemas/HumanName" + telecom: + type: array + items: + $ref: "#/components/schemas/ContactPoint" + address: + $ref: "#/components/schemas/Address" + telecomFirstRep: + $ref: "#/components/schemas/ContactPoint" + empty: + type: boolean + Period: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + start: + $ref: "#/components/schemas/DateTimeType" + end: + $ref: "#/components/schemas/DateTimeType" + startElement: + $ref: "#/components/schemas/DateTimeType" + endElement: + $ref: "#/components/schemas/DateTimeType" + empty: + type: boolean + PinResultEnum: + enum: + - ERROR + - OK + - REJECTED + - WASBLOCKED + - NOWBLOCKED + - TRANSPORT_PIN + type: string + PinStatusEnum: + enum: + - VERIFIED + - TRANSPORT_PIN + - EMPTY_PIN + - BLOCKED + - VERIFIABLE + type: string + PositiveIntType: + type: object + properties: + valueAsString: + type: string + value: {} + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + format: int32 + type: integer + myStringValue: + type: string + primitive: + type: boolean + QName: + type: object + properties: + namespaceURI: + type: string + localPart: + type: string + prefix: + type: string + Reference: + type: object + properties: + referenceElement: + $ref: "#/components/schemas/IIdType" + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + reference: + $ref: "#/components/schemas/StringType" + type: + $ref: "#/components/schemas/UriType" + identifier: + $ref: "#/components/schemas/Identifier" + display: + $ref: "#/components/schemas/StringType" + referenceElement_: + $ref: "#/components/schemas/StringType" + typeElement: + $ref: "#/components/schemas/UriType" + displayElement: + $ref: "#/components/schemas/StringType" + empty: + type: boolean + Resource: + type: object + properties: + structureFhirVersionEnum: + $ref: "#/components/schemas/FhirVersionEnum" + deleted: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + resource: + type: boolean + id: + $ref: "#/components/schemas/IdType" + meta: + $ref: "#/components/schemas/Meta" + implicitRules: + $ref: "#/components/schemas/UriType" + language: + $ref: "#/components/schemas/CodeType" + idElement: + $ref: "#/components/schemas/IdType" + idPart: + type: string + implicitRulesElement: + $ref: "#/components/schemas/UriType" + languageElement: + $ref: "#/components/schemas/CodeType" + empty: + type: boolean + idBase: + type: string + resourceType: + $ref: "#/components/schemas/ResourceType" + ResourceType: + enum: + - Account + - ActivityDefinition + - AdverseEvent + - AllergyIntolerance + - Appointment + - AppointmentResponse + - AuditEvent + - Basic + - Binary + - BiologicallyDerivedProduct + - BodyStructure + - Bundle + - CapabilityStatement + - CarePlan + - CareTeam + - CatalogEntry + - ChargeItem + - ChargeItemDefinition + - Claim + - ClaimResponse + - ClinicalImpression + - CodeSystem + - Communication + - CommunicationRequest + - CompartmentDefinition + - Composition + - ConceptMap + - Condition + - Consent + - Contract + - Coverage + - CoverageEligibilityRequest + - CoverageEligibilityResponse + - DetectedIssue + - Device + - DeviceDefinition + - DeviceMetric + - DeviceRequest + - DeviceUseStatement + - DiagnosticReport + - DocumentManifest + - DocumentReference + - EffectEvidenceSynthesis + - Encounter + - Endpoint + - EnrollmentRequest + - EnrollmentResponse + - EpisodeOfCare + - EventDefinition + - Evidence + - EvidenceVariable + - ExampleScenario + - ExplanationOfBenefit + - FamilyMemberHistory + - Flag + - Goal + - GraphDefinition + - Group + - GuidanceResponse + - HealthcareService + - ImagingStudy + - Immunization + - ImmunizationEvaluation + - ImmunizationRecommendation + - ImplementationGuide + - InsurancePlan + - Invoice + - Library + - Linkage + - List + - Location + - Measure + - MeasureReport + - Media + - Medication + - MedicationAdministration + - MedicationDispense + - MedicationKnowledge + - MedicationRequest + - MedicationStatement + - MedicinalProduct + - MedicinalProductAuthorization + - MedicinalProductContraindication + - MedicinalProductIndication + - MedicinalProductIngredient + - MedicinalProductInteraction + - MedicinalProductManufactured + - MedicinalProductPackaged + - MedicinalProductPharmaceutical + - MedicinalProductUndesirableEffect + - MessageDefinition + - MessageHeader + - MolecularSequence + - NamingSystem + - NutritionOrder + - Observation + - ObservationDefinition + - OperationDefinition + - OperationOutcome + - Organization + - OrganizationAffiliation + - Parameters + - Patient + - PaymentNotice + - PaymentReconciliation + - Person + - PlanDefinition + - Practitioner + - PractitionerRole + - Procedure + - Provenance + - Questionnaire + - QuestionnaireResponse + - RelatedPerson + - RequestGroup + - ResearchDefinition + - ResearchElementDefinition + - ResearchStudy + - ResearchSubject + - RiskAssessment + - RiskEvidenceSynthesis + - Schedule + - SearchParameter + - ServiceRequest + - Slot + - Specimen + - SpecimenDefinition + - StructureDefinition + - StructureMap + - Subscription + - Substance + - SubstanceNucleicAcid + - SubstancePolymer + - SubstanceProtein + - SubstanceReferenceInformation + - SubstanceSourceMaterial + - SubstanceSpecification + - SupplyDelivery + - SupplyRequest + - Task + - TerminologyCapabilities + - TestReport + - TestScript + - ValueSet + - VerificationResult + - VisionPrescription + type: string + SearchEntryMode: + enum: + - MATCH + - INCLUDE + - OUTCOME + - "NULL" + type: string + SessionInfo: + type: object + properties: + signatureMode: + type: string + allOf: + - $ref: "#/components/schemas/SignatureModeEnum" + xml: + name: SignatureMode + countRemaining: + format: int32 + type: integer + xml: + name: CountRemaining + timeRemaining: + type: object + allOf: + - $ref: "#/components/schemas/Duration" + xml: + name: TimeRemaining + Signature: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + type: + type: array + items: + $ref: "#/components/schemas/Coding" + when: + $ref: "#/components/schemas/InstantType" + who: + $ref: "#/components/schemas/Reference" + whoTarget: + $ref: "#/components/schemas/Resource" + onBehalfOf: + $ref: "#/components/schemas/Reference" + onBehalfOfTarget: + $ref: "#/components/schemas/Resource" + targetFormat: + $ref: "#/components/schemas/CodeType" + sigFormat: + $ref: "#/components/schemas/CodeType" + data: + $ref: "#/components/schemas/Base64BinaryType" + typeFirstRep: + $ref: "#/components/schemas/Coding" + whenElement: + $ref: "#/components/schemas/InstantType" + targetFormatElement: + $ref: "#/components/schemas/CodeType" + sigFormatElement: + $ref: "#/components/schemas/CodeType" + dataElement: + $ref: "#/components/schemas/Base64BinaryType" + empty: + type: boolean + SignatureModeEnum: + enum: + - PIN + - COMFORT + type: string + Status: + type: object + properties: + result: + type: string + xml: name: Result error: + type: object allOf: - - $ref: '#/components/schemas/Error' - - xml: - name: Error + - $ref: "#/components/schemas/Error" + xml: + name: Error + StringType: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + type: string + myStringValue: + type: string + value: + type: string + valueAsString: + type: string + empty: + type: boolean + primitive: + type: boolean + valueNotNull: + type: string + TemporalPrecisionEnum: + enum: + - YEAR + - MONTH + - DAY + - MINUTE + - SECOND + - MILLI + type: string + TimeZone: + type: object + properties: + ID: + type: string + rawOffset: + format: int32 + type: integer + iD: + type: string + displayName: + type: string + dSTSavings: + format: int32 + type: integer Trace: type: object properties: @@ -377,58 +4408,279 @@ components: xml: name: ErrorText detail: + type: object allOf: - - $ref: '#/components/schemas/Detail' - - xml: - name: Detail + - $ref: "#/components/schemas/Detail" + xml: + name: Detail + Type: + type: object + properties: + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + userData: + type: object + additionalProperties: {} + primitive: + type: boolean + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + extension: + type: array + items: + $ref: "#/components/schemas/Extension" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + UnblockPinResponse: + type: object + properties: + status: + $ref: "#/components/schemas/Status" + pinResultEnum: + $ref: "#/components/schemas/PinResultEnum" + leftTries: + type: integer + UnsignedIntType: + type: object + properties: + valueAsString: + type: string + value: {} + empty: + type: boolean + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: + type: string + myCoercedValue: + format: int32 + type: integer + myStringValue: + type: string + primitive: + type: boolean UpdateERezept: type: object properties: + taskId: + type: string accessCode: type: string signedBytes: type: string - taskId: - type: string - UserConfigurations: + UriType: type: object properties: - connector.basic-auth-password: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: type: string - connector.basic-auth-username: + myCoercedValue: type: string - connector.client-certificate: + myStringValue: type: string - connector.client-certificate-password: + value: type: string - connector.client-system-id: + valueAsString: type: string - connector.base-url: + empty: + type: boolean + primitive: + type: boolean + UrlType: + type: object + properties: + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + extension: + type: array + items: + $ref: "#/components/schemas/IBaseExtensionObjectObject" + userData: + type: object + additionalProperties: {} + booleanPrimitive: + type: boolean + dateTime: + type: boolean + metadataBased: + type: boolean + resource: + type: boolean + xhtml: + $ref: "#/components/schemas/XhtmlNode" + id: + $ref: "#/components/schemas/StringType" + disallowExtensions: + type: boolean + idElement: + $ref: "#/components/schemas/StringType" + extensionFirstRep: + $ref: "#/components/schemas/Extension" + idBase: type: string - erixa.api.key: + myCoercedValue: type: string - erixa.drugstore.email: + myStringValue: + type: string + value: type: string + valueAsString: + type: string + empty: + type: boolean + primitive: + type: boolean + UserConfigurations: + type: object + properties: erixa.hotfolder: type: string + erixa.drugstore.email: + type: string erixa.user.email: type: string erixa.user.password: type: string - connector.mandant-id: + erixa.api.key: type: string extractor.template.profile: type: string - kbv.pruefnummer: + connector.base-url: type: string - connector.tvMode: + connector.mandant-id: + type: string + connector.workplace-id: + type: string + connector.client-system-id: type: string connector.user-id: type: string connector.version: type: string - connector.workplace-id: + connector.tvMode: type: string + connector.client-certificate: + type: string + connector.client-certificate-password: + type: string + connector.basic-auth-username: + type: string + connector.basic-auth-password: + type: string + kbv.pruefnummer: + type: string + ValueType: + enum: + - ARRAY + - OBJECT + - STRING + - NUMBER + - "TRUE" + - "FALSE" + - "NULL" + type: string + VerifyPinResponse: + type: object + properties: + status: + $ref: "#/components/schemas/Status" + pinResultEnum: + $ref: "#/components/schemas/PinResultEnum" + leftTries: + type: integer VersionInfoType: type: object properties: @@ -450,37 +4702,96 @@ components: XMLGregorianCalendar: type: object properties: - day: - format: int32 - type: integer - eon: + year: type: integer - eonAndYear: + month: + format: int32 type: integer - fractionalSecond: - type: number - hour: + day: format: int32 type: integer - millisecond: + timezone: format: int32 type: integer - minute: + hour: format: int32 type: integer - month: + minute: format: int32 type: integer second: format: int32 type: integer - timezone: + millisecond: format: int32 type: integer - xMLSchemaType: - $ref: '#/components/schemas/QName' - year: - format: int32 + fractionalSecond: + type: number + eon: + type: integer + eonAndYear: type: integer + xMLSchemaType: + $ref: "#/components/schemas/QName" valid: type: boolean + XhtmlNode: + type: object + properties: + location: + $ref: "#/components/schemas/Location" + nodeType: + $ref: "#/components/schemas/NodeType" + name: + type: string + attributes: + type: object + additionalProperties: + type: string + childNodes: + $ref: "#/components/schemas/XhtmlNodeList" + content: + type: string + notPretty: + type: boolean + seperated: + type: boolean + emptyExpanded: + type: boolean + namedParams: + type: object + additionalProperties: + $ref: "#/components/schemas/XhtmlNode" + namedParamValues: + type: object + additionalProperties: + type: string + userData: + type: object + additionalProperties: {} + firstElement: + $ref: "#/components/schemas/XhtmlNode" + empty: + type: boolean + nsDecl: + type: string + valueAsString: + type: string + value: + type: string + formatCommentsPre: + type: array + items: + type: string + formatCommentsPost: + type: array + items: + type: string + noPretty: + type: boolean + para: + type: boolean + XhtmlNodeList: + type: array + items: + $ref: "#/components/schemas/XhtmlNode" diff --git a/pom.xml b/pom.xml index fe32e7d08..1d303a91a 100644 --- a/pom.xml +++ b/pom.xml @@ -10,18 +10,19 @@ <properties> <compiler-plugin.version>3.8.1</compiler-plugin.version> <maven.compiler.parameters>true</maven.compiler.parameters> - <maven.compiler.source>11</maven.compiler.source> - <maven.compiler.target>11</maven.compiler.target> + <maven.compiler.source>17</maven.compiler.source> + <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <quarkus-plugin.version>1.13.7.Final</quarkus-plugin.version> + <quarkus-plugin.version>3.9.4</quarkus-plugin.version> <quarkus.platform.artifact-id>quarkus-universe-bom</quarkus.platform.artifact-id> <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id> - <quarkus.platform.version>1.13.7.Final</quarkus.platform.version> + <quarkus.platform.version>3.9.4</quarkus.platform.version> <surefire-plugin.version>3.0.0-M5</surefire-plugin.version> - <hapi.version>6.8.3</hapi.version> + <hapi.version>7.0.2</hapi.version> + <version.referencevalidator>2.1.1</version.referencevalidator> </properties> - <!-- 2021-12-20 Add a random line to update maven cache in github actions --> + <!-- 2021-12-20 Add a random line to update maven cache in gitHub actions --> <dependencyManagement> <dependencies> <dependency> @@ -35,9 +36,15 @@ </dependencyManagement> <dependencies> <dependency> - <groupId>com.sun.mail</groupId> - <artifactId>javax.mail</artifactId> - <version>1.6.2</version> + <groupId>de.gematik.refv</groupId> + <artifactId>referencevalidator-lib</artifactId> + <version>${version.referencevalidator}</version> + </dependency> + <!-- https://mvnrepository.com/artifact/org.eclipse.angus/angus-mail --> + <dependency> + <groupId>org.eclipse.angus</groupId> + <artifactId>angus-mail</artifactId> + <version>2.0.3</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> @@ -55,13 +62,14 @@ <version>1.8</version> </dependency> <dependency> - <artifactId>bcpkix-jdk15on</artifactId> <groupId>org.bouncycastle</groupId> + <artifactId>bcpkix-jdk18on</artifactId> + <version>1.78.1</version> </dependency> <dependency> <groupId>org.bitbucket.b_c</groupId> <artifactId>jose4j</artifactId> - <version>0.7.7-hard-code-brainpool-p256-r1</version> + <version>0.9.4</version> </dependency> <dependency> <groupId>ca.uhn.hapi.fhir</groupId> @@ -79,13 +87,18 @@ <artifactId>hapi-fhir-structures-r4</artifactId> <version>${hapi.version}</version> </dependency> + <dependency> + <groupId>ca.uhn.hapi.fhir</groupId> + <artifactId>hapi-fhir-caching-caffeine</artifactId> + <version>${hapi.version}</version> + </dependency> <dependency> <groupId>ca.uhn.hapi.fhir</groupId> <artifactId>hapi-fhir-validation</artifactId> <version>${hapi.version}</version> <exclusions> <exclusion> - <groupId>xpp3</groupId> + <groupId>org.ogce</groupId> <artifactId>xpp3</artifactId> </exclusion> </exclusions> @@ -93,23 +106,28 @@ <dependency> <groupId>ca.uhn.hapi.fhir</groupId> <artifactId>hapi-fhir-validation-resources-r4</artifactId> - <version>5.4.1</version> + <version>5.7.9</version> </dependency> <dependency> <groupId>com.hp.jipp</groupId> <artifactId>jipp-core</artifactId> - <version>0.7.9</version> + <version>0.7.15</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> - <version>2.0.24</version> + <version>2.0.31</version> + <!-- + Breaking Change Upgrading to 3.0.x; + Migration Guide here: https://pdfbox.apache.org/3.0/migration.html + https://incentergy.atlassian.net/browse/ERE-671 + --> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/fop --> <dependency> <groupId>org.apache.xmlgraphics</groupId> <artifactId>fop</artifactId> - <version>2.6</version> + <version>2.9</version> <exclusions> <exclusion> <groupId>xml-apis</groupId> @@ -132,6 +150,10 @@ <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> + <exclusion> + <groupId>geronimo-spec</groupId> + <artifactId>geronimo-spec-javamail</artifactId> + </exclusion> </exclusions> </dependency> @@ -139,12 +161,12 @@ <dependency> <groupId>net.sf.saxon</groupId> <artifactId>Saxon-HE</artifactId> - <version>10.3</version> + <version>10.9</version> </dependency> <dependency> <groupId>health.ere</groupId> <artifactId>api-telematik-service</artifactId> - <version>OPD4-20220115</version> + <version>OPD4-20240910</version> </dependency> <dependency> <groupId>health.ere</groupId> @@ -158,7 +180,7 @@ <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> - <version>2.7</version> + <version>2.16.1</version> </dependency> <dependency> <groupId>com.diffplug.durian</groupId> @@ -168,7 +190,7 @@ <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-ri</artifactId> - <version>2.3.0</version> + <version>4.0.2</version> <type>pom</type> <exclusions> <exclusion> @@ -184,7 +206,7 @@ <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> - <version>2.3.4</version> + <version>4.0.2</version> <!--<exclusions> <exclusion> <groupId>com.sun.istack</groupId> @@ -192,9 +214,19 @@ </exclusion> </exclusions>--> </dependency> + <dependency> + <groupId>jakarta.xml.bind</groupId> + <artifactId>jakarta.xml.bind-api</artifactId> + <version>4.0.1</version> + </dependency> + <dependency> + <groupId>jakarta.xml.ws</groupId> + <artifactId>jakarta.xml.ws-api</artifactId> + <version>4.0.1</version> + </dependency> <dependency> <groupId>io.quarkus</groupId> - <artifactId>quarkus-rest-client</artifactId> + <artifactId>quarkus-resteasy-client</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> @@ -216,25 +248,6 @@ <groupId>io.quarkus</groupId> <artifactId>quarkus-jackson</artifactId> </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-annotations</artifactId> - <version>2.15.2</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-core</artifactId> - <version>2.15.2</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - <version>2.15.2</version> - </dependency> - <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-undertow-websockets</artifactId> - </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-scheduler</artifactId> @@ -243,7 +256,7 @@ <dependency> <groupId>org.apache.santuario</groupId> <artifactId>xmlsec</artifactId> - <version>2.2.6</version> + <version>4.0.2</version> </dependency> <dependency> <groupId>io.quarkus</groupId> @@ -342,7 +355,7 @@ <artifactId>maven-pmd-plugin</artifactId> <version>3.14.0</version> <configuration> - <targetJdk>11</targetJdk> + <targetJdk>17</targetJdk> <includeTests>true</includeTests> <failOnViolation>false</failOnViolation> <skipEmptyReport>false</skipEmptyReport> @@ -412,51 +425,6 @@ <quarkus.package.type>native</quarkus.package.type> </properties> </profile> - <profile> - <id>with-vos-translator</id> - <activation> - <property> - <name>with-vos-translator</name> - </property> - </activation> - <dependencies> - <dependency> - <groupId>health.ere.vos</groupId> - <artifactId>translator</artifactId> - <version>1.0-SNAPSHOT</version> - </dependency> - </dependencies> - <build> - <plugins> - <plugin> - <artifactId>maven-failsafe-plugin</artifactId> - <version>${surefire-plugin.version}</version> - <executions> - <execution> - <goals> - <goal>integration-test</goal> - <goal>verify</goal> - </goals> - <configuration> - <systemPropertyVariables> - <quarkus.test.profile>dev</quarkus.test.profile> - <native.image.path> - ${project.build.directory}/${project.build.finalName}-runner - </native.image.path> - <java.util.logging.manager>org.jboss.logmanager.LogManager - </java.util.logging.manager> - <maven.home>${maven.home}</maven.home> - </systemPropertyVariables> - </configuration> - </execution> - </executions> - </plugin> - </plugins> - </build> - <!-- fast-jar is the default <properties> - <quarkus.package.type>fast-jar</quarkus.package.type> - </properties> --> - </profile> </profiles> <repositories> <repository> diff --git a/project-repo/health/ere/api-telematik-service/OPD4-20240426/_remote.repositories b/project-repo/health/ere/api-telematik-service/OPD4-20240426/_remote.repositories new file mode 100644 index 000000000..a6abe9d9d --- /dev/null +++ b/project-repo/health/ere/api-telematik-service/OPD4-20240426/_remote.repositories @@ -0,0 +1,4 @@ +#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. +#Fri Apr 26 10:14:45 CEST 2024 +api-telematik-service-OPD4-20240426.jar>= +api-telematik-service-OPD4-20240426.pom>= diff --git a/project-repo/health/ere/api-telematik-service/OPD4-20240426/api-telematik-service-OPD4-20240426.jar b/project-repo/health/ere/api-telematik-service/OPD4-20240426/api-telematik-service-OPD4-20240426.jar new file mode 100644 index 000000000..077324413 Binary files /dev/null and b/project-repo/health/ere/api-telematik-service/OPD4-20240426/api-telematik-service-OPD4-20240426.jar differ diff --git a/project-repo/health/ere/api-telematik-service/OPD4-20240426/api-telematik-service-OPD4-20240426.pom b/project-repo/health/ere/api-telematik-service/OPD4-20240426/api-telematik-service-OPD4-20240426.pom new file mode 100644 index 000000000..cfe5b5e91 --- /dev/null +++ b/project-repo/health/ere/api-telematik-service/OPD4-20240426/api-telematik-service-OPD4-20240426.pom @@ -0,0 +1,106 @@ +<?xml version="1.0"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>health.ere</groupId> + <artifactId>api-telematik-service</artifactId> + <version>OPD4-20240426</version> + <properties> + <maven.compiler.source>17</maven.compiler.source> + <maven.compiler.target>17</maven.compiler.target> + </properties> + <dependencies> + <!-- https://mvnrepository.com/artifact/org.glassfish.main.javaee-api/javax.jws --> + <dependency> + <groupId>jakarta.jws</groupId> + <artifactId>jakarta.jws-api</artifactId> + <version>3.0.0</version> + </dependency> + <!-- https://mvnrepository.com/artifact/javax.xml.ws/javax.xml.ws-api --> + <dependency> + <groupId>jakarta.xml.ws</groupId> + <artifactId>jakarta.xml.ws-api</artifactId> + <version>4.0.1</version> + </dependency> + <dependency> + <groupId>com.sun.xml.ws</groupId> + <artifactId>jaxws-rt</artifactId> + <version>4.0.1</version> + </dependency> + <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api --> + <dependency> + <groupId>jakarta.xml.bind</groupId> + <artifactId>jakarta.xml.bind-api</artifactId> + <version>4.0.1</version> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>com.sun.xml.ws</groupId> + <artifactId>jaxws-maven-plugin</artifactId> + <version>4.0.1</version> + <executions> + <execution> + <goals> + <goal>wsimport</goal> + </goals> + <configuration> + <wsdlDirectory>conn/</wsdlDirectory> + <wsdlFiles> + <wsdlFile>vsds/VSDService.wsdl</wsdlFile> + <wsdlFile>CertificateService.wsdl</wsdlFile> + <wsdlFile>EventService.wsdl</wsdlFile> + <wsdlFile>CardService.wsdl</wsdlFile> + <wsdlFile>AuthSignatureService_v7_4_1.wsdl</wsdlFile> + <wsdlFile>SignatureService.wsdl</wsdlFile> + <wsdlFile>SignatureService_V7_4_2.wsdl</wsdlFile> + <wsdlFile>SignatureService_V7_5_5.wsdl</wsdlFile> + </wsdlFiles> + <vmArgs> + <vmArg>-Djavax.xml.accessExternalDTD=all</vmArg> + <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg> + </vmArgs> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>jaxb2-maven-plugin</artifactId> + <version>3.2.0</version> + <executions> + <execution> + <id>xjc</id> + <goals> + <goal>xjc</goal> + </goals> + </execution> + </executions> + <configuration> + <outputDirectory>target/generated-sources/wsimport</outputDirectory> + <sources> + <source>conn/ServiceDirectory.xsd</source> + </sources> + <clearOutputDir>false</clearOutputDir> + </configuration> + <dependencies> + <dependency> + <groupId>com.sun.activation</groupId> + <artifactId>jakarta.activation</artifactId> + <version>2.0.1</version> + </dependency> + </dependencies> + </plugin> + </plugins> + <resources> + <!-- Bundle the wsdl files as part of the jar --> + <resource> + <directory>conn</directory> + <includes> + <include>**/*.wsdl</include> + <include>**/*.xsd</include> + </includes> + </resource> + </resources> + </build> +</project> diff --git a/project-repo/health/ere/api-telematik-service/OPD4-20240910/_remote.repositories b/project-repo/health/ere/api-telematik-service/OPD4-20240910/_remote.repositories new file mode 100644 index 000000000..bf50d8e34 --- /dev/null +++ b/project-repo/health/ere/api-telematik-service/OPD4-20240910/_remote.repositories @@ -0,0 +1,4 @@ +#NOTE: This is a Maven Resolver internal implementation file, its format can be changed without prior notice. +#Tue Sep 10 11:23:07 CEST 2024 +api-telematik-service-OPD4-20240910.jar>= +api-telematik-service-OPD4-20240910.pom>= diff --git a/project-repo/health/ere/api-telematik-service/OPD4-20240910/api-telematik-service-OPD4-20240910.jar b/project-repo/health/ere/api-telematik-service/OPD4-20240910/api-telematik-service-OPD4-20240910.jar new file mode 100644 index 000000000..e8b75d59c Binary files /dev/null and b/project-repo/health/ere/api-telematik-service/OPD4-20240910/api-telematik-service-OPD4-20240910.jar differ diff --git a/project-repo/health/ere/api-telematik-service/OPD4-20240910/api-telematik-service-OPD4-20240910.pom b/project-repo/health/ere/api-telematik-service/OPD4-20240910/api-telematik-service-OPD4-20240910.pom new file mode 100644 index 000000000..02f37f1c4 --- /dev/null +++ b/project-repo/health/ere/api-telematik-service/OPD4-20240910/api-telematik-service-OPD4-20240910.pom @@ -0,0 +1,106 @@ +<?xml version="1.0"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>health.ere</groupId> + <artifactId>api-telematik-service</artifactId> + <version>OPD4-20240910</version> + <properties> + <maven.compiler.source>17</maven.compiler.source> + <maven.compiler.target>17</maven.compiler.target> + </properties> + <dependencies> + <!-- https://mvnrepository.com/artifact/org.glassfish.main.javaee-api/javax.jws --> + <dependency> + <groupId>jakarta.jws</groupId> + <artifactId>jakarta.jws-api</artifactId> + <version>3.0.0</version> + </dependency> + <!-- https://mvnrepository.com/artifact/javax.xml.ws/javax.xml.ws-api --> + <dependency> + <groupId>jakarta.xml.ws</groupId> + <artifactId>jakarta.xml.ws-api</artifactId> + <version>4.0.1</version> + </dependency> + <dependency> + <groupId>com.sun.xml.ws</groupId> + <artifactId>jaxws-rt</artifactId> + <version>4.0.1</version> + </dependency> + <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api --> + <dependency> + <groupId>jakarta.xml.bind</groupId> + <artifactId>jakarta.xml.bind-api</artifactId> + <version>4.0.1</version> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>com.sun.xml.ws</groupId> + <artifactId>jaxws-maven-plugin</artifactId> + <version>4.0.1</version> + <executions> + <execution> + <goals> + <goal>wsimport</goal> + </goals> + <configuration> + <wsdlDirectory>conn/</wsdlDirectory> + <wsdlFiles> + <wsdlFile>vsds/VSDService.wsdl</wsdlFile> + <wsdlFile>CertificateService_v6_0_1.wsdl</wsdlFile> + <wsdlFile>EventService.wsdl</wsdlFile> + <wsdlFile>CardService.wsdl</wsdlFile> + <wsdlFile>AuthSignatureService_v7_4_1.wsdl</wsdlFile> + <wsdlFile>SignatureService.wsdl</wsdlFile> + <wsdlFile>SignatureService_V7_4_2.wsdl</wsdlFile> + <wsdlFile>SignatureService_V7_5_5.wsdl</wsdlFile> + </wsdlFiles> + <vmArgs> + <vmArg>-Djavax.xml.accessExternalDTD=all</vmArg> + <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg> + </vmArgs> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>jaxb2-maven-plugin</artifactId> + <version>3.2.0</version> + <executions> + <execution> + <id>xjc</id> + <goals> + <goal>xjc</goal> + </goals> + </execution> + </executions> + <configuration> + <outputDirectory>target/generated-sources/wsimport</outputDirectory> + <sources> + <source>conn/ServiceDirectory.xsd</source> + </sources> + <clearOutputDir>false</clearOutputDir> + </configuration> + <dependencies> + <dependency> + <groupId>com.sun.activation</groupId> + <artifactId>jakarta.activation</artifactId> + <version>2.0.1</version> + </dependency> + </dependencies> + </plugin> + </plugins> + <resources> + <!-- Bundle the wsdl files as part of the jar --> + <resource> + <directory>conn</directory> + <includes> + <include>**/*.wsdl</include> + <include>**/*.xsd</include> + </includes> + </resource> + </resources> + </build> +</project> diff --git a/src/main/docker/Dockerfile.jvm b/src/main/docker/Dockerfile.jvm index bb8abdbc1..1532d14f8 100644 --- a/src/main/docker/Dockerfile.jvm +++ b/src/main/docker/Dockerfile.jvm @@ -1,29 +1,9 @@ #### -# This Dockerfile is used in order to build a container that runs the Quarkus application in JVM mode -# -# Before building the container image run: -# -# ./mvnw package -# -# Then, build the image with: -# -# docker build -f src/main/docker/Dockerfile.jvm -t quarkus/ere-ps-app-jvm . -# -# Then run the container using: -# -# docker run -i --rm -p 8080:8080 quarkus/ere-ps-app-jvm -# -# If you want to include the debug port into your docker image -# you will have to expose the debug port (default 5005) like this : EXPOSE 8080 5050 -# -# Then run the container using : -# -# docker run -i --rm -p 8080:8080 -p 5005:5005 -e JAVA_ENABLE_DEBUG="true" quarkus/ere-ps-app-jvm -# +# Documentation to Docker for ere-ps-app is found here: https://github.com/ere-health/architecture/blob/main/DOCKER.md ### -FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3 +FROM registry.access.redhat.com/ubi8/ubi-minimal:8.3 -ARG JAVA_PACKAGE=java-11-openjdk-headless +ARG JAVA_PACKAGE=java-17-openjdk-headless ARG RUN_JAVA_VERSION=1.3.8 ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' # Install java and the run-java script @@ -39,16 +19,16 @@ RUN microdnf install curl ca-certificates ${JAVA_PACKAGE} \ && chown 1001 /deployments/run-java.sh \ && chmod 540 /deployments/run-java.sh \ && echo "securerandom.source=file:/dev/urandom" >> /etc/alternatives/jre/lib/security/java.security - # Configure the JAVA_OPTIONS, you can add -XshowSettings:vm to also display the heap size. ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager" # We make four distinct layers so if there are application changes the library layers can be re-used +COPY --chown=1001 KBV_FHIR_eRP_V1_1_0/ /KBV_FHIR_eRP_V1_1_0/ COPY --chown=1001 target/quarkus-app/lib/ /deployments/lib/ COPY --chown=1001 target/quarkus-app/*.jar /deployments/ COPY --chown=1001 target/quarkus-app/app/ /deployments/app/ COPY --chown=1001 target/quarkus-app/quarkus/ /deployments/quarkus/ -EXPOSE 8080 +EXPOSE 8080 8443 USER 1001 ENTRYPOINT [ "/deployments/run-java.sh" ] diff --git a/src/main/java/health/ere/ps/config/AppConfig.java b/src/main/java/health/ere/ps/config/AppConfig.java index 5ce845b28..430ade5f8 100644 --- a/src/main/java/health/ere/ps/config/AppConfig.java +++ b/src/main/java/health/ere/ps/config/AppConfig.java @@ -1,16 +1,21 @@ package health.ere.ps.config; -import java.util.Optional; - -import javax.enterprise.context.ApplicationScoped; - +import jakarta.enterprise.context.ApplicationScoped; import org.eclipse.microprofile.config.inject.ConfigProperty; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.logging.Level; +import java.util.logging.Logger; + @ApplicationScoped public class AppConfig { - @ConfigProperty(name = "directory-watcher.dir") - String directoryWatcherDir; + private static final Logger log = Logger.getLogger(AppConfig.class.getName()); @ConfigProperty(name = "ere.workflow-service.prescription.server.url") String prescriptionServiceURL; @@ -24,6 +29,12 @@ public class AppConfig { @ConfigProperty(name = "idp.auth.request.redirect.url") String idpAuthRequestRedirectURL; + @ConfigProperty(name = "idp.initialization.retries.seconds") + Optional<String> idpInitializationRetriesSeconds; + + @ConfigProperty(name = "idp.initialization.period.seconds") + Optional<Integer> idpInitializationPeriodSeconds; + @ConfigProperty(name = "idp.auth.request.url") String idpAuthRequestURL; @@ -57,9 +68,8 @@ public class AppConfig { @ConfigProperty(name = "connector.cert.auth.store.file.password") Optional<String> certAuthStoreFilePassword; - public String getDirectoryWatcherDir() { - return directoryWatcherDir; - } + @ConfigProperty(name = "connector.base.url") + String connectorBaseURL; public String getPrescriptionServiceURL() { return prescriptionServiceURL; @@ -77,6 +87,21 @@ public String getIdpAuthRequestRedirectURL() { return idpAuthRequestRedirectURL; } + public List<Integer> getIdpInitializationRetriesSeconds() { + String seconds = idpInitializationRetriesSeconds.orElse("5,10,50"); + return Arrays.stream(seconds.split(",")).map(String::trim).map(s -> { + try { + return Integer.parseInt(s); + } catch (Exception e) { + return null; + } + }).filter(Objects::nonNull).toList(); + } + + public int getIdpInitializationPeriodMs() { + return idpInitializationPeriodSeconds.orElse(180) * 1000; + } + public String getIdpAuthRequestURL() { return idpAuthRequestURL; } @@ -101,6 +126,10 @@ public String getUserAgent() { return userAgent; } + public String getConnectorBaseURL() { + return connectorBaseURL; + } + public String getConnectorCrypt() { return connectorCrypt; } @@ -120,7 +149,7 @@ public boolean isWriteSignatureFile() { public boolean getWriteSignatureFile() { return this.writeSignatureFile; } - + public boolean getXmlBundleDirectProcess() { return this.xmlBundleDirectProcess; } diff --git a/src/main/java/health/ere/ps/config/RuntimeConfig.java b/src/main/java/health/ere/ps/config/RuntimeConfig.java index d31d67a5f..b1b8ffab0 100644 --- a/src/main/java/health/ere/ps/config/RuntimeConfig.java +++ b/src/main/java/health/ere/ps/config/RuntimeConfig.java @@ -3,15 +3,15 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.Objects; +import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; -import javax.enterprise.inject.Alternative; -import javax.enterprise.inject.spi.CDI; -import javax.json.JsonObject; -import javax.servlet.http.HttpServletRequest; - import health.ere.ps.model.config.UserConfigurations; +import jakarta.enterprise.inject.Alternative; +import jakarta.enterprise.inject.spi.CDI; +import jakarta.json.JsonObject; +import jakarta.servlet.http.HttpServletRequest; @Alternative public class RuntimeConfig extends UserConfig { @@ -20,14 +20,15 @@ public class RuntimeConfig extends UserConfig { protected String eHBAHandle = null; protected String SMCBHandle = null; + protected boolean sendPreview = true; + //todo: shouldn't idp parameter and prescriptionServerURL be part of UserConfig? protected String idpBaseURL = null; protected String idpAuthRequestRedirectURL = null; protected String idpClientId = null; protected String prescriptionServerURL = null; - public RuntimeConfig() { this.updateProperties(new UserConfigurations()); try { @@ -50,7 +51,7 @@ public void copyValuesFromUserConfig(UserConfig userConfig) { this.defaultMandantId = userConfig.getMandantId(); this.defaultClientSystemId = userConfig.getClientSystemId(); this.defaultWorkplaceId = userConfig.getWorkplaceId(); - this.defaultUserId = userConfig.getUserId(); + this.defaultUserId = Optional.ofNullable(userConfig.getUserId()); this.defaultConnectorVersion = userConfig.getConnectorVersion(); this.defaultTvMode = userConfig.getTvMode(); @@ -89,7 +90,12 @@ public void updateConfigurationsWithHttpServletRequest(HttpServletRequest httpSe this.idpClientId = httpServletRequest.getHeader("X-idpClientId"); this.idpAuthRequestRedirectURL = httpServletRequest.getHeader("X-idpAuthRequestRedirectURL"); this.prescriptionServerURL = httpServletRequest.getHeader("X-prescriptionServerURL"); - this.updateProperties(new UserConfigurations(httpServletRequest)); + + if (httpServletRequest.getHeader("X-sendPreview") != null) { + this.sendPreview = !httpServletRequest.getHeader("X-sendPreview").equalsIgnoreCase("false"); + } + + this.updateProperties(this.getConfigurations().updateWithRequest(httpServletRequest)); } public void updateConfigurationsWithJsonObject(JsonObject object) { @@ -104,6 +110,7 @@ public void updateConfigurationsWithJsonObject(JsonObject object) { this.idpClientId = jsonObject.getString("idp.client.id", null); this.idpAuthRequestRedirectURL = jsonObject.getString("idp.auth.request.redirect.url", null); this.prescriptionServerURL = jsonObject.getString("ere.workflow-service.prescription.server.url", null); + this.sendPreview = jsonObject.getBoolean("sendPreview", true); this.updateProperties(new UserConfigurations(jsonObject)); } } @@ -124,6 +131,14 @@ public void setSMCBHandle(String SMCBHandle) { this.SMCBHandle = SMCBHandle; } + public boolean isSendPreview() { + return sendPreview; + } + + public void setSendPreview(boolean sendPreview) { + this.sendPreview = sendPreview; + } + public String getIdpBaseURL() { return this.idpBaseURL; } @@ -158,7 +173,28 @@ public void setPrescriptionServerURL(String prescriptionServerURL) { @Override public int hashCode() { - return Objects.hash(eHBAHandle, SMCBHandle, idpBaseURL, idpAuthRequestRedirectURL, idpClientId, prescriptionServerURL, this.getConfigurations(), super.hashCode()); + final int prime = 31; + int result = super.hashCode(); + result = prime * result + Objects.hash(SMCBHandle, eHBAHandle, idpAuthRequestRedirectURL, idpBaseURL, + idpClientId, prescriptionServerURL, sendPreview); + return result; + } + + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + RuntimeConfig other = (RuntimeConfig) obj; + return Objects.equals(SMCBHandle, other.SMCBHandle) && Objects.equals(eHBAHandle, other.eHBAHandle) + && Objects.equals(idpAuthRequestRedirectURL, other.idpAuthRequestRedirectURL) + && Objects.equals(idpBaseURL, other.idpBaseURL) && Objects.equals(idpClientId, other.idpClientId) + && Objects.equals(prescriptionServerURL, other.prescriptionServerURL) + && sendPreview == other.sendPreview; } public String getConnectorAddress() { diff --git a/src/main/java/health/ere/ps/config/SimpleUserConfig.java b/src/main/java/health/ere/ps/config/SimpleUserConfig.java new file mode 100644 index 000000000..022da16bf --- /dev/null +++ b/src/main/java/health/ere/ps/config/SimpleUserConfig.java @@ -0,0 +1,288 @@ +package health.ere.ps.config; + +import java.util.Objects; + +public class SimpleUserConfig { + + private String erixaHotfolder; + + private String erixaDrugstoreEmail; + + private String erixaUserEmail; + + private String erixaApiKey; + + private String muster16TemplateProfile; + + private String connectorBaseURL; + + private String mandantId; + + private String workplaceId; + + private String clientSystemId; + + private String userId; + + private String version; + + private String tvMode; + +// private String clientCertificate; +// +// private String clientCertificatePassword; +// +// private String basicAuthUsername; +// +// private String basicAuthPassword; + + private String pruefnummer; + +// private String erixaUserPassword; + + + //the following attributes are for RuntimeConfig + + private String eHBAHandle; + private String SMCBHandle; + private boolean sendPreview; + private String idpBaseURL; + private String idpAuthRequestRedirectURL; + private String idpClientId; + + + + public SimpleUserConfig(UserConfig userConfig) { + setValues(userConfig); + } + + public String getErixaHotfolder() { + return erixaHotfolder; + } + + public void setErixaHotfolder(String erixaHotfolder) { + this.erixaHotfolder = erixaHotfolder; + } + + public String getErixaDrugstoreEmail() { + return erixaDrugstoreEmail; + } + + public void setErixaDrugstoreEmail(String erixaDrugstoreEmail) { + this.erixaDrugstoreEmail = erixaDrugstoreEmail; + } + + public String getErixaUserEmail() { + return erixaUserEmail; + } + + public void setErixaUserEmail(String erixaUserEmail) { + this.erixaUserEmail = erixaUserEmail; + } + + public String getErixaApiKey() { + return erixaApiKey; + } + + public void setErixaApiKey(String erixaApiKey) { + this.erixaApiKey = erixaApiKey; + } + + public String getMuster16TemplateProfile() { + return muster16TemplateProfile; + } + + public void setMuster16TemplateProfile(String muster16TemplateProfile) { + this.muster16TemplateProfile = muster16TemplateProfile; + } + + public String getConnectorBaseURL() { + return connectorBaseURL; + } + + public void setConnectorBaseURL(String connectorBaseURL) { + this.connectorBaseURL = connectorBaseURL; + } + + public String getMandantId() { + return mandantId; + } + + public void setMandantId(String mandantId) { + this.mandantId = mandantId; + } + + public String getWorkplaceId() { + return workplaceId; + } + + public void setWorkplaceId(String workplaceId) { + this.workplaceId = workplaceId; + } + + public String getClientSystemId() { + return clientSystemId; + } + + public void setClientSystemId(String clientSystemId) { + this.clientSystemId = clientSystemId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getTvMode() { + return tvMode; + } + + public void setTvMode(String tvMode) { + this.tvMode = tvMode; + } + + public String getPruefnummer() { + return pruefnummer; + } + + public void setPruefnummer(String pruefnummer) { + this.pruefnummer = pruefnummer; + } + + + + public String geteHBAHandle() { + return eHBAHandle; + } + + public void seteHBAHandle(String eHBAHandle) { + this.eHBAHandle = eHBAHandle; + } + + public String getSMCBHandle() { + return SMCBHandle; + } + + public void setSMCBHandle(String sMCBHandle) { + SMCBHandle = sMCBHandle; + } + + public boolean isSendPreview() { + return sendPreview; + } + + public void setSendPreview(boolean sendPreview) { + this.sendPreview = sendPreview; + } + + public String getIdpBaseURL() { + return idpBaseURL; + } + + public void setIdpBaseURL(String idpBaseURL) { + this.idpBaseURL = idpBaseURL; + } + + public String getIdpAuthRequestRedirectURL() { + return idpAuthRequestRedirectURL; + } + + public void setIdpAuthRequestRedirectURL(String idpAuthRequestRedirectURL) { + this.idpAuthRequestRedirectURL = idpAuthRequestRedirectURL; + } + + public String getIdpClientId() { + return idpClientId; + } + + public void setIdpClientId(String idpClientId) { + this.idpClientId = idpClientId; + } + + private void setValues(UserConfig userConfig) { + this.erixaHotfolder = userConfig.getConfigurations().getErixaHotfolder(); + this.erixaDrugstoreEmail = userConfig.getConfigurations().getErixaDrugstoreEmail(); + this.erixaUserEmail = userConfig.getConfigurations().getErixaUserEmail(); + this.erixaApiKey = userConfig.getConfigurations().getErixaApiKey(); + this.muster16TemplateProfile = userConfig.getConfigurations().getMuster16TemplateProfile(); + this.connectorBaseURL = userConfig.getConfigurations().getConnectorBaseURL(); + this.mandantId = userConfig.getConfigurations().getMandantId(); + this.workplaceId = userConfig.getConfigurations().getWorkplaceId(); + this.clientSystemId = userConfig.getConfigurations().getClientSystemId(); + this.userId = userConfig.getConfigurations().getUserId(); + this.version = userConfig.getConfigurations().getVersion(); + this.tvMode = userConfig.getConfigurations().getTvMode(); + if(userConfig.getClass().getName().contains("RuntimeConfig")) { + this.eHBAHandle = ((RuntimeConfig)userConfig).getEHBAHandle(); + this.SMCBHandle = ((RuntimeConfig)userConfig).getSMCBHandle(); + this.sendPreview = ((RuntimeConfig)userConfig).isSendPreview(); + this.idpAuthRequestRedirectURL = ((RuntimeConfig)userConfig).getIdpAuthRequestRedirectURL(); + this.idpClientId = ((RuntimeConfig)userConfig).getIdpClientId(); + } + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + + SimpleUserConfig other = (SimpleUserConfig) obj; + return Objects.equals(erixaHotfolder, other.erixaHotfolder) && Objects.equals(erixaDrugstoreEmail, other.erixaDrugstoreEmail) + && Objects.equals(erixaUserEmail, other.erixaUserEmail) + && Objects.equals(erixaApiKey, other.erixaApiKey) && Objects.equals(muster16TemplateProfile, other.muster16TemplateProfile) + && Objects.equals(connectorBaseURL, other.connectorBaseURL) && Objects.equals(mandantId, other.mandantId) + && Objects.equals(workplaceId, other.workplaceId) && Objects.equals(clientSystemId, other.clientSystemId) + && Objects.equals(userId, other.userId) && Objects.equals(version, other.version) + && Objects.equals(tvMode, other.tvMode) && Objects.equals(eHBAHandle, other.eHBAHandle) && Objects.equals(SMCBHandle, other.SMCBHandle) + && sendPreview == other.sendPreview && Objects.equals(idpBaseURL, other.idpBaseURL) + && Objects.equals(idpAuthRequestRedirectURL, other.idpAuthRequestRedirectURL) && Objects.equals(idpClientId, other.idpClientId); + + } + + @Override + public int hashCode() { + return Objects.hash( + erixaHotfolder, erixaDrugstoreEmail, erixaUserEmail, erixaApiKey, muster16TemplateProfile, connectorBaseURL, mandantId, + workplaceId, clientSystemId, userId, version, tvMode, eHBAHandle, SMCBHandle, sendPreview, idpBaseURL, idpAuthRequestRedirectURL, + idpClientId + ); + } + + @Override + public String toString() { + return "SimpleUserConfig{" + + "erixaHotfolder='" + erixaHotfolder + '\'' + + ", erixaDrugstoreEmail='" + erixaDrugstoreEmail + '\'' + + ", erixaUserEmail=" + erixaUserEmail + + ", erixaApiKey='" + erixaApiKey + '\'' + + ", muster16TemplateProfile='" + muster16TemplateProfile + '\'' + + ", connectorBaseURL='" + connectorBaseURL + '\'' + + ", mandantId='" + mandantId + '\'' + + ", workplaceId='" + workplaceId + '\'' + + ", clientSystemId='" + clientSystemId + '\'' + + ", userId='" + userId + '\'' + + ", version='" + version + '\'' + + ", tvMode='" + tvMode + '\'' + + ", eHBAHandle='" + eHBAHandle + '\'' + + ", SMCBHandle='" + SMCBHandle + '\'' + + ", sendPreview='" + sendPreview + '\'' + + ", idpBaseURL='" + idpBaseURL + '\'' + + ", idpAuthRequestRedirectURL='" + idpAuthRequestRedirectURL + '\'' + + ", idpClientId='" + idpClientId + '\'' + + "}"; + } + +} diff --git a/src/main/java/health/ere/ps/config/UserConfig.java b/src/main/java/health/ere/ps/config/UserConfig.java index 45f214770..90907e93e 100644 --- a/src/main/java/health/ere/ps/config/UserConfig.java +++ b/src/main/java/health/ere/ps/config/UserConfig.java @@ -2,12 +2,13 @@ import java.util.Objects; +import java.util.Optional; import java.util.logging.Logger; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -35,8 +36,9 @@ public class UserConfig { @ConfigProperty(name = "connector.client-system-id") String defaultClientSystemId; + //todo: shouldn't user-id be part of runtime-config? (comfortSignature!) @ConfigProperty(name = "connector.user-id") - String defaultUserId; + Optional<String> defaultUserId; @ConfigProperty(name = "connector.tvMode") String defaultTvMode; @@ -96,7 +98,7 @@ public String getClientSystemId() { } public String getUserId() { - return getConfigOrDefault(getConfigurations().getUserId(), defaultUserId); + return getConfigOrDefault(getConfigurations().getUserId(), defaultUserId == null ? null : defaultUserId.orElse(null)); } public String getTvMode() { diff --git a/src/main/java/health/ere/ps/config/interceptor/ConfigUpdateObserver.java b/src/main/java/health/ere/ps/config/interceptor/ConfigUpdateObserver.java index 84e4b4b70..28197ae8b 100644 --- a/src/main/java/health/ere/ps/config/interceptor/ConfigUpdateObserver.java +++ b/src/main/java/health/ere/ps/config/interceptor/ConfigUpdateObserver.java @@ -2,8 +2,8 @@ import health.ere.ps.event.config.UserConfigurationsUpdateEvent; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.ObservesAsync; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.ObservesAsync; @ApplicationScoped public class ConfigUpdateObserver { diff --git a/src/main/java/health/ere/ps/config/interceptor/ProvidedConfig.java b/src/main/java/health/ere/ps/config/interceptor/ProvidedConfig.java index 6edfb99cc..ce089b497 100644 --- a/src/main/java/health/ere/ps/config/interceptor/ProvidedConfig.java +++ b/src/main/java/health/ere/ps/config/interceptor/ProvidedConfig.java @@ -1,7 +1,8 @@ package health.ere.ps.config.interceptor; -import javax.interceptor.InterceptorBinding; +import jakarta.annotation.Priority; +import jakarta.interceptor.InterceptorBinding; import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -12,6 +13,7 @@ @InterceptorBinding @Target({METHOD, TYPE}) @Retention(RUNTIME) +@Priority(600) // todo: same level as interceptor using it, is this correct? public @interface ProvidedConfig { } diff --git a/src/main/java/health/ere/ps/config/interceptor/ProvidedConfigInterceptor.java b/src/main/java/health/ere/ps/config/interceptor/ProvidedConfigInterceptor.java index e0599f172..6f681aee7 100644 --- a/src/main/java/health/ere/ps/config/interceptor/ProvidedConfigInterceptor.java +++ b/src/main/java/health/ere/ps/config/interceptor/ProvidedConfigInterceptor.java @@ -3,11 +3,11 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.annotation.Priority; -import javax.inject.Inject; -import javax.interceptor.AroundInvoke; -import javax.interceptor.Interceptor; -import javax.interceptor.InvocationContext; +import jakarta.annotation.Priority; +import jakarta.inject.Inject; +import jakarta.interceptor.AroundInvoke; +import jakarta.interceptor.Interceptor; +import jakarta.interceptor.InvocationContext; import health.ere.ps.service.common.security.SecretsManagerService; import health.ere.ps.service.connector.provider.AbstractConnectorServicesProvider; diff --git a/src/main/java/health/ere/ps/event/AbortTaskEntry.java b/src/main/java/health/ere/ps/event/AbortTaskEntry.java index 1d698f544..f8dddc3bc 100644 --- a/src/main/java/health/ere/ps/event/AbortTaskEntry.java +++ b/src/main/java/health/ere/ps/event/AbortTaskEntry.java @@ -1,6 +1,6 @@ package health.ere.ps.event; -import javax.json.JsonObject; +import jakarta.json.JsonObject; public class AbortTaskEntry { private String accessCode; diff --git a/src/main/java/health/ere/ps/event/AbortTasksEvent.java b/src/main/java/health/ere/ps/event/AbortTasksEvent.java index 87c1e9421..816ec64ce 100644 --- a/src/main/java/health/ere/ps/event/AbortTasksEvent.java +++ b/src/main/java/health/ere/ps/event/AbortTasksEvent.java @@ -4,9 +4,9 @@ import java.util.List; import java.util.stream.Collectors; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class AbortTasksEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/AbortTasksStatusEvent.java b/src/main/java/health/ere/ps/event/AbortTasksStatusEvent.java index 1c4e775dd..e13139e65 100644 --- a/src/main/java/health/ere/ps/event/AbortTasksStatusEvent.java +++ b/src/main/java/health/ere/ps/event/AbortTasksStatusEvent.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import javax.websocket.Session; +import jakarta.websocket.Session; public class AbortTasksStatusEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/AbstractEvent.java b/src/main/java/health/ere/ps/event/AbstractEvent.java index 3fb40262a..65d9ee7fb 100644 --- a/src/main/java/health/ere/ps/event/AbstractEvent.java +++ b/src/main/java/health/ere/ps/event/AbstractEvent.java @@ -1,8 +1,8 @@ package health.ere.ps.event; -import javax.json.JsonObject; -import javax.json.bind.annotation.JsonbTransient; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.json.bind.annotation.JsonbTransient; +import jakarta.websocket.Session; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/src/main/java/health/ere/ps/event/ActivateComfortSignatureEvent.java b/src/main/java/health/ere/ps/event/ActivateComfortSignatureEvent.java index 6d9d8f1be..da22150e8 100644 --- a/src/main/java/health/ere/ps/event/ActivateComfortSignatureEvent.java +++ b/src/main/java/health/ere/ps/event/ActivateComfortSignatureEvent.java @@ -1,8 +1,8 @@ package health.ere.ps.event; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class ActivateComfortSignatureEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/BundlesEvent.java b/src/main/java/health/ere/ps/event/BundlesEvent.java index 6e602eea7..880bb35bc 100644 --- a/src/main/java/health/ere/ps/event/BundlesEvent.java +++ b/src/main/java/health/ere/ps/event/BundlesEvent.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.websocket.Session; +import jakarta.websocket.Session; import org.hl7.fhir.r4.model.Bundle; diff --git a/src/main/java/health/ere/ps/event/BundlesWithAccessCodeEvent.java b/src/main/java/health/ere/ps/event/BundlesWithAccessCodeEvent.java index 35c01bfb4..d076ef308 100644 --- a/src/main/java/health/ere/ps/event/BundlesWithAccessCodeEvent.java +++ b/src/main/java/health/ere/ps/event/BundlesWithAccessCodeEvent.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -import javax.websocket.Session; +import jakarta.websocket.Session; import health.ere.ps.model.gematik.BundleWithAccessCodeOrThrowable; diff --git a/src/main/java/health/ere/ps/event/ChangePinEvent.java b/src/main/java/health/ere/ps/event/ChangePinEvent.java index df78011d3..982418a9d 100644 --- a/src/main/java/health/ere/ps/event/ChangePinEvent.java +++ b/src/main/java/health/ere/ps/event/ChangePinEvent.java @@ -2,8 +2,8 @@ import java.util.Objects; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class ChangePinEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/ChangePinResponseEvent.java b/src/main/java/health/ere/ps/event/ChangePinResponseEvent.java index 526d8dc89..579375fce 100644 --- a/src/main/java/health/ere/ps/event/ChangePinResponseEvent.java +++ b/src/main/java/health/ere/ps/event/ChangePinResponseEvent.java @@ -2,7 +2,7 @@ import java.io.Serializable; -import javax.websocket.Session; +import jakarta.websocket.Session; import health.ere.ps.model.gematik.ChangePinResponse; diff --git a/src/main/java/health/ere/ps/event/DeactivateComfortSignatureEvent.java b/src/main/java/health/ere/ps/event/DeactivateComfortSignatureEvent.java index 166e873ff..da040db17 100644 --- a/src/main/java/health/ere/ps/event/DeactivateComfortSignatureEvent.java +++ b/src/main/java/health/ere/ps/event/DeactivateComfortSignatureEvent.java @@ -1,8 +1,8 @@ package health.ere.ps.event; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class DeactivateComfortSignatureEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/ERezeptWithDocumentsEvent.java b/src/main/java/health/ere/ps/event/ERezeptWithDocumentsEvent.java index 1b6851a63..7c468772f 100644 --- a/src/main/java/health/ere/ps/event/ERezeptWithDocumentsEvent.java +++ b/src/main/java/health/ere/ps/event/ERezeptWithDocumentsEvent.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.websocket.Session; +import jakarta.websocket.Session; import health.ere.ps.model.pdf.ERezeptDocument; diff --git a/src/main/java/health/ere/ps/event/GetCardsEvent.java b/src/main/java/health/ere/ps/event/GetCardsEvent.java index e78e640f2..a5e67e608 100644 --- a/src/main/java/health/ere/ps/event/GetCardsEvent.java +++ b/src/main/java/health/ere/ps/event/GetCardsEvent.java @@ -1,8 +1,8 @@ package health.ere.ps.event; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class GetCardsEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/GetCardsResponseEvent.java b/src/main/java/health/ere/ps/event/GetCardsResponseEvent.java index f91cc4c20..a2b6580a8 100644 --- a/src/main/java/health/ere/ps/event/GetCardsResponseEvent.java +++ b/src/main/java/health/ere/ps/event/GetCardsResponseEvent.java @@ -1,7 +1,7 @@ package health.ere.ps.event; -import javax.websocket.Session; +import jakarta.websocket.Session; import de.gematik.ws.conn.eventservice.v7.GetCardsResponse; diff --git a/src/main/java/health/ere/ps/event/GetPinStatusEvent.java b/src/main/java/health/ere/ps/event/GetPinStatusEvent.java index 209dd3969..fb253a839 100644 --- a/src/main/java/health/ere/ps/event/GetPinStatusEvent.java +++ b/src/main/java/health/ere/ps/event/GetPinStatusEvent.java @@ -2,8 +2,8 @@ import java.util.Objects; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class GetPinStatusEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/GetPinStatusResponseEvent.java b/src/main/java/health/ere/ps/event/GetPinStatusResponseEvent.java index a589af6bd..29bfd25c9 100644 --- a/src/main/java/health/ere/ps/event/GetPinStatusResponseEvent.java +++ b/src/main/java/health/ere/ps/event/GetPinStatusResponseEvent.java @@ -2,7 +2,7 @@ import java.io.Serializable; -import javax.websocket.Session; +import jakarta.websocket.Session; import health.ere.ps.model.gematik.GetPinStatusResponse; diff --git a/src/main/java/health/ere/ps/event/GetSignatureModeEvent.java b/src/main/java/health/ere/ps/event/GetSignatureModeEvent.java index 4909766d4..7b30ce9c1 100644 --- a/src/main/java/health/ere/ps/event/GetSignatureModeEvent.java +++ b/src/main/java/health/ere/ps/event/GetSignatureModeEvent.java @@ -1,7 +1,7 @@ package health.ere.ps.event; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class GetSignatureModeEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/GetSignatureModeResponseEvent.java b/src/main/java/health/ere/ps/event/GetSignatureModeResponseEvent.java index ecf9bf556..f17b7badb 100644 --- a/src/main/java/health/ere/ps/event/GetSignatureModeResponseEvent.java +++ b/src/main/java/health/ere/ps/event/GetSignatureModeResponseEvent.java @@ -11,6 +11,7 @@ public class GetSignatureModeResponseEvent extends AbstractEvent { javax.xml.datatype.Duration comfortSignatureTimer; SessionInfo sessionInfo; String userId; + boolean answertToActivateComfortSignature = false; public GetSignatureModeResponseEvent(Status status, ComfortSignatureStatusEnum comfortSignatureStatus, Integer comfortSignatureMax, javax.xml.datatype.Duration comfortSignatureTimer, SessionInfo sessionInfo) { this.status = status; @@ -20,6 +21,18 @@ public GetSignatureModeResponseEvent(Status status, ComfortSignatureStatusEnum c this.sessionInfo = sessionInfo; } + public boolean isAnswertToActivateComfortSignature() { + return this.answertToActivateComfortSignature; + } + + public boolean getAnswertToActivateComfortSignature() { + return this.answertToActivateComfortSignature; + } + + public void setAnswertToActivateComfortSignature(boolean answertToActivateComfortSignature) { + this.answertToActivateComfortSignature = answertToActivateComfortSignature; + } + public Status getStatus() { return this.status; } diff --git a/src/main/java/health/ere/ps/event/HTMLBundlesEvent.java b/src/main/java/health/ere/ps/event/HTMLBundlesEvent.java index 54edc8869..ac8798340 100644 --- a/src/main/java/health/ere/ps/event/HTMLBundlesEvent.java +++ b/src/main/java/health/ere/ps/event/HTMLBundlesEvent.java @@ -2,7 +2,7 @@ import java.util.List; -import javax.websocket.Session; +import jakarta.websocket.Session; public class HTMLBundlesEvent extends AbstractEvent { private final List<String> bundles; diff --git a/src/main/java/health/ere/ps/event/PrefillBundleEvent.java b/src/main/java/health/ere/ps/event/PrefillBundleEvent.java index 32814bf94..13b3b7e07 100644 --- a/src/main/java/health/ere/ps/event/PrefillBundleEvent.java +++ b/src/main/java/health/ere/ps/event/PrefillBundleEvent.java @@ -1,18 +1,29 @@ package health.ere.ps.event; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class PrefillBundleEvent extends AbstractEvent { + String egkHandle; + public PrefillBundleEvent() { } public PrefillBundleEvent(JsonObject object, Session replyTo, String id) { parseRuntimeConfig(object); + setEgkHandle(object.getString("egkHandle", null)); this.replyTo = replyTo; this.id = id; } + public String getEgkHandle() { + return egkHandle; + } + + public void setEgkHandle(String egkHandle) { + this.egkHandle = egkHandle; + } + } diff --git a/src/main/java/health/ere/ps/event/ReadyToSignBundlesEvent.java b/src/main/java/health/ere/ps/event/ReadyToSignBundlesEvent.java index d8edcbd64..e88f0e81c 100644 --- a/src/main/java/health/ere/ps/event/ReadyToSignBundlesEvent.java +++ b/src/main/java/health/ere/ps/event/ReadyToSignBundlesEvent.java @@ -3,18 +3,21 @@ import java.util.ArrayList; import java.util.List; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonValue; -import javax.websocket.Session; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import jakarta.websocket.Session; +import ca.uhn.fhir.context.FhirContext; import org.hl7.fhir.r4.model.Bundle; -import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.parser.IParser; +import health.ere.ps.service.fhir.FHIRService; + public class ReadyToSignBundlesEvent extends AbstractEvent { + private static final FhirContext fhirContext = FHIRService.getFhirContext(); public List<List<Bundle>> listOfListOfBundles = new ArrayList<>(); public ReadyToSignBundlesEvent(JsonObject jsonObject) { @@ -23,7 +26,7 @@ public ReadyToSignBundlesEvent(JsonObject jsonObject) { if (jsonValue instanceof JsonArray) { for (JsonValue singleBundle : (JsonArray) jsonValue) { - IParser jsonParser = FhirContext.forR4().newJsonParser(); + IParser jsonParser = fhirContext.newJsonParser(); Bundle bundle = jsonParser.parseResource(Bundle.class, singleBundle.toString()); bundles.add(bundle); diff --git a/src/main/java/health/ere/ps/event/RequestStatusEvent.java b/src/main/java/health/ere/ps/event/RequestStatusEvent.java index 440cd533c..d6fe107eb 100644 --- a/src/main/java/health/ere/ps/event/RequestStatusEvent.java +++ b/src/main/java/health/ere/ps/event/RequestStatusEvent.java @@ -1,7 +1,7 @@ package health.ere.ps.event; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class RequestStatusEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/SaveSettingsEvent.java b/src/main/java/health/ere/ps/event/SaveSettingsEvent.java index c222a1ca7..7efdcf979 100644 --- a/src/main/java/health/ere/ps/event/SaveSettingsEvent.java +++ b/src/main/java/health/ere/ps/event/SaveSettingsEvent.java @@ -1,6 +1,6 @@ package health.ere.ps.event; -import javax.websocket.Session; +import jakarta.websocket.Session; import health.ere.ps.model.config.UserConfigurations; diff --git a/src/main/java/health/ere/ps/event/SignAndUploadBundlesEvent.java b/src/main/java/health/ere/ps/event/SignAndUploadBundlesEvent.java index f2655d85d..a677abead 100644 --- a/src/main/java/health/ere/ps/event/SignAndUploadBundlesEvent.java +++ b/src/main/java/health/ere/ps/event/SignAndUploadBundlesEvent.java @@ -7,12 +7,13 @@ import java.util.Map; import java.util.Map.Entry; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.websocket.Session; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.websocket.Session; +import health.ere.ps.service.fhir.FHIRService; import org.hl7.fhir.r4.model.Bundle; import ca.uhn.fhir.context.FhirContext; @@ -30,6 +31,8 @@ public class SignAndUploadBundlesEvent extends AbstractEvent { public Map<String,String> kimConfigMap = new HashMap<>(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); + public SignAndUploadBundlesEvent(JsonObject jsonObject) { parseRuntimeConfig(jsonObject); @@ -54,7 +57,7 @@ public SignAndUploadBundlesEvent(JsonObject jsonObject) { if (jsonValue instanceof JsonArray) { for (JsonValue singleBundle : (JsonArray) jsonValue) { - IParser jsonParser = FhirContext.forR4().newJsonParser(); + IParser jsonParser = fhirContext.newJsonParser(); Bundle bundle = jsonParser.parseResource(Bundle.class, singleBundle.toString()); bundles.add(bundle); @@ -74,7 +77,8 @@ public SignAndUploadBundlesEvent(List<Bundle> bundles) { listOfListOfBundles.add(bundles); } - public SignAndUploadBundlesEvent(Bundle[] bundles, Session senderSession, String id) { + public SignAndUploadBundlesEvent(Bundle[] bundles, JsonObject jsonObject, Session senderSession, String id) { + parseRuntimeConfig(jsonObject); //todo: here the keys from above (flowtype etc) are ignored - refactor & include (probably own process json method?) this.replyTo = senderSession; this.id = id; listOfListOfBundles.add(Arrays.asList(bundles)); diff --git a/src/main/java/health/ere/ps/event/StatusResponseEvent.java b/src/main/java/health/ere/ps/event/StatusResponseEvent.java index 19fa053db..4af349e61 100644 --- a/src/main/java/health/ere/ps/event/StatusResponseEvent.java +++ b/src/main/java/health/ere/ps/event/StatusResponseEvent.java @@ -2,7 +2,7 @@ import java.io.Serializable; -import javax.websocket.Session; +import jakarta.websocket.Session; public class StatusResponseEvent extends AbstractEvent implements ReplyableEvent { private String type = "StatusResponse"; diff --git a/src/main/java/health/ere/ps/event/UnblockPinEvent.java b/src/main/java/health/ere/ps/event/UnblockPinEvent.java index d44ecfd62..f2baf14eb 100644 --- a/src/main/java/health/ere/ps/event/UnblockPinEvent.java +++ b/src/main/java/health/ere/ps/event/UnblockPinEvent.java @@ -2,8 +2,8 @@ import java.util.Objects; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class UnblockPinEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/UnblockPinResponseEvent.java b/src/main/java/health/ere/ps/event/UnblockPinResponseEvent.java index d70f91771..e3677c38f 100644 --- a/src/main/java/health/ere/ps/event/UnblockPinResponseEvent.java +++ b/src/main/java/health/ere/ps/event/UnblockPinResponseEvent.java @@ -3,7 +3,7 @@ import java.io.Serializable; import java.util.Objects; -import javax.websocket.Session; +import jakarta.websocket.Session; import health.ere.ps.model.gematik.UnblockPinResponse; diff --git a/src/main/java/health/ere/ps/event/VZDSearchEvent.java b/src/main/java/health/ere/ps/event/VZDSearchEvent.java index c7dfc92ca..5f73c1358 100644 --- a/src/main/java/health/ere/ps/event/VZDSearchEvent.java +++ b/src/main/java/health/ere/ps/event/VZDSearchEvent.java @@ -1,8 +1,8 @@ package health.ere.ps.event; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class VZDSearchEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/VZDSearchResultEvent.java b/src/main/java/health/ere/ps/event/VZDSearchResultEvent.java index bacc4f824..d9ffbc505 100644 --- a/src/main/java/health/ere/ps/event/VZDSearchResultEvent.java +++ b/src/main/java/health/ere/ps/event/VZDSearchResultEvent.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Map; -import javax.websocket.Session; +import jakarta.websocket.Session; public class VZDSearchResultEvent extends AbstractEvent implements ReplyableEvent { diff --git a/src/main/java/health/ere/ps/event/VerifyPinEvent.java b/src/main/java/health/ere/ps/event/VerifyPinEvent.java index 61ca5191d..a9a0a7b0e 100644 --- a/src/main/java/health/ere/ps/event/VerifyPinEvent.java +++ b/src/main/java/health/ere/ps/event/VerifyPinEvent.java @@ -2,8 +2,8 @@ import java.util.Objects; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; public class VerifyPinEvent extends AbstractEvent { diff --git a/src/main/java/health/ere/ps/event/VerifyPinResponseEvent.java b/src/main/java/health/ere/ps/event/VerifyPinResponseEvent.java index 099e20e35..45a159125 100644 --- a/src/main/java/health/ere/ps/event/VerifyPinResponseEvent.java +++ b/src/main/java/health/ere/ps/event/VerifyPinResponseEvent.java @@ -3,7 +3,7 @@ import java.io.Serializable; import java.util.Objects; -import javax.websocket.Session; +import jakarta.websocket.Session; import health.ere.ps.model.gematik.VerifyPinResponse; diff --git a/src/main/java/health/ere/ps/event/erixa/ErixaEvent.java b/src/main/java/health/ere/ps/event/erixa/ErixaEvent.java index ab03077ad..3a7152b3b 100644 --- a/src/main/java/health/ere/ps/event/erixa/ErixaEvent.java +++ b/src/main/java/health/ere/ps/event/erixa/ErixaEvent.java @@ -1,8 +1,8 @@ package health.ere.ps.event.erixa; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; import health.ere.ps.event.AbstractEvent; diff --git a/src/main/java/health/ere/ps/event/erixa/SendToPharmacyEvent.java b/src/main/java/health/ere/ps/event/erixa/SendToPharmacyEvent.java index e6c334b4d..02a6b2b54 100644 --- a/src/main/java/health/ere/ps/event/erixa/SendToPharmacyEvent.java +++ b/src/main/java/health/ere/ps/event/erixa/SendToPharmacyEvent.java @@ -1,8 +1,8 @@ package health.ere.ps.event.erixa; -import javax.json.JsonObject; -import javax.websocket.Session; +import jakarta.json.JsonObject; +import jakarta.websocket.Session; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/main/java/health/ere/ps/exception/idp/IdpClientException.java b/src/main/java/health/ere/ps/exception/idp/IdpClientException.java index 9495b470b..114d55210 100644 --- a/src/main/java/health/ere/ps/exception/idp/IdpClientException.java +++ b/src/main/java/health/ere/ps/exception/idp/IdpClientException.java @@ -1,7 +1,10 @@ package health.ere.ps.exception.idp; +import java.io.Serial; + public class IdpClientException extends Exception { + @Serial private static final long serialVersionUID = -3280232274428362763L; public IdpClientException(final Exception e) { diff --git a/src/main/java/health/ere/ps/exception/idp/IdpException.java b/src/main/java/health/ere/ps/exception/idp/IdpException.java index e4e34872b..0ce22c11b 100644 --- a/src/main/java/health/ere/ps/exception/idp/IdpException.java +++ b/src/main/java/health/ere/ps/exception/idp/IdpException.java @@ -1,8 +1,11 @@ package health.ere.ps.exception.idp; +import java.io.Serial; + public class IdpException extends Exception { + @Serial private static final long serialVersionUID = 4956462897121513838L; public IdpException(final Exception e) { diff --git a/src/main/java/health/ere/ps/exception/idp/IdpJoseException.java b/src/main/java/health/ere/ps/exception/idp/IdpJoseException.java index b5e9ad36b..15f6b9ae1 100644 --- a/src/main/java/health/ere/ps/exception/idp/IdpJoseException.java +++ b/src/main/java/health/ere/ps/exception/idp/IdpJoseException.java @@ -1,9 +1,13 @@ package health.ere.ps.exception.idp; +import java.io.Serial; + public class IdpJoseException extends Exception { + @Serial private static final long serialVersionUID = -838371828368858466L; + private final boolean containsSensitiveInformation; public IdpJoseException(final Exception e) { diff --git a/src/main/java/health/ere/ps/jsonb/BundleAdapter.java b/src/main/java/health/ere/ps/jsonb/BundleAdapter.java index ce6ff4b93..b18f151c9 100644 --- a/src/main/java/health/ere/ps/jsonb/BundleAdapter.java +++ b/src/main/java/health/ere/ps/jsonb/BundleAdapter.java @@ -4,14 +4,18 @@ import ca.uhn.fhir.parser.IParser; import org.hl7.fhir.r4.model.Bundle; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.bind.adapter.JsonbAdapter; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.bind.adapter.JsonbAdapter; import java.io.StringReader; +import health.ere.ps.service.fhir.FHIRService; + + public class BundleAdapter implements JsonbAdapter<Bundle, JsonObject> { - IParser iParser = FhirContext.forR4().newJsonParser(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); + IParser iParser = fhirContext.newJsonParser(); @Override public JsonObject adaptToJson(Bundle b) { diff --git a/src/main/java/health/ere/ps/jsonb/ByteAdapter.java b/src/main/java/health/ere/ps/jsonb/ByteAdapter.java index fc6716e1e..7e11d6c5b 100644 --- a/src/main/java/health/ere/ps/jsonb/ByteAdapter.java +++ b/src/main/java/health/ere/ps/jsonb/ByteAdapter.java @@ -1,8 +1,8 @@ package health.ere.ps.jsonb; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.bind.adapter.JsonbAdapter; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.bind.adapter.JsonbAdapter; import java.util.Base64; diff --git a/src/main/java/health/ere/ps/jsonb/DurationAdapter.java b/src/main/java/health/ere/ps/jsonb/DurationAdapter.java index b3db5fcce..2ed32f666 100644 --- a/src/main/java/health/ere/ps/jsonb/DurationAdapter.java +++ b/src/main/java/health/ere/ps/jsonb/DurationAdapter.java @@ -1,8 +1,8 @@ package health.ere.ps.jsonb; -import javax.json.Json; -import javax.json.JsonString; -import javax.json.bind.adapter.JsonbAdapter; +import jakarta.json.Json; +import jakarta.json.JsonString; +import jakarta.json.bind.adapter.JsonbAdapter; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.Duration; diff --git a/src/main/java/health/ere/ps/jsonb/ThrowableAdapter.java b/src/main/java/health/ere/ps/jsonb/ThrowableAdapter.java index 3cf4aeb41..ae9c57f36 100644 --- a/src/main/java/health/ere/ps/jsonb/ThrowableAdapter.java +++ b/src/main/java/health/ere/ps/jsonb/ThrowableAdapter.java @@ -3,30 +3,51 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.math.BigInteger; +import java.util.logging.Level; +import java.util.logging.Logger; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.bind.adapter.JsonbAdapter; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.bind.adapter.JsonbAdapter; +import jakarta.ws.rs.WebApplicationException; public class ThrowableAdapter implements JsonbAdapter<Throwable, JsonObject> { + private static final Logger log = Logger.getLogger(ThrowableAdapter.class.getName()); + @Override public JsonObject adaptToJson(Throwable e) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); - - return Json.createObjectBuilder() - .add("class", e.getClass().getName()) - .add("message", e.getMessage() != null ? e.getMessage() : "null") - .add("errorCode", extractErrorCode(e)) - .add("stacktrace", sw.toString()) - .build(); + String message = e.getMessage() != null ? e.getMessage() : "null"; + if(e.getCause() != null && e.getCause().getMessage() != null) { + if(e.getCause().getCause() != null && e.getCause().getCause().getMessage() != null) { + message = e.getCause().getCause().getMessage(); + } else { + message = e.getCause().getMessage(); + } + } + JsonObjectBuilder builder = Json.createObjectBuilder() + .add("class", e.getClass().getName()) + .add("message", message) + .add("errorCode", extractErrorCode(e)) + .add("stacktrace", sw.toString()); + try { + if(e instanceof WebApplicationException) { + WebApplicationException wae = (WebApplicationException) e; + builder.add("response", wae.getResponse().getEntity().toString()); + } + } catch(Exception ex) { + log.log(Level.SEVERE, "Error during response generation", ex); + } + return builder.build(); } - private BigInteger extractErrorCode(Throwable e) { + public static BigInteger extractErrorCode(Throwable e) { BigInteger errorCode = BigInteger.ZERO; do { if(e instanceof de.gematik.ws.conn.authsignatureservice.wsdl.v7.FaultMessage) { diff --git a/src/main/java/health/ere/ps/model/config/UserConfigurations.java b/src/main/java/health/ere/ps/model/config/UserConfigurations.java index cd2fe03c0..17aee014c 100644 --- a/src/main/java/health/ere/ps/model/config/UserConfigurations.java +++ b/src/main/java/health/ere/ps/model/config/UserConfigurations.java @@ -16,9 +16,9 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.json.JsonObject; -import javax.json.bind.annotation.JsonbProperty; -import javax.servlet.http.HttpServletRequest; +import jakarta.json.JsonObject; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.servlet.http.HttpServletRequest; public class UserConfigurations { @@ -107,10 +107,14 @@ public UserConfigurations(JsonObject jsonObject) { } public UserConfigurations(HttpServletRequest httpServletRequest) { + updateWithRequest(httpServletRequest); + } + + public UserConfigurations updateWithRequest(HttpServletRequest httpServletRequest) { Enumeration<String> enumeration = httpServletRequest.getHeaderNames(); List<String> list = Collections.list(enumeration); for(String headerName : list) { - if(headerName.startsWith("X-") && !"X-eHBAHandle".equals(headerName) && !"X-SMCBHandle".equals(headerName)) { + if(headerName.startsWith("X-") && !"X-eHBAHandle".equals(headerName) && !"X-SMCBHandle".equals(headerName) && !"X-sendPreview".equals(headerName)) { String propertyName = headerName.substring(2); Field field; try { @@ -123,6 +127,7 @@ public UserConfigurations(HttpServletRequest httpServletRequest) { } } } + return this; } private void fillValues(Function<String, Object> getValue) { @@ -308,6 +313,37 @@ public void setPruefnummer(String pruefnummer) { @Override public int hashCode() { - return Objects.hash(erixaHotfolder, erixaDrugstoreEmail, erixaUserEmail, erixaUserPassword, erixaApiKey, muster16TemplateProfile, connectorBaseURL, mandantId, workplaceId, clientSystemId, userId, version, tvMode, clientCertificate, clientCertificatePassword, basicAuthUsername, basicAuthPassword, pruefnummer); + return Objects.hash(basicAuthPassword, basicAuthUsername, clientCertificate, clientCertificatePassword, + clientSystemId, connectorBaseURL, erixaApiKey, erixaDrugstoreEmail, erixaHotfolder, erixaUserEmail, + erixaUserPassword, mandantId, muster16TemplateProfile, pruefnummer, tvMode, userId, version, + workplaceId); + } + + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + UserConfigurations other = (UserConfigurations) obj; + return Objects.equals(basicAuthPassword, other.basicAuthPassword) + && Objects.equals(basicAuthUsername, other.basicAuthUsername) + && Objects.equals(clientCertificate, other.clientCertificate) + && Objects.equals(clientCertificatePassword, other.clientCertificatePassword) + && Objects.equals(clientSystemId, other.clientSystemId) + && Objects.equals(connectorBaseURL, other.connectorBaseURL) + && Objects.equals(erixaApiKey, other.erixaApiKey) + && Objects.equals(erixaDrugstoreEmail, other.erixaDrugstoreEmail) + && Objects.equals(erixaHotfolder, other.erixaHotfolder) + && Objects.equals(erixaUserEmail, other.erixaUserEmail) + && Objects.equals(erixaUserPassword, other.erixaUserPassword) + && Objects.equals(mandantId, other.mandantId) + && Objects.equals(muster16TemplateProfile, other.muster16TemplateProfile) + && Objects.equals(pruefnummer, other.pruefnummer) && Objects.equals(tvMode, other.tvMode) + && Objects.equals(userId, other.userId) && Objects.equals(version, other.version) + && Objects.equals(workplaceId, other.workplaceId); } } \ No newline at end of file diff --git a/src/main/java/health/ere/ps/model/ipp/DefaultAttributes.java b/src/main/java/health/ere/ps/model/ipp/DefaultAttributes.java deleted file mode 100644 index 5a3ddec75..000000000 --- a/src/main/java/health/ere/ps/model/ipp/DefaultAttributes.java +++ /dev/null @@ -1,39 +0,0 @@ -package health.ere.ps.model.ipp; - -import com.hp.jipp.encoding.Attribute; -import com.hp.jipp.model.Operation; -import com.hp.jipp.model.PrinterState; - -import java.util.Arrays; - -import static com.hp.jipp.model.Types.*; - -public class DefaultAttributes { - - public static final int VERSION_NUMBER = 0x100; - public static final String[] VERSIONS_SUPPORTED = {"1.0"}; - public static final String PRINTER_NAME = "ere-printer"; - public static final String CHARSET = "utf-8"; - public static final String LANGUAGE = "de"; - public static final String LOCALE = "de-DE"; - public static final String DEFAULT_FORMAT = "application/pdf"; - public static final String[] SUPPORTED_FORMATS = {"application/pdf", "application/octet-stream"}; - - public static final Attribute<?>[] PRINTER_ATTRIBUTES = { - printerName.of(PRINTER_NAME), - printerState.of(PrinterState.idle), - ippVersionsSupported.of(Arrays.asList(VERSIONS_SUPPORTED)), - operationsSupported.of(Operation.printJob, Operation.getPrinterAttributes), - charsetConfigured.of(CHARSET), - charsetSupported.of(CHARSET), - naturalLanguageConfigured.of(LOCALE), - generatedNaturalLanguageSupported.of(LOCALE), - documentFormatDefault.of(DEFAULT_FORMAT), - documentFormatSupported.of(Arrays.asList(SUPPORTED_FORMATS)), - }; - - public static final Attribute<?>[] OPERATION_ATTRIBUTES = { - attributesCharset.of("utf-8"), - attributesNaturalLanguage.of("en-us") - }; -} \ No newline at end of file diff --git a/src/main/java/health/ere/ps/model/ipp/IppPrinter.java b/src/main/java/health/ere/ps/model/ipp/IppPrinter.java deleted file mode 100644 index 47475fba8..000000000 --- a/src/main/java/health/ere/ps/model/ipp/IppPrinter.java +++ /dev/null @@ -1,69 +0,0 @@ -package health.ere.ps.model.ipp; - -import com.hp.jipp.encoding.Attribute; -import com.hp.jipp.model.*; - -import javax.enterprise.context.ApplicationScoped; -import java.net.URI; -import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; - -import static com.hp.jipp.model.Types.*; - -@ApplicationScoped -public class IppPrinter { - - private final Date startTime; - private final List<Attribute<?>> defaultPrinterAttributes; - private final AtomicInteger printJobId = new AtomicInteger(0); - - public IppPrinter() { - this.startTime = new Date(); - defaultPrinterAttributes = Arrays.asList(DefaultAttributes.PRINTER_ATTRIBUTES); - } - - public List<Attribute<?>> getPrinterAttributes(URI uri) { - - List<Attribute<?>> attributes = new ArrayList<>(); - attributes.addAll(this.defaultPrinterAttributes); - attributes.addAll(getDynamicPrinterAttributes(uri)); - return attributes; - } - - private List<Attribute<?>> getDynamicPrinterAttributes(URI uri) { - - Attribute<?>[] attributes = { - printerUriSupported.of(uri), - printerIsAcceptingJobs.of(isAcceptingJobs()), - queuedJobCount.of(getQueuedJobCount()), - printerUpTime.of(getUpTime()), - printerCurrentTime.of(Calendar.getInstance()), - }; - return Arrays.asList(attributes); - } - - public List<Attribute<?>> getOperationAttributes() { - return Arrays.asList(DefaultAttributes.OPERATION_ATTRIBUTES); - } - - public List<Attribute<?>> getJobAttributes(URI uri) { - Attribute<?>[] attributes = { - jobUri.of(uri.resolve("/job/" + printJobId.incrementAndGet())), - jobState.of(JobState.pending), - jobStateReasons.of(JobStateReason.accountClosed), - }; - return Arrays.asList(attributes); - } - - private boolean isAcceptingJobs() { - return true; - } - - private int getQueuedJobCount() { - return 0; - } - - private int getUpTime() { - return (int) ((new Date().getTime() - startTime.getTime()) / 1000); - } -} \ No newline at end of file diff --git a/src/main/java/health/ere/ps/model/pdf/Bundles.java b/src/main/java/health/ere/ps/model/pdf/Bundles.java index c67c7b7a2..a3287bf61 100644 --- a/src/main/java/health/ere/ps/model/pdf/Bundles.java +++ b/src/main/java/health/ere/ps/model/pdf/Bundles.java @@ -1,6 +1,6 @@ package health.ere.ps.model.pdf; -import javax.xml.bind.annotation.XmlRootElement; +import jakarta.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Bundles { diff --git a/src/main/java/health/ere/ps/resource/config/JSONConfigurator.java b/src/main/java/health/ere/ps/resource/config/JSONConfigurator.java new file mode 100644 index 000000000..36a586021 --- /dev/null +++ b/src/main/java/health/ere/ps/resource/config/JSONConfigurator.java @@ -0,0 +1,36 @@ +package health.ere.ps.resource.config; + +import health.ere.ps.jsonb.BundleAdapter; +import health.ere.ps.jsonb.ByteAdapter; +import health.ere.ps.jsonb.DurationAdapter; +import health.ere.ps.jsonb.ThrowableAdapter; +import jakarta.annotation.Priority; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.config.BinaryDataStrategy; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.ext.ContextResolver; +import jakarta.ws.rs.ext.Provider; + +@Provider +@Priority(99) +@Produces({ + MediaType.APPLICATION_JSON +}) +public class JSONConfigurator implements ContextResolver<Jsonb> { + + static JsonbConfig customConfig = new JsonbConfig() + .setProperty(JsonbConfig.FORMATTING, true) + .withAdapters(new BundleAdapter()) + .withAdapters(new ByteAdapter()) + .withAdapters(new ThrowableAdapter()) + .withAdapters(new DurationAdapter()); + public static Jsonb jsonbFactory = JsonbBuilder.create(customConfig); + + @Override + public Jsonb getContext(Class<?> type) { + return jsonbFactory; + } +} \ No newline at end of file diff --git a/src/main/java/health/ere/ps/resource/config/UserConfigurationsResource.java b/src/main/java/health/ere/ps/resource/config/UserConfigurationsResource.java index 6b972c0fd..6b289752e 100644 --- a/src/main/java/health/ere/ps/resource/config/UserConfigurationsResource.java +++ b/src/main/java/health/ere/ps/resource/config/UserConfigurationsResource.java @@ -4,11 +4,11 @@ import health.ere.ps.model.config.UserConfigurations; import health.ere.ps.service.config.UserConfigurationService; -import javax.inject.Inject; -import javax.ws.rs.GET; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.PUT; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.Response; @Path("/config") public class UserConfigurationsResource { diff --git a/src/main/java/health/ere/ps/resource/gematik/CardResource.java b/src/main/java/health/ere/ps/resource/gematik/CardResource.java new file mode 100644 index 000000000..8367b41d1 --- /dev/null +++ b/src/main/java/health/ere/ps/resource/gematik/CardResource.java @@ -0,0 +1,62 @@ +package health.ere.ps.resource.gematik; + +import static health.ere.ps.resource.gematik.Extractors.extractRuntimeConfigFromHeaders; + +import de.gematik.ws.conn.cardservice.wsdl.v8.FaultMessage; +import health.ere.ps.config.RuntimeConfig; +import health.ere.ps.config.UserConfig; +import health.ere.ps.model.gematik.ChangePinResponse; +import health.ere.ps.model.gematik.GetPinStatusResponse; +import health.ere.ps.model.gematik.UnblockPinResponse; +import health.ere.ps.model.gematik.VerifyPinResponse; +import health.ere.ps.service.connector.cards.ConnectorCardsService; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; + +@Path("/card") +public class CardResource { + + @Inject + ConnectorCardsService connectorCardsService; + + @Inject + UserConfig userConfig; + + @Context + HttpServletRequest httpServletRequest; + + @POST + @Path("/change-pin") + public ChangePinResponse changePin(ChangePinParameter parameterObject) + throws FaultMessage { + RuntimeConfig runtimeConfig = extractRuntimeConfigFromHeaders(httpServletRequest, userConfig); + return connectorCardsService.changePin(parameterObject.cardHandle, parameterObject.pinType, runtimeConfig); + } + + @POST + @Path("/verify-pin") + public VerifyPinResponse verifyPin(String cardHandle) throws FaultMessage { + RuntimeConfig runtimeConfig = extractRuntimeConfigFromHeaders(httpServletRequest, userConfig); + return connectorCardsService.verifyPin(cardHandle, runtimeConfig); + } + + @POST + @Path("/unblock-pin") + public UnblockPinResponse unblockPin(String cardHandle, String pinType, Boolean setNewPin) throws FaultMessage { + RuntimeConfig runtimeConfig = extractRuntimeConfigFromHeaders(httpServletRequest, userConfig); + return connectorCardsService.unblockPin(cardHandle, pinType, setNewPin, runtimeConfig); + } + + @GET + @Path("/pin-status") + public GetPinStatusResponse getPinStatus(@QueryParam("cardHandle") String cardHandle, @QueryParam("pinType") String pinType) + throws FaultMessage { + RuntimeConfig runtimeConfig = extractRuntimeConfigFromHeaders(httpServletRequest, userConfig); + return connectorCardsService.getPinStatus(cardHandle, pinType, runtimeConfig); + } +} diff --git a/src/main/java/health/ere/ps/resource/gematik/ChangePinParameter.java b/src/main/java/health/ere/ps/resource/gematik/ChangePinParameter.java new file mode 100644 index 000000000..2be3b0862 --- /dev/null +++ b/src/main/java/health/ere/ps/resource/gematik/ChangePinParameter.java @@ -0,0 +1,11 @@ +package health.ere.ps.resource.gematik; + +public class ChangePinParameter { + public String cardHandle; + public String pinType; + + public ChangePinParameter(String cardHandle, String pinType) { + this.cardHandle = cardHandle; + this.pinType = pinType; + } +} \ No newline at end of file diff --git a/src/main/java/health/ere/ps/resource/gematik/ERezeptWorkflowResource.java b/src/main/java/health/ere/ps/resource/gematik/ERezeptWorkflowResource.java index ce1da138d..82ec4739b 100644 --- a/src/main/java/health/ere/ps/resource/gematik/ERezeptWorkflowResource.java +++ b/src/main/java/health/ere/ps/resource/gematik/ERezeptWorkflowResource.java @@ -1,25 +1,23 @@ package health.ere.ps.resource.gematik; +import static health.ere.ps.resource.gematik.Extractors.extractRuntimeConfigFromHeaders; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.security.cert.CertificateEncodingException; +import java.text.ParseException; import java.util.Arrays; import java.util.Base64; -import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.GET; -import javax.ws.rs.HeaderParam; -import javax.ws.rs.QueryParam; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Entity; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import javax.naming.InvalidNameException; +import javax.xml.transform.TransformerException; +import org.apache.fop.apps.FOPException; +import org.bouncycastle.crypto.CryptoException; import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Identifier; import org.hl7.fhir.r4.model.Task; import ca.uhn.fhir.context.FhirContext; @@ -29,8 +27,26 @@ import de.gematik.ws.conn.eventservice.wsdl.v7.FaultMessage; import de.gematik.ws.conn.signatureservice.v7.SignResponse; import health.ere.ps.config.RuntimeConfig; +import health.ere.ps.config.UserConfig; +import health.ere.ps.event.GetSignatureModeResponseEvent; import health.ere.ps.exception.gematik.ERezeptWorkflowException; +import health.ere.ps.model.gematik.BundleWithAccessCodeOrThrowable; +import health.ere.ps.service.fhir.FHIRService; import health.ere.ps.service.gematik.ERezeptWorkflowService; +import health.ere.ps.service.gematik.PrefillPrescriptionService; +import health.ere.ps.service.pdf.DocumentService; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.HeaderParam; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; @Path("/workflow") public class ERezeptWorkflowResource { @@ -38,20 +54,30 @@ public class ERezeptWorkflowResource { @Inject ERezeptWorkflowService eRezeptWorkflowService; - static IParser jsonParser = FhirContext.forR4().newJsonParser(); - static IParser xmlParser = FhirContext.forR4().newXmlParser(); + @Inject + PrefillPrescriptionService prefillPrescriptionService; + + @Inject + DocumentService documentService; + + private final FhirContext fhirContext = FHIRService.getFhirContext(); + IParser jsonParser = fhirContext.newJsonParser(); + IParser xmlParser = fhirContext.newXmlParser(); @Context HttpServletRequest httpServletRequest; + @Inject + UserConfig userConfig; + @POST - @Path("/task") + @Path("task") public Response createERezeptTask(@HeaderParam("accept") String accept, @QueryParam("flowtype") String flowtype) { if(flowtype == null) { flowtype = "160"; } - Task task = eRezeptWorkflowService.createERezeptTask(true, extractRuntimeConfigFromHeaders(httpServletRequest), flowtype); + Task task = eRezeptWorkflowService.createERezeptTask(true, extractRuntimeConfigFromHeaders(httpServletRequest, userConfig), flowtype); if("application/xml".equals(accept)) { return Response.ok().entity(xmlParser.encodeResourceToString(task)).type(MediaType.APPLICATION_XML).build(); } else { @@ -59,20 +85,11 @@ public Response createERezeptTask(@HeaderParam("accept") String accept, @QueryPa } } - static RuntimeConfig extractRuntimeConfigFromHeaders(HttpServletRequest httpServletRequest) { - for(Object name : Collections.list(httpServletRequest.getHeaderNames())) { - if(name.toString().startsWith("X-")) { - return new RuntimeConfig(httpServletRequest); - } - } - return null; - } - @POST - @Path("/sign") + @Path("sign") public Response signBundleWithIdentifiers(@HeaderParam("Content-Type") String contentType, String bundle) throws DataFormatException, ERezeptWorkflowException { Bundle bundleObject = string2bundle(contentType, bundle); - SignResponse signResponse = eRezeptWorkflowService.signBundleWithIdentifiers(bundleObject, false, extractRuntimeConfigFromHeaders(httpServletRequest)); + SignResponse signResponse = eRezeptWorkflowService.signBundleWithIdentifiers(bundleObject, false, extractRuntimeConfigFromHeaders(httpServletRequest, userConfig)); String base64String = signResponse2base64String(signResponse); return Response.ok().entity(base64String).type(MediaType.TEXT_PLAIN).build(); } @@ -81,68 +98,117 @@ static String signResponse2base64String(SignResponse signResponse) { return new String(Base64.getEncoder().encode(signResponse.getSignatureObject().getBase64Signature().getValue())); } - static Bundle string2bundle(String contentType, String bundle) { + Bundle string2bundle(String contentType, String bundle) { Bundle bundleObject = "application/xml".equals(contentType) ? xmlParser.parseResource(Bundle.class, bundle) : jsonParser.parseResource(Bundle.class, bundle); return bundleObject; } @POST - @Path("/batch-sign") + @Path("batch-sign") public Response signBundlesWithIdentifiers(@HeaderParam("Content-Type") String contentType, String bundles) throws DataFormatException, ERezeptWorkflowException { List<Bundle> bundlesList = Arrays.asList(bundles.split("\\r?\\n")).stream().map((bundle) -> string2bundle(contentType, bundle)).collect(Collectors.toList()); - List<SignResponse> signResponse = eRezeptWorkflowService.signBundleWithIdentifiers(bundlesList, false, extractRuntimeConfigFromHeaders(httpServletRequest)); + List<SignResponse> signResponse = eRezeptWorkflowService.signBundleWithIdentifiers(bundlesList, false, extractRuntimeConfigFromHeaders(httpServletRequest, userConfig)); String responses = signResponse.stream().map(ERezeptWorkflowResource::signResponse2base64String).collect(Collectors.joining("\n")); return Response.ok().entity(responses).type(MediaType.TEXT_PLAIN).build(); } @GET - @Path("/cards") + @Path("cards") public GetCardsResponse cards() { try { - return eRezeptWorkflowService.getCards(extractRuntimeConfigFromHeaders(httpServletRequest)); + return eRezeptWorkflowService.getCards(extractRuntimeConfigFromHeaders(httpServletRequest, userConfig)); } catch (FaultMessage e) { throw new WebApplicationException(e); } } @POST - @Path("/update") + @Path("update") public Response updateERezeptTask(UpdateERezept updateERezept) { - eRezeptWorkflowService.updateERezeptTask(updateERezept.getTaskId(), updateERezept.getAccessCode(), Base64.getDecoder().decode(updateERezept.getSignedBytes()), extractRuntimeConfigFromHeaders(httpServletRequest)); + eRezeptWorkflowService.updateERezeptTask(updateERezept.getTaskId(), updateERezept.getAccessCode(), Base64.getDecoder().decode(updateERezept.getSignedBytes()), extractRuntimeConfigFromHeaders(httpServletRequest, userConfig)); return Response.ok().build(); } @POST - @Path("/abort") + @Path("abort") public Response abortERezeptTask(AbortERezept abortERezept) { - eRezeptWorkflowService.abortERezeptTask(extractRuntimeConfigFromHeaders(httpServletRequest), abortERezept.getTaskId(), abortERezept.getAccessCode()); + eRezeptWorkflowService.abortERezeptTask(extractRuntimeConfigFromHeaders(httpServletRequest, userConfig), abortERezept.getTaskId(), abortERezept.getAccessCode()); return Response.noContent().build(); } @POST - @Path("/comfortsignature/activate") + @Path("comfortsignature/activate") public Response activate() { - String userId = eRezeptWorkflowService.activateComfortSignature(extractRuntimeConfigFromHeaders(httpServletRequest)); + String userId = eRezeptWorkflowService.activateComfortSignature(extractRuntimeConfigFromHeaders(httpServletRequest, userConfig)); return Response.ok(Entity.text(userId)).build(); } @POST - @Path("/comfortsignature/deactivate") + @Path("comfortsignature/deactivate") public Response deactivate() { - eRezeptWorkflowService.deactivateComfortSignature(extractRuntimeConfigFromHeaders(httpServletRequest)); + eRezeptWorkflowService.deactivateComfortSignature(extractRuntimeConfigFromHeaders(httpServletRequest, userConfig)); return Response.ok().build(); } @GET - @Path("/comfortsignature/user-id") + @Path("comfortsignature/user-id") public Response getUserId() { return Response.ok(Entity.text(eRezeptWorkflowService.getUserIdForComfortSignature())).build(); } @POST - @Path("/comfortsignature/user-id") + @Path("comfortsignature/user-id") public Response postUserId(String userId) { eRezeptWorkflowService.setUserIdForComfortSignature(userId); return Response.ok().build(); } + + @GET + @Path("idp-token") + public String idpToken() { + RuntimeConfig runtimeConfig = extractRuntimeConfigFromHeaders(httpServletRequest, userConfig); + eRezeptWorkflowService.requestNewAccessTokenIfNecessary(runtimeConfig, null, null); + return eRezeptWorkflowService.getBearerToken(runtimeConfig); + } + + @GET + @Path("signature-mode") + public GetSignatureModeResponseEvent signatureMode() { + RuntimeConfig runtimeConfig = extractRuntimeConfigFromHeaders(httpServletRequest, userConfig); + return eRezeptWorkflowService.getSignatureMode(runtimeConfig, null, null); + } + + + + @POST + @Path("test-prescription") + public Response testConfigurationsByCreatingTestPrescription() throws + FaultMessage, de.gematik.ws.conn.certificateservice.wsdl.v6.FaultMessage, InvalidNameException, + CertificateEncodingException, IOException, CryptoException, ParseException, ERezeptWorkflowException, + FOPException, TransformerException { + + RuntimeConfig runtimeConfig = extractRuntimeConfigFromHeaders(httpServletRequest, userConfig); + Bundle bundle = prefillPrescriptionService.getTestPrescriptionBundle(runtimeConfig); + + Task task = eRezeptWorkflowService.createERezeptTask(true, runtimeConfig, "160"); + String taskId = null; + String accessCode = null; + for (Identifier identifier : task.getIdentifier()) { + if (identifier.getSystem().equals("https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId")) { + taskId = identifier.getValue(); + } else if (identifier.getSystem().equals("https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_AccessCode")) { + accessCode = identifier.getValue(); + } + }; + bundle.getIdentifier().setValue(taskId); + SignResponse signResponse = eRezeptWorkflowService.signBundleWithIdentifiers(bundle, false, runtimeConfig); + String base64String = signResponse2base64String(signResponse); + + eRezeptWorkflowService.updateERezeptTask(taskId, accessCode, Base64.getDecoder().decode(base64String), runtimeConfig); + + BundleWithAccessCodeOrThrowable bundleWithAccessCodeOrThrowable = new BundleWithAccessCodeOrThrowable(bundle, accessCode); + List<BundleWithAccessCodeOrThrowable> bundleWithAccessCodeOrThrowableList = Arrays.asList(bundleWithAccessCodeOrThrowable); + ByteArrayOutputStream baos = documentService.generateERezeptPdf(bundleWithAccessCodeOrThrowableList); + return Response.ok().entity(baos.toByteArray()).type("application/pdf").build(); + } } diff --git a/src/main/java/health/ere/ps/resource/gematik/Extractors.java b/src/main/java/health/ere/ps/resource/gematik/Extractors.java new file mode 100644 index 000000000..a763ff36f --- /dev/null +++ b/src/main/java/health/ere/ps/resource/gematik/Extractors.java @@ -0,0 +1,22 @@ +package health.ere.ps.resource.gematik; + +import java.util.Collections; + +import health.ere.ps.config.RuntimeConfig; +import health.ere.ps.config.UserConfig; +import jakarta.servlet.http.HttpServletRequest; + +public class Extractors { + //todo: refactor - move to RuntimeConfig? (there is already the updateConfigurationsWithHttpServletRequest) + public static RuntimeConfig extractRuntimeConfigFromHeaders(HttpServletRequest httpServletRequest, UserConfig userConfig) { + for(Object name : Collections.list(httpServletRequest.getHeaderNames())) { + if(name.toString().startsWith("X-")) { + RuntimeConfig runtimeConfig = new RuntimeConfig(); + runtimeConfig.copyValuesFromUserConfig(userConfig); + runtimeConfig.updateConfigurationsWithHttpServletRequest(httpServletRequest); + return runtimeConfig; + } + } + return null; + } +} diff --git a/src/main/java/health/ere/ps/resource/gematik/PharmacyResource.java b/src/main/java/health/ere/ps/resource/gematik/PharmacyResource.java index 5836815da..9e727e385 100644 --- a/src/main/java/health/ere/ps/resource/gematik/PharmacyResource.java +++ b/src/main/java/health/ere/ps/resource/gematik/PharmacyResource.java @@ -1,16 +1,19 @@ package health.ere.ps.resource.gematik; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.Context; + +import static health.ere.ps.resource.gematik.Extractors.extractRuntimeConfigFromHeaders; import org.hl7.fhir.r4.model.Bundle; import de.gematik.ws.conn.vsds.vsdservice.v5.FaultMessage; +import health.ere.ps.config.UserConfig; import health.ere.ps.service.gematik.PharmacyService; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; @Path("/pharmacy") public class PharmacyResource { @@ -21,9 +24,19 @@ public class PharmacyResource { @Context HttpServletRequest httpServletRequest; + @Inject + UserConfig userConfig; + @GET - @Path("/Task") + @Path("Task") public Bundle task(@QueryParam("egkHandle") String egkHandle, @QueryParam("smcbHandle") String smcbHandle) throws FaultMessage, de.gematik.ws.conn.eventservice.wsdl.v7.FaultMessage { - return pharmacyService.getEPrescriptionsForCardHandle(egkHandle, smcbHandle, ERezeptWorkflowResource.extractRuntimeConfigFromHeaders(httpServletRequest)); - } + return pharmacyService.getEPrescriptionsForCardHandle(egkHandle, smcbHandle, extractRuntimeConfigFromHeaders(httpServletRequest, userConfig)); + } + + @GET + @Path("Accept") + public Bundle ePrescription(@QueryParam("token") String token) throws FaultMessage, de.gematik.ws.conn.eventservice.wsdl.v7.FaultMessage { + return pharmacyService.accept(token, extractRuntimeConfigFromHeaders(httpServletRequest, userConfig)); + } + } diff --git a/src/main/java/health/ere/ps/resource/gematik/PreviewResource.java b/src/main/java/health/ere/ps/resource/gematik/PreviewResource.java new file mode 100644 index 000000000..a0a6bc029 --- /dev/null +++ b/src/main/java/health/ere/ps/resource/gematik/PreviewResource.java @@ -0,0 +1,25 @@ +package health.ere.ps.resource.gematik; + +import java.io.IOException; + +import javax.xml.transform.TransformerException; + +import health.ere.ps.service.kbv.XSLTService; +import jakarta.inject.Inject; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; + +@Path("/preview") +public class PreviewResource { + + @Inject + XSLTService xsltService; + + @POST + @Path("/generate") + public String post(String content) throws IOException, TransformerException { + String preview = xsltService.generateHtmlForString(content); + return preview; + } +} + diff --git a/src/main/java/health/ere/ps/resource/gematik/mapper/WebExceptionMapper.java b/src/main/java/health/ere/ps/resource/gematik/mapper/WebExceptionMapper.java new file mode 100644 index 000000000..15f97e09f --- /dev/null +++ b/src/main/java/health/ere/ps/resource/gematik/mapper/WebExceptionMapper.java @@ -0,0 +1,41 @@ +package health.ere.ps.resource.gematik.mapper; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.logging.Level; +import java.util.logging.Logger; + +import health.ere.ps.jsonb.ThrowableAdapter; +import jakarta.json.Json; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.ext.ExceptionMapper; + + +public class WebExceptionMapper implements ExceptionMapper<Throwable> { + + private static final Logger log = Logger.getLogger(ExceptionMapper.class.getName()); + + @Override + public Response toResponse(Throwable e) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + JsonObjectBuilder builder = Json.createObjectBuilder() + .add("class", e.getClass().getName()) + .add("message", e.getMessage() != null ? e.getMessage() : "null") + .add("errorCode", ThrowableAdapter.extractErrorCode(e)) + .add("stacktrace", sw.toString()); + try { + if(e instanceof WebApplicationException) { + WebApplicationException wae = (WebApplicationException) e; + builder.add("response", wae.getResponse().getEntity().toString()); + } + } catch(Exception ex) { + log.log(Level.SEVERE, "Error during response generation", ex); + } + return Response.serverError().entity(builder.build()).build(); + } + +} \ No newline at end of file diff --git a/src/main/java/health/ere/ps/resource/gematik/writer/JSONBundleMessageBodyWriter.java b/src/main/java/health/ere/ps/resource/gematik/writer/JSONBundleMessageBodyWriter.java index 74fa95b67..34f7ed66e 100644 --- a/src/main/java/health/ere/ps/resource/gematik/writer/JSONBundleMessageBodyWriter.java +++ b/src/main/java/health/ere/ps/resource/gematik/writer/JSONBundleMessageBodyWriter.java @@ -6,23 +6,27 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import org.hl7.fhir.r4.model.Bundle; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.parser.IParser; +import health.ere.ps.service.fhir.FHIRService; + + @Provider @Produces(MediaType.APPLICATION_JSON) public class JSONBundleMessageBodyWriter implements MessageBodyWriter<Bundle> { - static IParser jsonParser = FhirContext.forR4().newJsonParser(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); + static IParser jsonParser = fhirContext.newJsonParser(); @Override public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { diff --git a/src/main/java/health/ere/ps/resource/gematik/writer/XMLBundleMessageBodyWriter.java b/src/main/java/health/ere/ps/resource/gematik/writer/XMLBundleMessageBodyWriter.java index a0fdc78b7..b084806b6 100644 --- a/src/main/java/health/ere/ps/resource/gematik/writer/XMLBundleMessageBodyWriter.java +++ b/src/main/java/health/ere/ps/resource/gematik/writer/XMLBundleMessageBodyWriter.java @@ -6,23 +6,26 @@ import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; import org.hl7.fhir.r4.model.Bundle; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.parser.IParser; +import health.ere.ps.service.fhir.FHIRService; + @Provider @Produces(MediaType.APPLICATION_XML) public class XMLBundleMessageBodyWriter implements MessageBodyWriter<Bundle> { - static IParser xmlParser = FhirContext.forR4().newXmlParser(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); + static IParser xmlParser = fhirContext.newXmlParser(); @Override public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { @@ -35,5 +38,4 @@ public void writeTo(Bundle t, Class<?> type, Type genericType, Annotation[] anno throws IOException, WebApplicationException { xmlParser.encodeResourceToWriter(t, new OutputStreamWriter(entityStream, "UTF-8")); } - } diff --git a/src/main/java/health/ere/ps/resource/ipp/PrinterResource.java b/src/main/java/health/ere/ps/resource/ipp/PrinterResource.java deleted file mode 100644 index f9a05344b..000000000 --- a/src/main/java/health/ere/ps/resource/ipp/PrinterResource.java +++ /dev/null @@ -1,58 +0,0 @@ -package health.ere.ps.resource.ipp; - - -import java.io.*; -import java.net.URI; -import java.util.logging.Logger; - -import javax.inject.Inject; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; - -import com.hp.jipp.encoding.IppInputStream; -import com.hp.jipp.encoding.IppOutputStream; -import com.hp.jipp.trans.IppPacketData; -import com.hp.jipp.trans.IppServerTransport; -import health.ere.ps.service.ipp.PrinterService; - - -@Path("ipp") -public class PrinterResource implements IppServerTransport { - - @Inject - PrinterService printerService; - - private final String IPP_MEDIA_TYPE = "application/ipp"; - - private static Logger log = Logger.getLogger(PrinterResource.class.getName()); - - @POST - @Path("/{queue}") - public Response handle(@PathParam("queue") String queue, @Context UriInfo uriInfo, InputStream stream) throws IOException { - try { - IppInputStream inputStream = new IppInputStream(stream); - IppPacketData data = new IppPacketData(inputStream.readPacket(), inputStream); - IppPacketData response = handle(uriInfo.getRequestUri(), data); - ByteArrayOutputStream output = new ByteArrayOutputStream(); - new IppOutputStream(output).write(response.getPacket()); - return Response.ok(output.toByteArray(), MediaType.valueOf(IPP_MEDIA_TYPE)).build(); - } catch (IOException e) { - e.printStackTrace(); - throw e; - } - } - - @Override - public IppPacketData handle(URI uri, IppPacketData data) throws IOException { - log.info(uri+" was called "); - log.info("Request: "+data); - IppPacketData serverResponse = printerService.handleIppPacketData(uri, data); - log.info("Response: "+serverResponse); - return serverResponse; - } -} diff --git a/src/main/java/health/ere/ps/resource/kbv/XSLTResource.java b/src/main/java/health/ere/ps/resource/kbv/XSLTResource.java index 0f1e3d025..07fbd6b7d 100644 --- a/src/main/java/health/ere/ps/resource/kbv/XSLTResource.java +++ b/src/main/java/health/ere/ps/resource/kbv/XSLTResource.java @@ -2,15 +2,16 @@ import java.io.IOException; -import javax.inject.Inject; -import javax.ws.rs.HeaderParam; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.ws.rs.HeaderParam; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import javax.xml.transform.TransformerException; +import health.ere.ps.service.fhir.FHIRService; import org.hl7.fhir.r4.model.Bundle; import ca.uhn.fhir.context.FhirContext; @@ -22,11 +23,12 @@ public class XSLTResource { @Inject XSLTService xsltService; - IParser jsonParser = FhirContext.forR4().newJsonParser(); - IParser xmlParser = FhirContext.forR4().newXmlParser(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); + IParser jsonParser = fhirContext.newJsonParser(); + IParser xmlParser = fhirContext.newXmlParser(); @POST - @Path("/transform") + @Path("transform") public Response transform(@HeaderParam("Content-Type") String contentType, String bundle) { String htmlPreview; try { diff --git a/src/main/java/health/ere/ps/resource/pdf/DocumentResource.java b/src/main/java/health/ere/ps/resource/pdf/DocumentResource.java index d6051ba40..e8278f373 100644 --- a/src/main/java/health/ere/ps/resource/pdf/DocumentResource.java +++ b/src/main/java/health/ere/ps/resource/pdf/DocumentResource.java @@ -7,17 +7,18 @@ import java.util.Objects; import java.util.stream.Collectors; -import javax.inject.Inject; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonValue; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonValue; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; import javax.xml.transform.TransformerException; +import health.ere.ps.service.fhir.FHIRService; import org.apache.fop.apps.FOPException; import org.hl7.fhir.r4.model.Bundle; @@ -31,11 +32,12 @@ public class DocumentResource { @Inject DocumentService documentService; - IParser jsonParser = FhirContext.forR4().newJsonParser(); - IParser xmlParser = FhirContext.forR4().newXmlParser(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); + IParser jsonParser = fhirContext.newJsonParser(); + IParser xmlParser = fhirContext.newXmlParser(); @POST - @Path("/bundles") + @Path("bundles") public Response createAndSendPrescriptions(String bundlesString) { JsonArray jsonArray = Json.createReader(new StringReader(bundlesString)).readArray(); diff --git a/src/main/java/health/ere/ps/resource/status/StatusResource.java b/src/main/java/health/ere/ps/resource/status/StatusResource.java index 4609018bb..28455ae5f 100644 --- a/src/main/java/health/ere/ps/resource/status/StatusResource.java +++ b/src/main/java/health/ere/ps/resource/status/StatusResource.java @@ -4,14 +4,14 @@ import java.util.Collections; -import javax.inject.Inject; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import health.ere.ps.config.RuntimeConfig; import health.ere.ps.service.status.StatusService; diff --git a/src/main/java/health/ere/ps/resource/validation/bundle/PrescriptionBundleValidatorResource.java b/src/main/java/health/ere/ps/resource/validation/bundle/PrescriptionBundleValidatorResource.java index 47a4ec254..a3b3848b7 100644 --- a/src/main/java/health/ere/ps/resource/validation/bundle/PrescriptionBundleValidatorResource.java +++ b/src/main/java/health/ere/ps/resource/validation/bundle/PrescriptionBundleValidatorResource.java @@ -4,16 +4,15 @@ import java.util.List; import java.util.stream.Collectors; -import javax.inject.Inject; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.ws.rs.Consumes; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; - import health.ere.ps.validation.fhir.bundle.PrescriptionBundleValidator; +import jakarta.inject.Inject; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; @Path("/validate") public class PrescriptionBundleValidatorResource { @@ -34,7 +33,7 @@ public Response post(String bundle) { List<String> errorsList = new ArrayList<>(); if (!prescriptionBundleValidator.validateResource(bundle, - true, errorsList).isSuccessful()) { + true, errorsList).isValid()) { return Response.status(Status.BAD_REQUEST).entity(getXmlForErrorsList(errorsList)).build(); } else { return Response.ok().build(); diff --git a/src/main/java/health/ere/ps/resource/xml/XmlPrescriptionResource.java b/src/main/java/health/ere/ps/resource/xml/XmlPrescriptionResource.java index cc5a2280b..060aeccf1 100644 --- a/src/main/java/health/ere/ps/resource/xml/XmlPrescriptionResource.java +++ b/src/main/java/health/ere/ps/resource/xml/XmlPrescriptionResource.java @@ -1,10 +1,10 @@ package health.ere.ps.resource.xml; -import javax.enterprise.event.Event; -import javax.inject.Inject; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.core.Response; +import jakarta.enterprise.event.Event; +import jakarta.inject.Inject; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.core.Response; import org.hl7.fhir.r4.model.Bundle; import health.ere.ps.event.BundlesEvent; diff --git a/src/main/java/health/ere/ps/retry/Retrier.java b/src/main/java/health/ere/ps/retry/Retrier.java new file mode 100644 index 000000000..82fa86e84 --- /dev/null +++ b/src/main/java/health/ere/ps/retry/Retrier.java @@ -0,0 +1,59 @@ +package health.ere.ps.retry; + +import org.jboss.logmanager.Level; + +import java.util.List; +import java.util.Objects; +import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; +import java.util.logging.Logger; + +public class Retrier { + + private static final Logger log = Logger.getLogger(Retrier.class.getName()); + + private Retrier() { + } + + public static <T> T callAndRetry( + List<Integer> retrySeconds, + int retryPeriodMs, + RetryAction<T> action, + Predicate<T> predicate + ) { + T result = safeExecute(action); + if (result != null && predicate.test(result)) { + return result; + } + List<Integer> retries = retrySeconds.stream().filter(Objects::nonNull).sorted().toList(); + if (!retries.isEmpty()) { + int k = 0; + long start = System.currentTimeMillis(); + while (result == null || !predicate.test(result)) { + Integer timeoutSec = retries.get(k++); + if (k >= retries.size()) { + k = retries.size() - 1; + } + long delta = System.currentTimeMillis() - start; + if (delta + timeoutSec * 1000 > retryPeriodMs) { + break; + } + try { + TimeUnit.SECONDS.sleep(timeoutSec); + } catch (InterruptedException ignored) { + } + result = safeExecute(action); + } + } + return result; + } + + private static <T> T safeExecute(RetryAction<T> action) { + try { + return action.execute(); + } catch (Throwable t) { + log.log(Level.SEVERE, "Error while executing retryable action", t); + } + return null; + } +} diff --git a/src/main/java/health/ere/ps/retry/RetryAction.java b/src/main/java/health/ere/ps/retry/RetryAction.java new file mode 100644 index 000000000..3109f3adf --- /dev/null +++ b/src/main/java/health/ere/ps/retry/RetryAction.java @@ -0,0 +1,6 @@ +package health.ere.ps.retry; + +public interface RetryAction<T> { + + T execute(); +} diff --git a/src/main/java/health/ere/ps/service/common/security/SecretsManagerService.java b/src/main/java/health/ere/ps/service/common/security/SecretsManagerService.java index 01792f0e0..00d9e5d6f 100644 --- a/src/main/java/health/ere/ps/service/common/security/SecretsManagerService.java +++ b/src/main/java/health/ere/ps/service/common/security/SecretsManagerService.java @@ -17,10 +17,10 @@ import java.util.Base64; import java.util.logging.Logger; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.inject.Inject; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.inject.Inject; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; diff --git a/src/main/java/health/ere/ps/service/common/util/BundleJsonInfoExtractor.java b/src/main/java/health/ere/ps/service/common/util/BundleJsonInfoExtractor.java index bb24df550..c0a01f4fb 100644 --- a/src/main/java/health/ere/ps/service/common/util/BundleJsonInfoExtractor.java +++ b/src/main/java/health/ere/ps/service/common/util/BundleJsonInfoExtractor.java @@ -7,10 +7,10 @@ import java.util.HashMap; import java.util.Map; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; /** * A Utility class used to extract information of particular importance from a bundle json string. diff --git a/src/main/java/health/ere/ps/service/config/UserConfigurationService.java b/src/main/java/health/ere/ps/service/config/UserConfigurationService.java index 96400700c..1a7869ef1 100644 --- a/src/main/java/health/ere/ps/service/config/UserConfigurationService.java +++ b/src/main/java/health/ere/ps/service/config/UserConfigurationService.java @@ -8,10 +8,10 @@ import java.util.Properties; import java.util.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; import health.ere.ps.event.SaveSettingsEvent; import health.ere.ps.event.SaveSettingsResponseEvent; diff --git a/src/main/java/health/ere/ps/service/connector/auth/SmcbAuthenticatorService.java b/src/main/java/health/ere/ps/service/connector/auth/SmcbAuthenticatorService.java index 82f9930dc..18d8575d8 100644 --- a/src/main/java/health/ere/ps/service/connector/auth/SmcbAuthenticatorService.java +++ b/src/main/java/health/ere/ps/service/connector/auth/SmcbAuthenticatorService.java @@ -3,18 +3,18 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigInteger; +import java.nio.ByteBuffer; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.cert.X509Certificate; +import java.util.Arrays; import java.util.Base64; import java.util.Optional; import java.util.Set; -import javax.enterprise.context.Dependent; -import javax.inject.Inject; -import javax.xml.ws.Holder; - import org.apache.commons.lang3.tuple.Pair; +import org.bouncycastle.crypto.signers.StandardDSAEncoding; +import org.bouncycastle.jce.ECNamedCurveTable; import org.jose4j.jws.JsonWebSignature; import org.jose4j.jwx.CompactSerializer; import org.jose4j.lang.JoseException; @@ -35,6 +35,9 @@ import health.ere.ps.exception.connector.ConnectorCardsException; import health.ere.ps.service.connector.cards.ConnectorCardsService; import health.ere.ps.service.connector.provider.MultiConnectorServicesProvider; +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Inject; +import jakarta.xml.ws.Holder; import oasis.names.tc.dss._1_0.core.schema.Base64Data; import oasis.names.tc.dss._1_0.core.schema.SignatureObject; @@ -114,9 +117,10 @@ public void sign() throws JoseException { String smcbCardHandle = (this.runtimeConfig != null && this.runtimeConfig.getSMCBHandle() != null) ? this.runtimeConfig.getSMCBHandle() : connectorCardsService.getConnectorCardHandle( ConnectorCardsService.CardHandleType.SMC_B, runtimeConfig); + boolean isECC = this.getAlgorithmHeaderValue().equalsIgnoreCase("BP256R1"); - signatureBytes = externalAuthenticate(encodedhash, - smcbCardHandle); + signatureBytes = externalAuthenticateInternal(encodedhash, + smcbCardHandle, isECC); } catch (ConnectorCardsException e) { throw new IllegalStateException("Cannot access the SMC-B card-handle info to " + "compute the json web token signature!", e); @@ -124,39 +128,11 @@ public void sign() throws JoseException { setSignature(signatureBytes); } } - - public byte[] externalAuthenticate(byte[] sha265Hash, String smcbCardHandle) throws JoseException { - return externalAuthenticate(sha265Hash, smcbCardHandle, this.runtimeConfig); - } - - public byte[] externalAuthenticate(byte[] sha265Hash, String smcbCardHandle, RuntimeConfig runtimeConfig) throws JoseException { - ExternalAuthenticate.OptionalInputs optionalInputs = new ExternalAuthenticate.OptionalInputs(); - - optionalInputs.setSignatureSchemes("RSASSA-PSS"); - optionalInputs.setSignatureType("urn:ietf:rfc:3447"); - - BinaryDocumentType binaryDocumentType = new BinaryDocumentType(); - Base64Data base64Data = new Base64Data(); - base64Data.setMimeType("application/octet-stream"); - base64Data.setValue(sha265Hash); - binaryDocumentType.setBase64Data(base64Data); - - ExternalAuthenticateResponse response; - - try { - // Titus Bug: Client received SOAP Fault from server: No enum constant - // de.gematik.ti.signenc.authsignature.SignatureScheme.RSASSA-PSS Please see the - // server log to find more detail regarding exact cause of the failure. - response = doExternalAuthenticate(smcbCardHandle, - runtimeConfig, optionalInputs, - binaryDocumentType); - } catch (FaultMessage e) { - throw new JoseException("Could not call externalAuthenticate", e); - } - - return response.getSignatureObject().getBase64Signature().getValue(); + + public byte[] externalAuthenticateInternal(byte[] sha265Hash, String smcbCardHandle, boolean isECC) throws JoseException { + return externalAuthenticate(sha265Hash, smcbCardHandle, this.runtimeConfig, isECC); } - + private byte[] getSigningInputBytes() throws JoseException { /* @@ -191,6 +167,67 @@ private byte[] getSigningInputBytes() throws JoseException { } } + public byte[] externalAuthenticate(byte[] sha265Hash, String smcbCardHandle, RuntimeConfig runtimeConfig, boolean isECC) throws JoseException { + ExternalAuthenticate.OptionalInputs optionalInputs = new ExternalAuthenticate.OptionalInputs(); + + // optionalInputs.setSignatureSchemes("RSASSA-PSS"); + if(isECC) { + optionalInputs.setSignatureType("urn:bsi:tr:03111:ecdsa"); + } else { + optionalInputs.setSignatureType("urn:ietf:rfc:3447"); + } + + BinaryDocumentType binaryDocumentType = new BinaryDocumentType(); + Base64Data base64Data = new Base64Data(); + base64Data.setMimeType("application/octet-stream"); + base64Data.setValue(sha265Hash); + binaryDocumentType.setBase64Data(base64Data); + + ExternalAuthenticateResponse response; + + try { + // Titus Bug: Client received SOAP Fault from server: No enum constant + // de.gematik.ti.signenc.authsignature.SignatureScheme.RSASSA-PSS Please see the + // server log to find more detail regarding exact cause of the failure. + response = doExternalAuthenticate(smcbCardHandle, + runtimeConfig, optionalInputs, + binaryDocumentType); + } catch (FaultMessage e) { + throw new JoseException("Could not call externalAuthenticate", e); + } + byte[] value = response.getSignatureObject().getBase64Signature().getValue(); + + if(isECC) { + byte[] concatenated = convertDerECDSAtoConcated(value); + return concatenated; + } else { + return value; + } + } + + public static byte[] convertDerECDSAtoConcated(byte[] derSignature) throws JoseException { + try { + BigInteger[] signInt = StandardDSAEncoding.INSTANCE.decode(ECNamedCurveTable.getParameterSpec("brainpoolp256r1").getN(), derSignature); + ByteBuffer buffer = ByteBuffer.allocate(64); + byte[] rArray = signInt[0].toByteArray(); + if(rArray.length == 32) { + buffer.put(rArray); + } else { + buffer.put(Arrays.copyOfRange(rArray, 1, 33)); + } + byte[] sArray = signInt[1].toByteArray(); + if(sArray.length == 32) { + buffer.put(sArray); + } else { + buffer.put(Arrays.copyOfRange(sArray, 1, 33)); + } + return buffer.array(); + } catch (Exception e) { + throw new JoseException("Error converting DER to concatenated signature: " + e.getMessage(), e); + } + } + + public ExternalAuthenticateResponse doExternalAuthenticate(String cardHandle, RuntimeConfig runtimeConfig, ExternalAuthenticate.OptionalInputs optionalInputs, BinaryDocumentType binaryDocumentType) throws FaultMessage { diff --git a/src/main/java/health/ere/ps/service/connector/cards/ConnectorCardsService.java b/src/main/java/health/ere/ps/service/connector/cards/ConnectorCardsService.java index 36274e4a3..d94e467d3 100644 --- a/src/main/java/health/ere/ps/service/connector/cards/ConnectorCardsService.java +++ b/src/main/java/health/ere/ps/service/connector/cards/ConnectorCardsService.java @@ -3,16 +3,11 @@ import java.math.BigInteger; import java.util.List; import java.util.Optional; +import java.util.UUID; import java.util.function.Predicate; import java.util.logging.Level; import java.util.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; -import javax.xml.ws.Holder; - import org.apache.commons.collections4.CollectionUtils; import de.gematik.ws.conn.cardservice.v8.CardInfoType; @@ -20,6 +15,7 @@ import de.gematik.ws.conn.cardservice.v8.PinStatusEnum; import de.gematik.ws.conn.cardservicecommon.v2.PinResultEnum; import de.gematik.ws.conn.connectorcommon.v5.Status; +import de.gematik.ws.conn.connectorcontext.v2.ContextType; import de.gematik.ws.conn.eventservice.v7.GetCards; import de.gematik.ws.conn.eventservice.v7.GetCardsResponse; import de.gematik.ws.conn.eventservice.wsdl.v7.FaultMessage; @@ -39,7 +35,12 @@ import health.ere.ps.model.gematik.UnblockPinResponse; import health.ere.ps.model.gematik.VerifyPinResponse; import health.ere.ps.service.connector.provider.MultiConnectorServicesProvider; -import health.ere.ps.websocket.ExceptionWithReplyToExcetion; +import health.ere.ps.websocket.ExceptionWithReplyToException; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; +import jakarta.xml.ws.Holder; @ApplicationScoped @@ -138,7 +139,7 @@ public void onChangePinEvent(@ObservesAsync ChangePinEvent changePinEvent) { changePinResponseEvent.fireAsync(new ChangePinResponseEvent(changePinResponse, changePinEvent.getReplyTo(), changePinEvent.getId())); } catch (Exception e) { log.log(Level.WARNING, "Could not change pin for card", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, changePinEvent.getReplyTo(), changePinEvent.getId())); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, changePinEvent.getReplyTo(), changePinEvent.getId())); } } @@ -148,7 +149,7 @@ public void onVerifyPinEvent(@ObservesAsync VerifyPinEvent verifyPinEvent) { verifyPinResponseEvent.fireAsync(new VerifyPinResponseEvent(verifyPinResponse, verifyPinEvent.getReplyTo(), verifyPinEvent.getId())); } catch (Exception e) { log.log(Level.WARNING, "Could not verify pin for card", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, verifyPinEvent.getReplyTo(), verifyPinEvent.getId())); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, verifyPinEvent.getReplyTo(), verifyPinEvent.getId())); } } @@ -158,7 +159,7 @@ public void onUnblockPinEvent(@ObservesAsync UnblockPinEvent unblockPinEvent) { unblockPinResponseEvent.fireAsync(new UnblockPinResponseEvent(unblockPinResponse, unblockPinEvent.getReplyTo(), unblockPinEvent.getId())); } catch (Exception e) { log.log(Level.WARNING, "Could not unblock pin for card", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, unblockPinEvent.getReplyTo(), unblockPinEvent.getId())); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, unblockPinEvent.getReplyTo(), unblockPinEvent.getId())); } } @@ -167,8 +168,8 @@ public void onGetPinStatusEvent(@ObservesAsync GetPinStatusEvent getPinStatusEve GetPinStatusResponse getPinStatusResponse = getPinStatus(getPinStatusEvent.getCardHandle(), getPinStatusEvent.getPinType(), getPinStatusEvent.getRuntimeConfig()); getPinStatusResponseEvent.fireAsync(new GetPinStatusResponseEvent(getPinStatusResponse, getPinStatusEvent.getReplyTo(), getPinStatusEvent.getId())); } catch (Exception e) { - log.log(Level.WARNING, "Could not unblock pin for card", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, getPinStatusEvent.getReplyTo(), getPinStatusEvent.getId())); + log.log(Level.WARNING, "Could not get pin status for card", e); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, getPinStatusEvent.getReplyTo(), getPinStatusEvent.getId())); } } @@ -212,7 +213,12 @@ public GetPinStatusResponse getPinStatus(String cardHandle, String pinType, Runt Holder<Status> status = new Holder<>(); Holder<PinStatusEnum> pinResultEnum = new Holder<>(); Holder<BigInteger> leftTries = new Holder<>(); - connectorServicesProvider.getCardServicePortType(runtimeConfig).getPinStatus(connectorServicesProvider.getContextType(runtimeConfig), cardHandle, pinType, status, pinResultEnum, leftTries); + + ContextType contextType = connectorServicesProvider.getContextType(runtimeConfig); + if(contextType.getUserId() == null) { + contextType.setUserId(UUID.randomUUID().toString()); + } + connectorServicesProvider.getCardServicePortType(runtimeConfig).getPinStatus(contextType, cardHandle, pinType, status, pinResultEnum, leftTries); return new GetPinStatusResponse(status.value, pinResultEnum.value, leftTries.value); } diff --git a/src/main/java/health/ere/ps/service/connector/certificate/CardCertificateReaderService.java b/src/main/java/health/ere/ps/service/connector/certificate/CardCertificateReaderService.java index 9a9936513..973a975ff 100644 --- a/src/main/java/health/ere/ps/service/connector/certificate/CardCertificateReaderService.java +++ b/src/main/java/health/ere/ps/service/connector/certificate/CardCertificateReaderService.java @@ -6,14 +6,11 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.xml.ws.Holder; - import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import de.gematik.ws.conn.cardservicecommon.v2.PinResultEnum; +import de.gematik.ws.conn.certificateservice.v6.CryptType; import de.gematik.ws.conn.certificateservice.v6.ReadCardCertificate; import de.gematik.ws.conn.certificateservice.v6.ReadCardCertificateResponse; import de.gematik.ws.conn.certificateservice.wsdl.v6.FaultMessage; @@ -24,6 +21,9 @@ import health.ere.ps.exception.connector.ConnectorCardCertificateReadException; import health.ere.ps.service.connector.provider.MultiConnectorServicesProvider; import health.ere.ps.service.idp.crypto.CryptoLoader; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.xml.ws.Holder; @ApplicationScoped public class CardCertificateReaderService { @@ -80,13 +80,19 @@ public X509Certificate retrieveSmcbCardCertificate(String cardHandle, RuntimeCon return x509Certificate; } + public ReadCardCertificateResponse doReadCardCertificate(String cardHandle, RuntimeConfig runtimeConfig) + throws ConnectorCardCertificateReadException { + CryptType crypt = CryptType.ECC; + return doReadCardCertificate(cardHandle, runtimeConfig, crypt); + } + /** * Reads the AUT certificate of a card. * * @param cardHandle The handle of the card whose AUT certificate is to be read. * @return The read AUT certificate. */ - public ReadCardCertificateResponse doReadCardCertificate(String cardHandle, RuntimeConfig runtimeConfig) + public ReadCardCertificateResponse doReadCardCertificate(String cardHandle, RuntimeConfig runtimeConfig, CryptType crypt) throws ConnectorCardCertificateReadException { ReadCardCertificate.CertRefList certRefList = new ReadCardCertificate.CertRefList(); @@ -96,9 +102,18 @@ public ReadCardCertificateResponse doReadCardCertificate(String cardHandle, Runt Holder<X509DataInfoListType> certHolder = new Holder<>(); try { + connectorServicesProvider.getCertificateServicePortType(runtimeConfig).readCardCertificate(cardHandle, connectorServicesProvider.getContextType(runtimeConfig), certRefList, - statusHolder, certHolder); + crypt, statusHolder, certHolder); } catch (FaultMessage faultMessage) { + + // Datei nicht vorhanden + boolean code4087 = faultMessage.getFaultInfo().getTrace().stream() + .anyMatch(t -> t.getCode().equals(BigInteger.valueOf(4087L))); + if(code4087 && crypt.equals(CryptType.ECC)) { + return doReadCardCertificate(cardHandle, runtimeConfig, CryptType.RSA); + } + // Zugriffsbedingungen nicht erfüllt boolean code4085 = faultMessage.getFaultInfo().getTrace().stream() .anyMatch(t -> t.getCode().equals(BigInteger.valueOf(4085L))); diff --git a/src/main/java/health/ere/ps/service/connector/endpoint/EndpointDiscoveryService.java b/src/main/java/health/ere/ps/service/connector/endpoint/EndpointDiscoveryService.java index b8b5c577b..956384d18 100644 --- a/src/main/java/health/ere/ps/service/connector/endpoint/EndpointDiscoveryService.java +++ b/src/main/java/health/ere/ps/service/connector/endpoint/EndpointDiscoveryService.java @@ -7,12 +7,12 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.ProcessingException; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Invocation; -import javax.ws.rs.client.Invocation.Builder; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.ProcessingException; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Invocation; +import jakarta.ws.rs.client.Invocation.Builder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -270,6 +270,9 @@ private String getEndpoint(Node serviceNode, String version) { location = endpointNode.getAttributes().getNamedItem("Location").getTextContent(); if (location.startsWith(userConfig.getConnectorBaseURL())) { return location; + } else { + log.warning("Invalid service node. Maybe location: "+location+" does not start with: "+userConfig.getConnectorBaseURL()); + return location; } } throw new IllegalArgumentException("Invalid service node. Maybe location: "+location+" does not start with: "+userConfig.getConnectorBaseURL()); diff --git a/src/main/java/health/ere/ps/service/connector/provider/AbstractConnectorServicesProvider.java b/src/main/java/health/ere/ps/service/connector/provider/AbstractConnectorServicesProvider.java index 29d9727bc..ff1ff4b29 100644 --- a/src/main/java/health/ere/ps/service/connector/provider/AbstractConnectorServicesProvider.java +++ b/src/main/java/health/ere/ps/service/connector/provider/AbstractConnectorServicesProvider.java @@ -4,10 +4,10 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.inject.Inject; +import jakarta.inject.Inject; +import jakarta.xml.ws.BindingProvider; import javax.net.ssl.SSLContext; import javax.xml.parsers.ParserConfigurationException; -import javax.xml.ws.BindingProvider; import de.gematik.ws.conn.authsignatureservice.wsdl.v7.AuthSignatureService; import de.gematik.ws.conn.authsignatureservice.wsdl.v7.AuthSignatureServicePortType; diff --git a/src/main/java/health/ere/ps/service/connector/provider/DefaultConnectorServicesProvider.java b/src/main/java/health/ere/ps/service/connector/provider/DefaultConnectorServicesProvider.java index ff43b4b96..9ff5fa518 100644 --- a/src/main/java/health/ere/ps/service/connector/provider/DefaultConnectorServicesProvider.java +++ b/src/main/java/health/ere/ps/service/connector/provider/DefaultConnectorServicesProvider.java @@ -1,8 +1,8 @@ package health.ere.ps.service.connector.provider; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import health.ere.ps.config.UserConfig; diff --git a/src/main/java/health/ere/ps/service/connector/provider/MultiConnectorServicesProvider.java b/src/main/java/health/ere/ps/service/connector/provider/MultiConnectorServicesProvider.java index f039e123e..c4da40346 100644 --- a/src/main/java/health/ere/ps/service/connector/provider/MultiConnectorServicesProvider.java +++ b/src/main/java/health/ere/ps/service/connector/provider/MultiConnectorServicesProvider.java @@ -1,13 +1,10 @@ package health.ere.ps.service.connector.provider; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.inject.Inject; - import de.gematik.ws.conn.authsignatureservice.wsdl.v7.AuthSignatureServicePortType; import de.gematik.ws.conn.cardservice.wsdl.v8.CardServicePortType; import de.gematik.ws.conn.certificateservice.wsdl.v6.CertificateServicePortType; @@ -16,7 +13,11 @@ import de.gematik.ws.conn.signatureservice.wsdl.v7.SignatureServicePortTypeV740; import de.gematik.ws.conn.signatureservice.wsdl.v7.SignatureServicePortTypeV755; import de.gematik.ws.conn.vsds.vsdservice.v5.VSDServicePortType; +import health.ere.ps.config.SimpleUserConfig; import health.ere.ps.config.UserConfig; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.inject.Inject; @ApplicationScoped public class MultiConnectorServicesProvider { @@ -28,8 +29,7 @@ public class MultiConnectorServicesProvider { @Inject Event<Exception> eventException; - - Map<UserConfig,SingleConnectorServicesProvider> singleConnectorServicesProvider = new HashMap<>(); + Map<SimpleUserConfig, SingleConnectorServicesProvider> singleConnectorServicesProvider = Collections.synchronizedMap(new HashMap<SimpleUserConfig, SingleConnectorServicesProvider>()); public CardServicePortType getCardServicePortType(UserConfig userConfig) { CardServicePortType cardServicePortType = getSingleConnectorServicesProvider(userConfig).getCardServicePortType(); @@ -40,10 +40,11 @@ public AbstractConnectorServicesProvider getSingleConnectorServicesProvider(User if(userConfig == null) { return defaultConnectorServicesProvider; } else { - if(!singleConnectorServicesProvider.containsKey(userConfig)) { - singleConnectorServicesProvider.put(userConfig, new SingleConnectorServicesProvider(userConfig, eventException)); + SimpleUserConfig simpleUserConfig = new SimpleUserConfig(userConfig); + if(!singleConnectorServicesProvider.containsKey(simpleUserConfig)) { + singleConnectorServicesProvider.put(simpleUserConfig, new SingleConnectorServicesProvider(userConfig, eventException)); } - return singleConnectorServicesProvider.get(userConfig); + return singleConnectorServicesProvider.get(simpleUserConfig); } } @@ -90,6 +91,6 @@ public ContextType getContextType(UserConfig userConfig) { } public void clearAll() { - singleConnectorServicesProvider = new HashMap<>(); + singleConnectorServicesProvider = Collections.synchronizedMap(new HashMap<SimpleUserConfig, SingleConnectorServicesProvider>()); } } diff --git a/src/main/java/health/ere/ps/service/connector/provider/SingleConnectorServicesProvider.java b/src/main/java/health/ere/ps/service/connector/provider/SingleConnectorServicesProvider.java index 24f5c2891..bc318fb70 100644 --- a/src/main/java/health/ere/ps/service/connector/provider/SingleConnectorServicesProvider.java +++ b/src/main/java/health/ere/ps/service/connector/provider/SingleConnectorServicesProvider.java @@ -20,8 +20,8 @@ import java.util.logging.Logger; import java.util.regex.PatternSyntaxException; -import javax.enterprise.event.Event; -import javax.enterprise.inject.spi.CDI; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.inject.spi.CDI; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.X509KeyManager; diff --git a/src/main/java/health/ere/ps/service/erixa/ErixaAPIInterface.java b/src/main/java/health/ere/ps/service/erixa/ErixaAPIInterface.java index a428e2d2b..9812b2b92 100644 --- a/src/main/java/health/ere/ps/service/erixa/ErixaAPIInterface.java +++ b/src/main/java/health/ere/ps/service/erixa/ErixaAPIInterface.java @@ -4,9 +4,9 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.inject.Inject; import com.fasterxml.jackson.databind.ObjectMapper; @@ -51,7 +51,7 @@ public UserDetails getUserDetails() { public Object uploadToDrugstore(String json) { try { - log.info("Post: "+uploadToDrugstoreURL+" "+json); + log.fine("Post: "+uploadToDrugstoreURL+" "+json); HttpResponse response = httpClient.sendPostRequest(uploadToDrugstoreURL, json); if(response.getStatusLine().getStatusCode() != 200) { log.log(Level.WARNING, "Could not upload prescription to eRiXa: "+response.getStatusLine().getStatusCode()+" "+new String(response.getEntity().getContent().readAllBytes())); diff --git a/src/main/java/health/ere/ps/service/erixa/ErixaHttpClient.java b/src/main/java/health/ere/ps/service/erixa/ErixaHttpClient.java index 85081b96c..fd4a2a2e3 100644 --- a/src/main/java/health/ere/ps/service/erixa/ErixaHttpClient.java +++ b/src/main/java/health/ere/ps/service/erixa/ErixaHttpClient.java @@ -5,8 +5,8 @@ import java.nio.charset.StandardCharsets; import java.util.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpHeaders; diff --git a/src/main/java/health/ere/ps/service/erixa/ErixaUploadService.java b/src/main/java/health/ere/ps/service/erixa/ErixaUploadService.java index 12f39d220..5adf3118f 100644 --- a/src/main/java/health/ere/ps/service/erixa/ErixaUploadService.java +++ b/src/main/java/health/ere/ps/service/erixa/ErixaUploadService.java @@ -7,10 +7,10 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; import com.fasterxml.jackson.databind.ObjectMapper; @@ -25,7 +25,7 @@ import health.ere.ps.model.erixa.api.mapping.PrescriptionDoctorData; import health.ere.ps.model.erixa.api.mapping.Role; import health.ere.ps.model.erixa.api.mapping.UserDetails; -import health.ere.ps.websocket.ExceptionWithReplyToExcetion; +import health.ere.ps.websocket.ExceptionWithReplyToException; @ApplicationScoped public class ErixaUploadService { @@ -58,7 +58,7 @@ public void generatePrescriptionBundle(@ObservesAsync ErixaEvent erixaEvent) { uploadPrescriptionToDrugstore(event); } catch (IOException e) { log.log(Level.WARNING, "Problem during uploading to pharmacy", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, erixaEvent.getReplyTo(), erixaEvent.getReplyToMessageId())); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, erixaEvent.getReplyTo(), erixaEvent.getReplyToMessageId())); } } } diff --git a/src/main/java/health/ere/ps/service/extractor/SVGExtractor.java b/src/main/java/health/ere/ps/service/extractor/SVGExtractor.java index 7e249c459..319b2f7fe 100644 --- a/src/main/java/health/ere/ps/service/extractor/SVGExtractor.java +++ b/src/main/java/health/ere/ps/service/extractor/SVGExtractor.java @@ -10,10 +10,10 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; import javax.xml.namespace.QName; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; diff --git a/src/main/java/health/ere/ps/service/fhir/FHIRService.java b/src/main/java/health/ere/ps/service/fhir/FHIRService.java index 4e69585e0..873fb4317 100644 --- a/src/main/java/health/ere/ps/service/fhir/FHIRService.java +++ b/src/main/java/health/ere/ps/service/fhir/FHIRService.java @@ -4,11 +4,12 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; +import ca.uhn.fhir.context.FhirContext; import org.hl7.fhir.r4.model.Bundle; import health.ere.ps.config.UserConfig; @@ -35,6 +36,8 @@ public class FHIRService { @Inject Event<Exception> exceptionEvent; + private static final FhirContext fhirContext = FhirContext.forR4(); + public void generatePrescriptionBundle(@ObservesAsync Muster16PrescriptionFormEvent muster16PrescriptionFormEvent) { try { Muster16PrescriptionForm muster16PrescriptionForm = muster16PrescriptionFormEvent.getMuster16PrescriptionForm(); @@ -42,9 +45,13 @@ public void generatePrescriptionBundle(@ObservesAsync Muster16PrescriptionFormEv List<Bundle> bundles = bundleBuilder.createBundles(); bundleEvent.fireAsync(new BundlesEvent(bundles)); - } catch(Exception e) { + } catch (Exception e) { log.log(Level.SEVERE, "Could not create bundles", e); exceptionEvent.fireAsync(e); } } -} + + public static FhirContext getFhirContext() { + return fhirContext; + } +} \ No newline at end of file diff --git a/src/main/java/health/ere/ps/service/fhir/XmlPrescriptionProcessor.java b/src/main/java/health/ere/ps/service/fhir/XmlPrescriptionProcessor.java index d9fbbafb2..aefb2e34c 100644 --- a/src/main/java/health/ere/ps/service/fhir/XmlPrescriptionProcessor.java +++ b/src/main/java/health/ere/ps/service/fhir/XmlPrescriptionProcessor.java @@ -8,8 +8,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Response.Status; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response.Status; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Bundle.BundleEntryComponent; @@ -34,7 +34,7 @@ public class XmlPrescriptionProcessor { // Get <Bundle> tag including content private static final Pattern GET_BUNDLE = Pattern.compile("(<Bundle[^>]*>.*?</Bundle>)", Pattern.DOTALL); private static final Pattern GET_UUID = Pattern.compile("^urn:uuid:(.*)"); - private static final FhirContext fhirContext = FhirContext.forR4(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); public static Bundle[] parseFromString(String xml) { List<Bundle> bundles = new ArrayList<>(); diff --git a/src/main/java/health/ere/ps/service/fs/DirectoryWatcher.java b/src/main/java/health/ere/ps/service/fs/DirectoryWatcher.java deleted file mode 100644 index bf27c536e..000000000 --- a/src/main/java/health/ere/ps/service/fs/DirectoryWatcher.java +++ /dev/null @@ -1,139 +0,0 @@ -package health.ere.ps.service.fs; - -import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; - -import java.io.File; -import java.io.IOException; -import java.nio.file.ClosedWatchServiceException; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.WatchEvent; -import java.nio.file.WatchKey; -import java.nio.file.WatchService; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.inject.Inject; - -import health.ere.ps.config.AppConfig; -import org.apache.commons.lang3.StringUtils; -import org.apache.pdfbox.pdmodel.PDDocument; - -import health.ere.ps.event.PDDocumentEvent; -import io.quarkus.runtime.Startup; -import io.quarkus.scheduler.Scheduled; - -/** - * Watches a directory and if PDF files are placed their they will be thrown as - * a PDDocument event. - */ -@ApplicationScoped -@Startup -public class DirectoryWatcher { - - private static final Logger log = Logger.getLogger(DirectoryWatcher.class.getName()); - - private static final String PROCESSED_DIRECTORY_NAME = "processed"; - private static final String FAILED_DIRECTORY_NAME = "failed"; - private static final List<String> SUB_DIRECTORIES = List.of(PROCESSED_DIRECTORY_NAME, FAILED_DIRECTORY_NAME); - - @Inject - Event<PDDocumentEvent> pdDocumentEvent; - @Inject - AppConfig appConfig; - - String dir; - - private WatchService watcher = null; - private Path watchPath; - - @PostConstruct - public void init() { - dir = appConfig.getDirectoryWatcherDir(); - if (StringUtils.isEmpty(dir)) { - log.info("Not watching any directory"); - return; - } - log.info("Watching directory: " + dir); - - try { - watcher = FileSystems.getDefault().newWatchService(); - watchPath = Paths.get(dir); - File watchPathFile = watchPath.toFile(); - - if (!watchPathFile.exists()) { - log.info("Creating directory for watching pdf muster 16 forms: " + watchPathFile); - watchPathFile.mkdirs(); - } - - for (String subDirectory : SUB_DIRECTORIES) { - Path subDirectoryPath = Path.of(dir + File.separator + subDirectory); - if (Files.notExists(subDirectoryPath)) { - Files.createDirectory(subDirectoryPath); - } - } - - watchPath.register(watcher, ENTRY_CREATE); - } catch (IOException e) { - log.log(Level.SEVERE, "Could not start directory watcher", e); - } - } - - @Scheduled(every = "1s") - public void checkForFilesEverySecond() { - WatchKey key = null; - try { - key = watcher.poll(); - if (key == null) { - return; - } - } catch (ClosedWatchServiceException e) { - log.log(Level.SEVERE, "Could not start directory watcher", e); - } - - List<WatchEvent<?>> keys = key.pollEvents(); - for (WatchEvent<?> watchEvent : keys) { - WatchEvent.Kind<?> watchEventKind = watchEvent.kind(); - - if (watchEventKind == ENTRY_CREATE) { - Path filePath = ((Path) watchEvent.context()); - log.info("Processing file: " + filePath); - File pdfFile = new File(watchPath.toFile().getAbsolutePath() + File.separator + - filePath.getFileName()); - try { - pdDocumentEvent.fireAsync(new PDDocumentEvent(PDDocument.load(pdfFile))); - storePdfFile(filePath, true); - } catch (IOException e) { - log.log(Level.SEVERE, "Could not parse PDF", e); - storePdfFile(filePath, false); - } - } - key.reset(); - } - } - - private void storePdfFile(Path filePath, boolean wasParsingSuccessful) { - String newFilename = new SimpleDateFormat("yyyy-MM-dd_kk-mm-ss") - .format(new Date()) + "__" + filePath.getFileName(); - Path destinationFolder = Path.of(wasParsingSuccessful ? PROCESSED_DIRECTORY_NAME : FAILED_DIRECTORY_NAME); - - Path currentPath = Path.of(watchPath.toFile().getAbsolutePath() + File.separator + - filePath.getFileName()); - Path newPath = Path.of(watchPath.toFile().getAbsolutePath() + File.separator + - destinationFolder + File.separator + newFilename); - try { - Files.move(currentPath, newPath); - } catch (IOException e) { - log.severe("There was a problem when moving processed pdf file:" + filePath.getFileName()); - e.printStackTrace(); - } - } -} diff --git a/src/main/java/health/ere/ps/service/gematik/BearerTokenManageService.java b/src/main/java/health/ere/ps/service/gematik/BearerTokenManageService.java index c4182cd57..714710ff6 100644 --- a/src/main/java/health/ere/ps/service/gematik/BearerTokenManageService.java +++ b/src/main/java/health/ere/ps/service/gematik/BearerTokenManageService.java @@ -4,9 +4,6 @@ import java.util.Map; import java.util.logging.Logger; -import javax.inject.Inject; -import javax.websocket.Session; - import org.apache.commons.lang3.StringUtils; import org.jose4j.jwt.consumer.InvalidJwtException; import org.jose4j.jwt.consumer.JwtConsumer; @@ -14,6 +11,8 @@ import health.ere.ps.config.RuntimeConfig; import health.ere.ps.service.idp.BearerTokenService; +import jakarta.inject.Inject; +import jakarta.websocket.Session; public class BearerTokenManageService { @@ -50,20 +49,28 @@ public String getBearerToken() { } public String getBearerToken(RuntimeConfig runtimeConfig) { + if(runtimeConfig != null) { + int hashCode = runtimeConfig.hashCode(); + for(RuntimeConfig runtimeConfig2 : bearerToken.keySet()) { + if(runtimeConfig2 != null && runtimeConfig2.hashCode() == hashCode) { + runtimeConfig = runtimeConfig2; + } + } + } return bearerToken.get(runtimeConfig); } - + /** * Checks if the given bearer token is expired. * @param bearerToken2 the bearer token to check */ boolean isExpired(String bearerToken2) { JwtConsumer consumer = new JwtConsumerBuilder() - .setDisableRequireSignature() - .setSkipSignatureVerification() - .setSkipDefaultAudienceValidation() - .setRequireExpirationTime() - .build(); + .setDisableRequireSignature() + .setSkipSignatureVerification() + .setSkipDefaultAudienceValidation() + .setRequireExpirationTime() + .build(); try { consumer.process(bearerToken2); return false; diff --git a/src/main/java/health/ere/ps/service/gematik/ERezeptWorkflowService.java b/src/main/java/health/ere/ps/service/gematik/ERezeptWorkflowService.java index 8ae1a1ef1..50e98b8e5 100644 --- a/src/main/java/health/ere/ps/service/gematik/ERezeptWorkflowService.java +++ b/src/main/java/health/ere/ps/service/gematik/ERezeptWorkflowService.java @@ -19,20 +19,8 @@ import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; -import javax.websocket.Session; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.Entity; -import javax.ws.rs.core.Response; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; -import javax.xml.ws.Holder; import org.apache.xml.security.c14n.CanonicalizationException; import org.apache.xml.security.c14n.Canonicalizer; @@ -53,6 +41,7 @@ import de.gematik.ws.conn.connectorcontext.v2.ContextType; import de.gematik.ws.conn.eventservice.v7.GetCards; import de.gematik.ws.conn.eventservice.v7.GetCardsResponse; +import de.gematik.ws.conn.eventservice.wsdl.v7.EventServicePortType; import de.gematik.ws.conn.signatureservice.v7.DocumentType; import de.gematik.ws.conn.signatureservice.v7.SignRequest; import de.gematik.ws.conn.signatureservice.v7.SignRequest.OptionalInputs; @@ -82,8 +71,21 @@ import health.ere.ps.model.gematik.BundleWithAccessCodeOrThrowable; import health.ere.ps.service.connector.cards.ConnectorCardsService; import health.ere.ps.service.connector.provider.MultiConnectorServicesProvider; +import health.ere.ps.service.fhir.FHIRService; import health.ere.ps.vau.VAUEngine; -import health.ere.ps.websocket.ExceptionWithReplyToExcetion; +import health.ere.ps.websocket.ExceptionWithReplyToException; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; +import jakarta.websocket.Session; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.core.Response; +import jakarta.xml.ws.Holder; import oasis.names.tc.dss._1_0.core.schema.Base64Data; @ApplicationScoped @@ -94,7 +96,7 @@ public class ERezeptWorkflowService extends BearerTokenManageService { static final String EREZEPT_IDENTIFIER_SYSTEM = "https://gematik.de/fhir/NamingSystem/PrescriptionID"; static final String EREZEPT_IDENTIFIER_SYSTEM_GEM = "https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId"; private static final Logger log = Logger.getLogger(ERezeptWorkflowService.class.getName()); - private static final FhirContext fhirContext = FhirContext.forR4(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); static { org.apache.xml.security.Init.init(); @@ -177,10 +179,10 @@ public void onSignAndUploadBundlesEvent(@ObservesAsync SignAndUploadBundlesEvent List<List<Bundle>> listOfListOfBundles = signAndUploadBundlesEvent.listOfListOfBundles; log.info(String.format("Received %d bundles to sign ", listOfListOfBundles.size())); - log.info("Contents of list of bundles to sign are as follows:"); + log.fine("Contents of list of bundles to sign are as follows:"); listOfListOfBundles.forEach(bundlesList -> { - log.info("Bundles list contents is:"); - bundlesList.forEach(bundle -> log.info("Bundle content: " + bundle.toString())); + log.fine("Bundles list contents is:"); + bundlesList.forEach(bundle -> log.fine("Bundle content: " + bundle.toString())); }); List<List<BundleWithAccessCodeOrThrowable>> bundleWithAccessCodeOrThrowable = new ArrayList<>(); @@ -288,7 +290,7 @@ public List<BundleWithAccessCodeOrThrowable> createMultipleERezeptsOnPrescriptio BundleWithAccessCodeOrThrowable bundleWithAccessCode = bundleWithAccessCodes.get(i); try { Task task = tasks.get(i); - if(task != null) { + if(task != null && signedDocument.getSignatureObject() != null && signedDocument.getSignatureObject().getBase64Signature() != null) { byte[] signedBundle = signedDocument.getSignatureObject().getBase64Signature().getValue(); bundleWithAccessCode.setSignedBundle(signedBundle); updateERezeptTask(task, bundleWithAccessCode.getAccessCode(), @@ -392,18 +394,24 @@ public void updateERezeptTask(String taskId, String accessCode, byte[] signedByt .post(Entity.entity(fhirContext.newXmlParser().encodeResourceToString(parameters), "application/fhir+xml; charset=utf-8"))) { - String taskString = response.readEntity(String.class); - log.info("Response when trying to activate the task:" + taskString); + String taskString = new String(response.readEntity(java.io.InputStream.class).readAllBytes(), "ISO-8859-1"); + log.fine("Response when trying to activate the task: " + taskString); if (Response.Status.Family.familyOf(response.getStatus()) != Response.Status.Family.SUCCESSFUL) { if(firstTry) { log.warning("Was not able to $activate on first try. Status:" +response.getStatus()+" Response: " + taskString); updateERezeptTask(taskId, accessCode, signedBytes, false, runtimeConfig, replyTo, replyToMessageId); } else { - throw new WebApplicationException("Error on "+appConfig.getPrescriptionServiceURL()+" "+taskString, response.getStatus()); + Response.ResponseBuilder responseBuilder = Response.status(response.getStatus()); + responseBuilder.entity(taskString); + Response responseError = responseBuilder.build(); + throw new WebApplicationException(responseError); + } } - log.info("Task $activate Response: " + taskString); + log.fine("Task $activate Response: " + taskString); + } catch (IOException e) { + throw new RuntimeException(e); } } @@ -460,7 +468,8 @@ public SignResponse signBundleWithIdentifiers(Bundle bundle, boolean wait10secon public SignResponse signBundleWithIdentifiers(Bundle bundle, boolean wait10secondsAfterJobNumber, RuntimeConfig runtimeConfig, Session replyTo, String replyToMessageId) throws ERezeptWorkflowException { - return signBundleWithIdentifiers(Arrays.asList(bundle), wait10secondsAfterJobNumber, runtimeConfig, replyTo, replyToMessageId).get(0); + List<SignResponse> signResponses = signBundleWithIdentifiers(Arrays.asList(bundle), wait10secondsAfterJobNumber, runtimeConfig, replyTo, replyToMessageId); + return signResponses.get(0); } public List<SignResponse> signBundleWithIdentifiers(List<Bundle> bundles, boolean wait10secondsAfterJobNumber) @@ -490,7 +499,9 @@ public List<SignResponse> signBundleWithIdentifiers(List<Bundle> bundles, boolea List<SignResponse> signResponses = null; - readyToSignBundlesEvent.fireAsync(new ReadyToSignBundlesEvent(bundles, replyTo, replyToMessageId)); + if (runtimeConfig != null && runtimeConfig.isSendPreview()) { + readyToSignBundlesEvent.fireAsync(new ReadyToSignBundlesEvent(bundles, replyTo, replyToMessageId)); + } try { OptionalInputs optionalInputs = new OptionalInputs(); @@ -504,7 +515,7 @@ public List<SignResponse> signBundleWithIdentifiers(List<Bundle> bundles, boolea } catch (InvalidCanonicalizerException | XMLParserException | CanonicalizationException | IOException e) { log.log(Level.SEVERE, "Could not get canonical XML", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, replyTo, replyToMessageId)); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, replyTo, replyToMessageId)); return null; } SignRequest signRequest = new SignRequest(); @@ -550,8 +561,16 @@ public List<SignResponse> signBundleWithIdentifiers(List<Bundle> bundles, boolea List<de.gematik.ws.conn.signatureservice.v7_5_5.SignResponse> signResponsesV755; ContextType contextType = connectorServicesProvider.getContextType(runtimeConfig); - if(userIdForComfortSignature != null) { - contextType.setUserId(userIdForComfortSignature); + if(runtimeConfig != null && runtimeConfig.getUserId() != null && !"".equals(runtimeConfig.getUserId())) { + contextType.setUserId(runtimeConfig.getUserId()); + } else { + if(userIdForComfortSignature != null) { + contextType.setUserId(userIdForComfortSignature); + } + } + // if we don't have a user id, generate one + if(contextType.getUserId() == null || "".equals(contextType.getUserId())) { + contextType.setUserId(UUID.randomUUID().toString()); } if(appConfig.enableBatchSign()) { String jobNumber = connectorServicesProvider.getSignatureServicePortTypeV755(runtimeConfig).getJobNumber(connectorServicesProvider.getContextType(runtimeConfig)); @@ -570,7 +589,7 @@ public List<SignResponse> signBundleWithIdentifiers(List<Bundle> bundles, boolea jobNumber, Arrays.asList(signRequestV755)); return list.get(0); } catch (FaultMessage e) { - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, replyTo, replyToMessageId)); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, replyTo, replyToMessageId)); return null; } }).collect(Collectors.toList()); @@ -601,7 +620,7 @@ public List<SignResponse> signBundleWithIdentifiers(List<Bundle> bundles, boolea connectorServicesProvider.getContextType(runtimeConfig), (runtimeConfig != null && runtimeConfig.getTvMode() != null) ? runtimeConfig.getTvMode() : userConfig.getTvMode(), connectorServicesProvider.getSignatureServicePortType(runtimeConfig).getJobNumber(connectorServicesProvider.getContextType(runtimeConfig)), Arrays.asList(signRequest)); } catch (FaultMessage e) { - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, replyTo, replyToMessageId)); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, replyTo, replyToMessageId)); return null; } return list.get(0); @@ -715,7 +734,9 @@ public Task createERezeptTask(boolean firstTry, RuntimeConfig runtimeConfig, Str } if (Response.Status.Family.familyOf(response.getStatus()) != Response.Status.Family.SUCCESSFUL) { - throw new WebApplicationException("Error on "+appConfig.getPrescriptionServiceURL()+" "+taskString+" Status: "+response.getStatus(), response.getStatus()); + Response.ResponseBuilder responseBuilder = Response.status(response.getStatus()); + responseBuilder.entity(taskString); + throw new WebApplicationException(responseBuilder.build()); } log.info("Task Response: " + taskString); return fhirContext.newXmlParser().parseResource(Task.class, new StringReader(taskString)); @@ -740,7 +761,9 @@ public void abortERezeptTask(RuntimeConfig runtimeConfig, String taskId, String String taskString = response.readEntity(String.class); // if it is not successful if (Response.Status.Family.familyOf(response.getStatus()) != Response.Status.Family.SUCCESSFUL) { - throw new WebApplicationException("Error on "+appConfig.getPrescriptionServiceURL()+" "+taskString, response.getStatus()); + Response.ResponseBuilder responseBuilder = Response.status(response.getStatus()); + responseBuilder.entity(taskString); + throw new WebApplicationException(responseBuilder.build()); } log.info("Task $abort Response: " + taskString); @@ -775,7 +798,7 @@ public void onAbortTasksEvent(@ObservesAsync AbortTasksEvent abortTasksEvent) { */ public void onActivateComfortSignatureEvent(@ObservesAsync ActivateComfortSignatureEvent activateComfortSignatureEvent) { String userId = activateComfortSignature(activateComfortSignatureEvent.getRuntimeConfig(), activateComfortSignatureEvent.getReplyTo(), activateComfortSignatureEvent.getId()); - onGetSignatureModeEvent(new GetSignatureModeEvent(activateComfortSignatureEvent.getReplyTo(), activateComfortSignatureEvent.getId()), userId); + onGetSignatureModeEvent(new GetSignatureModeEvent(activateComfortSignatureEvent.getReplyTo(), activateComfortSignatureEvent.getId()), userId, true); } @@ -804,9 +827,9 @@ public String activateComfortSignature(RuntimeConfig runtimeConfig, Session repl signatureServiceCardHandle = getSignatureServiceCardHandle(runtimeConfig); connectorServicesProvider.getSignatureServicePortTypeV755(runtimeConfig).activateComfortSignature(signatureServiceCardHandle, contextType, status, signatureMode); - } catch (ConnectorCardsException | FaultMessage e) { + } catch (Exception e) { log.log(Level.WARNING, "Could not enable comfort signature", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, replyTo, replyToMessageId)); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, replyTo, replyToMessageId)); } return userIdForComfortSignature; } @@ -822,18 +845,28 @@ public void onGetSignatureModeEvent(@ObservesAsync GetSignatureModeEvent getSign onGetSignatureModeEvent(getSignatureModeEvent, null); } + public void onGetSignatureModeEvent(GetSignatureModeEvent getSignatureModeEvent, String userId) { + onGetSignatureModeEvent(getSignatureModeEvent, userId, false); + } + /** * Reacts to the event the GetSignatureMode Event */ - public void onGetSignatureModeEvent(GetSignatureModeEvent getSignatureModeEvent, String userId) { - GetSignatureModeResponseEvent getSignatureModeResponseEvent = getSignatureMode(getSignatureModeEvent.getRuntimeConfig(), getSignatureModeEvent.getReplyTo(), getSignatureModeEvent.getId()); - if(getSignatureModeResponseEvent != null) { - if(getSignatureModeEvent != null) { - getSignatureModeResponseEvent.setReplyTo(getSignatureModeEvent.getReplyTo()); - getSignatureModeResponseEvent.setReplyToMessageId(getSignatureModeEvent.getId()); + public void onGetSignatureModeEvent(GetSignatureModeEvent getSignatureModeEvent, String userId, boolean answertToActivateComfortSignature) { + try { + GetSignatureModeResponseEvent getSignatureModeResponseEvent = getSignatureMode(getSignatureModeEvent.getRuntimeConfig(), getSignatureModeEvent.getReplyTo(), getSignatureModeEvent.getId()); + if(getSignatureModeResponseEvent != null) { + if(getSignatureModeEvent != null) { + getSignatureModeResponseEvent.setReplyTo(getSignatureModeEvent.getReplyTo()); + getSignatureModeResponseEvent.setReplyToMessageId(getSignatureModeEvent.getId()); + } + getSignatureModeResponseEvent.setUserId(userId != null ? userId : (getSignatureModeEvent.getRuntimeConfig() != null ? getSignatureModeEvent.getRuntimeConfig().getUserId() : null)); + getSignatureModeResponseEvent.setAnswertToActivateComfortSignature(answertToActivateComfortSignature); + this.getSignatureModeResponseEvent.fireAsync(getSignatureModeResponseEvent); } - getSignatureModeResponseEvent.setUserId(userId); - this.getSignatureModeResponseEvent.fireAsync(getSignatureModeResponseEvent); + } catch (Exception e) { + log.log(Level.WARNING, "Could not GetSignatureModeEvent", e); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, getSignatureModeEvent.getReplyTo(), getSignatureModeEvent.getReplyToMessageId())); } } @@ -845,7 +878,7 @@ public GetSignatureModeResponseEvent getSignatureMode() { * */ public GetSignatureModeResponseEvent getSignatureMode(RuntimeConfig runtimeConfig, Session replyTo, String replyToMessageId) { - if(userIdForComfortSignature == null) { + if(userIdForComfortSignature == null && (runtimeConfig == null || (runtimeConfig.getUserId() == null || runtimeConfig.getUserId().isEmpty()))) { Status status = new Status(); status.setResult("OK"); ComfortSignatureStatusEnum comfortSignatureStatus = ComfortSignatureStatusEnum.DISABLED; @@ -854,7 +887,7 @@ public GetSignatureModeResponseEvent getSignatureMode(RuntimeConfig runtimeConfi return new GetSignatureModeResponseEvent(status, comfortSignatureStatus, 0, DatatypeFactory.newInstance().newDuration(0l), null); } catch (DatatypeConfigurationException e) { log.log(Level.WARNING, "Could not generate Duration", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, replyTo, replyToMessageId)); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, replyTo, replyToMessageId)); return null; } } @@ -868,13 +901,17 @@ public GetSignatureModeResponseEvent getSignatureMode(RuntimeConfig runtimeConfi try { signatureServiceCardHandle = getSignatureServiceCardHandle(runtimeConfig);; ContextType contextType = connectorServicesProvider.getContextType(runtimeConfig); - contextType.setUserId(userIdForComfortSignature); + if(runtimeConfig != null && runtimeConfig.getUserId() != null && !"".equals(runtimeConfig.getUserId())) { + contextType.setUserId(runtimeConfig.getUserId()); + } else { + contextType.setUserId(userIdForComfortSignature); + } connectorServicesProvider.getSignatureServicePortTypeV755(runtimeConfig).getSignatureMode(signatureServiceCardHandle, contextType, status, comfortSignatureStatus, comfortSignatureMax, comfortSignatureTimer, sessionInfo); return new GetSignatureModeResponseEvent(status.value, comfortSignatureStatus.value, comfortSignatureMax.value, comfortSignatureTimer.value, sessionInfo.value); } catch (ConnectorCardsException | FaultMessage e) { log.log(Level.WARNING, "Could not get signature signature", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, replyTo, replyToMessageId)); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, replyTo, replyToMessageId)); return null; } } @@ -903,13 +940,17 @@ public void deactivateComfortSignature(RuntimeConfig runtimeConfig, Session repl try { signatureServiceCardHandle = getSignatureServiceCardHandle(runtimeConfig); ContextType contextType = connectorServicesProvider.getContextType(runtimeConfig); - contextType.setUserId(userIdForComfortSignature); + if(runtimeConfig != null && runtimeConfig.getUserId() != null && !"".equals(runtimeConfig.getUserId())) { + contextType.setUserId(runtimeConfig.getUserId()); + } else { + contextType.setUserId(userIdForComfortSignature); + } connectorServicesProvider.getSignatureServicePortTypeV755(runtimeConfig).deactivateComfortSignature(Arrays.asList(signatureServiceCardHandle)); userIdForComfortSignature = null; } catch (ConnectorCardsException | FaultMessage e) { log.log(Level.WARNING, "Could not deactivate comfort signature", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, replyTo, replyToMessageId)); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, replyTo, replyToMessageId)); } } @@ -919,7 +960,7 @@ public void onGetCardsEvent(@ObservesAsync GetCardsEvent getCardsEvent) { getCardsResponseEvent.fireAsync(new GetCardsResponseEvent(getCardsResponse, getCardsEvent.getReplyTo(), getCardsEvent.getId())); } catch (Exception e) { log.log(Level.WARNING, "Could not get cards", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, getCardsEvent.getReplyTo(), getCardsEvent.getId())); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, getCardsEvent.getReplyTo(), getCardsEvent.getId())); } } @@ -933,7 +974,12 @@ public GetCardsResponse getCards()throws de.gematik.ws.conn.eventservice.wsdl.v7 public GetCardsResponse getCards(RuntimeConfig runtimeConfig) throws de.gematik.ws.conn.eventservice.wsdl.v7.FaultMessage { GetCards parameter = new GetCards(); parameter.setContext(connectorServicesProvider.getContextType(runtimeConfig)); - return connectorServicesProvider.getEventServicePortType(runtimeConfig).getCards(parameter); + EventServicePortType eventServicePortType = connectorServicesProvider.getEventServicePortType(runtimeConfig); // todo: if runtimeconfig without userid/hba/smcb: connectorBaseURL ignored ! request to http://ti-konnektor/eventservice + if(eventServicePortType == null) { + throw new RuntimeException("EventServicePortType is null. This normally means that the connector configuration is not correct."); + } else { + return eventServicePortType.getCards(parameter); + } } /** diff --git a/src/main/java/health/ere/ps/service/gematik/KIMFlowtype169Service.java b/src/main/java/health/ere/ps/service/gematik/KIMFlowtype169Service.java index aabb11921..08971bbd6 100644 --- a/src/main/java/health/ere/ps/service/gematik/KIMFlowtype169Service.java +++ b/src/main/java/health/ere/ps/service/gematik/KIMFlowtype169Service.java @@ -7,26 +7,12 @@ import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; -import javax.mail.Authenticator; -import javax.mail.Message; -import javax.mail.Multipart; -import javax.mail.PasswordAuthentication; -import javax.mail.Session; -import javax.mail.Transport; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeBodyPart; -import javax.mail.internet.MimeMessage; -import javax.mail.internet.MimeMultipart; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.SizeLimitExceededException; @@ -46,7 +32,22 @@ import health.ere.ps.model.gematik.BundleWithAccessCodeOrThrowable; import health.ere.ps.service.common.security.SSLSocketFactory; import health.ere.ps.service.common.security.SecretsManagerService; -import health.ere.ps.websocket.ExceptionWithReplyToExcetion; +import health.ere.ps.websocket.ExceptionWithReplyToException; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; +import jakarta.mail.Authenticator; +import jakarta.mail.Message; +import jakarta.mail.Multipart; +import jakarta.mail.PasswordAuthentication; +import jakarta.mail.Session; +import jakarta.mail.Transport; +import jakarta.mail.internet.InternetAddress; +import jakarta.mail.internet.MimeBodyPart; +import jakarta.mail.internet.MimeMessage; +import jakarta.mail.internet.MimeMultipart; @ApplicationScoped public class KIMFlowtype169Service { @@ -62,7 +63,8 @@ public class KIMFlowtype169Service { @Inject Event<Exception> exceptionEvent; - Pattern HOST_WITH_PORT = Pattern.compile("^(.*):([0-9]+)$"); + static Pattern HOST_WITH_PORT = Pattern.compile("^(.*):([0-9]+)$"); + static Pattern PROTOCOL_HOST_WITH_PORT = Pattern.compile("^(smtps?)://(.[^:]*)(:([0-9]+))?$"); @PostConstruct public void disableEndpointIdentification() { @@ -71,15 +73,7 @@ public void disableEndpointIdentification() { public void sendERezeptToKIMAddress(String fromKimAddress, String toKimAddress, String noteToPharmacy, String smtpHostServer, String smtpUser, String smtpPassword, String eRezeptToken) { try { - Properties props = new Properties(); - Matcher m = HOST_WITH_PORT.matcher(smtpHostServer); - if(m.matches()) { - props.put("mail.smtp.host", m.group(1)); - props.put("mail.smtp.port", m.group(2)); - } else { - props.put("mail.smtp.host", smtpHostServer); - } - props.put("mail.smtp.auth", true); + Properties props = createProperties(smtpHostServer); Session session = Session.getInstance(props, new Authenticator() { @Override @@ -90,6 +84,7 @@ protected PasswordAuthentication getPasswordAuthentication() { MimeMessage msg = new MimeMessage(session); //set message headers msg.addHeader("X-KIM-Dienstkennung", "eRezept;Zuweisung;V1.0"); + msg.addHeader("X-KIM-Encounter-Id", UUID.randomUUID().toString()); msg.setFrom(new InternetAddress(fromKimAddress)); @@ -121,6 +116,35 @@ protected PasswordAuthentication getPasswordAuthentication() { } } + static Properties createProperties(String smtpHostServer) { + Properties props = new Properties(); + Matcher m = HOST_WITH_PORT.matcher(smtpHostServer); + Matcher m2 = PROTOCOL_HOST_WITH_PORT.matcher(smtpHostServer); + if(m2.matches()) { + String protocol = m2.group(1); + props.put("mail.transport.protocol", protocol); + String host = m2.group(2); + String port = m2.group(4); + props.put("mail.smtp.host", host); + if(port != null && !("".equals(port))) { + props.put("mail.smtp.port", port); + } + if("smtps".equals(protocol)) { + props.put("mail.smtp.ssl.enable", "true"); + // props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + props.put("mail.smtp.ssl.trust", "*"); + props.put("mail.smtp.ssl.checkserveridentity", "false"); + } + } else if(m.matches()) { + props.put("mail.smtp.host", m.group(1)); + props.put("mail.smtp.port", m.group(2)); + } else { + props.put("mail.smtp.host", smtpHostServer); + } + props.put("mail.smtp.auth", true); + return props; + } + public List<Map<String,Object>> search(RuntimeConfig runtimeConfig, String searchDisplayName) { List<Map<String,Object>> list = new ArrayList<>(); if(searchDisplayName == null || searchDisplayName.length() < 3) { @@ -181,15 +205,20 @@ public void onBundlesWithAccessCodeEvent(@ObservesAsync BundlesWithAccessCodeEve try { if("169".equals(bundlesWithAccessCodeEvent.getFlowtype())) { Map<String,String> kimConfigMap = bundlesWithAccessCodeEvent.getKimConfigMap(); + if("true".equals(kimConfigMap.get("preventKIMMail"))) { + log.info("Please do not send a KIM E-Mail"); + return; + } for(List<BundleWithAccessCodeOrThrowable> list : bundlesWithAccessCodeEvent.getBundleWithAccessCodeOrThrowable()) { for(BundleWithAccessCodeOrThrowable bundle : list) { sendERezeptToKIMAddress(kimConfigMap.get("fromKimAddress"), bundlesWithAccessCodeEvent.getToKimAddress(), bundlesWithAccessCodeEvent.getNoteToPharmacy(), kimConfigMap.get("smtpHostServer"), getSmtpUser(kimConfigMap), kimConfigMap.get("smtpPassword"), getERezeptToken(bundle.getBundle(), bundle.getAccessCode())); } } } - } catch (Exception e) { - log.log(Level.WARNING, "Could not send kim E-Mail", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, bundlesWithAccessCodeEvent.getReplyTo(), bundlesWithAccessCodeEvent.getId())); + } catch (Throwable t) { + log.log(Level.WARNING, "Could not send kim E-Mail", t); + Exception e = (t instanceof Throwable ? new RuntimeException(t) : (Exception) t); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, bundlesWithAccessCodeEvent.getReplyTo(), bundlesWithAccessCodeEvent.getId())); } } @@ -200,7 +229,7 @@ public void onVZDSearchEvent(@ObservesAsync VZDSearchEvent vZDSearchEvent) { vZDSearchResultEvent.fireAsync(searchResultEvent); } catch (Exception e) { log.log(Level.WARNING, "Could not search VZD", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, vZDSearchEvent.getReplyTo(), vZDSearchEvent.getId())); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, vZDSearchEvent.getReplyTo(), vZDSearchEvent.getId())); } } diff --git a/src/main/java/health/ere/ps/service/gematik/PharmacyService.java b/src/main/java/health/ere/ps/service/gematik/PharmacyService.java index 0cdf5f5cb..4e846ea3d 100644 --- a/src/main/java/health/ere/ps/service/gematik/PharmacyService.java +++ b/src/main/java/health/ere/ps/service/gematik/PharmacyService.java @@ -1,17 +1,23 @@ package health.ere.ps.service.gematik; import java.util.Base64; +import java.util.logging.Level; import java.util.logging.Logger; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.client.Client; -import javax.ws.rs.core.Response; -import javax.xml.ws.Holder; - +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.core.Response; +import jakarta.xml.ws.Holder; + +import org.bouncycastle.cms.CMSProcessableByteArray; +import org.bouncycastle.cms.CMSSignedData; +import org.hl7.fhir.r4.model.Binary; import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Task; import ca.uhn.fhir.context.FhirContext; import de.gematik.ws.conn.cardservicecommon.v2.CardTypeType; @@ -25,6 +31,7 @@ import health.ere.ps.exception.common.security.SecretsManagerException; import health.ere.ps.service.connector.cards.ConnectorCardsService; import health.ere.ps.service.connector.provider.MultiConnectorServicesProvider; +import health.ere.ps.service.fhir.FHIRService; @ApplicationScoped public class PharmacyService extends BearerTokenManageService { @@ -41,7 +48,7 @@ public class PharmacyService extends BearerTokenManageService { @Inject ConnectorCardsService connectorCardsService; - private static final FhirContext fhirContext = FhirContext.forR4(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); Client client; @@ -96,5 +103,54 @@ public Bundle getEPrescriptionsForCardHandle(String egkHandle, String smcbHandle } } - + + public Bundle accept(String token, RuntimeConfig runtimeConfig) { + requestNewAccessTokenIfNecessary(runtimeConfig, null, null); + String secret = ""; + String prescriptionId = ""; + try (Response response = client.target(appConfig.getPrescriptionServiceURL()+token).request() + .header("User-Agent", appConfig.getUserAgent()) + .header("Authorization", "Bearer " + bearerToken.get(runtimeConfig)) + .post(Entity.entity("", "application/fhir+xml; charset=UTF-8"))) { + + String bundleString = response.readEntity(String.class); + + if (Response.Status.Family.familyOf(response.getStatus()) != Response.Status.Family.SUCCESSFUL) { + throw new WebApplicationException("Error on "+appConfig.getPrescriptionServiceURL()+" "+bundleString, response.getStatus()); + } + Bundle bundle = fhirContext.newXmlParser().parseResource(Bundle.class, bundleString); + Task task = (Task) bundle.getEntry().get(0).getResource(); + secret = task.getIdentifier().stream().filter(t -> "https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_Secret".equals(t.getSystem())).map(t -> t.getValue()).findAny().orElse(null); + Binary binary = (Binary) bundle.getEntry().get(1).getResource(); + byte[] pkcs7Data = binary.getData(); + CMSSignedData signedData = new CMSSignedData(pkcs7Data); + CMSProcessableByteArray signedContent = (CMSProcessableByteArray) signedData.getSignedContent(); + byte[] data = (byte[]) signedContent.getContent(); + + response.close(); + + prescriptionId = task.getIdentifier().stream().filter(t -> "https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId".equals(t.getSystem())).map(t -> t.getValue()).findAny().orElse(null); + + try (Response response2 = client.target(appConfig.getPrescriptionServiceURL()).path("/Task/"+prescriptionId+"/$reject") + .queryParam("secret", secret).request() + .header("User-Agent", appConfig.getUserAgent()) + .header("Authorization", "Bearer " + bearerToken.get(runtimeConfig)) + .post(Entity.entity("", "application/fhir+xml; charset=UTF-8"))) { + String rejectResponse = response2.readEntity(String.class); + if (Response.Status.Family.familyOf(response2.getStatus()) != Response.Status.Family.SUCCESSFUL) { + log.warning("Could not reject "+token+"prescriptionId: "+prescriptionId+" secret: "+secret+" "+rejectResponse); + } + response2.close(); + } + + // todo: print bundle to pdf if configured + + return fhirContext.newXmlParser().parseResource(Bundle.class, new String(data)); + } catch(Throwable t) { + log.log(Level.SEVERE, "Could not process "+token+"prescriptionId: "+prescriptionId+" secret: "+secret+" ", t); + return null; + } + + } + } diff --git a/src/main/java/health/ere/ps/service/gematik/PrefillPrescriptionService.java b/src/main/java/health/ere/ps/service/gematik/PrefillPrescriptionService.java index 23cebee2b..0ec8aec23 100644 --- a/src/main/java/health/ere/ps/service/gematik/PrefillPrescriptionService.java +++ b/src/main/java/health/ere/ps/service/gematik/PrefillPrescriptionService.java @@ -5,10 +5,13 @@ import java.io.InputStream; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; +import java.util.Optional; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; @@ -18,14 +21,7 @@ import java.util.stream.Stream; import java.util.zip.GZIPInputStream; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; import javax.naming.InvalidNameException; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.ws.Holder; import org.bouncycastle.asn1.ASN1ObjectIdentifier; import org.bouncycastle.asn1.x500.X500Name; @@ -33,6 +29,7 @@ import org.bouncycastle.asn1.x500.style.IETFUtils; import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder; import org.bouncycastle.crypto.CryptoException; +import org.eclipse.microprofile.config.inject.ConfigProperty; import org.hl7.fhir.r4.model.Address.AddressType; import org.hl7.fhir.r4.model.Annotation; import org.hl7.fhir.r4.model.BooleanType; @@ -60,6 +57,7 @@ import ca.uhn.fhir.model.api.TemporalPrecisionEnum; import de.gematik.ws.conn.cardservice.v8.CardInfoType; import de.gematik.ws.conn.cardservicecommon.v2.CardTypeType; +import de.gematik.ws.conn.certificateservice.v6.CryptType; import de.gematik.ws.conn.certificateservice.v6.ReadCardCertificate; import de.gematik.ws.conn.certificateservice.wsdl.v6.CertificateServicePortType; import de.gematik.ws.conn.certificateservicecommon.v2.CertRefEnum; @@ -80,7 +78,14 @@ import health.ere.ps.service.connector.provider.MultiConnectorServicesProvider; import health.ere.ps.service.idp.crypto.CryptoLoader; import health.ere.ps.service.kbv.KBVFHIRUtil; -import health.ere.ps.websocket.ExceptionWithReplyToExcetion; +import health.ere.ps.websocket.ExceptionWithReplyToException; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.ws.Holder; @ApplicationScoped public class PrefillPrescriptionService { @@ -109,7 +114,14 @@ public class PrefillPrescriptionService { @Inject Event<Exception> exceptionEvent; - public Bundle get(RuntimeConfig runtimeConfig) + public Bundle get(RuntimeConfig runtimeConfig) + throws FaultMessage, de.gematik.ws.conn.vsds.vsdservice.v5.FaultMessage, JAXBException, + de.gematik.ws.conn.certificateservice.wsdl.v6.FaultMessage, CryptoException, IOException, + InvalidNameException, CertificateEncodingException { + return get(runtimeConfig, null); + } + + public Bundle get(RuntimeConfig runtimeConfig, String egkHandleParameter) throws FaultMessage, de.gematik.ws.conn.vsds.vsdservice.v5.FaultMessage, JAXBException, de.gematik.ws.conn.certificateservice.wsdl.v6.FaultMessage, CryptoException, IOException, InvalidNameException, CertificateEncodingException { @@ -118,9 +130,9 @@ public Bundle get(RuntimeConfig runtimeConfig) EventServicePortType eventService = connectorServicesProvider.getEventServicePortType(runtimeConfig); - String egkHandle = getFirstCardOfType(eventService, CardTypeType.EGK, context); - String smcbHandle = getFirstCardOfType(eventService, CardTypeType.SMC_B, context); - String hbaHandle = getFirstCardOfType(eventService, CardTypeType.HBA, context); + String egkHandle = egkHandleParameter != null ? egkHandleParameter : getFirstCardOfType(eventService, CardTypeType.EGK, context); + String smcbHandle = (runtimeConfig != null && runtimeConfig.getSMCBHandle() != null) ? runtimeConfig.getSMCBHandle() : getFirstCardOfType(eventService, CardTypeType.SMC_B, context); + String hbaHandle = (runtimeConfig != null && runtimeConfig.getEHBAHandle() != null) ? runtimeConfig.getEHBAHandle() : getFirstCardOfType(eventService, CardTypeType.HBA, context); Patient patient = null; Coverage coverage = null; @@ -321,7 +333,10 @@ private X509Certificate getCertificateFor(String hbaHandle, CertificateServicePo Holder<Status> statusHolder = new Holder<>(); Holder<X509DataInfoListType> certHolder = new Holder<>(); - certificateService.readCardCertificate(hbaHandle, context, certRefList, statusHolder, certHolder); + if(context.getUserId() == null || context.getUserId().isEmpty()) { + context.setUserId(UUID.randomUUID().toString()); + } + certificateService.readCardCertificate(hbaHandle, context, certRefList, CryptType.ECC, statusHolder, certHolder); return CryptoLoader.getCertificateFromAsn1DERCertBytes( certHolder.value.getX509DataInfo().get(0).getX509Data().getX509Certificate()); @@ -447,11 +462,112 @@ private MedicationRequest createMedicationRequest(String medicationId, String pa public void onPrefillBundleEvent(@ObservesAsync PrefillBundleEvent prefillBundleEvent) { try { - bundleEvent.fireAsync(new BundlesEvent(Arrays.asList(get(prefillBundleEvent.getRuntimeConfig())))); + bundleEvent.fireAsync(new BundlesEvent(Arrays.asList(get(prefillBundleEvent.getRuntimeConfig(), prefillBundleEvent.getEgkHandle())))); } catch (Exception e) { log.log(Level.SEVERE, "Could not create bundles", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, prefillBundleEvent.getReplyTo(), + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, prefillBundleEvent.getReplyTo(), prefillBundleEvent.getId())); } } -} + + public Bundle getTestPrescriptionBundle(RuntimeConfig runtimeConfig) throws FaultMessage, de.gematik.ws.conn.certificateservice.wsdl.v6.FaultMessage, InvalidNameException, CertificateEncodingException, CryptoException, ParseException { + + ContextType context = connectorServicesProvider.getContextType(runtimeConfig); + EventServicePortType eventService = connectorServicesProvider.getEventServicePortType(runtimeConfig); + + String smcbHandle = (runtimeConfig.getSMCBHandle() != null) ? runtimeConfig.getSMCBHandle() : getFirstCardOfType(eventService, CardTypeType.SMC_B, context); + String hbaHandle = (runtimeConfig.getEHBAHandle() != null) ? runtimeConfig.getEHBAHandle() : getFirstCardOfType(eventService, CardTypeType.HBA, context); + + CertificateServicePortType certificateService = connectorServicesProvider.getCertificateServicePortType(runtimeConfig); + + Practitioner practitioner = null; + if (hbaHandle != null) { + practitioner = hbaHandle2Practitioner(hbaHandle, runtimeConfig, certificateService, context); + } else { + throw new RuntimeException("No HBA found"); + } + practitioner.getIdentifier().get(0).setValue("999999999"); + + Organization organization = null; + if (smcbHandle != null) { + organization = smcbHandle2Organization(smcbHandle, runtimeConfig, certificateService, context); + } else { + throw new RuntimeException("No SMC-B found"); + } + organization.getIdentifier().get(0).setValue("999999999"); + organization.getTelecom().get(0).setValue("0123456789"); + + Patient patient = new Patient(); + patient.setId(UUID.randomUUID().toString()) + .getMeta() + .addProfile("https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.1.0"); + Identifier identifier = patient.addIdentifier(); + CodeableConcept identifierCodeableConcept = identifier.getType(); + identifierCodeableConcept.addCoding() + .setSystem("http://fhir.de/CodeSystem/identifier-type-de-basis") + .setCode("GKV"); + identifier.setSystem("http://fhir.de/sid/gkv/kvid-10") + .setValue("T555558879"); + patient.addName() + .setUse(NameUse.OFFICIAL) + .addGiven("Max") + .setFamily("TK-Mustermann"); + patient.getName().get(0).getFamilyElement().addExtension("http://hl7.org/fhir/StructureDefinition/humanname-own-name", new StringType("TK-Mustermann")); + Date birthdate = new SimpleDateFormat("yyyyMMdd").parse("19950101"); + patient.setBirthDate(birthdate); + patient.addAddress() + .setType(AddressType.BOTH) + .setCountry("D") + .setCity("Hamburg") + .setPostalCode("22305") + .addLine("Bramfelder Str. 140"); + patient.getAddress().get(0).getLine().get(0).addExtension("http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber", new StringType("140")); + patient.getAddress().get(0).getLine().get(0).addExtension("http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", new StringType("Bramfelder Str.")); + + Coverage coverage = new Coverage(); + coverage.setId(UUID.randomUUID().toString()) + .getMeta() + .addProfile("https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.1.0"); + Coding besonderePersonengruppe = new Coding("https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE", "00", null); + Extension besonderePersonengruppeEx = new Extension("http://fhir.de/StructureDefinition/gkv/besondere-personengruppe", besonderePersonengruppe); + coverage.addExtension(besonderePersonengruppeEx); + Coding dmp = new Coding("https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP", "00", null); + Extension dmpEx = new Extension("http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen", dmp); + coverage.addExtension(dmpEx); + Coding versichertenart = new Coding("https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS", "1", null); + Extension versichertenartEx = new Extension("http://fhir.de/StructureDefinition/gkv/versichertenart", versichertenart); + coverage.addExtension(versichertenartEx); + coverage.setStatus(Coverage.CoverageStatus.fromCode("active")); + coverage.setType(new CodeableConcept().addCoding(new Coding("http://fhir.de/CodeSystem/versicherungsart-de-basis", "GKV", ""))); + coverage.getBeneficiary().setReference("Patient/" + patient.getId()); + coverage.addPayor() + .setDisplay("TK") + .getIdentifier() + .setSystem("http://fhir.de/sid/arge-ik/iknr") + .setValue("101575519"); + + Medication medication = new Medication(); + medication.setId(UUID.randomUUID().toString()) + .getMeta() + .addProfile("https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_FreeText|1.1.0"); + Coding medicationCategory = new Coding("https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category", "00",null); + Extension medicationCategoryEx = new Extension("https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category", medicationCategory); + medication.addExtension(medicationCategoryEx); + medication.addExtension(new Extension("https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine", new BooleanType(false))); + medication.getCode() + .setText("Test") + .addCoding() + .setSystem("https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Type").setCode("freitext"); + + MedicationRequest medicationRequest = createMedicationRequest( + medication.getIdElement().getIdPart(), + patient.getIdElement().getIdPart(), + practitioner.getIdElement().getIdPart(), + coverage.getIdElement().getIdPart() + ); + medicationRequest.getDosageInstruction().get(0).setText("Zu Testzwecken"); + + return KBVFHIRUtil.assembleBundle(practitioner, organization, patient, coverage, medication, + medicationRequest, null, null); + } +} \ No newline at end of file diff --git a/src/main/java/health/ere/ps/service/idp/BearerTokenService.java b/src/main/java/health/ere/ps/service/idp/BearerTokenService.java index ba1deb588..71d5f273b 100644 --- a/src/main/java/health/ere/ps/service/idp/BearerTokenService.java +++ b/src/main/java/health/ere/ps/service/idp/BearerTokenService.java @@ -1,24 +1,27 @@ package health.ere.ps.service.idp; -import java.security.cert.X509Certificate; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.inject.Inject; -import javax.websocket.Session; - import health.ere.ps.config.AppConfig; import health.ere.ps.config.RuntimeConfig; import health.ere.ps.model.idp.client.IdpTokenResult; +import health.ere.ps.retry.Retrier; import health.ere.ps.service.connector.cards.ConnectorCardsService; import health.ere.ps.service.connector.certificate.CardCertificateReaderService; import health.ere.ps.service.idp.client.IdpClient; import health.ere.ps.service.idp.client.IdpHttpClientService; -import health.ere.ps.websocket.ExceptionWithReplyToExcetion; +import health.ere.ps.websocket.ExceptionWithReplyToException; import io.quarkus.runtime.Startup; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.inject.Inject; +import jakarta.websocket.Session; + +import java.security.cert.X509Certificate; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static health.ere.ps.service.connector.cards.ConnectorCardsService.CardHandleType.SMC_B; @ApplicationScoped @Startup @@ -38,13 +41,29 @@ public class BearerTokenService { @PostConstruct - public void init() { + public void init() throws Exception { + Thread thread = new Thread(() -> { + List<Integer> retrySeconds = appConfig.getIdpInitializationRetriesSeconds(); + int retryPeriodMs = appConfig.getIdpInitializationPeriodMs(); + boolean initialized = Retrier.callAndRetry(retrySeconds, retryPeriodMs, this::initializeIdp, bool -> bool); + if (!initialized) { + String msg = String.format("Failed to init IDP client within %d seconds", retryPeriodMs / 1000); + throw new RuntimeException(msg); + } + }); + thread.setDaemon(true); + thread.start(); + } + + private Boolean initializeIdp() { String discoveryDocumentUrl = appConfig.getIdpBaseURL() + IdpHttpClientService.DISCOVERY_DOCUMENT_URI; try { idpClient.init(appConfig.getIdpClientId(), appConfig.getIdpAuthRequestRedirectURL(), discoveryDocumentUrl, true); idpClient.initializeClient(); + return true; } catch (Exception e) { - log.log(Level.WARNING, "Idp init did not work", e); + log.log(Level.WARNING, "IDP client initialization error: ", e); + return false; } } @@ -62,17 +81,20 @@ public String requestBearerToken(RuntimeConfig runtimeConfig) { public String requestBearerToken(RuntimeConfig runtimeConfig, Session replyTo, String replyToMessageId) { try { - String cardHandle = (runtimeConfig!= null && runtimeConfig.getSMCBHandle() != null) ? runtimeConfig.getSMCBHandle(): connectorCardsService.getConnectorCardHandle( - ConnectorCardsService.CardHandleType.SMC_B, runtimeConfig); + boolean smcbHandleValid = runtimeConfig != null && runtimeConfig.getSMCBHandle() != null; + String cardHandle = smcbHandleValid + ? runtimeConfig.getSMCBHandle() + : connectorCardsService.getConnectorCardHandle(SMC_B, runtimeConfig); - X509Certificate x509Certificate = - cardCertificateReaderService.retrieveSmcbCardCertificate(cardHandle, runtimeConfig); + X509Certificate x509Certificate = cardCertificateReaderService.retrieveSmcbCardCertificate( + cardHandle, runtimeConfig + ); IdpTokenResult idpTokenResult = idpClient.login(x509Certificate, runtimeConfig); return idpTokenResult.getAccessToken().getRawString(); } catch (Exception e) { log.log(Level.WARNING, "Idp login did not work, couldn't request bearer token", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, replyTo, replyToMessageId)); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, replyTo, replyToMessageId)); throw new RuntimeException(e); } } diff --git a/src/main/java/health/ere/ps/service/idp/client/AuthenticatorClient.java b/src/main/java/health/ere/ps/service/idp/client/AuthenticatorClient.java index a4d69278f..1de884c1f 100644 --- a/src/main/java/health/ere/ps/service/idp/client/AuthenticatorClient.java +++ b/src/main/java/health/ere/ps/service/idp/client/AuthenticatorClient.java @@ -20,25 +20,26 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.logging.Logger; import java.util.stream.Collectors; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; -import javax.enterprise.context.ApplicationScoped; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonString; -import javax.ws.rs.core.Response; - -import com.diffplug.common.base.Errors; -import com.diffplug.common.base.Throwing; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonString; +import jakarta.ws.rs.core.Response; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.microprofile.rest.client.RestClientBuilder; import org.jose4j.jwt.JwtClaims; +import com.diffplug.common.base.Errors; +import com.diffplug.common.base.Throwing; + import health.ere.ps.exception.idp.IdpClientException; import health.ere.ps.exception.idp.IdpException; import health.ere.ps.exception.idp.IdpJoseException; @@ -57,10 +58,18 @@ import health.ere.ps.model.idp.client.token.JsonWebToken; import health.ere.ps.model.idp.client.token.TokenClaimExtraction; import health.ere.ps.service.idp.client.authentication.UriUtils; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.JsonString; +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.Response; @ApplicationScoped public class AuthenticatorClient { + private static Logger log = Logger.getLogger(AuthenticatorClient.class.getName()); + public AuthenticatorClient() { } @@ -115,20 +124,24 @@ public health.ere.ps.model.idp.client.AuthenticationResponse performAuthenticati IdpHttpClientService idpHttpClientService = getIdpHttpClientInstanceByUrl(authenticationRequest.getAuthenticationEndpointUrl()); - String location; + String rawString = authenticationRequest.getSignedChallenge().getRawString(); + log.fine("rawString: " + rawString); try (Response response = idpHttpClientService.doAuthenticationRequest( - authenticationRequest.getSignedChallenge().getRawString())) { + rawString)) { + checkResponseForErrorsAndThrowIfAny(response); location = retrieveLocationFromResponse(response); - } - return AuthenticationResponse.builder() + return AuthenticationResponse.builder() .code(extractParameterValue(location, "code")) .location(location) /*.ssoToken(extractParameterValue(location, "ssotoken"))*/ .build(); + } catch(WebApplicationException ex) { + throw new IdpClientException("Unexpected Server-Response: " + ex.getResponse().getStatus() + " " + ex.getResponse().readEntity(String.class)); + } } private void checkResponseForErrorsAndThrowIfAny(final Response loginResponse) @@ -338,6 +351,7 @@ public IdpHttpClientService getIdpHttpClientInstanceByUrl(String url) try { idpHttpClientService = RestClientBuilder.newBuilder() .baseUrl(new URL(url)) + .connectTimeout(5000, java.util.concurrent.TimeUnit.MILLISECONDS) .build(IdpHttpClientService.class); } catch (MalformedURLException e) { throw new IdpClientException("Bad URL: " + url, e); diff --git a/src/main/java/health/ere/ps/service/idp/client/IdpClient.java b/src/main/java/health/ere/ps/service/idp/client/IdpClient.java index 5d19aa1fa..d4f47e2ce 100644 --- a/src/main/java/health/ere/ps/service/idp/client/IdpClient.java +++ b/src/main/java/health/ere/ps/service/idp/client/IdpClient.java @@ -11,8 +11,8 @@ import java.util.Set; import java.util.function.Function; -import javax.enterprise.context.Dependent; -import javax.inject.Inject; +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Inject; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; diff --git a/src/main/java/health/ere/ps/service/idp/client/IdpHttpClientService.java b/src/main/java/health/ere/ps/service/idp/client/IdpHttpClientService.java index e60ee9609..954a48426 100644 --- a/src/main/java/health/ere/ps/service/idp/client/IdpHttpClientService.java +++ b/src/main/java/health/ere/ps/service/idp/client/IdpHttpClientService.java @@ -1,15 +1,15 @@ package health.ere.ps.service.idp.client; -import javax.enterprise.context.Dependent; -import javax.ws.rs.Consumes; -import javax.ws.rs.FormParam; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.enterprise.context.Dependent; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.FormParam; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.HttpHeaders; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; import org.eclipse.microprofile.rest.client.annotation.ClientHeaderParam; import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; @@ -18,7 +18,9 @@ @RegisterRestClient public interface IdpHttpClientService { String DISCOVERY_DOCUMENT_URI = "/.well-known/openid-configuration"; - String USER_AGENT = "IdP-Client"; + + + String USER_AGENT = "ere.health/1.0.0 IncentergyGmbH/GEMIncenereS2QmFN83P"; //todo: hardcoded PU !? @GET @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/health/ere/ps/service/ipp/PrinterService.java b/src/main/java/health/ere/ps/service/ipp/PrinterService.java deleted file mode 100644 index 69e3e7425..000000000 --- a/src/main/java/health/ere/ps/service/ipp/PrinterService.java +++ /dev/null @@ -1,83 +0,0 @@ -package health.ere.ps.service.ipp; - - -import javax.enterprise.context.Dependent; -import javax.enterprise.event.Event; -import javax.inject.Inject; - -import com.hp.jipp.encoding.AttributeGroup; -import com.hp.jipp.encoding.IppPacket; -import com.hp.jipp.encoding.Tag; -import com.hp.jipp.model.Operation; -import com.hp.jipp.model.Status; -import com.hp.jipp.trans.IppPacketData; -import health.ere.ps.event.PDDocumentEvent; -import health.ere.ps.model.ipp.DefaultAttributes; -import health.ere.ps.model.ipp.IppPrinter; -import org.apache.pdfbox.pdmodel.PDDocument; - -import java.io.IOException; -import java.net.URI; - -@Dependent -public class PrinterService { - - @Inject - Event<PDDocumentEvent> pdDocumentEvent; - - @Inject - IppPrinter printer; - - public IppPacket buildPrinterAttributesOperationPacket(URI uri, IppPacketData requestPacketData) { - - IppPacket requestPacket = requestPacketData.getPacket(); - - return new IppPacket( - DefaultAttributes.VERSION_NUMBER, - Status.successfulOk.getCode(), - requestPacket.getRequestId(), - AttributeGroup.groupOf(Tag.operationAttributes, printer.getOperationAttributes()), - AttributeGroup.groupOf(Tag.printerAttributes, printer.getPrinterAttributes(uri)) - ); - } - - public IppPacket buildPrintJobOperationPacket(URI uri, IppPacketData data) throws IOException { - - IppPacket requestPacket = data.getPacket(); - // TODO: check for mime type, for the moment, expect PDF - pdDocumentEvent.fireAsync(new PDDocumentEvent(PDDocument.load(data.getData()))); - - return new IppPacket( - DefaultAttributes.VERSION_NUMBER, - Status.successfulOk.getCode(), - requestPacket.getRequestId(), - AttributeGroup.groupOf(Tag.jobAttributes, printer.getJobAttributes(uri)), - AttributeGroup.groupOf(Tag.operationAttributes, printer.getOperationAttributes()) - ); - } - - IppPacket buildDefaultPacket(IppPacketData data) { - - IppPacket ippPacket = data.getPacket(); - - return new IppPacket( - DefaultAttributes.VERSION_NUMBER, - Status.successfulOk.getCode(), - ippPacket.getRequestId(), - AttributeGroup.groupOf(Tag.operationAttributes), - AttributeGroup.groupOf(Tag.printerAttributes) - ); - } - - public IppPacketData handleIppPacketData(URI uri, IppPacketData data) throws IOException { - - IppPacket responsePacket; - if (data.getPacket().getOperation().equals(Operation.getPrinterAttributes)) - responsePacket = buildPrinterAttributesOperationPacket(uri, data); - else if (data.getPacket().getOperation().equals(Operation.printJob)) - responsePacket = buildPrintJobOperationPacket(uri, data); - else - responsePacket = buildDefaultPacket(data); - return new IppPacketData(responsePacket, data.getData()); - } -} \ No newline at end of file diff --git a/src/main/java/health/ere/ps/service/kbv/GenerateKBVCertificationBundlesService.java b/src/main/java/health/ere/ps/service/kbv/GenerateKBVCertificationBundlesService.java index 3555a6c74..6ccef832d 100644 --- a/src/main/java/health/ere/ps/service/kbv/GenerateKBVCertificationBundlesService.java +++ b/src/main/java/health/ere/ps/service/kbv/GenerateKBVCertificationBundlesService.java @@ -20,10 +20,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.enterprise.context.ApplicationScoped; -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import health.ere.ps.service.fhir.FHIRService; import org.hl7.fhir.r4.model.Annotation; import org.hl7.fhir.r4.model.BooleanType; import org.hl7.fhir.r4.model.Bundle; @@ -59,7 +60,7 @@ public class GenerateKBVCertificationBundlesService { private static Logger log = Logger.getLogger(GenerateKBVCertificationBundlesService.class.getName()); - private final FhirContext fhirContext = FhirContext.forR4(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); static JAXBContext jaxbContext; @@ -517,7 +518,7 @@ private MedicationRequest createMedicationRequest(String medicationId, String pa // </extension> medicationRequest.addExtension(multiplePrescription); - // <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Accident"> + // <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Accident"> // <extension url="unfallkennzeichen"> // <valueCoding> // <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Ursache_Type" /> @@ -530,14 +531,14 @@ private MedicationRequest createMedicationRequest(String medicationId, String pa // </extension> if(unfallkennzeichen) { - Extension KBV_EX_ERP_Accident = new Extension("https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Accident"); + Extension KBV_EX_FOR_Accident = new Extension("https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Accident"); Coding unfallkennzeichenValueCoding = new Coding("https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Ursache_Type", "1", null); - KBV_EX_ERP_Accident.addExtension(new Extension("unfallkennzeichen", unfallkennzeichenValueCoding)); + KBV_EX_FOR_Accident.addExtension(new Extension("unfallkennzeichen", unfallkennzeichenValueCoding)); DateType unfalltagDate = new DateType(new Date()); unfalltagDate.setPrecision(TemporalPrecisionEnum.DAY); - KBV_EX_ERP_Accident.addExtension(new Extension("unfalltag", unfalltagDate)); - medicationRequest.addExtension(KBV_EX_ERP_Accident); + KBV_EX_FOR_Accident.addExtension(new Extension("unfalltag", unfalltagDate)); + medicationRequest.addExtension(KBV_EX_FOR_Accident); } medicationRequest.setStatus(MedicationRequest.MedicationRequestStatus.ACTIVE) diff --git a/src/main/java/health/ere/ps/service/kbv/KBVFHIRUtil.java b/src/main/java/health/ere/ps/service/kbv/KBVFHIRUtil.java index 0b030c5df..e6f966ad5 100644 --- a/src/main/java/health/ere/ps/service/kbv/KBVFHIRUtil.java +++ b/src/main/java/health/ere/ps/service/kbv/KBVFHIRUtil.java @@ -289,7 +289,7 @@ public static Composition createComposition(String medicationRequestId, String p composition.getMeta().addProfile( "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.1.0"); - Coding valueCoding = new Coding("https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN", asvAusuebungRoleId != null ? "01" : "00", null); + Coding valueCoding = new Coding("https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN", asvAusuebungRoleId != null ? "01" : "00", null); //todo add 04 Entlassmanagement, 07 TSS Kennzeichen, 10 nur Ersatzverordnungskennzeichen, 11 ASV+Ersatzverordnung, 14 Entlass+Ersatz, 17 TSS+Ersatz Extension legalBasis = new Extension("https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis", valueCoding); composition.addExtension(legalBasis); diff --git a/src/main/java/health/ere/ps/service/kbv/XSLTService.java b/src/main/java/health/ere/ps/service/kbv/XSLTService.java index 45588d1ef..2ffb7fc96 100644 --- a/src/main/java/health/ere/ps/service/kbv/XSLTService.java +++ b/src/main/java/health/ere/ps/service/kbv/XSLTService.java @@ -10,11 +10,11 @@ import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; import javax.xml.XMLConstants; import javax.xml.transform.ErrorListener; import javax.xml.transform.Result; @@ -31,14 +31,15 @@ import ca.uhn.fhir.context.FhirContext; import health.ere.ps.event.HTMLBundlesEvent; import health.ere.ps.event.ReadyToSignBundlesEvent; -import health.ere.ps.websocket.ExceptionWithReplyToExcetion; +import health.ere.ps.service.fhir.FHIRService; +import health.ere.ps.websocket.ExceptionWithReplyToException; @ApplicationScoped public class XSLTService { private static Logger log = Logger.getLogger(XSLTService.class.getName()); - private final FhirContext fhirContext = FhirContext.forR4(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); @Inject Event<Exception> exceptionEvent; @@ -94,6 +95,10 @@ public void error(TransformerException exception) { public String generateHtmlForBundle(Bundle bundle) throws IOException, TransformerException { String xmlString = fhirContext.newXmlParser().encodeResourceToString(bundle); + return generateHtmlForString(xmlString); + } + + public String generateHtmlForString(String xmlString) throws IOException, TransformerException { File xml = Files.createTempFile("bundle-", ".xml").toFile(); Files.write(xml.toPath(), xmlString.getBytes(StandardCharsets.UTF_8)); @@ -126,13 +131,13 @@ public void onReadyToSignBundlesEvent(@ObservesAsync ReadyToSignBundlesEvent rea try { return generateHtmlForBundle(bundle); } catch (Exception e) { - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, readyToSignBundlesEvent.getReplyTo(), readyToSignBundlesEvent.getReplyToMessageId())); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, readyToSignBundlesEvent.getReplyTo(), readyToSignBundlesEvent.getReplyToMessageId())); return ""; } }).collect(Collectors.toList()); hTMLBundlesEvent.fireAsync(new HTMLBundlesEvent(htmlBundlesList, readyToSignBundlesEvent.getReplyTo(), readyToSignBundlesEvent.getReplyToMessageId())); } catch(Exception ex) { - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(ex, readyToSignBundlesEvent.getReplyTo(), readyToSignBundlesEvent.getReplyToMessageId())); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(ex, readyToSignBundlesEvent.getReplyTo(), readyToSignBundlesEvent.getReplyToMessageId())); } } } diff --git a/src/main/java/health/ere/ps/service/logging/EreLogger.java b/src/main/java/health/ere/ps/service/logging/EreLogger.java index b03d6400e..a2b2ea945 100644 --- a/src/main/java/health/ere/ps/service/logging/EreLogger.java +++ b/src/main/java/health/ere/ps/service/logging/EreLogger.java @@ -10,8 +10,8 @@ import java.util.List; import java.util.stream.Collectors; -import javax.enterprise.event.Event; -import javax.enterprise.inject.spi.CDI; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.inject.spi.CDI; import health.ere.ps.event.EreLogNotificationEvent; import health.ere.ps.service.common.util.BundleJsonInfoExtractor; diff --git a/src/main/java/health/ere/ps/service/muster16/Muster16FormDataExtractorService.java b/src/main/java/health/ere/ps/service/muster16/Muster16FormDataExtractorService.java deleted file mode 100644 index 6de5b2668..000000000 --- a/src/main/java/health/ere/ps/service/muster16/Muster16FormDataExtractorService.java +++ /dev/null @@ -1,72 +0,0 @@ -package health.ere.ps.service.muster16; - - -import health.ere.ps.event.Muster16PrescriptionFormEvent; -import health.ere.ps.event.SVGExtractorResultEvent; -import health.ere.ps.model.muster16.Muster16PrescriptionForm; -import health.ere.ps.service.muster16.parser.IMuster16FormParser; -import health.ere.ps.service.muster16.parser.rgxer.Muster16SvgRegexParser; - -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; -import java.util.logging.Level; -import java.util.logging.Logger; - -@ApplicationScoped -public class Muster16FormDataExtractorService { - - private static final Logger log = Logger.getLogger(Muster16FormDataExtractorService.class.getName()); - - @Inject - Event<Exception> exceptionEvent; - - @Inject - Event<Muster16PrescriptionFormEvent> muster16PrescriptionFormEvent; - - - public void extractDataWithSvgExtractorParser(@ObservesAsync SVGExtractorResultEvent sVGExtractorResultEvent) { - try { - Muster16SvgRegexParser parser = new Muster16SvgRegexParser(sVGExtractorResultEvent.getSvgExtractionResult()); - Muster16PrescriptionForm muster16Form = fillForm(parser); - - muster16PrescriptionFormEvent.fireAsync(new Muster16PrescriptionFormEvent(muster16Form)); - } catch (Exception e) { - log.log(Level.SEVERE, "Could not parse results", e); - exceptionEvent.fireAsync(e); - } - } - - public static Muster16PrescriptionForm fillForm(IMuster16FormParser parser) { - return new Muster16PrescriptionForm( - parser.parseInsuranceCompany(), - parser.parseInsuranceCompanyId(), - parser.parsePatientNamePrefix(), - parser.parsePatientFirstName(), - parser.parsePatientLastName(), - parser.parsePatientStreetName(), - parser.parsePatientStreetNumber(), - parser.parsePatientCity(), - parser.parsePatientZipCode(), - parser.parsePatientInsuranceId(), - parser.parsePatientDateOfBirth(), - parser.parsePatientStatus(), - parser.parseClinicId(), - parser.parseDoctorId(), - parser.parsePrescriptionDate(), - parser.parsePractitionerFirstName(), - parser.parsePractitionerLastName(), - parser.parsePractitionerStreetName(), - parser.parsePractitionerStreetNumber(), - parser.parsePractitionerCity(), - parser.parsePractitionerZipCode(), - parser.parsePractitionerNamePrefix(), - parser.parsePractitionerPhoneNumber(), - parser.parsePractitionerFaxNumber(), - parser.parsePractitionerQualification(), - parser.parseIsWithPayment(), - parser.parsePrescriptionList() - ); - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/IMuster16FormParser.java b/src/main/java/health/ere/ps/service/muster16/parser/IMuster16FormParser.java deleted file mode 100644 index d3333e3c7..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/IMuster16FormParser.java +++ /dev/null @@ -1,48 +0,0 @@ -package health.ere.ps.service.muster16.parser; - -import health.ere.ps.model.muster16.MedicationString; - -import java.util.List; - -public interface IMuster16FormParser { - String parseInsuranceCompany(); - String parseInsuranceCompanyId(); - List<String> parsePatientNamePrefix(); - String parsePatientFirstName(); - String parsePatientLastName(); - String parsePatientStreetName(); - String parsePatientStreetNumber(); - String parsePatientCity(); - String parsePatientZipCode(); - String parsePatientDateOfBirth(); - String parsePatientStatus(); - String parseClinicId(); - String parseDoctorId() ; - String parsePrescriptionDate(); - List<MedicationString> parsePrescriptionList(); - String parsePatientInsuranceId(); - Boolean parseIsWithPayment(); - String parsePractitionerFirstName(); - String parsePractitionerLastName(); - String parsePractitionerNamePrefix(); - String parsePractitionerStreetName(); - String parsePractitionerStreetNumber(); - String parsePractitionerCity(); - String parsePractitionerZipCode(); - String parsePractitionerPhoneNumber(); - String parsePractitionerFaxNumber(); - - default boolean isDataFieldPresentAtPosition(String[] muster16PdfDataFields, - int fieldPosition) { - return muster16PdfDataFields != null && fieldPosition >= 0 && muster16PdfDataFields.length > fieldPosition; - } - - default String getDataFieldAtPosOrDefault(String[] muster16PdfDataFields, - int fieldPosition, String defaultValue) { - return isDataFieldPresentAtPosition(muster16PdfDataFields, fieldPosition)? - muster16PdfDataFields[fieldPosition] : defaultValue; - } - String parsePractitionerQualification(); - - -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/Muster16SvgExtractorParser.java b/src/main/java/health/ere/ps/service/muster16/parser/Muster16SvgExtractorParser.java deleted file mode 100644 index f616e99c2..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/Muster16SvgExtractorParser.java +++ /dev/null @@ -1,295 +0,0 @@ -package health.ere.ps.service.muster16.parser; - -import health.ere.ps.model.muster16.MedicationString; -import org.apache.commons.lang3.StringUtils; - -import java.util.*; -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -/** - * @Deprecated Use Muster16SvgRegexParser instead - * Has been replaced by the more efficient Muster16SvgRegexParser but is still up-to-date so far - */ -@Deprecated -public class Muster16SvgExtractorParser implements IMuster16FormParser { - - private static final Logger log = Logger.getLogger(Muster16SvgExtractorParser.class.getName()); - - private static final Pattern ONLY_NUMBERS = Pattern.compile(".*?(\\d+).*?", Pattern.DOTALL); - private static final Pattern PZN_MATCH = Pattern.compile("PZN(\\d+)"); - private static final Pattern MEDICATION_LINE = Pattern.compile("(.*)(N\\d)(.*)(PZN ?)(\\d+)"); - private final Map<String, String> mappedFields; - private final String[] patientNameAndAddressInfo; - private final String[] practitionerNameAndAddressInfo; - private List<String> prescriptionInfo; - - public Muster16SvgExtractorParser(Map<String, String> mappedFields) { - this.mappedFields = mappedFields; - - patientNameAndAddressInfo = getMappedFields().getOrDefault( - "nameAndAddress", "").split("\\n"); - - practitionerNameAndAddressInfo = getMappedFields().getOrDefault("practitionerText", "") - .split("\\n"); - - prescriptionInfo = Arrays.stream(getMappedFields().getOrDefault( - "medication", "").split("\\n")) - .filter(s -> !s.contains("- - - -")) - .filter(s -> !s.contains("********")) - .collect(Collectors.toList()); - mergePZNWithNameLine(); - } - - private List<String> merge(final List<String> list, final int index) { - if (list.isEmpty()) { - return list; - } else if (index < 0) { - return list; - } else if (index + 1 >= list.size()) { - return list; - } else { - final List<String> result = new ArrayList<>(list); - result.set(index, list.get(index) + " " + list.get(index + 1)); - result.remove(index + 1); - return result; - } - } - - private void mergePZNWithNameLine() { - List<Integer> linesToMerge = new ArrayList<>(); - for (int i = 0; i < prescriptionInfo.size(); i++) { - Matcher m = PZN_MATCH.matcher(prescriptionInfo.get(i)); - if (m.matches()) { - linesToMerge.add(i - 1); - } - } - for (int i : linesToMerge) { - prescriptionInfo = merge(prescriptionInfo, i); - } - } - - private MedicationString parseMedication(String name) { - String dosage = null, pzn = null; - Matcher m = MEDICATION_LINE.matcher(name); - if (m.matches()) { - name = m.group(1); - dosage = m.group(3); - pzn = m.group(5); - } - - return new MedicationString(name, null, null, dosage, null, pzn); - } - - @Override - public String parseInsuranceCompany() { - return getMappedFields().getOrDefault("insurance", ""); - } - - @Override - public String parseInsuranceCompanyId() { - String payorId = getMappedFields().getOrDefault("payor", ""); - Matcher m = ONLY_NUMBERS.matcher(payorId); - if (m.matches()) { - payorId = m.group(1); - } - return payorId; - } - - @Override - public List<String> parsePatientNamePrefix() { - String firstName = getDataFieldAtPosOrDefault(patientNameAndAddressInfo, 1, "").trim(); - if (firstName.contains(".")) { - return List.of(firstName.split(" ")[0]); - } - return Collections.emptyList(); - } - - @Override - public String parsePatientFirstName() { - String firstName = getDataFieldAtPosOrDefault(patientNameAndAddressInfo, 1, "").trim(); - if (firstName.contains(".")) { - return firstName.split("\\.")[1].trim(); - } else { - return firstName; - } - } - - @Override - public String parsePatientLastName() { - return getDataFieldAtPosOrDefault(patientNameAndAddressInfo, 0, "").trim(); - } - - @Override - public String parsePatientStreetName() { - String[] streetName = getDataFieldAtPosOrDefault(patientNameAndAddressInfo, - 2, "").split("\\d+"); - return getDataFieldAtPosOrDefault(streetName, 0, "").trim(); - } - - @Override - public String parsePatientStreetNumber() { - String[] streetNumber = getDataFieldAtPosOrDefault(patientNameAndAddressInfo, - 2, "").split("[a-zA-Z]+"); - return getDataFieldAtPosOrDefault(streetNumber, streetNumber.length - 1, "") - .replace(".", "").trim(); - } - - @Override - public String parsePatientCity() { - String[] cityData = getDataFieldAtPosOrDefault(patientNameAndAddressInfo, - 3, "").split("\\d+"); - String extractedCityField = - Arrays.stream(cityData).map(String::trim) - .collect(Collectors.toList()).get(1); - return StringUtils.defaultString(extractedCityField).trim(); - } - - @Override - public String parsePatientZipCode() { - String[] zipCodeData = getDataFieldAtPosOrDefault(patientNameAndAddressInfo, - 3, "").split("[a-zA-Z]+"); - String extractedZipCodeField = - Arrays.stream(zipCodeData).map(field -> field.trim()).collect( - Collectors.joining(" ")); - return StringUtils.defaultString(extractedZipCodeField).trim(); - } - - @Override - public String parsePatientDateOfBirth() { - return getMappedFields().getOrDefault("birthdate", "").trim(); - } - - @Override - public String parsePatientStatus() { - return getMappedFields().getOrDefault("status", "").trim(); - } - - @Override - public String parseClinicId() { - String clinicId = getMappedFields().getOrDefault("locationNumber", ""); - Matcher m = ONLY_NUMBERS.matcher(clinicId); - if (m.matches()) { - clinicId = m.group(1); - } - return clinicId; - } - - @Override - public String parseDoctorId() { - String doctorId = getMappedFields().getOrDefault("practitionerNumber", ""); - Matcher m = ONLY_NUMBERS.matcher(doctorId); - if (m.matches()) { - doctorId = m.group(1); - } - return doctorId; - } - - @Override - public String parsePrescriptionDate() { - return getMappedFields().getOrDefault("date", ""); - } - - @Override - public List<MedicationString> parsePrescriptionList() { - if (prescriptionInfo != null) { - return prescriptionInfo.stream().map(String::trim) - .filter(StringUtils::isNotBlank) - .map(this::parseMedication) - .collect(Collectors.toList()); - } else { - return new ArrayList<>(); - } - } - - @Override - public String parsePatientInsuranceId() { - String patientInsuranceId = getMappedFields().getOrDefault("insuranceNumber", ""); - if (patientInsuranceId != null && "".equals(patientInsuranceId.trim())) { - log.warning("No patientInsuranceId found using A123456789"); - patientInsuranceId = "A123456789"; - } - return patientInsuranceId; - } - - @Override - public Boolean parseIsWithPayment() { - return mappedFields.get("withPayment").trim().equals("X"); - } - - @Override - public String parsePractitionerFirstName() { - String firstName = getDataFieldAtPosOrDefault(practitionerNameAndAddressInfo, 0, "") - .split(" ")[0].trim(); - if (firstName.contains(".")) { - return firstName.split("\\.")[1].trim(); - } else { - return firstName; - } - } - - @Override - public String parsePractitionerLastName() { - return getDataFieldAtPosOrDefault(practitionerNameAndAddressInfo, 0, "") - .split(" ")[1].trim(); - } - - @Override - public String parsePractitionerNamePrefix() { - String firstName = getDataFieldAtPosOrDefault(practitionerNameAndAddressInfo, 0, "") - .split(" ")[0].trim(); - if (firstName.contains(".")) { - return firstName.split(" ")[0]; - } - return ""; - } - - @Override - public String parsePractitionerStreetName() { - String[] streetName = getDataFieldAtPosOrDefault(practitionerNameAndAddressInfo, - 1, "").split("\\d+"); - return getDataFieldAtPosOrDefault(streetName, 0, "").trim(); - } - - @Override - public String parsePractitionerStreetNumber() { - String[] streetNumber = getDataFieldAtPosOrDefault(practitionerNameAndAddressInfo, - 1, "").split("[a-zA-Z]+"); - return getDataFieldAtPosOrDefault(streetNumber, streetNumber.length - 1, "") - .replace(".", "").trim(); - } - - @Override - public String parsePractitionerCity() { - return getDataFieldAtPosOrDefault(practitionerNameAndAddressInfo, - 2, "").split(" ")[1].trim(); - } - - @Override - public String parsePractitionerZipCode() { - return getDataFieldAtPosOrDefault(practitionerNameAndAddressInfo, - 2, "").split(" ")[0].trim(); - } - - @Override - public String parsePractitionerPhoneNumber() { - return getDataFieldAtPosOrDefault(practitionerNameAndAddressInfo, 3, "").trim(); - } - - @Override - public String parsePractitionerFaxNumber() { - return getDataFieldAtPosOrDefault(practitionerNameAndAddressInfo, 4, "") - .split("Fax:")[1].trim(); - } - - public Map<String, String> getMappedFields() { - return mappedFields; - } - - @Override - public String parsePractitionerQualification() { - return "00"; - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/Muster16SvgRegexParser.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/Muster16SvgRegexParser.java deleted file mode 100644 index 40c892909..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/Muster16SvgRegexParser.java +++ /dev/null @@ -1,214 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer; - -import health.ere.ps.model.muster16.MedicationString; -import health.ere.ps.service.muster16.parser.IMuster16FormParser; -import health.ere.ps.service.muster16.parser.rgxer.delegate.medication.MedicationParseDelegate; -import health.ere.ps.service.muster16.parser.rgxer.delegate.patient.PatientEntryParseDelegate; -import health.ere.ps.service.muster16.parser.rgxer.delegate.practitioner.PractitionerEntryParseDelegate; -import health.ere.ps.service.muster16.parser.rgxer.formatter.Muster16AtomicFormatter; -import health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field; - -import java.util.*; -import java.util.stream.Collectors; - -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.*; - - -public class Muster16SvgRegexParser implements IMuster16FormParser { - - private final Map<Muster16Field, String> atomicResult; - private final List<MedicationString> prescribedMedication; - - - public Muster16SvgRegexParser(Map<String, String> entries) { - atomicResult = new HashMap<>(); - atomicResult.putAll(parseAtomicFields(entries)); - - prescribedMedication = new ArrayList<>(); - prescribedMedication.addAll(parseMedication(entries.get("medication"))); - } - - private Map<Muster16Field, String> parseAtomicFields(Map<String, String> entries) { - Map<Muster16Field, String> mappedFields = mapFields(entries); - return formatValues(mappedFields); - } - - private Map<Muster16Field, String> extractPatientAndPractitionerValues(Map<String, String> mappedValues) { - Map<Muster16Field, String> patientAndPractitionerDetailsFields = new PatientEntryParseDelegate( - mappedValues.getOrDefault("nameAndAddress", "")).getDetails(); - - patientAndPractitionerDetailsFields.putAll(new PractitionerEntryParseDelegate(( - mappedValues.getOrDefault("practitionerText", ""))).getDetails()); - - return patientAndPractitionerDetailsFields; - } - - private Map<Muster16Field, String> formatValues(Map<Muster16Field, String> mappedFields) { - Muster16AtomicFormatter formatter = new Muster16AtomicFormatter(); - return formatter.format(mappedFields); - } - - private Map<Muster16Field, String> mapFields(Map<String, String> entries) { - Map<Muster16Field, String> fieldsMap = new HashMap<>(); - fieldsMap.put(INSURANCE_COMPANY, entries.getOrDefault("insurance", "")); - fieldsMap.put(INSURANCE_COMPANY_ID, entries.getOrDefault("payor", "")); - fieldsMap.put(PATIENT_DATE_OF_BIRTH, entries.getOrDefault("birthdate", "")); - fieldsMap.put(PATIENT_STATUS, entries.getOrDefault("status", "")); - fieldsMap.put(CLINIC_ID, entries.getOrDefault("locationNumber", "")); - fieldsMap.put(DOCTOR_ID, entries.getOrDefault("practitionerNumber", "")); - fieldsMap.put(PRESCRIPTION_DATE, entries.getOrDefault("date", "")); - fieldsMap.put(PATIENT_INSURANCE_ID, entries.getOrDefault("insuranceNumber", "")); - fieldsMap.put(IS_WITH_PAYMENT, entries.getOrDefault("withPayment", "")); - fieldsMap.putAll(extractPatientAndPractitionerValues(entries)); - return fieldsMap; - } - - private List<MedicationString> parseMedication(String medication) { - MedicationParseDelegate parser = new MedicationParseDelegate(); - return parser.parse(medication); - } - - private String getValue(Muster16Field key) { - String defaultValue = ""; - String value = atomicResult.getOrDefault(key, defaultValue); - return value != null ? value : defaultValue; - } - - @Override - public String parseInsuranceCompany() { - return getValue(INSURANCE_COMPANY); - } - - @Override - public String parseInsuranceCompanyId() { - return getValue(INSURANCE_COMPANY_ID); - } - - @Override - public List<String> parsePatientNamePrefix() { - String value = getValue(PATIENT_NAME_PREFIX); - if(value.isBlank()) - return Collections.emptyList(); - return List.of(value.split(" ")).stream().map(String::new).collect(Collectors.toList()); - } - - @Override - public String parsePatientFirstName() { - return getValue(PATIENT_FIRST_NAME); - } - - @Override - public String parsePatientLastName() { - return getValue(PATIENT_LAST_NAME); - } - - @Override - public String parsePatientStreetName() { - return getValue(PATIENT_STREET_NAME); - } - - @Override - public String parsePatientStreetNumber() { - return getValue(PATIENT_STREET_NUMBER); - } - - @Override - public String parsePatientCity() { - return getValue(PATIENT_CITY); - } - - @Override - public String parsePatientZipCode() { - return getValue(PATIENT_ZIPCODE); - } - - @Override - public String parsePatientDateOfBirth() { - return getValue(PATIENT_DATE_OF_BIRTH); - } - - @Override - public String parsePatientStatus() { - return getValue(PATIENT_STATUS); - } - - @Override - public String parseClinicId() { - return getValue(CLINIC_ID); - } - - @Override - public String parseDoctorId() { - return getValue(DOCTOR_ID); - } - - @Override - public String parsePrescriptionDate() { - return getValue(PRESCRIPTION_DATE); - } - - @Override - public List<MedicationString> parsePrescriptionList() { - return prescribedMedication; - } - - @Override - public String parsePatientInsuranceId() { - return getValue(PATIENT_INSURANCE_ID); - } - - @Override - public Boolean parseIsWithPayment() { - return getValue(IS_WITH_PAYMENT).equals("X"); - } - - @Override - public String parsePractitionerFirstName() { - return getValue(PRACTITIONER_FIRST_NAME); - } - - @Override - public String parsePractitionerLastName() { - return getValue(PRACTITIONER_LAST_NAME); - } - - @Override - public String parsePractitionerNamePrefix() { - return getValue(PRACTITIONER_NAME_PREFIX); - } - - @Override - public String parsePractitionerStreetName() { - return getValue(PRACTITIONER_STREET_NAME); - } - - @Override - public String parsePractitionerStreetNumber() { - return getValue(PRACTITIONER_STREET_NUMBER); - } - - @Override - public String parsePractitionerCity() { - return getValue(PRACTITIONER_CITY); - } - - @Override - public String parsePractitionerZipCode() { - return getValue(PRACTITIONER_ZIPCODE); - } - - @Override - public String parsePractitionerPhoneNumber() { - return getValue(PRACTITIONER_PHONE); - } - - @Override - public String parsePractitionerFaxNumber() { - return getValue(PRACTITIONER_FAX); - } - - @Override - public String parsePractitionerQualification() { - return getValue(PRACTITIONER_QUALIFICATION); - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationEntryParseDelegate.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationEntryParseDelegate.java deleted file mode 100644 index b2d3e9411..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationEntryParseDelegate.java +++ /dev/null @@ -1,70 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.delegate.medication; - -import health.ere.ps.service.muster16.parser.rgxer.delegate.pattern.MedicationPatterns; -import health.ere.ps.service.muster16.parser.rgxer.matcher.MedicationMatcher; -import health.ere.ps.service.muster16.parser.rgxer.model.MedicationLine; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -public class MedicationEntryParseDelegate { - - - private final MedicationMatcher matcher; - private final MedicationPatterns patterns; - - - public MedicationEntryParseDelegate() { - matcher = new MedicationMatcher(); - patterns = new MedicationPatterns(); - } - - public List<String> parse(String entry) { - - List<MedicationLine> lines = initializeLines(entry); - List<MedicationLine> merged = tryMerge(lines); - return merged.stream().map(MedicationLine::getValue).collect(Collectors.toList()); - } - - private List<MedicationLine> tryMerge(List<MedicationLine> lines) { - for (int i = 1; i < lines.size(); ) - if (canMerge(lines.get(i))) { - MedicationLine first = lines.get(i - 1), second = lines.remove(i); - first.merge(second); - } else - i++; - return lines; - } - - private boolean canMerge(MedicationLine second) { - float score = 0; - score += nameExists(second) ? 4 : 0; - score += hasDosage(second) ? 2 : 0; - score += hasStrength(second) ? 2 : 0; - return score < 4; - } - - private List<MedicationLine> initializeLines(String entry) { - return Arrays.stream(entry.split("\\n")) - .filter(this::validLine) - .map(MedicationLine::new) - .collect(Collectors.toList()); - } - - private boolean nameExists(MedicationLine line) { - return matcher.matchName(line.getSequence().get(0)); - } - - private boolean validLine(String line) { - return !patterns.SEPARATOR_PAT.matcher(line).matches(); - } - - private boolean hasDosage(MedicationLine line) { - return patterns.DOSAGE_PAT.matcher(line.getValue()).find(); - } - - private boolean hasStrength(MedicationLine line) { - return patterns.STRENGTH_PAT.matcher(line.getValue()).find(); - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationEntrySplitDelegate.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationEntrySplitDelegate.java deleted file mode 100644 index 25c01b41f..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationEntrySplitDelegate.java +++ /dev/null @@ -1,54 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.delegate.medication; - -import health.ere.ps.service.muster16.parser.rgxer.delegate.pattern.MedicationPatterns; - -import java.util.regex.Matcher; - - -public class MedicationEntrySplitDelegate { - - private final MedicationPatterns patterns; - - public MedicationEntrySplitDelegate() { - this.patterns = new MedicationPatterns(); - } - - int getSplitIndex(String entry) { - int idx; - if ((idx = zahlencodeIndex(entry)) != -1) - return idx; - else if ((idx = nameEndIndex(entry)) != -1) - return idx; - else - return entry.length(); - } - - //region Method 1: matching with the Zahlencode - private int zahlencodeIndex(String entry) { - final Matcher matcher = patterns.ZCODE_PAT.matcher(entry); - return matcher.find() ? matcher.start() : -1; - } - //endregion - - //region Method 2: matching common endings of medication name - private int strengthEndIndex(String entry) { - final Matcher matcher = patterns.STRENGTH_PAT.matcher(entry); - return matcher.find() ? matcher.end() : -1; - } - - private int sizeEndIndex(String entry) { - final Matcher matcher = patterns.SIZE_PAT.matcher(entry); - return matcher.find() ? matcher.end() : -1; - } - - private int nameEndIndex(String entry) { - int idx1 = strengthEndIndex(entry), idx2 = sizeEndIndex(entry); - return Integer.max(idx1, idx2); - } - //endregion - - //region Method 3: - // TODO - //endregion - -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationFormatDelegate.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationFormatDelegate.java deleted file mode 100644 index 6ff06c03d..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationFormatDelegate.java +++ /dev/null @@ -1,38 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.delegate.medication; - -import health.ere.ps.service.muster16.parser.rgxer.formatter.FormattingChain; -import health.ere.ps.service.muster16.parser.rgxer.delegate.pattern.MedicationPatterns; - -public class MedicationFormatDelegate { - - - private final MedicationPatterns patterns; - - public MedicationFormatDelegate() { - patterns = new MedicationPatterns(); - } - - private String removeExtraSpaces(String entry) { - return patterns.EXTRA_WHITE_SPACE.matcher(entry).replaceAll(" ").trim(); - } - - private String cleanToken(String entry) { - return removeExtraSpaces(entry); - } - - private String removePZN(String entry) { - return patterns.PZN_PAT.matcher(entry).replaceAll(" "); - } - - String formatName(String entry) { - return FormattingChain.format(entry) - .apply(this::removePZN) - .apply(this::cleanToken).get(); - } - - String formatDosage(String entry) { - return FormattingChain.format(entry) - .apply(this::removePZN) - .apply(this::cleanToken).get(); - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationParseDelegate.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationParseDelegate.java deleted file mode 100644 index 04b65af26..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/medication/MedicationParseDelegate.java +++ /dev/null @@ -1,93 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.delegate.medication; - -import health.ere.ps.model.muster16.MedicationString; -import health.ere.ps.service.muster16.parser.rgxer.matcher.MedicationMatcher; -import health.ere.ps.service.muster16.parser.rgxer.model.MedicationRecord; -import health.ere.ps.service.muster16.parser.rgxer.delegate.pattern.MedicationPatterns; - -import java.util.List; -import java.util.regex.Matcher; -import java.util.stream.Collectors; - -public class MedicationParseDelegate { - - private final MedicationEntryParseDelegate intermediateParser; - private final MedicationMatcher matcher; - private final MedicationEntrySplitDelegate nameResolver; - private final MedicationFormatDelegate formatter; - private final MedicationPatterns patterns; - - private final int PZN_LENGTH = 8; - - - public MedicationParseDelegate() { - this.intermediateParser = new MedicationEntryParseDelegate(); - this.matcher = new MedicationMatcher(); - this.nameResolver = new MedicationEntrySplitDelegate(); - this.formatter = new MedicationFormatDelegate(); - this.patterns = new MedicationPatterns(); - } - - public List<MedicationString> parse(String entry) { - List<String> lines = intermediateParser.parse(entry); - return lines.stream().map(this::parseLine).collect(Collectors.toList()); - } - - private MedicationString parseLine(String line) { - String pzn = getPZN(line); - String form = pzn != null ? getForm(pzn) : null; - String size = getSize(line, pzn); - - int index = nameResolver.getSplitIndex(line); - String name = line.substring(0, index), dosage = line.substring(index); - - name = formatter.formatName(name); - dosage = formatter.formatDosage(dosage); - - return new MedicationString(name, size, form, dosage, null, pzn); - } - - private String getForm(String pzn) { - MedicationRecord record = findRecord(pzn); - return record != null ? record.getForm() : null; - } - - private MedicationRecord findRecord(String pzn) { - return matcher.findByPZN(pzn); - } - - private String getSize(String entry, String pzn) { - if (pzn != null) { - MedicationRecord record = matcher.findByPZN(pzn); - if (record != null) - return record.getNorm(); - } - return parseSize(entry); - } - - private String parseSize(String entry) { - Matcher matcher = patterns.SIZE_PAT.matcher(entry); - return matcher.find() ? matcher.group() : null; - } - - private String getPZN(String entry) { - String pzn; - if ((pzn = extractPZN(entry)) != null) { - return normalizePZN(pzn); - } else { - MedicationRecord record = matcher.bestMatch(entry); - return record != null ? record.getPZN() : null; - } - } - - private String normalizePZN(String pzn) { - final int paddingSize = PZN_LENGTH - pzn.length(); - final String padding = new String(new char[paddingSize]).replace("\0", "0"); - return padding + pzn; - } - - private String extractPZN(String entry) { - Matcher matcher = patterns.PZN_PAT.matcher(entry); - return matcher.find() ? matcher.group("value") : null; - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/patient/PatientEntryParseDelegate.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/patient/PatientEntryParseDelegate.java deleted file mode 100644 index d714db9ba..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/patient/PatientEntryParseDelegate.java +++ /dev/null @@ -1,91 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.delegate.patient; - -import health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field; -import health.ere.ps.service.muster16.parser.rgxer.delegate.pattern.PatientPatterns; - -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.*; - -public class PatientEntryParseDelegate { - - private final Map<Muster16Field, String> details; - private final PatientPatterns patterns; - - public PatientEntryParseDelegate(String entry) { - details = new HashMap<>(); - patterns = new PatientPatterns(); - extract(entry); - } - - public Map<Muster16Field, String> getDetails() { - return details; - } - - private void extract(String entry) { - List<String> lines = Arrays.stream(entry.split("\\n")) - .map(String::trim) - .collect(Collectors.toList()); - - if (lines.size() >= 4) { - matchAndExtractLine(lines, patterns.ADDRESS_LINE).ifPresent(this::parseAddressLine); - matchAndExtractLine(lines, patterns.STREET_LINE).ifPresent(this::parseStreetLine); - matchAndExtractLine(lines, patterns.FIRST_NAME_LINE).ifPresentOrElse(this::parseFirstName, () -> parseFirstName(lines.get(1))); - parseLastName(lines.get(0)); - } - } - - private void parseLastName(String token) { - details.put(PATIENT_LAST_NAME, token); - } - - private void parseFirstName(String entry) { - parseNamePrefix(entry); - entry = entry.replaceAll(patterns.NAME_PREFIX.pattern(), ""); - details.put(PATIENT_FIRST_NAME, entry); - } - - private void parseNamePrefix(String entry) { - Matcher matcher = patterns.NAME_PREFIX.matcher(entry); - StringBuilder builder = new StringBuilder(); - while (matcher.find()) - builder.append(matcher.group()); - details.put(PATIENT_NAME_PREFIX, builder.toString()); - } - - private void parseAddressLine(String line) { - Matcher matcher = patterns.ADDRESS_LINE.matcher(line); - if (matcher.matches()) { - details.put(PATIENT_ZIPCODE, matcher.group(2)); - details.put(PATIENT_CITY, matcher.group(3)); - } - } - - private void parseStreetLine(String line) { - Matcher matcher = patterns.STREET_LINE.matcher(line); - if (matcher.matches()) { - details.put(PATIENT_STREET_NAME, matcher.group(1)); - details.put(PATIENT_STREET_NUMBER, matcher.group(2)); - } - } - - private boolean matches(String input, Pattern pattern) { - return pattern.matcher(input).matches(); - } - - private Optional<String> matchAndExtractLine(List<String> lines, Pattern pattern) { - - OptionalInt indexOpt = IntStream.range(0, lines.size()) - .filter(i -> matches(lines.get(i), pattern)) - .findFirst(); - - if (indexOpt.isPresent()) - return Optional.of(lines.remove(indexOpt.getAsInt())); - else - return Optional.empty(); - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/MedicationPatterns.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/MedicationPatterns.java deleted file mode 100644 index d65426f6c..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/MedicationPatterns.java +++ /dev/null @@ -1,15 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.delegate.pattern; - -import java.util.regex.Pattern; - -public class MedicationPatterns extends Patterns { - - public final Pattern DOSAGE_PAT = Pattern.compile("[01]\\s*-\\s*[01]\\s*-\\s*[01]"); - public final Pattern STRENGTH_PAT = Pattern.compile("(?<value>\\d+([.,]\\d+)?)\\s*(?<unit>(μg|mg|g|ml|%))"); - public final Pattern SEPARATOR_PAT = Pattern.compile("[^\\w\\d]+"); - - // https://applications.kbv.de/xml/S_KBV_NORMGROESSE_V1.00.xml - public final Pattern SIZE_PAT = Pattern.compile("\\b(KA|KTP|N[1-3B]|KP)\\b"); - public final Pattern ZCODE_PAT = Pattern.compile("[01]\\s*-\\s*[01]\\s*-\\s*[01]"); - public final Pattern PZN_PAT = Pattern.compile("(PZN)?\\s*:?\\s*(?<value>\\d{8})"); -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/PatientPatterns.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/PatientPatterns.java deleted file mode 100644 index 482805876..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/PatientPatterns.java +++ /dev/null @@ -1,11 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.delegate.pattern; - -import java.util.regex.Pattern; - -public class PatientPatterns extends Patterns { - //Check PractitionerPatterns - public final Pattern NAME_PREFIX = Pattern.compile("(Prof|Dr)\\."); - public final Pattern FIRST_NAME_LINE = Pattern.compile("(?<prefix>(Prof|Dr)\\.)(.*)"); - public final Pattern ADDRESS_LINE = Pattern.compile("(.*)(\\d{5})(.*)"); - public final Pattern STREET_LINE = Pattern.compile("(\\D+)(\\d+( ?[a-zA-Z])?)"); -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/Patterns.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/Patterns.java deleted file mode 100644 index 552e9d69f..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/Patterns.java +++ /dev/null @@ -1,7 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.delegate.pattern; - -import java.util.regex.Pattern; - -public class Patterns { - public final Pattern EXTRA_WHITE_SPACE = Pattern.compile("\\s+"); -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/PractitionerPatterns.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/PractitionerPatterns.java deleted file mode 100644 index a6394e04a..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/pattern/PractitionerPatterns.java +++ /dev/null @@ -1,13 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.delegate.pattern; - -import java.util.regex.Pattern; - -public class PractitionerPatterns extends Patterns { - public final Pattern NAME_PREFIX = Pattern.compile("((Dr|dr|Med|med|dent|Prof|prof)\\.)+"); - public final Pattern NAME_LINE = Pattern.compile( - "((Dr|dr|Med|med|dent|Prof|prof)\\.)* ([a-z A-ZäöüÄÖÜß\\-]+) ([a-z A-ZäöüÄÖÜßé\\-]+)"); - public final Pattern STREET_LINE = Pattern.compile("^[a-z A-ZäöüÄÖÜß]+(\\.{1})?.*[0-9]+"); - public final Pattern CITY_LINE = Pattern.compile(".*\\d{5}.*"); - public final Pattern PHONE_LINE = Pattern.compile(".*[0-9 \\-/]{10,}+"); - public final Pattern FAX_LINE = Pattern.compile("^(Fax:).*"); -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/practitioner/PractitionerEntryParseDelegate.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/practitioner/PractitionerEntryParseDelegate.java deleted file mode 100644 index 27414d91a..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/delegate/practitioner/PractitionerEntryParseDelegate.java +++ /dev/null @@ -1,128 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.delegate.practitioner; - -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_QUALIFICATION; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_CITY; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_FAX; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_FIRST_NAME; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_LAST_NAME; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_NAME_PREFIX; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_PHONE; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_STREET_NAME; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_STREET_NUMBER; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_ZIPCODE; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.OptionalInt; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import health.ere.ps.service.muster16.parser.rgxer.delegate.pattern.PractitionerPatterns; -import health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field; - -public class PractitionerEntryParseDelegate { - - private final Map<Muster16Field, String> details; - private final PractitionerPatterns patterns; - - - public PractitionerEntryParseDelegate(String entry) { - details = new HashMap<>(); - patterns = new PractitionerPatterns(); - extract(entry); - } - - public Map<Muster16Field, String> getDetails() { - return details; - } - - private void extract(String entry) { - List<String> lines = Arrays.stream(entry.split("\\n")) - .map(String::trim) - .collect(Collectors.toList()); - - if(lines.contains("Zahnärztin")) { - details.put(PRACTITIONER_QUALIFICATION, "01"); - lines.remove("Zahnärztin"); - } else if(lines.contains("Zahnarzt")) { - details.put(PRACTITIONER_QUALIFICATION, "01"); - lines.remove("Zahnarzt"); - } else { - details.put(PRACTITIONER_QUALIFICATION, "00"); - } - - if (lines.size() >= 5) { - matchAndExtractLine(lines, patterns.FAX_LINE).ifPresent(this::parseFaxNumber); - matchAndExtractLine(lines, patterns.PHONE_LINE).ifPresent(this::parsePhoneNumber); - matchAndExtractLine(lines, patterns.CITY_LINE).ifPresent(this::parseAddressLine); - matchAndExtractLine(lines, patterns.STREET_LINE).ifPresent(this::parseStreetLine); - matchAndExtractLine(lines, patterns.NAME_LINE).ifPresent(this::parseNames); - } - } - - private void parseNames(String entry) { - parseNamePrefix(entry); - entry = entry.replaceAll(patterns.NAME_PREFIX.pattern(), ""); - String[] names = entry.split(" "); - - if (!(names.length == 1)) { - details.put(PRACTITIONER_LAST_NAME, names[names.length - 1].trim()); - details.put(PRACTITIONER_FIRST_NAME, entry.substring(0, entry.lastIndexOf(" ")).trim()); - } - } - - private void parseNamePrefix(String entry) { - Matcher matcher = patterns.NAME_PREFIX.matcher(entry); - StringBuilder builder = new StringBuilder(); - while (matcher.find()) - builder.append(matcher.group()); - details.put(PRACTITIONER_NAME_PREFIX, builder.toString()); - } - - private void parseAddressLine(String line) { - String[] splitLine = line.split(" "); - if (splitLine[0].matches("[0-9]+")) { - details.put(PRACTITIONER_ZIPCODE, splitLine[0]); - line = line.replace(splitLine[0], "").trim(); - } else { - details.put(PRACTITIONER_ZIPCODE, splitLine[splitLine.length - 1]); - line = line.replace(splitLine[splitLine.length - 1], "").trim(); - } - details.put(PRACTITIONER_CITY, line); - } - - private void parseStreetLine(String line) { - String streetNumber = line.replaceAll("\\D+", ""); - - details.put(PRACTITIONER_STREET_NUMBER, streetNumber); - details.put(PRACTITIONER_STREET_NAME, line.replace(streetNumber, "").trim()); - } - - private void parsePhoneNumber(String line) { - details.put(PRACTITIONER_PHONE, line.replaceAll("\\D+", "").trim()); - } - - private void parseFaxNumber(String line) { - details.put(PRACTITIONER_FAX, line.replaceAll("\\D+", "").trim()); - } - - private boolean matches(String input, Pattern pattern) { - return pattern.matcher(input).matches(); - } - - private Optional<String> matchAndExtractLine(List<String> lines, Pattern pattern) { - OptionalInt indexOpt = IntStream.range(0, lines.size()) - .filter(i -> matches(lines.get(i), pattern)) - .findFirst(); - - if (indexOpt.isPresent()) - return Optional.of(lines.remove(indexOpt.getAsInt())); - else - return Optional.empty(); - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/formatter/FormattingChain.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/formatter/FormattingChain.java deleted file mode 100644 index a6cf41aff..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/formatter/FormattingChain.java +++ /dev/null @@ -1,26 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.formatter; - -import java.util.function.Function; - -public class FormattingChain { - - private String load; - - - private FormattingChain(String raw) { - load = raw; - } - - public static FormattingChain format(String s) { - return new FormattingChain(s); - } - - public FormattingChain apply(Function<String, String> function) { - load = function.apply(load); - return this; - } - - public String get() { - return load; - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/formatter/Muster16AtomicFormatter.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/formatter/Muster16AtomicFormatter.java deleted file mode 100644 index 1bd507df6..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/formatter/Muster16AtomicFormatter.java +++ /dev/null @@ -1,143 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.formatter; - -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; -import java.util.Calendar; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field; - - -public class Muster16AtomicFormatter { - - private final static Logger log = Logger.getLogger(Muster16AtomicFormatter.class.getName()); - - private final Pattern EXTRA_WHITE_SPACE = Pattern.compile("\\s+"); - private final Pattern NUMBERS = Pattern.compile("(\\d+)", Pattern.DOTALL); - private final Pattern DATE = Pattern.compile("\\d+[.-/]\\d+[.-/]\\d+"); - private final Pattern SHORT_ORDINAL_DATE = Pattern.compile("(?<day>\\d+)\\.(?<month>\\d+)\\.(?<year>\\d+)"); - - private final DateTimeFormatter ORDINAL_DATE_FORMAT = DateTimeFormatter.ofPattern("d.M.yyyy"); - private final DateTimeFormatter SHORT_ORDINAL_DATE_FORMAT = DateTimeFormatter.ofPattern("d.M.yy"); - private final DateTimeFormatter STANDARD_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - - - private String removeExtraSpaces(String entry) { - return EXTRA_WHITE_SPACE.matcher(entry).replaceAll(" ").trim(); - } - - private String cleanToken(String entry) { - return removeExtraSpaces(entry); - } - - private String cleanNoise(String entry, Pattern pattern) { - Matcher matcher = pattern.matcher(entry); - return matcher.find() ? matcher.group(0) : cleanToken(entry); - } - - private int calculateTargetYear(int targetId) { - int currentYear = Calendar.getInstance().get(Calendar.YEAR); - int currentId = currentYear % 100; - return currentYear - currentId - 100 * (targetId > currentId + 1 ? 1 : 0) + targetId; - } - - private LocalDate parseShortOrdinalDate(String entry) { - Matcher matcher = SHORT_ORDINAL_DATE.matcher(entry); - if (matcher.matches()) { - int day = Integer.parseInt(matcher.group("day")), - month = Integer.parseInt(matcher.group("month")), - year = calculateTargetYear(Integer.parseInt(matcher.group("year"))); - return LocalDate.of(year, month, day); - } - return null; - } - - private LocalDate matches(String input, DateTimeFormatter format) { - try { - return LocalDate.parse(input, format); - } catch (DateTimeParseException e) { - return null; - } - } - - private LocalDate parseDate(String entry) { - LocalDate date; - if (matches(entry, SHORT_ORDINAL_DATE_FORMAT) != null) - return parseShortOrdinalDate(entry); - else if ((date = matches(entry, ORDINAL_DATE_FORMAT)) != null) - return date; - else - return null; - } - - private String reformatDate(String entry) { - LocalDate date = parseDate(entry); - return date != null ? STANDARD_DATE_FORMAT.format(date) : ""; - } - - private String cleanDate(String entry) { - return FormattingChain.format(entry).apply(s -> cleanNoise(s, DATE)).apply(this::reformatDate).get(); - } - - private String cleanNumber(String entry) { - return FormattingChain.format(entry).apply(s -> cleanNoise(s, NUMBERS)).get(); - } - - String format(Muster16Field key, String value) { - try { - switch (key) { - case INSURANCE_COMPANY: - case PATIENT_STREET_NUMBER: - case PATIENT_STREET_NAME: - case PATIENT_LAST_NAME: - case PATIENT_FIRST_NAME: - case PATIENT_NAME_PREFIX: - case INSURANCE_COMPANY_ID: - case PATIENT_CITY: - case PATIENT_ZIPCODE: - case PRACTITIONER_CITY: - case PRACTITIONER_FAX: - case PRACTITIONER_FIRST_NAME: - case PRACTITIONER_LAST_NAME: - case PRACTITIONER_NAME_PREFIX: - case PRACTITIONER_QUALIFICATION: - case PRACTITIONER_PHONE: - case PRACTITIONER_STREET_NAME: - case PRACTITIONER_STREET_NUMBER: - case PRACTITIONER_ZIPCODE: - case PATIENT_INSURANCE_ID: - case IS_WITH_PAYMENT: - return removeExtraSpaces(value); - - case PATIENT_DATE_OF_BIRTH: - case PRESCRIPTION_DATE: - return cleanDate(value); - - case CLINIC_ID: - case DOCTOR_ID: - case PATIENT_STATUS: - return cleanNumber(value); - - case PRESCRIPTION_LIST: - return ""; - default: - return ""; - } - } catch(Throwable t) { - log.log(Level.SEVERE, "Could not parse muster16 form", t); - return ""; - } - } - - public Map<Muster16Field, String> format(Map<Muster16Field, String> entries) { - return entries.entrySet() - .stream() - .collect(Collectors.toMap(Map.Entry::getKey, e -> format(e.getKey(), e.getValue()))); - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/matcher/MedicationMatcher.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/matcher/MedicationMatcher.java deleted file mode 100644 index 3db757c87..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/matcher/MedicationMatcher.java +++ /dev/null @@ -1,48 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.matcher; - -import health.ere.ps.service.muster16.parser.rgxer.model.MedicationRecord; -import health.ere.ps.service.muster16.parser.rgxer.provider.MedicationDataProvider; - -import java.util.Comparator; -import java.util.HashMap; -import java.util.Map; - -public class MedicationMatcher { - - private final MedicationDataProvider provider; - private final SimilarityCalculator similarityCalculator; - private final MedicationMatcherFilter matcherFilter; - - private Map<String, MedicationRecord> pznMedicationMap; - - public MedicationMatcher() { - this.provider = new MedicationDataProvider(); - this.similarityCalculator = new SimilarityCalculator(); - this.matcherFilter = new MedicationMatcherFilter(); - initializePZNMap(); - } - - private void initializePZNMap() { - pznMedicationMap = new HashMap<>(); - provider.getRecords().forEach(r -> pznMedicationMap.put(r.getPZN(), r)); - } - - public boolean matchName(String token) { - return provider.getRecords().stream().anyMatch(record -> matchName(token, record)); - } - - private boolean matchName(String token, MedicationRecord record) { - return record.getName().split(" ")[0].equalsIgnoreCase(token); - } - - public MedicationRecord findByPZN(String pzn) { - return pznMedicationMap.getOrDefault(pzn, null); - } - - public MedicationRecord bestMatch(String entry) { - return provider.getRecords().stream() - .filter(record -> matcherFilter.containsFirstToken(entry, record)) - .max(Comparator.comparing((MedicationRecord r) -> similarityCalculator.calculate(entry, r))) - .orElse(null); - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/matcher/MedicationMatcherFilter.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/matcher/MedicationMatcherFilter.java deleted file mode 100644 index de173ab38..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/matcher/MedicationMatcherFilter.java +++ /dev/null @@ -1,18 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.matcher; - -import health.ere.ps.service.muster16.parser.rgxer.model.MedicationRecord; - -public class MedicationMatcherFilter { - - private String getFirstToken(String string) { - String[] tokens = string.split(" "); - return tokens.length > 0 ? tokens[0] : null; - } - - boolean containsFirstToken(String entry, MedicationRecord record) { - String token1 = getFirstToken(entry), token2 = getFirstToken(record.getName()); - - return (token1 != null && token2 != null) && - (token1.equals(token2) || token1.contains(token2) || token2.contains(token1)); - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/matcher/SimilarityCalculator.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/matcher/SimilarityCalculator.java deleted file mode 100644 index 40f2694d7..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/matcher/SimilarityCalculator.java +++ /dev/null @@ -1,78 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.matcher; - -import health.ere.ps.service.muster16.parser.rgxer.model.MedicationRecord; -import me.xdrop.fuzzywuzzy.FuzzySearch; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class SimilarityCalculator { - - private final double NAME_MATCH_FACTOR = 0.51; - private final double SIZE_MATCH_FACTOR = 0.1225; - private final double STRENGTH_MATCH_FACTOR = 0.1225; - private final double FUZZY_MATCH_FACTOR = 0.254; - - final Pattern SIZE_PAT = Pattern.compile("\\b(N[1-3]|KP)\\b"); - private final Pattern STRENGTH_PAT = Pattern.compile("(?<value>\\d+([.,]\\d+)?)\\s*(?<unit>(μg|mg|g|ml|%))"); - - public SimilarityCalculator() { - } - - public double calculate(String entry, MedicationRecord record) { - return calculateNameScore(entry, record) * NAME_MATCH_FACTOR + - calculateStrengthScore(entry, record) * STRENGTH_MATCH_FACTOR + - calculateSizeScore(entry, record) * SIZE_MATCH_FACTOR + - calculateFuzzyScore(entry, record) * FUZZY_MATCH_FACTOR; - } - - private int calculateNameScore(String entry, MedicationRecord record) { - String token1 = getFirstToken(entry), token2 = getFirstToken(record.getName()); - if (token1 == null || token2 == null) - return 0; - else if (token1.equals(token2)) - return 100; - else if (token1.contains(token2) || token2.contains(token1)) - return 40; - return 0; - } - - private String getFirstToken(String string) { - String[] tokens = string.split(" "); - return tokens.length > 0 ? tokens[0] : null; - } - - private int calculateStrengthScore(String entry, MedicationRecord record) { - final String s1 = getStrength(entry), s2 = getStrength(record.getName()); - if (s1 == null && s2 == null) - return 50; - else if (s1 == null || s2 == null) - return 25; - else - return 100 * (s1.equals(s2) ? 1 : 0); - } - - private int calculateSizeScore(String entry, MedicationRecord record) { - final String size1 = getSize(entry), size2 = record.getNorm(); - if (size1 == null && size2 == null) - return 75; - else if (size1 == null || size2 == null) - return 50; - else - return 100 * (size1.equals(size2) ? 1 : 0); - } - - private int calculateFuzzyScore(String entry, MedicationRecord record) { - return FuzzySearch.tokenSetRatio(entry, record.getName()); - } - - private String getStrength(String entry) { - final Matcher matcher = STRENGTH_PAT.matcher(entry); - return matcher.find() ? matcher.group("value") + matcher.group("unit") : null; - } - - private String getSize(String entry) { - final Matcher matcher = SIZE_PAT.matcher(entry); - return matcher.find() ? matcher.group() : null; - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/FormRecord.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/FormRecord.java deleted file mode 100644 index 8c38c280a..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/FormRecord.java +++ /dev/null @@ -1,20 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.model; - -public class FormRecord { - - private final String name; - private final String code; - - public FormRecord(String name, String code) { - this.name = name; - this.code = code; - } - - public String getName() { - return name; - } - - public String getCode() { - return code; - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/MedicationLine.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/MedicationLine.java deleted file mode 100644 index ad8bf0a76..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/MedicationLine.java +++ /dev/null @@ -1,33 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.model; - -import java.util.*; -import java.util.stream.Collectors; - -public class MedicationLine { - - private String value; - private final List<String> sequence; - - public MedicationLine(String line) { - value = line; - String[] tokens = line.split(" "); - sequence = Arrays.stream(tokens).collect(Collectors.toList()); - } - - public String getValue() { - return value; - } - - public void merge(MedicationLine other) { - value = String.format("%s %s", value, other.value); - sequence.addAll(other.sequence); - } - - public boolean contains(String token) { - return this.sequence.contains(token); - } - - public List<String> getSequence() { - return sequence; - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/MedicationRecord.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/MedicationRecord.java deleted file mode 100644 index f5202ad72..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/MedicationRecord.java +++ /dev/null @@ -1,53 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.model; - -import java.util.Objects; - -public class MedicationRecord { - - private final String PZN; - private final String name; - private final String norm; - private final String amount; - private final String form; - - public MedicationRecord(String PZN, String name, String norm, String amount, String form) { - this.PZN = PZN; - this.name = name; - this.norm = norm; - this.amount = amount; - this.form = form; - } - - public String getPZN() { - return PZN; - } - - public String getName() { - return name; - } - - public String getNorm() { - return norm; - } - - public String getAmount() { - return amount; - } - - public String getForm() { - return form; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - MedicationRecord dataEntry = (MedicationRecord) o; - return Objects.equals(PZN, dataEntry.PZN) && Objects.equals(name, dataEntry.name) && Objects.equals(norm, dataEntry.norm) && Objects.equals(amount, dataEntry.amount) && Objects.equals(form, dataEntry.form); - } - - @Override - public int hashCode() { - return PZN.hashCode(); - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/Muster16Field.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/Muster16Field.java deleted file mode 100644 index 2e267eeb3..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/model/Muster16Field.java +++ /dev/null @@ -1,31 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.model; - -public enum Muster16Field { - INSURANCE_COMPANY, - INSURANCE_COMPANY_ID, - PATIENT_NAME_PREFIX, - PATIENT_FIRST_NAME, - PATIENT_LAST_NAME, - PATIENT_STREET_NAME, - PATIENT_STREET_NUMBER, - PATIENT_CITY, - PATIENT_ZIPCODE, - PATIENT_DATE_OF_BIRTH, - PATIENT_STATUS, - CLINIC_ID, - DOCTOR_ID, - PRACTITIONER_QUALIFICATION, - PRESCRIPTION_DATE, - PRESCRIPTION_LIST, - PATIENT_INSURANCE_ID, - IS_WITH_PAYMENT, - PRACTITIONER_NAME_PREFIX, - PRACTITIONER_FIRST_NAME, - PRACTITIONER_LAST_NAME, - PRACTITIONER_STREET_NAME, - PRACTITIONER_STREET_NUMBER, - PRACTITIONER_CITY, - PRACTITIONER_ZIPCODE, - PRACTITIONER_PHONE, - PRACTITIONER_FAX -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/provider/DataProvider.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/provider/DataProvider.java deleted file mode 100644 index 80f8fe0f2..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/provider/DataProvider.java +++ /dev/null @@ -1,15 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.provider; - -import java.io.InputStream; -import java.net.URISyntaxException; -import java.util.List; - -public interface DataProvider<T> { - List<T> getRecords(); - - String getFilePath(); - - default InputStream getDataFile() { - return DataProvider.class.getResourceAsStream(getFilePath()); - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/provider/FormDataProvider.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/provider/FormDataProvider.java deleted file mode 100644 index aeedfa8bd..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/provider/FormDataProvider.java +++ /dev/null @@ -1,62 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.provider; - -import health.ere.ps.service.muster16.parser.rgxer.model.FormRecord; - -import javax.xml.namespace.QName; -import javax.xml.stream.XMLEventReader; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.events.StartElement; -import javax.xml.stream.events.XMLEvent; -import java.io.FileNotFoundException; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -public class FormDataProvider implements DataProvider<FormRecord> { - - private final List<FormRecord> records; - - private static final Logger log = Logger.getLogger(DataProvider.class.getName()); - - public FormDataProvider() { - List<FormRecord> _records; - try { - _records = loadFromFile(); - } catch (XMLStreamException | FileNotFoundException | URISyntaxException e) { - _records = new ArrayList<>(); - log.severe("Failed to load data"); - } - records = _records; - } - - @Override - public List<FormRecord> getRecords() { - return records; - } - - @Override - public String getFilePath() { - return "/data/S_KBV_DARREICHUNGSFORM_V1.08.xml"; - } - - private List<FormRecord> loadFromFile() throws URISyntaxException, XMLStreamException, FileNotFoundException { - List<FormRecord> records = new ArrayList<>(); - XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); - XMLEventReader reader = xmlInputFactory.createXMLEventReader(getDataFile()); - while (reader.hasNext()) { - XMLEvent nextEvent = reader.nextEvent(); - if (nextEvent.isStartElement()) { - StartElement startElement = nextEvent.asStartElement(); - String localPart = startElement.getName().getLocalPart(); - if (localPart.equals("key")) { - String name = startElement.getAttributeByName(new QName("DN")).getValue(); - String code = startElement.getAttributeByName(new QName("V")).getValue(); - records.add(new FormRecord(name, code)); - } - } - } - return records; - } -} diff --git a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/provider/MedicationDataProvider.java b/src/main/java/health/ere/ps/service/muster16/parser/rgxer/provider/MedicationDataProvider.java deleted file mode 100644 index 060a8cc80..000000000 --- a/src/main/java/health/ere/ps/service/muster16/parser/rgxer/provider/MedicationDataProvider.java +++ /dev/null @@ -1,61 +0,0 @@ -package health.ere.ps.service.muster16.parser.rgxer.provider; - -import health.ere.ps.service.muster16.parser.rgxer.model.MedicationRecord; -import org.apache.commons.csv.CSVFormat; -import org.apache.commons.csv.CSVParser; -import org.apache.commons.csv.CSVRecord; - -import java.io.*; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; -import java.util.stream.Collectors; - -public class MedicationDataProvider implements DataProvider<MedicationRecord> { - - private final List<MedicationRecord> records; - - private static final Logger log = Logger.getLogger(MedicationDataProvider.class.getName()); - - public MedicationDataProvider() { - List<MedicationRecord> _records; - try { - _records = loadFromFile(); - } catch (URISyntaxException | IOException e) { - _records = new ArrayList<>(); - log.severe("Failed to load data file"); - } - records = _records; - } - - @Override - public List<MedicationRecord> getRecords() { - return records; - } - - private List<MedicationRecord> loadFromFile() throws URISyntaxException, IOException { - return loadCSVRecords().stream().map(this::parseRecord).collect(Collectors.toList()); - } - - private MedicationRecord parseRecord(CSVRecord csvRecord) { - return new MedicationRecord( - csvRecord.get("PZN"), - csvRecord.get("Name"), - csvRecord.get("Norm"), - csvRecord.get("Amount"), - csvRecord.get("Darreichung") - ); - } - - private List<CSVRecord> loadCSVRecords() throws IOException { - InputStreamReader reader = new InputStreamReader(getDataFile()); - CSVParser csvParser = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(reader); - return csvParser.getRecords(); - } - - @Override - public String getFilePath() { - return "/data/medication-data.csv"; - } -} diff --git a/src/main/java/health/ere/ps/service/pdf/DocumentService.java b/src/main/java/health/ere/ps/service/pdf/DocumentService.java index 6d17e621c..3bfe95597 100644 --- a/src/main/java/health/ere/ps/service/pdf/DocumentService.java +++ b/src/main/java/health/ere/ps/service/pdf/DocumentService.java @@ -22,11 +22,11 @@ import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; import javax.xml.XMLConstants; import javax.xml.transform.ErrorListener; import javax.xml.transform.Result; @@ -52,14 +52,15 @@ import health.ere.ps.event.ERezeptWithDocumentsEvent; import health.ere.ps.model.gematik.BundleWithAccessCodeOrThrowable; import health.ere.ps.model.pdf.ERezeptDocument; -import health.ere.ps.websocket.ExceptionWithReplyToExcetion; +import health.ere.ps.service.fhir.FHIRService; +import health.ere.ps.websocket.ExceptionWithReplyToException; @ApplicationScoped public class DocumentService { private static final Logger log = Logger.getLogger(DocumentService.class.getName()); private static final int MAX_NUMBER_OF_MEDICINES_PER_PRESCRIPTIONS = 9; - private final FhirContext ctx = FhirContext.forR4(); + private static final FhirContext fhirContext = FHIRService.getFhirContext(); @Inject Event<ERezeptWithDocumentsEvent> eRezeptDocumentsEvent; @@ -186,7 +187,7 @@ public void onBundlesWithAccessCodes(@ObservesAsync BundlesWithAccessCodeEvent b boas = generateERezeptPdf(subList); } catch (IOException | FOPException | TransformerException e) { log.severe("Could not generate ERezept PDF:" + e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, bundlesWithAccessCodeEvent.getReplyTo(), bundlesWithAccessCodeEvent.getReplyToMessageId())); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, bundlesWithAccessCodeEvent.getReplyTo(), bundlesWithAccessCodeEvent.getReplyToMessageId())); boas = new ByteArrayOutputStream(); } } @@ -199,7 +200,7 @@ public void onBundlesWithAccessCodes(@ObservesAsync BundlesWithAccessCodeEvent b log.info("Sending prescription receipts results."); } } catch (Exception ex) { - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(ex, bundlesWithAccessCodeEvent.getReplyTo(), bundlesWithAccessCodeEvent.getReplyToMessageId())); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(ex, bundlesWithAccessCodeEvent.getReplyTo(), bundlesWithAccessCodeEvent.getReplyToMessageId())); } }); } @@ -222,7 +223,7 @@ private File createTemporaryXmlFileFromBundles(List<BundleWithAccessCodeOrThrowa bundles.stream().filter(bundle -> bundle.getBundle() != null).map(bundle -> " <bundle>\n" + " <accessCode>" + bundle.getAccessCode() + "</accessCode>\n" + - " " + ctx.newXmlParser().encodeResourceToString(bundle.getBundle()) + "\n" + + " " + fhirContext.newXmlParser().encodeResourceToString(bundle.getBundle()) + "\n" + " </bundle>") .collect(Collectors.joining("\n")) + "\n</root>"; @@ -242,7 +243,7 @@ private ByteArrayOutputStream generatePdfInOutputStream(File xml) throws FOPExce // Step 3: Construct fop with desired output format Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); - // Step 4: Setup JAXP using identity transformer + // Step 4: Setup JAXP using identity transformer | todo: shouldn't the factory go to the service init? and just create a transformer here? (like the fopFactory) TransformerFactory factory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null); factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); diff --git a/src/main/java/health/ere/ps/service/status/StatusService.java b/src/main/java/health/ere/ps/service/status/StatusService.java index 2de79bb45..c4be3d15a 100644 --- a/src/main/java/health/ere/ps/service/status/StatusService.java +++ b/src/main/java/health/ere/ps/service/status/StatusService.java @@ -4,11 +4,11 @@ import java.util.logging.Level; import java.util.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; -import javax.websocket.Session; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; +import jakarta.websocket.Session; import de.gematik.ws.conn.eventservice.v7.GetCards; import health.ere.ps.config.AppConfig; @@ -16,10 +16,6 @@ import health.ere.ps.config.UserConfig; import health.ere.ps.event.RequestStatusEvent; import health.ere.ps.event.StatusResponseEvent; -import health.ere.ps.exception.connector.ConnectorCardsException; -import health.ere.ps.exception.idp.IdpClientException; -import health.ere.ps.exception.idp.IdpException; -import health.ere.ps.exception.idp.IdpJoseException; import health.ere.ps.model.config.UserConfigurations; import health.ere.ps.model.status.Status; import health.ere.ps.service.common.security.SecretsManagerService; @@ -29,7 +25,7 @@ import health.ere.ps.service.connector.provider.MultiConnectorServicesProvider; import health.ere.ps.service.gematik.ERezeptWorkflowService; import health.ere.ps.service.idp.BearerTokenService; -import health.ere.ps.websocket.ExceptionWithReplyToExcetion; +import health.ere.ps.websocket.ExceptionWithReplyToException; @ApplicationScoped public class StatusService { @@ -76,7 +72,7 @@ public void onRequestStatus(@ObservesAsync RequestStatusEvent requestStatusEvent statusResponseEvent.fireAsync(new StatusResponseEvent(status, session, id)); } catch(Exception e) { log.log(Level.WARNING, "Could not get status", e); - exceptionEvent.fireAsync(new ExceptionWithReplyToExcetion(e, requestStatusEvent.getReplyTo(), requestStatusEvent.getId())); + exceptionEvent.fireAsync(new ExceptionWithReplyToException(e, requestStatusEvent.getReplyTo(), requestStatusEvent.getId())); } } diff --git a/src/main/java/health/ere/ps/validation/fhir/bundle/PrescriptionBundleValidator.java b/src/main/java/health/ere/ps/validation/fhir/bundle/PrescriptionBundleValidator.java index 781dc2e4a..ad9a2bf86 100644 --- a/src/main/java/health/ere/ps/validation/fhir/bundle/PrescriptionBundleValidator.java +++ b/src/main/java/health/ere/ps/validation/fhir/bundle/PrescriptionBundleValidator.java @@ -1,141 +1,46 @@ package health.ere.ps.validation.fhir.bundle; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; -import javax.annotation.PostConstruct; -import javax.enterprise.context.ApplicationScoped; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonArrayBuilder; -import javax.json.JsonObject; -import javax.json.JsonObjectBuilder; -import javax.json.JsonValue; - -import org.hl7.fhir.common.hapi.validation.support.CachingValidationSupport; -import org.hl7.fhir.common.hapi.validation.support.CommonCodeSystemsTerminologyService; -import org.hl7.fhir.common.hapi.validation.support.InMemoryTerminologyServerValidationSupport; -import org.hl7.fhir.common.hapi.validation.support.SnapshotGeneratingValidationSupport; -import org.hl7.fhir.common.hapi.validation.support.ValidationSupportChain; -import org.hl7.fhir.common.hapi.validation.validator.FhirInstanceValidator; -import org.hl7.fhir.instance.model.api.IBaseResource; -import org.jboss.logging.Logger; - -import ca.uhn.fhir.context.FhirContext; -import ca.uhn.fhir.context.support.DefaultProfileValidationSupport; -import ca.uhn.fhir.validation.FhirValidator; +import ca.uhn.fhir.rest.api.Constants; import ca.uhn.fhir.validation.SingleValidationMessage; -import ca.uhn.fhir.validation.ValidationResult; -import health.ere.ps.validation.fhir.context.support.ErePrePopulatedValidationSupport; +import de.gematik.refv.SupportedValidationModule; +import de.gematik.refv.ValidationModuleFactory; +import de.gematik.refv.commons.exceptions.ValidationModuleInitializationException; +import de.gematik.refv.commons.validation.ValidationModule; +import de.gematik.refv.commons.validation.ValidationResult; import io.quarkus.runtime.Startup; +import jakarta.annotation.PostConstruct; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonArrayBuilder; +import jakarta.json.JsonObject; +import jakarta.json.JsonObjectBuilder; +import jakarta.json.JsonValue; + -@ApplicationScoped @Startup +@ApplicationScoped public class PrescriptionBundleValidator { private static final Logger log = Logger.getLogger(PrescriptionBundleValidator.class.getName()); - private FhirValidator validator; - @PostConstruct - void init() { - log.info("Starting validator"); - FhirContext ctx = FhirContext.forR4(); - - // Create a chain that will hold our modules - ValidationSupportChain validationSupportChain = new ValidationSupportChain(); - - // DefaultProfileValidationSupport supplies base FHIR definitions. This is generally required - // even if you are using custom profiles, since those profiles will derive from the base - // definitions. - validationSupportChain.addValidationSupport(new DefaultProfileValidationSupport(ctx)); - validationSupportChain.addValidationSupport(new ErePrePopulatedValidationSupport(ctx)); - validationSupportChain.addValidationSupport(new CommonCodeSystemsTerminologyService(ctx)); - validationSupportChain.addValidationSupport(new InMemoryTerminologyServerValidationSupport(ctx)); - validationSupportChain.addValidationSupport(new SnapshotGeneratingValidationSupport(ctx)); - - CachingValidationSupport cache = new CachingValidationSupport(validationSupportChain); - - FhirInstanceValidator validatorModule = new FhirInstanceValidator(cache); - - validatorModule.setAnyExtensionsAllowed(true); - validatorModule.setErrorForUnknownProfiles(false); - validatorModule.setNoTerminologyChecks(true); // TODO: Fix issues when set to false. - validatorModule.setCustomExtensionDomains("http://fhir.de", "https://fhir.kbv.de"); - - validator = ctx.newValidator().registerValidatorModule(validatorModule); - - // needed for initializing - validateResource("{\"resourceType\":\"Bundle\",\"id\":\"2e38f9d3-6de0-4272-b343-7b6975e8fe9e\",\"meta\":{\"lastUpdated\":\"2021-04-06T08:30:00Z\",\"profile\":"+ - "[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.1.0\"]},\"identifier\":{\"system\":\"https://gematik.de/fhir/NamingSystem/PrescriptionID\",\"value\":\"160.10"+ - "0.000.000.004.30\"},\"type\":\"document\",\"timestamp\":\"2021-04-06T08:30:00Z\",\"entry\":[{\"fullUrl\":\"http://pvs.praxis.local/fhir/Composition/70e4e747-a1e6-44cd-b91d-"+ - "7cc2eef89c0c\",\"resource\":{\"resourceType\":\"Composition\",\"id\":\"70e4e747-a1e6-44cd-b91d-7cc2eef89c0c\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/"+ - "KBV_PR_ERP_Composition|1.1.0\"]},\"extension\":[{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/Co"+ - "deSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN\",\"code\":\"00\"}}],\"status\":\"final\",\"type\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFH"+ - "IR_KBV_FORMULAR_ART\",\"code\":\"e16A\"}]},\"subject\":{\"reference\":\"Patient/93866fdc-3e50-4902-a7e9-891b54737b5e\"},\"date\":\"2021-04-05T08:00:00Z\",\"author\""+ - ":[{\"reference\":\"Practitioner/cb7558e2-0fdf-4107-93f6-07f13f39e067\",\"type\":\"Practitioner\"},{\"type\":\"Device\",\"identifier\":{\"system\":\"https://fhir.kbv.de/N"+ - "amingSystem/KBV_NS_FOR_Pruefnummer\",\"value\":\"Y/400/2107/36/999\"}}],\"title\":\"elektronische Arzneimittelverordnung\",\"attester\":[{\"mode\":\"legal\",\"p"+ - "arty\":{\"reference\":\"Practitioner/667ffd79-42a3-4002-b7ca-6b9098f20ccb\"}}],\"custodian\":{\"reference\":\"Organization/5d3f4ac0-2b44-4d48-b363-e63efa72973b\"},\"se"+ - "ction\":[{\"code\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type\",\"code\":\"Prescription\"}]},\"entry\":[{\"reference\":\"Medicatio"+ - "nRequest/877e9689-523e-46ca-aa78-8de34a023583\"}]},{\"code\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type\",\"code\":\"Coverage\""+ - "}]},\"entry\":[{\"reference\":\"Coverage/1b89236c-ab14-4e92-937e-5af0b59d0cd4\"}]}]}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/MedicationRequest/877e9689-523e-46ca-aa"+ - "78-8de34a023583\",\"resource\":{\"resourceType\":\"MedicationRequest\",\"id\":\"877e9689-523e-46ca-aa78-8de34a023583\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/Stru"+ - "ctureDefinition/KBV_PR_ERP_Prescription|1.1.0\"]},\"extension\":[{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_StatusCoPayment\",\"valueCoding\":{\"syst"+ - "em\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_StatusCoPayment\",\"code\":\"0\"}},{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee\""+ - ",\"valueBoolean\":false},{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG\",\"valueBoolean\":false},{\"url\":\"https://fhir.kbv.de/StructureDefinition/"+ - "KBV_EX_ERP_Multiple_Prescription\",\"extension\":[{\"url\":\"Kennzeichen\",\"valueBoolean\":false}]}],\"status\":\"active\",\"intent\":\"order\",\"medicationReference\":"+ - "{\"reference\":\"Medication/b7dd5ddb-b5ad-4b04-af11-6d2a354bce0c\"},\"subject\":{\"reference\":\"Patient/93866fdc-3e50-4902-a7e9-891b54737b5e\"},\"authoredOn\":\"2021-0"+ - "4-06\",\"requester\":{\"reference\":\"Practitioner/cb7558e2-0fdf-4107-93f6-07f13f39e067\"},\"insurance\":[{\"reference\":\"Coverage/1b89236c-ab14-4e92-937e-5af0b59d0cd"+ - "4\"}],\"note\":[{\"text\":\"Bitte auf Anwendung schulen\"}],\"dosageInstruction\":[{\"extension\":[{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageF"+ - "lag\",\"valueBoolean\":false}]}],\"dispenseRequest\":{\"quantity\":{\"value\":2,\"system\":\"http://unitsofmeasure.org\",\"code\":\"{Package}\"}},\"substitution\":{\"al"+ - "lowedBoolean\":true}}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Medication/b7dd5ddb-b5ad-4b04-af11-6d2a354bce0c\",\"resource\":{\"resourceType\":\"Medication\",\"id\""+ - ":\"b7dd5ddb-b5ad-4b04-af11-6d2a354bce0c\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_PZN|1.1.0\"]},\"extension\":[{\"url\":\""+ - "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category\",\""+ - "code\":\"00\"}},{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine\",\"valueBoolean\":false},{\"url\":\"http://fhir.de/StructureDefinitio"+ - "n/normgroesse\",\"valueCode\":\"N1\"}],\"code\":{\"coding\":[{\"system\":\"http://fhir.de/CodeSystem/ifa/pzn\",\"code\":\"00427833\"}],\"text\":\"Viani 50\u00B5g/250\u00B5"+ - "g 1 Diskus 60 ED N1\"},\"form\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DARREICHUNGSFORM\",\"code\":\"IHP\"}]},\"amount\":{\"numerato"+ - "r\":{\"value\":1,\"unit\":\"Diskus\",\"system\":\"http://unitsofmeasure.org\",\"code\":\"{tbl}\"},\"denominator\":{\"value\":1}}}},{\"fullUrl\":\"http://pvs.praxis.local/"+ - "fhir/Patient/93866fdc-3e50-4902-a7e9-891b54737b5e\",\"resource\":{\"resourceType\":\"Patient\",\"id\":\"93866fdc-3e50-4902-a7e9-891b54737b5e\",\"meta\":{\"profile\":[\"htt"+ - "ps://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.0.3\"]},\"identifier\":[{\"type\":{\"coding\":[{\"system\":\"http://fhir.de/CodeSystem/identifier-type-de-basis\""+ - ",\"code\":\"GKV\"}]},\"system\":\"http://fhir.de/NamingSystem/gkv/kvid-10\",\"value\":\"K220635158\"}],\"name\":[{\"use\":\"official\",\"family\":\"K\u00F6nigsstein\",\"_f"+ - "amily\":{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/humanname-own-name\",\"valueString\":\"K\u00F6nigsstein\"}]},\"given\":[\"Ludger\"]}],\"birthDat"+ - "e\":\"1935-06-22\",\"address\":[{\"type\":\"both\",\"line\":[\"Blumenweg\"],\"_line\":[{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-stre"+ - "etName\",\"valueString\":\"Blumenweg\"}]}],\"city\":\"Esens\",\"postalCode\":\"26427\",\"country\":\"D\"}]}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Practitioner/cb7558e"+ - "2-0fdf-4107-93f6-07f13f39e067\",\"resource\":{\"resourceType\":\"Practitioner\",\"id\":\"cb7558e2-0fdf-4107-93f6-07f13f39e067\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/S"+ - "tructureDefinition/KBV_PR_FOR_Practitioner|1.0.3\"]},\"identifier\":[{\"type\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/v2-0203\",\"code\":\"LANR\"}]}"+ - ",\"system\":\"https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR\",\"value\":\"895268385\"}],\"name\":[{\"use\":\"official\",\"family\":\"Fischer\",\"_family\":{\"extension\":[{"+ - "\"url\":\"http://hl7.org/fhir/StructureDefinition/humanname-own-name\",\"valueString\":\"Fischer\"}]},\"given\":[\"Alexander\"]}],\"qualification\":[{\"code\":{\"coding\":[{\""+ - "system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type\",\"code\":\"03\"}]}},{\"code\":{\"text\":\"Weiterbildungsassistent\"}}]}},{\"fullUrl\":\"http://pvs.p"+ - "raxis.local/fhir/Practitioner/667ffd79-42a3-4002-b7ca-6b9098f20ccb\",\"resource\":{\"resourceType\":\"Practitioner\",\"id\":\"667ffd79-42a3-4002-b7ca-6b9098f20ccb\",\"meta\":{\""+ - "profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.0.3\"]},\"identifier\":[{\"type\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSy"+ - "stem/v2-0203\",\"code\":\"LANR\"}]},\"system\":\"https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR\",\"value\":\"987654423\"}],\"name\":[{\"use\":\"official\",\"family\":\"Sch"+ - "neider\",\"_family\":{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/humanname-own-name\",\"valueString\":\"Schneider\"}]},\"given\":[\"Emma\"],\"prefix\":["+ - "\"Dr. med.\"],\"_prefix\":[{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier\",\"valueCode\":\"AC\"}]}]}],\"qualification\":[{\"code\":{"+ - "\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type\",\"code\":\"00\"}]}},{\"code\":{\"text\":\"Fach\u00E4rztin f\u00FCr Innere Medizin\"}}]"+ - "}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Organization/5d3f4ac0-2b44-4d48-b363-e63efa72973b\",\"resource\":{\"resourceType\":\"Organization\",\"id\":\"5d3f4ac0-2b44-4d48-"+ - "b363-e63efa72973b\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.0.3\"]},\"identifier\":[{\"type\":{\"coding\":[{\"system\":\"http:"+ - "//terminology.hl7.org/CodeSystem/v2-0203\",\"code\":\"BSNR\"}]},\"system\":\"https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR\",\"value\":\"721111100\"}],\"name\":\"MVZ\",\"te"+ - "lecom\":[{\"system\":\"phone\",\"value\":\"0301234567\"},{\"system\":\"fax\",\"value\":\"030123456789\"},{\"system\":\"email\",\"value\":\"mvz@e-mail.de\"}],\"address\":[{\"typ"+ - "e\":\"both\",\"line\":[\"Herbert-Lewin-Platz 2\"],\"_line\":[{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber\",\"valueString\":\"2\""+ - "},{\"url\":\"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName\",\"valueString\":\"Herbert-Lewin-Platz\"}]}],\"city\":\"Berlin\",\"postalCode\":\"10623\",\"countr"+ - "y\":\"D\"}]}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Coverage/1b89236c-ab14-4e92-937e-5af0b59d0cd4\",\"resource\":{\"resourceType\":\"Coverage\",\"id\":\"1b89236c-ab14-4e92-"+ - "937e-5af0b59d0cd4\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.0.3\"]},\"extension\":[{\"url\":\"http://fhir.de/StructureDefinition/gk"+ - "v/besondere-personengruppe\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE\",\"code\":\"00\"}},{\"url\":\"http://fhir.de/StructureDe"+ - "finition/gkv/dmp-kennzeichen\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP\",\"code\":\"05\"}},{\"url\":\"http://fhir.de/StructureDefinition"+ - "/gkv/wop\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP\",\"code\":\"17\"}},{\"url\":\"http://fhir.de/StructureDefinition/gkv/versichertenart"+ - "\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS\",\"code\":\"5\"}}],\"status\":\"active\",\"type\":{\"coding\":[{\"system\":\"h"+ - "ttp://fhir.de/CodeSystem/versicherungsart-de-basis\",\"code\":\"GKV\"}]},\"beneficiary\":{\"reference\":\"Patient/93866fdc-3e50-4902-a7e9-891b54737b5e\"},\"payor\":[{\"identifier\""+ - ":{\"system\":\"http://fhir.de/NamingSystem/arge-ik/iknr\",\"value\":\"109719018\"},\"display\":\"AOK Nordost\"}]}}]}", false); - } + ValidationModule erpModule; - public ValidationResult validateResource(IBaseResource resource, boolean showIssues) { - ValidationResult validationResult = validator.validateWithResult(resource); - - if(showIssues) { - showIssues(validationResult); + @PostConstruct + public void init() { + try { + erpModule = new ValidationModuleFactory().createValidationModule(SupportedValidationModule.ERP); + erpModule.getConfiguration().setAcceptedEncodings(Arrays.asList(Constants.FORMAT_XML, Constants.FORMAT_JSON)); + } catch (IllegalArgumentException | ValidationModuleInitializationException e) { + log.log(Level.SEVERE, "Could not init validator", e); } - - return validationResult; } public ValidationResult validateResource(String resourceText, boolean showIssues) { @@ -149,7 +54,7 @@ public ValidationResult validateResource(String resourceText, public ValidationResult validateResource(String resourceText, boolean showIssues, List<String> validationErrorsCollectorList) { - ValidationResult validationResult = validator.validateWithResult(resourceText); + ValidationResult validationResult = erpModule.validateString(resourceText); if(showIssues || validationErrorsCollectorList != null) { showIssues(validationResult, validationErrorsCollectorList); @@ -164,10 +69,10 @@ protected void showIssues(ValidationResult validationResult) { protected void showIssues(ValidationResult validationResult, List<String> validationErrorsCollectorList) { - if(!validationResult.isSuccessful()) { + if(!validationResult.isValid()) { String errorReport = ""; - for (SingleValidationMessage next : validationResult.getMessages()) { + for (SingleValidationMessage next : validationResult.getValidationMessages()) { errorReport = " Next issue " + next.getSeverity() + " - " + next.getLocationString() + " - " + next.getMessage(); if(validationErrorsCollectorList != null) { @@ -201,22 +106,23 @@ public JsonObject bundlesValidationResult(JsonObject bundlePayload) { } public JsonObjectBuilder validateBundle(JsonValue singleBundle) { - log.info("Now validating incoming sign and upload bundle:\n" + + log.info("Now validating incoming sign and upload bundle."); + log.fine("Bundle for Validation:\n" + singleBundle.toString()); JsonObjectBuilder singleBundleResults = Json.createObjectBuilder(); String bundleJson = singleBundle.toString(); List<String> errorsList = new ArrayList<>(1); if (!validateResource(bundleJson, - true, errorsList).isSuccessful()) { + true, errorsList).isValid()) { JsonArrayBuilder errorsJson = Json.createArrayBuilder(); errorsList.stream().forEach(s -> errorsJson.add(s)); singleBundleResults.add("errors", errorsJson); singleBundleResults.add("valid", false); } else { singleBundleResults.add("valid", true); - log.info("Validation for the following incoming sign and " + - "upload bundle passed:\n" + + log.info("Validation passed."); + log.fine("Valid incoming sign and upload bundle:\n" + singleBundle.toString()); } return singleBundleResults; diff --git a/src/main/java/health/ere/ps/validation/fhir/context/support/ErePrePopulatedValidationSupport.java b/src/main/java/health/ere/ps/validation/fhir/context/support/ErePrePopulatedValidationSupport.java index daa1196d5..8b510ffe8 100644 --- a/src/main/java/health/ere/ps/validation/fhir/context/support/ErePrePopulatedValidationSupport.java +++ b/src/main/java/health/ere/ps/validation/fhir/context/support/ErePrePopulatedValidationSupport.java @@ -11,6 +11,7 @@ import java.util.List; import java.util.logging.Logger; +import health.ere.ps.service.fhir.FHIRService; import org.apache.commons.lang3.StringUtils; import org.eclipse.microprofile.config.ConfigProvider; import org.hl7.fhir.common.hapi.validation.support.PrePopulatedValidationSupport; @@ -28,8 +29,10 @@ public class ErePrePopulatedValidationSupport extends PrePopulatedValidationSupp private static final List<EreLogger.SystemContext> systemContextList = List.of( EreLogger.SystemContext.KbvBundleValidator, EreLogger.SystemContext.KbvBundleValidatorConfiguration); - private IParser xmlParser = FhirContext.forR4().newXmlParser(); - private IParser jsonParser = FhirContext.forR4().newJsonParser(); + + private static final FhirContext fhirContext = FHIRService.getFhirContext(); + private static final IParser xmlParser = fhirContext.newXmlParser(); + private static final IParser jsonParser = fhirContext.newJsonParser(); private static Logger log = Logger.getLogger(ErePrePopulatedValidationSupport.class.getName()); protected enum ConfigType { diff --git a/src/main/java/health/ere/ps/vau/VAU.java b/src/main/java/health/ere/ps/vau/VAU.java index 5d279a8a7..6e65804e4 100644 --- a/src/main/java/health/ere/ps/vau/VAU.java +++ b/src/main/java/health/ere/ps/vau/VAU.java @@ -21,11 +21,11 @@ import java.util.TimeZone; import java.util.logging.Logger; -import javax.xml.bind.DatatypeConverter; +import jakarta.xml.ws.Holder; +import jakarta.xml.bind.DatatypeConverter; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.ws.Holder; import org.bouncycastle.asn1.ASN1ObjectIdentifier; import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers; @@ -67,6 +67,7 @@ public class VAU { private static final Logger log = Logger.getLogger(VAU.class.getName()); static X9ECParameters x9EC = org.bouncycastle.asn1.x9.ECNamedCurveTable .getByOID(new ASN1ObjectIdentifier(TeleTrusTObjectIdentifiers.brainpoolP256r1.getId())); + static X509Certificate z; static { Security.addProvider(new BouncyCastleProvider()); @@ -152,10 +153,14 @@ private KeyPair generateNewECDHKey() throws NoSuchAlgorithmException, NoSuchProv KeyCoords getVauPublicKeyXY() throws CertificateException, IOException, NoSuchProviderException { CertificateFactory certFactory = CertificateFactory.getInstance("X.509", BouncyCastleProvider.PROVIDER_NAME); - X509Certificate z = (X509Certificate) certFactory - .generateCertificate(new URL(fachdienstUrl + "/VAUCertificate").openStream()); - if(certificateService != null) { - verifyCertificate(z); + synchronized(this) { + if(z == null) { + z = (X509Certificate) certFactory + .generateCertificate(new URL(fachdienstUrl + "/VAUCertificate").openStream()); + if(certificateService != null) { + verifyCertificate(z); + } + } } BCECPublicKey x = (BCECPublicKey) z.getPublicKey(); diff --git a/src/main/java/health/ere/ps/vau/VAUEngine.java b/src/main/java/health/ere/ps/vau/VAUEngine.java index 33093a2db..1bb35ee2c 100644 --- a/src/main/java/health/ere/ps/vau/VAUEngine.java +++ b/src/main/java/health/ere/ps/vau/VAUEngine.java @@ -11,10 +11,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.ws.rs.client.Invocation; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Response; - import org.apache.http.HttpEntity; import org.apache.http.HttpException; import org.apache.http.HttpResponse; @@ -36,6 +32,10 @@ import org.jboss.resteasy.client.jaxrs.internal.ClientResponse; import org.jboss.resteasy.client.jaxrs.internal.FinalizedClientResponse; +import jakarta.ws.rs.client.Invocation; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.core.Response; + /** * Engine for RestEasy inspired by the Gematik implementation of VAU: * https://github.com/gematik/ref-ePA-vauchannel/blob/master/vauchannel-cxf/src/main/java/de/gematik/ti/vauchannel/cxf/AESInterceptor.java @@ -48,10 +48,10 @@ public class VAUEngine extends ApacheHttpClient43Engine { private static final String responsePattern = "1 ([A-Fa-f0-9]{32}) (.*?)\r?\n\r?\n(.*)"; private static final Pattern RESPONSE_PATTERN = Pattern.compile(responsePattern, Pattern.DOTALL); private final String fachdienstUrl; - String requestid; + ThreadLocal<String> requestidThreadLocal = new ThreadLocal<>(); String userpseudonym = "0"; private VAU vau; - private byte[] aeskey; + private ThreadLocal<byte[]> aeskeyThreadLocal = new ThreadLocal<>(); public VAUEngine(String fachdienstUrl) { this.fachdienstUrl = fachdienstUrl; @@ -122,8 +122,10 @@ protected HttpEntity buildEntity(final ClientInvocation request) throws IOExcept } String bearer = authorization.substring(7); - requestid = VAU.byteArrayToHexString(vau.getRandom(16)).toLowerCase(); - aeskey = vau.getRandom(16); + String requestid = VAU.byteArrayToHexString(vau.getRandom(16)).toLowerCase(); + requestidThreadLocal.set(requestid); + byte[] aeskey = vau.getRandom(16); + aeskeyThreadLocal.set(aeskey); String aeskeyString = VAU.byteArrayToHexString(aeskey).toLowerCase(); String p = "1 " + bearer + " " + requestid + " " + aeskeyString + " " + content; @@ -179,6 +181,7 @@ public Response invoke(Invocation inv) { log.fine(VAU.byteArrayToHexString(responseBytes)); if(Response.Status.Family.SUCCESSFUL == response.getStatusInfo().getFamily()) { // if it is successful + byte[] aeskey = aeskeyThreadLocal.get(); transportedData = VAU.decryptWithKey(responseBytes, aeskey); if(!userpseudonym.equals(response.getHeaderString("userpseudonym")) && response.getHeaderString("userpseudonym") != null) { userpseudonym = response.getHeaderString("userpseudonym"); @@ -193,6 +196,7 @@ public Response invoke(Invocation inv) { if(responseBytes != null) { log.info("VAU Response Bytes: "+VAU.byteArrayToHexString(responseBytes)); } + byte[] aeskey = aeskeyThreadLocal.get(); if(aeskey != null) { log.info("VAU AES Key: "+VAU.byteArrayToHexString(aeskey)); } @@ -207,6 +211,7 @@ HttpResponse extractHttpResponse(String responseContent) throws IOException, Htt } String requestIdFromResponse = m.group(1); + String requestid = requestidThreadLocal.get(); if (!requestIdFromResponse.equals(requestid)) { throw new RuntimeException("requestIdFromResponse (" + requestIdFromResponse + ") does not match requestid (" + requestid + ")"); } diff --git a/src/main/java/health/ere/ps/websocket/ExceptionWithReplyToExcetion.java b/src/main/java/health/ere/ps/websocket/ExceptionWithReplyToException.java similarity index 79% rename from src/main/java/health/ere/ps/websocket/ExceptionWithReplyToExcetion.java rename to src/main/java/health/ere/ps/websocket/ExceptionWithReplyToException.java index 3522641f0..2c2416ce8 100644 --- a/src/main/java/health/ere/ps/websocket/ExceptionWithReplyToExcetion.java +++ b/src/main/java/health/ere/ps/websocket/ExceptionWithReplyToException.java @@ -1,14 +1,14 @@ package health.ere.ps.websocket; -import javax.websocket.Session; +import jakarta.websocket.Session; -public class ExceptionWithReplyToExcetion extends Exception { +public class ExceptionWithReplyToException extends Exception { protected Exception exception; protected Session replyTo; protected String messageId; - public ExceptionWithReplyToExcetion(Exception exception, Session replyTo, String messageId) { + public ExceptionWithReplyToException(Exception exception, Session replyTo, String messageId) { this.exception = exception; this.replyTo = replyTo; this.messageId = messageId; diff --git a/src/main/java/health/ere/ps/websocket/Websocket.java b/src/main/java/health/ere/ps/websocket/Websocket.java index 7e371cedd..3aef796ed 100644 --- a/src/main/java/health/ere/ps/websocket/Websocket.java +++ b/src/main/java/health/ere/ps/websocket/Websocket.java @@ -17,23 +17,23 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.Event; -import javax.enterprise.event.ObservesAsync; -import javax.enterprise.inject.Instance; -import javax.inject.Inject; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.bind.Jsonb; -import javax.json.bind.JsonbBuilder; -import javax.json.bind.JsonbConfig; -import javax.websocket.OnClose; -import javax.websocket.OnError; -import javax.websocket.OnMessage; -import javax.websocket.OnOpen; -import javax.websocket.Session; -import javax.websocket.server.ServerEndpoint; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.Event; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.enterprise.inject.Instance; +import jakarta.inject.Inject; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.json.bind.Jsonb; +import jakarta.json.bind.JsonbBuilder; +import jakarta.json.bind.JsonbConfig; +import jakarta.websocket.OnClose; +import jakarta.websocket.OnError; +import jakarta.websocket.OnMessage; +import jakarta.websocket.OnOpen; +import jakarta.websocket.Session; +import jakarta.websocket.server.ServerEndpoint; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.hl7.fhir.r4.model.Bundle; @@ -80,6 +80,7 @@ import health.ere.ps.model.config.UserConfigurations; import health.ere.ps.model.websocket.OutgoingPayload; import health.ere.ps.service.config.UserConfigurationService; +import health.ere.ps.service.fhir.FHIRService; import health.ere.ps.service.fhir.XmlPrescriptionProcessor; import health.ere.ps.service.fhir.bundle.EreBundle; import health.ere.ps.service.logging.EreLogger; @@ -164,7 +165,7 @@ public class Websocket { public static Jsonb jsonbFactory = JsonbBuilder.create(customConfig); private static final EreLogger ereLog = EreLogger.getLogger(Websocket.class); - private final FhirContext ctx = FhirContext.forR4(); + private final FhirContext fhirContext = FHIRService.getFhirContext(); private final static Set<Session> sessions = new CopyOnWriteArraySet<>(); @OnOpen @@ -176,36 +177,36 @@ public void onOpen(Session session) { void sendAllKBVExamples(String folder, Session senderSession) { if(folder.equals("../src/test/resources/kbv-zip")) { try { - Bundle bundle = ctx.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF01.xml")); + Bundle bundle = fhirContext.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF01.xml")); bundle.setId(UUID.randomUUID().toString()); onFhirBundle(new BundlesEvent(Collections.singletonList(bundle), senderSession, "")); - bundle = ctx.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF02.xml")); + bundle = fhirContext.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF02.xml")); bundle.setId(UUID.randomUUID().toString()); onFhirBundle(new BundlesEvent(Collections.singletonList(bundle), senderSession, "")); - Bundle bundle03 = ctx.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF03.xml")); + Bundle bundle03 = fhirContext.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF03.xml")); bundle03.setId(UUID.randomUUID().toString()); - Bundle bundle04 = ctx.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF04.xml")); + Bundle bundle04 = fhirContext.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF04.xml")); bundle04.setId(UUID.randomUUID().toString()); - Bundle bundle05 = ctx.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF05.xml")); + Bundle bundle05 = fhirContext.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF05.xml")); bundle05.setId(UUID.randomUUID().toString()); onFhirBundle(new BundlesEvent(Arrays.asList(bundle03, bundle04, bundle05), senderSession, "")); - bundle = ctx.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF07.xml")); + bundle = fhirContext.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF07.xml")); bundle.setId(UUID.randomUUID().toString()); onFhirBundle(new BundlesEvent(Collections.singletonList(bundle), senderSession, "")); - Bundle bundle08_1 = ctx.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF08_1.xml")); + Bundle bundle08_1 = fhirContext.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF08_1.xml")); bundle08_1.setId(UUID.randomUUID().toString()); - Bundle bundle08_2 = ctx.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF08_2.xml")); + Bundle bundle08_2 = fhirContext.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF08_2.xml")); bundle08_2.setId(UUID.randomUUID().toString()); - Bundle bundle08_3 = ctx.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF08_3.xml")); + Bundle bundle08_3 = fhirContext.newXmlParser().parseResource(Bundle.class, getXmlString(folder + "/PF08_3.xml")); bundle08_3.setId(UUID.randomUUID().toString()); onFhirBundle(new BundlesEvent(Arrays.asList(bundle08_1, bundle08_2, bundle08_3), senderSession, "")); @@ -219,7 +220,7 @@ void sendAllKBVExamples(String folder, Session senderSession) { .forEach(f -> { try (InputStream inputStream = new FileInputStream(f.toFile())) { String xml = new String(inputStream.readAllBytes(), "UTF-8").replaceAll("<!--.*-->", ""); - Bundle bundle = ctx.newXmlParser().parseResource(Bundle.class, xml); + Bundle bundle = fhirContext.newXmlParser().parseResource(Bundle.class, xml); bundle.setId(UUID.randomUUID().toString()); onFhirBundle(new BundlesEvent(Collections.singletonList(bundle))); } catch (IOException ex) { @@ -253,7 +254,8 @@ public void onError(Session session, Throwable throwable) { @OnMessage public void onMessage(String message, Session senderSession) { - ereLog.info("Message: " + message); + ereLog.info("Message received."); + ereLog.trace("Message received: " + message); if(message == null) { ereLog.warn("null given as message"); return; @@ -276,10 +278,12 @@ public void onMessage(String message, Session senderSession) { } else if ("XMLBundle".equals(object.getString("type"))) { Bundle[] bundles = XmlPrescriptionProcessor.parseFromString(object.getString("payload")); if(appConfig.getXmlBundleDirectProcess()) { - SignAndUploadBundlesEvent event = new SignAndUploadBundlesEvent(bundles, senderSession, messageId); + SignAndUploadBundlesEvent event = new SignAndUploadBundlesEvent(bundles, object, senderSession, messageId); signAndUploadBundlesEvent.fireAsync(event); } onFhirBundle(new BundlesEvent(Arrays.asList(bundles), null, messageId)); + } else if ("PreviewOnly".equals(object.getString("type"))) { // todo: not final access-code and eRz-Id in here, just a preview! + readyToSignBundlesEvent.fireAsync(new ReadyToSignBundlesEvent(object, senderSession, messageId)); } else if ("AbortTasks".equals(object.getString("type"))) { abortTasksEvent.fireAsync(new AbortTasksEvent(object, senderSession, messageId)); } else if ("ErixaEvent".equals(object.getString("type"))) { @@ -342,7 +346,7 @@ public void onMessage(String message, Session senderSession) { } } catch(Exception ex) { ereLog.warn("Could not process message", ex); - onException(new ExceptionWithReplyToExcetion(ex, senderSession, messageId)); + onException(new ExceptionWithReplyToException(ex, senderSession, messageId)); } } @@ -539,7 +543,8 @@ String generateJson(GetPinStatusResponseEvent getPinStatusResponseEvent) { public void onERezeptDocuments(@ObservesAsync ERezeptWithDocumentsEvent eRezeptDocumentsEvent) { String jsonPayload = generateJson(eRezeptDocumentsEvent); - ereLog.info("Sending prescription receipt payload to front-end: " + + ereLog.info("Sending prescription receipt payload to front-end."); + ereLog.trace("Receipt Payload: " + jsonPayload); Set<Session> localSessions = new HashSet<>(); @@ -576,11 +581,11 @@ String generateJson(BundlesEvent bundlesEvent) { bundlesEvent.getBundles().forEach(bundle -> { if (bundle instanceof EreBundle) { - ereLog.info("Filled bundle json template result shown below. Null value place" + - " holders present."); - ereLog.info("=============================================="); + ereLog.info("Filled bundle json template."); + ereLog.trace("Result shown below. Null value place holders present."); + ereLog.trace("=============================================="); - ereLog.info(((EreBundle) bundle).encodeToJson()); + ereLog.trace(((EreBundle) bundle).encodeToJson()); } }); @@ -590,7 +595,7 @@ String generateJson(BundlesEvent bundlesEvent) { .collect(Collectors.joining(",\n", "[", "]")); } else { return bundlesEvent.getBundles().stream().map(bundle -> - ctx.newJsonParser().encodeResourceToString(bundle)) + fhirContext.newJsonParser().encodeResourceToString(bundle)) .collect(Collectors.joining(",\n", "[", "]")); } } @@ -603,8 +608,8 @@ public void onException(@ObservesAsync Exception exceptionParam) { String replyToMessageIdFromException = null; // only send the exception to the session that provoked it - if(exceptionParam instanceof ExceptionWithReplyToExcetion) { - ExceptionWithReplyToExcetion exceptionWithReplyToExcetion = (ExceptionWithReplyToExcetion) exceptionParam; + if(exceptionParam instanceof ExceptionWithReplyToException) { + ExceptionWithReplyToException exceptionWithReplyToExcetion = (ExceptionWithReplyToException) exceptionParam; localSessions = new HashSet<>(); if(exceptionWithReplyToExcetion.getReplyTo() != null) { localSessions.add(exceptionWithReplyToExcetion.getReplyTo()); diff --git a/src/main/java/health/ere/ps/websocket/encoder/ResponseEventEncoder.java b/src/main/java/health/ere/ps/websocket/encoder/ResponseEventEncoder.java index 3a6f52c0b..b9a87d585 100644 --- a/src/main/java/health/ere/ps/websocket/encoder/ResponseEventEncoder.java +++ b/src/main/java/health/ere/ps/websocket/encoder/ResponseEventEncoder.java @@ -2,9 +2,9 @@ import java.io.Serializable; -import javax.websocket.EncodeException; -import javax.websocket.Encoder; -import javax.websocket.EndpointConfig; +import jakarta.websocket.EncodeException; +import jakarta.websocket.Encoder; +import jakarta.websocket.EndpointConfig; import health.ere.ps.event.ReplyableEvent; import health.ere.ps.websocket.Websocket; diff --git a/src/main/resources/META-INF/resources/frontend b/src/main/resources/META-INF/resources/frontend index 4ebebf5f9..b75f779ce 160000 --- a/src/main/resources/META-INF/resources/frontend +++ b/src/main/resources/META-INF/resources/frontend @@ -1 +1 @@ -Subproject commit 4ebebf5f90735dda58d14ced17969ba5c49e0eb0 +Subproject commit b75f779ce02d8dc9f429a83518ab1042e837bf37 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e1498715b..70fd0b9f5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -14,10 +14,11 @@ quarkus.http.ssl.certificate.key-store-password=password quarkus.http.host=0.0.0.0 quarkus.websocket.max-frame-size=10485760 -## Watcher directory ## -directory-watcher.dir=${ERE_DIRECTORY_WATCHER_DIR:watch-pdf} +# Needed for LDAP search in VZD +quarkus.naming.enable-jndi=true + # KBV Validator Configuration files # -kbv.validator.config.dir=${ERE_KBV_VALIDATOR_CONFIG_DIR:../KBV_FHIR_eRP_V1_1_0} +kbv.validator.config.dir=${ERE_KBV_VALIDATOR_CONFIG_DIR:KBV_FHIR_eRP_V1_1_0} # Can be replaced by the configuration kbv.pruefnummer=ere.health @@ -40,27 +41,44 @@ ere.websocket.erezeptdocuments.reply-to-all=true # This flag will send a message directly to the fachdienst ere.websocket.xml-bundle.direct-process=true +## Logging ## +quarkus.log.level=INFO -## Console Logging ## -quarkus.log.console.level=INFO -quarkus.log.console.color=false - -#quarkus.log.category."org.apache.http".level=DEBUG -#quarkus.log.category."org.apache.http.wire".level=DEBUG -#quarkus.log.category."sun.net.www.protocol.http.HttpURLConnection".level=DEBUG -#quarkus.log.category."org.apache.fop".level=DEBUG +### Console Logging ### +quarkus.log.console.enable=true +quarkus.log.console.json=false -## File Logging ## +### File Logging ### quarkus.log.file.enable=true +quarkus.log.file.json=true +quarkus.log.file.path=logs/quarkus.log quarkus.log.file.rotation.rotate-on-boot=false quarkus.log.file.rotation.max-file-size=10M quarkus.log.file.rotation.max-backup-index=2 quarkus.log.file.rotation.file-suffix=yyyy-MM-dd +### Quarkus min log levels +# Note that quarkus has by default a minimum log level of debug and might optimize away logger calls +# to more verbose levels like TRACE at buildtime! So if we want to be able to enable trace logging of +# soap request/response at runtime, we must prepare being able to do this at buildtime here. +# See: https://quarkus.io/guides/logging#configure-the-log-level-category-and-format +quarkus.log.category."com.sun.xml.ws.transport.http.client.HttpTransportPipe".min-level=TRACE +quarkus.log.category."com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe".min-level=TRACE +quarkus.log.category."com.sun.xml.ws.transport.http.HttpAdapter".min-level=TRACE +quarkus.log.category."com.sun.xml.internal.ws.transport.http.HttpAdapter".min-level=TRACE + +### customized log levels +#quarkus.log.category."org.apache.http".level=DEBUG +#quarkus.log.category."org.apache.http.wire".level=DEBUG +#quarkus.log.category."sun.net.www.protocol.http.HttpURLConnection".level=DEBUG +#quarkus.log.category."org.apache.fop".level=DEBUG + +quarkus.console.color=false + # Make sure that 302 status codes are not handled as errors # This only happens in the main threads of the web application # but not in asynchronous worker threads -resteasy.original.webapplicationexception.behavior=true +resteasy.original.webapplicationexception.behavior=true ## Development Profile for quarkus:dev ## @@ -70,18 +88,20 @@ resteasy.original.webapplicationexception.behavior=true %dev.connector.mandant-id=ps_erp_incentergy_01 %dev.connector.workplace-id=CATS %dev.connector.client-system-id=ps_erp_incentergy_01_HBA -%dev.connector.user-id=42401d57-15fc-458f-9079-79f6052abad9 +%dev.connector.user-id= %dev.connector.verify-hostname=false %dev.idp.client.id=gematikTestPs %dev.idp.auth.request.redirect.url=http://test-ps.gematik.de/erezept %dev.idp.auth.request.url=https://idp.erezept-instanz1.titus.gematik.solutions:443/sign_response %dev.idp.base.url=https://idp-ref.app.ti-dienste.de -%dev.connector.cert.auth.store.file=../src/test/resources/certs/ps_erp_incentergy_01.p12 +%dev.idp.initialization.retries.seconds=3,6,12,24,48 +%dev.idp.initialization.period.seconds=180 +%dev.connector.cert.auth.store.file=src/test/resources/certs/ps_erp_incentergy_01.p12 %dev.connector.cert.auth.store.file.password=00 -%dev.quarkus.http.ssl.certificate.key-store-file=../src/main/resources/META-INF/resources/server.keystore +%dev.quarkus.http.ssl.certificate.key-store-file=src/main/resources/META-INF/resources/server.keystore # KBV Validator Config # -%dev.kbv.validator.config.dir=../KBV_FHIR_eRP_V1_1_0 +%dev.kbv.validator.config.dir=KBV_FHIR_eRP_V1_1_0 ## Development Profile for quarkus:dev ## %noconfig.ere.workflow-service.prescription.server.url=https://fd.erezept-instanz1.titus.gematik.solutions @@ -90,17 +110,19 @@ resteasy.original.webapplicationexception.behavior=true %noconfig.connector.mandant-id=M %noconfig.connector.workplace-id=W %noconfig.connector.client-system-id=C -%noconfig.connector.user-id=U +%noconfig.connector.user-id= %noconfig.connector.verify-hostname=false %noconfig.idp.client.id=gematikTestPs %noconfig.idp.auth.request.redirect.url=http://test-ps.gematik.de/erezept %noconfig.idp.auth.request.url=https://idp.erezept-instanz1.titus.gematik.solutions:443/sign_response %noconfig.idp.base.url=https://idp.erezept-instanz1.titus.gematik.solutions/auth/realms/idp +%noconfig.idp.initialization.retries.seconds=3,6,12,24,48 +%noconfig.idp.initialization.period.seconds=180 %noconfig.connector.cert.auth.store.file= %noconfig.connector.cert.auth.store.file.password= # KBV Validator Config # -%noconfig.kbv.validator.config.dir=../KBV_FHIR_eRP_V1_1_0 +%noconfig.kbv.validator.config.dir=KBV_FHIR_eRP_V1_1_0 ## Referenzumgebung [staging] Profile ## %RU.ere.workflow-service.prescription.server.url=https://erp-ref.zentral.erp.splitdns.ti-dienste.de @@ -109,17 +131,49 @@ resteasy.original.webapplicationexception.behavior=true %RU.connector.mandant-id=Incentergy %RU.connector.workplace-id=1786_A1 %RU.connector.client-system-id=Incentergy -%RU.connector.user-id=42401d57-15fc-458f-9079-79f6052abad9 +%RU.connector.user-id= %RU.connector.verify-hostname=false %RU.idp.client.id=GEMIncenereSud1PErUR %RU.idp.auth.request.redirect.url=https://ere.health/redirect_uri %RU.idp.auth.request.url=https://idp-ref.zentral.idp.splitdns.ti-dienste.de/sign_response %RU.idp.base.url=https://idp-ref.zentral.idp.splitdns.ti-dienste.de/ +%RU.idp.initialization.retries.seconds=3,6,12,24,48 +%RU.idp.initialization.period.seconds=180 + +%RU.konnektor.subscription.renew.cron=0/5 * * * * ? +%RU.quarkus.arc.test.disable-application-lifecycle-observers=true +%RU.quarkus.scheduler.enabled=false + # Enable this for test cases # %RU.ere-workflow-service.vau.enable=true # %RU.quarkus.http.ssl.certificate.key-store-file=src/main/resources/META-INF/resources/server.keystore # %RU.kbv.validator.config.dir=KBV_FHIR_eRP_V1_0_2 +## Kops-RU Profile ## +%kops.ere.workflow-service.prescription.server.url=https://erp-ref.zentral.erp.splitdns.ti-dienste.de +%kops.connector.base-uri=https://127.0.0.1:443 +%kops.connector.version=PTV3 +%kops.connector.mandant-id=Mandant1 +%kops.connector.workplace-id=Workplace1 +%kops.connector.client-system-id=ClientID1 +%kops.connector.user-id= +%kops.connector.verify-hostname=false +%kops.idp.client.id=GEMIncenereSud1PErUR +%kops.idp.auth.request.redirect.url=https://ere.health/redirect_uri +%kops.idp.auth.request.url=https://idp-ref.zentral.idp.splitdns.ti-dienste.de/sign_response +%kops.idp.base.url=https://idp-ref.zentral.idp.splitdns.ti-dienste.de/ +%kops.idp.initialization.retries.seconds=3,6,12,24,48 +%kops.idp.initialization.period.seconds=180 +%kops.connector.cert.auth.store.file=src/test/resources/certs/generated-truststore.p12 +%kops.connector.cert.auth.store.file.password=123456 + + +# Enable this for test cases +# %RU.ere-workflow-service.vau.enable=true +# %RU.quarkus.http.ssl.certificate.key-store-file=src/main/resources/META-INF/resources/server.keystore +# %RU.kbv.validator.config.dir=KBV_FHIR_eRP_V1_0_2 + + ## Referenzumgebung [staging] Profile ## %RUDev.ere.workflow-service.prescription.server.url=https://erp-dev.zentral.erp.splitdns.ti-dienste.de @@ -128,12 +182,14 @@ resteasy.original.webapplicationexception.behavior=true %RUDev.connector.mandant-id=Incentergy %RUDev.connector.workplace-id=1786_A1 %RUDev.connector.client-system-id=Incentergy -%RUDev.connector.user-id=42401d57-15fc-458f-9079-79f6052abad9 +%RUDev.connector.user-id= %RUDev.connector.verify-hostname=false %RUDev.idp.client.id=GEMIncenereSud1PErUR %RUDev.idp.auth.request.redirect.url=https://ere.health/redirect_uri %RUDev.idp.auth.request.url=https://idp-ref.zentral.idp.splitdns.ti-dienste.de/sign_response %RUDev.idp.base.url=https://idp-ref.zentral.idp.splitdns.ti-dienste.de/ +%RUDev.idp.initialization.retries.seconds=3,6,12,24,48 +%RUDev.idp.initialization.period.seconds=180 # Enable this for test cases # %RU.kbv.validator.config.dir=KBV_FHIR_eRP_V1_1_0 @@ -144,12 +200,14 @@ resteasy.original.webapplicationexception.behavior=true %PU.connector.mandant-id=Incentergy %PU.connector.workplace-id=1786_A1 %PU.connector.client-system-id=Incentergy -%PU.connector.user-id=42401d57-15fc-458f-9079-79f6052abad9 +%PU.connector.user-id= %PU.connector.verify-hostname=false %PU.idp.client.id=GEMIncenereS2QmFN83P %PU.idp.auth.request.redirect.url=https://ere.health/redirect_uri %PU.idp.auth.request.url=https://idp.zentral.idp.splitdns.ti-dienste.de/sign_response %PU.idp.base.url=https://idp.zentral.idp.splitdns.ti-dienste.de +%PU.idp.initialization.retries.seconds=3,6,12,24,48 +%PU.idp.initialization.period.seconds=180 %PU.quarkus.http.ssl.certificate.key-store-file=server.keystore %PU.kbv.validator.config.dir=KBV_FHIR_eRP_V1_1_0 %PU.quarkus.http.ssl.certificate.key-store-password=password @@ -161,12 +219,14 @@ resteasy.original.webapplicationexception.behavior=true %PU-dev.connector.mandant-id=Incentergy %PU-dev.connector.workplace-id=1786_A1 %PU-dev.connector.client-system-id=Incentergy -%PU-dev.connector.user-id=42401d57-15fc-458f-9079-79f6052abad9 +%PU-dev.connector.user-id= %PU-dev.connector.verify-hostname=false %PU-dev.idp.client.id=GEMIncenereS2QmFN83P %PU-dev.idp.auth.request.redirect.url=https://ere.health/redirect_uri %PU-dev.idp.auth.request.url=https://idp.zentral.idp.splitdns.ti-dienste.de/sign_response %PU-dev.idp.base.url=https://idp.zentral.idp.splitdns.ti-dienste.de +%PU-dev.idp.initialization.retries.seconds=3,6,12,24,48 +%PU-dev.idp.initialization.period.seconds=180 ## Titus Profile for unit test cases ## @@ -176,11 +236,13 @@ resteasy.original.webapplicationexception.behavior=true %titus.connector.mandant-id=ps_erp_incentergy_01 %titus.connector.workplace-id=CATS %titus.connector.client-system-id=ps_erp_incentergy_01_HBA -%titus.connector.user-id=42401d57-15fc-458f-9079-79f6052abad9 +%titus.connector.user-id= %titus.idp.client.id=gematikTestPs %titus.idp.auth.request.redirect.url=http://test-ps.gematik.de/erezept %titus.idp.auth.request.url=https://idp.erezept-instanz1.titus.gematik.solutions:443/sign_response %titus.idp.base.url=https://idp-ref.app.ti-dienste.de +%titus.idp.initialization.retries.seconds=3,6,12,24,48 +%titus.idp.initialization.period.seconds=180 %titus.connector.cert.auth.store.file=src/test/resources/certs/ps_erp_incentergy_01.p12 %titus.connector.cert.auth.store.file.password=00 %titus.ere-workflow-service.vau.enable=true @@ -206,6 +268,7 @@ ere-workflow-service.user-agent=ere.health/1.0.0 IncentergyGmbH/gematikTestPs connector.crypt=RSA connector.tvMode=NONE connector.verify-hostname=false +connector.base.url=https://192.168.178.42 connector.cert.auth.store.file=${ERE_CONNECTOR_TLS_CERT_TRUST_STORE_FILE:} connector.cert.auth.store.file.password=${ERE_CONNECTOR_TLS_CERT_TRUST_STORE_PWD:} diff --git a/src/main/resources/fop/ERezeptTemplate.xsl b/src/main/resources/fop/ERezeptTemplate.xsl index dc70f69d9..d531138ff 100644 --- a/src/main/resources/fop/ERezeptTemplate.xsl +++ b/src/main/resources/fop/ERezeptTemplate.xsl @@ -23,13 +23,13 @@ <fo:layout-master-set> <fo:simple-page-master master-name="DIN-A5" column-count="2" page-width="210mm" page-height="148mm" - margin-top="5mm" margin-bottom="5mm" - margin-left="8mm" margin-right="5mm"> + margin-top="5mm" margin-bottom="0mm" + margin-left="10mm" margin-right="5mm"> <fo:region-body region-name="body" margin-top="60mm" margin-bottom="0mm" - margin-left="2mm" margin-right="5mm"/> - <fo:region-before region-name="header" extent="55mm"/> - <fo:region-after region-name="footer" extent="50mm"/> + margin-left="2mm" margin-right="5mm" /> + <fo:region-before region-name="header" extent="70mm" /> + <fo:region-after region-name="footer" extent="50mm" /> </fo:simple-page-master> </fo:layout-master-set> <fo:declarations> @@ -78,30 +78,30 @@ <xsl:template name="footer"> <fo:block text-align="end"> - <fo:external-graphic content-height="41mm" content-width="scale-to-fit" + <fo:external-graphic content-height="40mm" content-width="scale-to-fit" src="classpath:/fop/img/erezept-app-note.svg"/> </fo:block> </xsl:template> <xsl:template name="header"> <fo:table> - <fo:table-column column-number="1" column-width="70%"/> + <fo:table-column column-number="1" column-width="69%"/> <fo:table-column column-number="2" column-width="2%"/> - <fo:table-column column-number="3" column-width="28%"/> + <fo:table-column column-number="3" column-width="29%"/> <fo:table-body> <fo:table-cell> - <fo:table border-separation="1mm" fox:border-radius="3mm" + <fo:table border-separation="1mm" border-collapse="separate"> <fo:table-body> <fo:table-row height="5mm"> <fo:table-cell number-columns-spanned="2"> - <fo:block font-family="Liberation Sans" font-weight="bold" font-size="12pt"> + <fo:block font-family="Liberation Sans" font-weight="bold" font-size="13pt" margin-bottom="1mm"> Ausdruck zur Einlösung Ihres E-Rezeptes </fo:block> </fo:table-cell> </fo:table-row> <fo:table-row> - <fo:table-cell number-columns-spanned="2" fox:border-radius="1mm" + <fo:table-cell number-columns-spanned="2" fox:border-radius="2mm" border="solid 0.5pt black"> <fo:table> <fo:table-column/> @@ -171,7 +171,7 @@ </fo:table-cell> </fo:table-row> <fo:table-row> - <fo:table-cell number-columns-spanned="2" fox:border-radius="1mm" + <fo:table-cell number-columns-spanned="2" fox:border-radius="2mm" border="solid 0.5pt black"> <fo:table> <fo:table-column/> @@ -249,14 +249,14 @@ </fo:table> </fo:table-cell> <fo:table-cell display-align="after"> - <fo:block-container reference-orientation="90" margin-left="1mm"> + <fo:block-container reference-orientation="90" margin-left="2mm"> <fo:block font-size="6pt" font-family="Liberation Sans" font-weight="bold" wrap-option="no-wrap"> Sammelcode zur Einlösung aller Verordnungen </fo:block> </fo:block-container> </fo:table-cell> <fo:table-cell display-align="after"> - <fo:block margin-left="2.5mm"> + <fo:block margin-left="3mm"> <fo:instream-foreign-object> <barcode:barcode> <xsl:attribute name="message"><xsl:variable name="bundles" select="fhir:bundle"/>{"urls":[<xsl:for-each select="fhir:bundle"><xsl:variable name="qrPos" select="position()"/><xsl:variable name="bundlesCount" select="count($bundles)"/>"Task/<xsl:value-of @@ -277,12 +277,12 @@ <xsl:template name="body"> <fo:table table-layout="fixed" width="190mm"> - <fo:table-column column-number="1" column-width="51%"/> - <fo:table-column column-number="2" column-width="49%"/> + <fo:table-column column-number="1" column-width="50%"/> + <fo:table-column column-number="2" column-width="50%"/> <fo:table-body> <xsl:for-each select="fhir:bundle"> <xsl:variable name="pos" select="position()"/> - <fo:table-cell> + <fo:table-cell margin-bottom="2mm"> <xsl:if test="not(($pos mod 3) mod 2) or not(($pos mod 3) mod 3)"> <xsl:attribute name="ends-row">true</xsl:attribute> </xsl:if> @@ -290,7 +290,7 @@ <fo:table-column/> <fo:table-column/> <fo:table-body> - <fo:table-row height="35mm"> + <fo:table-row height="40mm"> <fo:table-cell width="31mm"> <fo:block> <fo:instream-foreign-object> @@ -306,7 +306,7 @@ </fo:block> </fo:table-cell> <fo:table-cell> - <fo:block margin-top="3mm" margin-right="3mm"> + <fo:block margin-top="3mm" margin-right="3mm" margin-left="1mm"> <xsl:if test="fhir:Bundle/fhir:entry/fhir:resource/fhir:MedicationRequest/fhir:extension[@url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription']/fhir:extension[@url='Kennzeichen']/fhir:valueBoolean/@value = 'true' or string-length(fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:code/fhir:text/@value) > 40 or string-length(fhir:Bundle/fhir:entry/fhir:resource/fhir:MedicationRequest/fhir:dosageInstruction/fhir:text/@value) > 10"> <xsl:attribute name="font-size">10pt</xsl:attribute> </xsl:if> @@ -343,28 +343,36 @@ </xsl:if> <xsl:if test="starts-with(string(fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:meta/fhir:profile/@value), 'https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_Ingredient')"> <xsl:value-of - select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:ingredient/fhir:itemCodeableConcept/fhir:text/@value"/> / <xsl:value-of + select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:ingredient/fhir:itemCodeableConcept/fhir:text/@value"/><xsl:text> </xsl:text><xsl:value-of select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:ingredient/fhir:strength/fhir:numerator/fhir:value/@value"/><xsl:text> </xsl:text><xsl:value-of - select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:ingredient/fhir:strength/fhir:numerator/fhir:unit/@value"/> / <xsl:value-of - select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:form/fhir:text/@value"/> + select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:ingredient/fhir:strength/fhir:numerator/fhir:unit/@value"/><xsl:text> </xsl:text><xsl:value-of + select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:form/fhir:text/@value"/> + </xsl:if> <xsl:if test="starts-with(string(fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:meta/fhir:profile/@value), 'https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_Compounding')"> <xsl:value-of - select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:code/fhir:text/@value"/> - <xsl:value-of - select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:numerator/fhir:value/@value"/><xsl:text> </xsl:text><xsl:value-of - select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:numerator/fhir:unit/@value"/> <xsl:value-of - select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:form/fhir:text/@value"/> + select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:code/fhir:text/@value"/><!-- 123 --> </xsl:if> - <xsl:if test="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:amount/fhir:numerator/fhir:value/@value > 0"> + <xsl:if test="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:amount/fhir:numerator/fhir:value/@value != '0' or fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:amount/fhir:numerator/fhir:extension/fhir:valueString/@value != '0'"> + <xsl:if test="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:code/fhir:coding/fhir:code/@value = 'rezeptur'"> + <fo:block /><xsl:value-of + select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:amount/fhir:numerator/fhir:extension/fhir:valueString/@value"/><!-- 124 --><xsl:text> </xsl:text><xsl:value-of + select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:amount/fhir:numerator/fhir:unit/@value"/><!-- 125 --> + <fo:block /> + <xsl:value-of + select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:form/fhir:text/@value"/><!-- 104 --> + </xsl:if> + <xsl:if test="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:code/fhir:coding/fhir:code/@value != 'rezeptur'"> <xsl:text> / </xsl:text><xsl:value-of - select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:amount/fhir:numerator/fhir:value/@value" /> - <xsl:text> </xsl:text><xsl:value-of - select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:amount/fhir:numerator/fhir:unit/@value"/> + select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:amount/fhir:numerator/fhir:value/@value" /><xsl:value-of + select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:amount/fhir:numerator/fhir:extension/fhir:valueString/@value"/><xsl:text> </xsl:text><xsl:value-of + select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:amount/fhir:numerator/fhir:unit/@value"/> + </xsl:if> + </xsl:if> <xsl:if test="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:extension[@url='http://fhir.de/StructureDefinition/normgroesse']"> - <xsl:text> / </xsl:text> + <xsl:text> </xsl:text> <xsl:value-of select="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:extension[@url='http://fhir.de/StructureDefinition/normgroesse']/fhir:valueCode/@value"/> </xsl:if> @@ -372,6 +380,8 @@ <fo:block> <xsl:value-of select="fhir:Bundle/fhir:entry/fhir:resource/fhir:MedicationRequest/fhir:dosageInstruction/fhir:text/@value"/> + <xsl:value-of + select="fhir:Bundle/fhir:entry/fhir:resource/fhir:MedicationRequest/fhir:dosageInstruction/fhir:patientInstruction/@value"/><!-- 128 --> </fo:block> <xsl:if test="fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:code/fhir:coding/fhir:code/@value != 'freitext' and fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:code/fhir:coding/fhir:code/@value != 'wirkstoff' and fhir:Bundle/fhir:entry/fhir:resource/fhir:Medication/fhir:code/fhir:coding/fhir:code/@value != 'rezeptur'"> <fo:block> diff --git a/src/main/resources/fop/img/erezept-app-note.svg b/src/main/resources/fop/img/erezept-app-note.svg index d5d10cce7..6bb1e81a7 100644 --- a/src/main/resources/fop/img/erezept-app-note.svg +++ b/src/main/resources/fop/img/erezept-app-note.svg @@ -20,7 +20,7 @@ xml:space="preserve" id="svg384" sodipodi:docname="erezept-app-note.svg" - inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"><metadata id="metadata388"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview @@ -32,14 +32,14 @@ guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:window-width="1853" - inkscape:window-height="1025" + inkscape:window-width="1848" + inkscape:window-height="1016" id="namedview386" showgrid="false" - inkscape:zoom="7.239" - inkscape:cx="122.66888" - inkscape:cy="75.590551" - inkscape:window-x="67" + inkscape:zoom="3.6195" + inkscape:cx="122.21163" + inkscape:cy="57.908551" + inkscape:window-x="72" inkscape:window-y="27" inkscape:window-maximized="1" inkscape:current-layer="g376" /> @@ -585,51 +585,50 @@ id="g376"> <g class="com.sun.star.drawing.ClosedBezierShape" - id="g219"> + id="g219" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id3"> <rect class="BoundingBox" - stroke="none" - fill="none" x="201" y="815" width="9241" height="2895" - id="rect214" /> + id="rect214" + style="fill:none;stroke:none" /> <path - fill="none" - stroke="rgb(0,0,0)" - stroke-width="70" - stroke-linejoin="miter" - d="M 4822,850 L 9170,850 C 9300,850 9406,955 9406,1085 L 9406,3438 C 9406,3568 9300,3673 9170,3673 L 472,3673 C 342,3673 237,3568 237,3438 L 237,1085 C 237,955 342,850 472,850 L 4822,850 Z" - id="path216" /> + d="m 4822,850 h 4348 c 130,0 236,105 236,235 v 2353 c 0,130 -106,235 -236,235 H 472 C 342,3673 237,3568 237,3438 V 1085 C 237,955 342,850 472,850 Z" + id="path216" + style="fill:none;stroke:#000000;stroke-width:26.45833206;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + inkscape:connector-curvature="0" /> </g> </g> <g class="com.sun.star.drawing.ClosedBezierShape" - id="g226"> + id="g226" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id4"> <rect class="BoundingBox" - stroke="none" - fill="none" x="1383" y="1224" width="6046" height="1226" - id="rect221" /> + id="rect221" + style="fill:none;stroke:none" /> <path - fill="rgb(255,255,255)" - stroke="none" - d="M 6935,2394 C 6900,2429 6852,2449 6802,2449 L 6705,2448 1571,2449 C 1521,2449 1473,2429 1438,2394 1403,2358 1383,2311 1383,2261 L 1383,1413 C 1383,1364 1403,1316 1438,1280 1473,1244 1521,1224 1571,1224 L 6705,1224 6830,1224 C 6880,1224 6928,1244 6963,1280 L 7373,1690 C 7408,1725 7428,1773 7428,1823 7428,1873 7408,1921 7373,1956 L 6935,2394 Z" - id="path223" /> + d="m 6935,2394 c -35,35 -83,55 -133,55 l -97,-1 -5134,1 c -50,0 -98,-20 -133,-55 -35,-36 -55,-83 -55,-133 v -848 c 0,-49 20,-97 55,-133 35,-36 83,-56 133,-56 h 5134 125 c 50,0 98,20 133,56 l 410,410 c 35,35 55,83 55,133 0,50 -20,98 -55,133 z" + id="path223" + inkscape:connector-curvature="0" + style="fill:#ffffff;stroke:none" /> </g> </g> <g class="com.sun.star.drawing.ClosedBezierShape" - id="g233"> + id="g233" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id5"> <rect @@ -639,53 +638,51 @@ width="6153" height="1332" id="rect228" - stroke="none" - fill="none" /> + style="fill:none;stroke:none" /> <path - d="M 6947,2409 C 6909,2447 6857,2469 6802,2469 L 6705,2468 1571,2468 C 1516,2468 1464,2447 1426,2408 1387,2369 1365,2317 1365,2263 L 1365,1414 C 1365,1360 1387,1308 1426,1269 1464,1230 1516,1209 1571,1209 L 6705,1209 6830,1209 C 6885,1209 6937,1230 6976,1269 L 7386,1680 C 7424,1718 7446,1771 7446,1825 7446,1880 7424,1932 7386,1970 L 6947,2409 Z" + d="m 6947,2409 c -38,38 -90,60 -145,60 l -97,-1 H 1571 c -55,0 -107,-21 -145,-60 -39,-39 -61,-91 -61,-145 v -849 c 0,-54 22,-106 61,-145 38,-39 90,-60 145,-60 h 5134 125 c 55,0 107,21 146,60 l 410,411 c 38,38 60,91 60,145 0,55 -22,107 -60,145 z" id="path230" - stroke-linejoin="miter" - stroke-width="70" - stroke="rgb(0,0,0)" - fill="none" /> + style="fill:none;stroke:#000000;stroke-width:26.45833206;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + inkscape:connector-curvature="0" /> </g> </g> <g class="com.sun.star.drawing.TextShape" - id="g246"> + id="g246" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id6"> <rect class="BoundingBox" - stroke="none" - fill="none" x="489" y="2637" width="15001" height="1035" - id="rect235" /> + id="rect235" + style="fill:none;stroke:none" /> <text class="TextShape" id="text243"><tspan class="TextParagraph" - font-family="Liberation Sans" font-size="265px" font-weight="400" - id="tspan241"><tspan + id="tspan241" + style="font-weight:400;font-size:265px;font-family:'Liberation Sans'"><tspan class="TextPosition" x="489" y="2883" id="tspan239"><tspan - fill="rgb(0,0,0)" - stroke="none" - id="tspan237">Die Voraussetzungen und weitere Informationen finden Sie </tspan></tspan></tspan></text> + id="tspan237" + style="fill:#000000;stroke:none">Die Voraussetzungen und weitere Informationen finden Sie </tspan></tspan></tspan></text> + + </g> </g> <g class="com.sun.star.drawing.PolyPolygonShape" id="g253" - transform="matrix(0.8749116,0,0,1,43.994408,0)"> + transform="matrix(0.87068688,0,0,0.98717554,183.64143,-98.222528)"> <g id="id7"> <rect @@ -705,232 +702,238 @@ </g> <g class="com.sun.star.drawing.TextShape" - id="g266"> + id="g266" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id8"> <rect class="BoundingBox" - stroke="none" - fill="none" x="489" y="2920" width="28475" height="1035" - id="rect255" /> + id="rect255" + style="fill:none;stroke:none" /> <text class="TextShape" id="text263"><tspan class="TextParagraph" - font-family="Liberation Sans" font-size="265px" font-weight="400" - id="tspan261"><tspan + id="tspan261" + style="font-weight:400;font-size:265px;font-family:'Liberation Sans'"><tspan class="TextPosition" x="489" y="3166" id="tspan259"><tspan - fill="rgb(0,0,0)" - stroke="none" - id="tspan257">online auf www.das-e-rezept-fuer-deutschland.de und </tspan></tspan></tspan></text> + id="tspan257" + style="fill:#000000;stroke:none">online auf www.das-e-rezept-fuer-deutschland.de und </tspan></tspan></tspan></text> + + </g> </g> <g class="com.sun.star.drawing.TextShape" - id="g279"> + id="g279" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id9"> <rect class="BoundingBox" - stroke="none" - fill="none" x="489" y="3203" width="15001" height="1035" - id="rect268" /> + id="rect268" + style="fill:none;stroke:none" /> <text class="TextShape" id="text276"><tspan class="TextParagraph" - font-family="Liberation Sans" font-size="265px" font-weight="400" - id="tspan274"><tspan + id="tspan274" + style="font-weight:400;font-size:265px;font-family:'Liberation Sans'"><tspan class="TextPosition" x="489" y="3449" id="tspan272"><tspan - fill="rgb(0,0,0)" - stroke="none" - id="tspan270">bei der technischen Hotline 0800 277 377 7</tspan></tspan></tspan></text> + id="tspan270" + style="fill:#000000;stroke:none">bei der technischen Hotline 0800 277 377 7</tspan></tspan></tspan></text> + + </g> </g> <g class="com.sun.star.drawing.TextShape" - id="g292"> + id="g292" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id10"> <rect class="BoundingBox" - stroke="none" - fill="none" x="5680" y="3166" width="400" height="1145" - id="rect281" /> + id="rect281" + style="fill:none;stroke:none" /> <text class="TextShape" id="text289"><tspan class="TextParagraph" - font-family="Verdana, sans-serif" font-size="282px" font-weight="400" - id="tspan287"><tspan + id="tspan287" + style="font-weight:400;font-size:282px;font-family:Verdana, sans-serif"><tspan class="TextPosition" x="5680" y="3450" id="tspan285"><tspan - fill="rgb(0,0,0)" - stroke="none" - id="tspan283"> </tspan></tspan></tspan></text> + id="tspan283" + style="fill:#000000;stroke:none"> </tspan></tspan></tspan></text> + + </g> </g> <g class="com.sun.star.drawing.TextShape" - id="g305"> + id="g305" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id11"> <rect class="BoundingBox" - stroke="none" - fill="none" x="9566" y="-7659" width="949" height="11346" - id="rect294" /> + id="rect294" + style="fill:none;stroke:none" /> <text class="TextShape" - transform="translate(9761,3679) rotate(-90) translate(-9761,-3679)" + transform="rotate(-90,9761,3679)" id="text302"><tspan class="TextParagraph" - font-family="Liberation Sans" font-size="212px" font-weight="400" - id="tspan300"><tspan + id="tspan300" + style="font-weight:400;font-size:212px;font-family:'Liberation Sans'"><tspan class="TextPosition" x="9761" y="3679" id="tspan298"><tspan - fill="rgb(0,0,0)" - stroke="none" - id="tspan296">Tokenausdruck DIN A5 (4.2021)</tspan></tspan></tspan></text> + id="tspan296" + style="fill:#000000;stroke:none">Tokenausdruck DIN A5 (7.2023)</tspan></tspan></tspan></text> + + </g> </g> <g class="com.sun.star.drawing.TextShape" - id="g318"> + id="g318" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id12"> <rect class="BoundingBox" - stroke="none" - fill="none" x="2074" y="1327" width="13925" height="1102" - id="rect307" /> + id="rect307" + style="fill:none;stroke:none" /> <text class="TextShape" id="text315"><tspan class="TextParagraph" - font-family="Liberation Sans" font-size="282px" font-weight="700" - id="tspan313"><tspan + id="tspan313" + style="font-weight:700;font-size:282px;font-family:'Liberation Sans'"><tspan class="TextPosition" x="2074" y="1589" id="tspan311"><tspan - fill="rgb(0,0,0)" - stroke="none" - id="tspan309">Die App zum E-Rezept </tspan></tspan></tspan></text> + id="tspan309" + style="fill:#000000;stroke:none">Die App zum E-Rezept </tspan></tspan></tspan></text> + + </g> </g> <g class="com.sun.star.drawing.TextShape" - id="g331"> + id="g331" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id13"> <rect class="BoundingBox" - stroke="none" - fill="none" x="2074" y="1610" width="15001" height="1102" - id="rect320" /> + id="rect320" + style="fill:none;stroke:none" /> <text class="TextShape" id="text328"><tspan class="TextParagraph" - font-family="Liberation Sans" font-size="282px" font-weight="700" - id="tspan326"><tspan + id="tspan326" + style="font-weight:700;font-size:282px;font-family:'Liberation Sans'"><tspan class="TextPosition" x="2074" y="1872" id="tspan324"><tspan - fill="rgb(0,0,0)" - stroke="none" - id="tspan322">Einfach – Schnell – Flexibel </tspan></tspan></tspan></text> + id="tspan322" + style="fill:#000000;stroke:none">Einfach – Schnell – Flexibel </tspan></tspan></tspan></text> + + </g> </g> <g class="com.sun.star.drawing.ClosedBezierShape" - id="g338"> + id="g338" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id14"> <rect class="BoundingBox" - stroke="none" - fill="none" x="504" y="1115" width="1357" height="1436" - id="rect333" /> + id="rect333" + style="fill:none;stroke:none" /> <path - fill="rgb(255,255,255)" - stroke="none" - d="M 1183,1115 L 1643,1115 C 1763,1115 1860,1213 1860,1333 L 1860,2333 C 1860,2453 1763,2550 1643,2550 L 723,2550 C 603,2550 505,2453 505,2333 L 505,1333 C 505,1213 603,1115 723,1115 L 1183,1115 Z" - id="path335" /> + d="m 1183,1115 h 460 c 120,0 217,98 217,218 v 1000 c 0,120 -97,217 -217,217 H 723 c -120,0 -218,-97 -218,-217 V 1333 c 0,-120 98,-218 218,-218 z" + id="path335" + inkscape:connector-curvature="0" + style="fill:#ffffff;stroke:none" /> </g> </g> <g class="Graphic" - id="g346"> + id="g346" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="g344"> <rect class="BoundingBox" - stroke="none" - fill="none" x="662" y="1291" width="1045" height="1148" - id="rect340" /> + id="rect340" + style="fill:none;stroke:none" /> <image x="662" y="1291" @@ -943,41 +946,39 @@ </g> <g class="com.sun.star.drawing.ClosedBezierShape" - id="g353"> + id="g353" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id15"> <rect class="BoundingBox" - stroke="none" - fill="none" x="454" y="1062" width="1462" height="1542" - id="rect348" /> + id="rect348" + style="fill:none;stroke:none" /> <path - fill="none" - stroke="rgb(0,0,0)" - stroke-width="70" - stroke-linejoin="miter" - d="M 1184,1097 L 1645,1097 C 1775,1097 1880,1202 1880,1332 L 1880,2332 C 1880,2461 1775,2567 1645,2567 L 725,2567 C 595,2567 490,2461 490,2332 L 490,1332 C 490,1202 595,1097 725,1097 L 1184,1097 Z" - id="path350" /> + d="m 1184,1097 h 461 c 130,0 235,105 235,235 v 1000 c 0,129 -105,235 -235,235 H 725 C 595,2567 490,2461 490,2332 V 1332 c 0,-130 105,-235 235,-235 z" + id="path350" + style="fill:none;stroke:#000000;stroke-width:26.45833206;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none" + inkscape:connector-curvature="0" /> </g> </g> <g class="Graphic" - id="g361"> + id="g361" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="g359"> <rect class="BoundingBox" - stroke="none" - fill="none" x="7681" y="1158" width="1472" height="1471" - id="rect355" /> + id="rect355" + style="fill:none;stroke:none" /> <image x="7681" y="1158" @@ -990,33 +991,34 @@ </g> <g class="com.sun.star.drawing.TextShape" - id="g374"> + id="g374" + transform="matrix(0.99517127,0,0,0.98717554,139.85946,-98.222528)"> <g id="id16"> <rect class="BoundingBox" - stroke="none" - fill="none" x="2074" y="1999" width="20199" height="1102" - id="rect363" /> + id="rect363" + style="fill:none;stroke:none" /> <text class="TextShape" id="text371"><tspan class="TextParagraph" - font-family="Liberation Sans" font-size="247px" font-weight="400" - id="tspan369"><tspan + id="tspan369" + style="font-weight:400;font-size:247px;font-family:'Liberation Sans'"><tspan class="TextPosition" x="2074" y="2228" id="tspan367"><tspan - fill="rgb(0,0,0)" - stroke="none" - id="tspan365">E-Rezepte jetzt papierlos empfangen</tspan></tspan></tspan></text> + id="tspan365" + style="fill:#000000;stroke:none">E-Rezepte jetzt papierlos empfangen</tspan></tspan></tspan></text> + + </g> </g> diff --git a/src/main/resources/fop/img/logo.svg b/src/main/resources/fop/img/logo.svg deleted file mode 100644 index 5c2bca471..000000000 --- a/src/main/resources/fop/img/logo.svg +++ /dev/null @@ -1,12 +0,0 @@ -<svg width="141" height="22" viewBox="0 0 141 22" fill="none" xmlns="http://www.w3.org/2000/svg"> -<path d="M69.8223 21.0623V0.399902H72.2484V12.0242C72.6395 11.3132 73.2171 10.7356 73.9814 10.2912C74.7457 9.82908 75.6433 9.59801 76.6742 9.59801C77.7051 9.59801 78.5494 9.90906 79.207 10.5312C79.8824 11.1355 80.2379 11.9264 80.2734 12.904V21.0623H77.7673V13.7572C77.7318 13.1706 77.5451 12.6907 77.2074 12.3175C76.8875 11.9442 76.3809 11.7487 75.6877 11.7309C75.0479 11.7309 74.4702 11.9175 73.9547 12.2908C73.4571 12.6463 73.0572 13.1351 72.755 13.7572C72.4528 14.3792 72.3018 15.0902 72.3018 15.89V21.0623H69.8223Z" fill="black"/> -<path d="M89.6778 21.3289C88.4336 21.3289 87.3494 21.0801 86.4251 20.5824C85.5186 20.067 84.8165 19.3649 84.3189 18.4762C83.839 17.5875 83.599 16.5832 83.599 15.4635C83.599 14.3793 83.8656 13.3928 84.3989 12.5041C84.9498 11.5976 85.6875 10.8866 86.6117 10.3712C87.5538 9.83796 88.5935 9.57135 89.7311 9.57135C91.1886 9.57135 92.3972 9.99793 93.357 10.8511C94.3168 11.7042 94.9745 12.8773 95.3299 14.3704L86.5851 17.4364C86.8872 17.9874 87.3138 18.4229 87.8648 18.7428C88.4158 19.045 89.0379 19.196 89.7311 19.196C90.2288 19.196 90.6998 19.1072 91.1441 18.9294C91.5885 18.7517 92.0151 18.5206 92.4239 18.2362L93.5703 20.0759C93.0015 20.4491 92.3705 20.7513 91.6774 20.9823C91.0019 21.2134 90.3354 21.3289 89.6778 21.3289ZM86.0518 15.3302C86.0341 15.5435 86.043 15.7479 86.0785 15.9434L92.5039 13.5705C92.255 13.0373 91.8906 12.5663 91.4107 12.1575C90.9486 11.7487 90.3265 11.5443 89.5445 11.5443C88.5313 11.5443 87.696 11.8998 87.0383 12.6107C86.3807 13.3217 86.0518 14.2282 86.0518 15.3302Z" fill="black"/> -<path d="M103.023 21.3289C101.974 21.3289 101.023 21.1068 100.17 20.6624C99.3344 20.218 98.6679 19.5693 98.1702 18.7161C97.6903 17.8452 97.4503 16.7876 97.4503 15.5435C97.4503 14.2993 97.6992 13.2328 98.1968 12.3441C98.7123 11.4554 99.3966 10.7711 100.25 10.2912C101.121 9.8113 102.072 9.57135 103.103 9.57135C104.098 9.57135 104.942 9.78464 105.635 10.2112C106.329 10.6378 106.871 11.1532 107.262 11.7576L107.448 10.0246H109.741V21.0623H107.262V19.2494C107.048 19.5337 106.737 19.8359 106.329 20.1558C105.937 20.4758 105.458 20.7513 104.889 20.9823C104.338 21.2134 103.716 21.3289 103.023 21.3289ZM103.689 19.276C104.596 19.276 105.369 19.0272 106.009 18.5295C106.648 18.0141 107.066 17.3209 107.262 16.4499V14.2637C107.048 13.4994 106.604 12.8685 105.929 12.3708C105.253 11.8731 104.48 11.6243 103.609 11.6243C102.934 11.6243 102.32 11.7842 101.769 12.1042C101.218 12.4241 100.774 12.8684 100.436 13.4372C100.116 14.006 99.9565 14.6636 99.9565 15.4101C99.9565 16.1389 100.125 16.7965 100.463 17.3831C100.801 17.9518 101.254 18.414 101.823 18.7695C102.392 19.1072 103.014 19.276 103.689 19.276Z" fill="black"/> -<path d="M114.058 0.399902H116.537V21.0623H114.058V0.399902Z" fill="black"/> -<path d="M121.92 5.17225H124.426V10.0513H127.439V12.0242H124.426V21.0623H121.92V12.0242H119.894V10.0513H121.92V5.17225Z" fill="black"/> -<path d="M130.461 21.0623V0.399902H132.887V12.0242C133.278 11.3132 133.856 10.7356 134.62 10.2912C135.384 9.82908 136.282 9.59801 137.313 9.59801C138.344 9.59801 139.188 9.90906 139.846 10.5312C140.521 11.1355 140.876 11.9264 140.912 12.904V21.0623H138.406V13.7572C138.37 13.1706 138.184 12.6907 137.846 12.3175C137.526 11.9442 137.019 11.7487 136.326 11.7309C135.686 11.7309 135.109 11.9175 134.593 12.2908C134.096 12.6463 133.696 13.1351 133.394 13.7572C133.091 14.3792 132.94 15.0902 132.94 15.89V21.0623H130.461Z" fill="black"/> -<path d="M7.55062 21.3821C6.12869 21.3821 4.92005 21.1155 3.9247 20.5823C2.94712 20.0491 2.20061 19.3114 1.68516 18.3694C1.16971 17.4274 0.911987 16.3432 0.911987 15.1167C0.911987 13.9437 1.21415 12.8861 1.81847 11.9441C2.42279 11.002 3.23151 10.2555 4.24464 9.70453C5.25776 9.13575 6.38642 8.85137 7.63061 8.85137C9.30137 8.85137 10.67 9.34016 11.7364 10.3177C12.8207 11.2775 13.5227 12.6728 13.8427 14.5035L5.31108 17.223C5.87985 17.8806 6.65303 18.2094 7.63061 18.2094C8.03941 18.2094 8.43044 18.1383 8.8037 17.9962C9.19473 17.854 9.57687 17.6673 9.95013 17.4363L11.6031 20.209C10.981 20.5645 10.3056 20.8489 9.57687 21.0622C8.86591 21.2755 8.19049 21.3821 7.55062 21.3821ZM4.59123 14.9035C4.59123 14.9923 4.59123 15.0723 4.59123 15.1434L9.71018 13.4104C9.55021 12.9661 9.29249 12.5839 8.937 12.264C8.58152 11.9263 8.0483 11.7574 7.33733 11.7574C6.50195 11.7574 5.83542 12.0418 5.33774 12.6106C4.84007 13.1794 4.59123 13.9437 4.59123 14.9035Z" fill="black"/> -<path d="M19.9143 9.41125L20.2076 12.0774C20.5453 11.402 21.0074 10.8243 21.594 10.3444C22.1805 9.84672 22.7582 9.47346 23.327 9.22462C23.8957 8.95801 24.3312 8.82471 24.6334 8.82471L24.4467 12.5573C23.5758 12.4506 22.8293 12.5928 22.2072 12.9839C21.5851 13.3749 21.1052 13.8903 20.7675 14.5302C20.4298 15.1701 20.2609 15.8277 20.2609 16.5031V21.0622H16.555V9.41125H19.9143Z" fill="black"/> -<path d="M32.7017 21.3821C31.2798 21.3821 30.0711 21.1155 29.0758 20.5823C28.0982 20.0491 27.3517 19.3114 26.8362 18.3694C26.3208 17.4274 26.0631 16.3432 26.0631 15.1167C26.0631 13.9437 26.3652 12.8861 26.9695 11.9441C27.5739 11.002 28.3826 10.2555 29.3957 9.70453C30.4088 9.13575 31.5375 8.85137 32.7817 8.85137C34.4524 8.85137 35.8211 9.34016 36.8875 10.3177C37.9717 11.2775 38.6738 12.6728 38.9937 14.5035L30.4622 17.223C31.0309 17.8806 31.8041 18.2094 32.7817 18.2094C33.1905 18.2094 33.5815 18.1383 33.9548 17.9962C34.3458 17.854 34.7279 17.6673 35.1012 17.4363L36.7542 20.209C36.1321 20.5645 35.4567 20.8489 34.7279 21.0622C34.017 21.2755 33.3416 21.3821 32.7017 21.3821ZM29.7423 14.9035C29.7423 14.9923 29.7423 15.0723 29.7423 15.1434L34.8613 13.4104C34.7013 12.9661 34.4436 12.5839 34.0881 12.264C33.7326 11.9263 33.1994 11.7574 32.4884 11.7574C31.653 11.7574 30.9865 12.0418 30.4888 12.6106C29.9911 13.1794 29.7423 13.9437 29.7423 14.9035Z" fill="black"/> -<path d="M58.7756 14.9525C58.7756 17.0999 57.0349 18.8406 54.8875 18.8406C52.7402 18.8406 50.9995 17.0999 50.9995 14.9525C50.9995 12.8052 52.7402 11.0645 54.8875 11.0645C57.0349 11.0645 58.7756 12.8052 58.7756 14.9525Z" fill="black"/> -</svg> diff --git a/src/test/java/health/ere/ps/config/RuntimeConfigTest.java b/src/test/java/health/ere/ps/config/RuntimeConfigTest.java index 67ca1c6da..4cc58c610 100644 --- a/src/test/java/health/ere/ps/config/RuntimeConfigTest.java +++ b/src/test/java/health/ere/ps/config/RuntimeConfigTest.java @@ -4,9 +4,10 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.util.Optional; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.junit.jupiter.api.Test; @@ -43,7 +44,7 @@ public void testUserConfig() { userConfig.defaultConnectorBaseURI = "2"; userConfig.defaultConnectorVersion = "3"; userConfig.defaultMandantId = "4"; - userConfig.defaultUserId = "5"; + userConfig.defaultUserId = Optional.of("5"); userConfig.defaultWorkplaceId = "6"; RuntimeConfig runtimeConfig = abortTasksEvent.getRuntimeConfig(); userConfig.updateProperties(new UserConfigurations()); diff --git a/src/test/java/health/ere/ps/config/UserConfigTest.java b/src/test/java/health/ere/ps/config/UserConfigTest.java new file mode 100644 index 000000000..bd68082ee --- /dev/null +++ b/src/test/java/health/ere/ps/config/UserConfigTest.java @@ -0,0 +1,56 @@ +package health.ere.ps.config; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import health.ere.ps.model.config.UserConfigurations; +import health.ere.ps.service.config.UserConfigurationService; + +public class UserConfigTest { + + private UserConfig userConfig; + + @BeforeEach + public void setup() { + UserConfigurationService mockConfigService = mock(UserConfigurationService.class); + UserConfigurations sampleConfig = createSampleConfig(); + // Mock UserConfigurationService + when(mockConfigService.getConfig()).thenReturn(sampleConfig); + + userConfig = new UserConfig(); + userConfig.configurationManagementService = mockConfigService; + userConfig.init(); + } + + @Test + public void testGetConfigurations() { + UserConfigurations configurations = userConfig.getConfigurations(); + assertEquals("https://example.com", configurations.getConnectorBaseURL()); + assertEquals("123456", configurations.getMandantId()); + // Add more assertions for other configuration properties + } + + @Test + public void testGetConnectorBaseURL() { + assertEquals("https://example.com", userConfig.getConnectorBaseURL()); + } + + @Test + public void testGetMandantId() { + assertEquals("123456", userConfig.getMandantId()); + } + + // Add more tests for other configuration properties as needed + + private UserConfigurations createSampleConfig() { + UserConfigurations config = new UserConfigurations(); + config.setConnectorBaseURL("https://example.com"); + config.setMandantId("123456"); + // Set other configuration properties as needed + return config; + } +} diff --git a/src/test/java/health/ere/ps/model/erixa/PrescriptionTransferEntryTest.java b/src/test/java/health/ere/ps/model/erixa/PrescriptionTransferEntryTest.java index fef0171dd..58d60c1cd 100644 --- a/src/test/java/health/ere/ps/model/erixa/PrescriptionTransferEntryTest.java +++ b/src/test/java/health/ere/ps/model/erixa/PrescriptionTransferEntryTest.java @@ -7,8 +7,8 @@ import java.text.ParseException; import java.text.SimpleDateFormat; -import javax.json.Json; -import javax.json.JsonObject; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; diff --git a/src/test/java/health/ere/ps/model/idp/client/token/IdpJweTest.java b/src/test/java/health/ere/ps/model/idp/client/token/IdpJweTest.java index 741a3a659..46595a50a 100644 --- a/src/test/java/health/ere/ps/model/idp/client/token/IdpJweTest.java +++ b/src/test/java/health/ere/ps/model/idp/client/token/IdpJweTest.java @@ -10,9 +10,9 @@ import java.util.Base64; import java.util.Map; -import javax.json.Json; -import javax.json.JsonObject; -import javax.json.JsonReader; +import jakarta.json.Json; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/src/test/java/health/ere/ps/model/ipp/IppPrinterTest.java b/src/test/java/health/ere/ps/model/ipp/IppPrinterTest.java deleted file mode 100644 index f46efb338..000000000 --- a/src/test/java/health/ere/ps/model/ipp/IppPrinterTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package health.ere.ps.model.ipp; - -import com.hp.jipp.encoding.Attribute; -import com.hp.jipp.model.JobState; -import com.hp.jipp.model.PrinterState; -import static com.hp.jipp.model.Types.*; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.net.URI; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -public class IppPrinterTest { - - private IppPrinter ippPrinter; - private final URI testUri = URI.create("http://localhost:8080"); - - - @BeforeEach - public void setUp() { - ippPrinter = new IppPrinter(); - } - - @Test - public void testGetPrinterAttributes() { - List<Attribute<?>> attributes = ippPrinter.getPrinterAttributes(testUri); - - // Expected URI attribute - Attribute<?> uriAttribute = attributes.stream().filter(attr -> attr.getType().equals(printerUriSupported)).findFirst().orElse(null); - assertNotNull(uriAttribute); - assertEquals(testUri, uriAttribute.get(0)); - - // Check if default printer attributes are present - assertTrue(attributes.contains(printerName.of(DefaultAttributes.PRINTER_NAME))); - assertEquals(PrinterState.idle, attributes.stream().filter(attr -> attr.getType().equals(printerState)).findFirst().get().get(0)); - } - - - @Test - public void testPrinterWithNoQueuedJobs() { - // all jobs are cleared from the queue or printer is set to a state with no jobs - List<Attribute<?>> attributes = ippPrinter.getPrinterAttributes(testUri); - Attribute<?> jobsAttribute = attributes.stream() - .filter(attr -> attr.getType().equals(queuedJobCount)) - .findFirst().orElse(null); - - assertNotNull(jobsAttribute); - assertEquals(0, (int) jobsAttribute.get(0)); - } - - @Test - public void testGetOperationAttributes() { - List<Attribute<?>> operationAttributes = ippPrinter.getOperationAttributes(); - assertEquals("utf-8", operationAttributes.stream().filter(attr -> attr.getType().equals(attributesCharset)).findFirst().get().get(0)); - assertEquals("en-us", operationAttributes.stream().filter(attr -> attr.getType().equals(attributesNaturalLanguage)).findFirst().get().get(0)); - } - - @Test - public void testGetJobAttributes() { - - List<Attribute<?>> jobAttributes = ippPrinter.getJobAttributes(testUri); - - // Check for incremented job ID in URI - URI expectedUri = URI.create(testUri + "/job/1"); - assertEquals(expectedUri, jobAttributes.stream().filter(attr -> attr.getType().equals(jobUri)).findFirst().get().get(0)); - assertEquals(JobState.pending, jobAttributes.stream().filter(attr -> attr.getType().equals(jobState)).findFirst().get().get(0)); - } - -} diff --git a/src/test/java/health/ere/ps/model/muster16/MedicationStringTest.java b/src/test/java/health/ere/ps/model/muster16/MedicationStringTest.java deleted file mode 100644 index c035ad698..000000000 --- a/src/test/java/health/ere/ps/model/muster16/MedicationStringTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package health.ere.ps.model.muster16; - -import javax.inject.Inject; -import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; - -public final class MedicationStringTest { - - @Inject - MedicationString medicationString = new MedicationString( - "name", - "size", - "form", - "dosage", - "instructions", - "pzn"); - - @Test - public void testMedicalStringObjectName() { - assertEquals(medicationString.getName(), "name", "Wrong name"); - } - - @Test - public void testMedicalStringObjectSize() { - assertEquals(medicationString.getSize(), "size", "Wrong size"); - } - - @Test - public void testMedicalStringObjectForm() { - assertEquals(medicationString.getForm(), "form", "Wrong form"); - } - - @Test - public void testMedicalStringObjectDosage() { - assertEquals(medicationString.getDosage(), "dosage", "Wrong dosage"); - } - - @Test - public void testMedicalStringObjectInstructions() { - assertEquals(medicationString.getInstructions(), "instructions", "Wrong instructions"); - } - - @Test - public void testMedicalStringObjectPzn() { - assertEquals(medicationString.getPzn(), "pzn", "Wrong PZN"); - } - -} diff --git a/src/test/java/health/ere/ps/resource/HttpIppClientTransport.java b/src/test/java/health/ere/ps/resource/HttpIppClientTransport.java index e2d6149c9..f9916cd31 100644 --- a/src/test/java/health/ere/ps/resource/HttpIppClientTransport.java +++ b/src/test/java/health/ere/ps/resource/HttpIppClientTransport.java @@ -11,7 +11,7 @@ import java.net.URI; import java.net.URL; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotNull; import com.hp.jipp.encoding.IppInputStream; import com.hp.jipp.trans.IppClientTransport; diff --git a/src/test/java/health/ere/ps/resource/JavaScriptTest.java b/src/test/java/health/ere/ps/resource/JavaScriptTest.java index 1a0b5d054..f18190b76 100644 --- a/src/test/java/health/ere/ps/resource/JavaScriptTest.java +++ b/src/test/java/health/ere/ps/resource/JavaScriptTest.java @@ -15,6 +15,8 @@ import org.junit.jupiter.api.Test; @Disabled +// @QuarkusTest +// @TestProfile(RUDevTestProfile.class) public class JavaScriptTest { public static String utilJavaScript = "var print = function (s) { java.lang.System.out.print(s); }; var println = function (s) { java.lang.System.out.println(s); };"; diff --git a/src/test/java/health/ere/ps/resource/gematik/ERezeptWorkflowResourceTest.java b/src/test/java/health/ere/ps/resource/gematik/ERezeptWorkflowResourceTest.java index 16c84a77a..6199d7296 100644 --- a/src/test/java/health/ere/ps/resource/gematik/ERezeptWorkflowResourceTest.java +++ b/src/test/java/health/ere/ps/resource/gematik/ERezeptWorkflowResourceTest.java @@ -1,20 +1,24 @@ package health.ere.ps.resource.gematik; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.Collections; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.junit.jupiter.api.Test; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import health.ere.ps.config.RuntimeConfig; +import health.ere.ps.config.UserConfig; +import health.ere.ps.service.gematik.ERezeptWorkflowService; public class ERezeptWorkflowResourceTest { @Test @@ -47,7 +51,7 @@ public Object answer(InvocationOnMock invocation) throws Throwable { }); ERezeptWorkflowResource eRezeptWorkflowResource = new ERezeptWorkflowResource(); eRezeptWorkflowResource.httpServletRequest = httpServletRequest; - RuntimeConfig runtimeConfig = ERezeptWorkflowResource.extractRuntimeConfigFromHeaders(httpServletRequest); + RuntimeConfig runtimeConfig = Extractors.extractRuntimeConfigFromHeaders(httpServletRequest, new UserConfig()); assertEquals("HBA-1", runtimeConfig.getEHBAHandle()); assertEquals("SMCB-1", runtimeConfig.getSMCBHandle()); @@ -64,4 +68,18 @@ public Object answer(InvocationOnMock invocation) throws Throwable { } + + @Test + public void testIdpToken() { + ERezeptWorkflowResource eRezeptWorkflowResource = new ERezeptWorkflowResource(); + eRezeptWorkflowResource.httpServletRequest = mock(HttpServletRequest.class); + when(eRezeptWorkflowResource.httpServletRequest.getHeaderNames()).thenReturn(Collections.enumeration(Collections.emptyList())); + eRezeptWorkflowResource.eRezeptWorkflowService = mock(ERezeptWorkflowService.class); + when(eRezeptWorkflowResource.eRezeptWorkflowService.getBearerToken(any())).thenReturn("123456"); + + String token = eRezeptWorkflowResource.idpToken(); + + assertEquals("123456", token); + verify(eRezeptWorkflowResource.eRezeptWorkflowService).requestNewAccessTokenIfNecessary(any(), any(), any()); + } } diff --git a/src/test/java/health/ere/ps/resource/xml/XmlPrescriptionResourceTest.java b/src/test/java/health/ere/ps/resource/xml/XmlPrescriptionResourceTest.java index 95fc7b93c..fad75590a 100644 --- a/src/test/java/health/ere/ps/resource/xml/XmlPrescriptionResourceTest.java +++ b/src/test/java/health/ere/ps/resource/xml/XmlPrescriptionResourceTest.java @@ -4,7 +4,7 @@ import java.nio.file.Files; import java.nio.file.Paths; -import javax.enterprise.event.Event; +import jakarta.enterprise.event.Event; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/src/test/java/health/ere/ps/retry/RetrierTest.java b/src/test/java/health/ere/ps/retry/RetrierTest.java new file mode 100644 index 000000000..3b16f02de --- /dev/null +++ b/src/test/java/health/ere/ps/retry/RetrierTest.java @@ -0,0 +1,24 @@ +package health.ere.ps.retry; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class RetrierTest { + + @Test + public void actionWasExecutedCorrectNumberOfTimes() { + RetryAction<Boolean> action = mock(RetryAction.class); + when(action.execute()).thenReturn(false); + long start = System.currentTimeMillis(); + Retrier.callAndRetry(List.of(1,1,2), 5000, action, bool -> bool); + long delta = System.currentTimeMillis() - start; + System.out.println("Took " + delta + "ms"); + verify(action, times(4)).execute(); + } +} \ No newline at end of file diff --git a/src/test/java/health/ere/ps/service/common/security/SecretsManagerServiceTest.java b/src/test/java/health/ere/ps/service/common/security/SecretsManagerServiceTest.java index ef1ad52e9..55fc3a90c 100644 --- a/src/test/java/health/ere/ps/service/common/security/SecretsManagerServiceTest.java +++ b/src/test/java/health/ere/ps/service/common/security/SecretsManagerServiceTest.java @@ -11,7 +11,7 @@ import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; -import javax.inject.Inject; +import jakarta.inject.Inject; import org.jboss.logging.Logger; import org.junit.jupiter.api.AfterEach; diff --git a/src/test/java/health/ere/ps/service/connector/SingleConnectorServicesProviderTest.java b/src/test/java/health/ere/ps/service/connector/SingleConnectorServicesProviderTest.java index 1ac095a94..541445418 100644 --- a/src/test/java/health/ere/ps/service/connector/SingleConnectorServicesProviderTest.java +++ b/src/test/java/health/ere/ps/service/connector/SingleConnectorServicesProviderTest.java @@ -39,7 +39,7 @@ public void testConstructorWithBaseUrl() { @Test public void testConstructorWithMultiKeyWithoutPassword() { - javax.enterprise.event.Event<Exception> exceptionEvent = mock(javax.enterprise.event.Event.class); + jakarta.enterprise.event.Event<Exception> exceptionEvent = mock(jakarta.enterprise.event.Event.class); UserConfig runtimeConfig = new RuntimeConfig(); runtimeConfig.getConfigurations().setClientCertificate(new File(keystoreFileName).toURI().toString()+"?alias=key2"); new SingleConnectorServicesProvider(runtimeConfig, exceptionEvent); @@ -48,7 +48,7 @@ public void testConstructorWithMultiKeyWithoutPassword() { @Test public void testConstructorWithMultiKeyWithPassword() { - javax.enterprise.event.Event<Exception> exceptionEvent = mock(javax.enterprise.event.Event.class); + jakarta.enterprise.event.Event<Exception> exceptionEvent = mock(jakarta.enterprise.event.Event.class); UserConfig runtimeConfig = new RuntimeConfig(); runtimeConfig.getConfigurations().setClientCertificate(new File(keystoreFileName).toURI().toString()+"?alias=key2"); runtimeConfig.getConfigurations().setClientCertificatePassword(keystoreFilePass); diff --git a/src/test/java/health/ere/ps/service/connector/auth/SmcbAuthenticatorServiceTest.java b/src/test/java/health/ere/ps/service/connector/auth/SmcbAuthenticatorServiceTest.java new file mode 100644 index 000000000..d92772c5a --- /dev/null +++ b/src/test/java/health/ere/ps/service/connector/auth/SmcbAuthenticatorServiceTest.java @@ -0,0 +1,84 @@ +package health.ere.ps.service.connector.auth; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Base64; + +import org.jose4j.lang.JoseException; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import de.gematik.ws.conn.authsignatureservice.wsdl.v7.AuthSignatureServicePortType; +import de.gematik.ws.conn.authsignatureservice.wsdl.v7.FaultMessage; +import de.gematik.ws.conn.signatureservice.v7.ExternalAuthenticate.OptionalInputs; +import health.ere.ps.service.connector.provider.MultiConnectorServicesProvider; +import jakarta.xml.ws.Holder; +import oasis.names.tc.dss._1_0.core.schema.Base64Signature; +import oasis.names.tc.dss._1_0.core.schema.SignatureObject; + +public class SmcbAuthenticatorServiceTest { + @Test + public void testConvert() throws JoseException { + String base64urlString = "MEUCIGYFXpGblxpAvUE21td5u33ahar2wsRiIgG_cu49QujlAiEAgWqy4Hyw43mXxuZLlfKk9DNlmnNq9DtZ2SSYREZGf7g"; + byte[] signature = Base64.getUrlDecoder().decode(base64urlString); + + byte[] signatureBytes = SmcbAuthenticatorService.convertDerECDSAtoConcated(signature); + assertEquals("ZgVekZuXGkC9QTbW13m7fdqFqvbCxGIiAb9y7j1C6OWBarLgfLDjeZfG5kuV8qT0M2Wac2r0O1nZJJhERkZ_uA==", Base64.getUrlEncoder().encodeToString(signatureBytes)); + } + + @Test + public void testConvert2() throws JoseException { + String base64urlString = "MEQCIB2LzMza9ecfq0pArrkRKmqIF3JLnDnLxyor/QflMytCAiAqykMJretmDiJbTk4/w0npgqEZO5LRrrM0nXUGLZ4HtQ=="; + byte[] signature = Base64.getDecoder().decode(base64urlString); + + byte[] signatureBytes = SmcbAuthenticatorService.convertDerECDSAtoConcated(signature); + assertEquals("HYvMzNr15x-rSkCuuREqaogXckucOcvHKiv9B-UzK0IqykMJretmDiJbTk4_w0npgqEZO5LRrrM0nXUGLZ4HtQ==", Base64.getUrlEncoder().encodeToString(signatureBytes)); + } + + @Test + public void testECC() throws JoseException, FaultMessage { + SmcbAuthenticatorService smcbAuthenticatorService = new SmcbAuthenticatorService(); + AuthSignatureServicePortType authSignatureServicePortType = mock(AuthSignatureServicePortType.class); + smcbAuthenticatorService.connectorServicesProvider = mock(MultiConnectorServicesProvider.class); + + doAnswer(new Answer<Void>() { + public Void answer(InvocationOnMock invocation) { + Object[] args = invocation.getArguments(); + Holder<SignatureObject> holder = (Holder) args[5]; + holder.value = new SignatureObject(); + Base64Signature base64Signature = new Base64Signature(); + String base64urlString = "MEQCIB2LzMza9ecfq0pArrkRKmqIF3JLnDnLxyor/QflMytCAiAqykMJretmDiJbTk4/w0npgqEZO5LRrrM0nXUGLZ4HtQ=="; + byte[] signature = Base64.getDecoder().decode(base64urlString); + base64Signature.setValue(signature); + holder.value.setBase64Signature(base64Signature); + return null; + } + }).when(authSignatureServicePortType).externalAuthenticate(any(), any(), any(), any(), any(), any()); + when(smcbAuthenticatorService.connectorServicesProvider.getAuthSignatureServicePortType(any())).thenReturn(authSignatureServicePortType); + + byte[] signatureBytes = smcbAuthenticatorService.externalAuthenticate(null, null, null, true); + + assertEquals("HYvMzNr15x-rSkCuuREqaogXckucOcvHKiv9B-UzK0IqykMJretmDiJbTk4_w0npgqEZO5LRrrM0nXUGLZ4HtQ==", Base64.getUrlEncoder().encodeToString(signatureBytes)); + + signatureBytes = smcbAuthenticatorService.externalAuthenticate(null, null, null, false); + + assertEquals("MEQCIB2LzMza9ecfq0pArrkRKmqIF3JLnDnLxyor_QflMytCAiAqykMJretmDiJbTk4_w0npgqEZO5LRrrM0nXUGLZ4HtQ==", Base64.getUrlEncoder().encodeToString(signatureBytes)); + + @SuppressWarnings("unchecked") + ArgumentCaptor<OptionalInputs> signatureObjectCaptor = ArgumentCaptor.forClass(OptionalInputs.class); + verify(authSignatureServicePortType, times(2)).externalAuthenticate(any(), any(), signatureObjectCaptor.capture(), any(), any(), any()); + assertEquals("urn:bsi:tr:03111:ecdsa", signatureObjectCaptor.getAllValues().get(0).getSignatureType()); + assertEquals("urn:ietf:rfc:3447", signatureObjectCaptor.getAllValues().get(1).getSignatureType()); + + } + + +} diff --git a/src/test/java/health/ere/ps/service/connector/cards/ConnectorCardsServiceTest.java b/src/test/java/health/ere/ps/service/connector/cards/ConnectorCardsServiceTest.java index 4e1e07a56..27cbf532b 100644 --- a/src/test/java/health/ere/ps/service/connector/cards/ConnectorCardsServiceTest.java +++ b/src/test/java/health/ere/ps/service/connector/cards/ConnectorCardsServiceTest.java @@ -1,6 +1,6 @@ package health.ere.ps.service.connector.cards; -import javax.inject.Inject; +import jakarta.inject.Inject; import org.apache.commons.lang3.StringUtils; import org.jboss.logging.Logger; diff --git a/src/test/java/health/ere/ps/service/connector/cards/ConnectorCardsServiceUnitTest.java b/src/test/java/health/ere/ps/service/connector/cards/ConnectorCardsServiceUnitTest.java new file mode 100644 index 000000000..13949de57 --- /dev/null +++ b/src/test/java/health/ere/ps/service/connector/cards/ConnectorCardsServiceUnitTest.java @@ -0,0 +1,36 @@ +package health.ere.ps.service.connector.cards; + +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.Test; + +import de.gematik.ws.conn.cardservice.wsdl.v8.CardServicePortType; +import de.gematik.ws.conn.cardservice.wsdl.v8.FaultMessage; +import de.gematik.ws.conn.connectorcontext.v2.ContextType; +import health.ere.ps.exception.connector.ConnectorCardsException; +import health.ere.ps.service.connector.provider.MultiConnectorServicesProvider; + +class ConnectorCardsServiceUnitTest { + + @Test + void testPinStatus() throws ConnectorCardsException { + ConnectorCardsService connectorCardsService = new ConnectorCardsService(); + + connectorCardsService.connectorServicesProvider = mock(MultiConnectorServicesProvider.class); + CardServicePortType mock = mock(CardServicePortType.class); + when(connectorCardsService.connectorServicesProvider.getCardServicePortType(any())).thenReturn(mock); + when(connectorCardsService.connectorServicesProvider.getContextType(any())).thenReturn(new ContextType()); + try { + connectorCardsService.getPinStatus(null, null, null); + verify(mock).getPinStatus(any(), any(), any(), any(), any(), any()); + } catch (FaultMessage e) { + fail(); + } + + } + +} \ No newline at end of file diff --git a/src/test/java/health/ere/ps/service/connector/certificate/CardCertificateReaderServiceTest.java b/src/test/java/health/ere/ps/service/connector/certificate/CardCertificateReaderServiceTest.java index 7afb6754b..a049d7e0e 100644 --- a/src/test/java/health/ere/ps/service/connector/certificate/CardCertificateReaderServiceTest.java +++ b/src/test/java/health/ere/ps/service/connector/certificate/CardCertificateReaderServiceTest.java @@ -5,7 +5,7 @@ import java.security.cert.X509Certificate; import java.util.logging.LogManager; -import javax.inject.Inject; +import jakarta.inject.Inject; import org.bouncycastle.crypto.CryptoException; import org.junit.jupiter.api.Assertions; diff --git a/src/test/java/health/ere/ps/service/connector/endpoint/EndpointDiscoveryServiceTest.java b/src/test/java/health/ere/ps/service/connector/endpoint/EndpointDiscoveryServiceTest.java index 453175ca8..157f43617 100644 --- a/src/test/java/health/ere/ps/service/connector/endpoint/EndpointDiscoveryServiceTest.java +++ b/src/test/java/health/ere/ps/service/connector/endpoint/EndpointDiscoveryServiceTest.java @@ -2,7 +2,7 @@ import java.util.logging.Logger; -import javax.inject.Inject; +import jakarta.inject.Inject; import org.junit.jupiter.api.Test; diff --git a/src/test/java/health/ere/ps/service/connector/provider/MultiConnectorServicesProviderTest.java b/src/test/java/health/ere/ps/service/connector/provider/MultiConnectorServicesProviderTest.java new file mode 100644 index 000000000..9d6148870 --- /dev/null +++ b/src/test/java/health/ere/ps/service/connector/provider/MultiConnectorServicesProviderTest.java @@ -0,0 +1,31 @@ +package health.ere.ps.service.connector.provider; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +import health.ere.ps.config.RuntimeConfig; + +public class MultiConnectorServicesProviderTest { + @Test + void testGetSignatureServicePortTypeV755() { + MultiConnectorServicesProvider multiConnectorServicesProvider = new MultiConnectorServicesProvider(); + RuntimeConfig runtimeConfig = new RuntimeConfig("eHBAHandle", "SMCBHandle"); + multiConnectorServicesProvider.getSignatureServicePortTypeV755(runtimeConfig); + runtimeConfig = new RuntimeConfig("eHBAHandle", "SMCBHandle"); + multiConnectorServicesProvider.getSignatureServicePortTypeV755(runtimeConfig); + assertEquals(1, multiConnectorServicesProvider.singleConnectorServicesProvider.size()); + + } + + @Test + void testGetSignatureServicePortTypeV7552() { + MultiConnectorServicesProvider multiConnectorServicesProvider = new MultiConnectorServicesProvider(); + RuntimeConfig runtimeConfig = new RuntimeConfig("eHBAHandle", "SMCBHandle"); + multiConnectorServicesProvider.getSignatureServicePortTypeV755(runtimeConfig); + runtimeConfig = new RuntimeConfig("adasd", "SMCBHandle"); + multiConnectorServicesProvider.getSignatureServicePortTypeV755(runtimeConfig); + assertEquals(2, multiConnectorServicesProvider.singleConnectorServicesProvider.size()); + + } +} diff --git a/src/test/java/health/ere/ps/service/extractor/SVGExtractorTest.java b/src/test/java/health/ere/ps/service/extractor/SVGExtractorTest.java index 250576993..b6da29736 100644 --- a/src/test/java/health/ere/ps/service/extractor/SVGExtractorTest.java +++ b/src/test/java/health/ere/ps/service/extractor/SVGExtractorTest.java @@ -27,6 +27,8 @@ class SVGExtractorTest { private String lineSep = System.lineSeparator(); + //todo: is this still in use? (ipp etc removed?) + @Disabled @Test void testExtractData_CGM_Z1() throws URISyntaxException, IOException, XMLStreamException { SVGExtractor svgExtractor = new SVGExtractor(CGM_Z1.configuration, true); diff --git a/src/test/java/health/ere/ps/service/fhir/bundle/ExtractionToBundleWorkflowTest.java b/src/test/java/health/ere/ps/service/fhir/bundle/ExtractionToBundleWorkflowTest.java deleted file mode 100644 index 74e3e96e3..000000000 --- a/src/test/java/health/ere/ps/service/fhir/bundle/ExtractionToBundleWorkflowTest.java +++ /dev/null @@ -1,235 +0,0 @@ -package health.ere.ps.service.fhir.bundle; - -import static health.ere.ps.service.extractor.TemplateProfile.CGM_TURBO_MED; -import static health.ere.ps.service.extractor.TemplateProfile.DENS; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import java.io.FileInputStream; -import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; -import java.util.stream.Collectors; - -import javax.xml.stream.XMLStreamException; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.hl7.fhir.r4.model.Base; -import org.hl7.fhir.r4.model.Bundle; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import health.ere.ps.model.muster16.Muster16PrescriptionForm; -import health.ere.ps.profile.TitusTestProfile; -import health.ere.ps.service.extractor.SVGExtractor; -import health.ere.ps.service.muster16.Muster16FormDataExtractorService; -import health.ere.ps.service.muster16.parser.rgxer.Muster16SvgRegexParser; -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.TestProfile; - -@QuarkusTest -@TestProfile(TitusTestProfile.class) -public class ExtractionToBundleWorkflowTest { - - private static final Logger log = Logger.getLogger(ExtractionToBundleWorkflowTest.class.getName()); - - @Test - @Disabled("Github doesn't have access to the secret repo, run this test manually") - public void extractionFromPdf_producesCorrectBundle_givenDensPdf() throws IOException, XMLStreamException { - // GIVEN - PDDocument testDocument = PDDocument.load( - new FileInputStream("../secret-test-print-samples/DENS-GmbH/DENSoffice - Rezept1.pdf")); - SVGExtractor svgExtractor = new SVGExtractor(DENS.configuration, false); - - // WHEN (simulates the extraction workflow from the extraction from the pdf to the creation of the bundle - // before we send it to the frontend through websocket without the events being fired) - Map<String, String> extractionResultsMap = svgExtractor.extract(testDocument); - - Muster16SvgRegexParser muster16Parser = new Muster16SvgRegexParser(extractionResultsMap); - Muster16PrescriptionForm muster16PrescriptionForm = Muster16FormDataExtractorService.fillForm(muster16Parser); - -// logExtractionResultsAndMuster16Form(extractionResultsMap, muster16PrescriptionForm); - - PrescriptionBundlesBuilder bundleBuilder = new PrescriptionBundlesBuilder(muster16PrescriptionForm); - List<Bundle> bundles = bundleBuilder.createBundles(); - - // THEN - bundles.forEach(bundle -> { - assertEquals("Berliner Str. 12", extractPatientAddress(bundle)); - assertEquals("14513", extractPatientPostCode(bundle)); - assertEquals("Teltow", extractPatientCity(bundle)); - assertEquals("1976-02-14", extractBirthDate(bundle)); - assertEquals("Dr.", extractPatientPrefix(bundle)); - assertEquals("Markus", extractPatientFirstName(bundle)); - assertEquals("Heckner", extractPatientLastName(bundle)); - assertEquals("3", extractPatientStatus(bundle)); - assertEquals("0", extractGebPfl(bundle)); - assertEquals("DENS", extractPractitionerFirstName(bundle)); - assertEquals("GmbH", extractPractitionerLastName(bundle)); - assertEquals("Berliner Str. 13", extractPractitionerAddress(bundle)); - assertEquals("Teltow", extractPractitionerCity(bundle)); - assertEquals("14513", extractPractitionerPostCode(bundle)); - assertEquals("03328334540", extractPractitionerPhoneNumber(bundle)); - assertEquals("03328334547", extractPractitionerFaxNumber(bundle)); - assertEquals("2021-04-29T00:00:00+07:00", extractAuthoredOn(bundle)); - }); - - assertEquals("Ibuprofen 600mg", extractMedicationName(bundles.get(0))); - assertEquals("Omeprazol 40 mg", extractMedicationName(bundles.get(1))); - assertEquals("Amoxicillin 1.000 mg", extractMedicationName(bundles.get(2))); - } - - - @Test - @Disabled("Github doesn't have access to the secret repo, run this test manually") - public void extractionFromPdf_producesCorrectBundle_givenCGMPdf() throws IOException, XMLStreamException { - // GIVEN - PDDocument testDocument = PDDocument.load( - new FileInputStream("../secret-test-print-samples/CGM-Turbomed/test1_no_number_in_practitioner_name.pdf")); - SVGExtractor svgExtractor = new SVGExtractor(CGM_TURBO_MED.configuration, false); - - // WHEN (simulates the extraction workflow from the extraction from the pdf to the creation of the bundle - // before we send it to the frontend through websocket without the events being fired) - Map<String, String> extractionResultsMap = svgExtractor.extract(testDocument); - - Muster16SvgRegexParser muster16Parser = new Muster16SvgRegexParser(extractionResultsMap); - Muster16PrescriptionForm muster16PrescriptionForm = Muster16FormDataExtractorService.fillForm(muster16Parser); - - PrescriptionBundlesBuilder bundleBuilder = new PrescriptionBundlesBuilder(muster16PrescriptionForm); - Bundle bundle = bundleBuilder.createBundles().get(0); - - // THEN - assertEquals("Maria Trost 21", extractPatientAddress(bundle)); - assertEquals("56070", extractPatientPostCode(bundle)); - assertEquals("Koblenz", extractPatientCity(bundle)); - assertEquals("1987-07-19", extractBirthDate(bundle)); - assertEquals("", extractPatientPrefix(bundle)); - assertEquals("Banholzer", extractPatientFirstName(bundle)); - assertEquals("Dominik", extractPatientLastName(bundle)); - assertEquals("5", extractPatientStatus(bundle)); - assertEquals("0", extractGebPfl(bundle)); - assertEquals("E-Reze pt", extractPractitionerFirstName(bundle)); - assertEquals("Testarzt", extractPractitionerLastName(bundle)); - assertEquals("Dr.", extractPractitionerPrefix(bundle)); - assertEquals("Neustraße 10", extractPractitionerAddress(bundle)); - assertEquals("Koblenz", extractPractitionerCity(bundle)); - assertEquals("56068", extractPractitionerPostCode(bundle)); - assertEquals("0261110110", extractPractitionerPhoneNumber(bundle)); - assertEquals("Novalgin AMP N1 5X2 ml", extractMedicationName(bundle)); - assertEquals("2021-04-30T00:00:00+07:00", extractAuthoredOn(bundle)); - } - - private String extractMedicationName(Bundle bundle) { - return getEntry(bundle, "Medication").getResource().getChildByName("code").getValues().get(0) - .getChildByName("text").getValues().get(0).primitiveValue(); - } - - private String extractPractitionerPrefix(Bundle bundle) { - List<Base> prefix = getEntry(bundle, "Practitioner").getResource().getChildByName("name").getValues().get(0) - .getChildByName("prefix").getValues(); - return (prefix.isEmpty()) ? "" : prefix.get(0).primitiveValue(); - } - - private String extractPractitionerFirstName(Bundle bundle) { - return getEntry(bundle, "Practitioner").getResource().getChildByName("name").getValues().get(0) - .getChildByName("given").getValues().get(0).primitiveValue(); - } - - private String extractPractitionerLastName(Bundle bundle) { - return getEntry(bundle, "Practitioner").getResource().getChildByName("name").getValues().get(0) - .getChildByName("family").getValues().get(0).primitiveValue(); - } - - private String extractPractitionerAddress(Bundle bundle) { - return getEntry(bundle, "Practitioner").getResource().getChildByName("address").getValues().get(0) - .getChildByName("line").getValues().get(0).primitiveValue(); - } - - private String extractPractitionerPostCode(Bundle bundle) { - return getEntry(bundle, "Practitioner").getResource().getChildByName("address").getValues().get(0) - .getChildByName("postalCode").getValues().get(0).primitiveValue(); - } - - private String extractPractitionerCity(Bundle bundle) { - return getEntry(bundle, "Practitioner").getResource().getChildByName("address").getValues().get(0) - .getChildByName("city").getValues().get(0).primitiveValue(); - } - - private String extractPractitionerPhoneNumber(Bundle bundle) { - return getEntry(bundle, "Practitioner").getResource().getChildByName("telecom").getValues().get(0) - .getChildByName("value").getValues().get(0).primitiveValue(); - } - - private String extractPractitionerFaxNumber(Bundle bundle) { - return getEntry(bundle, "Practitioner").getResource().getChildByName("telecom").getValues().get(1) - .getChildByName("value").getValues().get(0).primitiveValue(); - } - - private String extractPatientStatus(Bundle bundle) { - return getEntry(bundle, "Coverage").getResource().getChildByName("extension").getValues().get(3) - .getChildByName("value[x]").getValues().get(0).getChildByName("code").getValues().get(0) - .primitiveValue(); - } - - private String extractPatientAddress(Bundle bundle) { - return getEntry(bundle, "Patient").getResource().getChildByName("address").getValues().get(0) - .getChildByName("line").getValues().get(0).primitiveValue(); - } - - private String extractPatientPostCode(Bundle bundle) { - return getEntry(bundle, "Patient").getResource().getChildByName("address").getValues().get(0) - .getChildByName("postalCode").getValues().get(0).primitiveValue(); - } - - private String extractPatientCity(Bundle bundle) { - return getEntry(bundle, "Patient").getResource().getChildByName("address").getValues().get(0) - .getChildByName("city").getValues().get(0).primitiveValue(); - } - - private String extractBirthDate(Bundle bundle) { - return getEntry(bundle, "Patient").getResource().getChildByName("birthDate").getValues().get(0) - .primitiveValue(); - } - - private String extractPatientPrefix(Bundle bundle) { - List<Base> prefix = getEntry(bundle, "Patient").getResource().getChildByName("name").getValues().get(0) - .getChildByName("prefix").getValues(); - return (prefix.isEmpty()) ? "" : prefix.get(0).primitiveValue(); - } - - private String extractPatientFirstName(Bundle bundle) { - return getEntry(bundle, "Patient").getResource().getChildByName("name").getValues().get(0) - .getChildByName("given").getValues().get(0).primitiveValue(); - } - - private String extractPatientLastName(Bundle bundle) { - return getEntry(bundle, "Patient").getResource().getChildByName("name").getValues().get(0) - .getChildByName("family").getValues().get(0).primitiveValue(); - } - - private String extractGebPfl(Bundle bundle) { - return getEntry(bundle, "MedicationRequest").getResource().getChildByName("extension").getValues().get(0) - .getChildByName("value[x]").getValues().get(0).getChildByName("code").getValues().get(0) - .primitiveValue(); - } - - private String extractAuthoredOn(Bundle bundle) { - return getEntry(bundle, "MedicationRequest").getResource().getChildByName("authoredOn") - .getValues().get(0).primitiveValue(); - } - - private Bundle.BundleEntryComponent getEntry(Bundle bundle, String name) { - return bundle.getEntry().stream() - .filter(entry -> entry.getResource().fhirType().equals(name)) - .collect(Collectors.toList()).get(0); - } - - private void logExtractionResultsAndMuster16Form(Map<String, String> extractionResultsMap, - Muster16PrescriptionForm muster16PrescriptionForm) { - extractionResultsMap.entrySet().forEach(entry -> { - log.info("key:" + entry.getKey() + ", value:" + entry.getValue().trim()); - }); - - log.info("Form:" + muster16PrescriptionForm); - } -} diff --git a/src/test/java/health/ere/ps/service/fhir/bundle/PrescriptionBundlesBuilderTest.java b/src/test/java/health/ere/ps/service/fhir/bundle/PrescriptionBundlesBuilderTest.java deleted file mode 100644 index da73529c4..000000000 --- a/src/test/java/health/ere/ps/service/fhir/bundle/PrescriptionBundlesBuilderTest.java +++ /dev/null @@ -1,868 +0,0 @@ -package health.ere.ps.service.fhir.bundle; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import javax.inject.Inject; -import javax.xml.stream.XMLStreamException; - -import org.apache.commons.collections4.CollectionUtils; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.hl7.fhir.r4.model.Bundle; -import org.hl7.fhir.r4.model.Coverage; -import org.hl7.fhir.r4.model.Patient; -import org.jboss.logging.Logger; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import ca.uhn.fhir.context.FhirContext; -import ca.uhn.fhir.parser.IParser; -import ca.uhn.fhir.validation.ValidationResult; -import health.ere.ps.model.muster16.MedicationString; -import health.ere.ps.model.muster16.Muster16PrescriptionForm; -import health.ere.ps.profile.TitusTestProfile; -import health.ere.ps.service.extractor.SVGExtractor; -import health.ere.ps.service.extractor.TemplateProfile; -import health.ere.ps.service.muster16.Muster16FormDataExtractorService; -import health.ere.ps.service.muster16.parser.rgxer.Muster16SvgRegexParser; -import health.ere.ps.validation.fhir.bundle.PrescriptionBundleValidator; -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.TestProfile; - -@QuarkusTest -@TestProfile(TitusTestProfile.class) -public class PrescriptionBundlesBuilderTest { - private static final String BAD_DENS_SIGN_REQUEST_KBV_JSON = " {\"resourceType\":\"Bundle\"," + - "\"id\":\"e6baf9c0-5d88-4b28-b15d-1c3a2c3f3d19\",\"meta\":{\"lastUpdated\":\"2021-06-16T13:05:38.948-04:00\",\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.0.2\"]},\"type\":\"document\",\"timestamp\":\"2021-06-16T13:05:38.948-04:00\",\"entry\":[{\"fullUrl\":\"http://pvs.praxis.local/fhir/Medication/9d8c5ab9-73b8-4165-9f3a-9eb354ea1f88\",\"resource\":{\"resourceType\":\"Medication\",\"id\":\"9d8c5ab9-73b8-4165-9f3a-9eb354ea1f88\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_PZN|1.0.2\"]},\"extension\":[{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category\",\"code\":\"00\"}},{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine\",\"valueBoolean\":false},{\"url\":\"http://fhir.de/StructureDefinition/normgroesse\",\"valueCode\":\"N1\"}],\"code\":{\"coding\":[{\"system\":\"http://fhir.de/CodeSystem/ifa/pzn\",\"code\":\"00027950\"}],\"text\":\"Ibuprofen 600mg\"},\"form\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DARREICHUNGSFORM\",\"code\":\"FLE\"}]}}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/MedicationRequest/028df042-2321-410c-9fa0-148af5d2b909\",\"resource\":{\"resourceType\":\"MedicationRequest\",\"id\":\"028df042-2321-410c-9fa0-148af5d2b909\",\"meta\":{\"lastUpdated\":\"2021-06-16T13:05:38.948-04:00\",\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.0.2\"]},\"extension\":[{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_StatusCoPayment\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_StatusCoPayment\",\"code\":\"1\"}},{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee\",\"valueBoolean\":false},{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG\",\"valueBoolean\":false},{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription\",\"extension\":[{\"url\":\"Kennzeichen\",\"valueBoolean\":false}]}],\"status\":\"active\",\"intent\":\"order\",\"medicationReference\":{\"reference\":\"Medication/9d8c5ab9-73b8-4165-9f3a-9eb354ea1f88\"},\"subject\":{\"reference\":\"Patient/\"},\"requester\":{\"reference\":\"Practitioner/30000000\"},\"insurance\":[{\"reference\":\"Coverage/\"}],\"dosageInstruction\":[{\"extension\":[{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag\",\"valueBoolean\":true}],\"text\":\"1-1-1\"}],\"dispenseRequest\":{\"quantity\":{\"value\":1,\"system\":\"http://unitsofmeasure.org\",\"code\":\"{Package}\"}},\"substitution\":{\"allowedBoolean\":true}}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Composition/ba4fc629-93ce-4670-b47a-b0596bc0aaa6\",\"resource\":{\"resourceType\":\"Composition\",\"id\":\"ba4fc629-93ce-4670-b47a-b0596bc0aaa6\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.0.2\"]},\"extension\":[{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN\",\"code\":\"04\"}}],\"status\":\"final\",\"type\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART\",\"code\":\"e16A\"}]},\"subject\":{\"reference\":\"Patient/\"},\"date\":\"2021-06-16T13:05:38-04:00\",\"author\":[{\"reference\":\"Practitioner/30000000\",\"type\":\"Practitioner\"},{\"type\":\"Device\",\"identifier\":{\"system\":\"https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer\",\"value\":\"123456\"}}],\"title\":\"elektronische Arzneimittelverordnung\",\"attester\":[{\"mode\":\"legal\",\"party\":{\"reference\":\"Practitioner/30000000\"}}],\"custodian\":{\"reference\":\"Organization/30000000\"},\"section\":[{\"code\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type\",\"code\":\"Prescription\"}]},\"entry\":[{\"reference\":\"MedicationRequest/028df042-2321-410c-9fa0-148af5d2b909\"}]},{\"code\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type\",\"code\":\"Coverage\"}]},\"entry\":[{\"reference\":\"Coverage/\"}]}]}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Patient/null\",\"resource\":{\"resourceType\":\"Patient\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.0.3\"]},\"identifier\":[{\"type\":{\"coding\":[{\"system\":\"http://fhir.de/CodeSystem/identifier-type-de-basis\",\"code\":\"GKV\"}]},\"system\":\"http://fhir.de/NamingSystem/gkv/kvid-10\"}],\"name\":[{\"use\":\"official\",\"family\":\"Heckner\",\"given\":[\"Markus\"],\"prefix\":[\"Dr.\"]}],\"address\":[{\"type\":\"both\",\"line\":[\"Berliner Str. 12\"],\"city\":\"Teltow\",\"postalCode\":\"14513\",\"country\":\"D\",\"_line\":[{\"extension\":null}]}]}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Practitioner/30000000\",\"resource\":{\"resourceType\":\"Practitioner\",\"id\":\"30000000\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.0.3\"]},\"identifier\":[{\"type\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/v2-0203\",\"code\":\"LANR\"}]},\"system\":\"https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR\",\"value\":\"30000000\"}],\"name\":[{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier\",\"valueString\":\"AC\"}],\"use\":\"official\",\"family\":\"Doctor Last Name\",\"given\":[\"Doctor First Name\"]}],\"qualification\":[{\"code\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type\",\"code\":\"00\",\"display\":\"Arzt-Hausarzt\"}]}},{\"code\":{\"text\":\"Arzt-Hausarzt\"}}]}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Organization/30000000\",\"resource\":{\"resourceType\":\"Organization\",\"id\":\"30000000\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.0.3\",\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.0.3\"]},\"identifier\":[{\"type\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/v2-0203\",\"code\":\"BSNR\"}]},\"system\":\"https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR\",\"value\":\"30000000\"}],\"name\":\"null Doctor First Name Doctor Last Name\",\"telecom\":[{\"system\":\"phone\",\"value\":\"030/123456789\"}],\"address\":[{\"type\":\"both\",\"line\":[\"Doctor Street Name Doctor Street Number\"],\"city\":\"Doctor City\",\"postalCode\":\"012345\",\"country\":\"D\"}]}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Coverage/null\",\"resource\":{\"resourceType\":\"Coverage\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.0.3\"]},\"extension\":[{\"url\":\"http://fhir.de/StructureDefinition/gkv/besondere-personengruppe\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE\",\"code\":\"00\"}},{\"url\":\"http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP\",\"code\":\"00\"}},{\"url\":\"http://fhir.de/StructureDefinition/gkv/wop\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP\",\"code\":\"72\"}},{\"url\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP\",\"code\":\"3\"}}],\"status\":\"active\",\"type\":{\"coding\":[{\"system\":\"http://fhir.de/CodeSystem/versicherungsart-de-basis\",\"code\":\"GKV\"}]},\"beneficiary\":{\"reference\":\"Patient/\"},\"payor\":[{\"identifier\":{\"system\":\"http://fhir.de/NamingSystem/arge-ik/iknr\"},\"display\":\"DENS GmbH\"}]}}]}"; - private static final String GOOD_SIMPLIFIER_NET_SAMPLE_KBV_JSON = "{\n" + // - " \"resourceType\": \"Bundle\",\n" + // - " \"id\": \"0428d416-149e-48a4-977c-394887b3d85c\",\n" + // - " \"meta\": {\n" + // - " \"lastUpdated\": \"2022-05-20T08:30:00Z\",\n" + // - " \"profile\": [\n" + // - " \"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.1.0\"\n" + // - " ]\n" + // - " },\n" + // - " \"identifier\": {\n" + // - " \"system\": \"https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId\",\n" + // - " \"value\": \"160.100.000.000.002.36\"\n" + // - " },\n" + // - " \"type\": \"document\",\n" + // - " \"timestamp\": \"2022-05-20T08:30:00Z\",\n" + // - " \"entry\": [\n" + // - " {\n" + // - " \"fullUrl\": \"http://pvs.praxis.local/fhir/Composition/a054c2f3-0123-4d33-a0b3-bedec2f7d1ea\",\n" + // - " \"resource\": {\n" + // - " \"resourceType\": \"Composition\",\n" + // - " \"id\": \"a054c2f3-0123-4d33-a0b3-bedec2f7d1ea\",\n" + // - " \"meta\": {\n" + // - " \"profile\": [\n" + // - " \"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.1.0\"\n" + // - " ]\n" + // - " },\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis\",\n" + // - " \"valueCoding\": {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN\",\n" + // - " \"code\": \"00\"\n" + // - " }\n" + // - " }\n" + // - " ],\n" + // - " \"status\": \"final\",\n" + // - " \"type\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART\",\n" + // - " \"code\": \"e16A\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " \"subject\": {\n" + // - " \"reference\": \"Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6\"\n" + // - " },\n" + // - " \"date\": \"2022-05-20T08:00:00Z\",\n" + // - " \"author\": [\n" + // - " {\n" + // - " \"reference\": \"Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359\",\n" + // - " \"type\": \"Practitioner\"\n" + // - " },\n" + // - " {\n" + // - " \"type\": \"Device\",\n" + // - " \"identifier\": {\n" + // - " \"system\": \"https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer\",\n" + // - " \"value\": \"Y/400/2107/36/999\"\n" + // - " }\n" + // - " }\n" + // - " ],\n" + // - " \"title\": \"elektronische Arzneimittelverordnung\",\n" + // - " \"custodian\": {\n" + // - " \"reference\": \"Organization/d2b30a70-9830-4968-ab97-688472b6f9a3\"\n" + // - " },\n" + // - " \"section\": [\n" + // - " {\n" + // - " \"code\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type\",\n" + // - " \"code\": \"Prescription\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " \"entry\": [\n" + // - " {\n" + // - " \"reference\": \"MedicationRequest/06dc1594-509a-4f4c-ada7-dfd477a02d86\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " {\n" + // - " \"code\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type\",\n" + // - " \"code\": \"Coverage\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " \"entry\": [\n" + // - " {\n" + // - " \"reference\": \"Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4\"\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"fullUrl\": \"http://pvs.praxis.local/fhir/MedicationRequest/06dc1594-509a-4f4c-ada7-dfd477a02d86\",\n" + // - " \"resource\": {\n" + // - " \"resourceType\": \"MedicationRequest\",\n" + // - " \"id\": \"06dc1594-509a-4f4c-ada7-dfd477a02d86\",\n" + // - " \"meta\": {\n" + // - " \"profile\": [\n" + // - " \"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.1.0\"\n" + // - " ]\n" + // - " },\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_StatusCoPayment\",\n" + // - " \"valueCoding\": {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_StatusCoPayment\",\n" + // - " \"code\": \"1\"\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee\",\n" + // - " \"valueBoolean\": false\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG\",\n" + // - " \"valueBoolean\": false\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription\",\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"Kennzeichen\",\n" + // - " \"valueBoolean\": false\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " ],\n" + // - " \"status\": \"active\",\n" + // - " \"intent\": \"order\",\n" + // - " \"medicationReference\": {\n" + // - " \"reference\": \"Medication/f568397d-7ba2-46ac-904b-02caec933b42\"\n" + // - " },\n" + // - " \"subject\": {\n" + // - " \"reference\": \"Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6\"\n" + // - " },\n" + // - " \"authoredOn\": \"2022-05-20\",\n" + // - " \"requester\": {\n" + // - " \"reference\": \"Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359\"\n" + // - " },\n" + // - " \"insurance\": [\n" + // - " {\n" + // - " \"reference\": \"Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4\"\n" + // - " }\n" + // - " ],\n" + // - " \"dosageInstruction\": [\n" + // - " {\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag\",\n" + // - " \"valueBoolean\": true\n" + // - " }\n" + // - " ],\n" + // - " \"text\": \"2mal tägl. 5ml\"\n" + // - " }\n" + // - " ],\n" + // - " \"dispenseRequest\": {\n" + // - " \"quantity\": {\n" + // - " \"value\": 1,\n" + // - " \"system\": \"http://unitsofmeasure.org\",\n" + // - " \"code\": \"{Package}\"\n" + // - " }\n" + // - " },\n" + // - " \"substitution\": {\n" + // - " \"allowedBoolean\": true\n" + // - " }\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"fullUrl\": \"http://pvs.praxis.local/fhir/Medication/f568397d-7ba2-46ac-904b-02caec933b42\",\n" + // - " \"resource\": {\n" + // - " \"resourceType\": \"Medication\",\n" + // - " \"id\": \"f568397d-7ba2-46ac-904b-02caec933b42\",\n" + // - " \"meta\": {\n" + // - " \"profile\": [\n" + // - " \"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_PZN|1.1.0\"\n" + // - " ]\n" + // - " },\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"https://fhir.kbv.de/StructureDefinition/KBV_EX_Base_Medication_Type\",\n" + // - " \"valueCodeableConcept\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"http://snomed.info/sct\",\n" + // - " \"version\": \"http://snomed.info/sct/900000000000207008/version/20220331\",\n" + // - " \"code\": \"763158003\",\n" + // - " \"display\": \"Medicinal product (product)\"\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category\",\n" + // - " \"valueCoding\": {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category\",\n" + // - " \"code\": \"00\"\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine\",\n" + // - " \"valueBoolean\": false\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"http://fhir.de/StructureDefinition/normgroesse\",\n" + // - " \"valueCode\": \"N1\"\n" + // - " }\n" + // - " ],\n" + // - " \"code\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"http://fhir.de/CodeSystem/ifa/pzn\",\n" + // - " \"code\": \"08585997\"\n" + // - " }\n" + // - " ],\n" + // - " \"text\": \"Prospan® Hustensaft 100ml N1\"\n" + // - " },\n" + // - " \"form\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DARREICHUNGSFORM\",\n" + // - " \"code\": \"FLE\"\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"fullUrl\": \"http://pvs.praxis.local/fhir/Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6\",\n" + // - " \"resource\": {\n" + // - " \"resourceType\": \"Patient\",\n" + // - " \"id\": \"512ab5bc-a7ab-4fd7-81cc-16a594f747a6\",\n" + // - " \"meta\": {\n" + // - " \"profile\": [\n" + // - " \"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.1.0\"\n" + // - " ]\n" + // - " },\n" + // - " \"identifier\": [\n" + // - " {\n" + // - " \"type\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"http://fhir.de/CodeSystem/identifier-type-de-basis\",\n" + // - " \"code\": \"GKV\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " \"system\": \"http://fhir.de/sid/gkv/kvid-10\",\n" + // - " \"value\": \"M310119802\"\n" + // - " }\n" + // - " ],\n" + // - " \"name\": [\n" + // - " {\n" + // - " \"use\": \"official\",\n" + // - " \"family\": \"Erbprinzessin von und zu der Schimmelpfennig-Hammerschmidt Federmannssohn\",\n" + // - " \"_family\": {\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"http://fhir.de/StructureDefinition/humanname-namenszusatz\",\n" + // - " \"valueString\": \"Erbprinzessin\"\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"http://hl7.org/fhir/StructureDefinition/humanname-own-prefix\",\n" + // - " \"valueString\": \"von und zu der\"\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"http://hl7.org/fhir/StructureDefinition/humanname-own-name\",\n" + // - " \"valueString\": \"Schimmelpfennig-Hammerschmidt Federmannssohn\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " \"given\": [\n" + // - " \"Ingrid\"\n" + // - " ]\n" + // - " }\n" + // - " ],\n" + // - " \"birthDate\": \"2010-01-31\",\n" + // - " \"address\": [\n" + // - " {\n" + // - " \"type\": \"both\",\n" + // - " \"line\": [\n" + // - " \"Anneliese- und Georg-von-Groscurth-Plaetzchen 149-C\",\n" + // - " \"5. OG - Hinterhof\"\n" + // - " ],\n" + // - " \"_line\": [\n" + // - " {\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber\",\n" + // - " \"valueString\": \"149-C\"\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName\",\n" + // - " \"valueString\": \"Anneliese- und Georg-von-Groscurth-Plaetzchen\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " {\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator\",\n" + // - " \"valueString\": \"5. OG - Hinterhof\"\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " ],\n" + // - " \"city\": \"Bad Homburg\",\n" + // - " \"postalCode\": \"60437\",\n" + // - " \"country\": \"D\"\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"fullUrl\": \"http://pvs.praxis.local/fhir/Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359\",\n" + // - " \"resource\": {\n" + // - " \"resourceType\": \"Practitioner\",\n" + // - " \"id\": \"e33d2afd-44c8-462b-80e5-52dbe5ebf359\",\n" + // - " \"meta\": {\n" + // - " \"profile\": [\n" + // - " \"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.1.0\"\n" + // - " ]\n" + // - " },\n" + // - " \"identifier\": [\n" + // - " {\n" + // - " \"type\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"http://terminology.hl7.org/CodeSystem/v2-0203\",\n" + // - " \"code\": \"LANR\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " \"system\": \"https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR\",\n" + // - " \"value\": \"456456534\"\n" + // - " }\n" + // - " ],\n" + // - " \"name\": [\n" + // - " {\n" + // - " \"use\": \"official\",\n" + // - " \"family\": \"Weber\",\n" + // - " \"_family\": {\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"http://hl7.org/fhir/StructureDefinition/humanname-own-name\",\n" + // - " \"valueString\": \"Weber\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " \"given\": [\n" + // - " \"Maximilian\"\n" + // - " ],\n" + // - " \"prefix\": [\n" + // - " \"Dr.\"\n" + // - " ],\n" + // - " \"_prefix\": [\n" + // - " {\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier\",\n" + // - " \"valueCode\": \"AC\"\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " ],\n" + // - " \"qualification\": [\n" + // - " {\n" + // - " \"code\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type\",\n" + // - " \"code\": \"00\"\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"code\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Berufsbezeichnung\",\n" + // - " \"code\": \"Berufsbezeichnung\"\n" + // - " }\n" + // - " ],\n" + // - " \"text\": \"Facharzt für Kinder- und Jugendmedizin\"\n" + // - " }\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"fullUrl\": \"http://pvs.praxis.local/fhir/Organization/d2b30a70-9830-4968-ab97-688472b6f9a3\",\n" + // - " \"resource\": {\n" + // - " \"resourceType\": \"Organization\",\n" + // - " \"id\": \"d2b30a70-9830-4968-ab97-688472b6f9a3\",\n" + // - " \"meta\": {\n" + // - " \"profile\": [\n" + // - " \"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.1.0\"\n" + // - " ]\n" + // - " },\n" + // - " \"identifier\": [\n" + // - " {\n" + // - " \"type\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"http://terminology.hl7.org/CodeSystem/v2-0203\",\n" + // - " \"code\": \"BSNR\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " \"system\": \"https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR\",\n" + // - " \"value\": \"687777700\"\n" + // - " }\n" + // - " ],\n" + // - " \"name\": \"Kinderarztpraxis\",\n" + // - " \"telecom\": [\n" + // - " {\n" + // - " \"system\": \"phone\",\n" + // - " \"value\": \"09411234567\"\n" + // - " }\n" + // - " ],\n" + // - " \"address\": [\n" + // - " {\n" + // - " \"type\": \"both\",\n" + // - " \"line\": [\n" + // - " \"Yorckstraße 15\",\n" + // - " \"Hinterhaus\"\n" + // - " ],\n" + // - " \"_line\": [\n" + // - " {\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber\",\n" + // - " \"valueString\": \"15\"\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName\",\n" + // - " \"valueString\": \"Yorckstraße\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " {\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator\",\n" + // - " \"valueString\": \"Hinterhaus\"\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " ],\n" + // - " \"city\": \"Regensburg\",\n" + // - " \"postalCode\": \"93049\",\n" + // - " \"country\": \"D\"\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"fullUrl\": \"http://pvs.praxis.local/fhir/Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4\",\n" + // - " \"resource\": {\n" + // - " \"resourceType\": \"Coverage\",\n" + // - " \"id\": \"df0f2536-97b9-4bae-99cc-83ba2e8371e4\",\n" + // - " \"meta\": {\n" + // - " \"profile\": [\n" + // - " \"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.1.0\"\n" + // - " ]\n" + // - " },\n" + // - " \"extension\": [\n" + // - " {\n" + // - " \"url\": \"http://fhir.de/StructureDefinition/gkv/besondere-personengruppe\",\n" + // - " \"valueCoding\": {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE\",\n" + // - " \"code\": \"00\"\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen\",\n" + // - " \"valueCoding\": {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP\",\n" + // - " \"code\": \"00\"\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"http://fhir.de/StructureDefinition/gkv/wop\",\n" + // - " \"valueCoding\": {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP\",\n" + // - " \"code\": \"72\"\n" + // - " }\n" + // - " },\n" + // - " {\n" + // - " \"url\": \"http://fhir.de/StructureDefinition/gkv/versichertenart\",\n" + // - " \"valueCoding\": {\n" + // - " \"system\": \"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS\",\n" + // - " \"code\": \"3\"\n" + // - " }\n" + // - " }\n" + // - " ],\n" + // - " \"status\": \"active\",\n" + // - " \"type\": {\n" + // - " \"coding\": [\n" + // - " {\n" + // - " \"system\": \"http://fhir.de/CodeSystem/versicherungsart-de-basis\",\n" + // - " \"code\": \"GKV\"\n" + // - " }\n" + // - " ]\n" + // - " },\n" + // - " \"beneficiary\": {\n" + // - " \"reference\": \"Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6\"\n" + // - " },\n" + // - " \"period\": {\n" + // - " \"end\": \"2040-04-01\"\n" + // - " },\n" + // - " \"payor\": [\n" + // - " {\n" + // - " \"identifier\": {\n" + // - " \"system\": \"http://fhir.de/sid/arge-ik/iknr\",\n" + // - " \"value\": \"108416214\"\n" + // - " },\n" + // - " \"display\": \"AOK Bayern Die Gesundh.\"\n" + // - " }\n" + // - " ]\n" + // - " }\n" + // - " }\n" + // - " ]\n" + // - "}"; - private static final String GOOD_SIMPLIFIER_NET_SAMPLE_KBV_JSON_AS_A_TEMPLATE = "{\"resourceType\":\"Bundle\",\"id\":\"$BUNDLE_ID\"," + - "\"meta\":{\"lastUpdated\":\"$LAST_UPDATED\",\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.0.2\"]},\"identifier\":{\"system\":\"https://gematik.de/fhir/NamingSystem/PrescriptionID\",\"value\":\"$PRESCRIPTION_ID\"},\"type\":\"document\",\"timestamp\":\"$TIMESTAMP\",\"entry\":[{\"fullUrl\":\"http://pvs.praxis.local/fhir/Composition/$COMPOSITION_ID\",\"resource\":{\"resourceType\":\"Composition\",\"id\":\"$COMPOSITION_ID\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.0.2\"]},\"extension\":[{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN\",\"code\":\"00\"}}],\"status\":\"final\",\"type\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART\",\"code\":\"e16A\"}]},\"subject\":{\"reference\":\"Patient/$PATIENT_ID\"},\"date\":\"$COMPOSITION_DATE\",\"author\":[{\"reference\":\"Practitioner/$PRACTITIONER_ID\",\"type\":\"Practitioner\"},{\"type\":\"Device\",\"identifier\":{\"system\":\"https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer\",\"value\":\"$DEVICE_ID\"}}],\"title\":\"elektronische Arzneimittelverordnung\",\"custodian\":{\"reference\":\"Organization/$ORGANIZATION_ID\"},\"section\":[{\"code\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type\",\"code\":\"Prescription\"}]},\"entry\":[{\"reference\":\"MedicationRequest/$MEDICATION_REQUEST_ID\"}]},{\"code\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type\",\"code\":\"Coverage\"}]},\"entry\":[{\"reference\":\"Coverage/$COVERAGE_ID\"}]}]}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/MedicationRequest/$MEDICATION_REQUEST_ID\",\"resource\":{\"resourceType\":\"MedicationRequest\",\"id\":\"$MEDICATION_REQUEST_ID\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.0.2\"]},\"extension\":[{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_StatusCoPayment\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_StatusCoPayment\",\"code\":\"$STATUS_CO_PAYMENT\"}},{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee\",\"valueBoolean\":false},{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG\",\"valueBoolean\":false},{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription\",\"extension\":[{\"url\":\"Kennzeichen\",\"valueBoolean\":false}]}],\"status\":\"active\",\"intent\":\"order\",\"medicationReference\":{\"reference\":\"Medication/$MEDICATION_ID\"},\"subject\":{\"reference\":\"Patient/$PATIENT_ID\"},\"authoredOn\":\"$AUTHORED_ON\",\"requester\":{\"reference\":\"Practitioner/$PRACTITIONER_ID\"},\"insurance\":[{\"reference\":\"Coverage/$COVERAGE_ID\"}],\"dosageInstruction\":[{\"extension\":[{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag\",\"valueBoolean\":true}],\"text\":\"$DOSAGE_QUANTITY\"}],\"dispenseRequest\":{\"quantity\":{\"value\":1,\"system\":\"http://unitsofmeasure.org\",\"code\":\"{Package}\"}},\"substitution\":{\"allowedBoolean\":true}}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Medication/$MEDICATION_ID\",\"resource\":{\"resourceType\":\"Medication\",\"id\":\"$MEDICATION_ID\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_PZN|1.0.2\"]},\"extension\":[{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category\",\"code\":\"00\"}},{\"url\":\"https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine\",\"valueBoolean\":false},{\"url\":\"http://fhir.de/StructureDefinition/normgroesse\",\"valueCode\":\"N1\"}],\"code\":{\"coding\":[{\"system\":\"http://fhir.de/CodeSystem/ifa/pzn\",\"code\":\"$PZN\"}],\"text\":\"$MEDICATION_NAME\"},\"form\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DARREICHUNGSFORM\",\"code\":\"FLE\"}]}}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Patient/$PATIENT_ID\",\"resource\":{\"resourceType\":\"Patient\",\"id\":\"$PATIENT_ID\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.0.3\"]},\"identifier\":[{\"type\":{\"coding\":[{\"system\":\"http://fhir.de/CodeSystem/identifier-type-de-basis\",\"code\":\"GKV\"}]},\"system\":\"http://fhir.de/NamingSystem/gkv/kvid-10\",\"value\":\"$KVID_10\"}],\"name\":[{\"use\":\"official\",\"family\":\"$PATIENT_NAME_FAMILY\",\"given\":[\"$PATIENT_NAME_FIRST\"],\"prefix\":[\"$PATIENT_NAME_PREFIX\"]}],\"birthDate\":\"$PATIENT_BIRTH_DATE\",\"address\":[{\"type\":\"both\",\"line\":[\"$PATIENT_ADDRESS_STREET_NUMBER $PATIENT_ADDRESS_STREET_NAME\"],\"_line\":[{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/iso90-ADXP-houseNumber\",\"valueString\":\"$PATIENT_ADDRESS_STREET_NUMBER\"},{\"url\":\"http://hl7.org/fhir/StructureDefinition/iso90-ADXP-streetName\",\"valueString\":\"$PATIENT_ADDRESS_STREET_NAME\"}]}],\"city\":\"$PATIENT_ADDRESS_CITY\",\"postalCode\":\"$PATIENT_ADDRESS_POSTAL_CODE\",\"country\":\"D\"}]}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Practitioner/$PRACTITIONER_ID\",\"resource\":{\"resourceType\":\"Practitioner\",\"id\":\"$PRACTITIONER_ID\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.0.3\"]},\"identifier\":[{\"type\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/v2-3\",\"code\":\"LANR\"}]},\"system\":\"https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR\",\"value\":\"\"}],\"name\":[{\"use\":\"official\",\"family\":\"$PRACTITIONER_NAME_FAMILY\",\"_family\":{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/humanname-own-name\",\"valueString\":\"$PRACTITIONER_NAME_FAMILY\"}]},\"given\":[\"$PRACTITIONER_NAME_FIRST\"],\"prefix\":[\"$PRACTITIONER_NAME_PREFIX\"],\"_prefix\":[{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/iso90-EN-qualifier\",\"valueCode\":\"AC\"}]}]}],\"qualification\":[{\"code\":{\"coding\":[{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type\",\"code\":\"00\"}]}},{\"code\":{\"text\":\"Arzt-Hausarzt\"}}]}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Organization/$ORGANIZATION_ID\",\"resource\":{\"resourceType\":\"Organization\",\"id\":\"$ORGANIZATION_ID\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.0.3\"]},\"identifier\":[{\"type\":{\"coding\":[{\"system\":\"http://terminology.hl7.org/CodeSystem/v2-3\",\"code\":\"BSNR\"}]},\"system\":\"https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR\",\"value\":\"$CLINIC_ID\"}],\"name\":\"Kinderarztpraxis\",\"telecom\":[{\"system\":\"phone\",\"value\":\"$PRACTITIONER_PHONE\"},{\"system\":\"fax\",\"value\":\"$PRACTITIONER_FAX\"}],\"address\":[{\"type\":\"both\",\"line\":[\"$PRACTITIONER_ADDRESS_STREET_NAME $PRACTITIONER_ADDRESS_STREET_NUMBER\"],\"_line\":[{\"extension\":[{\"url\":\"http://hl7.org/fhir/StructureDefinition/iso90-ADXP-houseNumber\",\"valueString\":\"$PRACTITIONER_ADDRESS_STREET_NUMBER\"},{\"url\":\"http://hl7.org/fhir/StructureDefinition/iso90-ADXP-streetName\",\"valueString\":\"$PRACTITIONER_ADDRESS_STREET_NAME\"}]}],\"city\":\"$PRACTITIONER_ADDRESS_CITY\",\"postalCode\":\"$PRACTITIONER_ADDRESS_POSTAL_CODE\",\"country\":\"D\"}]}},{\"fullUrl\":\"http://pvs.praxis.local/fhir/Coverage/$COVERAGE_ID\",\"resource\":{\"resourceType\":\"Coverage\",\"id\":\"$COVERAGE_ID\",\"meta\":{\"profile\":[\"https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.0.3\"]},\"extension\":[{\"url\":\"http://fhir.de/StructureDefinition/gkv/besondere-personengruppe\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE\",\"code\":\"00\"}},{\"url\":\"http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP\",\"code\":\"00\"}},{\"url\":\"http://fhir.de/StructureDefinition/gkv/wop\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP\",\"code\":\"72\"}},{\"url\":\"http://fhir.de/StructureDefinition/gkv/versichertenart\",\"valueCoding\":{\"system\":\"https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS\",\"code\":\"$PATIENT_STATUS\"}}],\"status\":\"active\",\"type\":{\"coding\":[{\"system\":\"http://fhir.de/CodeSystem/versicherungsart-de-basis\",\"code\":\"GKV\"}]},\"beneficiary\":{\"reference\":\"Patient/$PATIENT_ID\"},\"period\":{\"end\":\"$COVERAGE_PERIOD_END\"},\"payor\":[{\"identifier\":{\"system\":\"http://fhir.de/NamingSystem/arge-ik/iknr\",\"value\":\"$COVERAGE_ID\"},\"display\":\"$INSURANCE_NAME\"}]}}]}"; - private final FhirContext ctx = FhirContext.forR4(); - - @Inject - Logger logger; - - @Inject - PrescriptionBundleValidator prescriptionBundleValidator; - - private PrescriptionBundlesBuilder prescriptionBundlesBuilder; - - public static Muster16PrescriptionForm getMuster16PrescriptionFormForTests() { - Muster16PrescriptionForm muster16PrescriptionForm; - muster16PrescriptionForm = new Muster16PrescriptionForm(); - - muster16PrescriptionForm.setClinicId("123456789"); - - muster16PrescriptionForm.setPrescriptionDate("2021-04-05"); - MedicationString medicationString = new MedicationString("Amoxicillin 1000mg N2", null, null, "3x täglich alle 8 Std", null, "02394428"); - - muster16PrescriptionForm.setPrescriptionList(Collections.singletonList(medicationString)); - - muster16PrescriptionForm.setPractitionerId("123456789"); - - muster16PrescriptionForm.setInsuranceCompany("Test Insurance Company, Gmbh"); - - muster16PrescriptionForm.setPatientDateOfBirth("1986-07-16"); - muster16PrescriptionForm.setPatientNamePrefix(List.of("Dr.")); - muster16PrescriptionForm.setPatientFirstName("John"); - muster16PrescriptionForm.setPatientLastName("Doe"); - muster16PrescriptionForm.setPatientStreetName("Droysenstr."); - muster16PrescriptionForm.setPatientStreetNumber("7"); - muster16PrescriptionForm.setPatientZipCode("10629"); - muster16PrescriptionForm.setPatientCity("Berlin"); - muster16PrescriptionForm.setPatientInsuranceId("M310119800"); - muster16PrescriptionForm.setPatientStatus("30000"); - - muster16PrescriptionForm.setPractitionerNamePrefix("Dr."); - muster16PrescriptionForm.setPractitionerFirstName("Testarzt"); - muster16PrescriptionForm.setPractitionerLastName("E-Rezept"); - muster16PrescriptionForm.setPractitionerPhone("123456789"); - - muster16PrescriptionForm.setPractitionerStreetName("Doc Droysenstr."); - muster16PrescriptionForm.setPractitionerStreetNumber("7a"); - muster16PrescriptionForm.setPractitionerZipCode("10630"); - muster16PrescriptionForm.setPractitionerCity("Berlinn"); - - muster16PrescriptionForm.setPractitionerPhone("030/123456"); - - muster16PrescriptionForm.setInsuranceCompanyId("100038825"); - muster16PrescriptionForm.setWithPayment(true); - - return muster16PrescriptionForm; - } - - @BeforeEach - public void initialize() throws IOException { - prescriptionBundlesBuilder = new PrescriptionBundlesBuilder(getMuster16PrescriptionFormForTests()); - } - - @Test - public void test_Successful_Creation_of_FHIR_EPrescription_Bundle_From_Muster16_Model_Object() - throws ParseException { - - List<Bundle> fhirEPrescriptionBundles = prescriptionBundlesBuilder.createBundles(); - - // Expecting the creation of 7 resources - // 1. composition resource - // 2. medication request resource - // 3. medication resource. - // 4. patient resource. - // 5. practitioner resource. - // 6. organization resource. - // 7. coverage resource. - fhirEPrescriptionBundles.forEach(bundle -> assertEquals(7, bundle.getEntry().size())); - assertEquals(1, fhirEPrescriptionBundles.size()); - } - - @Test - public void BundleBuilder_createsCorrectNumberOfBundles_givenThreeMedications() throws ParseException { - // GIVEN - Muster16PrescriptionForm muster16PrescriptionForm = getMuster16PrescriptionFormForTests(); - muster16PrescriptionForm.setPrescriptionList(List.of( - new MedicationString("test", "test", "test", "test", "test", "test"), - new MedicationString("test", "test", "test", "test", "test", "test"), - new MedicationString("test", "test", "test", "test", "test", "test"))); - - prescriptionBundlesBuilder = new PrescriptionBundlesBuilder(muster16PrescriptionForm); - - // WHEN - List<Bundle> fhirEPrescriptionBundles = prescriptionBundlesBuilder.createBundles(); - - // THEN - assertEquals(3, fhirEPrescriptionBundles.size()); - } - - @Test - public void test_Successful_XML_Serialization_Of_An_FHIR_EPrescription_Bundle_Object() { - IParser parser = ctx.newXmlParser(); - - List<Bundle> fhirEPrescriptionBundles = prescriptionBundlesBuilder.createBundles(); - - fhirEPrescriptionBundles.forEach(bundle -> { - parser.setPrettyPrint(true); - - String serialized = parser.encodeResourceToString(bundle); - - logger.info(serialized); - }); - } - - @Test - public void test_Name_null() { - IParser parser = ctx.newXmlParser(); - - prescriptionBundlesBuilder.muster16PrescriptionForm.setPractitionerFirstName(null); - prescriptionBundlesBuilder.muster16PrescriptionForm.setPractitionerLastName(null); - - List<Bundle> fhirEPrescriptionBundles = prescriptionBundlesBuilder.createBundles(); - - fhirEPrescriptionBundles.forEach(bundle -> { - parser.setPrettyPrint(true); - - String serialized = parser.encodeResourceToString(bundle); - - logger.info(serialized); - }); - } - - @Test - public void test_Successful_JSON_Serialization_Of_An_FHIR_EPrescription_Bundle_Object() { - IParser parser = ctx.newJsonParser(); - - List<Bundle> fhirEPrescriptionBundles = prescriptionBundlesBuilder.createBundles(); - - fhirEPrescriptionBundles.forEach(bundle -> { - bundle.setId("sample-id-from-gematik-ti-123456"); - parser.setPrettyPrint(true); - - String serialized = parser.encodeResourceToString(bundle); - - logger.info(serialized); - }); - } - - @Test - public void test_Successful_JSON_To_Bundle_Object_Conversion() { - IParser jsonParser = ctx.newJsonParser(); - - Bundle bundle = jsonParser.parseResource(Bundle.class, GOOD_SIMPLIFIER_NET_SAMPLE_KBV_JSON); - ValidationResult bundleValidationResult = - prescriptionBundleValidator.validateResource(bundle, true); - - assertTrue(bundleValidationResult.isSuccessful()); - } - - @Test - public void test_Successful_Validation_Of_Good_Simplifier_Net_Sample_Used_As_Base_For_Bundle_Creation_Template() throws IOException { - IParser jsonParser = ctx.newJsonParser(); - - try (Reader reader = - new InputStreamReader(PrescriptionBundlesBuilderTest.this.getClass().getResourceAsStream( - "/bundle-samples/bundleTemplatev2_filled-debug-3.json"))) { - Bundle bundle = jsonParser.parseResource(Bundle.class, reader); - ValidationResult bundleValidationResult = - prescriptionBundleValidator.validateResource(bundle, true); - - assertTrue(bundleValidationResult.isSuccessful()); - } - } - - @Test - public void test_Successful_Conversion_Of_The_Populated_Bundle_Json_Template_To_A_Bundle_Object() - throws IOException, XMLStreamException { - SVGExtractor svgExtractor = new SVGExtractor(TemplateProfile.CGM_Z1.configuration); - - try (PDDocument pdDocument = PDDocument.load(getClass() - .getResourceAsStream("/muster-16-print-samples/test1.pdf"))) { - - Map<String, String> map = svgExtractor.extract(pdDocument); - Muster16SvgRegexParser parser = new Muster16SvgRegexParser(map); - - Muster16PrescriptionForm muster16PrescriptionForm = - Muster16FormDataExtractorService.fillForm(parser); -// Muster16PrescriptionForm muster16PrescriptionForm = -// getMuster16PrescriptionFormForTests(); - - muster16PrescriptionForm.setPatientDateOfBirth("02.01.1986"); - - IBundlesBuilder bundleBuilder = new PrescriptionBundlesBuilderV2( - muster16PrescriptionForm); - - List<Bundle> bundles = bundleBuilder.createBundles(); - - if (CollectionUtils.isNotEmpty(bundles)) { - bundles.stream().forEach(bundle -> { - String bundleJsonString = ((EreBundle) bundle).encodeToJson(); - - logger.info("Filled bundle json template result shown below."); - logger.info("=============================================="); - logger.info(bundleJsonString); - }); - } - - Assertions.assertTrue(CollectionUtils.isNotEmpty(bundles)); - } - } - - @Test - public void test_Successful_Validation_Of_A_Compliant_FHIR_KBV_Bundle_Json_Sample_From_SimplifierNet_Site() { - ValidationResult bundleValidationResult = - prescriptionBundleValidator.validateResource(GOOD_SIMPLIFIER_NET_SAMPLE_KBV_JSON, - true); - - assertTrue(bundleValidationResult.isSuccessful()); - } - - @Test - public void test_Expected_Validation_Failure_Of_Good_Unfilled_FHIR_KBV_Bundle_Json_Template_Having_Unresolved_Template_Key_Values_Present() { - ValidationResult bundleValidationResult = - prescriptionBundleValidator.validateResource(GOOD_SIMPLIFIER_NET_SAMPLE_KBV_JSON_AS_A_TEMPLATE, - true); - - Assertions.assertFalse(bundleValidationResult.isSuccessful()); - } - - @Test - public void test_Expected_Validation_Failure_Of_A_Non_Compliant_FHIR_KBV_Bundle_Json_Having_Incorrect_Structure_AND_Data() { - ValidationResult bundleValidationResult = - prescriptionBundleValidator.validateResource(BAD_DENS_SIGN_REQUEST_KBV_JSON, - true); - - Assertions.assertFalse(bundleValidationResult.isSuccessful()); - } - - @Test - public void test_Validation_Of_FHIR_Patient_Resource_With_Missing_Content() { - Patient patient = new Patient(); - - ValidationResult validationResult = - prescriptionBundleValidator.validateResource(patient, true); - assertTrue(validationResult.isSuccessful()); - } - - @Test - public void test_Successful_Validation_Of_An_FHIR_Coverage_Resource() { - Coverage coverageResource = prescriptionBundlesBuilder.createCoverageResource("random_patient_id"); - - ValidationResult validationResult = - prescriptionBundleValidator.validateResource(coverageResource, true); - logger.info("messages:" + validationResult.getMessages()); - assertTrue(validationResult.isSuccessful()); - } - - @Test - public void test_Expected_Validation_Successful_for_JSON_bundle() { - IParser jsonParser = ctx.newJsonParser(); - - jsonParser.setPrettyPrint(true); - - List<Bundle> prescriptionBundles = prescriptionBundlesBuilder.createBundles(); - - prescriptionBundles.forEach(bundle -> { - logger.infof("JSON serialised test bundle object created on back-end is:\n\n%s", - jsonParser.encodeResourceToString(bundle)); - ValidationResult validationResult = - prescriptionBundleValidator.validateResource(bundle, true); - assertTrue(validationResult.isSuccessful()); - }); - } - - @Test - public void test_Successful_Validation_Of_XML_Prescription_Bundle() throws IOException { - try (InputStream is = getClass().getResourceAsStream( - "/bundle-samples/bundle_July_2.xml")) { - byte[] bundleXmlBytes = is.readAllBytes(); - String bundleXmlString = new String(bundleXmlBytes, StandardCharsets.UTF_8); - - ValidationResult bundleValidationResult = - prescriptionBundleValidator.validateResource(bundleXmlString, true); - - assertTrue(bundleValidationResult.isSuccessful()); - } - } - -} diff --git a/src/test/java/health/ere/ps/service/fs/DirectoryWatcherTest.java b/src/test/java/health/ere/ps/service/fs/DirectoryWatcherTest.java deleted file mode 100644 index 3bf62bc8f..000000000 --- a/src/test/java/health/ere/ps/service/fs/DirectoryWatcherTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package health.ere.ps.service.fs; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.nio.file.Files; -import java.nio.file.Path; - -import javax.inject.Inject; - -import org.junit.jupiter.api.Test; - -import health.ere.ps.config.AppConfig; -import health.ere.ps.profile.TitusTestProfile; -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.TestProfile; - -@QuarkusTest -@TestProfile(TitusTestProfile.class) -class DirectoryWatcherTest { - - @Inject - AppConfig appConfig; - - @Inject - DirectoryWatcher directoryWatcher; - - @Test - void testWatcherDirExists() { - assertTrue(Files.exists(Path.of(appConfig.getDirectoryWatcherDir()))); - } - -} diff --git a/src/test/java/health/ere/ps/service/gematik/BearerTokenManageServiceTest.java b/src/test/java/health/ere/ps/service/gematik/BearerTokenManageServiceTest.java index da94df4f4..323903a34 100644 --- a/src/test/java/health/ere/ps/service/gematik/BearerTokenManageServiceTest.java +++ b/src/test/java/health/ere/ps/service/gematik/BearerTokenManageServiceTest.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import javax.websocket.Session; +import jakarta.websocket.Session; import java.time.Instant; import java.util.Base64; import java.util.HashMap; @@ -81,4 +81,25 @@ public void testRequestNewAccessTokenWithValidToken() { assertEquals(bearerTokenMap.size(), 1); assertEquals(bearerTokenMap.get(mockRuntimeConfig), encodedValidToken); } + + @Test + public void testRuntimeConfig() { + Map<RuntimeConfig, String> bearerTokenMap = bearerTokenManageService.bearerToken; + + assertEquals(bearerTokenMap.size(), 0); + RuntimeConfig runtimeConfig = new RuntimeConfig(); + runtimeConfig.setEHBAHandle("HBA-1"); + bearerTokenManageService.requestNewAccessTokenIfNecessary(runtimeConfig, mockSession, "someId"); + + assertEquals(1, bearerTokenMap.size()); + assertEquals(MOCK_JWT, bearerTokenMap.get(runtimeConfig)); + + RuntimeConfig runtimeConfig2 = new RuntimeConfig(); + runtimeConfig2.setEHBAHandle("HBA-1"); + bearerTokenManageService.requestNewAccessTokenIfNecessary(runtimeConfig2, mockSession, "someId"); + + assertEquals(runtimeConfig, runtimeConfig2); + assertEquals(1, bearerTokenMap.size()); + assertEquals(MOCK_JWT, bearerTokenMap.get(runtimeConfig2)); + } } diff --git a/src/test/java/health/ere/ps/service/gematik/ERezeptWorkflowServiceTest.java b/src/test/java/health/ere/ps/service/gematik/ERezeptWorkflowServiceTest.java index b811985ac..d466acec0 100644 --- a/src/test/java/health/ere/ps/service/gematik/ERezeptWorkflowServiceTest.java +++ b/src/test/java/health/ere/ps/service/gematik/ERezeptWorkflowServiceTest.java @@ -27,7 +27,7 @@ import java.util.logging.LogManager; import java.util.logging.Logger; -import javax.inject.Inject; +import jakarta.inject.Inject; import javax.xml.stream.XMLStreamException; import javax.xml.transform.TransformerException; @@ -62,12 +62,9 @@ import health.ere.ps.service.extractor.SVGExtractor; import health.ere.ps.service.fhir.XmlPrescriptionProcessor; import health.ere.ps.service.fhir.bundle.PrescriptionBundlesBuilder; -import health.ere.ps.service.fhir.bundle.PrescriptionBundlesBuilderTest; import health.ere.ps.service.idp.BearerTokenService; import health.ere.ps.service.idp.client.IdpClient; import health.ere.ps.service.idp.client.IdpHttpClientService; -import health.ere.ps.service.muster16.Muster16FormDataExtractorService; -import health.ere.ps.service.muster16.parser.Muster16SvgExtractorParser; import health.ere.ps.service.pdf.DocumentService; import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; @@ -398,50 +395,6 @@ void testCreateERezeptOnPrescriptionServerX110452075() throws IOException, EReze Files.write(Paths.get("target/E-Rezept-" + thisMoment + ".pdf"), a.toByteArray()); } - @Test - @Disabled - void testCreateERezeptWithPrescriptionBuilderOnPrescriptionServer() throws ParseException { - List<Bundle> bundles = new PrescriptionBundlesBuilder( - PrescriptionBundlesBuilderTest.getMuster16PrescriptionFormForTests()).createBundles(); - - bundles.forEach(bundle -> { - log.info(iParser.encodeResourceToString(bundle)); - try { - eRezeptWorkflowService.createERezeptOnPrescriptionServer(bundle); - } catch (ERezeptWorkflowException e) { - e.printStackTrace(); - } - }); - } - - @Disabled - @Test - // This is an integration test case that requires the manual usage of titus https://frontend.titus.ti-dienste.de/#/ - void testCreateERezeptFromPdfOnPrescriptionServer() throws URISyntaxException, - IOException, ParseException, ERezeptWorkflowException, XMLStreamException { - SVGExtractor svgExtractor = new SVGExtractor(CGM_TURBO_MED.configuration, true); - - try (PDDocument pdDocument = PDDocument.load(getClass().getResourceAsStream( - "/muster-16-print-samples/test1.pdf"))) { - Map<String, String> map = svgExtractor.extract(pdDocument); - Muster16SvgExtractorParser muster16Parser = new Muster16SvgExtractorParser(map); - - Muster16PrescriptionForm muster16PrescriptionForm = Muster16FormDataExtractorService.fillForm(muster16Parser); - PrescriptionBundlesBuilder bundleBuilder = - new PrescriptionBundlesBuilder(muster16PrescriptionForm); - - List<Bundle> bundles = bundleBuilder.createBundles(); - bundles.forEach(bundle -> { - log.info(iParser.encodeResourceToString(bundle)); - try { - eRezeptWorkflowService.createERezeptOnPrescriptionServer(bundle); - } catch (ERezeptWorkflowException e) { - e.printStackTrace(); - } - }); - } - } - @Test @Disabled // This is an integration test case that requires the manual usage of titus https://frontend.titus.ti-dienste.de/#/ diff --git a/src/test/java/health/ere/ps/service/gematik/ERezeptWorkflowServiceUnitTest.java b/src/test/java/health/ere/ps/service/gematik/ERezeptWorkflowServiceUnitTest.java index 1a6b08be7..1aba80a09 100644 --- a/src/test/java/health/ere/ps/service/gematik/ERezeptWorkflowServiceUnitTest.java +++ b/src/test/java/health/ere/ps/service/gematik/ERezeptWorkflowServiceUnitTest.java @@ -1,14 +1,18 @@ package health.ere.ps.service.gematik; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import javax.enterprise.event.Event; +import jakarta.enterprise.event.Event; +import jakarta.json.Json; +import jakarta.json.JsonObject; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Identifier; @@ -20,6 +24,7 @@ import de.gematik.ws.conn.connectorcontext.v2.ContextType; import de.gematik.ws.conn.signatureservice.wsdl.v7.SignatureServicePortTypeV755; import health.ere.ps.event.ActivateComfortSignatureEvent; +import health.ere.ps.event.GetSignatureModeEvent; import health.ere.ps.event.GetSignatureModeResponseEvent; import health.ere.ps.exception.gematik.ERezeptWorkflowException; import health.ere.ps.service.connector.cards.ConnectorCardsService; @@ -29,6 +34,23 @@ public class ERezeptWorkflowServiceUnitTest { @Test void testActivateComfortSignatureUnit() throws ERezeptWorkflowException { + ERezeptWorkflowService eRezeptWorkflowServiceUnit = mockERezeptWorkflowServiceUnit(); + + Event<GetSignatureModeResponseEvent> getSignatureModeResponseEvent = (Event<GetSignatureModeResponseEvent>) mock(Event.class); + eRezeptWorkflowServiceUnit.getSignatureModeResponseEvent = getSignatureModeResponseEvent; + + eRezeptWorkflowServiceUnit.onActivateComfortSignatureEvent(new ActivateComfortSignatureEvent(null)); + + ArgumentCaptor<GetSignatureModeResponseEvent> argumentCaptor = ArgumentCaptor.forClass(GetSignatureModeResponseEvent.class); + verify(getSignatureModeResponseEvent).fireAsync(argumentCaptor.capture()); + + GetSignatureModeResponseEvent thrownEvent = argumentCaptor.getValue(); + + assertNotNull(thrownEvent.getUserId()); + assertTrue(thrownEvent.getAnswertToActivateComfortSignature()); + } + + private ERezeptWorkflowService mockERezeptWorkflowServiceUnit() { ERezeptWorkflowService eRezeptWorkflowServiceUnit = new ERezeptWorkflowService(); ConnectorCardsService connectorCardsService = mock(ConnectorCardsService.class); @@ -41,18 +63,28 @@ void testActivateComfortSignatureUnit() throws ERezeptWorkflowException { SignatureServicePortTypeV755 signatureServicePortTypeV755 = mock(SignatureServicePortTypeV755.class); when(connectorServicesProvider.getSignatureServicePortTypeV755(any())).thenReturn(signatureServicePortTypeV755); + return eRezeptWorkflowServiceUnit; + } + @Test + void testOnGetSignatureMode() { + + ERezeptWorkflowService eRezeptWorkflowServiceUnit = mockERezeptWorkflowServiceUnit(); Event<GetSignatureModeResponseEvent> getSignatureModeResponseEvent = (Event<GetSignatureModeResponseEvent>) mock(Event.class); eRezeptWorkflowServiceUnit.getSignatureModeResponseEvent = getSignatureModeResponseEvent; - - eRezeptWorkflowServiceUnit.onActivateComfortSignatureEvent(new ActivateComfortSignatureEvent(null)); - ArgumentCaptor<GetSignatureModeResponseEvent> argumentCaptor = ArgumentCaptor.forClass(GetSignatureModeResponseEvent.class); + + JsonObject jsonObject = Json.createObjectBuilder().add("runtimeConfig", + Json.createObjectBuilder().add("connector.user-id", "37c312a6-eb7f-11ee-8eea-6ba768ebd268") + ).build(); + + eRezeptWorkflowServiceUnit.onGetSignatureModeEvent(new GetSignatureModeEvent(jsonObject)); verify(getSignatureModeResponseEvent).fireAsync(argumentCaptor.capture()); - GetSignatureModeResponseEvent thrownEvent = argumentCaptor.getValue(); assertNotNull(thrownEvent.getUserId()); + assertFalse(thrownEvent.getAnswertToActivateComfortSignature()); + } @Test diff --git a/src/test/java/health/ere/ps/service/gematik/KIMFlowtype169ServiceTest.java b/src/test/java/health/ere/ps/service/gematik/KIMFlowtype169ServiceTest.java index 248278be4..655e30d15 100644 --- a/src/test/java/health/ere/ps/service/gematik/KIMFlowtype169ServiceTest.java +++ b/src/test/java/health/ere/ps/service/gematik/KIMFlowtype169ServiceTest.java @@ -1,5 +1,8 @@ package health.ere.ps.service.gematik; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; @@ -11,8 +14,8 @@ import java.security.cert.CertificateException; import java.util.List; import java.util.Map; +import java.util.Properties; -import javax.json.bind.JsonbBuilder; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; @@ -26,11 +29,12 @@ import health.ere.ps.service.common.security.SecretsManagerService.KeyStoreType; import health.ere.ps.service.common.security.SecretsManagerService.SslContextType; import health.ere.ps.service.connector.endpoint.SSLUtilities; +import jakarta.json.bind.JsonbBuilder; -@Disabled public class KIMFlowtype169ServiceTest { @Test + @Disabled public void testSendERezeptToKIMAddress() { String fromKimAddress = "incentergy_test_02@arv.kim.telematik-test"; String toKimAddress = "dsl5@arv.kim.telematik-test"; @@ -44,6 +48,7 @@ public void testSendERezeptToKIMAddress() { } @Test + @Disabled public void testSearchSee() throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException, UnrecoverableKeyException, KeyManagementException { String searchDisplayName = "See"; @@ -51,12 +56,41 @@ public void testSearchSee() throws NoSuchAlgorithmException, KeyStoreException, } @Test + @Disabled public void testSearchTest() throws NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException, UnrecoverableKeyException, KeyManagementException { String searchDisplayName = "test"; search(searchDisplayName); } + @Test + public void testCreatePropertiesTest() { + Properties prop = KIMFlowtype169Service.createProperties("localhost"); + assertEquals("localhost", prop.getProperty("mail.smtp.host")); + assertNull(prop.getProperty("mail.smtp.port")); + + prop = KIMFlowtype169Service.createProperties("localhost:8025"); + assertEquals("localhost", prop.getProperty("mail.smtp.host")); + assertEquals("8025", prop.getProperty("mail.smtp.port")); + + prop = KIMFlowtype169Service.createProperties("smtp://localhost"); + assertEquals("localhost", prop.getProperty("mail.smtp.host")); + assertNull(prop.getProperty("mail.smtp.port")); + + prop = KIMFlowtype169Service.createProperties("smtps://localhost"); + assertEquals("localhost", prop.getProperty("mail.smtp.host")); + assertNull(prop.getProperty("mail.smtp.port")); + prop = KIMFlowtype169Service.createProperties("smtp://localhost:8025"); + assertEquals("localhost", prop.getProperty("mail.smtp.host")); + assertEquals("8025", prop.getProperty("mail.smtp.port")); + prop = KIMFlowtype169Service.createProperties("smtps://localhost:8025"); + assertEquals("localhost", prop.getProperty("mail.smtp.host")); + assertEquals("8025", prop.getProperty("mail.smtp.port")); + assertEquals("*", prop.getProperty("mail.smtp.ssl.trust")); + + } + + private void search(String searchDisplayName) throws FileNotFoundException, NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, UnrecoverableKeyException, KeyManagementException { String connectorTlsCertAuthStorePwd = "N4rouwibGRhne2Fa"; diff --git a/src/test/java/health/ere/ps/service/gematik/MassGenerator2Test.java b/src/test/java/health/ere/ps/service/gematik/MassGenerator2Test.java index 8680ae1fe..19aced811 100644 --- a/src/test/java/health/ere/ps/service/gematik/MassGenerator2Test.java +++ b/src/test/java/health/ere/ps/service/gematik/MassGenerator2Test.java @@ -27,8 +27,6 @@ import java.util.stream.Collectors; import java.util.stream.StreamSupport; -import javax.inject.Inject; - import org.gradle.internal.impldep.com.google.common.collect.Lists; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Coverage; @@ -39,13 +37,12 @@ import org.hl7.fhir.r4.model.Practitioner; import org.hl7.fhir.r4.model.Reference; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.model.api.TemporalPrecisionEnum; import ca.uhn.fhir.parser.IParser; -import ca.uhn.fhir.validation.ValidationResult; import de.gematik.ws.conn.eventservice.wsdl.v7.FaultMessage; import health.ere.ps.config.AppConfig; import health.ere.ps.config.RuntimeConfig; @@ -60,6 +57,7 @@ import health.ere.ps.validation.fhir.bundle.PrescriptionBundleValidator; import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; +import jakarta.inject.Inject; @QuarkusTest @Disabled @@ -133,7 +131,7 @@ void testCreateERezeptMassCreateManuel3() throws Exception { } @Test void testCreateERezeptMassCreateCIDA() throws Exception { - createERezeptMassCreate("../secret-test-print-samples/CIDA/egk/cards.txt", null, "../secret-test-print-samples/CIDA/CIDA-10/", true); + createERezeptMassCreate("../secret-test-print-samples/CIDA/egk/cards.txt", null, "../secret-test-print-samples/CIDA/CIDA-11/", true); } @Test void testCreateERezeptMassCGMLauer() throws Exception { @@ -256,12 +254,7 @@ void createERezeptMassCreate(String cardsString, String insuranceString, String Coverage coverage = ((Coverage)bundle.getEntry().stream().filter(e -> e.getResource() instanceof Coverage).findAny().get().getResource()); ((Reference)coverage.getPayor().get(0)).getIdentifier().setValue(singleInsurance); } - ValidationResult validationResult = prescriptionBundleValidator.validateResource(bundle, true); - if(validationResult.isSuccessful()) { - bundles.add(bundle); - } else { - log.info(entry.toFile().getName()+" is not valid"); - } + bundles.add(bundle); } // System.out.println(iParser.encodeResourceToString(bundle)); //if(2 == 1+1) { @@ -394,12 +387,7 @@ void createERezeptMassCreateBatch(String cardsString, String insuranceString, St Coverage coverage = ((Coverage)bundle.getEntry().stream().filter(e -> e.getResource() instanceof Coverage).findAny().get().getResource()); ((Reference)coverage.getPayor().get(0)).getIdentifier().setValue(singleInsurance); } - ValidationResult validationResult = prescriptionBundleValidator.validateResource(bundle, true); - if(validationResult.isSuccessful()) { - bundles.add(bundle); - } else { - log.info(myFile.getName()+" is not valid"); - } + bundles.add(bundle); } // System.out.println(iParser.encodeResourceToString(bundle)); //if(2 == 1+1) { diff --git a/src/test/java/health/ere/ps/service/gematik/MassGeneratorTest.java b/src/test/java/health/ere/ps/service/gematik/MassGeneratorTest.java index cb4a7bf35..61fb90645 100644 --- a/src/test/java/health/ere/ps/service/gematik/MassGeneratorTest.java +++ b/src/test/java/health/ere/ps/service/gematik/MassGeneratorTest.java @@ -30,8 +30,6 @@ import java.util.logging.Logger; import java.util.stream.Collectors; -import javax.inject.Inject; - import org.hl7.fhir.r4.model.Address; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.CodeType; @@ -47,7 +45,6 @@ import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.model.api.TemporalPrecisionEnum; import ca.uhn.fhir.parser.IParser; -import ca.uhn.fhir.validation.ValidationResult; import de.gematik.ws.conn.eventservice.wsdl.v7.FaultMessage; import health.ere.ps.config.AppConfig; import health.ere.ps.config.RuntimeConfig; @@ -62,6 +59,7 @@ import health.ere.ps.validation.fhir.bundle.PrescriptionBundleValidator; import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; +import jakarta.inject.Inject; @QuarkusTest @Disabled @@ -224,48 +222,45 @@ void testCreateERezeptMassCreate() throws Exception { //if(2 == 1+1) { // break; //} - ValidationResult validationResult = prescriptionBundleValidator.validateResource(bundle, true); - if(validationResult.isSuccessful()) { - List<BundleWithAccessCodeOrThrowable> bundleWithAccessCodeOrThrowables; - bundles.put(entry, bundle); - if(bundles.size() == 30) { + + List<BundleWithAccessCodeOrThrowable> bundleWithAccessCodeOrThrowables; + bundles.put(entry, bundle); + if(bundles.size() == 30) { - try { - bundleWithAccessCodeOrThrowables = eRezeptWorkflowService.createMultipleERezeptsOnPrescriptionServer(new ArrayList<Bundle>(bundles.values()), runtimeConfig); - - } catch(Exception ex) { - bundleWithAccessCodeOrThrowables = Arrays.asList(new BundleWithAccessCodeOrThrowable(ex)); - ex.printStackTrace(); - } - int z = 0; - for(BundleWithAccessCodeOrThrowable bundleWithAccessCodeOrThrowable : bundleWithAccessCodeOrThrowables) { - entry = new ArrayList<Path>(bundles.keySet()).get(z); - z++; - String thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH_mm_ssX") - .withZone(ZoneOffset.UTC) - .format(Instant.now()); - - if(bundleWithAccessCodeOrThrowable.getThrowable() != null) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - bundleWithAccessCodeOrThrowable.getThrowable().printStackTrace(pw); - Files.write(Paths.get("target/"+entry.toFile().getName().replace(".xml", "")+"-"+card.get("nummer")+"-"+ thisMoment + ".txt"), sw.toString().getBytes()); - Files.write(Paths.get("target/"+entry.toFile().getName().replace(".xml", "")+"-"+card.get("nummer")+"-"+ thisMoment + ".xml"), iParser.encodeResourceToString(bundleWithAccessCodeOrThrowable.getBundle()).getBytes()); - } else { - ByteArrayOutputStream a = documentService.generateERezeptPdf(Arrays.asList(bundleWithAccessCodeOrThrowable)); - String fileName = entry.toFile().getName().replace(".xml", "")+"-"+card.get("nummer")+"-" + thisMoment + ".pdf"; - Files.write(Paths.get("target/"+fileName), a.toByteArray()); - fw.write(bundleWithAccessCodeOrThrowable.getBundle().getIdentifier().getValue()+","+fileName+","+bundleWithAccessCodeOrThrowable.getAccessCode()+","+card.get("nummer")+"\n"); - fw.flush(); - } - - log.info("Time: "+thisMoment); + try { + bundleWithAccessCodeOrThrowables = eRezeptWorkflowService.createMultipleERezeptsOnPrescriptionServer(new ArrayList<Bundle>(bundles.values()), runtimeConfig); + + } catch(Exception ex) { + bundleWithAccessCodeOrThrowables = Arrays.asList(new BundleWithAccessCodeOrThrowable(ex)); + ex.printStackTrace(); + } + int z = 0; + for(BundleWithAccessCodeOrThrowable bundleWithAccessCodeOrThrowable : bundleWithAccessCodeOrThrowables) { + entry = new ArrayList<Path>(bundles.keySet()).get(z); + z++; + String thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH_mm_ssX") + .withZone(ZoneOffset.UTC) + .format(Instant.now()); + + if(bundleWithAccessCodeOrThrowable.getThrowable() != null) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + bundleWithAccessCodeOrThrowable.getThrowable().printStackTrace(pw); + Files.write(Paths.get("target/"+entry.toFile().getName().replace(".xml", "")+"-"+card.get("nummer")+"-"+ thisMoment + ".txt"), sw.toString().getBytes()); + Files.write(Paths.get("target/"+entry.toFile().getName().replace(".xml", "")+"-"+card.get("nummer")+"-"+ thisMoment + ".xml"), iParser.encodeResourceToString(bundleWithAccessCodeOrThrowable.getBundle()).getBytes()); + } else { + ByteArrayOutputStream a = documentService.generateERezeptPdf(Arrays.asList(bundleWithAccessCodeOrThrowable)); + String fileName = entry.toFile().getName().replace(".xml", "")+"-"+card.get("nummer")+"-" + thisMoment + ".pdf"; + Files.write(Paths.get("target/"+fileName), a.toByteArray()); + fw.write(bundleWithAccessCodeOrThrowable.getBundle().getIdentifier().getValue()+","+fileName+","+bundleWithAccessCodeOrThrowable.getAccessCode()+","+card.get("nummer")+"\n"); + fw.flush(); } - bundles.clear(); + + log.info("Time: "+thisMoment); } - } else { - log.info(entry.toFile().getName()+" is not valid"); + bundles.clear(); } + i++; if(i % 200 == 0) { eRezeptWorkflowService.deactivateComfortSignature(runtimeConfig); diff --git a/src/test/java/health/ere/ps/service/gematik/PharmacyServiceTest.java b/src/test/java/health/ere/ps/service/gematik/PharmacyServiceTest.java index 3ad6d5c45..85b174e75 100644 --- a/src/test/java/health/ere/ps/service/gematik/PharmacyServiceTest.java +++ b/src/test/java/health/ere/ps/service/gematik/PharmacyServiceTest.java @@ -4,7 +4,7 @@ import java.util.logging.LogManager; import java.util.logging.Logger; -import javax.inject.Inject; +import jakarta.inject.Inject; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; diff --git a/src/test/java/health/ere/ps/service/gematik/PrefillPrescriptionServiceTest.java b/src/test/java/health/ere/ps/service/gematik/PrefillPrescriptionServiceTest.java index 04b6fb9e2..4375ed198 100644 --- a/src/test/java/health/ere/ps/service/gematik/PrefillPrescriptionServiceTest.java +++ b/src/test/java/health/ere/ps/service/gematik/PrefillPrescriptionServiceTest.java @@ -4,9 +4,9 @@ import java.security.cert.CertificateEncodingException; import java.util.logging.LogManager; -import javax.inject.Inject; +import jakarta.inject.Inject; +import jakarta.xml.bind.JAXBException; import javax.naming.InvalidNameException; -import javax.xml.bind.JAXBException; import org.bouncycastle.crypto.CryptoException; import org.hl7.fhir.r4.model.Bundle; diff --git a/src/test/java/health/ere/ps/service/idp/client/AuthenticatorClientTest.java b/src/test/java/health/ere/ps/service/idp/client/AuthenticatorClientTest.java index 03de545d5..29f3db960 100644 --- a/src/test/java/health/ere/ps/service/idp/client/AuthenticatorClientTest.java +++ b/src/test/java/health/ere/ps/service/idp/client/AuthenticatorClientTest.java @@ -3,8 +3,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import javax.inject.Inject; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.ws.rs.core.Response; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.RandomStringUtils; diff --git a/src/test/java/health/ere/ps/service/idp/client/IdpClientTest.java b/src/test/java/health/ere/ps/service/idp/client/IdpClientTest.java index d13770709..89eb9443b 100644 --- a/src/test/java/health/ere/ps/service/idp/client/IdpClientTest.java +++ b/src/test/java/health/ere/ps/service/idp/client/IdpClientTest.java @@ -1,12 +1,10 @@ package health.ere.ps.service.idp.client; -import java.io.IOException; import java.security.Security; import java.security.cert.X509Certificate; -import java.util.logging.LogManager; import java.util.logging.Logger; -import javax.inject.Inject; +import jakarta.inject.Inject; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.junit.jupiter.api.Assertions; @@ -23,15 +21,17 @@ import health.ere.ps.exception.idp.IdpException; import health.ere.ps.exception.idp.IdpJoseException; import health.ere.ps.model.idp.client.IdpTokenResult; -import health.ere.ps.profile.TitusTestProfile; +import health.ere.ps.profile.RUTestProfile; import health.ere.ps.service.connector.cards.ConnectorCardsService; import health.ere.ps.service.connector.certificate.CardCertificateReaderService; import health.ere.ps.service.connector.endpoint.SSLUtilities; import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; +import org.junit.jupiter.api.Disabled; @QuarkusTest -@TestProfile(TitusTestProfile.class) +@TestProfile(RUTestProfile.class) +@Disabled public class IdpClientTest { static { @@ -57,14 +57,14 @@ public static void init() { SSLUtilities.trustAllHostnames(); SSLUtilities.trustAllHttpsCertificates(); - try { + /*try { // https://community.oracle.com/thread/1307033?start=0&tstart=0 LogManager.getLogManager().readConfiguration( IdpClientTest.class .getResourceAsStream("/logging.properties")); } catch (IOException e) { e.printStackTrace(); - } + }*/ System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true"); System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true"); @@ -80,7 +80,6 @@ void configureSecureTransport() { } @Test - @Tag("titus") public void test_Successful_Idp_Login_With_Connector_Smcb() throws IdpJoseException, IdpClientException, IdpException, ConnectorCardCertificateReadException, ConnectorCardsException { diff --git a/src/test/java/health/ere/ps/service/ipp/PrinterServiceTest.java b/src/test/java/health/ere/ps/service/ipp/PrinterServiceTest.java deleted file mode 100644 index e18699df5..000000000 --- a/src/test/java/health/ere/ps/service/ipp/PrinterServiceTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package health.ere.ps.service.ipp; - -import com.hp.jipp.encoding.IppPacket; -import com.hp.jipp.model.Operation; -import com.hp.jipp.trans.IppPacketData; -import health.ere.ps.model.ipp.IppPrinter; -import health.ere.ps.profile.TitusTestProfile; -import io.quarkus.test.junit.QuarkusMock; -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.TestProfile; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import javax.inject.Inject; -import java.io.IOException; -import java.net.URI; -import java.util.Collections; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@QuarkusTest -@TestProfile(TitusTestProfile.class) -public class PrinterServiceTest { - - @Inject - PrinterService printerService; - - @BeforeAll - public static void setup() { - IppPrinter mockIppPrinter = mock(IppPrinter.class); - when(mockIppPrinter.getOperationAttributes()).thenReturn(Collections.emptyList()); - when(mockIppPrinter.getPrinterAttributes(any())).thenReturn(Collections.emptyList()); - - QuarkusMock.installMockForType(mockIppPrinter, IppPrinter.class); - } - - @Test - public void testBuildPrinterAttributesOperationPacket() throws IOException { - URI uri = URI.create("https://example.com"); - IppPacketData data = new IppPacketData(new IppPacket(Operation.getPrinterAttributes, 1)); - IppPacketData packetData = printerService.handleIppPacketData(uri, data); - assertEquals(1, packetData.getPacket().getRequestId()); - } - - @Test - public void testBuildDefaultPacket() throws IOException { - URI uri = URI.create("https://example.com"); - IppPacketData data = new IppPacketData(new IppPacket(Operation.updateDocumentStatus,1)); - IppPacketData packetData = printerService.handleIppPacketData(uri, data); - assertEquals(1, packetData.getPacket().getRequestId()); - } -} diff --git a/src/test/java/health/ere/ps/service/kbv/GenerateKBVCertificationBundlesServiceTest.java b/src/test/java/health/ere/ps/service/kbv/GenerateKBVCertificationBundlesServiceTest.java index 83eecff44..b91c25953 100644 --- a/src/test/java/health/ere/ps/service/kbv/GenerateKBVCertificationBundlesServiceTest.java +++ b/src/test/java/health/ere/ps/service/kbv/GenerateKBVCertificationBundlesServiceTest.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.stream.Collectors; -import javax.inject.Inject; import javax.xml.transform.TransformerException; import org.apache.fop.apps.FOPException; @@ -31,6 +30,7 @@ import health.ere.ps.validation.fhir.bundle.PrescriptionBundleValidator; import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; +import jakarta.inject.Inject; @QuarkusTest @Disabled @@ -54,7 +54,6 @@ public class GenerateKBVCertificationBundlesServiceTest { static boolean useTitus = true; static boolean generateSignatureAndPdf = true; - static boolean validateResources = false; @Test public void testPF01() throws IOException, InvalidCanonicalizerException, XMLParserException, CanonicalizationException, ERezeptWorkflowException, FOPException, TransformerException { @@ -72,9 +71,6 @@ private void processBundle(String testCase, boolean generateSignature, boolean g byte[] canonicalBytes = ERezeptWorkflowService.getCanonicalXmlBytes(bundle); Files.write(Paths.get("src/test/resources/kbv-zip/"+testCase+".xml"), canonicalBytes); if(generateSignatureAndPdf){ - if(validateResources) { - prescriptionBundleValidator.validateResource(bundle, true); - } if(generateSignature) { SignResponse signResponse = eRezeptWorkflowService.signBundleWithIdentifiers(bundle); Files.write(Paths.get("src/test/resources/kbv-zip/"+testCase+".p7s"), signResponse.getSignatureObject().getBase64Signature().getValue()); @@ -189,7 +185,7 @@ public void testPF10() throws IOException, InvalidCanonicalizerException, XMLPar } @Test - @Disabled + // @Disabled public void testRegeneratePdf() throws IOException, FOPException, TransformerException { genPDF("PF01", "d78fe79c81be9541bcf7a95c8254821e3ab3e88eaa1898db9e1b78a982fc94b2"); diff --git a/src/test/java/health/ere/ps/service/logging/EreLogNotificationEventHandler.java b/src/test/java/health/ere/ps/service/logging/EreLogNotificationEventHandler.java index 09042d127..68d3f6f1e 100644 --- a/src/test/java/health/ere/ps/service/logging/EreLogNotificationEventHandler.java +++ b/src/test/java/health/ere/ps/service/logging/EreLogNotificationEventHandler.java @@ -2,9 +2,9 @@ import org.jboss.logging.Logger; -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.event.ObservesAsync; -import javax.inject.Inject; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.event.ObservesAsync; +import jakarta.inject.Inject; import health.ere.ps.event.EreLogNotificationEvent; diff --git a/src/test/java/health/ere/ps/service/muster16/parser/Muster16FormDataParserTest.java b/src/test/java/health/ere/ps/service/muster16/parser/Muster16FormDataParserTest.java deleted file mode 100644 index 437ad0ab7..000000000 --- a/src/test/java/health/ere/ps/service/muster16/parser/Muster16FormDataParserTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package health.ere.ps.service.muster16.parser; - -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Inject; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.text.PDFTextStripper; -import org.jboss.logging.Logger; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import health.ere.ps.profile.TitusTestProfile; -import io.quarkus.test.junit.QuarkusTest; -import io.quarkus.test.junit.TestProfile; - -@QuarkusTest -@TestProfile(TitusTestProfile.class) -class Muster16FormDataParserTest { - - @Inject - Logger logger; - - - @Test - @Disabled("Currently failing. Reference is being made to file test1.pdf which " + - "cannot be found, particularly on the machine of a developer who does not have access " + - "to this file after checking out the main branch.") - public void testReadMuster16FormPDF() throws IOException { - try (PDDocument document = PDDocument - .load(new FileInputStream("../secret-test-print-samples/CGM-Turbomed/test1.pdf"))) { - - document.getClass(); - - if (!document.isEncrypted()) { - PDFTextStripper tStripper = new PDFTextStripper(); - String pdfFileInText = tStripper.getText(document); - - // split by whitespace - String lines[] = pdfFileInText.split("\\r?\\n"); - List<String> pdfLines = new ArrayList<>(); - StringBuilder sb = new StringBuilder(); - for (String line : lines) { - logger.info(line); - } - } - } - } -} \ No newline at end of file diff --git a/src/test/java/health/ere/ps/service/muster16/parser/regxer/MedicationDataIntermediateParserTest.java b/src/test/java/health/ere/ps/service/muster16/parser/regxer/MedicationDataIntermediateParserTest.java deleted file mode 100644 index 16f48662c..000000000 --- a/src/test/java/health/ere/ps/service/muster16/parser/regxer/MedicationDataIntermediateParserTest.java +++ /dev/null @@ -1,200 +0,0 @@ -package health.ere.ps.service.muster16.parser.regxer; - -import health.ere.ps.service.muster16.parser.rgxer.delegate.medication.MedicationEntryParseDelegate; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class MedicationDataIntermediateParserTest { - - private final String lineSep = System.lineSeparator(); - - @Test - void testParsePrescription_CGM_Z1() { - String entry = "Amoxicillin 1000mg N2\n" + - "3x täglich alle 8 Std\n" + - "- - - - - - - - - - - - - - - - -"; - - MedicationEntryParseDelegate parser = new MedicationEntryParseDelegate(); - List<String> result = parser.parse(entry); - - assertEquals(1, result.size()); - assertTrue(result.get(0).startsWith("Amoxicillin")); - } - - @Test - void testPrescriptionIntermediateParsing_CGMTurboMed() { - String entry = "Novalgin AMP N1 5X2 ml\n" + - "- - - -\n" + - "- - - -\n" + - "PZN04527098"; - - - MedicationEntryParseDelegate parser = new MedicationEntryParseDelegate(); - List<String> result = parser.parse(entry); - - assertEquals(1, result.size()); - assertTrue(result.get(0).startsWith("Novalgin")); - } - - @Test - void testPrescriptionIntermediateParsing_Apraxos() { - String entry = "**************************************************\n" + - "Ibuprofen 800mg (PZN: 01016144) »1 - 1 - 1« \n" + - "**************************************************"; - - - MedicationEntryParseDelegate parser = new MedicationEntryParseDelegate(); - List<String> result = parser.parse(entry); - - assertEquals(1, result.size()); - assertTrue(result.get(0).startsWith("Ibuprofen")); - } - - @Test - void testPrescriptionInitialParsing_Dens1() { - - String entry = "Ibuprofen 600mg 1-1-1\n" + - "Omeprazol 40 mg 0-0-1\n" + - "Amoxicillin 1.000 mg 1-0-1"; - - MedicationEntryParseDelegate parser = new MedicationEntryParseDelegate(); - List<String> result = parser.parse(entry); - - assertEquals(3, result.size()); - assertTrue(result.get(0).startsWith("Ibuprofen")); - assertTrue(result.get(1).startsWith("Omeprazol")); - assertTrue(result.get(2).startsWith("Amoxicillin")); - } - - @Test - void testPrescriptionInitialParsing_DENS3() { - - MedicationEntryParseDelegate parser = new MedicationEntryParseDelegate(); - String entry = "Azithromycin 500mg 1-0-0 für\n" + - "3 Tage\n" + - "Amoxicillin 500mg 1-1-1 in\n" + - "Kombination mit\n" + - "Metronidazol 400mg 1-0-1\n" + - "für 5 bis 7 Tage"; - List<String> result = parser.parse(entry); - - assertEquals(3, result.size()); - assertTrue(result.get(0).startsWith("Azithromycin")); - assertTrue(result.get(1).startsWith("Amoxicillin")); - assertTrue(result.get(2).startsWith("Metronidazol")); - } - - @Test - void testPrescriptionInitialParsing_DENS4() { - MedicationEntryParseDelegate parser = new MedicationEntryParseDelegate(); - - String entry = "Cefuroxim 500mg 1-0-1\n" + - "Ibuprofen 600mg 1-1-1\n" + - "Metamizol 20 Topfen/500mg bei\n" + - "Bedarf"; - - List<String> result = parser.parse(entry); - - assertEquals(3, result.size()); - assertTrue(result.get(0).startsWith("Cefuroxim")); - assertTrue(result.get(1).startsWith("Ibuprofen")); - assertTrue(result.get(2).startsWith("Metamizol")); - } - - @Test - @Disabled - void testPrescriptionInitialParsing_DENS5() { - - MedicationEntryParseDelegate parser = new MedicationEntryParseDelegate(); - - String entry = "Amoxicillin 3.000mg 1 Stunde \n" + - "vor dem Eingriff\n" + - "Abschwellende Nasentropfen \n" + - "(z.B. Xylomet-hazolin) 6x \n" + - "Inhalationen"; - - List<String> result = parser.parse(entry); - - assertEquals(2, result.size()); - assertTrue(result.get(0).startsWith("Amoxicillin")); - assertTrue(result.get(1).startsWith("Abschwellende")); - } - - @Test - void testPrescriptionInitialParsing_DENS6() { - - MedicationEntryParseDelegate parser = new MedicationEntryParseDelegate(); - - String entry = "Diclofenac 75mg 1-0-1\n" + - "Diazepam 5mg 0-0-1\n" + - "Einnahmedauer begrenzt auf \n" + - "weniger als 1 Woche "; - - List<String> result = parser.parse(entry); - - assertEquals(2, result.size()); - assertTrue(result.get(0).startsWith("Diclofenac")); - assertTrue(result.get(1).startsWith("Diazepam")); - } - - @Test - @Disabled - void testPrescriptionInitialParsing_DENS7() { - - MedicationEntryParseDelegate parser = new MedicationEntryParseDelegate(); - - String entry = "Ciprofloxacin 500mg \n" + - "morgens und abends \n" + - "Clavulansäure 125mg 1-0-1\n" + - "Xylomet-hazolin 6x täglich"; - - List<String> result = parser.parse(entry); - - assertEquals(3, result.size()); - assertTrue(result.get(0).startsWith("Ciprofloxacin")); - assertTrue(result.get(1).startsWith("Clavulansäure")); - assertTrue(result.get(2).startsWith("Xylomet-hazolin")); - } - - @Test - void testPrescriptionInitialParsing_DENS8() { - - MedicationEntryParseDelegate parser = new MedicationEntryParseDelegate(); - - String entry = "Fluoretten 0,25 mg\n" + - "Zymafluor 0,5mg\n" + - "Bifluorid 6 %"; - - List<String> result = parser.parse(entry); - - assertEquals(3, result.size()); - assertTrue(result.get(0).startsWith("Fluoretten")); - assertTrue(result.get(1).startsWith("Zymafluor")); - assertTrue(result.get(2).startsWith("Bifluorid")); - } - - @Test - void testPrescriptionInitialParsing_DENS10() { - - MedicationEntryParseDelegate parser = new MedicationEntryParseDelegate(); - - String entry = "Duraphat 5 % immer nach dem \n" + - "Essen auftragen\n" + - "Fluor Protector bitte \n" + - "mehrmals täglich einnehmen\n" + - "Multifluorid verordnet \n" + - "durch Dr. Mustermann"; - - List<String> result = parser.parse(entry); - - assertEquals(3, result.size()); - assertTrue(result.get(0).startsWith("Duraphat")); - assertTrue(result.get(1).startsWith("Fluor")); - assertTrue(result.get(2).startsWith("Multifluorid")); - } -} diff --git a/src/test/java/health/ere/ps/service/muster16/parser/regxer/MedicationParserTest.java b/src/test/java/health/ere/ps/service/muster16/parser/regxer/MedicationParserTest.java deleted file mode 100644 index e86fc7da7..000000000 --- a/src/test/java/health/ere/ps/service/muster16/parser/regxer/MedicationParserTest.java +++ /dev/null @@ -1,269 +0,0 @@ -package health.ere.ps.service.muster16.parser.regxer; - -import health.ere.ps.model.muster16.MedicationString; -import health.ere.ps.service.muster16.parser.rgxer.delegate.medication.MedicationParseDelegate; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class MedicationParserTest { - - private static MedicationParseDelegate parser; - - @BeforeAll - static void init() { - parser = new MedicationParseDelegate(); - } - - - @Test - void testParsePrescription_CGM_Z1() { - String entry = "Amoxicillin 1000mg N2 3x täglich alle 8 Std"; -// String entry = "Amoxicillin 3.000mg 1 Stunde \nvor dem Eingriff\nAbschwellende Nasentropfen \n(z.B. Xylomet-hazolin) 6x \nInhalationen"; - - - List<MedicationString> result = parser.parse(entry); - - assertEquals(1, result.size()); - - MedicationString result1 = result.get(0); - assertEquals("N2", result1.getSize()); - assertEquals("Amoxicillin 1000mg N2", result1.getName()); - assertEquals("3x täglich alle 8 Std", result1.getDosage()); - } - - @Test - void testParsePrescription_CGMTurboMed() { - String entry = "Novalgin AMP N1 5X2 ml\n" + - "- - - -\n" + - "- - - -\n" + - "PZN04527098"; - - List<MedicationString> result = parser.parse(entry); - - assertEquals(1, result.size()); - - MedicationString result1 = result.get(0); - assertEquals("N1", result1.getSize()); - assertEquals("AMP", result1.getForm()); - assertEquals("Novalgin AMP N1 5X2 ml", result1.getName()); - assertEquals("04527098", result1.getPzn()); - assertEquals("", result1.getDosage()); - } - - @Test - void testParseApraxos() { - String entry = "Ibuprofen 800mg (PZN: 01016144) »1 - 1 - 1« "; - - List<MedicationString> result = parser.parse(entry); - - assertEquals(1, result.size()); - - MedicationString result1 = result.get(0); - assertEquals("01016144", result1.getPzn()); - assertEquals("N2", result1.getSize()); - assertTrue(result1.getName().startsWith("Ibuprofen 800mg")); - assertTrue(result1.getDosage().startsWith("1 - 1 - 1")); - } - - @Test - void testParseDens1() { - String entry = "Ibuprofen 600mg 1-1-1\n" + - "Omeprazol 40 mg 0-0-1\n" + - "Amoxicillin 1.000 mg 1-0-1"; - - - List<MedicationString> result = parser.parse(entry); - - assertEquals(3, result.size()); - - MedicationString result1 = result.get(0); - assertEquals("Ibuprofen 600mg", result1.getName()); - assertEquals("1-1-1", result1.getDosage()); - - - MedicationString result2 = result.get(1); - assertEquals("Omeprazol 40 mg", result2.getName()); - assertEquals("0-0-1", result2.getDosage()); - - MedicationString result3 = result.get(2); - assertEquals("Amoxicillin 1.000 mg", result3.getName()); - assertEquals("1-0-1", result3.getDosage()); - } - - @Test - void testParseDens2() { - String entry = "Metamizol 20 Topfen/500mg bei Bedarf, Tageshöchstdosis: 1.5\n" + - "Pantoprazol 40mg 1-0-0\n" + - "Clindamycin 600mg 1-0-1 für 5\n" + - "bis 7 Tage"; - - List<MedicationString> result = parser.parse(entry); - - assertEquals(3, result.size()); - - MedicationString result1 = result.get(0); - assertEquals("Metamizol 20 Topfen/500mg", result1.getName()); - assertEquals("bei Bedarf, Tageshöchstdosis: 1.5", result1.getDosage()); - - MedicationString result2 = result.get(1); - assertEquals("Pantoprazol 40mg", result2.getName()); - assertEquals("1-0-0", result2.getDosage()); - - MedicationString result3 = result.get(2); - assertEquals("Clindamycin 600mg", result3.getName()); - assertEquals("1-0-1 für 5 bis 7 Tage", result3.getDosage()); - } - - @Test - void testParseDens3() { - String entry = "Azithromycin 500mg 1-0-0 für \n" + - "3 Tage\n" + - "Amoxicillin 500mg 1-1-1 in \n" + - "Kombination mit\n" + - "Metronidazol 400mg 1-0-1 \n" + - "für 5 bis 7 Tage "; - - List<MedicationString> result = parser.parse(entry); - - assertEquals(3, result.size()); - - MedicationString result1 = result.get(0); - assertEquals("Azithromycin 500mg", result1.getName()); - assertEquals("1-0-0 für 3 Tage", result1.getDosage()); - - MedicationString result2 = result.get(1); - assertEquals("Amoxicillin 500mg", result2.getName()); - assertEquals("1-1-1 in Kombination mit", result2.getDosage()); - - MedicationString result3 = result.get(2); - assertEquals("Metronidazol 400mg", result3.getName()); - assertEquals("1-0-1 für 5 bis 7 Tage", result3.getDosage()); - } - - @Test - void testParseDens4() { - String entry = "Cefuroxim 500mg 1-0-1\n" + - "Ibuprofen 600mg 1-1-1\n" + - "Metamizol 20 Topfen/500mg bei\n" + - "Bedarf"; - - List<MedicationString> result = parser.parse(entry); - - assertEquals(3, result.size()); - - MedicationString result1 = result.get(0); - assertEquals("Cefuroxim 500mg", result1.getName()); - assertEquals("1-0-1", result1.getDosage()); - - MedicationString result2 = result.get(1); - assertEquals("Ibuprofen 600mg", result2.getName()); - assertEquals("1-1-1", result2.getDosage()); - - MedicationString result3 = result.get(2); - assertEquals("Metamizol 20 Topfen/500mg", result3.getName()); - assertEquals("bei Bedarf", result3.getDosage()); - } - - @Test - void testParseDens6() { - String entry = "Diclofenac 75mg 1-0-1\n" + - "Diazepam 5mg 0-0-1\n" + - "Einnahmedauer begrenzt auf \n" + - "weniger als 1 Woche "; - - List<MedicationString> result = parser.parse(entry); - - assertEquals(2, result.size()); - - MedicationString result1 = result.get(0); - assertEquals("Diclofenac 75mg", result1.getName()); - assertEquals("1-0-1", result1.getDosage()); - - MedicationString result2 = result.get(1); - assertEquals("Diazepam 5mg", result2.getName()); - assertEquals("0-0-1 Einnahmedauer begrenzt auf weniger als 1 Woche", result2.getDosage()); - } - - @Test - @Disabled - void testParseDens7() { - String entry = "Ciprofloxacin 500mg \n" + - "morgens und abends \n" + - "Clavulansäure 125mg 1-0-1\n" + - "Xylometazolin 6x täglich"; - - List<MedicationString> result = parser.parse(entry); - - assertEquals(2, result.size()); - - MedicationString result1 = result.get(0); - assertEquals("Ciprofloxacin 500mg", result1.getName()); - assertEquals("morgens und abends", result1.getDosage()); - - MedicationString result2 = result.get(1); - assertEquals("Clavulansäure 125mg", result2.getName()); - assertEquals("1-0-1", result2.getDosage()); - - MedicationString result3 = result.get(3); - assertEquals("Xylomet-hazolin", result2.getName()); - assertEquals("6x täglich", result2.getDosage()); - } - - @Test - void testParseDens8() { - String entry = "Fluoretten 0,25 mg \n" + - "Zymafluor 0,5mg\n" + - "Bifluorid 6 %"; - - List<MedicationString> result = parser.parse(entry); - - assertEquals(3, result.size()); - - MedicationString result1 = result.get(0); - assertEquals("Fluoretten 0,25 mg", result1.getName()); - assertEquals("", result1.getDosage()); - - MedicationString result2 = result.get(1); - assertEquals("Zymafluor 0,5mg", result2.getName()); - assertEquals("", result2.getDosage()); - - MedicationString result3 = result.get(2); - assertEquals("Bifluorid 6 %", result3.getName()); - assertEquals("", result3.getDosage()); - - } - - @Test - @Disabled - void testParseDens10() { - String entry = "Duraphat 5 % immer nach dem \n" + - "Essen auftragen\n" + - "Fluor Protector bitte \n" + - "mehrmals täglich einnehmen\n" + - "Multifluorid verordnet \n" + - "durch Dr. Mustermann"; - - List<MedicationString> result = parser.parse(entry); - - assertEquals(3, result.size()); - - MedicationString result1 = result.get(0); - assertEquals("Duraphat 5 %", result1.getName()); - assertEquals("immer nach dem Essen auftragen", result1.getDosage()); - - MedicationString result2 = result.get(1); - assertEquals("Fluor Protector", result2.getName()); - assertEquals("bitte mehrmals täglich einnehmen", result2.getDosage()); - - MedicationString result3 = result.get(2); - assertEquals("Multifluorid", result3.getName()); - assertEquals("verordnet durch Dr. Mustermann", result3.getDosage()); - } - -} diff --git a/src/test/java/health/ere/ps/service/muster16/parser/regxer/Muster16SvgExtractorRegexParserTest.java b/src/test/java/health/ere/ps/service/muster16/parser/regxer/Muster16SvgExtractorRegexParserTest.java deleted file mode 100644 index e9a96a939..000000000 --- a/src/test/java/health/ere/ps/service/muster16/parser/regxer/Muster16SvgExtractorRegexParserTest.java +++ /dev/null @@ -1,160 +0,0 @@ -package health.ere.ps.service.muster16.parser.regxer; - -import health.ere.ps.service.extractor.SVGExtractor; -import health.ere.ps.service.extractor.TemplateProfile; -import health.ere.ps.service.muster16.parser.rgxer.Muster16SvgRegexParser; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import javax.xml.stream.XMLStreamException; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - - -public class Muster16SvgExtractorRegexParserTest { - -// private static final Logger log = Logger.getLogger(Muster16SvgExtractorRegexParserTest.class.getName()); - - - @Test - void testParseData_CGM_Z1() throws IOException, XMLStreamException { - SVGExtractor svgExtractor = new SVGExtractor(TemplateProfile.CGM_Z1.configuration); - Map<String, String> map = svgExtractor.extract(PDDocument.load(getClass() - .getResourceAsStream("/muster-16-print-samples/cgm-z1-manuel-blechschmidt.pdf"))); - - Muster16SvgRegexParser parser = new Muster16SvgRegexParser(map); - - assertEquals("TK > Brandenburg 83", parser.parseInsuranceCompany()); - assertEquals("100696012", parser.parseInsuranceCompanyId()); - assertTrue(parser.parsePatientNamePrefix().isEmpty()); - assertEquals("Manuel", parser.parsePatientFirstName()); - assertEquals("Blechschmidt", parser.parsePatientLastName()); - assertEquals("Droysenstr.", parser.parsePatientStreetName()); - assertEquals("7", parser.parsePatientStreetNumber()); - assertEquals("10629", parser.parsePatientZipCode()); - assertEquals("Berlin", parser.parsePatientCity()); - assertEquals("1986-07-16", parser.parsePatientDateOfBirth()); - assertEquals("1000000", parser.parsePatientStatus()); - assertEquals("30001234", parser.parseClinicId()); - assertEquals("30001234", parser.parseDoctorId()); - assertEquals("2021-04-13", parser.parsePrescriptionDate()); - assertEquals("V062074590", parser.parsePatientInsuranceId()); - assertEquals("0301234567", parser.parsePractitionerPhoneNumber()); - assertEquals("12345", parser.parsePractitionerZipCode()); - assertEquals("Berlin", parser.parsePractitionerCity()); - assertEquals("In der tollen Str.", parser.parsePractitionerStreetName()); - assertEquals("115", parser.parsePractitionerStreetNumber()); - } - - @Test - @Disabled("Github doesn't have access to the secret repo, run this test manually") - void testParse_CGMTurboMed() throws IOException, XMLStreamException { - SVGExtractor svgExtractor = new SVGExtractor(TemplateProfile.CGM_TURBO_MED.configuration); - Map<String, String> map = svgExtractor.extract(PDDocument.load( - new FileInputStream("../secret-test-print-samples/CGM-Turbomed/test1_no_number_in_practitioner_name.pdf"))); - - Muster16SvgRegexParser parser = new Muster16SvgRegexParser(map); - - assertEquals("Bahn - BKK", parser.parseInsuranceCompany()); - assertEquals("109938331", parser.parseInsuranceCompanyId()); - assertTrue(parser.parsePatientNamePrefix().isEmpty()); - assertEquals("Banholzer", parser.parsePatientFirstName()); - assertEquals("Dominik", parser.parsePatientLastName()); - assertEquals("Maria Trost", parser.parsePatientStreetName()); - assertEquals("21", parser.parsePatientStreetNumber()); - assertEquals("56070", parser.parsePatientZipCode()); - assertEquals("Koblenz", parser.parsePatientCity()); - assertEquals("1987-07-19", parser.parsePatientDateOfBirth()); - assertEquals("5000000", parser.parsePatientStatus()); - assertEquals("999123456", parser.parseClinicId()); - assertEquals("471100815", parser.parseDoctorId()); - assertEquals("2021-04-30", parser.parsePrescriptionDate()); - assertEquals("", parser.parsePatientInsuranceId()); - assertEquals("0261110110", parser.parsePractitionerPhoneNumber()); - assertEquals("56068", parser.parsePractitionerZipCode()); - assertEquals("Koblenz", parser.parsePractitionerCity()); - assertEquals("E-Reze pt", parser.parsePractitionerFirstName()); - assertEquals("Testarzt", parser.parsePractitionerLastName()); - assertEquals("Neustraße", parser.parsePractitionerStreetName()); - assertEquals("10", parser.parsePractitionerStreetNumber()); - assertEquals("Dr.", parser.parsePractitionerNamePrefix()); - } - - @Test - @Disabled("Github doesn't have access to the secret repo, run this test manually") - void testParse_Dens1() throws IOException, XMLStreamException { - SVGExtractor svgExtractor = new SVGExtractor(TemplateProfile.DENS.configuration); - Map<String, String> map = svgExtractor.extract(PDDocument.load( - new FileInputStream("../secret-test-print-samples/DENS-GmbH/DENSoffice - Rezept1.pdf"))); - - Muster16SvgRegexParser parser = new Muster16SvgRegexParser(map); - - assertEquals("DENS GmbH", parser.parseInsuranceCompany()); - assertEquals("", parser.parseInsuranceCompanyId()); - List<String> expectedPrefix = List.of("Dr."); - assertEquals(expectedPrefix, parser.parsePatientNamePrefix()); - assertEquals("Markus", parser.parsePatientFirstName()); - assertEquals("Heckner", parser.parsePatientLastName()); - assertEquals("Berliner Str.", parser.parsePatientStreetName()); - assertEquals("12", parser.parsePatientStreetNumber()); - assertEquals("14513", parser.parsePatientZipCode()); - assertEquals("Teltow", parser.parsePatientCity()); - assertEquals("1976-02-14", parser.parsePatientDateOfBirth()); - assertEquals("3000000", parser.parsePatientStatus()); - assertEquals("30000000", parser.parseClinicId()); - assertEquals("30000000", parser.parseDoctorId()); - assertEquals("2021-04-29", parser.parsePrescriptionDate()); - assertEquals("", parser.parsePatientInsuranceId()); - assertEquals("03328334540", parser.parsePractitionerPhoneNumber()); - assertEquals("03328334547", parser.parsePractitionerFaxNumber()); - assertEquals("14513", parser.parsePractitionerZipCode()); - assertEquals("Teltow", parser.parsePractitionerCity()); - assertEquals("DENS", parser.parsePractitionerFirstName()); - assertEquals("GmbH", parser.parsePractitionerLastName()); - assertEquals("Berliner Str.", parser.parsePractitionerStreetName()); - assertEquals("13", parser.parsePractitionerStreetNumber()); - assertEquals("", parser.parsePractitionerNamePrefix()); - } - - @Test - @Disabled("Github doesn't have access to the secret repo, run this test manually") - void testExtractDensErezept() throws IOException, XMLStreamException { - SVGExtractor svgExtractor = new SVGExtractor(TemplateProfile.DENS.configuration); - Map<String, String> map = svgExtractor.extract(PDDocument.load( - new FileInputStream("../secret-test-print-samples/DENS-GmbH/eRezept.pdf"))); - - Muster16SvgRegexParser parser = new Muster16SvgRegexParser(map); - - assertEquals("DENS GmbH", parser.parseInsuranceCompany()); - assertEquals("", parser.parseInsuranceCompanyId()); - List<String> expectedPrefix = List.of("Dr."); - assertEquals(expectedPrefix, parser.parsePatientNamePrefix()); - assertEquals("Markus", parser.parsePatientFirstName()); - assertEquals("Heckner", parser.parsePatientLastName()); - assertEquals("Testweg", parser.parsePatientStreetName()); - assertEquals("1", parser.parsePatientStreetNumber()); - assertEquals("13403", parser.parsePatientZipCode()); - assertEquals("Berlin", parser.parsePatientCity()); - assertEquals("1976-02-14", parser.parsePatientDateOfBirth()); - assertEquals("3000000", parser.parsePatientStatus()); - assertEquals("30000000", parser.parseClinicId()); - assertEquals("30000000", parser.parseDoctorId()); - assertEquals("2021-04-26", parser.parsePrescriptionDate()); - assertEquals("", parser.parsePatientInsuranceId()); - assertEquals("03328334540", parser.parsePractitionerPhoneNumber()); - assertEquals("03328334547", parser.parsePractitionerFaxNumber()); - assertEquals("14513", parser.parsePractitionerZipCode()); - assertEquals("Teltow", parser.parsePractitionerCity()); - assertEquals("DENS", parser.parsePractitionerFirstName()); - assertEquals("GmbH", parser.parsePractitionerLastName()); - assertEquals("Berliner Str.", parser.parsePractitionerStreetName()); - assertEquals("13", parser.parsePractitionerStreetNumber()); - assertEquals("", parser.parsePractitionerNamePrefix()); - } -} diff --git a/src/test/java/health/ere/ps/service/muster16/parser/regxer/PractitionerEntryParseDelegateTest.java b/src/test/java/health/ere/ps/service/muster16/parser/regxer/PractitionerEntryParseDelegateTest.java deleted file mode 100644 index 9f47af72e..000000000 --- a/src/test/java/health/ere/ps/service/muster16/parser/regxer/PractitionerEntryParseDelegateTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package health.ere.ps.service.muster16.parser.regxer; - -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_FIRST_NAME; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_LAST_NAME; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PRACTITIONER_NAME_PREFIX; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.Test; - -import health.ere.ps.service.muster16.parser.rgxer.delegate.practitioner.PractitionerEntryParseDelegate; - -class PractitionerEntryParseDelegateTest { - - @Test - public void test() { - PractitionerEntryParseDelegate practitionerEntryParseDelegate = new PractitionerEntryParseDelegate("4033\nZahnärztin\nDr.dr.med.dent. Melinda Ecsédy-Heckner\nHermann-Piper Str. 37\n13403 Berlin\nTel.: 030 / 411 6725\n"); - assertEquals("Dr.dr.med.dent.", practitionerEntryParseDelegate.getDetails().get(PRACTITIONER_NAME_PREFIX)); - assertEquals("Melinda", practitionerEntryParseDelegate.getDetails().get(PRACTITIONER_FIRST_NAME)); - assertEquals("Ecsédy-Heckner", practitionerEntryParseDelegate.getDetails().get(PRACTITIONER_LAST_NAME)); - } -} diff --git a/src/test/java/health/ere/ps/service/muster16/parser/regxer/PratientEntryParseDelegateTest.java b/src/test/java/health/ere/ps/service/muster16/parser/regxer/PratientEntryParseDelegateTest.java deleted file mode 100644 index 60e5f9ec3..000000000 --- a/src/test/java/health/ere/ps/service/muster16/parser/regxer/PratientEntryParseDelegateTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package health.ere.ps.service.muster16.parser.regxer; - -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PATIENT_STREET_NAME; -import static health.ere.ps.service.muster16.parser.rgxer.model.Muster16Field.PATIENT_STREET_NUMBER; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.Test; - -import health.ere.ps.service.muster16.parser.rgxer.delegate.patient.PatientEntryParseDelegate; - -class PatientEntryParseDelegateTest { - - @Test - public void test() { - PatientEntryParseDelegate practitionerEntryParseDelegate = new PatientEntryParseDelegate("Ababo\nTest-Ulafa \nAugusta Str. 6 b\nD 12345 Berlin \n"); - assertEquals("Augusta Str. ", practitionerEntryParseDelegate.getDetails().get(PATIENT_STREET_NAME)); - assertEquals("6 b", practitionerEntryParseDelegate.getDetails().get(PATIENT_STREET_NUMBER)); - } -} diff --git a/src/test/java/health/ere/ps/service/pdf/DocumentServiceTest.java b/src/test/java/health/ere/ps/service/pdf/DocumentServiceTest.java index e94261d11..dc34e0882 100644 --- a/src/test/java/health/ere/ps/service/pdf/DocumentServiceTest.java +++ b/src/test/java/health/ere/ps/service/pdf/DocumentServiceTest.java @@ -12,11 +12,12 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.logging.LogManager; import java.util.stream.Collectors; -import javax.enterprise.event.Event; -import javax.inject.Inject; +import jakarta.enterprise.event.Event; +import jakarta.inject.Inject; import javax.xml.transform.TransformerException; import org.apache.fop.apps.FOPException; @@ -65,6 +66,11 @@ public static void prepareTestDirectoryAndBundles() throws IOException { DocumentServiceTest.class.getResourceAsStream("/examples_erezept/Erezept_template_4.xml"))); testBundles.add((Bundle) ctx.newXmlParser().parseResource( DocumentServiceTest.class.getResourceAsStream("/examples_erezept/Erezept_template_5.xml"))); + testBundles.add((Bundle) ctx.newXmlParser().parseResource( + DocumentServiceTest.class.getResourceAsStream("/examples_erezept/Beispiel_16.xml"))); + testBundles.add((Bundle) ctx.newXmlParser().parseResource( + DocumentServiceTest.class.getResourceAsStream("/examples_erezept/Beispiel_52.xml"))); + try { // https://community.oracle.com/thread/1307033?start=0&tstart=0 @@ -121,6 +127,28 @@ public void generateERezeptPdf_generatesCorrectPdf_givenOneMedicationToDisplay() Files.write(Paths.get(TARGET_PATH + "Erezept_with_one_medications.pdf"), baos.toByteArray()); } + @Test + // @Disabled("Running the pdf generation tests takes a lot of time, run them manually") + public void generateERezeptPdf_generatesCorrectPdf_givenOneCompoundingToDisplay() throws IOException, FOPException, TransformerException { + // WHEN + THEN + // DefaultFontConfigurator + List<BundleWithAccessCodeOrThrowable> bundles = new ArrayList<>(); + bundles.add(new BundleWithAccessCodeOrThrowable(testBundles.get(6), "777bea0e13cc9c42ceec14aec3ddee2263325dc2c6c699db115f58fe423607ea")); + ByteArrayOutputStream baos = documentService.generateERezeptPdf(bundles); + Files.write(Paths.get(TARGET_PATH + "Erezept_with_one_compounding.pdf"), baos.toByteArray()); + } + + @Test + @Disabled("Running the pdf generation tests takes a lot of time, run them manually") + public void generateERezeptPdf_generatesCorrectPdf_givenOneMedicationToDisplayIngredient() throws IOException, FOPException, TransformerException { + // WHEN + THEN + // DefaultFontConfigurator + List<BundleWithAccessCodeOrThrowable> bundles = new ArrayList<>(); + bundles.add(new BundleWithAccessCodeOrThrowable(testBundles.get(5), "MOCK_CODE")); + ByteArrayOutputStream baos = documentService.generateERezeptPdf(bundles); + Files.write(Paths.get(TARGET_PATH + "Erezept_with_one_medications_ingredient.pdf"), baos.toByteArray()); + } + @Test @Disabled("Running the pdf generation tests takes a lot of time, run them manually") public void generateERezeptPdf_generatesCorrectPdf_givenTwoMedicationsToDisplay() throws IOException { @@ -190,21 +218,39 @@ public void generateAllKBVPdf() throws IOException { generatePdfsForAllFilesInFolder(dir, prefix); } + @Test + @Disabled("Running the pdf generation tests takes a lot of time, run them manually") + public void generatePdfsForTestingBundleFoldersViaHelperFunction() throws IOException { + String dir = "src/test/resources/secret/bundles-v1-1-0"; + String prefix = "test_v1_1_0"; + generatePdfsForAllFilesInFolder(dir, prefix); + } + private void generatePdfsForAllFilesInFolder(String dir, String prefix) throws IOException { List<ByteArrayOutputStream> pdfStreams = Files.list(Paths.get(dir)) - .filter((p) -> p.toFile().isFile()) - .map((p) -> { - try { - return new BundleWithAccessCodeOrThrowable((Bundle) ctx.newXmlParser().parseResource(new FileReader(p.toFile())), "ACCESS_CODE"); - } catch (ConfigurationException | DataFormatException | FileNotFoundException e) { - e.printStackTrace(); - return null; - } - }).map((b) -> { + .filter((p) -> p.toFile().isFile()) + .map((p) -> { + try { + if (p.getFileName().toString().endsWith(".xml")) { + return new BundleWithAccessCodeOrThrowable((Bundle) ctx.newXmlParser().parseResource(new FileReader(p.toFile())), "ACCESS_CODE"); + } else if (p.getFileName().toString().endsWith(".json")) { + return new BundleWithAccessCodeOrThrowable((Bundle) ctx.newJsonParser().parseResource(new FileReader(p.toFile())), "ACCESS_CODE"); + } else { + return null; + } + } catch (ConfigurationException | DataFormatException | FileNotFoundException e) { + e.printStackTrace(); + fail("Couldn't parse: " + p.getFileName().toString()); + return null; + } + }) + .filter(Objects::nonNull) + .map((b) -> { try { return documentService.generateERezeptPdf(Arrays.asList(b)); } catch (FOPException | IOException | TransformerException e) { e.printStackTrace(); + fail("Couldn't generate pdf for bundle with medicationRequestId: " + b.getMedicationRequestId()); return null; } }).collect(Collectors.toList()); @@ -217,7 +263,7 @@ private void generatePdfsForAllFilesInFolder(String dir, String prefix) throws I private ByteArrayOutputStream createStreamForANumberOfPdfs(int number) { List<BundleWithAccessCodeOrThrowable> bundles = new ArrayList<>(); for (int i = 0; i < number; i++) { - bundles.add(new BundleWithAccessCodeOrThrowable(testBundles.get(i % 5), "MOCK_CODE" + i)); + bundles.add(new BundleWithAccessCodeOrThrowable(testBundles.get(i % 6), "777bea0e13cc9c42ceec14aec3ddee2263325dc2c6c699db115f58fe423607ea" + i)); } try { return documentService.generateERezeptPdf(bundles); diff --git a/src/test/java/health/ere/ps/service/status/StatusServiceTest.java b/src/test/java/health/ere/ps/service/status/StatusServiceTest.java index 9473922d1..d85087f02 100644 --- a/src/test/java/health/ere/ps/service/status/StatusServiceTest.java +++ b/src/test/java/health/ere/ps/service/status/StatusServiceTest.java @@ -7,7 +7,7 @@ import java.io.IOException; import java.util.logging.LogManager; -import javax.inject.Inject; +import jakarta.inject.Inject; import org.jose4j.jwt.consumer.InvalidJwtException; import org.jose4j.jwt.consumer.JwtConsumer; diff --git a/src/test/java/health/ere/ps/validation/fhir/bundle/PrescriptionBundleValidatorTest.java b/src/test/java/health/ere/ps/validation/fhir/bundle/PrescriptionBundleValidatorTest.java index 2d4f11bf3..8624864a8 100644 --- a/src/test/java/health/ere/ps/validation/fhir/bundle/PrescriptionBundleValidatorTest.java +++ b/src/test/java/health/ere/ps/validation/fhir/bundle/PrescriptionBundleValidatorTest.java @@ -4,19 +4,15 @@ import java.nio.file.Files; import java.nio.file.Paths; -import javax.inject.Inject; - -import org.hl7.fhir.r4.model.Bundle; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import ca.uhn.fhir.context.FhirContext; -import ca.uhn.fhir.validation.ValidationResult; +import de.gematik.refv.commons.validation.ValidationResult; import health.ere.ps.profile.TitusTestProfile; -import health.ere.ps.service.fhir.XmlPrescriptionProcessor; import io.quarkus.test.junit.QuarkusTest; import io.quarkus.test.junit.TestProfile; +import jakarta.inject.Inject; @QuarkusTest @TestProfile(TitusTestProfile.class) @@ -27,18 +23,6 @@ public class PrescriptionBundleValidatorTest { FhirContext fhirContext = FhirContext.forR4(); - @Disabled - @Test - public void test() throws IOException { - - Bundle bundle = XmlPrescriptionProcessor.createFixedBundleFromString(Files.readString(Paths.get("/home/manuel/git/secret-test-print-samples/CGM-Turbomed/XML/Bundle1.xml"))); - - ValidationResult validationResult = prescriptionBundleValidator.validateResource(bundle, - true); - - Assertions.assertTrue(validationResult.isSuccessful(), "Ere Health configured sample " + - "bundle has been successfully validated."); - } @Test public void testKBV() throws IOException { @@ -48,7 +32,7 @@ public void testKBV() throws IOException { "src/test" + "/resources/examples-kbv-fhir-erp-v1-1-0/Beispiel_1.xml")), true); - Assertions.assertTrue(validationResult.isSuccessful(), "Sample simplifier.net bundle " + + Assertions.assertTrue(validationResult.isValid(), "Sample simplifier.net bundle " + "has been successfully validated."); validationResult = @@ -56,7 +40,7 @@ public void testKBV() throws IOException { "src/test" + "/resources/simplifier_erezept/0428d416-149e-48a4-977c-394887b3d85c.xml")), true); - Assertions.assertTrue(validationResult.isSuccessful(), "Sample simplifier.net bundle " + + Assertions.assertTrue(validationResult.isValid(), "Sample simplifier.net bundle " + "has been successfully validated."); } diff --git a/src/test/java/health/ere/ps/vau/VAUEngineTest.java b/src/test/java/health/ere/ps/vau/VAUEngineTest.java index 5b524d20a..8087d9f21 100644 --- a/src/test/java/health/ere/ps/vau/VAUEngineTest.java +++ b/src/test/java/health/ere/ps/vau/VAUEngineTest.java @@ -24,7 +24,7 @@ public void testParseResponseFromVAU() throws IOException, HttpException { "\n"+ "<OperationOutcome xmlns=\"http://hl7.org/fhir\"><meta><profile value=\"http://hl7.org/fhir/StructureDefinition/OperationOutcome\"/></meta><issue><severity value=\"error\"/><code value=\"unknown\"/><details><text value=\"Access Token Error: Expired!\"/></details></issue></OperationOutcome>"; VAUEngine vauEngine = new VAUEngine(""); - vauEngine.requestid = "1c51e243bf3f657b8f9d0034e30aac40"; + vauEngine.requestidThreadLocal.set("1c51e243bf3f657b8f9d0034e30aac40"); HttpResponse res = vauEngine.extractHttpResponse(testResponse); assertEquals(401, res.getStatusLine().getStatusCode()); assertEquals("application/fhir+xml", res.getFirstHeader("content-type").getValue()); diff --git a/src/test/java/health/ere/ps/vau/VAUTest.java b/src/test/java/health/ere/ps/vau/VAUTest.java index eb9430ecf..dce74da96 100644 --- a/src/test/java/health/ere/ps/vau/VAUTest.java +++ b/src/test/java/health/ere/ps/vau/VAUTest.java @@ -8,13 +8,17 @@ import java.math.BigInteger; import java.security.KeyPair; import java.security.KeyStore; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; import java.util.logging.LogManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; -import javax.xml.bind.DatatypeConverter; -import javax.xml.ws.BindingProvider; import org.bouncycastle.crypto.InvalidCipherTextException; import org.bouncycastle.crypto.params.ECDomainParameters; @@ -24,6 +28,7 @@ import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.math.ec.ECPoint; +import org.jboss.resteasy.client.jaxrs.internal.ResteasyClientBuilderImpl; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -35,6 +40,10 @@ import health.ere.ps.service.common.security.SecretsManagerService.SslContextType; import health.ere.ps.service.connector.endpoint.SSLUtilities; import health.ere.ps.vau.VAU.KeyCoords; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.client.ClientBuilder; +import jakarta.xml.bind.DatatypeConverter; +import jakarta.xml.ws.BindingProvider; public class VAUTest { @@ -215,4 +224,32 @@ public void make32ByteLong() { 0,0,0,0,0, 0, 1})); } + + @Test + @Disabled + public void test() { + String fachdienstUrl = "https://erp-ref.zentral.erp.splitdns.ti-dienste.de"; + ClientBuilder clientBuilder = ClientBuilder.newBuilder(); + ((ResteasyClientBuilderImpl) clientBuilder).httpEngine(new VAUEngine(fachdienstUrl)); + + Client client = clientBuilder.build(); + ExecutorService executorService = Executors.newFixedThreadPool(10); + List<Future<?>> futures = new ArrayList<>(); + for(int i = 0; i < 100; i++) { + futures.add(executorService.submit(() -> { + + String s = client.target(fachdienstUrl).path("/CapabilityStatement").request().header("Authorization", "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c").get().readEntity(String.class); + System.out.println(s); + })); + } + futures.stream().forEach(f -> { + try { + f.get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + }); + + + } } \ No newline at end of file diff --git a/src/test/java/health/ere/ps/websocket/WebsocketClientEndpoint.java b/src/test/java/health/ere/ps/websocket/WebsocketClientEndpoint.java index 01be68f85..e23e02861 100644 --- a/src/test/java/health/ere/ps/websocket/WebsocketClientEndpoint.java +++ b/src/test/java/health/ere/ps/websocket/WebsocketClientEndpoint.java @@ -1,14 +1,14 @@ package health.ere.ps.websocket; import java.net.URI; -import javax.websocket.ClientEndpoint; -import javax.websocket.CloseReason; -import javax.websocket.ContainerProvider; -import javax.websocket.OnClose; -import javax.websocket.OnMessage; -import javax.websocket.OnOpen; -import javax.websocket.Session; -import javax.websocket.WebSocketContainer; +import jakarta.websocket.ClientEndpoint; +import jakarta.websocket.CloseReason; +import jakarta.websocket.ContainerProvider; +import jakarta.websocket.OnClose; +import jakarta.websocket.OnMessage; +import jakarta.websocket.OnOpen; +import jakarta.websocket.Session; +import jakarta.websocket.WebSocketContainer; /** * ChatServer Client diff --git a/src/test/java/health/ere/ps/websocket/WebsocketClientNotificationTest.java b/src/test/java/health/ere/ps/websocket/WebsocketClientNotificationTest.java index f480dbbba..3aadd6bf2 100644 --- a/src/test/java/health/ere/ps/websocket/WebsocketClientNotificationTest.java +++ b/src/test/java/health/ere/ps/websocket/WebsocketClientNotificationTest.java @@ -7,16 +7,16 @@ import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.websocket.ClientEndpoint; -import javax.websocket.ContainerProvider; -import javax.websocket.DeploymentException; -import javax.websocket.OnMessage; -import javax.websocket.OnOpen; -import javax.websocket.Session; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonReader; +import jakarta.websocket.ClientEndpoint; +import jakarta.websocket.ContainerProvider; +import jakarta.websocket.DeploymentException; +import jakarta.websocket.OnMessage; +import jakarta.websocket.OnOpen; +import jakarta.websocket.Session; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Assertions; diff --git a/src/test/java/health/ere/ps/websocket/WebsocketIntegrationTest.java b/src/test/java/health/ere/ps/websocket/WebsocketIntegrationTest.java index 9f1da55c6..2b373dc84 100644 --- a/src/test/java/health/ere/ps/websocket/WebsocketIntegrationTest.java +++ b/src/test/java/health/ere/ps/websocket/WebsocketIntegrationTest.java @@ -9,16 +9,16 @@ import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.TimeUnit; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.websocket.ClientEndpoint; -import javax.websocket.ContainerProvider; -import javax.websocket.OnMessage; -import javax.websocket.OnOpen; -import javax.websocket.Session; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.websocket.ClientEndpoint; +import jakarta.websocket.ContainerProvider; +import jakarta.websocket.OnMessage; +import jakarta.websocket.OnOpen; +import jakarta.websocket.Session; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; diff --git a/src/test/java/health/ere/ps/websocket/WebsocketTest.java b/src/test/java/health/ere/ps/websocket/WebsocketTest.java index e791fc81a..2a405a265 100644 --- a/src/test/java/health/ere/ps/websocket/WebsocketTest.java +++ b/src/test/java/health/ere/ps/websocket/WebsocketTest.java @@ -15,11 +15,11 @@ import java.util.ArrayList; import java.util.List; -import javax.enterprise.event.Event; -import javax.json.Json; -import javax.websocket.RemoteEndpoint.Async; -import javax.websocket.SendHandler; -import javax.websocket.Session; +import jakarta.enterprise.event.Event; +import jakarta.json.Json; +import jakarta.websocket.RemoteEndpoint.Async; +import jakarta.websocket.SendHandler; +import jakarta.websocket.Session; import org.hl7.fhir.r4.model.Bundle; import org.junit.jupiter.api.Disabled; @@ -33,18 +33,30 @@ class WebsocketTest { - @Disabled("Currently failing since the introduction of the validation checks in the websocket.") @Test - void testMessage() throws IOException { + void testSignAndUploadBundlesMessageWithInvalidBundleWithoutValidationFires() throws IOException { Websocket websocket = new Websocket(); websocket.signAndUploadBundlesEvent = mock(Event.class); String signAndUploadBundles = new String(getClass().getResourceAsStream("/websocket" + - "-messages/SignAndUploadBundles.json").readAllBytes(), StandardCharsets.UTF_8); + "-messages/SignAndUploadBundles-Without-Validation.json").readAllBytes(), StandardCharsets.UTF_8); websocket.onMessage(signAndUploadBundles, null); verify(websocket.signAndUploadBundlesEvent, times(1)).fireAsync(any()); } + // todo: just passing because of missing validator: integration test with prescriptionValidator / remove / extend + @Disabled + @Test + void testSignAndUploadBundlesMessageWithInvalidBundleWontFire() throws IOException { + Websocket websocket = new Websocket(); + websocket.signAndUploadBundlesEvent = mock(Event.class); + String signAndUploadBundles = new String(getClass().getResourceAsStream("/websocket" + + "-messages/SignAndUploadBundles.json").readAllBytes(), StandardCharsets.UTF_8); + + websocket.onMessage(signAndUploadBundles, null); + verify(websocket.signAndUploadBundlesEvent, times(0)).fireAsync(any()); + } + // Passing but also generating LogManager errors since the introduction of the validation checks // in the websocket. @Test @@ -87,7 +99,7 @@ void testOnMessageInvalidJsonWithReplyTo() { verify(mockedAsync).sendObject(exceptionMessageCaptor.capture(), sendHandlerCaptor.capture()); String exception = exceptionMessageCaptor.getValue(); - javax.json.JsonObject exceptionObject = Json.createReader(new StringReader(exception)).readObject(); + jakarta.json.JsonObject exceptionObject = Json.createReader(new StringReader(exception)).readObject(); assertEquals("Exception", exceptionObject.getString("type")); diff --git a/src/test/java/health/ere/ps/websocket/WebsocketXmlPrescriptionClientTest.java b/src/test/java/health/ere/ps/websocket/WebsocketXmlPrescriptionClientTest.java index 36c962561..c60db3871 100644 --- a/src/test/java/health/ere/ps/websocket/WebsocketXmlPrescriptionClientTest.java +++ b/src/test/java/health/ere/ps/websocket/WebsocketXmlPrescriptionClientTest.java @@ -9,11 +9,11 @@ import java.time.Instant; import java.util.UUID; -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonObject; -import javax.json.JsonString; -import javax.json.JsonValue; +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/src/test/java/health/ere/ps/websocket/encoder/ResponseEventEncoderTest.java b/src/test/java/health/ere/ps/websocket/encoder/ResponseEventEncoderTest.java index e03f9a4b5..0073f464a 100644 --- a/src/test/java/health/ere/ps/websocket/encoder/ResponseEventEncoderTest.java +++ b/src/test/java/health/ere/ps/websocket/encoder/ResponseEventEncoderTest.java @@ -4,7 +4,7 @@ import java.io.Serializable; -import javax.websocket.EncodeException; +import jakarta.websocket.EncodeException; import org.junit.jupiter.api.Test; diff --git a/src/test/resources/certs/ReadCardCertificate-eHBA-Request.xml b/src/test/resources/certs/ReadCardCertificate-eHBA-Request.xml new file mode 100644 index 000000000..d73c697ff --- /dev/null +++ b/src/test/resources/certs/ReadCardCertificate-eHBA-Request.xml @@ -0,0 +1,21 @@ +<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v6="http://ws.gematik.de/conn/CertificateService/v6.0" xmlns:v5="http://ws.gematik.de/conn/ConnectorCommon/v5.0" xmlns:v2="http://ws.gematik.de/conn/ConnectorContext/v2.0"> + <soapenv:Header/> + <soapenv:Body> + <v6:ReadCardCertificate> + <v5:CardHandle>HBA-3</v5:CardHandle> + <v2:Context> + <v5:MandantId>Incentergy</v5:MandantId> + <v5:ClientSystemId>Incentergy</v5:ClientSystemId> + <v5:WorkplaceId>1786_A1</v5:WorkplaceId> + <v5:UserId>85eae8a6-826e-e334-78cc-47f308ec4da6</v5:UserId> + </v2:Context> + <v6:CertRefList> + <!--1 or more repetitions:--> + <v6:CertRef>C.ENC</v6:CertRef> + <v6:CertRef>C.QES</v6:CertRef> + <v6:CertRef>C.AUT</v6:CertRef> + + </v6:CertRefList> + </v6:ReadCardCertificate> + </soapenv:Body> +</soapenv:Envelope> diff --git a/src/test/resources/certs/ReadCardCertificate-eHBA-Response.xml b/src/test/resources/certs/ReadCardCertificate-eHBA-Response.xml new file mode 100644 index 000000000..cf6882bca --- /dev/null +++ b/src/test/resources/certs/ReadCardCertificate-eHBA-Response.xml @@ -0,0 +1,45 @@ +<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> + <SOAP-ENV:Header/> + <SOAP-ENV:Body> + <ns5:ReadCardCertificateResponse xmlns:ns2="http://ws.gematik.de/conn/ConnectorCommon/v5.0" xmlns:ns3="http://ws.gematik.de/tel/error/v2.0" xmlns:ns4="http://ws.gematik.de/conn/CertificateServiceCommon/v2.0" xmlns:ns5="http://ws.gematik.de/conn/CertificateService/v6.0"> + <ns2:Status> + <ns2:Result>OK</ns2:Result> + </ns2:Status> + <ns4:X509DataInfoList> + <ns4:X509DataInfo> + <ns4:CertRef>C.ENC</ns4:CertRef> + <ns4:X509Data> + <ns4:X509IssuerSerial> + <ns4:X509IssuerName>CN=GEM.HBA-CA24 TEST-ONLY,OU=Heilberufsausweis-CA der Telematikinfrastruktur,O=gematik GmbH NOT-VALID,C=DE</ns4:X509IssuerName> + <ns4:X509SerialNumber>1034575126377640</ns4:X509SerialNumber> + </ns4:X509IssuerSerial> + <ns4:X509SubjectName>2.5.4.4=#0c094f6c64656e62757267+2.5.4.42=#0c114dc3a37269616e6e65204772c3a466696e+2.5.4.5=#13143830323736383833313130303030313231333337+CN=Mãrianne OldenburgTEST-ONLY,C=DE</ns4:X509SubjectName> + <ns4:X509Certificate>MIIE0TCCA7mgAwIBAgIHA6zwyua0qDANBgkqhkiG9w0BAQsFADCBiTELMAkGA1UEBhMCREUxHzAdBgNVBAoMFmdlbWF0aWsgR21iSCBOT1QtVkFMSUQxODA2BgNVBAsML0hlaWxiZXJ1ZnNhdXN3ZWlzLUNBIGRlciBUZWxlbWF0aWtpbmZyYXN0cnVrdHVyMR8wHQYDVQQDDBZHRU0uSEJBLUNBMjQgVEVTVC1PTkxZMB4XDTIwMDEyOTAwMDAwMFoXDTI0MTIxMTIzNTk1OVowfTELMAkGA1UEBhMCREUxbjAQBgNVBAQMCU9sZGVuYnVyZzAYBgNVBCoMEU3Do3JpYW5uZSBHcsOkZmluMBsGA1UEBRMUODAyNzY4ODMxMTAwMDAxMjEzMzcwIwYDVQQDDBxNw6NyaWFubmUgT2xkZW5idXJnVEVTVC1PTkxZMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo7XHDCN3dk+5N22RMgmsKBp9RbPndBMGVBb7dE/pdAw6t6cmT25IRxGa4QvYQyugG4wF1AuMNRvgn3oV794uer2yne68f6npk0ksFKcI0S1G6T0cHX9tn49bMfUugweP3YPrB4PTR0Y5hUBok0PENDR21OSL0i4IRNxsZR0Z0YuWkSdLLeFR7fSUUmu1kZ0F71Z6gbE10bX53/qZyoIYAQ3TFVmbkjf8a6p7rGS3uRjPNHkqAIB37PYWP9L3Kqj57fidkLn1nvaLmVW96zOedDIXGrejDuZ8/RrE1XeRe67GorU2ClHZb8UuvEe5rAhL8EkzItHyPSXb3gHCaR3hBQIDAQABo4IBRzCCAUMwHQYDVR0OBBYEFLnOx4KhdItcdW91vaeCimgBlzcDMC4GA1UdIAQnMCUwCQYHKoIUAEwESjAKBggqghQATASBETAMBgorBgEEAYLNMwEBMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUo+L9M3iN4i6Bs5afErD7MOgOSSswOAYIKwYBBQUHAQEELDAqMCgGCCsGAQUFBzABhhxodHRwOi8vZWhjYS5nZW1hdGlrLmRlL29jc3AvMA4GA1UdDwEB/wQEAwIEMDB5BgUrJAgDAwRwMG6kKDAmMQswCQYDVQQGEwJERTEXMBUGA1UECgwOZ2VtYXRpayBCZXJsaW4wQjBAMD4wPDAODAzDhHJ6dGluL0FyenQwCQYHKoIUAEwEHhMfMS1IQkEtVGVzdGthcnRlLTg4MzExMDAwMDEyMTMzNzANBgkqhkiG9w0BAQsFAAOCAQEAZqVZD6yWD2Y3W6xPQGd9QHgcoIQLRVI0d9aweAoAJ5x2AiK1+xi9Hp39bp8yxq9PoHIX+MGntUPNr9sc6e078PE3Q3moSHY/avKIc14Plhs6Jea4hVhfjYzDWODtznK9Hg+ftwstiGL0oZRVxAx3ofqPqF52p5xUlpnMhsNnDZKztiDxVgHfmfNQWyfURu5yoctNnHz0214QjUiyvgb4Kxxjq5gCAYqAApM0Ly+mndXSDLuHWWVWOeva9UJEARg3LCM9pWj3o3ss/tNBgufar2f/bjoWTgjPCk8L2yzPhdn9aSu0MaDXA5mpkZfXUKNE8KElTv3oHIDHySXVdbWkTg==</ns4:X509Certificate> + </ns4:X509Data> + </ns4:X509DataInfo> + <ns4:X509DataInfo> + <ns4:CertRef>C.QES</ns4:CertRef> + <ns4:X509Data> + <ns4:X509IssuerSerial> + <ns4:X509IssuerName>CN=GEM.HBA-qCA24 TEST-ONLY,O=gematik GmbH NOT-VALID,C=DE</ns4:X509IssuerName> + <ns4:X509SerialNumber>138634185904543</ns4:X509SerialNumber> + </ns4:X509IssuerSerial> + <ns4:X509SubjectName>2.5.4.4=#0c094f6c64656e62757267+2.5.4.42=#0c114dc3a37269616e6e65204772c3a466696e+2.5.4.5=#13143830323736383833313130303030313231333337+CN=Mãrianne OldenburgTEST-ONLY,C=DE</ns4:X509SubjectName> + <ns4:X509Certificate>MIIE4jCCA8qgAwIBAgIGfhZJZ5GfMA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMR8wHQYDVQQKDBZnZW1hdGlrIEdtYkggTk9ULVZBTElEMSAwHgYDVQQDDBdHRU0uSEJBLXFDQTI0IFRFU1QtT05MWTAeFw0yMDAxMjkwMDAwMDBaFw0yNDEyMTEyMzU5NTlaMH0xCzAJBgNVBAYTAkRFMW4wEAYDVQQEDAlPbGRlbmJ1cmcwGAYDVQQqDBFNw6NyaWFubmUgR3LDpGZpbjAbBgNVBAUTFDgwMjc2ODgzMTEwMDAwMTIxMzM3MCMGA1UEAwwcTcOjcmlhbm5lIE9sZGVuYnVyZ1RFU1QtT05MWTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK6MJOvLv0U5j6xN0Z2ZxYSCvSR5iF1dAdTxCX0pD6ob8U30GdMHs3MIO60WmeH+mn4zDwzZ8j8j78wu3mCaSCKv608MucdLKN2YHrqpb7XkJOSV0hWa0cPi5G+gLRjWxDn37dcTXBRzT3zKSsn4kQfIU6FztOgZo4f2HMsY3e5r7Zw8haCvxH0ttCvKA9Ni9Zq/26gwWzaNNVAyBmP9auY0tFfkqX8roypBfD5pJYmHW4URidAE/QiC3t69CYwOoZjNmEgnZMQGxw1BmhfTI5XVe3oRl4BVGATYQuRhu5XZGied781gtIyYvLmiLE5gqeT4AjiEo+t8p2ewGQebcWsCAwEAAaOCAZMwggGPMB0GA1UdDgQWBBS/xxv8WvYCNSrOdX3SZk7aPzr95jAiBggrBgEFBQcBAwQWMBQwCAYGBACORgEBMAgGBgQAjkYBBDA5BgNVHSAEMjAwMAkGByqCFABMBEgwCQYHBACL7EABAjAKBggqghQATASBETAMBgorBgEEAYLNMwEBMA4GA1UdDwEB/wQEAwIGQDAbBgkrBgEEAcBtAwUEDjAMBgorBgEEAcBtAwUBMDgGCCsGAQUFBwEBBCwwKjAoBggrBgEFBQcwAYYcaHR0cDovL2VoY2EuZ2VtYXRpay5kZS9vY3NwLzAfBgNVHSMEGDAWgBRnnDG26cA36h0bgeek9TvMHhcBOTAMBgNVHRMBAf8EAjAAMHkGBSskCAMDBHAwbqQoMCYxCzAJBgNVBAYTAkRFMRcwFQYDVQQKDA5nZW1hdGlrIEJlcmxpbjBCMEAwPjA8MA4MDMOEcnp0aW4vQXJ6dDAJBgcqghQATAQeEx8xLUhCQS1UZXN0a2FydGUtODgzMTEwMDAwMTIxMzM3MA0GCSqGSIb3DQEBCwUAA4IBAQBb/UuY8Csh4Fyjj7vB89HVIk+k1gwMvjIUzvaXz1uIwMiRy3AVDOSAcdA5EmlUuNv+2SBdEIb7besqKokHml9FLP3aaRIl8PA0hxz1bUP/JWhqa85RqI0u3EGlFJWEZVky+3ASop5cHM9GBVSS2MOchrVu+EbG2Sn8LPyFu3gtFNpKGz+pjzLzC0dRCVzhrPieuibxB6/njcLhwOGyZ+0nDsfk1kmBlTx6M2/SD0H+l/0ZBn1O0ineM0fI0qEWJOqqL0hoVEKqNSUBZxLxCCUK4x24+Vwf7Dnij/N0OuhUNcxxv6cJjJIg+Dlry3OXH9RIOUI8YKgdkxkGFuhIgl5h</ns4:X509Certificate> + </ns4:X509Data> + </ns4:X509DataInfo> + <ns4:X509DataInfo> + <ns4:CertRef>C.AUT</ns4:CertRef> + <ns4:X509Data> + <ns4:X509IssuerSerial> + <ns4:X509IssuerName>CN=GEM.HBA-CA24 TEST-ONLY,OU=Heilberufsausweis-CA der Telematikinfrastruktur,O=gematik GmbH NOT-VALID,C=DE</ns4:X509IssuerName> + <ns4:X509SerialNumber>748434943734960</ns4:X509SerialNumber> + </ns4:X509IssuerSerial> + <ns4:X509SubjectName>2.5.4.4=#0c094f6c64656e62757267+2.5.4.42=#0c114dc3a37269616e6e65204772c3a466696e+2.5.4.5=#13143830323736383833313130303030313231333337+CN=Mãrianne OldenburgTEST-ONLY,C=DE</ns4:X509SubjectName> + <ns4:X509Certificate>MIIE8DCCA9igAwIBAgIHAqiylvV0sDANBgkqhkiG9w0BAQsFADCBiTELMAkGA1UEBhMCREUxHzAdBgNVBAoMFmdlbWF0aWsgR21iSCBOT1QtVkFMSUQxODA2BgNVBAsML0hlaWxiZXJ1ZnNhdXN3ZWlzLUNBIGRlciBUZWxlbWF0aWtpbmZyYXN0cnVrdHVyMR8wHQYDVQQDDBZHRU0uSEJBLUNBMjQgVEVTVC1PTkxZMB4XDTIwMDEyOTAwMDAwMFoXDTI0MTIxMTIzNTk1OVowfTELMAkGA1UEBhMCREUxbjAQBgNVBAQMCU9sZGVuYnVyZzAYBgNVBCoMEU3Do3JpYW5uZSBHcsOkZmluMBsGA1UEBRMUODAyNzY4ODMxMTAwMDAxMjEzMzcwIwYDVQQDDBxNw6NyaWFubmUgT2xkZW5idXJnVEVTVC1PTkxZMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1ln/KaVqmkn7ygSHM/lgBq1TQtnpGUEdc6/4MlT37BD5QiJZJ2QcwxV7d7KfmYtIFR73KIg/OsiskgaIga5rn7jITuSysAIomumikKQMkLRYc81EnZnNWCDMeJpub0NNfcksWrhFKfPvK8yVyVvfsV1edSvf4PVTz1NOvaAu4ddgxLkqIUQHkuAB96EzVr36p2CAnq7G3P7CCNssHt757W25vzYam0+7ymCHTG14wcXQ6BKfJFss1H5XH2HpX3OtQsPEg8hkz/ZGFsRI/jmP2uBvuzyJUZvfWeh8q/U2Et5ONntGRi4yJ40LFdKAcVFVuKRdivfIn1zZCvUNvGXQtwIDAQABo4IBZjCCAWIwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMB8GA1UdIwQYMBaAFKPi/TN4jeIugbOWnxKw+zDoDkkrMC4GA1UdIAQnMCUwCQYHKoIUAEwESzAMBgorBgEEAYLNMwEBMAoGCCqCFABMBIERMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgWgMB0GA1UdDgQWBBS6naGgNTRajMrzeD/LEjdMLNvycjA4BggrBgEFBQcBAQQsMCowKAYIKwYBBQUHMAGGHGh0dHA6Ly9laGNhLmdlbWF0aWsuZGUvb2NzcC8weQYFKyQIAwMEcDBupCgwJjELMAkGA1UEBhMCREUxFzAVBgNVBAoMDmdlbWF0aWsgQmVybGluMEIwQDA+MDwwDgwMw4RyenRpbi9Bcnp0MAkGByqCFABMBB4THzEtSEJBLVRlc3RrYXJ0ZS04ODMxMTAwMDAxMjEzMzcwDQYJKoZIhvcNAQELBQADggEBAGDbV6u1YjvOcseKzUwj9lu9v+XfGd7K0+SpoIyqUmdF4qjJGWtY2zHkWmv05zknZOn1AiukdQOOe9H6QboZExjwynZcgoOc1N38CxAWzjYNJhSd3ygtbFnyhGLmBdQW6b7u44CrMzxBlxFtTXUI5MqKgbjiImOd9rt3H5AZ1EoVyDC9644XHJ17qY0Qfn8s+aMRth3aEyqpMpKZ1DvEo/JjXo96HpLcEVpaDKGH7FZdR3RXcMvGi2gXyjrjdLY/ROF7F6P87SQ8K/q8Ii7cESQEEEEFivAY5nGuiILUC9Wom8yhlXT2z7lC+Coo37lD2fwLlHtk1SGHc1sGlm2o1wE=</ns4:X509Certificate> + </ns4:X509Data> + </ns4:X509DataInfo> + </ns4:X509DataInfoList> + </ns5:ReadCardCertificateResponse> + </SOAP-ENV:Body> +</SOAP-ENV:Envelope> diff --git a/src/test/resources/certs/ehba-base64.dat b/src/test/resources/certs/ehba-base64.dat new file mode 100644 index 000000000..3a50701e4 --- /dev/null +++ b/src/test/resources/certs/ehba-base64.dat @@ -0,0 +1 @@ +MIIE4jCCA8qgAwIBAgIGfhZJZ5GfMA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMR8wHQYDVQQKDBZnZW1hdGlrIEdtYkggTk9ULVZBTElEMSAwHgYDVQQDDBdHRU0uSEJBLXFDQTI0IFRFU1QtT05MWTAeFw0yMDAxMjkwMDAwMDBaFw0yNDEyMTEyMzU5NTlaMH0xCzAJBgNVBAYTAkRFMW4wEAYDVQQEDAlPbGRlbmJ1cmcwGAYDVQQqDBFNw6NyaWFubmUgR3LDpGZpbjAbBgNVBAUTFDgwMjc2ODgzMTEwMDAwMTIxMzM3MCMGA1UEAwwcTcOjcmlhbm5lIE9sZGVuYnVyZ1RFU1QtT05MWTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK6MJOvLv0U5j6xN0Z2ZxYSCvSR5iF1dAdTxCX0pD6ob8U30GdMHs3MIO60WmeH+mn4zDwzZ8j8j78wu3mCaSCKv608MucdLKN2YHrqpb7XkJOSV0hWa0cPi5G+gLRjWxDn37dcTXBRzT3zKSsn4kQfIU6FztOgZo4f2HMsY3e5r7Zw8haCvxH0ttCvKA9Ni9Zq/26gwWzaNNVAyBmP9auY0tFfkqX8roypBfD5pJYmHW4URidAE/QiC3t69CYwOoZjNmEgnZMQGxw1BmhfTI5XVe3oRl4BVGATYQuRhu5XZGied781gtIyYvLmiLE5gqeT4AjiEo+t8p2ewGQebcWsCAwEAAaOCAZMwggGPMB0GA1UdDgQWBBS/xxv8WvYCNSrOdX3SZk7aPzr95jAiBggrBgEFBQcBAwQWMBQwCAYGBACORgEBMAgGBgQAjkYBBDA5BgNVHSAEMjAwMAkGByqCFABMBEgwCQYHBACL7EABAjAKBggqghQATASBETAMBgorBgEEAYLNMwEBMA4GA1UdDwEB/wQEAwIGQDAbBgkrBgEEAcBtAwUEDjAMBgorBgEEAcBtAwUBMDgGCCsGAQUFBwEBBCwwKjAoBggrBgEFBQcwAYYcaHR0cDovL2VoY2EuZ2VtYXRpay5kZS9vY3NwLzAfBgNVHSMEGDAWgBRnnDG26cA36h0bgeek9TvMHhcBOTAMBgNVHRMBAf8EAjAAMHkGBSskCAMDBHAwbqQoMCYxCzAJBgNVBAYTAkRFMRcwFQYDVQQKDA5nZW1hdGlrIEJlcmxpbjBCMEAwPjA8MA4MDMOEcnp0aW4vQXJ6dDAJBgcqghQATAQeEx8xLUhCQS1UZXN0a2FydGUtODgzMTEwMDAwMTIxMzM3MA0GCSqGSIb3DQEBCwUAA4IBAQBb/UuY8Csh4Fyjj7vB89HVIk+k1gwMvjIUzvaXz1uIwMiRy3AVDOSAcdA5EmlUuNv+2SBdEIb7besqKokHml9FLP3aaRIl8PA0hxz1bUP/JWhqa85RqI0u3EGlFJWEZVky+3ASop5cHM9GBVSS2MOchrVu+EbG2Sn8LPyFu3gtFNpKGz+pjzLzC0dRCVzhrPieuibxB6/njcLhwOGyZ+0nDsfk1kmBlTx6M2/SD0H+l/0ZBn1O0ineM0fI0qEWJOqqL0hoVEKqNSUBZxLxCCUK4x24+Vwf7Dnij/N0OuhUNcxxv6cJjJIg+Dlry3OXH9RIOUI8YKgdkxkGFuhIgl5h diff --git a/src/test/resources/certs/ehba.der b/src/test/resources/certs/ehba.der new file mode 100644 index 000000000..ae483f77f Binary files /dev/null and b/src/test/resources/certs/ehba.der differ diff --git a/src/test/resources/certs/ehba.pem b/src/test/resources/certs/ehba.pem new file mode 100644 index 000000000..6daf45378 --- /dev/null +++ b/src/test/resources/certs/ehba.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE4jCCA8qgAwIBAgIGfhZJZ5GfMA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYT +AkRFMR8wHQYDVQQKDBZnZW1hdGlrIEdtYkggTk9ULVZBTElEMSAwHgYDVQQDDBdH +RU0uSEJBLXFDQTI0IFRFU1QtT05MWTAeFw0yMDAxMjkwMDAwMDBaFw0yNDEyMTEy +MzU5NTlaMH0xCzAJBgNVBAYTAkRFMW4wEAYDVQQEDAlPbGRlbmJ1cmcwGAYDVQQq +DBFNw6NyaWFubmUgR3LDpGZpbjAbBgNVBAUTFDgwMjc2ODgzMTEwMDAwMTIxMzM3 +MCMGA1UEAwwcTcOjcmlhbm5lIE9sZGVuYnVyZ1RFU1QtT05MWTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAK6MJOvLv0U5j6xN0Z2ZxYSCvSR5iF1dAdTx +CX0pD6ob8U30GdMHs3MIO60WmeH+mn4zDwzZ8j8j78wu3mCaSCKv608MucdLKN2Y +Hrqpb7XkJOSV0hWa0cPi5G+gLRjWxDn37dcTXBRzT3zKSsn4kQfIU6FztOgZo4f2 +HMsY3e5r7Zw8haCvxH0ttCvKA9Ni9Zq/26gwWzaNNVAyBmP9auY0tFfkqX8roypB +fD5pJYmHW4URidAE/QiC3t69CYwOoZjNmEgnZMQGxw1BmhfTI5XVe3oRl4BVGATY +QuRhu5XZGied781gtIyYvLmiLE5gqeT4AjiEo+t8p2ewGQebcWsCAwEAAaOCAZMw +ggGPMB0GA1UdDgQWBBS/xxv8WvYCNSrOdX3SZk7aPzr95jAiBggrBgEFBQcBAwQW +MBQwCAYGBACORgEBMAgGBgQAjkYBBDA5BgNVHSAEMjAwMAkGByqCFABMBEgwCQYH +BACL7EABAjAKBggqghQATASBETAMBgorBgEEAYLNMwEBMA4GA1UdDwEB/wQEAwIG +QDAbBgkrBgEEAcBtAwUEDjAMBgorBgEEAcBtAwUBMDgGCCsGAQUFBwEBBCwwKjAo +BggrBgEFBQcwAYYcaHR0cDovL2VoY2EuZ2VtYXRpay5kZS9vY3NwLzAfBgNVHSME +GDAWgBRnnDG26cA36h0bgeek9TvMHhcBOTAMBgNVHRMBAf8EAjAAMHkGBSskCAMD +BHAwbqQoMCYxCzAJBgNVBAYTAkRFMRcwFQYDVQQKDA5nZW1hdGlrIEJlcmxpbjBC +MEAwPjA8MA4MDMOEcnp0aW4vQXJ6dDAJBgcqghQATAQeEx8xLUhCQS1UZXN0a2Fy +dGUtODgzMTEwMDAwMTIxMzM3MA0GCSqGSIb3DQEBCwUAA4IBAQBb/UuY8Csh4Fyj +j7vB89HVIk+k1gwMvjIUzvaXz1uIwMiRy3AVDOSAcdA5EmlUuNv+2SBdEIb7besq +KokHml9FLP3aaRIl8PA0hxz1bUP/JWhqa85RqI0u3EGlFJWEZVky+3ASop5cHM9G +BVSS2MOchrVu+EbG2Sn8LPyFu3gtFNpKGz+pjzLzC0dRCVzhrPieuibxB6/njcLh +wOGyZ+0nDsfk1kmBlTx6M2/SD0H+l/0ZBn1O0ineM0fI0qEWJOqqL0hoVEKqNSUB +ZxLxCCUK4x24+Vwf7Dnij/N0OuhUNcxxv6cJjJIg+Dlry3OXH9RIOUI8YKgdkxkG +FuhIgl5h +-----END CERTIFICATE----- diff --git a/src/test/resources/certs/ehba.sh b/src/test/resources/certs/ehba.sh new file mode 100644 index 000000000..80c6ec5cf --- /dev/null +++ b/src/test/resources/certs/ehba.sh @@ -0,0 +1,9 @@ +#!/bin/bash +# Paste Data from ReadCardCertificates Call (C.QES) +vi ehba-base64.dat +# Create der certificate +base64 -d ehba-base64.dat > ehba.der +# Create pem certificate +openssl x509 -inform DER -in ehba.der > ehba.pem +# Create PEM Description +openssl x509 -in ehba.pem -text > ehba.txt diff --git a/src/test/resources/certs/ehba.txt b/src/test/resources/certs/ehba.txt new file mode 100644 index 000000000..1f412b120 --- /dev/null +++ b/src/test/resources/certs/ehba.txt @@ -0,0 +1,113 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 138634185904543 (0x7e164967919f) + Signature Algorithm: sha256WithRSAEncryption + Issuer: C = DE, O = gematik GmbH NOT-VALID, CN = GEM.HBA-qCA24 TEST-ONLY + Validity + Not Before: Jan 29 00:00:00 2020 GMT + Not After : Dec 11 23:59:59 2024 GMT + Subject: C = DE, SN = Oldenburg + GN = M\C3\A3rianne Gr\C3\A4fin + serialNumber = 80276883110000121337 + CN = M\C3\A3rianne OldenburgTEST-ONLY + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:ae:8c:24:eb:cb:bf:45:39:8f:ac:4d:d1:9d:99: + c5:84:82:bd:24:79:88:5d:5d:01:d4:f1:09:7d:29: + 0f:aa:1b:f1:4d:f4:19:d3:07:b3:73:08:3b:ad:16: + 99:e1:fe:9a:7e:33:0f:0c:d9:f2:3f:23:ef:cc:2e: + de:60:9a:48:22:af:eb:4f:0c:b9:c7:4b:28:dd:98: + 1e:ba:a9:6f:b5:e4:24:e4:95:d2:15:9a:d1:c3:e2: + e4:6f:a0:2d:18:d6:c4:39:f7:ed:d7:13:5c:14:73: + 4f:7c:ca:4a:c9:f8:91:07:c8:53:a1:73:b4:e8:19: + a3:87:f6:1c:cb:18:dd:ee:6b:ed:9c:3c:85:a0:af: + c4:7d:2d:b4:2b:ca:03:d3:62:f5:9a:bf:db:a8:30: + 5b:36:8d:35:50:32:06:63:fd:6a:e6:34:b4:57:e4: + a9:7f:2b:a3:2a:41:7c:3e:69:25:89:87:5b:85:11: + 89:d0:04:fd:08:82:de:de:bd:09:8c:0e:a1:98:cd: + 98:48:27:64:c4:06:c7:0d:41:9a:17:d3:23:95:d5: + 7b:7a:11:97:80:55:18:04:d8:42:e4:61:bb:95:d9: + 1a:27:9d:ef:cd:60:b4:8c:98:bc:b9:a2:2c:4e:60: + a9:e4:f8:02:38:84:a3:eb:7c:a7:67:b0:19:07:9b: + 71:6b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Subject Key Identifier: + BF:C7:1B:FC:5A:F6:02:35:2A:CE:75:7D:D2:66:4E:DA:3F:3A:FD:E6 + qcStatements: + 0.0......F..0......F.. + X509v3 Certificate Policies: + Policy: 1.2.276.0.76.4.72 + Policy: 0.4.0.194112.1.2 + Policy: 1.2.276.0.76.4.145 + Policy: 1.3.6.1.4.1.42675.1.1 + + X509v3 Key Usage: critical + Non Repudiation + 1.3.6.1.4.1.8301.3.5: + 0.. ++.....m... + Authority Information Access: + OCSP - URI:http://ehca.gematik.de/ocsp/ + + X509v3 Authority Key Identifier: + keyid:67:9C:31:B6:E9:C0:37:EA:1D:1B:81:E7:A4:F5:3B:CC:1E:17:01:39 + + X509v3 Basic Constraints: critical + CA:FALSE + Professional Information or basis for Admission: + admissionAuthority: + DirName:C = DE, O = gematik Berlin + Entry 1: + Profession Info Entry 1: + registrationNumber: 1-HBA-Testkarte-883110000121337 + Info Entries: + ..rztin/Arzt + Profession OIDs: + undefined (1.2.276.0.76.4.30) + + Signature Algorithm: sha256WithRSAEncryption + 5b:fd:4b:98:f0:2b:21:e0:5c:a3:8f:bb:c1:f3:d1:d5:22:4f: + a4:d6:0c:0c:be:32:14:ce:f6:97:cf:5b:88:c0:c8:91:cb:70: + 15:0c:e4:80:71:d0:39:12:69:54:b8:db:fe:d9:20:5d:10:86: + fb:6d:eb:2a:2a:89:07:9a:5f:45:2c:fd:da:69:12:25:f0:f0: + 34:87:1c:f5:6d:43:ff:25:68:6a:6b:ce:51:a8:8d:2e:dc:41: + a5:14:95:84:65:59:32:fb:70:12:a2:9e:5c:1c:cf:46:05:54: + 92:d8:c3:9c:86:b5:6e:f8:46:c6:d9:29:fc:2c:fc:85:bb:78: + 2d:14:da:4a:1b:3f:a9:8f:32:f3:0b:47:51:09:5c:e1:ac:f8: + 9e:ba:26:f1:07:af:e7:8d:c2:e1:c0:e1:b2:67:ed:27:0e:c7: + e4:d6:49:81:95:3c:7a:33:6f:d2:0f:41:fe:97:fd:19:06:7d: + 4e:d2:29:de:33:47:c8:d2:a1:16:24:ea:aa:2f:48:68:54:42: + aa:35:25:01:67:12:f1:08:25:0a:e3:1d:b8:f9:5c:1f:ec:39: + e2:8f:f3:74:3a:e8:54:35:cc:71:bf:a7:09:8c:92:20:f8:39: + 6b:cb:73:97:1f:d4:48:39:42:3c:60:a8:1d:93:19:06:16:e8: + 48:82:5e:61 +-----BEGIN CERTIFICATE----- +MIIE4jCCA8qgAwIBAgIGfhZJZ5GfMA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYT +AkRFMR8wHQYDVQQKDBZnZW1hdGlrIEdtYkggTk9ULVZBTElEMSAwHgYDVQQDDBdH +RU0uSEJBLXFDQTI0IFRFU1QtT05MWTAeFw0yMDAxMjkwMDAwMDBaFw0yNDEyMTEy +MzU5NTlaMH0xCzAJBgNVBAYTAkRFMW4wEAYDVQQEDAlPbGRlbmJ1cmcwGAYDVQQq +DBFNw6NyaWFubmUgR3LDpGZpbjAbBgNVBAUTFDgwMjc2ODgzMTEwMDAwMTIxMzM3 +MCMGA1UEAwwcTcOjcmlhbm5lIE9sZGVuYnVyZ1RFU1QtT05MWTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAK6MJOvLv0U5j6xN0Z2ZxYSCvSR5iF1dAdTx +CX0pD6ob8U30GdMHs3MIO60WmeH+mn4zDwzZ8j8j78wu3mCaSCKv608MucdLKN2Y +Hrqpb7XkJOSV0hWa0cPi5G+gLRjWxDn37dcTXBRzT3zKSsn4kQfIU6FztOgZo4f2 +HMsY3e5r7Zw8haCvxH0ttCvKA9Ni9Zq/26gwWzaNNVAyBmP9auY0tFfkqX8roypB +fD5pJYmHW4URidAE/QiC3t69CYwOoZjNmEgnZMQGxw1BmhfTI5XVe3oRl4BVGATY +QuRhu5XZGied781gtIyYvLmiLE5gqeT4AjiEo+t8p2ewGQebcWsCAwEAAaOCAZMw +ggGPMB0GA1UdDgQWBBS/xxv8WvYCNSrOdX3SZk7aPzr95jAiBggrBgEFBQcBAwQW +MBQwCAYGBACORgEBMAgGBgQAjkYBBDA5BgNVHSAEMjAwMAkGByqCFABMBEgwCQYH +BACL7EABAjAKBggqghQATASBETAMBgorBgEEAYLNMwEBMA4GA1UdDwEB/wQEAwIG +QDAbBgkrBgEEAcBtAwUEDjAMBgorBgEEAcBtAwUBMDgGCCsGAQUFBwEBBCwwKjAo +BggrBgEFBQcwAYYcaHR0cDovL2VoY2EuZ2VtYXRpay5kZS9vY3NwLzAfBgNVHSME +GDAWgBRnnDG26cA36h0bgeek9TvMHhcBOTAMBgNVHRMBAf8EAjAAMHkGBSskCAMD +BHAwbqQoMCYxCzAJBgNVBAYTAkRFMRcwFQYDVQQKDA5nZW1hdGlrIEJlcmxpbjBC +MEAwPjA8MA4MDMOEcnp0aW4vQXJ6dDAJBgcqghQATAQeEx8xLUhCQS1UZXN0a2Fy +dGUtODgzMTEwMDAwMTIxMzM3MA0GCSqGSIb3DQEBCwUAA4IBAQBb/UuY8Csh4Fyj +j7vB89HVIk+k1gwMvjIUzvaXz1uIwMiRy3AVDOSAcdA5EmlUuNv+2SBdEIb7besq +KokHml9FLP3aaRIl8PA0hxz1bUP/JWhqa85RqI0u3EGlFJWEZVky+3ASop5cHM9G +BVSS2MOchrVu+EbG2Sn8LPyFu3gtFNpKGz+pjzLzC0dRCVzhrPieuibxB6/njcLh +wOGyZ+0nDsfk1kmBlTx6M2/SD0H+l/0ZBn1O0ineM0fI0qEWJOqqL0hoVEKqNSUB +ZxLxCCUK4x24+Vwf7Dnij/N0OuhUNcxxv6cJjJIg+Dlry3OXH9RIOUI8YKgdkxkG +FuhIgl5h +-----END CERTIFICATE----- diff --git a/src/test/resources/certs/generated-truststore.p12 b/src/test/resources/certs/generated-truststore.p12 new file mode 100644 index 000000000..09f9339eb Binary files /dev/null and b/src/test/resources/certs/generated-truststore.p12 differ diff --git a/src/test/resources/certs/kops.der b/src/test/resources/certs/kops.der new file mode 100644 index 000000000..d974a6c86 Binary files /dev/null and b/src/test/resources/certs/kops.der differ diff --git a/src/test/resources/certs/kops.pem b/src/test/resources/certs/kops.pem new file mode 100644 index 000000000..9f1c1b47e --- /dev/null +++ b/src/test/resources/certs/kops.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEZDCCA0ygAwIBAgIEHdd5azANBgkqhkiG9w0BAQsFADA5MREwDwYDVQQDDAhw +dXBwZXRyeTEXMBUGA1UECgwOZUhlYWx0aEV4cGVydHMxCzAJBgNVBAYTAkRFMB4X +DTIxMDcyOTIxMzcxOVoXDTI0MDcyODIxMzcxOVowOTERMA8GA1UEAwwIcHVwcGV0 +cnkxFzAVBgNVBAoMDmVIZWFsdGhFeHBlcnRzMQswCQYDVQQGEwJERTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOGtrVOrMupqwszQXWMGFBN4xTuF33EF +/YhT46OZ6c5NEkwsT2vrR5X5cTz2mQXSHMXVoy2Vm1Hay2JzpoJ3EJZ26Y8FKPzd +xGNHCzRy0sPmgV58yTTfohgOutAPgJFL6yeYvx83xjjOu0nKlCM+qVwIcZjby9j3 +Okx60dafPK1SsivAZylOILcyXo4hTYtfkEXXID1MhIgNVwod3knwfqdqU0bLfuHd +H55RjqghShbUi0aNH1e9Uyu4hGe6FmOfLd+rHNqGuD8UBxs3vELIJb1N3Km7seRg +vw3SNgtYFna8S6ehWTi3Q5j8o3drEQf+ExzMKlPQqPFaGUnDN2XHQS8CAwEAAaOC +AXIwggFuMB8GA1UdIwQYMBaAFOhUv4NHmpNNxBUb2wbO2msVrZh6MB0GA1UdDgQW +BBToVL+DR5qTTcQVG9sGztprFa2YejAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQE +AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwIAYDVR0gBBkwFzAK +BggqghQATASBIzAJBgcqghQATARPMFIGCCsGAQUFBwEBBEYwRDBCBggrBgEFBQcw +AYY2aHR0cDovL29jc3AuZWhleC5kZToyNTYwL2VqYmNhL3ByaXZhdGUvd2ViL3N0 +YXR1cy9vY3NwMDUGBSskCAMDBCwwKjAoMCYwJDAiMBUME0Fud2VuZHVuZ3Nrb25u +ZWt0b3IwCQYHKoIUAEwEZzBCBgNVHREEOzA5gghwdXBwZXRyeYcEfwAAAYIJbG9j +YWxob3N0hxAAAAAAAAAAAAAAAAAAAAABhwQKKipzhwTAqLIUMA0GCSqGSIb3DQEB +CwUAA4IBAQCQIHQE5xEidRQQIjs/eliEgghFmdlR9IKBDX8je7/LUMAxgbW3oeyz +5meao/t1wDz+HA7AZ47SUfkK2xIKztCR48MY5+q3lZfDsDBclSrfF2rn9MxilaGL +mU4PlHKjR1GIRJHQfVBQDMnPOIFud4w0bOBzpKoNPtIQH29NKvZl9Rq/Y2bbeVtH +XNCY1EGrBwwCYAQAv4kN2je98rZ3Kya6VJQt4CGSLtC3hvYx/WXleLNoVKmZI3GW +Lz2DVTmZ4CeO1Wehyusvn7mPlcd69TJm+mN2mSEtd7WnOypwoQ+AGibpCCAmEBBO +XVlXLTfz3xQhm9aLVgkVegMC5e1U1WRB +-----END CERTIFICATE----- diff --git a/src/test/resources/examples-kbv-fhir-erp-v1-1-0/Beispiel_1.xml b/src/test/resources/examples-kbv-fhir-erp-v1-1-0/Beispiel_1.xml index 8482db0e9..5299b0b8f 100644 --- a/src/test/resources/examples-kbv-fhir-erp-v1-1-0/Beispiel_1.xml +++ b/src/test/resources/examples-kbv-fhir-erp-v1-1-0/Beispiel_1.xml @@ -111,7 +111,7 @@ <subject> <reference value="Patient/93866fdc-3e50-4902-a7e9-891b54737b5e"/> </subject> - <authoredOn value="2022-05-20" /> + <authoredOn value="2023-07-01" /> <requester> <reference value="Practitioner/bc329f24-3d65-4286-bf06-b54dd6cad655"/> </requester> diff --git a/src/test/resources/examples_erezept/Beispiel_16.xml b/src/test/resources/examples_erezept/Beispiel_16.xml new file mode 100644 index 000000000..60cb00817 --- /dev/null +++ b/src/test/resources/examples_erezept/Beispiel_16.xml @@ -0,0 +1,447 @@ +<Bundle xmlns="http://hl7.org/fhir"> + <id value="ec6059d9-72a0-4ba3-8535-6ffcc0c4279b" /> + <meta> + <lastUpdated value="2022-05-20T08:30:00Z" /> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.1.0" /> + </meta> + <identifier> + <system value="https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId" /> + <value value="160.100.000.000.018.85" /> + </identifier> + <type value="document" /> + <timestamp value="2022-05-20T08:30:00Z"/> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Composition/82fd748e-b721-491d-8e7d-681848e49a16" /> + <resource> + <Composition xmlns="http://hl7.org/fhir"> + <id value="82fd748e-b721-491d-8e7d-681848e49a16" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.1.0" /> + </meta> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN" /> + <code value="00" /> + </valueCoding> + </extension> + <status value="final" /> + <type> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART" /> + <code value="e16A" /> + </coding> + </type> + <subject> + <reference value="Patient/30635f5d-c233-4500-94e8-6414940236aa" /> + </subject> + <date value="2022-05-20T08:00:00Z"/> + <author> + <reference value="Practitioner/667ffd79-42a3-4002-b7ca-6b9098f20ccb" /> + <type value="Practitioner" /> + </author> + <author> + <type value="Device" /> + <identifier> + <system value="https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer" /> + <value value="Y/400/2107/36/999" /> + </identifier> + </author> + <title value="elektronische Arzneimittelverordnung" /> + <attester> + <mode value="legal" /> + <party> + <reference value="Practitioner/d6f3b55d-3095-4655-96dc-da3bec21271c" /> + </party> + </attester> + <custodian> + <reference value="Organization/2a555cd3-0543-483c-88b3-f68647620962" /> + </custodian> + <section> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type" /> + <code value="Prescription" /> + </coding> + </code> + <entry> + <!-- Referenz auf Verordnung (MedicationRequest) --> + <reference value="MedicationRequest/b12e7181-39dd-4864-a63f-74bb81d643a1" /> + </entry> + </section> + <section> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type" /> + <code value="Coverage" /> + </coding> + </code> + <entry> + <!-- Referenz auf Krankenkasse/Kostenträger --> + <reference value="Coverage/e51239e1-ba74-48e0-97fb-9754d2b05c60" /> + </entry> + </section> + </Composition> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/MedicationRequest/b12e7181-39dd-4864-a63f-74bb81d643a1" /> + <resource> + <MedicationRequest xmlns="http://hl7.org/fhir"> + <id value="b12e7181-39dd-4864-a63f-74bb81d643a1" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.1.0" /> + </meta> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_StatusCoPayment"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_StatusCoPayment" /> + <code value="0" /> + </valueCoding> + </extension> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee"> + <valueBoolean value="false" /> + </extension> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG"> + <valueBoolean value="false" /> + </extension> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription"> + <extension url="Kennzeichen"> + <valueBoolean value="false" /> + </extension> + </extension> + <status value="active" /> + <intent value="order" /> + <medicationReference> + <reference value="Medication/aad9fb8b-2ec2-4cda-874a-82565c9d45ef" /> + </medicationReference> + <subject> + <reference value="Patient/30635f5d-c233-4500-94e8-6414940236aa" /> + </subject> + <authoredOn value="2022-05-20" /> + <requester> + <reference value="Practitioner/667ffd79-42a3-4002-b7ca-6b9098f20ccb" /> + </requester> + <insurance> + <reference value="Coverage/e51239e1-ba74-48e0-97fb-9754d2b05c60" /> + </insurance> + <dosageInstruction> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag"> + <valueBoolean value="false" /> + </extension> + </dosageInstruction> + <dispenseRequest> + <quantity> + <value value="1" /> + <system value="http://unitsofmeasure.org" /> + <code value="{Package}" /> + </quantity> + </dispenseRequest> + </MedicationRequest> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Medication/aad9fb8b-2ec2-4cda-874a-82565c9d45ef" /> + <resource> + <Medication xmlns="http://hl7.org/fhir"> + <id value="aad9fb8b-2ec2-4cda-874a-82565c9d45ef" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_Ingredient|1.1.0" /> + </meta> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category" /> + <code value="00" /> + </valueCoding> + </extension> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine"> + <valueBoolean value="false" /> + </extension> + <extension url="http://fhir.de/StructureDefinition/normgroesse"> + <valueCode value="N2" /> + </extension> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Type" /> + <code value="wirkstoff" /> + </coding> + </code> + <form> + <text value="Tabletten" /> + </form> + <amount> + <numerator> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_PackagingSize"> + <valueString value="20" /> + </extension> + <unit value="Stück" /> + </numerator> + <denominator> + <value value="1" /> + </denominator> + </amount> + <ingredient> + <itemCodeableConcept> + <coding> + <system value="http://fhir.de/CodeSystem/ask" /> + <code value="5682" /> + </coding> + <text value="Ibuprofen" /> + </itemCodeableConcept> + <strength> + <numerator> + <value value="600" /> + <unit value="mg" /> + </numerator> + <denominator> + <value value="1" /> + </denominator> + </strength> + </ingredient> + </Medication> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Patient/30635f5d-c233-4500-94e8-6414940236aa" /> + <resource> + <Patient xmlns="http://hl7.org/fhir"> + <id value="30635f5d-c233-4500-94e8-6414940236aa" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.1.0" /> + </meta> + <identifier> + <type> + <coding> + <system value="http://fhir.de/CodeSystem/identifier-type-de-basis" /> + <code value="GKV" /> + </coding> + </type> + <system value="http://fhir.de/sid/gkv/kvid-10" /> + <value value="K220645122" /> + </identifier> + <name> + <use value="official" /> + <family value="Schuhmann"> + <extension url="http://hl7.org/fhir/StructureDefinition/humanname-own-name"> + <valueString value="Schuhmann" /> + </extension> + </family> + <given value="Sahra" /> + </name> + <birthDate value="1970-12-24" /> + <address> + <type value="both" /> + <line value="Berliner Straße 1"> + <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber"> + <valueString value="1" /> + </extension> + <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName"> + <valueString value="Berliner Straße" /> + </extension> + </line> + <city value="Husum" /> + <postalCode value="25813" /> + <country value="D" /> + </address> +</Patient> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Practitioner/667ffd79-42a3-4002-b7ca-6b9098f20ccb" /> + <resource> + <Practitioner xmlns="http://hl7.org/fhir"> + <id value="667ffd79-42a3-4002-b7ca-6b9098f20ccb" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.1.0" /> + </meta> + <identifier> + <type> + <coding> + <system value="http://terminology.hl7.org/CodeSystem/v2-0203" /> + <code value="LANR" /> + </coding> + </type> + <system value="https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR" /> + <value value="987654423" /> + </identifier> + <name> + <use value="official" /> + <family value="Schneider"> + <extension url="http://hl7.org/fhir/StructureDefinition/humanname-own-name"> + <valueString value="Schneider" /> + </extension> + </family> + <given value="Emma" /> + <prefix value="Dr. med."> + <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier"> + <valueCode value="AC" /> + </extension> + </prefix> + </name> + <qualification> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type" /> + <code value="04" /> + </coding> + </code> + </qualification> + <qualification> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Berufsbezeichnung" /> + <code value="Berufsbezeichnung" /> + </coding> + <text value="Fachärztin für Innere Medizin" /> + </code> + </qualification> + </Practitioner> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Organization/2a555cd3-0543-483c-88b3-f68647620962" /> + <resource> + <Organization xmlns="http://hl7.org/fhir"> + <id value="2a555cd3-0543-483c-88b3-f68647620962" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.1.0" /> + </meta> + <identifier> + <type> + <coding> + <system value="http://terminology.hl7.org/CodeSystem/v2-0203" /> + <code value="BSNR" /> + </coding> + </type> + <system value="https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR" /> + <value value="724444400" /> + </identifier> + <name value="Hausarztpraxis" /> + <telecom> + <system value="phone" /> + <value value="030321654987" /> + </telecom> + <telecom> + <system value="email" /> + <value value="hausarztpraxis@e-mail.de" /> + </telecom> + <address> + <type value="both" /> + <line value="Herbert-Lewin-Platz 2"> + <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber"> + <valueString value="2" /> + </extension> + <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName"> + <valueString value="Herbert-Lewin-Platz" /> + </extension> + </line> + <line value="Erdgeschoss"> + <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator"> + <valueString value="Erdgeschoss" /> + </extension> + </line> + <city value="Berlin" /> + <postalCode value="10623" /> + <country value="D" /> + </address> + </Organization> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Coverage/e51239e1-ba74-48e0-97fb-9754d2b05c60" /> + <resource> + <Coverage xmlns="http://hl7.org/fhir"> + <id value="e51239e1-ba74-48e0-97fb-9754d2b05c60" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.1.0" /> + </meta> + <extension url="http://fhir.de/StructureDefinition/gkv/besondere-personengruppe"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE" /> + <code value="00" /> + </valueCoding> + </extension> + <extension url="http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP" /> + <code value="00" /> + </valueCoding> + </extension> + <extension url="http://fhir.de/StructureDefinition/gkv/wop"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP" /> + <code value="01" /> + </valueCoding> + </extension> + <extension url="http://fhir.de/StructureDefinition/gkv/versichertenart"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS" /> + <code value="1" /> + </valueCoding> + </extension> + <status value="active" /> + <type> + <coding> + <system value="http://fhir.de/CodeSystem/versicherungsart-de-basis" /> + <code value="GKV" /> + </coding> + </type> + <beneficiary> + <reference value="Patient/30635f5d-c233-4500-94e8-6414940236aa" /> + </beneficiary> + <payor> + <identifier> + <system value="http://fhir.de/sid/arge-ik/iknr" /> + <value value="108018347" /> + </identifier> + <display value="AOK Baden-Württemberg" /> + </payor> + </Coverage> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Practitioner/d6f3b55d-3095-4655-96dc-da3bec21271c" /> + <resource> + <Practitioner xmlns="http://hl7.org/fhir"> + <id value="d6f3b55d-3095-4655-96dc-da3bec21271c" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.1.0" /> + </meta> + <identifier> + <type> + <coding> + <system value="http://terminology.hl7.org/CodeSystem/v2-0203" /> + <code value="LANR" /> + </coding> + </type> + <system value="https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR" /> + <value value="754236701" /> + </identifier> + <name> + <use value="official" /> + <family value="Schulz"> + <extension url="http://hl7.org/fhir/StructureDefinition/humanname-own-name"> + <valueString value="Schulz" /> + </extension> + </family> + <given value="Ben" /> + </name> + <qualification> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type" /> + <code value="00" /> + </coding> + </code> + </qualification> + <qualification> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Berufsbezeichnung" /> + <code value="Berufsbezeichnung" /> + </coding> + <text value="Facharzt für Allgemeinmedizin" /> + </code> + </qualification> + </Practitioner> + </resource> + </entry> +</Bundle> diff --git a/src/test/resources/examples_erezept/Beispiel_52.xml b/src/test/resources/examples_erezept/Beispiel_52.xml new file mode 100644 index 000000000..b2ca22582 --- /dev/null +++ b/src/test/resources/examples_erezept/Beispiel_52.xml @@ -0,0 +1,423 @@ +<Bundle xmlns="http://hl7.org/fhir"> + <id value="6f193f8b-da7b-4a77-9105-44050d8839c5" /> + <meta> + <lastUpdated value="2022-05-20T08:30:00Z" /> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.1.0" /> + </meta> + <identifier> + <system value="https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId" /> + <value value="160.100.000.000.052.80" /> + </identifier> + <type value="document" /> + <timestamp value="2022-05-20T08:30:00Z"/> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Composition/9fa07214-b744-4709-aca9-c91d23690e86" /> + <resource> + <Composition xmlns="http://hl7.org/fhir"> + <id value="9fa07214-b744-4709-aca9-c91d23690e86" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.1.0" /> + </meta> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN" /> + <code value="00" /> + </valueCoding> + </extension> + <status value="final" /> + <type> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART" /> + <code value="e16A" /> + </coding> + </type> + <subject> + <reference value="Patient/1d36152b-40c6-4aeb-a552-86a4d3277edc" /> + </subject> + <date value="2022-05-20T08:00:00Z"/> + <author> + <reference value="Practitioner/d6f3b55d-3095-4655-96dc-da3bec21271c" /> + <type value="Practitioner" /> + </author> + <author> + <type value="Device" /> + <identifier> + <system value="https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer" /> + <value value="Y/400/2107/36/999" /> + </identifier> + </author> + <title value="elektronische Arzneimittelverordnung" /> + <custodian> + <reference value="Organization/2a555cd3-0543-483c-88b3-f68647620962" /> + </custodian> + <section> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type" /> + <code value="Prescription" /> + </coding> + </code> + <entry> + <!-- Referenz auf Verordnung (MedicationRequest) --> + <reference value="MedicationRequest/d7be9b6b-8530-43a9-87c6-c01602cf3def" /> + </entry> + </section> + <section> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type" /> + <code value="Coverage" /> + </coding> + </code> + <entry> + <!-- Referenz auf Krankenkasse/Kostenträger --> + <reference value="Coverage/e51239e1-ba74-48e0-97fb-9754d2b05c60" /> + </entry> + </section> + </Composition> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/MedicationRequest/d7be9b6b-8530-43a9-87c6-c01602cf3def" /> + <resource> + <MedicationRequest xmlns="http://hl7.org/fhir"> + <!--Beispiel MedicationRequest für eine PZN-Verordnung --> + <id value="d7be9b6b-8530-43a9-87c6-c01602cf3def"/> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.1.0" /> + </meta> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_StatusCoPayment"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_StatusCoPayment" /> + <code value="0" /> + </valueCoding> + </extension> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee"> + <valueBoolean value="false"/> + </extension> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG"> + <valueBoolean value="false"/> + </extension> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription"> + <extension url="Kennzeichen"> + <valueBoolean value="false"/> + </extension> + </extension> + <status value="active"/> + <intent value="order"/> + <medicationReference> + <reference value="Medication/c7320d8f-1bec-4063-8ae2-9609ecef65f9"/> + </medicationReference> + <subject> + <reference value="Patient/1d36152b-40c6-4aeb-a552-86a4d3277edc"/> + </subject> + <authoredOn value="2022-05-20" /> + <requester> + <reference value="Practitioner/d6f3b55d-3095-4655-96dc-da3bec21271c"/> + </requester> + <insurance> + <reference value="Coverage/e51239e1-ba74-48e0-97fb-9754d2b05c60"/> + </insurance> + <dosageInstruction> + <patientInstruction value="Ad libitum" /> + </dosageInstruction> + <dispenseRequest> + <quantity> + <value value="1"/> + <system value="http://unitsofmeasure.org"/> + <code value="{Package}"/> + </quantity> + </dispenseRequest> + <substitution> + <allowedBoolean value="false"/> + </substitution> + </MedicationRequest> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Medication/c7320d8f-1bec-4063-8ae2-9609ecef65f9" /> + <resource> + <Medication xmlns="http://hl7.org/fhir"> + <id value="c7320d8f-1bec-4063-8ae2-9609ecef65f9"/> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_Compounding|1.1.0" /> + </meta> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_Base_Medication_Type"> + <valueCodeableConcept> + <coding> + <system value="http://snomed.info/sct"/> + <version value="http://snomed.info/sct/900000000000207008/version/20220331" /> + <code value="373873005:860781008=362943005" /> + <display value="Pharmaceutical / biologic product (product) : Has product characteristic (attribute) = Manual method (qualifier value)" /> + </coding> + </valueCodeableConcept> + </extension> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category"/> + <code value="00"/> + </valueCoding> + </extension> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine"> + <valueBoolean value="false"/> + </extension> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Type"/> + <code value="rezeptur"/> + </coding> + <text value="Nerisona Salbe"/> + </code> + <form> + <text value="Salbe"/> + </form> + <amount> + <numerator> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_PackagingSize"> + <valueString value="60" /> + </extension> + <unit value="g"/> + </numerator> + <denominator> + <value value="1"/> + </denominator> + </amount> + <ingredient> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Ingredient_Form"> + <valueString value="Salbe"/> + </extension> + <itemCodeableConcept> + <text value="Nerisona"/> + </itemCodeableConcept> + <strength> + <numerator> + <value value="30"/> + <unit value="g"/> + </numerator> + <denominator> + <value value="1"/> + </denominator> + </strength> + </ingredient> + <ingredient> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Ingredient_Form"> + <valueString value="Salbe"/> + </extension> + <itemCodeableConcept> + <text value="Asche Basis"/> + </itemCodeableConcept> + <strength> + <extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Ingredient_Amount"> + <valueString value="Ad 60 g"/> + </extension> + </strength> + </ingredient> + </Medication> + + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Patient/1d36152b-40c6-4aeb-a552-86a4d3277edc" /> + <resource> + <Patient xmlns="http://hl7.org/fhir"> + <id value="1d36152b-40c6-4aeb-a552-86a4d3277edc" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.1.0" /> + </meta> + <identifier> + <type> + <coding> + <system value="http://fhir.de/CodeSystem/identifier-type-de-basis" /> + <code value="GKV" /> + </coding> + </type> + <system value="http://fhir.de/sid/gkv/kvid-10" /> + <value value="H030170228" /> + </identifier> + <name> + <use value="official" /> + <family value="Grossherzog von und zu der Schaumberg-von-und-zu-Schaumburg-und-Radeberg"> + <extension url="http://fhir.de/StructureDefinition/humanname-namenszusatz"> + <valueString value="Grossherzog" /> + </extension> + <extension url="http://hl7.org/fhir/StructureDefinition/humanname-own-prefix"> + <valueString value="von und zu der" /> + </extension> + <extension url="http://hl7.org/fhir/StructureDefinition/humanname-own-name"> + <valueString value="Schaumberg-von-und-zu-Schaumburg-und-Radeberg" /> + </extension> + </family> + <given value="Friedrich-Wilhelm-Karl-Gustav-Justus-Gotfried" /> + <prefix value="Prof. habil. Dr. med"> + <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier"> + <valueCode value="AC" /> + </extension> + </prefix> + </name> + <birthDate value="1951-07-12" /> + <address> + <type value="postal" /> + <line value="124589"> + <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-postBox"> + <valueString value="124589" /> + </extension> + </line> + <city value="Berlin" /> + <postalCode value="12489" /> + <country value="D" /> + </address> + </Patient> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Practitioner/d6f3b55d-3095-4655-96dc-da3bec21271c" /> + <resource> + <Practitioner xmlns="http://hl7.org/fhir"> + <id value="d6f3b55d-3095-4655-96dc-da3bec21271c" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.1.0" /> + </meta> + <identifier> + <type> + <coding> + <system value="http://terminology.hl7.org/CodeSystem/v2-0203" /> + <code value="LANR" /> + </coding> + </type> + <system value="https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR" /> + <value value="754236701" /> + </identifier> + <name> + <use value="official" /> + <family value="Schulz"> + <extension url="http://hl7.org/fhir/StructureDefinition/humanname-own-name"> + <valueString value="Schulz" /> + </extension> + </family> + <given value="Ben" /> + </name> + <qualification> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type" /> + <code value="00" /> + </coding> + </code> + </qualification> + <qualification> + <code> + <coding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Berufsbezeichnung" /> + <code value="Berufsbezeichnung" /> + </coding> + <text value="Facharzt für Allgemeinmedizin" /> + </code> + </qualification> + </Practitioner> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Organization/2a555cd3-0543-483c-88b3-f68647620962" /> + <resource> + <Organization xmlns="http://hl7.org/fhir"> + <id value="2a555cd3-0543-483c-88b3-f68647620962" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.1.0" /> + </meta> + <identifier> + <type> + <coding> + <system value="http://terminology.hl7.org/CodeSystem/v2-0203" /> + <code value="BSNR" /> + </coding> + </type> + <system value="https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR" /> + <value value="724444400" /> + </identifier> + <name value="Hausarztpraxis" /> + <telecom> + <system value="phone" /> + <value value="030321654987" /> + </telecom> + <telecom> + <system value="email" /> + <value value="hausarztpraxis@e-mail.de" /> + </telecom> + <address> + <type value="both" /> + <line value="Herbert-Lewin-Platz 2"> + <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber"> + <valueString value="2" /> + </extension> + <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName"> + <valueString value="Herbert-Lewin-Platz" /> + </extension> + </line> + <line value="Erdgeschoss"> + <extension url="http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator"> + <valueString value="Erdgeschoss" /> + </extension> + </line> + <city value="Berlin" /> + <postalCode value="10623" /> + <country value="D" /> + </address> + </Organization> + </resource> + </entry> + <entry> + <fullUrl value="http://pvs.praxis.local/fhir/Coverage/e51239e1-ba74-48e0-97fb-9754d2b05c60" /> + <resource> + <Coverage xmlns="http://hl7.org/fhir"> + <id value="e51239e1-ba74-48e0-97fb-9754d2b05c60" /> + <meta> + <profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.1.0" /> + </meta> + <extension url="http://fhir.de/StructureDefinition/gkv/besondere-personengruppe"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE" /> + <code value="00" /> + </valueCoding> + </extension> + <extension url="http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP" /> + <code value="00" /> + </valueCoding> + </extension> + <extension url="http://fhir.de/StructureDefinition/gkv/wop"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP" /> + <code value="72" /> + </valueCoding> + </extension> + <extension url="http://fhir.de/StructureDefinition/gkv/versichertenart"> + <valueCoding> + <system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS" /> + <code value="1" /> + </valueCoding> + </extension> + <status value="active" /> + <type> + <coding> + <system value="http://fhir.de/CodeSystem/versicherungsart-de-basis" /> + <code value="GKV" /> + </coding> + </type> + <beneficiary> + <reference value="Patient/1d36152b-40c6-4aeb-a552-86a4d3277edc" /> + </beneficiary> + <period> + <end value="2034-12-31" /> + </period> + <payor> + <identifier> + <system value="http://fhir.de/sid/arge-ik/iknr" /> + <value value="108035612" /> + </identifier> + <display value="mhplus BKK" /> + </payor> + </Coverage> + </resource> + </entry> +</Bundle> diff --git a/src/test/resources/jetbrains-httpclient/Validate.http b/src/test/resources/jetbrains-httpclient/Validate.http new file mode 100644 index 000000000..fbd7e4844 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/Validate.http @@ -0,0 +1,636 @@ +POST http://{{baseURL}}/validate +Content-Type: application/json + +{ + "resourceType": "Bundle", + "id": "2f97abb5-5b34-48c3-b380-8cb0d1b71796", + "meta": { + "lastUpdated": "2024-07-20T08:30:00+00:00", + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.1.0" + ] + }, + "identifier": { + "system": "https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId", + "value": "160.100.000.000.004.30" + }, + "type": "document", + "timestamp": "2024-07-20T08:30:00+00:00", + "entry": [ + { + "fullUrl": "urn:uuid:70e4e747-a1e6-44cd-b91d-7cc2eef89c0c", + "resource": { + "resourceType": "Composition", + "id": "70e4e747-a1e6-44cd-b91d-7cc2eef89c0c", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.1.0" + ] + }, + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN", + "code": "01" + } + } + ], + "status": "final", + "type": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART", + "code": "e16A" + } + ] + }, + "subject": { + "reference": "urn:uuid:93866fdc-3e50-4902-a7e9-891b54737b5e" + }, + "date": "2024-07-20T08:00:00Z", + "author": [ + { + "reference": "urn:uuid:cb7558e2-0fdf-4107-93f6-07f13f39e067", + "type": "Practitioner" + }, + { + "type": "Device", + "identifier": { + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer", + "value": "Y/400/2107/36/999" + } + } + ], + "title": "elektronische Arzneimittelverordnung", + "attester": [ + { + "mode": "legal", + "party": { + "reference": "urn:uuid:667ffd79-42a3-4002-b7ca-6b9098f20ccb" + } + } + ], + "custodian": { + "reference": "urn:uuid:5d3f4ac0-2b44-4d48-b363-e63efa72973b" + }, + "section": [ + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type", + "code": "Prescription" + } + ] + }, + "entry": [ + { + "reference": "urn:uuid:877e9689-523e-46ca-aa78-8de34a023583" + } + ] + }, + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type", + "code": "Coverage" + } + ] + }, + "entry": [ + { + "reference": "urn:uuid:1b89236c-ab14-4e92-937e-5af0b59d0cd4" + } + ] + }, + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type", + "code": "FOR_PractitionerRole" + } + ] + }, + "entry": [ + { + "reference": "urn:uuid:cfa278d2-0b57-4889-a6a9-d3ff59983107" + } + ] + } + ] + } + }, + { + "fullUrl": "urn:uuid:877e9689-523e-46ca-aa78-8de34a023583", + "resource": { + "resourceType": "MedicationRequest", + "id": "877e9689-523e-46ca-aa78-8de34a023583", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.1.0" + ] + }, + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_StatusCoPayment", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_StatusCoPayment", + "code": "0" + } + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee", + "valueBoolean": false + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG", + "valueBoolean": false + }, + { + "extension": [ + { + "url": "Kennzeichen", + "valueBoolean": false + } + ], + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription" + } + ], + "status": "active", + "intent": "order", + "medicationReference": { + "reference": "urn:uuid:b7dd5ddb-b5ad-4b04-af11-6d2a354bce0c" + }, + "subject": { + "reference": "urn:uuid:93866fdc-3e50-4902-a7e9-891b54737b5e" + }, + "authoredOn": "2024-07-20", + "requester": { + "reference": "urn:uuid:cb7558e2-0fdf-4107-93f6-07f13f39e067" + }, + "insurance": [ + { + "reference": "urn:uuid:1b89236c-ab14-4e92-937e-5af0b59d0cd4" + } + ], + "note": [ + { + "text": "Bitte auf Anwendung schulen" + } + ], + "dosageInstruction": [ + { + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag", + "valueBoolean": false + } + ] + } + ], + "dispenseRequest": { + "quantity": { + "value": 2, + "system": "http://unitsofmeasure.org", + "code": "{Package}" + } + }, + "substitution": { + "allowedBoolean": true + } + } + }, + { + "fullUrl": "urn:uuid:b7dd5ddb-b5ad-4b04-af11-6d2a354bce0c", + "resource": { + "resourceType": "Medication", + "id": "b7dd5ddb-b5ad-4b04-af11-6d2a354bce0c", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_PZN|1.1.0" + ] + }, + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_Base_Medication_Type", + "valueCodeableConcept": { + "coding": [ + { + "system": "http://snomed.info/sct", + "version": "http://snomed.info/sct/900000000000207008/version/20220331", + "code": "763158003", + "display": "Medicinal product (product)" + } + ] + } + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category", + "code": "00" + } + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine", + "valueBoolean": false + }, + { + "url": "http://fhir.de/StructureDefinition/normgroesse", + "valueCode": "N1" + } + ], + "code": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/ifa/pzn", + "code": "00427833" + } + ], + "text": "Viani 50µg/250µg 1 Diskus 60 ED N1" + }, + "form": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DARREICHUNGSFORM", + "code": "IHP" + } + ] + }, + "amount": { + "numerator": { + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_PackagingSize", + "valueString": "1" + } + ], + "unit": "Diskus" + }, + "denominator": { + "value": 1 + } + } + } + }, + { + "fullUrl": "urn:uuid:93866fdc-3e50-4902-a7e9-891b54737b5e", + "resource": { + "resourceType": "Patient", + "id": "93866fdc-3e50-4902-a7e9-891b54737b5e", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.1.0" + ] + }, + "identifier": [ + { + "type": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/identifier-type-de-basis", + "code": "GKV" + } + ] + }, + "system": "http://fhir.de/sid/gkv/kvid-10", + "value": "K220635158" + } + ], + "name": [ + { + "use": "official", + "family": "Königsstein", + "_family": { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", + "valueString": "Königsstein" + } + ] + }, + "given": [ + "Ludger" + ] + } + ], + "birthDate": "1935-06-22", + "address": [ + { + "type": "both", + "line": [ + "Blumenweg" + ], + "_line": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", + "valueString": "Blumenweg" + } + ] + } + ], + "city": "Esens", + "postalCode": "26427", + "country": "D" + } + ] + } + }, + { + "fullUrl": "urn:uuid:cfa278d2-0b57-4889-a6a9-d3ff59983107", + "resource": { + "resourceType": "PractitionerRole", + "id": "cfa278d2-0b57-4889-a6a9-d3ff59983107", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_PractitionerRole|1.1.0" + ] + }, + "practitioner": { + "reference": "urn:uuid:cb7558e2-0fdf-4107-93f6-07f13f39e067" + }, + "organization": { + "identifier": { + "system": "http://fhir.de/NamingSystem/asv/teamnummer", + "value": "001234567" + } + } + } + }, + { + "fullUrl": "urn:uuid:cb7558e2-0fdf-4107-93f6-07f13f39e067", + "resource": { + "resourceType": "Practitioner", + "id": "cb7558e2-0fdf-4107-93f6-07f13f39e067", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.1.0" + ] + }, + "name": [ + { + "use": "official", + "family": "Fischer", + "_family": { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", + "valueString": "Fischer" + } + ] + }, + "given": [ + "Alexander" + ] + } + ], + "qualification": [ + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type", + "code": "04" + } + ] + } + }, + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Berufsbezeichnung", + "code": "Berufsbezeichnung" + } + ], + "text": "Facharzt für Innere Medizin" + } + }, + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Fachgruppennummer_ASV", + "code": "555555472" + } + ] + } + } + ] + } + }, + { + "fullUrl": "urn:uuid:667ffd79-42a3-4002-b7ca-6b9098f20ccb", + "resource": { + "resourceType": "Practitioner", + "id": "667ffd79-42a3-4002-b7ca-6b9098f20ccb", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.1.0" + ] + }, + "identifier": [ + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "LANR" + } + ] + }, + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR", + "value": "987654423" + } + ], + "name": [ + { + "use": "official", + "family": "Schneider", + "_family": { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", + "valueString": "Schneider" + } + ] + }, + "given": [ + "Emma" + ], + "prefix": [ + "Dr. med." + ], + "_prefix": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier", + "valueCode": "AC" + } + ] + } + ] + } + ], + "qualification": [ + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type", + "code": "00" + } + ] + } + }, + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Berufsbezeichnung", + "code": "Berufsbezeichnung" + } + ], + "text": "Fachärztin für Innere Medizin" + } + } + ] + } + }, + { + "fullUrl": "urn:uuid:5d3f4ac0-2b44-4d48-b363-e63efa72973b", + "resource": { + "resourceType": "Organization", + "id": "5d3f4ac0-2b44-4d48-b363-e63efa72973b", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.1.0" + ] + }, + "identifier": [ + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "BSNR" + } + ] + }, + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR", + "value": "721111100" + } + ], + "name": "MVZ", + "telecom": [ + { + "system": "phone", + "value": "0301234567" + }, + { + "system": "fax", + "value": "030123456789" + }, + { + "system": "email", + "value": "mvz@e-mail.de" + } + ], + "address": [ + { + "type": "both", + "line": [ + "Herbert-Lewin-Platz 2" + ], + "_line": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber", + "valueString": "2" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", + "valueString": "Herbert-Lewin-Platz" + } + ] + } + ], + "city": "Berlin", + "postalCode": "10623", + "country": "D" + } + ] + } + }, + { + "fullUrl": "urn:uuid:1b89236c-ab14-4e92-937e-5af0b59d0cd4", + "resource": { + "resourceType": "Coverage", + "id": "1b89236c-ab14-4e92-937e-5af0b59d0cd4", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.1.0" + ] + }, + "extension": [ + { + "url": "http://fhir.de/StructureDefinition/gkv/besondere-personengruppe", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE", + "code": "00" + } + }, + { + "url": "http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP", + "code": "05" + } + }, + { + "url": "http://fhir.de/StructureDefinition/gkv/wop", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP", + "code": "17" + } + }, + { + "url": "http://fhir.de/StructureDefinition/gkv/versichertenart", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS", + "code": "5" + } + } + ], + "status": "active", + "type": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/versicherungsart-de-basis", + "code": "GKV" + } + ] + }, + "beneficiary": { + "reference": "urn:uuid:93866fdc-3e50-4902-a7e9-891b54737b5e" + }, + "payor": [ + { + "identifier": { + "system": "http://fhir.de/sid/arge-ik/iknr", + "value": "109719018" + }, + "display": "AOK Nordost" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/test/resources/jetbrains-httpclient/http-client.env.json b/src/test/resources/jetbrains-httpclient/http-client.env.json new file mode 100644 index 000000000..a290a2a49 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/http-client.env.json @@ -0,0 +1,71 @@ +{ + "example": { + "baseURL": "localhost:8080", + "userId": "df2d1b3b-1393-4a0a-9f3d-e93327127bbf", + "eHBAHandle": "HBA-17", + "SMCBHandle": "SMC-B-18", + "connector.base-url": "https://192.168.178.42:443", + "connector.client-certificate": "data:application/x-pkcs12;base64,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", + "connector.client-certificate-password": "00", + "connector.client-system-id": "Incentergy", + "connector.mandant-id": "Incentergy", + "connector.version": "PTV4+", + "connector.workplace-id": "1786_A1" + }, + "secret-secunet": { + "baseURL": "localhost:8080", + "userId": "fee7a1c1-6f05-4599-8b29-2fc9c010a149", + "eHBAHandle": "HBA-791", + "SMCBHandle": "SMC-B-793", + "connector.base-url": "https://192.168.178.42:443", + "connector.client-certificate": "data:application/x-pkcs12;base64,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", + "connector.client-certificate-password": "N4rouwibGRhne2Fa", + "connector.client-system-id": "Incentergy", + "connector.mandant-id": "Incentergy", + "connector.workplace-id": "1786_A1", + "connector.version": "PTV5", + "ere.workflow-service.prescription-server.url": "https://erp-dev.zentral.erp.splitdns.ti-dienste.de", + "idp.client.id": "GEMIncenereSud1PErUR", + "idp.base.url": "https://idp-ref.zentral.idp.splitdns.ti-dienste.de/", + "idp.auth.request.redirect.url": "https://ere.health/redirect_uri" + }, + "secret-kocobox": { + "baseURL": "localhost:8080", + "userId": "17e4e3e0-a6ad-42a8-96a8-eb5836f5ef64", + "eHBAHandle": "HBA-61", + "SMCBHandle": "SMC-B-60", + "connector.base-url": "https://192.168.178.108:443", + "connector.client-certificate": "data:application/x-pkcs12;base64,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", + "connector.client-certificate-password": "ao8DtyloMlxaF4x$", + "connector.client-system-id": "Incentergy", + "connector.mandant-id": "Incentergy", + "connector.workplace-id": "1786_A1", + "connector.version": "PTV5" + }, + "secret-rise": { + "baseURL": "localhost:8080", + "userId": "17e4e3e0-a6ad-42a8-96a8-eb5836f5ef64", + "eHBAHandle": "HBA-61", + "SMCBHandle": "SMC-B-60", + "connector.base-url": "https://192.168.178.113:443", + "connector.client-certificate": "data:application/x-pkcs12;base64,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", + "connector.client-certificate-password": "Di/Mw*J@o=iZrt~s", + "connector.client-system-id": "Incentergy", + "connector.mandant-id": "m", + "connector.workplace-id": "a", + "connector.version": "PTV5" + }, + "kops": { + "baseURL": "localhost:8090", + "userId": "c86269c8-72ba-40da-a81b-24f35fce360c", + "eHBAHandle": "HBA-32", + "SMCBHandle": "SMC-B-30", + "connector.base-url": "localhost:443", + "connector.client-certificate": "data:application/x-pkcs12;base64,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", + "connector.client-certificate-password": "tobitest", + "connector.client-system-id": "ClientID1", + "connector.mandant-id": "Mandant1", + "connector.version": "PTV3", + "connector.workplace-id": "Workplace1" + } +} \ No newline at end of file diff --git a/src/test/resources/jetbrains-httpclient/http/workflow/abort.http b/src/test/resources/jetbrains-httpclient/http/workflow/abort.http new file mode 100644 index 000000000..c9547ee63 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/http/workflow/abort.http @@ -0,0 +1,16 @@ +### POST Abort +POST http://{{baseURL}}/workflow/abort +Content-Type: application/json +X-userId: {{userId}} +X-eHBAHandle: {{eHBAHandle}} +X-SMCBHandle: {{SMCBHandle}} +X-clientSystemId: {{connector.client-system-id}} +X-mandantId: {{connector.mandant-id}} +X-workplaceId: {{connector.workplace-id}} +X-clientCertificate: {{connector.client-certificate}} +X-clientCertificatePassword: {{connector.client-certificate-password}} + +{ + "taskId": "160.000.226.491.339.79", + "accessCode": "84d00970cf99dd7c4d434c1378872fb5780b84e6033d43e8f811a42c4320c2b6" +} diff --git a/src/test/resources/jetbrains-httpclient/http/workflow/cards.http b/src/test/resources/jetbrains-httpclient/http/workflow/cards.http new file mode 100644 index 000000000..c6ee079f5 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/http/workflow/cards.http @@ -0,0 +1,14 @@ +### GetCards +GET http://{{baseURL}}/workflow/cards +X-userId: {{userId}} +X-eHBAHandle: {{eHBAHandle}} +X-SMCBHandle: {{SMCBHandle}} +X-connectorBaseURL: {{connector.base-url}} +X-clientCertificate: {{connector.client-certificate}} +X-clientCertificatePassword: {{connector.client-certificate-password}} +X-clientSystemId: {{connector.client-system-id}} +X-mandantId: {{connector.mandant-id}} +X-workplaceId: {{connector.workplace-id}} + +### GetCards +GET http://{{baseURL}}/workflow/cards \ No newline at end of file diff --git a/src/test/resources/jetbrains-httpclient/http/workflow/comfortsignature/activate.http b/src/test/resources/jetbrains-httpclient/http/workflow/comfortsignature/activate.http new file mode 100644 index 000000000..887e9aebc --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/http/workflow/comfortsignature/activate.http @@ -0,0 +1,12 @@ +### Activate Comfortsignature +POST http://{{baseURL}}/workflow/comfortsignature/activate +X-userId: {{userId}} +X-eHBAHandle: {{eHBAHandle}} +X-SMCBHandle: {{SMCBHandle}} +X-connectorBaseURL: {{connector.base-url}} +X-clientCertificate: {{connector.client-certificate}} +X-clientCertificatePassword: {{connector.client-certificate-password}} +X-clientSystemId: {{connector.client-system-id}} +X-mandantId: {{connector.mandant-id}} +X-workplaceId: {{connector.workplace-id}} + diff --git a/src/test/resources/jetbrains-httpclient/http/workflow/comfortsignature/deactivate.http b/src/test/resources/jetbrains-httpclient/http/workflow/comfortsignature/deactivate.http new file mode 100644 index 000000000..1d80f2a77 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/http/workflow/comfortsignature/deactivate.http @@ -0,0 +1,11 @@ +### Deactivate Comfortsignature +POST http://{{baseURL}}/workflow/comfortsignature/deactivate +X-userId: {{userId}} +X-eHBAHandle: {{eHBAHandle}} +X-SMCBHandle: {{SMCBHandle}} +X-connectorBaseURL: {{connector.base-url}} +X-clientCertificate: {{connector.client-certificate}} +X-clientCertificatePassword: {{connector.client-certificate-password}} +X-clientSystemId: {{connector.client-system-id}} +X-mandantId: {{connector.mandant-id}} +X-workplaceId: {{connector.workplace-id}} diff --git a/src/test/resources/jetbrains-httpclient/http/workflow/idp-token.http b/src/test/resources/jetbrains-httpclient/http/workflow/idp-token.http new file mode 100644 index 000000000..441e8496f --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/http/workflow/idp-token.http @@ -0,0 +1,5 @@ +### GET idp-token +GET http://{{baseURL}}/workflow/idp-token +X-userId: {{userId}} +X-eHBAHandle: {{eHBAHandle}} +X-SMCBHandle: {{SMCBHandle}} diff --git a/src/test/resources/jetbrains-httpclient/http/workflow/pharmacy/Accept.http b/src/test/resources/jetbrains-httpclient/http/workflow/pharmacy/Accept.http new file mode 100644 index 000000000..b0e850c11 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/http/workflow/pharmacy/Accept.http @@ -0,0 +1,13 @@ +@prescriptionId = 160.000.226.454.961.88 +@accessCode = 180aa3c0a0cf7cc7213a7688097605b18201eb3c353cf599b922a0365de4a650 + +### GET Pharmacy Accept +GET http://{{baseURL}}/pharmacy/Accept?token=/Task/{{prescriptionId}}/$accept?ac={{accessCode}} +X-userId: {{userId}} +X-eHBAHandle: {{eHBAHandle}} +X-SMCBHandle: {{SMCBHandle}} +X-clientSystemId: {{connector.client-system-id}} +X-mandantId: {{connector.mandant-id}} +X-workplaceId: {{connector.workplace-id}} +X-clientCertificate: {{connector.client-certificate}} +X-clientCertificatePassword: {{connector.client-certificate-password}} \ No newline at end of file diff --git a/src/test/resources/jetbrains-httpclient/http/workflow/test-prescription.http b/src/test/resources/jetbrains-httpclient/http/workflow/test-prescription.http new file mode 100644 index 000000000..b234c225c --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/http/workflow/test-prescription.http @@ -0,0 +1,12 @@ +### POST Test-Prescription +POST http://{{baseURL}}/workflow/test-prescription +Accept: application/pdf +X-userId: {{userId}} +X-eHBAHandle: {{eHBAHandle}} +X-SMCBHandle: {{SMCBHandle}} +X-connectorBaseURL: {{connector.base-url}} +X-clientCertificate: {{connector.client-certificate}} +X-clientCertificatePassword: {{connector.client-certificate-password}} +X-clientSystemId: {{connector.client-system-id}} +X-mandantId: {{connector.mandant-id}} +X-workplaceId: {{connector.workplace-id}} diff --git a/src/test/resources/jetbrains-httpclient/websocket/ActivateComfortSignature.http b/src/test/resources/jetbrains-httpclient/websocket/ActivateComfortSignature.http new file mode 100644 index 000000000..86c9a8e85 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/websocket/ActivateComfortSignature.http @@ -0,0 +1,23 @@ +# ActivateComfortSignature example messages +### ActivateComfortSignature Example +WEBSOCKET ws://{{baseURL}}/websocket +Content-Type: application/json + +{ + "type": "ActivateComfortSignature", + "id": "{{$random.uuid}}", + "runtimeConfig": { + "eHBAHandle": "{{eHBAHandle}}", + "SMCBHandle": "{{SMCBHandle}}", + "connector.user-id": "{{userId}}", + "connector.base-url": "{{connector.base-url}}", + "connector.client-certificate": "{{connector.client-certificate}}", + "connector.client-certificate-password": "{{connector.client-certificate-password}}", + "connector.client-system-id": "{{connector.client-system-id}}", + "connector.mandant-id": "{{connector.mandant-id}}", + "connector.workplace-id": "{{connector.workplace-id}}", + "connector.version": "{{connector.version}}", + "connector.basic-auth-username": null, + "connector.basic-auth-password": null + } +} \ No newline at end of file diff --git a/src/test/resources/jetbrains-httpclient/websocket/DeactivateComfortSignature.http b/src/test/resources/jetbrains-httpclient/websocket/DeactivateComfortSignature.http new file mode 100644 index 000000000..2e9ab90cd --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/websocket/DeactivateComfortSignature.http @@ -0,0 +1,23 @@ +# DeactivateComfortSignature example messages +### DeactivateComfortSignature Example2 +WEBSOCKET ws://{{baseURL}}/websocket +Content-Type: application/json + +{ + "type": "DeactivateComfortSignature", + "id": "{{$random.uuid}}", + "runtimeConfig": { + "eHBAHandle": "{{eHBAHandle}}", + "SMCBHandle": "{{SMCBHandle}}", + "connector.user-id": "{{userId}}", + "connector.base-url": "{{connector.base-url}}", + "connector.client-certificate": "{{connector.client-certificate}}", + "connector.client-certificate-password": "{{connector.client-certificate-password}}", + "connector.client-system-id": "{{connector.client-system-id}}", + "connector.mandant-id": "{{connector.mandant-id}}", + "connector.workplace-id": "{{connector.workplace-id}}", + "connector.version": "{{connector.version}}", + "connector.basic-auth-username": null, + "connector.basic-auth-password": null + } +} \ No newline at end of file diff --git a/src/test/resources/jetbrains-httpclient/websocket/GetCards.http b/src/test/resources/jetbrains-httpclient/websocket/GetCards.http new file mode 100644 index 000000000..8d3823e27 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/websocket/GetCards.http @@ -0,0 +1,42 @@ +### GetCards example messages +WEBSOCKET ws://{{baseURL}}/websocket +Content-Type: application/json + +{ + "type": "GetCards", + "id": "{{$uuid}}", + "runtimeConfig": { + "eHBAHandle": "{{eHBAHandle}}", + "SMCBHandle": "{{SMCBHandle}}", + "connector.user-id": "{{userId}}", + "connector.base-url": "{{connector.base-url}}", + "connector.client-certificate": "{{connector.client-certificate}}", + "connector.client-certificate-password": "{{connector.client-certificate-password}}", + "connector.client-system-id": "{{connector.client-system-id}}", + "connector.mandant-id": "{{connector.mandant-id}}", + "connector.workplace-id": "{{connector.workplace-id}}", + "connector.version": "{{connector.version}}", + "connector.basic-auth-username": null, + "connector.basic-auth-password": null + } +} + +### GetCards example messages +WEBSOCKET ws://{{baseURL}}/websocket +Content-Type: application/json + +{ + "type": "GetCards", + "id": "{{$uuid}}", + "runtimeConfig": { + "connector.base-url": "{{connector.base-url}}", + "connector.client-certificate": "{{connector.client-certificate}}", + "connector.client-certificate-password": "{{connector.client-certificate-password}}", + "connector.client-system-id": "{{connector.client-system-id}}", + "connector.mandant-id": "{{connector.mandant-id}}", + "connector.workplace-id": "{{connector.workplace-id}}", + "connector.version": "{{connector.version}}", + "connector.basic-auth-username": null, + "connector.basic-auth-password": null + } +} diff --git a/src/test/resources/jetbrains-httpclient/websocket/GetSignatureMode.http b/src/test/resources/jetbrains-httpclient/websocket/GetSignatureMode.http new file mode 100644 index 000000000..08c67febf --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/websocket/GetSignatureMode.http @@ -0,0 +1,26 @@ +# GetSignatureMode example messages +# required as mandatory elements: MandantId, ClientSystemId, WorkplaceId +# Optional element (but required for session info): CardHandle to address (only eHBA supported) and userId +# If the userId is missing / wrong and comfort sig active: Exception (card has elevated security level with other userId) +### GetSignatureMode Example +WEBSOCKET ws://{{baseURL}}/websocket +Content-Type: application/json + +{ + "type": "GetSignatureMode", + "id": "{{$random.uuid}}", + "runtimeConfig": { + "eHBAHandle": "{{eHBAHandle}}", + "SMCBHandle": "{{SMCBHandle}}", + "connector.user-id": "{{userId}}", + "connector.base-url": "{{connector.base-url}}", + "connector.client-certificate": "{{connector.client-certificate}}", + "connector.client-certificate-password": "{{connector.client-certificate-password}}", + "connector.client-system-id": "{{connector.client-system-id}}", + "connector.mandant-id": "{{connector.mandant-id}}", + "connector.workplace-id": "{{connector.workplace-id}}", + "connector.version": "{{connector.version}}", + "connector.basic-auth-username": null, + "connector.basic-auth-password": null + } +} diff --git a/src/test/resources/jetbrains-httpclient/websocket/PreviewOnly.http b/src/test/resources/jetbrains-httpclient/websocket/PreviewOnly.http new file mode 100644 index 000000000..aae565bc7 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/websocket/PreviewOnly.http @@ -0,0 +1,27 @@ +# GetSignatureMode example messages +# required as mandatory elements: MandantId, ClientSystemId, WorkplaceId +# Optional element (but required for session info): CardHandle to address (only eHBA supported) and userId +# If the userId is missing / wrong and comfort sig active: Exception (card has elevated security level with other userId) +### GetCards example messages +WEBSOCKET ws://{{baseURL}}/websocket +Content-Type: application/json + +{ + "type": "PreviewOnly", + "id": "{{$uuid}}", + "runtimeConfig": { + "eHBAHandle": "{{eHBAHandle}}", + "SMCBHandle": "{{SMCBHandle}}", + "connector.user-id": "{{userId}}", + "connector.base-url": "{{connector.base-url}}", + "connector.client-certificate": "{{connector.client-certificate}}", + "connector.client-certificate-password": "{{connector.client-certificate-password}}", + "connector.client-system-id": "{{connector.client-system-id}}", + "connector.mandant-id": "{{connector.mandant-id}}", + "connector.workplace-id": "{{connector.workplace-id}}", + "connector.version": "{{connector.version}}", + "connector.basic-auth-username": null, + "connector.basic-auth-password": null + }, + "payload": [[{"resourceType": "Bundle", "meta": {"lastUpdated": "2024-04-11T09:00:51.069+02:00", "profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.1.0"]}, "identifier": {"value": "160.000.226.246.766.90", "system": "https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId"}, "entry": [{"fullUrl": "http://pvs.praxis.local/fhir/Composition/a447fcbc-1887-4e8e-ba9a-9d8776b2e3c1", "resource": {"id": "a447fcbc-1887-4e8e-ba9a-9d8776b2e3c1", "extension": [{"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis", "valueCoding": {"code": "00", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN"}}], "subject": {"reference": "Patient/748fa1c0-f9d1-4c4a-b353-a4c88eb15a56"}, "section": [{"entry": [{"reference": "MedicationRequest/ff33c3f9-901c-4fc7-9685-d7190f8539b1"}], "code": {"coding": [{"code": "Prescription", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type"}]}}, {"entry": [{"reference": "Coverage/e14f0778-3cbf-4b29-8c27-f7f1c6d2ce73"}], "code": {"coding": [{"code": "Coverage", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type"}]}}], "custodian": {"reference": "Organization/1292cb21-6d6d-4765-aebb-3650e9ab3bd8"}, "resourceType": "Composition", "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.1.0"]}, "author": [{"reference": "Practitioner/de0b8a88-8af6-4602-b008-5d94d327b00c", "type": "Practitioner"}, {"type": "Device", "identifier": {"value": "Y/400/1904/36/112", "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer"}}], "title": "elektronische Arzneimittelverordnung", "status": "final", "type": {"coding": [{"code": "e16A", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART"}]}, "date": "2024-04-11T09:00:51+02:00"}}, {"fullUrl": "http://pvs.praxis.local/fhir/Patient/748fa1c0-f9d1-4c4a-b353-a4c88eb15a56", "resource": {"resourceType": "Patient", "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.1.0"]}, "address": [{"country": "D", "line": ["Bramfelder Str. 140"], "_line": [{"extension": [{"url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber", "valueString": "140"}, {"url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", "valueString": "Bramfelder Str."}]}], "postalCode": "22305", "type": "both", "city": "Hamburg"}], "name": [{"family": "TK-Mustermann", "use": "official", "given": ["Max"], "_family": {"extension": [{"url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", "valueString": "TK-Mustermann"}]}}], "birthDate": "1995-01-01", "identifier": [{"value": "X110423581", "type": {"coding": [{"code": "GKV", "system": "http://fhir.de/CodeSystem/identifier-type-de-basis"}]}, "system": "http://fhir.de/sid/gkv/kvid-10"}], "id": "748fa1c0-f9d1-4c4a-b353-a4c88eb15a56"}}, {"fullUrl": "http://pvs.praxis.local/fhir/Medication/a116cdf7-fc62-4bd6-9931-2fcfedc95433", "resource": {"resourceType": "Medication", "id": "a116cdf7-fc62-4bd6-9931-2fcfedc95433", "extension": [{"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category", "valueCoding": {"code": "00", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category"}}, {"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine", "valueBoolean": false}], "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_FreeText|1.1.0"]}, "code": {"coding": [{"code": "freitext", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Type"}], "text": "Test"}}}, {"fullUrl": "http://pvs.praxis.local/fhir/MedicationRequest/ff33c3f9-901c-4fc7-9685-d7190f8539b1", "resource": {"insurance": [{"reference": "Coverage/e14f0778-3cbf-4b29-8c27-f7f1c6d2ce73"}], "id": "ff33c3f9-901c-4fc7-9685-d7190f8539b1", "extension": [{"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_StatusCoPayment", "valueCoding": {"code": "0", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_StatusCoPayment"}}, {"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee", "valueBoolean": false}, {"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG", "valueBoolean": false}, {"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription", "extension": [{"url": "Kennzeichen", "valueBoolean": false}]}], "authoredOn": "2024-04-11", "subject": {"reference": "Patient/748fa1c0-f9d1-4c4a-b353-a4c88eb15a56"}, "dosageInstruction": [{"text": "Zu Testzwecken", "extension": [{"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag", "valueBoolean": true}]}], "substitution": {"allowedBoolean": true}, "resourceType": "MedicationRequest", "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.1.0"]}, "dispenseRequest": {"quantity": {"value": 1, "code": "{Package}", "system": "http://unitsofmeasure.org"}}, "requester": {"reference": "Practitioner/de0b8a88-8af6-4602-b008-5d94d327b00c"}, "status": "active", "intent": "order", "medicationReference": {"reference": "Medication/a116cdf7-fc62-4bd6-9931-2fcfedc95433"}}}, {"fullUrl": "http://pvs.praxis.local/fhir/Practitioner/de0b8a88-8af6-4602-b008-5d94d327b00c", "resource": {"resourceType": "Practitioner", "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.1.0"]}, "qualification": [{"code": {"coding": [{"code": "00", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type"}]}}, {"code": {"coding": [{"code": "Berufsbezeichnung", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Berufsbezeichnung"}], "text": "Arzt"}}], "name": [{"family": "Bëírliner", "use": "official", "given": ["Maria"], "_family": {"extension": [{"url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", "valueString": "Bëírliner"}]}}], "identifier": [{"value": "999999999", "type": {"coding": [{"code": "LANR", "system": "http://terminology.hl7.org/CodeSystem/v2-0203"}]}, "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR"}], "id": "de0b8a88-8af6-4602-b008-5d94d327b00c"}}, {"fullUrl": "http://pvs.praxis.local/fhir/Organization/1292cb21-6d6d-4765-aebb-3650e9ab3bd8", "resource": {"resourceType": "Organization", "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.1.0"]}, "address": [{"country": "D", "line": ["Sulzfeldstraße 7"], "_line": [{"extension": [{"url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", "valueString": "Sulzfeldstraße"}, {"url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber", "valueString": "7"}]}], "postalCode": "93055", "type": "both", "city": "Regensburg"}], "name": "Praxis SigmuntowskíTEST-ONLY", "telecom": [{"value": "0123456789", "system": "phone"}], "identifier": [{"value": "999999999", "type": {"coding": [{"code": "BSNR", "system": "http://terminology.hl7.org/CodeSystem/v2-0203"}]}, "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR"}], "id": "1292cb21-6d6d-4765-aebb-3650e9ab3bd8"}}, {"fullUrl": "http://pvs.praxis.local/fhir/Coverage/e14f0778-3cbf-4b29-8c27-f7f1c6d2ce73", "resource": {"beneficiary": {"reference": "Patient/748fa1c0-f9d1-4c4a-b353-a4c88eb15a56"}, "resourceType": "Coverage", "id": "e14f0778-3cbf-4b29-8c27-f7f1c6d2ce73", "extension": [{"url": "http://fhir.de/StructureDefinition/gkv/besondere-personengruppe", "valueCoding": {"code": "00", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE"}}, {"url": "http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen", "valueCoding": {"code": "00", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP"}}, {"url": "http://fhir.de/StructureDefinition/gkv/versichertenart", "valueCoding": {"code": "1", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS"}}], "payor": [{"display": "TK", "identifier": {"value": "109500969", "system": "http://fhir.de/sid/arge-ik/iknr"}}], "status": "active", "type": {"coding": [{"code": "GKV", "system": "http://fhir.de/CodeSystem/versicherungsart-de-basis"}]}, "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.1.0"]}}}], "timestamp": "2024-04-11T09:00:51.069+02:00", "type": "document", "id": "a8ddf5c7-ce25-4e43-844d-3a58e4e4f069"}]] +} \ No newline at end of file diff --git a/src/test/resources/jetbrains-httpclient/websocket/RequestStatus.http b/src/test/resources/jetbrains-httpclient/websocket/RequestStatus.http new file mode 100644 index 000000000..a5db5a214 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/websocket/RequestStatus.http @@ -0,0 +1,18 @@ +### RequestStatus example messages +WEBSOCKET ws://{{baseURL}}/websocket +Content-Type: application/json + +{"type": "RequestStatus", + "id": "{{$random.uuid}}", + "runtimeConfig": { + "eHBAHandle": "{{eHBAHandle}}", + "SMCBHandle": "{{SMCBHandle}}", + "connector.user-id": "{{userId}}", + "connector.base-url": "{{connector.base-url}}", + "connector.client-certificate": "{{connector.client-certificate}}", + "connector.client-certificate-password": "{{connector.client-certificate-password}}", + "connector.client-system-id": "{{connector.client-system-id}}", + "connector.mandant-id": "{{connector.mandant-id}}", + "connector.workplace-id": "{{connector.workplace-id}}", + "connector.version": "{{connector.version}}" + }} \ No newline at end of file diff --git a/src/test/resources/jetbrains-httpclient/websocket/SignAndUploadBundles.http b/src/test/resources/jetbrains-httpclient/websocket/SignAndUploadBundles.http new file mode 100644 index 000000000..fd9de5c82 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/websocket/SignAndUploadBundles.http @@ -0,0 +1,481 @@ +WEBSOCKET ws://{{baseURL}}/websocket +Content-Type: application/json // Content highlighting only + +{ + "type": "SignAndUploadBundles", + "runtimeConfig": { + "eHBAHandle": "{{eHBAHandle}}", + "SMCBHandle": "{{SMCBHandle}}", + "sendPreview": false, + "connector.user-id": "{{userId}}", + "connector.base-url": "{{connector.base-url}}", + "connector.client-certificate": "{{connector.client-certificate}}", + "connector.client-certificate-password": "{{connector.client-certificate-password}}", + "connector.client-system-id": "{{connector.client-system-id}}", + "connector.mandant-id": "{{connector.mandant-id}}", + "connector.workplace-id": "{{connector.workplace-id}}", + "connector.version": "{{connector.version}}", + "connector.basic-auth-username": null, + "connector.basic-auth-password": null + }, + "payload": [ + [{ + "type": "document", + "entry": [ + { + "fullUrl": "http://pvs.praxis.local/fhir/Composition/b0aa06fb-e3d0-4821-a982-6a8c9219ae8c", + "resource": { + "date": "2024-04-12T09:50:00Z", + "status": "final", + "custodian": { + "reference": "Organization/d9984508-b7d7-4e1b-bf27-90b77056953a" + }, + "subject": { + "reference": "Patient/aeb776c7-4525-4e73-be2d-2523f21fdbbf" + }, + "extension": [ + { + "valueCoding": { + "code": "00", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN" + }, + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis" + } + ], + "type": { + "coding": [ + { + "code": "e16A", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART" + } + ] + }, + "section": [ + { + "entry": [ + { + "reference": "MedicationRequest/7610cb0f-5c2c-432d-aa49-1d5ee33294c9" + } + ], + "code": { + "coding": [ + { + "code": "Prescription", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type" + } + ] + } + }, + { + "entry": [ + { + "reference": "Coverage/03896e8e-aaff-4761-a328-4f15246d6304" + } + ], + "code": { + "coding": [ + { + "code": "Coverage", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type" + } + ] + } + } + ], + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.1.0" + ] + }, + "author": [ + { + "reference": "Practitioner/bdb1c784-70a4-4f08-85c6-2d176da70f78", + "type": "Practitioner" + }, + { + "identifier": { + "value": "Y/400/2107/36/999", + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer" + }, + "type": "Device" + } + ], + "title": "elektronische Arzneimittelverordnung", + "resourceType": "Composition", + "id": "b0aa06fb-e3d0-4821-a982-6a8c9219ae8c" + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Coverage/03896e8e-aaff-4761-a328-4f15246d6304", + "resource": { + "extension": [ + { + "valueCoding": { + "code": "00", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE" + }, + "url": "http://fhir.de/StructureDefinition/gkv/besondere-personengruppe" + }, + { + "valueCoding": { + "code": "00", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP" + }, + "url": "http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen" + }, + { + "valueCoding": { + "code": "5", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS" + }, + "url": "http://fhir.de/StructureDefinition/gkv/versichertenart" + } + ], + "type": { + "coding": [ + { + "code": "GKV", + "system": "http://fhir.de/CodeSystem/versicherungsart-de-basis" + } + ] + }, + "payor": [ + { + "display": "Techniker Krankenkasse", + "identifier": { + "value": "101575519", + "system": "http://fhir.de/sid/arge-ik/iknr" + } + } + ], + "resourceType": "Coverage", + "beneficiary": { + "reference": "Patient/aeb776c7-4525-4e73-be2d-2523f21fdbbf" + }, + "status": "active", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.1.0" + ] + }, + "id": "03896e8e-aaff-4761-a328-4f15246d6304" + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Patient/aeb776c7-4525-4e73-be2d-2523f21fdbbf", + "resource": { + "birthDate": "1982-01-01", + "name": [ + { + "_family": { + "extension": [ + { + "valueString": "Mustermann", + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name" + } + ] + }, + "given": [ + "Juliane" + ], + "use": "official", + "family": "Mustermann" + } + ], + "resourceType": "Patient", + "address": [ + { + "postalCode": "64289", + "type": "both", + "_line": [ + { + "extension": [ + { + "valueString": "Schottener Weg", + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName" + }, + { + "valueString": "5", + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber" + } + ] + } + ], + "city": "Darmstadt", + "country": "D", + "line": [ + "Schottener Weg 5" + ] + } + ], + "identifier": [ + { + "type": { + "coding": [ + { + "code": "GKV", + "system": "http://fhir.de/CodeSystem/identifier-type-de-basis" + } + ] + }, + "value": "T027875325", + "system": "http://fhir.de/sid/gkv/kvid-10" + } + ], + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.1.0" + ] + }, + "id": "aeb776c7-4525-4e73-be2d-2523f21fdbbf" + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Practitioner/bdb1c784-70a4-4f08-85c6-2d176da70f78", + "resource": { + "qualification": [ + { + "code": { + "coding": [ + { + "code": "00", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type" + } + ] + } + }, + { + "code": { + "coding": [ + { + "code": "Berufsbezeichnung", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Berufsbezeichnung" + } + ], + "text": "Arzt" + } + } + ], + "name": [ + { + "_family": { + "extension": [ + { + "valueString": "Bëírliner", + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name" + } + ] + }, + "given": [ + "Maria" + ], + "use": "official", + "family": "Bëírliner" + } + ], + "resourceType": "Practitioner", + "identifier": [ + { + "type": { + "coding": [ + { + "code": "LANR", + "system": "http://terminology.hl7.org/CodeSystem/v2-0203" + } + ] + }, + "value": "123456499", + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR" + } + ], + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.1.0" + ] + }, + "id": "bdb1c784-70a4-4f08-85c6-2d176da70f78" + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Organization/d9984508-b7d7-4e1b-bf27-90b77056953a", + "resource": { + "telecom": [ + { + "value": "0123456789", + "system": "phone" + } + ], + "name": "Praxis SigmuntowskíTEST-ONLY", + "resourceType": "Organization", + "address": [ + { + "postalCode": "93055", + "type": "both", + "_line": [ + { + "extension": [ + { + "valueString": "Sulzfeldstraße", + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName" + }, + { + "valueString": "7", + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber" + } + ] + } + ], + "city": "Regensburg", + "country": "D", + "line": [ + "Sulzfeldstraße 7" + ] + } + ], + "identifier": [ + { + "type": { + "coding": [ + { + "code": "BSNR", + "system": "http://terminology.hl7.org/CodeSystem/v2-0203" + } + ] + }, + "value": "036812345", + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR" + } + ], + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.1.0" + ] + }, + "id": "d9984508-b7d7-4e1b-bf27-90b77056953a" + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/MedicationRequest/7610cb0f-5c2c-432d-aa49-1d5ee33294c9", + "resource": { + "medicationReference": { + "reference": "Medication/2f419f04-20f8-49b6-985e-f7b82f1bfd14" + }, + "insurance": [ + { + "reference": "Coverage/03896e8e-aaff-4761-a328-4f15246d6304" + } + ], + "status": "active", + "substitution": { + "allowedBoolean": true + }, + "requester": { + "reference": "Practitioner/bdb1c784-70a4-4f08-85c6-2d176da70f78" + }, + "authoredOn": "2024-04-12", + "subject": { + "reference": "Patient/aeb776c7-4525-4e73-be2d-2523f21fdbbf" + }, + "extension": [ + { + "valueCoding": { + "code": "1", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_StatusCoPayment" + }, + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_StatusCoPayment" + }, + { + "valueBoolean": false, + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee" + }, + { + "valueBoolean": false, + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG" + }, + { + "extension": [ + { + "valueBoolean": false, + "url": "Kennzeichen" + } + ], + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription" + } + ], + "dispenseRequest": { + "quantity": { + "code": "{Package}", + "system": "http://unitsofmeasure.org", + "value": 1 + } + }, + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.1.0" + ] + }, + "intent": "order", + "dosageInstruction": [ + { + "extension": [ + { + "valueBoolean": false, + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag" + } + ] + } + ], + "resourceType": "MedicationRequest", + "id": "7610cb0f-5c2c-432d-aa49-1d5ee33294c9" + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Medication/2f419f04-20f8-49b6-985e-f7b82f1bfd14", + "resource": { + "extension": [ + { + "valueCoding": { + "code": "00", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category" + }, + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category" + }, + { + "valueBoolean": false, + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine" + } + ], + "code": { + "coding": [ + { + "code": "freitext", + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Type" + } + ], + "text": "Isopto Max ATR" + }, + "resourceType": "Medication", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_FreeText|1.1.0" + ] + }, + "id": "2f419f04-20f8-49b6-985e-f7b82f1bfd14" + } + } + ], + "resourceType": "Bundle", + "timestamp": "2024-04-12T09:50:00Z", + "identifier": { + "value": "160.100.000.000.006.24", + "system": "https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId" + }, + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.1.0" + ] + }, + "id": "b8b68c8e-9ae8-41ee-832d-5d91666dd5f5" +}] + ] +} \ No newline at end of file diff --git a/src/test/resources/jetbrains-httpclient/websocket/XMLBundle.http b/src/test/resources/jetbrains-httpclient/websocket/XMLBundle.http new file mode 100644 index 000000000..0f6ce1626 --- /dev/null +++ b/src/test/resources/jetbrains-httpclient/websocket/XMLBundle.http @@ -0,0 +1,21 @@ +# Send XML bundle example messages +WEBSOCKET ws://{{baseURL}}/websocket +content-type: application/json // for content highlighting only + +{ + "type": "XMLBundle", + "id": "{{$uuid}}", + "runtimeConfig": { + "eHBAHandle": "{{eHBAHandle}}", + "SMCBHandle": "{{SMCBHandle}}", + "sendPreview": false, + "userId": "{{userId}}", + "connector.client-system-id": "{{connector.client-system-id}}", + "connector.mandant-id": "{{connector.mandant-id}}", + "connector.workplace-id": "{{connector.workplace-id}}", + "connector.base-url": "{{connector.base-url}}", + "connector.client-certificate": "{{connector.client-certificate}}", + "connector.client-certificate-password": "{{connector.client-certificate-password}}" + }, + "payload": "<Bundle xmlns='http://hl7.org/fhir'><id value='c3948313-4975-4d59-ab49-132994693a02'/><meta><lastUpdated value='2024-04-30T12:04:54.271+02:00'/><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.1.0'/></meta><identifier><system value='https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId'/><value value='160.602.767.492.809.51'/></identifier><type value='document'/><timestamp value='2024-04-30T12:04:54.271+02:00'/><entry><fullUrl value='http://pvs.praxis.local/fhir/Composition/4d5b65a2-0390-4a13-8d9e-f666e1517a10'/><resource><Composition xmlns='http://hl7.org/fhir'><id value='4d5b65a2-0390-4a13-8d9e-f666e1517a10'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.1.0'/></meta><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN'/><code value='00'/></valueCoding></extension><status value='final'/><type><coding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART'/><code value='e16A'/></coding></type><subject><reference value='Patient/ce4104af-b86b-4664-afee-1b5fc3ac8acf'/></subject><date value='2024-04-30T12:04:54+02:00'/><author><reference value='Practitioner/313fd7d2-a232-48fd-8e28-98c1d6688068'/><type value='Practitioner'/></author><author><type value='Device'/><identifier><system value='https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer'/><value value='Y/400/1904/36/112'/></identifier></author><title value='elektronische Arzneimittelverordnung'/><custodian><reference value='Organization/d9984508-b7d7-4e1b-bf27-90b77056953a'/></custodian><section><code><coding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type'/><code value='Prescription'/></coding></code><entry><reference value='MedicationRequest/69d74f18-97e4-4b2d-9e3a-1480ba1a6c66'/></entry></section><section><code><coding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type'/><code value='Coverage'/></coding></code><entry><reference value='Coverage/da80211e-61ee-458e-a651-87370b6ec30c'/></entry></section></Composition></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/Patient/ce4104af-b86b-4664-afee-1b5fc3ac8acf'/><resource><Patient xmlns='http://hl7.org/fhir'><id value='ce4104af-b86b-4664-afee-1b5fc3ac8acf'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.1.0'/></meta><identifier><type><coding><system value='http://fhir.de/CodeSystem/identifier-type-de-basis'/><code value='GKV'/></coding></type><system value='http://fhir.de/sid/gkv/kvid-10'/><value value='K030182229'/></identifier><name><use value='official'/><family value='Kluge'><extension url='http://hl7.org/fhir/StructureDefinition/humanname-own-name'><valueString value='Kluge'/></extension></family><given value='Eva'/><prefix value='Prof. Dr. Dr. med'><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier'><valueCode value='AC'/></extension></prefix></name><birthDate value='1982-01-03'/><address><type value='both'/><line value='Pflasterhofweg 111B'><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber'><valueString value='111B'/></extension><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName'><valueString value='Pflasterhofweg'/></extension></line><city value='Köln'/><postalCode value='50999'/><country value='D'/></address></Patient></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/Medication/5748167d-6e68-44b8-a80b-b29f87e4ab93'/><resource><Medication xmlns='http://hl7.org/fhir'><id value='5748167d-6e68-44b8-a80b-b29f87e4ab93'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_PZN|1.1.0'/></meta><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_Base_Medication_Type'><valueCodeableConcept><coding><system value='http://snomed.info/sct'/><version value='http://snomed.info/sct/900000000000207008/version/20220331'/><code value='763158003'/><display value='Medicinal product (product)'/></coding></valueCodeableConcept></extension><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category'/><code value='00'/></valueCoding></extension><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine'><valueBoolean value='false'/></extension><extension url='http://fhir.de/StructureDefinition/normgroesse'><valueCode value='N3'/></extension><code><coding><system value='http://fhir.de/CodeSystem/ifa/pzn'/><code value='06488681'/></coding><text value='L-Thyroxin 75 - 1 A Pharma 100 St. N3'/></code><form><coding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DARREICHUNGSFORM'/><code value='TAB'/></coding></form></Medication></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/MedicationRequest/69d74f18-97e4-4b2d-9e3a-1480ba1a6c66'/><resource><MedicationRequest xmlns='http://hl7.org/fhir'><id value='69d74f18-97e4-4b2d-9e3a-1480ba1a6c66'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.1.0'/></meta><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_StatusCoPayment'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_StatusCoPayment'/><code value='0'/></valueCoding></extension><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee'><valueBoolean value='false'/></extension><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG'><valueBoolean value='false'/></extension><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription'><extension url='Kennzeichen'><valueBoolean value='false'/></extension></extension><status value='active'/><intent value='order'/><medicationReference><reference value='Medication/5748167d-6e68-44b8-a80b-b29f87e4ab93'/></medicationReference><subject><reference value='Patient/ce4104af-b86b-4664-afee-1b5fc3ac8acf'/></subject><authoredOn value='2024-04-30'/><requester><reference value='Practitioner/313fd7d2-a232-48fd-8e28-98c1d6688068'/></requester><insurance><reference value='Coverage/da80211e-61ee-458e-a651-87370b6ec30c'/></insurance><dosageInstruction><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag'><valueBoolean value='false'/></extension></dosageInstruction><dispenseRequest><quantity><value value='1'/><system value='http://unitsofmeasure.org'/><code value='{Package}'/></quantity></dispenseRequest><substitution><allowedBoolean value='true'/></substitution></MedicationRequest></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/Practitioner/313fd7d2-a232-48fd-8e28-98c1d6688068'/><resource><Practitioner xmlns='http://hl7.org/fhir'><id value='313fd7d2-a232-48fd-8e28-98c1d6688068'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.1.0'/></meta><identifier><type><coding><system value='http://terminology.hl7.org/CodeSystem/v2-0203'/><code value='LANR'/></coding></type><system value='https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR'/><value value='123456499'/></identifier><name><use value='official'/><family value='Bëírliner'><extension url='http://hl7.org/fhir/StructureDefinition/humanname-own-name'><valueString value='Bëírliner'/></extension></family><given value='Maria'/><prefix value='Dr. med'><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier'><valueCode value='AC'/></extension></prefix></name><qualification><code><coding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type'/><code value='00'/></coding></code></qualification><qualification><code><coding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Berufsbezeichnung'/><code value='Berufsbezeichnung'/></coding><text value='Arzt'/></code></qualification></Practitioner></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/Organization/d9984508-b7d7-4e1b-bf27-90b77056953a'/><resource><Organization xmlns='http://hl7.org/fhir'><id value='d9984508-b7d7-4e1b-bf27-90b77056953a'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.1.0'/></meta><identifier><type><coding><system value='http://terminology.hl7.org/CodeSystem/v2-0203'/><code value='BSNR'/></coding></type><system value='https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR'/><value value='036812345'/></identifier><name value='Praxis SigmuntowskíTEST-ONLY'/><telecom><system value='phone'/><value value='0123456789'/></telecom><address><type value='both'/><line value='Sulzfeldstraße 7'><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName'><valueString value='Sulzfeldstraße'/></extension><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber'><valueString value='7'/></extension></line><city value='Regensburg'/><postalCode value='93055'/><country value='D'/></address></Organization></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/Coverage/da80211e-61ee-458e-a651-87370b6ec30c'/><resource><Coverage xmlns='http://hl7.org/fhir'><id value='da80211e-61ee-458e-a651-87370b6ec30c'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.1.0'/></meta><extension url='http://fhir.de/StructureDefinition/gkv/besondere-personengruppe'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE'/><code value='00'/></valueCoding></extension><extension url='http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP'/><code value='00'/></valueCoding></extension><extension url='http://fhir.de/StructureDefinition/gkv/wop'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP'/><code value='38'/></valueCoding></extension><extension url='http://fhir.de/StructureDefinition/gkv/versichertenart'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS'/><code value='3'/></valueCoding></extension><status value='active'/><type><coding><system value='http://fhir.de/CodeSystem/versicherungsart-de-basis'/><code value='GKV'/></coding></type><beneficiary><reference value='Patient/ce4104af-b86b-4664-afee-1b5fc3ac8acf'/></beneficiary><payor><identifier><system value='http://fhir.de/sid/arge-ik/iknr'/><value value='109777509'/></identifier><display value='Techniker-Krankenkasse'/></payor></Coverage></resource></entry></Bundle>" +} \ No newline at end of file diff --git a/src/test/resources/kbv-xslt/PF01.html b/src/test/resources/kbv-xslt/PF01.html index d10db6c93..f81ce87f2 100644 --- a/src/test/resources/kbv-xslt/PF01.html +++ b/src/test/resources/kbv-xslt/PF01.html @@ -95,13 +95,13 @@ padding: 0; } } - </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">AOK Rheinland/Hamburg</td><td colspan="1" class="daten" style="text-align:right;">38</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Schaumberg</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Prof. Dr. Karl-Friederich Graf Freiherr von</td><td class="daten" style="text-align:right; ">04.04.1964</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Siegburger Str. 155<br/>D 51105 Köln</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten"/><td style="border-left:1px solid black;" class="daten">S040464113</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">29.12.2021</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> + </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">AOK Rheinland/Hamburg</td><td colspan="1" class="daten" style="text-align:right;">38</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Schaumberg</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Prof. Dr. Karl-Friederich Graf Freiherr von</td><td class="daten" style="text-align:right; ">04.04.1964</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Siegburger Str. 155<br/>D 51105 Köln</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten">104212059</td><td style="border-left:1px solid black;" class="daten">S040464113</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">16.02.2024</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> Tel: 0211 / 1111111<br/> Fax: 0211 / 2222222<br/> E-Mail: AM@Testpraxis.de<br/>Dr. Annie More<br/>Fachärztin für Allgemeinmedizin<br/>838382201<br/><div class="in-black" style=" width:100%; text-align: center; size:-2;">Angaben Praxis / verordnende Person</div></div></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td><table><tbody><tr><td><fieldset><legend align="right" class="in-black">PZN-Verordnung</legend><p class="daten" style="max-width: 50em;">2<text>x </text>Entresto® 49 mg/51 mg 20 Filmtbl.<text> </text>FTA<text> </text>N1<text> </text><text>(PZN: </text>11536100<text>)</text></p><p class="daten" style="max-width: 50em;"><text>Dosierung: </text>0-0-1-0</p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  - <span class="footer">1.0.2</span><br/> + <span class="footer">1.1.0</span><br/> Dokumententyp:  e16A</span></td><td><span class="footer">PRF.NR.:  Y/400/1904/36/112<br/> DOK.ID:  - 160.284.601.592.471.73</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file + 160.782.725.626.430.57</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file diff --git a/src/test/resources/kbv-xslt/PF02.html b/src/test/resources/kbv-xslt/PF02.html index 92d7bd71b..d0f854f91 100644 --- a/src/test/resources/kbv-xslt/PF02.html +++ b/src/test/resources/kbv-xslt/PF02.html @@ -95,13 +95,13 @@ padding: 0; } } - </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">AOK Rheinland/Hamburg</td><td colspan="1" class="daten" style="text-align:right;">38</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Schaumberg</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Prof. Dr. Karl-Friederich Graf Freiherr von</td><td class="daten" style="text-align:right; ">04.04.1964</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Siegburger Str. 155<br/>D 51105 Köln</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten"/><td style="border-left:1px solid black;" class="daten">S040464113</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">29.12.2021</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> + </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">AOK Rheinland/Hamburg</td><td colspan="1" class="daten" style="text-align:right;">38</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Schaumberg</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Prof. Dr. Karl-Friederich Graf Freiherr von</td><td class="daten" style="text-align:right; ">04.04.1964</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Siegburger Str. 155<br/>D 51105 Köln</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten">104212059</td><td style="border-left:1px solid black;" class="daten">S040464113</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">16.02.2024</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> Tel: 0211 / 1111111<br/> Fax: 0211 / 2222222<br/> E-Mail: AM@Testpraxis.de<br/>Dr. Annie More<br/>Fachärztin für Allgemeinmedizin<br/>838382201<br/><div class="in-black" style=" width:100%; text-align: center; size:-2;">Angaben Praxis / verordnende Person</div></div></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td><table><tbody><tr><td><fieldset><legend align="right" class="in-black">PZN-Verordnung</legend><p class="daten" style="max-width: 50em;">1<text>x </text>Entresto® 49 mg/51 mg 56 Filmtbl.<text> </text>FTA<text> </text>N2<text> </text><text>(PZN: </text>11126514<text>)</text></p><p class="daten" style="max-width: 50em;"><text>Dosierung: </text>0-0-1-0</p><p class="daten" style="max-width: 50em;">bitte Dosierung deutlich mitgeben</p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  - <span class="footer">1.0.2</span><br/> + <span class="footer">1.1.0</span><br/> Dokumententyp:  e16A</span></td><td><span class="footer">PRF.NR.:  Y/400/1904/36/112<br/> DOK.ID:  - 160.673.293.612.573.87</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file + 160.831.208.538.125.66</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file diff --git a/src/test/resources/kbv-xslt/PF03.html b/src/test/resources/kbv-xslt/PF03.html index c54b4c791..14bb8d3f1 100644 --- a/src/test/resources/kbv-xslt/PF03.html +++ b/src/test/resources/kbv-xslt/PF03.html @@ -95,13 +95,13 @@ padding: 0; } } - </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">IKK classic</td><td colspan="1" class="daten" style="text-align:right;">83</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Müller</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Viktor </td><td class="daten" style="text-align:right; ">23.05.1974</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Hauptstraße 12<br/>D 14469 Potsdam</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten"/><td style="border-left:1px solid black;" class="daten">M230574660</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">29.12.2021</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> + </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">IKK classic</td><td colspan="1" class="daten" style="text-align:right;">83</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Müller</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Viktor </td><td class="daten" style="text-align:right; ">23.05.1974</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Hauptstraße 12<br/>D 14469 Potsdam</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten">104201158</td><td style="border-left:1px solid black;" class="daten">M230574660</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">16.02.2024</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> Tel: 0211 / 1111111<br/> Fax: 0211 / 2222222<br/> E-Mail: AM@Testpraxis.de<br/>Dr. Annie More<br/>Fachärztin für Allgemeinmedizin<br/>838382201<br/><div class="in-black" style=" width:100%; text-align: center; size:-2;">Angaben Praxis / verordnende Person</div></div></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td><table><tbody><tr><td><fieldset><legend align="right" class="in-black">Freitext-Verordnung</legend><p class="daten" style="max-width: 50em;">1<text>x </text>Triamcinolonacetonid 0,1% in Basiscreme DAC 75g 1x tgl. dünn auf die betroffene Stelle auftragen<text> </text>Creme<text> </text></p><p class="daten" style="max-width: 50em;"><text>Dosieranweisung / Medikationsplan mitgegeben</text></p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  - <span class="footer">1.0.2</span><br/> + <span class="footer">1.1.0</span><br/> Dokumententyp:  e16A</span></td><td><span class="footer">PRF.NR.:  Y/400/1904/36/112<br/> DOK.ID:  - 160.888.544.235.505.94</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file + 160.364.773.610.557.37</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file diff --git a/src/test/resources/kbv-xslt/PF07.html b/src/test/resources/kbv-xslt/PF07.html index eace0ec4e..54c62eb74 100644 --- a/src/test/resources/kbv-xslt/PF07.html +++ b/src/test/resources/kbv-xslt/PF07.html @@ -95,13 +95,13 @@ padding: 0; } } - </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☒</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">BKK VBU</td><td colspan="1" class="daten" style="text-align:right;">72</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Althaus</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Brigitte </td><td class="daten" style="text-align:right; ">12.07.1978</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Potsdamer Platz 19<br/>D 10117 Berlin</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten"/><td style="border-left:1px solid black;" class="daten">A120778335</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">728382503</td><td style="border-left:1px solid black;" class="daten">29.12.2021</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> + </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☒</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">BKK VBU</td><td colspan="1" class="daten" style="text-align:right;">72</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Althaus</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Brigitte </td><td class="daten" style="text-align:right; ">12.07.1978</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Potsdamer Platz 19<br/>D 10117 Berlin</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten">109723913</td><td style="border-left:1px solid black;" class="daten">A120778335</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">728382503</td><td style="border-left:1px solid black;" class="daten">16.02.2024</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> Tel: 0211 / 1111111<br/> Fax: 0211 / 2222222<br/> E-Mail: AM@Testpraxis.de<br/>Dr. Klaus Graf von More<br/>Arzt<br/>728382503<br/>Dr. Annie More<br/>Fachärztin für Allgemeinmedizin<br/>838382201<br/><div class="in-black" style=" width:100%; text-align: center; size:-2;">Angaben Praxis / verordnende Person</div></div></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td><table><tbody><tr><td><fieldset><legend align="right" class="in-black">PZN-Verordnung</legend><p class="daten" style="max-width: 50em;">1<text>x </text>Ibuprofen AbZ 800mg 50 Filmtbl.<text> </text>FTA<text> </text>N2<text> </text><text>(PZN: </text>01016144<text>)</text></p><p class="daten" style="max-width: 50em;"><text>Dosieranweisung / Medikationsplan mitgegeben</text></p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  - <span class="footer">1.0.2</span><br/> + <span class="footer">1.1.0</span><br/> Dokumententyp:  e16A</span></td><td><span class="footer">PRF.NR.:  Y/400/1904/36/112<br/> DOK.ID:  - 160.108.410.365.456.94</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file + 160.229.682.939.935.37</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file diff --git a/src/test/resources/kbv-xslt/PF08_1.html b/src/test/resources/kbv-xslt/PF08_1.html index 1c2bb89e7..8a33a77d7 100644 --- a/src/test/resources/kbv-xslt/PF08_1.html +++ b/src/test/resources/kbv-xslt/PF08_1.html @@ -95,14 +95,14 @@ padding: 0; } } - </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">IKK classic/BVG</td><td colspan="1" class="daten" style="text-align:right;">83</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Werner</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Viktor Frhr. Gr in't</td><td class="daten" style="text-align:right; ">23.05.1974</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Hauptstraße 123456789<br/>D 14469 Potsdam</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten"/><td style="border-left:1px solid black;" class="daten">W230574661</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">06</span><span class="thin-space"> </span><span class="daten">04</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">29.12.2021</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☒</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> + </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">IKK classic/BVG</td><td colspan="1" class="daten" style="text-align:right;">83</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Werner</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Viktor Frhr. Gr in't</td><td class="daten" style="text-align:right; ">23.05.1974</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Hauptstraße 123456789<br/>D 14469 Potsdam</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten">103500693</td><td style="border-left:1px solid black;" class="daten">W230574661</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">06</span><span class="thin-space"> </span><span class="daten">04</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">16.02.2024</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☒</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> Tel: 0211 / 1111111<br/> Fax: 0211 / 2222222<br/> E-Mail: AM@Testpraxis.de<br/>Dr. Annie More<br/>Fachärztin für Allgemeinmedizin<br/>838382201<br/><div class="in-black" style=" width:100%; text-align: center; size:-2;">Angaben Praxis / verordnende Person</div></div></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td><table><tbody><tr><td><fieldset><legend align="right" class="in-black">PZN-Verordnung</legend><p class="daten">Mehrfachverordnung - 1<text> von </text>3<text>: Einlösbar</text><text> ab </text>29.12.2021<text> bis </text>29.03.2022</p><p class="daten" style="max-width: 50em;">1<text>x </text>HerzASS-ratiopharm® 50mg 100 Tbl.<text> </text>TAB<text> </text>N3<text> </text><text>(PZN: </text>04562798<text>)</text></p><p class="daten" style="max-width: 50em;"><text>Dosieranweisung / Medikationsplan mitgegeben</text></p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  - <span class="footer">1.0.2</span><br/> + 1<text> von </text>3<text>: Einlösbar</text><text> ab </text>16.02.2024<text> bis </text>16.05.2024</p><p class="daten" style="max-width: 50em;">1<text>x </text>HerzASS-ratiopharm® 50mg 100 Tbl.<text> </text>TAB<text> </text>N3<text> </text><text>(PZN: </text>04562798<text>)</text></p><p class="daten" style="max-width: 50em;"><text>Dosieranweisung / Medikationsplan mitgegeben</text></p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  + <span class="footer">1.1.0</span><br/> Dokumententyp:  e16A</span></td><td><span class="footer">PRF.NR.:  Y/400/1904/36/112<br/> DOK.ID:  - 160.273.463.281.933.43</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file + 160.185.505.541.252.20</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file diff --git a/src/test/resources/kbv-xslt/PF08_2.html b/src/test/resources/kbv-xslt/PF08_2.html index cca0b7cef..6b72c66cc 100644 --- a/src/test/resources/kbv-xslt/PF08_2.html +++ b/src/test/resources/kbv-xslt/PF08_2.html @@ -95,14 +95,14 @@ padding: 0; } } - </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">IKK classic/BVG</td><td colspan="1" class="daten" style="text-align:right;">83</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Werner</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Viktor Frhr. Gr in't</td><td class="daten" style="text-align:right; ">23.05.1974</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Hauptstraße 123456789<br/>D 14469 Potsdam</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten"/><td style="border-left:1px solid black;" class="daten">W230574661</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">06</span><span class="thin-space"> </span><span class="daten">04</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">29.12.2021</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☒</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> + </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">IKK classic/BVG</td><td colspan="1" class="daten" style="text-align:right;">83</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Werner</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Viktor Frhr. Gr in't</td><td class="daten" style="text-align:right; ">23.05.1974</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Hauptstraße 123456789<br/>D 14469 Potsdam</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten">103500693</td><td style="border-left:1px solid black;" class="daten">W230574661</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">06</span><span class="thin-space"> </span><span class="daten">04</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">16.02.2024</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☒</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> Tel: 0211 / 1111111<br/> Fax: 0211 / 2222222<br/> E-Mail: AM@Testpraxis.de<br/>Dr. Annie More<br/>Fachärztin für Allgemeinmedizin<br/>838382201<br/><div class="in-black" style=" width:100%; text-align: center; size:-2;">Angaben Praxis / verordnende Person</div></div></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td><table><tbody><tr><td><fieldset><legend align="right" class="in-black">PZN-Verordnung</legend><p class="daten">Mehrfachverordnung - 2<text> von </text>3<text>: Einlösbar</text><text> ab </text>14.03.2022<text> bis </text>27.06.2022</p><p class="daten" style="max-width: 50em;">1<text>x </text>HerzASS-ratiopharm® 50mg 100 Tbl.<text> </text>TAB<text> </text>N3<text> </text><text>(PZN: </text>04562798<text>)</text></p><p class="daten" style="max-width: 50em;"><text>Dosieranweisung / Medikationsplan mitgegeben</text></p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  - <span class="footer">1.0.2</span><br/> + 2<text> von </text>3<text>: Einlösbar</text><text> ab </text>01.05.2024<text> bis </text>14.08.2024</p><p class="daten" style="max-width: 50em;">1<text>x </text>HerzASS-ratiopharm® 50mg 100 Tbl.<text> </text>TAB<text> </text>N3<text> </text><text>(PZN: </text>04562798<text>)</text></p><p class="daten" style="max-width: 50em;"><text>Dosieranweisung / Medikationsplan mitgegeben</text></p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  + <span class="footer">1.1.0</span><br/> Dokumententyp:  e16A</span></td><td><span class="footer">PRF.NR.:  Y/400/1904/36/112<br/> DOK.ID:  - 160.854.473.710.350.33</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file + 160.391.207.792.716.52</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file diff --git a/src/test/resources/kbv-xslt/PF08_3.html b/src/test/resources/kbv-xslt/PF08_3.html index 8cdb51ebd..38b5efc3e 100644 --- a/src/test/resources/kbv-xslt/PF08_3.html +++ b/src/test/resources/kbv-xslt/PF08_3.html @@ -95,14 +95,14 @@ padding: 0; } } - </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">IKK classic/BVG</td><td colspan="1" class="daten" style="text-align:right;">83</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Werner</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Viktor Frhr. Gr in't</td><td class="daten" style="text-align:right; ">23.05.1974</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Hauptstraße 123456789<br/>D 14469 Potsdam</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten"/><td style="border-left:1px solid black;" class="daten">W230574661</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">06</span><span class="thin-space"> </span><span class="daten">04</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">29.12.2021</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☒</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> + </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">IKK classic/BVG</td><td colspan="1" class="daten" style="text-align:right;">83</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Werner</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Viktor Frhr. Gr in't</td><td class="daten" style="text-align:right; ">23.05.1974</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Hauptstraße 123456789<br/>D 14469 Potsdam</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten">103500693</td><td style="border-left:1px solid black;" class="daten">W230574661</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">1</span><span class="thin-space"> </span><span class="daten">06</span><span class="thin-space"> </span><span class="daten">04</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">16.02.2024</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☒</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> Tel: 0211 / 1111111<br/> Fax: 0211 / 2222222<br/> E-Mail: AM@Testpraxis.de<br/>Dr. Annie More<br/>Fachärztin für Allgemeinmedizin<br/>838382201<br/><div class="in-black" style=" width:100%; text-align: center; size:-2;">Angaben Praxis / verordnende Person</div></div></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td><table><tbody><tr><td><fieldset><legend align="right" class="in-black">PZN-Verordnung</legend><p class="daten">Mehrfachverordnung - 3<text> von </text>3<text>: Einlösbar</text><text> ab </text>13.05.2022</p><p class="daten" style="max-width: 50em;">1<text>x </text>HerzASS-ratiopharm® 50mg 100 Tbl.<text> </text>TAB<text> </text>N3<text> </text><text>(PZN: </text>04562798<text>)</text></p><p class="daten" style="max-width: 50em;"><text>Dosieranweisung / Medikationsplan mitgegeben</text></p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  - <span class="footer">1.0.2</span><br/> + 3<text> von </text>3<text>: Einlösbar</text><text> ab </text>30.06.2024</p><p class="daten" style="max-width: 50em;">1<text>x </text>HerzASS-ratiopharm® 50mg 100 Tbl.<text> </text>TAB<text> </text>N3<text> </text><text>(PZN: </text>04562798<text>)</text></p><p class="daten" style="max-width: 50em;"><text>Dosieranweisung / Medikationsplan mitgegeben</text></p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  + <span class="footer">1.1.0</span><br/> Dokumententyp:  e16A</span></td><td><span class="footer">PRF.NR.:  Y/400/1904/36/112<br/> DOK.ID:  - 160.936.177.564.950.93</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file + 160.701.411.142.873.49</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file diff --git a/src/test/resources/kbv-xslt/PF09.html b/src/test/resources/kbv-xslt/PF09.html index d66986d22..a222d2640 100644 --- a/src/test/resources/kbv-xslt/PF09.html +++ b/src/test/resources/kbv-xslt/PF09.html @@ -95,13 +95,13 @@ padding: 0; } } - </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">AOK Bayern Die Gesundh.</td><td colspan="1" class="daten" style="text-align:right;">72</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Schimmelpfennig-Hammerschmidt Federmannssohn</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Dr. Ingrid Erbprinzessin von und zu der</td><td class="daten" style="text-align:right; ">31.01.2010</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Anneliese- und Georg-von-Groscurth-Plaetzchen 149-C<br/>D 60437 Bad Homburg</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten"/><td style="border-left:1px solid black;" class="daten">M310119802</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">3</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">06</span><span class="thin-space"> </span><span class="daten">01</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">001234566</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">29.12.2021</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>001234566<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> + </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">AOK Bayern Die Gesundh.</td><td colspan="1" class="daten" style="text-align:right;">72</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Schimmelpfennig-Hammerschmidt Federmannssohn</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Dr. Ingrid Erbprinzessin von und zu der</td><td class="daten" style="text-align:right; ">31.01.2010</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Anneliese- und Georg-von-Groscurth-Plaetzchen 149-C<br/>D 60437 Bad Homburg</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten">108416214</td><td style="border-left:1px solid black;" class="daten">M310119802</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">3</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">06</span><span class="thin-space"> </span><span class="daten">01</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">001234566</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">16.02.2024</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>001234566<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> Tel: 0211 / 1111111<br/> Fax: 0211 / 2222222<br/> E-Mail: AM@Testpraxis.de<br/>Dr. Annie More<br/>Fachärztin für Allgemeinmedizin<br/>838382201<br/><div class="in-black" style=" width:100%; text-align: center; size:-2;">Angaben Praxis / verordnende Person</div></div></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td><table><tbody><tr><td><fieldset><legend align="right" class="in-black">PZN-Verordnung</legend><p class="daten" style="max-width: 50em;">1<text>x </text>CAPVAL® Saft 25 mg/5 g, 100ml Suspension<text> </text>SUE<text> </text>N1<text> </text><text>(PZN: </text>01672693<text>)</text></p><p class="daten" style="max-width: 50em;"><text>Dosierung: </text>3x täglich 5ml</p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  - <span class="footer">1.0.2</span><br/> + <span class="footer">1.1.0</span><br/> Dokumententyp:  e16A</span></td><td><span class="footer">PRF.NR.:  Y/400/1904/36/112<br/> DOK.ID:  - 160.201.986.349.190.71</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file + 160.456.796.625.586.77</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file diff --git a/src/test/resources/kbv-xslt/PF10.html b/src/test/resources/kbv-xslt/PF10.html index 2dbcea42e..d86587c5a 100644 --- a/src/test/resources/kbv-xslt/PF10.html +++ b/src/test/resources/kbv-xslt/PF10.html @@ -95,13 +95,13 @@ padding: 0; } } - </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">AOK Bayern Die Gesundh.</td><td colspan="1" class="daten" style="text-align:right;">72</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Schimmelpfennig-Hammerschmidt Federmannssohn</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Dr. Ingrid Erbprinzessin von und zu der</td><td class="daten" style="text-align:right; ">31.01.2010</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Anneliese- und Georg-von-Groscurth-Plaetzchen 149-C<br/>D 60437 Bad Homburg</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten"/><td style="border-left:1px solid black;" class="daten">M310119802</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">3</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">06</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">29.12.2021</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> + </style></head><body><div id="gesamtrahmen"><div id="kaestchen_bereich_links"><ul class="mittig"><li class="tiny">Gebühr<br/>frei</li><li class="kaestchen">☐</li><li class="tiny">Geb.-<br/>pfl.</li><li class="kaestchen">☐</li><li class="tiny"><br/>noctu</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">Unfall</li><li class="kaestchen">☐</li><li class="tiny">Arbeits-<br/>unfall</li><li class="kaestchen">☐</li><li class="tiny">Berufs-<br/>krankheit</li><li class="kaestchen abstand_unten">☐</li><li class="tiny">aut<br/>idem</li><li class="kaestchen">☐</li></ul></div><table><tbody><tr><td><table cellspacing="10"><colgroup><col style="width:27em"/><col style="width:20em"/></colgroup><tbody><tr><td valign="top"><table style="width: 27em; border-spacing:0; cellspacing:0; border-collapse:collapse; "><colgroup><col style="width:27em"/></colgroup><tbody><tr><td><table style=" border: 1px solid black; width:27em; border-spacing: 0; cellspacing: 0; border-collapse: collapse; background-color:white; "><tbody><tr><td><table style="border-bottom:1px solid black; border-collapse: collapse; width: 27em; height: 2em; border-spacing: 0; cellspacing: 0; table-layout:fixed "><colgroup><col style="width:9em"/><col style="width:9em"/><col style="width:9em"/></colgroup><tbody><tr><td colspan="3" class="in-black">Krankenkasse bzw. Kostenträger</td></tr><tr><td colspan="2" class="daten nowrap">AOK Bayern Die Gesundh.</td><td colspan="1" class="daten" style="text-align:right;">72</td></tr></tbody></table></td></tr><tr><td><table style=" border-collapse: collapse; border-spacing: 0; cellspacing: 0; width: 27em; table-layout:fixed "><colgroup><col style="width:7em; "/><col style="width:13em; "/><col style="width:7em; "/></colgroup><tbody><tr><td class="in-black" colspan="3">Name, Vorname des Versicherten</td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Schimmelpfennig-Hammerschmidt Federmannssohn</td><td class="in-black mittig"><div>geb. am</div></td></tr><tr><td colspan="2" width="100%" class="nowrap daten overflow">Dr. Ingrid Erbprinzessin von und zu der</td><td class="daten" style="text-align:right; ">31.01.2010</td></tr><tr><td colspan="3" style="border-bottom:1px solid black; width: 100%" class="nowrap daten overflow">Anneliese- und Georg-von-Groscurth-Plaetzchen 149-C<br/>D 60437 Bad Homburg</td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; border-bottom:1px solid black; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed"><colgroup><col style="width:9em;"/><col style="width:10em;"/><col style="width:8em;"/></colgroup><tbody><tr><td class="in-black">Kostenträgerkennung</td><td class="in-black">Versicherten-Nr.</td><td class="in-black">Status </td></tr><tr><td class="nowrap daten">108416214</td><td style="border-left:1px solid black;" class="daten">M310119802</td><td style=" border-left:1px solid black;" class="nowrap"><span class="daten">3</span><span class="thin-space"> </span><span class="daten">00</span><span class="thin-space"> </span><span class="daten">06</span><span class="thin-space"> </span><span class="daten">00</span></td></tr></tbody></table></td></tr><tr><td><table style="border-collapse: collapse; width: 27em; border-spacing: 0; cellspacing: 0; height: 2em; table-layout:fixed "><colgroup><col style="width: 9em"/><col style="width: 9em"/><col style="width: 9em"/></colgroup><tbody><tr><td class="in-black">Betriebsstätten-Nr.</td><td class="in-black">Arzt-Nr.</td><td class="in-black">Datum</td></tr><tr><td class="daten">241234601</td><td style="border-left:1px solid black;" class="daten">838382201</td><td style="border-left:1px solid black;" class="daten">16.02.2024</td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></td><td valign="top"><table style="width:19.4em; table-layout:fixed"><tbody><tr><td><table cellpadding="0" cellspacing="0"><tbody><tr class="mittig"><td><ul><li class="tiny"><br/>BVG</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Impf-<br/>stoff</li><li class="kaestchen">☐</li></ul></td><td><ul><li class="tiny">Spr.St.-<br/>Bedarf</li><li class="kaestchen">☐</li></ul></td></tr></tbody></table></td></tr><tr><td><div style="background-color:white; width:20em; border:1px solid black;" class="daten overflow breakword">Praxis Annie More<br/>241234601<br/>Musterstr. 1<br/>40474 Düsseldorf<br/> Tel: 0211 / 1111111<br/> Fax: 0211 / 2222222<br/> E-Mail: AM@Testpraxis.de<br/>Dr. Annie More<br/>Fachärztin für Allgemeinmedizin<br/>838382201<br/><div class="in-black" style=" width:100%; text-align: center; size:-2;">Angaben Praxis / verordnende Person</div></div></td></tr></tbody></table></td></tr></tbody></table></td></tr><tr><td><table><tbody><tr><td><fieldset><legend align="right" class="in-black">Wirkstoff-Verordnung</legend><p class="daten" style="max-width: 50em;">1<text>x </text>Ibuprofen<text> </text>600<text> </text>mg<text> </text><text>(ASK-Nr: </text>5682<text>) </text>Tabletten<text> </text>Stück<text> </text></p><p class="daten" style="max-width: 50em;"><text>Dosierung: </text>1-0-1-0</p></fieldset></td></tr><tr><td class="abstand_links in-black">Unfallinformationen</td></tr><tr><td class="abstand_links in-black"><table style="border-collapse: collapse; width: 100%; "><colgroup><col style="width:14%"/><col style="width:45%"/><col style="witdh:21%"/><col style="width:20%"/></colgroup><tbody><tr><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfalltag</td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Unfallbetrieb oder Arbeitgebernummer</td><td> </td><td class="in-black" style="border-left:1px solid black; border-top:1px solid black; border-right:1px solid black;">Kostenträgertyp</td></tr><tr><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;"> </td><td> </td><td class="daten nowrap" style="border-left:1px solid black; border-bottom:1px solid black; border-right:1px solid black;">GKV</td></tr></tbody></table></td></tr><tr><td class="abstand_links"><table style=" width:42em; table-layout:fixed"><colgroup><col style="width:28em"/><col style="width:14em"/></colgroup><tbody><tr><td><span class="footer">Dokumentenversion:  - <span class="footer">1.0.2</span><br/> + <span class="footer">1.1.0</span><br/> Dokumententyp:  e16A</span></td><td><span class="footer">PRF.NR.:  Y/400/1904/36/112<br/> DOK.ID:  - 160.269.918.636.580.04</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file + 160.776.706.787.543.02</span></td></tr></tbody></table></td></tr></tbody></table></td></tr></tbody></table></div></body></html> \ No newline at end of file diff --git a/src/test/resources/kbv-zip/Dokumentation/PF01.pdf b/src/test/resources/kbv-zip/Dokumentation/PF01.pdf index 12492cb1f..4f8969215 100644 Binary files a/src/test/resources/kbv-zip/Dokumentation/PF01.pdf and b/src/test/resources/kbv-zip/Dokumentation/PF01.pdf differ diff --git a/src/test/resources/kbv-zip/Dokumentation/PF02.pdf b/src/test/resources/kbv-zip/Dokumentation/PF02.pdf index d1dfd2b0b..0ab389153 100644 Binary files a/src/test/resources/kbv-zip/Dokumentation/PF02.pdf and b/src/test/resources/kbv-zip/Dokumentation/PF02.pdf differ diff --git a/src/test/resources/kbv-zip/Dokumentation/PF06.pdf b/src/test/resources/kbv-zip/Dokumentation/PF06.pdf index f8fdf972e..3769414b2 100644 Binary files a/src/test/resources/kbv-zip/Dokumentation/PF06.pdf and b/src/test/resources/kbv-zip/Dokumentation/PF06.pdf differ diff --git a/src/test/resources/kbv-zip/Dokumentation/PF08.pdf b/src/test/resources/kbv-zip/Dokumentation/PF08.pdf index 84ecb6f26..4ef04b175 100644 Binary files a/src/test/resources/kbv-zip/Dokumentation/PF08.pdf and b/src/test/resources/kbv-zip/Dokumentation/PF08.pdf differ diff --git a/src/test/resources/kbv-zip/Dokumentation/PF10.pdf b/src/test/resources/kbv-zip/Dokumentation/PF10.pdf index 7610574a2..7f9e38eac 100644 Binary files a/src/test/resources/kbv-zip/Dokumentation/PF10.pdf and b/src/test/resources/kbv-zip/Dokumentation/PF10.pdf differ diff --git a/src/test/resources/kbv-zip/PF01.xml b/src/test/resources/kbv-zip/PF01.xml index fe859989e..ea9506245 100644 --- a/src/test/resources/kbv-zip/PF01.xml +++ b/src/test/resources/kbv-zip/PF01.xml @@ -1 +1 @@ -<Bundle xmlns="http://hl7.org/fhir"><id value="a69a6bbf-499d-4c39-97a8-3f1e78823e59"></id><meta><lastUpdated value="2021-12-29T21:29:18.282+01:00"></lastUpdated><profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.0.2"></profile></meta><identifier><system value="https://gematik.de/fhir/NamingSystem/PrescriptionID"></system><value value="160.284.601.592.471.73"></value></identifier><type value="document"></type><timestamp value="2021-12-29T21:29:18.282+01:00"></timestamp><entry><fullUrl value="http://pvs.praxis.local/fhir/Composition/2d350cd3-7500-4c20-8dcf-9c5e9b2b0c4e"></fullUrl><resource><Composition><id value="2d350cd3-7500-4c20-8dcf-9c5e9b2b0c4e"></id><meta><profile value="https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.0.2"></profile></meta><extension url="https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis"><valueCoding><system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN"></system><code value="00"></code></valueCoding></extension><status value="final"></status><type><coding><system value="https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART"></system><code value="e16A"></code></coding></type><subject><reference value="Patient/38dc38e0-bae7-4fc5-8555-a473ab226d4e"></reference></subject><date value="2021-12-29T21:29:18+01:00"></date><author><reference value="Practitioner/e00c7c0c-c040-4024-8457-4a63cbe1c14a"></reference><type value="Practitioner"></type></author><author><type value="Device"></type><identifier><system value="https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer"></system><value value="Y/400/1904/36/112"></value></identifier></author><title value="elektronische Arzneimittelverordnung">
\ No newline at end of file +
\ No newline at end of file diff --git a/src/test/resources/kbv-zip/PF02.xml b/src/test/resources/kbv-zip/PF02.xml index 8c35070a8..2d23f7268 100644 --- a/src/test/resources/kbv-zip/PF02.xml +++ b/src/test/resources/kbv-zip/PF02.xml @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/src/test/resources/kbv-zip/PF03.xml b/src/test/resources/kbv-zip/PF03.xml index 7ec92eabf..64decc5bf 100644 --- a/src/test/resources/kbv-zip/PF03.xml +++ b/src/test/resources/kbv-zip/PF03.xml @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/src/test/resources/kbv-zip/PF07.xml b/src/test/resources/kbv-zip/PF07.xml index 37b8856ba..f4aa58a71 100644 --- a/src/test/resources/kbv-zip/PF07.xml +++ b/src/test/resources/kbv-zip/PF07.xml @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/src/test/resources/kbv-zip/PF08_1.xml b/src/test/resources/kbv-zip/PF08_1.xml index 4cc627950..61244d362 100644 --- a/src/test/resources/kbv-zip/PF08_1.xml +++ b/src/test/resources/kbv-zip/PF08_1.xml @@ -1,22 +1,22 @@ - + - - + + - - + + - + - + - + - + @@ -32,9 +32,9 @@ - + - + @@ -58,7 +58,7 @@
- +
@@ -69,19 +69,19 @@ - +
- + - + - + @@ -90,7 +90,7 @@ - + @@ -132,12 +132,12 @@ - + - + - + @@ -168,12 +168,12 @@ - + - + - + @@ -203,25 +203,25 @@ - - + + - + - + - + - + @@ -338,12 +338,12 @@ - + - + - + @@ -377,14 +377,14 @@ - + - + diff --git a/src/test/resources/kbv-zip/PF08_2.xml b/src/test/resources/kbv-zip/PF08_2.xml index b43267792..817a47403 100644 --- a/src/test/resources/kbv-zip/PF08_2.xml +++ b/src/test/resources/kbv-zip/PF08_2.xml @@ -1,22 +1,22 @@ - + - - + + - - + + - + - + - + - + @@ -32,9 +32,9 @@ - + - + @@ -58,7 +58,7 @@ - +
@@ -69,19 +69,19 @@ - +
- + - + - + @@ -90,7 +90,7 @@ - + @@ -132,12 +132,12 @@ - + - + - + @@ -168,12 +168,12 @@ - + - + - + @@ -203,25 +203,25 @@ - - + + - + - + - + - + @@ -338,12 +338,12 @@ - + - + - + @@ -377,14 +377,14 @@ - + - + diff --git a/src/test/resources/kbv-zip/PF08_3.xml b/src/test/resources/kbv-zip/PF08_3.xml index d15ac768c..62c302dc2 100644 --- a/src/test/resources/kbv-zip/PF08_3.xml +++ b/src/test/resources/kbv-zip/PF08_3.xml @@ -1,22 +1,22 @@ - + - - + + - - + + - + - + - + - + @@ -32,9 +32,9 @@ - + - + @@ -58,7 +58,7 @@ - +
@@ -69,19 +69,19 @@ - +
- + - + - + @@ -90,7 +90,7 @@ - + @@ -132,12 +132,12 @@ - + - + - + @@ -168,12 +168,12 @@ - + - + - + @@ -203,24 +203,24 @@ - + - + - + - + - + @@ -337,12 +337,12 @@ - + - + - + @@ -376,14 +376,14 @@ - + - + diff --git a/src/test/resources/kbv-zip/PF09.xml b/src/test/resources/kbv-zip/PF09.xml index 5a095de2d..8b8ecea1b 100644 --- a/src/test/resources/kbv-zip/PF09.xml +++ b/src/test/resources/kbv-zip/PF09.xml @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/src/test/resources/kbv-zip/PF10.xml b/src/test/resources/kbv-zip/PF10.xml index e0d7efb52..748fc0d09 100644 --- a/src/test/resources/kbv-zip/PF10.xml +++ b/src/test/resources/kbv-zip/PF10.xml @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/src/test/resources/secret/.gitkeep b/src/test/resources/secret/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/test/resources/secret/bundles-multiples-v1-1-0/.gitkeep b/src/test/resources/secret/bundles-multiples-v1-1-0/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/test/resources/secret/bundles-v1-1-0/.gitkeep b/src/test/resources/secret/bundles-v1-1-0/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/test/resources/simplifier_erezept/0428d416-149e-48a4-977c-394887b3d85c.xml b/src/test/resources/simplifier_erezept/0428d416-149e-48a4-977c-394887b3d85c.xml index cd94d4e3e..a36949ebe 100644 --- a/src/test/resources/simplifier_erezept/0428d416-149e-48a4-977c-394887b3d85c.xml +++ b/src/test/resources/simplifier_erezept/0428d416-149e-48a4-977c-394887b3d85c.xml @@ -111,7 +111,7 @@ - + diff --git a/src/test/resources/websocket-messages/ActivateComfortSignature-2-Response.json b/src/test/resources/websocket-messages/ActivateComfortSignature-2-Response.json index 693cbb321..9757d58a5 100644 --- a/src/test/resources/websocket-messages/ActivateComfortSignature-2-Response.json +++ b/src/test/resources/websocket-messages/ActivateComfortSignature-2-Response.json @@ -1,15 +1,11 @@ -{"type": "GetSignatureModeResponse", "payload": +{"type": "GetSignatureModeResponse", "payload": { + "answertToActivateComfortSignature": true, "comfortSignatureMax": 250, "comfortSignatureStatus": "ENABLED", - "comfortSignatureTimer": "P1DT0H0M0S", - "sessionInfo": { - "countRemaining": 250, - "signatureMode": "COMFORT", - "timeRemaining": "PT23H59M59S" - }, + "comfortSignatureTimer": "PT0H0M0S", "status": { "result": "OK" }, - "userId": "6df2dbaa-0c5a-464b-81af-9231faca9c65" -}, "replyToMessageId": "6373b833-c797-42b3-af15-43a427e76919"} + "userId": "986f972d-49f2-43f3-84ea-dcc25f5509a0" +}, "replyToMessageId": "cecf004a-a212-4f3a-85a4-098580bee3bc"} diff --git a/src/test/resources/websocket-messages/ActivateComfortSignature-2.json b/src/test/resources/websocket-messages/ActivateComfortSignature-2-just-mono-HBA.json similarity index 100% rename from src/test/resources/websocket-messages/ActivateComfortSignature-2.json rename to src/test/resources/websocket-messages/ActivateComfortSignature-2-just-mono-HBA.json diff --git a/src/test/resources/websocket-messages/ActivateComfortSignature-just-mono-HBA.json b/src/test/resources/websocket-messages/ActivateComfortSignature-just-mono-HBA.json new file mode 100644 index 000000000..d990980ac --- /dev/null +++ b/src/test/resources/websocket-messages/ActivateComfortSignature-just-mono-HBA.json @@ -0,0 +1,3 @@ +{ + "type": "ActivateComfortSignature" +} \ No newline at end of file diff --git a/src/test/resources/websocket-messages/ActivateComfortSignature.json b/src/test/resources/websocket-messages/ActivateComfortSignature.json deleted file mode 100644 index cfa7085e4..000000000 --- a/src/test/resources/websocket-messages/ActivateComfortSignature.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "ActivateComfortSignature" -} \ No newline at end of file diff --git a/src/test/resources/websocket-messages/ERezeptDocuments.json b/src/test/resources/websocket-messages/ERezeptDocuments.json index c83fb6fa1..506440a5f 100644 --- a/src/test/resources/websocket-messages/ERezeptDocuments.json +++ b/src/test/resources/websocket-messages/ERezeptDocuments.json @@ -1,5 +1,4 @@ -{"type": "ERezeptWithDocuments", "payload": -[ +{"type": "ERezeptWithDocuments", "payload": [ { "bundleWithAccessCodeOrThrowables": [ { diff --git a/src/test/resources/websocket-messages/GetCards-With-RuntimeConfig.json b/src/test/resources/websocket-messages/GetCards-With-RuntimeConfig.json index e75e5f1d4..f8a92cd5a 100644 --- a/src/test/resources/websocket-messages/GetCards-With-RuntimeConfig.json +++ b/src/test/resources/websocket-messages/GetCards-With-RuntimeConfig.json @@ -6,8 +6,8 @@ "connector.client-certificate": "data:application/x-pkcs12;base64,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", "connector.client-certificate-password": "00", "connector.client-system-id": "Incentergy", - "connector.mandant-id": "1786_A1", + "connector.mandant-id": "Incentergy", "connector.version": "PTV4+", - "connector.workplace-id": "Incentergy" + "connector.workplace-id": "1786_A1" } } \ No newline at end of file diff --git a/src/test/resources/websocket-messages/GetPinStatus-2.json b/src/test/resources/websocket-messages/GetPinStatus-2.json new file mode 100644 index 000000000..ae99647d4 --- /dev/null +++ b/src/test/resources/websocket-messages/GetPinStatus-2.json @@ -0,0 +1 @@ +{"type":"GetPinStatus","payload":{"cardHandle":"HBA-180126","pinType":"PIN.QES"},"id":"855e49f8-315c-4ff5-bab3-2cfd05c5d8f0"} diff --git a/src/test/resources/websocket-messages/GetPinStatusResponse-2.json b/src/test/resources/websocket-messages/GetPinStatusResponse-2.json new file mode 100644 index 000000000..642998e0a --- /dev/null +++ b/src/test/resources/websocket-messages/GetPinStatusResponse-2.json @@ -0,0 +1,11 @@ +{ + "payload": { + "leftTries": 3, + "pinStatusEnum": "VERIFIABLE", + "status": { + "result": "OK" + } + }, + "replyToMessageId": "855e49f8-315c-4ff5-bab3-2cfd05c5d8f0", + "type": "GetPinStatusResponse" +} diff --git a/src/test/resources/websocket-messages/GetSignatureMode-Full.json b/src/test/resources/websocket-messages/GetSignatureMode-Full.json new file mode 100644 index 000000000..b5ca2bc47 --- /dev/null +++ b/src/test/resources/websocket-messages/GetSignatureMode-Full.json @@ -0,0 +1,11 @@ +{ + "type": "GetSignatureMode", + "id": "2da86eb7-57a3-4df2-83d3-5f9715e8ae09", + "runtimeConfig": { + "eHBAHandle": "HBA-46", + "connector.user-id": "1bb01080-c0ad-4ed3-816f-76a4cdf823ce", + "connector.client-system-id": "Incentergy", + "connector.mandant-id": "Incentergy", + "connector.workplace-id": "1786_A1" + } +} \ No newline at end of file diff --git a/src/test/resources/websocket-messages/GetSignatureModeResponse-Full.json b/src/test/resources/websocket-messages/GetSignatureModeResponse-Full.json new file mode 100644 index 000000000..97bbace4f --- /dev/null +++ b/src/test/resources/websocket-messages/GetSignatureModeResponse-Full.json @@ -0,0 +1,16 @@ +{"type": "GetSignatureModeResponse", "payload": +{ + "answertToActivateComfortSignature": false, + "comfortSignatureMax": 250, + "comfortSignatureStatus": "ENABLED", + "comfortSignatureTimer": "PT0H0M0S", + "sessionInfo": { + "countRemaining": 250, + "signatureMode": "COMFORT", + "timeRemaining": "PT23H49M9S" + }, + "status": { + "result": "OK" + }, + "userId": "1bb01080-c0ad-4ed3-816f-76a4cdf823ce" +}, "replyToMessageId": "2da86eb7-57a3-4df2-83d3-5f9715e8ae09"} \ No newline at end of file diff --git a/src/test/resources/websocket-messages/GetSignatureModeResponse.json b/src/test/resources/websocket-messages/GetSignatureModeResponse.json index 0c4969db9..4f5fe08cc 100644 --- a/src/test/resources/websocket-messages/GetSignatureModeResponse.json +++ b/src/test/resources/websocket-messages/GetSignatureModeResponse.json @@ -1,16 +1,10 @@ +{"type": "GetSignatureModeResponse", "payload": { - "type": "GetSignatureModeResponse", - "payload": { - "comfortSignatureMax": 100, - "comfortSignatureStatus": "ENABLED", - "comfortSignatureTimer": "P0Y0M0DT6H0M0.000S", - "sessionInfo": { - "countRemaining": 100, - "signatureMode": "COMFORT", - "timeRemaining": "P0Y0M0DT0H0M0.000S" - }, - "status": { - "result": "OK" - } + "answertToActivateComfortSignature": false, + "comfortSignatureMax": 250, + "comfortSignatureStatus": "ENABLED", + "comfortSignatureTimer": "PT0H0M0S", + "status": { + "result": "OK" } -} \ No newline at end of file +}, "replyToMessageId": "47785a57-eac6-4bac-be9a-5e18a334b752"} \ No newline at end of file diff --git a/src/test/resources/websocket-messages/PreviewOnly.json b/src/test/resources/websocket-messages/PreviewOnly.json new file mode 100644 index 000000000..2ce861363 --- /dev/null +++ b/src/test/resources/websocket-messages/PreviewOnly.json @@ -0,0 +1,19 @@ +{ + "type": "PreviewOnly", + "id": "db56971d-d70f-402d-80c9-aff03d7ed098", + "runtimeConfig": { + "eHBAHandle": "HBA-791", + "SMCBHandle": "SMC-B-793", + "connector.user-id": "fee7a1c1-6f05-4599-8b29-2fc9c010a149", + "connector.base-url": "https://192.168.178.42:443", + "connector.client-certificate": "file:/foo.p12", + "connector.client-certificate-password": "foo", + "connector.client-system-id": "Incentergy", + "connector.mandant-id": "Incentergy", + "connector.workplace-id": "1786_A1", + "connector.version": "PTV5", + "connector.basic-auth-username": null, + "connector.basic-auth-password": null + }, + "payload": [[{"resourceType": "Bundle", "meta": {"lastUpdated": "2024-04-11T09:00:51.069+02:00", "profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.1.0"]}, "identifier": {"value": "160.000.226.246.766.90", "system": "https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId"}, "entry": [{"fullUrl": "http://pvs.praxis.local/fhir/Composition/a447fcbc-1887-4e8e-ba9a-9d8776b2e3c1", "resource": {"id": "a447fcbc-1887-4e8e-ba9a-9d8776b2e3c1", "extension": [{"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis", "valueCoding": {"code": "00", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN"}}], "subject": {"reference": "Patient/748fa1c0-f9d1-4c4a-b353-a4c88eb15a56"}, "section": [{"entry": [{"reference": "MedicationRequest/ff33c3f9-901c-4fc7-9685-d7190f8539b1"}], "code": {"coding": [{"code": "Prescription", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type"}]}}, {"entry": [{"reference": "Coverage/e14f0778-3cbf-4b29-8c27-f7f1c6d2ce73"}], "code": {"coding": [{"code": "Coverage", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type"}]}}], "custodian": {"reference": "Organization/1292cb21-6d6d-4765-aebb-3650e9ab3bd8"}, "resourceType": "Composition", "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.1.0"]}, "author": [{"reference": "Practitioner/de0b8a88-8af6-4602-b008-5d94d327b00c", "type": "Practitioner"}, {"type": "Device", "identifier": {"value": "Y/400/1904/36/112", "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer"}}], "title": "elektronische Arzneimittelverordnung", "status": "final", "type": {"coding": [{"code": "e16A", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART"}]}, "date": "2024-04-11T09:00:51+02:00"}}, {"fullUrl": "http://pvs.praxis.local/fhir/Patient/748fa1c0-f9d1-4c4a-b353-a4c88eb15a56", "resource": {"resourceType": "Patient", "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.1.0"]}, "address": [{"country": "D", "line": ["Bramfelder Str. 140"], "_line": [{"extension": [{"url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber", "valueString": "140"}, {"url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", "valueString": "Bramfelder Str."}]}], "postalCode": "22305", "type": "both", "city": "Hamburg"}], "name": [{"family": "TK-Mustermann", "use": "official", "given": ["Max"], "_family": {"extension": [{"url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", "valueString": "TK-Mustermann"}]}}], "birthDate": "1995-01-01", "identifier": [{"value": "X110423581", "type": {"coding": [{"code": "GKV", "system": "http://fhir.de/CodeSystem/identifier-type-de-basis"}]}, "system": "http://fhir.de/sid/gkv/kvid-10"}], "id": "748fa1c0-f9d1-4c4a-b353-a4c88eb15a56"}}, {"fullUrl": "http://pvs.praxis.local/fhir/Medication/a116cdf7-fc62-4bd6-9931-2fcfedc95433", "resource": {"resourceType": "Medication", "id": "a116cdf7-fc62-4bd6-9931-2fcfedc95433", "extension": [{"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category", "valueCoding": {"code": "00", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category"}}, {"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine", "valueBoolean": false}], "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_FreeText|1.1.0"]}, "code": {"coding": [{"code": "freitext", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Type"}], "text": "Test"}}}, {"fullUrl": "http://pvs.praxis.local/fhir/MedicationRequest/ff33c3f9-901c-4fc7-9685-d7190f8539b1", "resource": {"insurance": [{"reference": "Coverage/e14f0778-3cbf-4b29-8c27-f7f1c6d2ce73"}], "id": "ff33c3f9-901c-4fc7-9685-d7190f8539b1", "extension": [{"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_StatusCoPayment", "valueCoding": {"code": "0", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_StatusCoPayment"}}, {"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee", "valueBoolean": false}, {"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG", "valueBoolean": false}, {"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription", "extension": [{"url": "Kennzeichen", "valueBoolean": false}]}], "authoredOn": "2024-04-11", "subject": {"reference": "Patient/748fa1c0-f9d1-4c4a-b353-a4c88eb15a56"}, "dosageInstruction": [{"text": "Zu Testzwecken", "extension": [{"url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag", "valueBoolean": true}]}], "substitution": {"allowedBoolean": true}, "resourceType": "MedicationRequest", "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.1.0"]}, "dispenseRequest": {"quantity": {"value": 1, "code": "{Package}", "system": "http://unitsofmeasure.org"}}, "requester": {"reference": "Practitioner/de0b8a88-8af6-4602-b008-5d94d327b00c"}, "status": "active", "intent": "order", "medicationReference": {"reference": "Medication/a116cdf7-fc62-4bd6-9931-2fcfedc95433"}}}, {"fullUrl": "http://pvs.praxis.local/fhir/Practitioner/de0b8a88-8af6-4602-b008-5d94d327b00c", "resource": {"resourceType": "Practitioner", "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.1.0"]}, "qualification": [{"code": {"coding": [{"code": "00", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type"}]}}, {"code": {"coding": [{"code": "Berufsbezeichnung", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Berufsbezeichnung"}], "text": "Arzt"}}], "name": [{"family": "Bëírliner", "use": "official", "given": ["Maria"], "_family": {"extension": [{"url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", "valueString": "Bëírliner"}]}}], "identifier": [{"value": "999999999", "type": {"coding": [{"code": "LANR", "system": "http://terminology.hl7.org/CodeSystem/v2-0203"}]}, "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR"}], "id": "de0b8a88-8af6-4602-b008-5d94d327b00c"}}, {"fullUrl": "http://pvs.praxis.local/fhir/Organization/1292cb21-6d6d-4765-aebb-3650e9ab3bd8", "resource": {"resourceType": "Organization", "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.1.0"]}, "address": [{"country": "D", "line": ["Sulzfeldstraße 7"], "_line": [{"extension": [{"url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", "valueString": "Sulzfeldstraße"}, {"url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber", "valueString": "7"}]}], "postalCode": "93055", "type": "both", "city": "Regensburg"}], "name": "Praxis SigmuntowskíTEST-ONLY", "telecom": [{"value": "0123456789", "system": "phone"}], "identifier": [{"value": "999999999", "type": {"coding": [{"code": "BSNR", "system": "http://terminology.hl7.org/CodeSystem/v2-0203"}]}, "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR"}], "id": "1292cb21-6d6d-4765-aebb-3650e9ab3bd8"}}, {"fullUrl": "http://pvs.praxis.local/fhir/Coverage/e14f0778-3cbf-4b29-8c27-f7f1c6d2ce73", "resource": {"beneficiary": {"reference": "Patient/748fa1c0-f9d1-4c4a-b353-a4c88eb15a56"}, "resourceType": "Coverage", "id": "e14f0778-3cbf-4b29-8c27-f7f1c6d2ce73", "extension": [{"url": "http://fhir.de/StructureDefinition/gkv/besondere-personengruppe", "valueCoding": {"code": "00", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE"}}, {"url": "http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen", "valueCoding": {"code": "00", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP"}}, {"url": "http://fhir.de/StructureDefinition/gkv/versichertenart", "valueCoding": {"code": "1", "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS"}}], "payor": [{"display": "TK", "identifier": {"value": "109500969", "system": "http://fhir.de/sid/arge-ik/iknr"}}], "status": "active", "type": {"coding": [{"code": "GKV", "system": "http://fhir.de/CodeSystem/versicherungsart-de-basis"}]}, "meta": {"profile": ["https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.1.0"]}}}], "timestamp": "2024-04-11T09:00:51.069+02:00", "type": "document", "id": "a8ddf5c7-ce25-4e43-844d-3a58e4e4f069"}]] +} \ No newline at end of file diff --git a/src/test/resources/websocket-messages/README.md b/src/test/resources/websocket-messages/README.md index 8eb41898e..ddd6febb3 100644 --- a/src/test/resources/websocket-messages/README.md +++ b/src/test/resources/websocket-messages/README.md @@ -9,8 +9,7 @@ The following messages are currently supported: * Status messages are sent during the process: * HTMLBundles - This message contains the XSLT stylesheet of the KBV processed bundles that must be displayed to the user * BundlesValidationResult - If a bundle is invalid, this message will be sent with the appropriate validation error - * Exception - Exceptions that can occur during processing - messages and the Process is canceled + * Exception - Exceptions that can occur during processing messages and the Process is canceled * Response * ERezeptWithDocuments - Contains the signed bundles including AccessCode and PrescriptionID. Furthermore, the created PDF is encoded as base64 Document included * ValidateBundles - Validates the submitted bundles @@ -35,6 +34,37 @@ The following messages are currently supported: * UnblockPin - Unblocks a PIN * GetPinStatus - Get the status of a PIN + +# Runtime config + +To set a konnektor including the configuration it is possible to set values via runtime config + +``` +... +"runtimeConfig": { + "connector.base-url": "https://kon-instanz2.titus.gematik.solutions", + "connector.client-certificate": "data:application/x-pkcs12;base64,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", + "connector.client-certificate-password": "00", + "connector.client-system-id": "Incentergy", + "connector.mandant-id": "1786_A1", + "connector.version": "PTV4+", + "connector.workplace-id": "Incentergy" + } +... +``` + +e.g. https://github.com/ere-health/ere-ps-app/blob/main/src/test/resources/websocket-messages/GetCards-With-RuntimeConfig.json + +Further is is possible to read the client-certificate from the file system. To do so you have to specify: + +``` + ... + "connector.client-certificate": "file:src/test/resources/certs/keystore.p12?alias=key2" + ... +``` + +# pinType + pinType: Gibt an, für welche PIN der Karte die Blockierung aufgehoben werden soll. @@ -48,4 +78,4 @@ MRPIN.AMTS, PIN.AMTS_REP - zusätzlich eGK G2.0: MRPIN.DPE_READ - HBAx: PIN.CH, PIN.QES -- SM-B: PIN.SMC \ No newline at end of file +- SM-B: PIN.SMC diff --git a/src/test/resources/websocket-messages/RequestStatus.json b/src/test/resources/websocket-messages/RequestStatus.json index 4f43c143e..924da5e80 100644 --- a/src/test/resources/websocket-messages/RequestStatus.json +++ b/src/test/resources/websocket-messages/RequestStatus.json @@ -1 +1 @@ -{"type":"RequestStatus"} \ No newline at end of file +{"type":"RequestStatus","id":"833e07ad-dd5e-4af0-9540-d1400a92416f"} diff --git a/src/test/resources/websocket-messages/SignAndUploadBundles-With-RuntimeConfig-NoPreview.json b/src/test/resources/websocket-messages/SignAndUploadBundles-With-RuntimeConfig-NoPreview.json new file mode 100644 index 000000000..a1b430da6 --- /dev/null +++ b/src/test/resources/websocket-messages/SignAndUploadBundles-With-RuntimeConfig-NoPreview.json @@ -0,0 +1,534 @@ +{ + "type": "SignAndUploadBundles", + "payload": [ + [ + { + "resourceType": "Bundle", + "id": "0428d416-149e-48a4-977c-394887b3d85c", + "meta": { + "lastUpdated": "2021-04-06T08:30:00Z", + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.0.1" + ] + }, + "identifier": { + "system": "https://gematik.de/fhir/NamingSystem/PrescriptionID", + "value": "160.100.000.000.002.36" + }, + "type": "document", + "timestamp": "2021-04-06T08:30:00Z", + "entry": [ + { + "fullUrl": "http://pvs.praxis.local/fhir/Composition/a054c2f3-0123-4d33-a0b3-bedec2f7d1ea", + "resource": { + "resourceType": "Composition", + "id": "a054c2f3-0123-4d33-a0b3-bedec2f7d1ea", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.0.1" + ] + }, + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN", + "code": "00" + } + } + ], + "status": "final", + "type": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART", + "code": "e16A" + } + ] + }, + "subject": { + "reference": "Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6" + }, + "date": "2021-04-05T08:00:00Z", + "author": [ + { + "reference": "Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359", + "type": "Practitioner" + }, + { + "type": "Device", + "identifier": { + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer", + "value": "Y/410/2107/36/999" + } + } + ], + "title": "elektronische Arzneimittelverordnung", + "custodian": { + "reference": "Organization/d2b30a70-9830-4968-ab97-688472b6f9a3" + }, + "section": [ + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type", + "code": "Prescription" + } + ] + }, + "entry": [ + { + "reference": "MedicationRequest/06dc1594-509a-4f4c-ada7-dfd477a02d86" + } + ] + }, + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type", + "code": "Coverage" + } + ] + }, + "entry": [ + { + "reference": "Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4" + } + ] + } + ] + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/MedicationRequest/06dc1594-509a-4f4c-ada7-dfd477a02d86", + "resource": { + "resourceType": "MedicationRequest", + "id": "06dc1594-509a-4f4c-ada7-dfd477a02d86", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.0.1" + ] + }, + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_StatusCoPayment", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_StatusCoPayment", + "code": "1" + } + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee", + "valueBoolean": false + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG", + "valueBoolean": false + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription", + "extension": [ + { + "url": "Kennzeichen", + "valueBoolean": false + } + ] + } + ], + "status": "active", + "intent": "order", + "medicationReference": { + "reference": "Medication/f568397d-7ba2-46ac-904b-02caec933b42" + }, + "subject": { + "reference": "Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6" + }, + "authoredOn": "2020-04-06", + "requester": { + "reference": "Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359" + }, + "insurance": [ + { + "reference": "Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4" + } + ], + "dosageInstruction": [ + { + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag", + "valueBoolean": true + } + ], + "text": "2mal tägl. 5ml" + } + ], + "dispenseRequest": { + "quantity": { + "value": 1, + "system": "http://unitsofmeasure.org", + "code": "{Package}" + } + }, + "substitution": { + "allowedBoolean": true + } + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Medication/f568397d-7ba2-46ac-904b-02caec933b42", + "resource": { + "resourceType": "Medication", + "id": "f568397d-7ba2-46ac-904b-02caec933b42", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_PZN|1.0.1" + ] + }, + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category", + "code": "00" + } + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine", + "valueBoolean": false + }, + { + "url": "http://fhir.de/StructureDefinition/normgroesse", + "valueCode": "N1" + } + ], + "code": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/ifa/pzn", + "code": "08585997" + } + ], + "text": "Prospan® Hustensaft 100ml N1" + }, + "form": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DARREICHUNGSFORM", + "code": "FLE" + } + ] + } + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6", + "resource": { + "resourceType": "Patient", + "id": "512ab5bc-a7ab-4fd7-81cc-16a594f747a6", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.0.3" + ] + }, + "identifier": [ + { + "type": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/identifier-type-de-basis", + "code": "GKV" + } + ] + }, + "system": "http://fhir.de/NamingSystem/gkv/kvid-10", + "value": "M310119800" + } + ], + "name": [ + { + "use": "official", + "family": "Erbprinzessin", + "_family": { + "extension": [ + { + "url": "http://fhir.de/StructureDefinition/humanname-namenszusatz", + "valueString": "Erbprinzessin" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-prefix", + "valueString": "von und zu der" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", + "valueString": "Schimmelpfennig-Hammerschmidt Federmannssohn" + } + ] + }, + "given": [ + "Ingrid" + ] + } + ], + "birthDate": "2010-01-31", + "address": [ + { + "type": "both", + "line": [ + "Anneliese- und Georg-von-Groscurth-Plaetzchen 149-C", + "5. OG - Hinterhof" + ], + "_line": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber", + "valueString": "149-C" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", + "valueString": "Anneliese- und Georg-von-Groscurth-Plaetzchen" + } + ] + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator", + "valueString": "5. OG - Hinterhof" + } + ] + } + ], + "city": "Bad Homburg", + "postalCode": "60437", + "country": "D" + } + ] + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359", + "resource": { + "resourceType": "Practitioner", + "id": "e33d2afd-44c8-462b-80e5-52dbe5ebf359", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.0.3" + ] + }, + "identifier": [ + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "LANR" + } + ] + }, + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR", + "value": "456456534" + } + ], + "name": [ + { + "use": "official", + "family": "Weber", + "_family": { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", + "valueString": "Weber" + } + ] + }, + "given": [ + "Maximilian" + ], + "prefix": [ + "Dr." + ], + "_prefix": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier", + "valueCode": "AC" + } + ] + } + ] + } + ], + "qualification": [ + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type", + "code": "00" + } + ] + } + }, + { + "code": { + "text": "Facharzt für Kinder- und Jugendmedizin" + } + } + ] + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Organization/d2b30a70-9830-4968-ab97-688472b6f9a3", + "resource": { + "resourceType": "Organization", + "id": "d2b30a70-9830-4968-ab97-688472b6f9a3", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.0.3" + ] + }, + "identifier": [ + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "BSNR" + } + ] + }, + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR", + "value": "687777700" + } + ], + "name": "Kinderarztpraxis", + "telecom": [ + { + "system": "phone", + "value": "09411234567" + } + ], + "address": [ + { + "type": "both", + "line": [ + "Yorckstraße 15", + "Hinterhaus" + ], + "_line": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber", + "valueString": "15" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", + "valueString": "Yorckstraße" + } + ] + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator", + "valueString": "Hinterhaus" + } + ] + } + ], + "city": "Regensburg", + "postalCode": "93049", + "country": "D" + } + ] + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4", + "resource": { + "resourceType": "Coverage", + "id": "df0f2536-97b9-4bae-99cc-83ba2e8371e4", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.0.3" + ] + }, + "extension": [ + { + "url": "http://fhir.de/StructureDefinition/gkv/besondere-personengruppe", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE", + "code": "00" + } + }, + { + "url": "http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP", + "code": "00" + } + }, + { + "url": "http://fhir.de/StructureDefinition/gkv/wop", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP", + "code": "72" + } + }, + { + "url": "http://fhir.de/StructureDefinition/gkv/versichertenart", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS", + "code": "3" + } + } + ], + "status": "active", + "type": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/versicherungsart-de-basis", + "code": "GKV" + } + ] + }, + "beneficiary": { + "reference": "Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6" + }, + "period": { + "end": "2040-04-01" + }, + "payor": [ + { + "identifier": { + "system": "http://fhir.de/NamingSystem/arge-ik/iknr", + "value": "108416214" + }, + "display": "AOK Bayern" + } + ] + } + } + ] + } + ] + ], + "runtimeConfig": { + "eHBAHandle": "1-1-ARZT-WaltrautFinkengrund01", + "SMCBHandle": "1-2-ARZT-WaltrautDrombusch01", + "sendPreview": false, + "connector.base-url": "https://kon-instanz2.titus.gematik.solutions", + "connector.client-certificate": "data:application/x-pkcs12;base64,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", + "connector.client-certificate-password": "00", + "connector.client-system-id": "Incentergy", + "connector.mandant-id": "Incentergy", + "connector.version": "PTV4+", + "connector.workplace-id": "1786_A1" + } +} \ No newline at end of file diff --git a/src/test/resources/websocket-messages/SignAndUploadBundles-With-RuntimeConfig.json b/src/test/resources/websocket-messages/SignAndUploadBundles-With-RuntimeConfig.json index 3e5f3fc87..738694f6b 100644 --- a/src/test/resources/websocket-messages/SignAndUploadBundles-With-RuntimeConfig.json +++ b/src/test/resources/websocket-messages/SignAndUploadBundles-With-RuntimeConfig.json @@ -526,8 +526,8 @@ "connector.client-certificate": "data:application/x-pkcs12;base64,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", "connector.client-certificate-password": "00", "connector.client-system-id": "Incentergy", - "connector.mandant-id": "1786_A1", + "connector.mandant-id": "Incentergy", "connector.version": "PTV4+", - "connector.workplace-id": "Incentergy" + "connector.workplace-id": "1786_A1" } } \ No newline at end of file diff --git a/src/test/resources/websocket-messages/SignAndUploadBundles-Without-Validation.json b/src/test/resources/websocket-messages/SignAndUploadBundles-Without-Validation.json new file mode 100644 index 000000000..7146b41ec --- /dev/null +++ b/src/test/resources/websocket-messages/SignAndUploadBundles-Without-Validation.json @@ -0,0 +1,523 @@ +{ + "type": "SignAndUploadBundles", + "ignoreValidation": true, + "payload": [ + [ + { + "resourceType": "Bundle", + "id": "0428d416-149e-48a4-977c-394887b3d85c", + "meta": { + "lastUpdated": "2021-04-06T08:30:00Z", + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Bundle|1.0.1" + ] + }, + "identifier": { + "system": "https://gematik.de/fhir/NamingSystem/PrescriptionID", + "value": "160.100.000.000.002.36" + }, + "type": "document", + "timestamp": "2021-04-06T08:30:00Z", + "entry": [ + { + "fullUrl": "http://pvs.praxis.local/fhir/Composition/a054c2f3-0123-4d33-a0b3-bedec2f7d1ea", + "resource": { + "resourceType": "Composition", + "id": "a054c2f3-0123-4d33-a0b3-bedec2f7d1ea", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Composition|1.0.1" + ] + }, + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_Legal_basis", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_STATUSKENNZEICHEN", + "code": "00" + } + } + ], + "status": "final", + "type": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_FORMULAR_ART", + "code": "e16A" + } + ] + }, + "subject": { + "reference": "Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6" + }, + "date": "2021-04-05T08:00:00Z", + "author": [ + { + "reference": "Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359", + "type": "Practitioner" + }, + { + "type": "Device", + "identifier": { + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_FOR_Pruefnummer", + "value": "Y/410/2107/36/999" + } + } + ], + "title": "elektronische Arzneimittelverordnung", + "custodian": { + "reference": "Organization/d2b30a70-9830-4968-ab97-688472b6f9a3" + }, + "section": [ + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type", + "code": "Prescription" + } + ] + }, + "entry": [ + { + "reference": "MedicationRequest/06dc1594-509a-4f4c-ada7-dfd477a02d86" + } + ] + }, + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type", + "code": "Coverage" + } + ] + }, + "entry": [ + { + "reference": "Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4" + } + ] + } + ] + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/MedicationRequest/06dc1594-509a-4f4c-ada7-dfd477a02d86", + "resource": { + "resourceType": "MedicationRequest", + "id": "06dc1594-509a-4f4c-ada7-dfd477a02d86", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.0.1" + ] + }, + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_StatusCoPayment", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_StatusCoPayment", + "code": "1" + } + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee", + "valueBoolean": false + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG", + "valueBoolean": false + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription", + "extension": [ + { + "url": "Kennzeichen", + "valueBoolean": false + } + ] + } + ], + "status": "active", + "intent": "order", + "medicationReference": { + "reference": "Medication/f568397d-7ba2-46ac-904b-02caec933b42" + }, + "subject": { + "reference": "Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6" + }, + "authoredOn": "2020-04-06", + "requester": { + "reference": "Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359" + }, + "insurance": [ + { + "reference": "Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4" + } + ], + "dosageInstruction": [ + { + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag", + "valueBoolean": true + } + ], + "text": "2mal tägl. 5ml" + } + ], + "dispenseRequest": { + "quantity": { + "value": 1, + "system": "http://unitsofmeasure.org", + "code": "{Package}" + } + }, + "substitution": { + "allowedBoolean": true + } + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Medication/f568397d-7ba2-46ac-904b-02caec933b42", + "resource": { + "resourceType": "Medication", + "id": "f568397d-7ba2-46ac-904b-02caec933b42", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_PZN|1.0.1" + ] + }, + "extension": [ + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category", + "code": "00" + } + }, + { + "url": "https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine", + "valueBoolean": false + }, + { + "url": "http://fhir.de/StructureDefinition/normgroesse", + "valueCode": "N1" + } + ], + "code": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/ifa/pzn", + "code": "08585997" + } + ], + "text": "Prospan® Hustensaft 100ml N1" + }, + "form": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DARREICHUNGSFORM", + "code": "FLE" + } + ] + } + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6", + "resource": { + "resourceType": "Patient", + "id": "512ab5bc-a7ab-4fd7-81cc-16a594f747a6", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.0.3" + ] + }, + "identifier": [ + { + "type": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/identifier-type-de-basis", + "code": "GKV" + } + ] + }, + "system": "http://fhir.de/NamingSystem/gkv/kvid-10", + "value": "M310119800" + } + ], + "name": [ + { + "use": "official", + "family": "Erbprinzessin", + "_family": { + "extension": [ + { + "url": "http://fhir.de/StructureDefinition/humanname-namenszusatz", + "valueString": "Erbprinzessin" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-prefix", + "valueString": "von und zu der" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", + "valueString": "Schimmelpfennig-Hammerschmidt Federmannssohn" + } + ] + }, + "given": [ + "Ingrid" + ] + } + ], + "birthDate": "2010-01-31", + "address": [ + { + "type": "both", + "line": [ + "Anneliese- und Georg-von-Groscurth-Plaetzchen 149-C", + "5. OG - Hinterhof" + ], + "_line": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber", + "valueString": "149-C" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", + "valueString": "Anneliese- und Georg-von-Groscurth-Plaetzchen" + } + ] + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator", + "valueString": "5. OG - Hinterhof" + } + ] + } + ], + "city": "Bad Homburg", + "postalCode": "60437", + "country": "D" + } + ] + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Practitioner/e33d2afd-44c8-462b-80e5-52dbe5ebf359", + "resource": { + "resourceType": "Practitioner", + "id": "e33d2afd-44c8-462b-80e5-52dbe5ebf359", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.0.3" + ] + }, + "identifier": [ + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "LANR" + } + ] + }, + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR", + "value": "456456534" + } + ], + "name": [ + { + "use": "official", + "family": "Weber", + "_family": { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", + "valueString": "Weber" + } + ] + }, + "given": [ + "Maximilian" + ], + "prefix": [ + "Dr." + ], + "_prefix": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier", + "valueCode": "AC" + } + ] + } + ] + } + ], + "qualification": [ + { + "code": { + "coding": [ + { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type", + "code": "00" + } + ] + } + }, + { + "code": { + "text": "Facharzt für Kinder- und Jugendmedizin" + } + } + ] + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Organization/d2b30a70-9830-4968-ab97-688472b6f9a3", + "resource": { + "resourceType": "Organization", + "id": "d2b30a70-9830-4968-ab97-688472b6f9a3", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.0.3" + ] + }, + "identifier": [ + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "BSNR" + } + ] + }, + "system": "https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR", + "value": "687777700" + } + ], + "name": "Kinderarztpraxis", + "telecom": [ + { + "system": "phone", + "value": "09411234567" + } + ], + "address": [ + { + "type": "both", + "line": [ + "Yorckstraße 15", + "Hinterhaus" + ], + "_line": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber", + "valueString": "15" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", + "valueString": "Yorckstraße" + } + ] + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator", + "valueString": "Hinterhaus" + } + ] + } + ], + "city": "Regensburg", + "postalCode": "93049", + "country": "D" + } + ] + } + }, + { + "fullUrl": "http://pvs.praxis.local/fhir/Coverage/df0f2536-97b9-4bae-99cc-83ba2e8371e4", + "resource": { + "resourceType": "Coverage", + "id": "df0f2536-97b9-4bae-99cc-83ba2e8371e4", + "meta": { + "profile": [ + "https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.0.3" + ] + }, + "extension": [ + { + "url": "http://fhir.de/StructureDefinition/gkv/besondere-personengruppe", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE", + "code": "00" + } + }, + { + "url": "http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP", + "code": "00" + } + }, + { + "url": "http://fhir.de/StructureDefinition/gkv/wop", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP", + "code": "72" + } + }, + { + "url": "http://fhir.de/StructureDefinition/gkv/versichertenart", + "valueCoding": { + "system": "https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS", + "code": "3" + } + } + ], + "status": "active", + "type": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/versicherungsart-de-basis", + "code": "GKV" + } + ] + }, + "beneficiary": { + "reference": "Patient/512ab5bc-a7ab-4fd7-81cc-16a594f747a6" + }, + "period": { + "end": "2040-04-01" + }, + "payor": [ + { + "identifier": { + "system": "http://fhir.de/NamingSystem/arge-ik/iknr", + "value": "108416214" + }, + "display": "AOK Bayern" + } + ] + } + } + ] + } + ] + ] +} \ No newline at end of file diff --git a/src/test/resources/websocket-messages/StatusResponse.json b/src/test/resources/websocket-messages/StatusResponse.json index b0dab287a..8c62bae0a 100644 --- a/src/test/resources/websocket-messages/StatusResponse.json +++ b/src/test/resources/websocket-messages/StatusResponse.json @@ -1,7 +1,23 @@ { - "type": "StatusResponse", "payload": { - "connectorReachable": false, - "connectorInformation": null - } -} \ No newline at end of file + "bearerToken": "eyJhbGciOiJCUDI1NlIxIiwia2lkIjoicHVrX2lkcF9zaWciLCJ0eXAiOiJhdCtKV1QifQ.eyJhdXRoX3RpbWUiOjE3MDEwOTk0NDQsInNjb3BlIjoib3BlbmlkIGUtcmV6ZXB0IiwiY2xpZW50X2lkIjoiR0VNSW5jZW5lcmVTdWQxUEVyVVIiLCJnaXZlbl9uYW1lIjpudWxsLCJmYW1pbHlfbmFtZSI6bnVsbCwiZGlzcGxheV9uYW1lIjpudWxsLCJvcmdhbml6YXRpb25OYW1lIjoiS3JhbmtlbmhhdXMgYW0gTWVlclRFU1QtT05MWSIsInByb2Zlc3Npb25PSUQiOiIxLjIuMjc2LjAuNzYuNC41MyIsImlkTnVtbWVyIjoiNS1TTUMtQi1UZXN0a2FydGUtODgzMTEwMDAwMTAxMDQyIiwiYXpwIjoiR0VNSW5jZW5lcmVTdWQxUEVyVVIiLCJhY3IiOiJnZW1hdGlrLWVoZWFsdGgtbG9hLWhpZ2giLCJhbXIiOlsibWZhIiwic2MiLCJwaW4iXSwiYXVkIjoiaHR0cHM6Ly9lcnAtcmVmLnplbnRyYWwuZXJwLnNwbGl0ZG5zLnRpLWRpZW5zdGUuZGUvIiwic3ViIjoiOTI0ZThmYmM0NjlhNzQ0M2Y0OTA2NzZkNTQwMDhkOTJiYmEyNzUxZjc1ODhlZjllMjEzNjc3N2Y0MDY1M2QyOSIsImlzcyI6Imh0dHBzOi8vaWRwLXJlZi56ZW50cmFsLmlkcC5zcGxpdGRucy50aS1kaWVuc3RlLmRlIiwiaWF0IjoxNzAxMDk5NDQ0LCJleHAiOjE3MDEwOTk3NDQsImp0aSI6IjZiMDBhMDJjLTJhYWYtNDZkMy1hZjRiLTQ2MDZlZWVmZjRjYiJ9.gy4MjeiNfRHUJL5jakCF5mOduP87n_HKYEKbDwAop-Ojv-Y-YTzsixJkr5lBVNpXo7jTiTI9AddA49bQoYgQdA", + "cautInformation": "", + "cautReadable": true, + "comfortsignatureAvailable": true, + "comfortsignatureInformation": "", + "connectorInformation": "https://192.168.178.75", + "connectorReachable": true, + "ehbaAvailable": true, + "ehbaInformation": "Card Handle: 896e1757-0398-4806-b3ef-abdc4270075a", + "fachdienstInformation": "", + "fachdienstReachable": true, + "idpInformation": "https://idp-ref.zentral.idp.splitdns.ti-dienste.de//.well-known/openid-configuration", + "idpReachable": true, + "idpaccesstokenInformation": "Bearer Token: eyJhbGciOiJCUDI1NlIxIiwia2lkIjoicHVrX2lkcF9zaWciLCJ0eXAiOiJhdCtKV1QifQ.eyJhdXRoX3RpbWUiOjE3MDEwOTk0NDQsInNjb3BlIjoib3BlbmlkIGUtcmV6ZXB0IiwiY2xpZW50X2lkIjoiR0VNSW5jZW5lcmVTdWQxUEVyVVIiLCJnaXZlbl9uYW1lIjpudWxsLCJmYW1pbHlfbmFtZSI6bnVsbCwiZGlzcGxheV9uYW1lIjpudWxsLCJvcmdhbml6YXRpb25OYW1lIjoiS3JhbmtlbmhhdXMgYW0gTWVlclRFU1QtT05MWSIsInByb2Zlc3Npb25PSUQiOiIxLjIuMjc2LjAuNzYuNC41MyIsImlkTnVtbWVyIjoiNS1TTUMtQi1UZXN0a2FydGUtODgzMTEwMDAwMTAxMDQyIiwiYXpwIjoiR0VNSW5jZW5lcmVTdWQxUEVyVVIiLCJhY3IiOiJnZW1hdGlrLWVoZWFsdGgtbG9hLWhpZ2giLCJhbXIiOlsibWZhIiwic2MiLCJwaW4iXSwiYXVkIjoiaHR0cHM6Ly9lcnAtcmVmLnplbnRyYWwuZXJwLnNwbGl0ZG5zLnRpLWRpZW5zdGUuZGUvIiwic3ViIjoiOTI0ZThmYmM0NjlhNzQ0M2Y0OTA2NzZkNTQwMDhkOTJiYmEyNzUxZjc1ODhlZjllMjEzNjc3N2Y0MDY1M2QyOSIsImlzcyI6Imh0dHBzOi8vaWRwLXJlZi56ZW50cmFsLmlkcC5zcGxpdGRucy50aS1kaWVuc3RlLmRlIiwiaWF0IjoxNzAxMDk5NDQ0LCJleHAiOjE3MDEwOTk3NDQsImp0aSI6IjZiMDBhMDJjLTJhYWYtNDZkMy1hZjRiLTQ2MDZlZWVmZjRjYiJ9.gy4MjeiNfRHUJL5jakCF5mOduP87n_HKYEKbDwAop-Ojv-Y-YTzsixJkr5lBVNpXo7jTiTI9AddA49bQoYgQdA", + "idpaccesstokenObtainable": true, + "smcbAvailable": true, + "smcbInformation": "Card Handle: 241a3388-ae9c-4564-8a5e-4671c3f171f9" + }, + "replyToMessageId": "833e07ad-dd5e-4af0-9540-d1400a92416f", + "type": "StatusResponse" +} diff --git a/src/test/resources/websocket-messages/XMLBundle.json b/src/test/resources/websocket-messages/XMLBundle.json new file mode 100644 index 000000000..4839c66b8 --- /dev/null +++ b/src/test/resources/websocket-messages/XMLBundle.json @@ -0,0 +1,10 @@ +{ + "type": "XMLBundle", + "id": "2c732789-06c5-4cda-9513-23dc064c9f4c", + "runtimeConfig": { + "eHBAHandle": "HBA-791", + "SMCBHandle": "SMC-B-793", + "userId": "fee7a1c1-6f05-4599-8b29-2fc9c010a149" + }, + "payload": "<custodian><reference value='Organization/d9984508-b7d7-4e1b-bf27-90b77056953a'/></custodian><section><code><coding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type'/><code value='Prescription'/></coding></code><entry><reference value='MedicationRequest/e7fcb652-e4b1-49ad-b13c-12737f18b9da'/></entry></section><section><code><coding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Section_Type'/><code value='Coverage'/></coding></code><entry><reference value='Coverage/da80211e-61ee-458e-a651-87370b6ec30c'/></entry></section></Composition></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/Patient/ce4104af-b86b-4664-afee-1b5fc3ac8acf'/><resource><Patient xmlns='http://hl7.org/fhir'><id value='ce4104af-b86b-4664-afee-1b5fc3ac8acf'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Patient|1.1.0'/></meta><identifier><type><coding><system value='http://fhir.de/CodeSystem/identifier-type-de-basis'/><code value='GKV'/></coding></type><system value='http://fhir.de/sid/gkv/kvid-10'/><value value='K030182229'/></identifier><name><use value='official'/><family value='Kluge'><extension url='http://hl7.org/fhir/StructureDefinition/humanname-own-name'><valueString value='Kluge'/></extension></family><given value='Eva'/><prefix value='Prof. Dr. Dr. med'><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier'><valueCode value='AC'/></extension></prefix></name><birthDate value='1982-01-03'/><address><type value='both'/><line value='Pflasterhofweg 111B'><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber'><valueString value='111B'/></extension><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName'><valueString value='Pflasterhofweg'/></extension></line><city value='Köln'/><postalCode value='50999'/><country value='D'/></address></Patient></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/Medication/745d2ec2-4f38-44c1-8043-782062ae0e4a'/><resource><Medication xmlns='http://hl7.org/fhir'><id value='745d2ec2-4f38-44c1-8043-782062ae0e4a'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Medication_Ingredient|1.1.0'/></meta><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Category'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Category'/><code value='00'/></valueCoding></extension><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Medication_Vaccine'><valueBoolean value='false'/></extension><extension url='http://fhir.de/StructureDefinition/normgroesse'><valueCode value='N3'/></extension><code><coding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_ERP_Medication_Type'/><code value='wirkstoff'/></coding></code><form><text value='Tabletten'/></form><ingredient><itemCodeableConcept><coding><system value='http://fhir.de/CodeSystem/ask'/><code value='01913'/></coding><text value='Metronidazol'/></itemCodeableConcept><strength><numerator><value value='400'/><unit value='mg'/><system value='http://unitsofmeasure.org'/><code value='mg'/></numerator><denominator><value value='1'/></denominator></strength></ingredient></Medication></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/MedicationRequest/e7fcb652-e4b1-49ad-b13c-12737f18b9da'/><resource><MedicationRequest xmlns='http://hl7.org/fhir'><id value='e7fcb652-e4b1-49ad-b13c-12737f18b9da'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_ERP_Prescription|1.1.0'/></meta><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_FOR_StatusCoPayment'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_StatusCoPayment'/><code value='0'/></valueCoding></extension><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_EmergencyServicesFee'><valueBoolean value='false'/></extension><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_BVG'><valueBoolean value='false'/></extension><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_Multiple_Prescription'><extension url='Kennzeichen'><valueBoolean value='false'/></extension></extension><status value='active'/><intent value='order'/><medicationReference><reference value='Medication/745d2ec2-4f38-44c1-8043-782062ae0e4a'/></medicationReference><subject><reference value='Patient/ce4104af-b86b-4664-afee-1b5fc3ac8acf'/></subject><authoredOn value='2024-04-16'/><requester><reference value='Practitioner/313fd7d2-a232-48fd-8e28-98c1d6688068'/></requester><insurance><reference value='Coverage/da80211e-61ee-458e-a651-87370b6ec30c'/></insurance><dosageInstruction><extension url='https://fhir.kbv.de/StructureDefinition/KBV_EX_ERP_DosageFlag'><valueBoolean value='false'/></extension></dosageInstruction><dispenseRequest><quantity><value value='1'/><system value='http://unitsofmeasure.org'/><code value='{Package}'/></quantity></dispenseRequest></MedicationRequest></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/Practitioner/313fd7d2-a232-48fd-8e28-98c1d6688068'/><resource><Practitioner xmlns='http://hl7.org/fhir'><id value='313fd7d2-a232-48fd-8e28-98c1d6688068'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Practitioner|1.1.0'/></meta><identifier><type><coding><system value='http://terminology.hl7.org/CodeSystem/v2-0203'/><code value='LANR'/></coding></type><system value='https://fhir.kbv.de/NamingSystem/KBV_NS_Base_ANR'/><value value='123456499'/></identifier><name><use value='official'/><family value='Bëírliner'><extension url='http://hl7.org/fhir/StructureDefinition/humanname-own-name'><valueString value='Bëírliner'/></extension></family><given value='Maria'/><prefix value='Dr. med'><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier'><valueCode value='AC'/></extension></prefix></name><qualification><code><coding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Qualification_Type'/><code value='00'/></coding></code></qualification><qualification><code><coding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_FOR_Berufsbezeichnung'/><code value='Berufsbezeichnung'/></coding><text value='Arzt'/></code></qualification></Practitioner></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/Organization/d9984508-b7d7-4e1b-bf27-90b77056953a'/><resource><Organization xmlns='http://hl7.org/fhir'><id value='d9984508-b7d7-4e1b-bf27-90b77056953a'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Organization|1.1.0'/></meta><identifier><type><coding><system value='http://terminology.hl7.org/CodeSystem/v2-0203'/><code value='BSNR'/></coding></type><system value='https://fhir.kbv.de/NamingSystem/KBV_NS_Base_BSNR'/><value value='036812345'/></identifier><name value='Praxis SigmuntowskíTEST-ONLY'/><telecom><system value='phone'/><value value='0123456789'/></telecom><address><type value='both'/><line value='Sulzfeldstraße 7'><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName'><valueString value='Sulzfeldstraße'/></extension><extension url='http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber'><valueString value='7'/></extension></line><city value='Regensburg'/><postalCode value='93055'/><country value='D'/></address></Organization></resource></entry><entry><fullUrl value='http://pvs.praxis.local/fhir/Coverage/da80211e-61ee-458e-a651-87370b6ec30c'/><resource><Coverage xmlns='http://hl7.org/fhir'><id value='da80211e-61ee-458e-a651-87370b6ec30c'/><meta><profile value='https://fhir.kbv.de/StructureDefinition/KBV_PR_FOR_Coverage|1.1.0'/></meta><extension url='http://fhir.de/StructureDefinition/gkv/besondere-personengruppe'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_PERSONENGRUPPE'/><code value='00'/></valueCoding></extension><extension url='http://fhir.de/StructureDefinition/gkv/dmp-kennzeichen'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_DMP'/><code value='00'/></valueCoding></extension><extension url='http://fhir.de/StructureDefinition/gkv/wop'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_ITA_WOP'/><code value='38'/></valueCoding></extension><extension url='http://fhir.de/StructureDefinition/gkv/versichertenart'><valueCoding><system value='https://fhir.kbv.de/CodeSystem/KBV_CS_SFHIR_KBV_VERSICHERTENSTATUS'/><code value='3'/></valueCoding></extension><status value='active'/><type><coding><system value='http://fhir.de/CodeSystem/versicherungsart-de-basis'/><code value='GKV'/></coding></type><beneficiary><reference value='Patient/ce4104af-b86b-4664-afee-1b5fc3ac8acf'/></beneficiary><payor><identifier><system value='http://fhir.de/sid/arge-ik/iknr'/><value value='109777509'/></identifier><display value='Techniker-Krankenkasse'/></payor></Coverage></resource></entry></Bundle>" +} \ No newline at end of file diff --git a/src/test/resources/with-egk/Task.xml b/src/test/resources/with-egk/Task.xml new file mode 100644 index 000000000..d164ea4bd --- /dev/null +++ b/src/test/resources/with-egk/Task.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8"?> +<Bundle xmlns="http://hl7.org/fhir"><id value="070991c2-75de-4d8d-a968-85412d5d627e"/><type value="collection"/><timestamp value="2024-02-09T15:58:23.104+00:00"/><link><relation value="self"/><url value="https://erp-ref.zentral.erp.splitdns.ti-dienste.de/Task/160.000.226.067.591.41/$accept/"/></link><entry><fullUrl value="https://erp-ref.zentral.erp.splitdns.ti-dienste.de/Task/160.000.226.067.591.41"/><resource><Task><id value="160.000.226.067.591.41"/><meta><profile value="https://gematik.de/fhir/erp/StructureDefinition/GEM_ERP_PR_Task|1.2"/></meta><extension url="https://gematik.de/fhir/erp/StructureDefinition/GEM_ERP_EX_PrescriptionType"><valueCoding><system value="https://gematik.de/fhir/erp/CodeSystem/GEM_ERP_CS_FlowType"/><code value="160"/><display value="Muster 16 (Apothekenpflichtige Arzneimittel)"/></valueCoding></extension><extension url="https://gematik.de/fhir/erp/StructureDefinition/GEM_ERP_EX_ExpiryDate"><valueDate value="2024-04-22"/></extension><extension url="https://gematik.de/fhir/erp/StructureDefinition/GEM_ERP_EX_AcceptDate"><valueDate value="2024-02-19"/></extension><identifier><use value="official"/><system value="https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_PrescriptionId"/><value value="160.000.226.067.591.41"/></identifier><identifier><use value="official"/><system value="https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_AccessCode"/><value value="7bcfebe33e0cbf6787560f789f285f0dc336fb650c4aa147b06ab4c52a2ea998"/></identifier><identifier><use value="official"/><system value="https://gematik.de/fhir/erp/NamingSystem/GEM_ERP_NS_Secret"/><value value="73ffbbda96fc88cc86064b53c5f43c71463987e0ae72d89603735483b1d1607f"/></identifier><status value="in-progress"/><intent value="order"/><for><identifier><system value="http://fhir.de/sid/gkv/kvid-10"/><value value="K210140155"/></identifier></for><authoredOn value="2024-01-22T14:24:47.987+00:00"/><lastModified value="2024-02-09T15:58:23.099+00:00"/><performerType><coding><system value="https://gematik.de/fhir/erp/CodeSystem/GEM_ERP_CS_OrganizationType"/><code value="urn:oid:1.2.276.0.76.4.54"/><display value="�ffentliche Apotheke"/></coding><text value="�ffentliche Apotheke"/></performerType><owner><identifier><system value="https://gematik.de/fhir/sid/telematik-id"/><value value="3-SMC-B-Testkarte-883110000116352"/></identifier></owner><input><type><coding><system value="https://gematik.de/fhir/erp/CodeSystem/GEM_ERP_CS_DocumentType"/><code value="1"/></coding></type><valueReference><reference value="a0878479-0d00-0000-0001-000000000000"/></valueReference></input></Task></resource></entry><entry><fullUrl value="urn:uuid:a0878479-0d00-0000-0001-000000000000"/><resource><Binary><id value="a0878479-0d00-0000-0001-000000000000"/><meta><versionId value="1"/><profile value="https://gematik.de/fhir/erp/StructureDefinition/GEM_ERP_PR_Binary|1.2"/></meta><contentType value="application/pkcs7-mime"/><data value="MII6FwYJKoZIhvcNAQcCoII6CDCCOgQCAQUxDzANBglghkgBZQMEAgEFADCCKkEGCSqGSIb3DQEHAaCCKjIEgiouPEJ1bmRsZSB4bWxucz0iaHR0cDovL2hsNy5vcmcvZmhpciI+PGlkIHZhbHVlPSIzZmRhZTFmMC02OTgzLTQ4OTQtOWM3NC00ZDg5MGQwOTg4M2MiPjwvaWQ+PG1ldGE+PGxhc3RVcGRhdGVkIHZhbHVlPSIyMDI0LTAxLTIyVDE1OjE0OjE2LjQ1NCswMTowMCI+PC9sYXN0VXBkYXRlZD48cHJvZmlsZSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL0tCVl9QUl9FUlBfQnVuZGxlfDEuMS4wIj48L3Byb2ZpbGU+PC9tZXRhPjxpZGVudGlmaWVyPjxzeXN0ZW0gdmFsdWU9Imh0dHBzOi8vZ2VtYXRpay5kZS9maGlyL2VycC9OYW1pbmdTeXN0ZW0vR0VNX0VSUF9OU19QcmVzY3JpcHRpb25JZCI+PC9zeXN0ZW0+PHZhbHVlIHZhbHVlPSIxNjAuMDAwLjIyNi4wNjcuNTkxLjQxIj48L3ZhbHVlPjwvaWRlbnRpZmllcj48dHlwZSB2YWx1ZT0iZG9jdW1lbnQiPjwvdHlwZT48dGltZXN0YW1wIHZhbHVlPSIyMDI0LTAxLTIyVDE1OjE0OjE2LjQ1NCswMTowMCI+PC90aW1lc3RhbXA+PGVudHJ5PjxmdWxsVXJsIHZhbHVlPSJodHRwOi8vcHZzLnByYXhpcy5sb2NhbC9maGlyL0NvbXBvc2l0aW9uLzJiMWI5YTE3LWMxMDQtNGJiNC1hMjk1LWVkYjE2YTk4MTZmMSI+PC9mdWxsVXJsPjxyZXNvdXJjZT48Q29tcG9zaXRpb24+PGlkIHZhbHVlPSIyYjFiOWExNy1jMTA0LTRiYjQtYTI5NS1lZGIxNmE5ODE2ZjEiPjwvaWQ+PG1ldGE+PHByb2ZpbGUgdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9LQlZfUFJfRVJQX0NvbXBvc2l0aW9ufDEuMS4wIj48L3Byb2ZpbGU+PC9tZXRhPjxleHRlbnNpb24gdXJsPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vS0JWX0VYX0ZPUl9MZWdhbF9iYXNpcyI+PHZhbHVlQ29kaW5nPjxzeXN0ZW0gdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvQ29kZVN5c3RlbS9LQlZfQ1NfU0ZISVJfS0JWX1NUQVRVU0tFTk5aRUlDSEVOIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iMDAiPjwvY29kZT48L3ZhbHVlQ29kaW5nPjwvZXh0ZW5zaW9uPjxzdGF0dXMgdmFsdWU9ImZpbmFsIj48L3N0YXR1cz48dHlwZT48Y29kaW5nPjxzeXN0ZW0gdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvQ29kZVN5c3RlbS9LQlZfQ1NfU0ZISVJfS0JWX0ZPUk1VTEFSX0FSVCI+PC9zeXN0ZW0+PGNvZGUgdmFsdWU9ImUxNkEiPjwvY29kZT48L2NvZGluZz48L3R5cGU+PHN1YmplY3Q+PHJlZmVyZW5jZSB2YWx1ZT0iUGF0aWVudC85ODQzODg0OS1mYzkyLTRhMjEtOGM4ZC1lMjIzMDg1ZDJkOWQiPjwvcmVmZXJlbmNlPjwvc3ViamVjdD48ZGF0ZSB2YWx1ZT0iMjAyNC0wMS0yMlQxNToxNDoxNiswMTowMCI+PC9kYXRlPjxhdXRob3I+PHJlZmVyZW5jZSB2YWx1ZT0iUHJhY3RpdGlvbmVyLzBkMTAxYTE5LWRkZTItNDNkMi1hMDMxLTc5NDAxMzZkZDcwNSI+PC9yZWZlcmVuY2U+PHR5cGUgdmFsdWU9IlByYWN0aXRpb25lciI+PC90eXBlPjwvYXV0aG9yPjxhdXRob3I+PHR5cGUgdmFsdWU9IkRldmljZSI+PC90eXBlPjxpZGVudGlmaWVyPjxzeXN0ZW0gdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvTmFtaW5nU3lzdGVtL0tCVl9OU19GT1JfUHJ1ZWZudW1tZXIiPjwvc3lzdGVtPjx2YWx1ZSB2YWx1ZT0iWS80MDAvMTkwNC8zNi8xMTIiPjwvdmFsdWU+PC9pZGVudGlmaWVyPjwvYXV0aG9yPjx0aXRsZSB2YWx1ZT0iZWxla3Ryb25pc2NoZSBBcnpuZWltaXR0ZWx2ZXJvcmRudW5nIj48L3RpdGxlPjxjdXN0b2RpYW4+PHJlZmVyZW5jZSB2YWx1ZT0iT3JnYW5pemF0aW9uLzk5MjdiY2I1LWRhYzQtNGZlOS05ZWVhLWE5OGI5ZWI1ODA2MSI+PC9yZWZlcmVuY2U+PC9jdXN0b2RpYW4+PHNlY3Rpb24+PGNvZGU+PGNvZGluZz48c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL0NvZGVTeXN0ZW0vS0JWX0NTX0VSUF9TZWN0aW9uX1R5cGUiPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSJQcmVzY3JpcHRpb24iPjwvY29kZT48L2NvZGluZz48L2NvZGU+PGVudHJ5PjxyZWZlcmVuY2UgdmFsdWU9Ik1lZGljYXRpb25SZXF1ZXN0LzYwMGZhNmQ1LTFkZWQtNDg1OS04Yzc5LWIyYjE0ZTY3NjY1YiI+PC9yZWZlcmVuY2U+PC9lbnRyeT48L3NlY3Rpb24+PHNlY3Rpb24+PGNvZGU+PGNvZGluZz48c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL0NvZGVTeXN0ZW0vS0JWX0NTX0VSUF9TZWN0aW9uX1R5cGUiPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSJDb3ZlcmFnZSI+PC9jb2RlPjwvY29kaW5nPjwvY29kZT48ZW50cnk+PHJlZmVyZW5jZSB2YWx1ZT0iQ292ZXJhZ2UvYTNiODU0ZjEtOTU1YS00NThmLWEyNmEtNzljMWFjZDQ2NTMwIj48L3JlZmVyZW5jZT48L2VudHJ5Pjwvc2VjdGlvbj48L0NvbXBvc2l0aW9uPjwvcmVzb3VyY2U+PC9lbnRyeT48ZW50cnk+PGZ1bGxVcmwgdmFsdWU9Imh0dHA6Ly9wdnMucHJheGlzLmxvY2FsL2ZoaXIvUGF0aWVudC85ODQzODg0OS1mYzkyLTRhMjEtOGM4ZC1lMjIzMDg1ZDJkOWQiPjwvZnVsbFVybD48cmVzb3VyY2U+PFBhdGllbnQ+PGlkIHZhbHVlPSI5ODQzODg0OS1mYzkyLTRhMjEtOGM4ZC1lMjIzMDg1ZDJkOWQiPjwvaWQ+PG1ldGE+PHByb2ZpbGUgdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9LQlZfUFJfRk9SX1BhdGllbnR8MS4xLjAiPjwvcHJvZmlsZT48L21ldGE+PGlkZW50aWZpZXI+PHR5cGU+PGNvZGluZz48c3lzdGVtIHZhbHVlPSJodHRwOi8vZmhpci5kZS9Db2RlU3lzdGVtL2lkZW50aWZpZXItdHlwZS1kZS1iYXNpcyI+PC9zeXN0ZW0+PGNvZGUgdmFsdWU9IkdLViI+PC9jb2RlPjwvY29kaW5nPjwvdHlwZT48c3lzdGVtIHZhbHVlPSJodHRwOi8vZmhpci5kZS9zaWQvZ2t2L2t2aWQtMTAiPjwvc3lzdGVtPjx2YWx1ZSB2YWx1ZT0iSzIxMDE0MDE1NSI+PC92YWx1ZT48L2lkZW50aWZpZXI+PG5hbWU+PHVzZSB2YWx1ZT0ib2ZmaWNpYWwiPjwvdXNlPjxmYW1pbHkgdmFsdWU9IkJsYXVtYW5uIj48ZXh0ZW5zaW9uIHVybD0iaHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL2h1bWFubmFtZS1vd24tbmFtZSI+PHZhbHVlU3RyaW5nIHZhbHVlPSJCbGF1bWFubiI+PC92YWx1ZVN0cmluZz48L2V4dGVuc2lvbj48L2ZhbWlseT48Z2l2ZW4gdmFsdWU9IkJlcm5kIj48L2dpdmVuPjwvbmFtZT48YmlydGhEYXRlIHZhbHVlPSIxOTY3LTAzLTAzIj48L2JpcnRoRGF0ZT48YWRkcmVzcz48dHlwZSB2YWx1ZT0iYm90aCI+PC90eXBlPjxsaW5lIHZhbHVlPSJCYXVtd2VnIDU1Ij48ZXh0ZW5zaW9uIHVybD0iaHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL2lzbzIxMDkwLUFEWFAtc3RyZWV0TmFtZSI+PHZhbHVlU3RyaW5nIHZhbHVlPSJCYXVtd2VnIj48L3ZhbHVlU3RyaW5nPjwvZXh0ZW5zaW9uPjxleHRlbnNpb24gdXJsPSJodHRwOi8vaGw3Lm9yZy9maGlyL1N0cnVjdHVyZURlZmluaXRpb24vaXNvMjEwOTAtQURYUC1ob3VzZU51bWJlciI+PHZhbHVlU3RyaW5nIHZhbHVlPSI1NSI+PC92YWx1ZVN0cmluZz48L2V4dGVuc2lvbj48L2xpbmU+PGxpbmUgdmFsdWU9IkdlbWF0aWsgVGVzdCI+PGV4dGVuc2lvbiB1cmw9Imh0dHA6Ly9obDcub3JnL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9pc28yMTA5MC1BRFhQLWFkZGl0aW9uYWxMb2NhdG9yIj48dmFsdWVTdHJpbmcgdmFsdWU9IkdlbWF0aWsgVGVzdCI+PC92YWx1ZVN0cmluZz48L2V4dGVuc2lvbj48L2xpbmU+PGNpdHkgdmFsdWU9IkJvY2h1bSI+PC9jaXR5Pjxwb3N0YWxDb2RlIHZhbHVlPSI0NDgwOSI+PC9wb3N0YWxDb2RlPjxjb3VudHJ5IHZhbHVlPSJEIj48L2NvdW50cnk+PC9hZGRyZXNzPjwvUGF0aWVudD48L3Jlc291cmNlPjwvZW50cnk+PGVudHJ5PjxmdWxsVXJsIHZhbHVlPSJodHRwOi8vcHZzLnByYXhpcy5sb2NhbC9maGlyL01lZGljYXRpb24vMWFkNTQ1NzYtY2FjMy00ZGZmLTg5NWMtYzYzZGQxNmEyODc3Ij48L2Z1bGxVcmw+PHJlc291cmNlPjxNZWRpY2F0aW9uPjxpZCB2YWx1ZT0iMWFkNTQ1NzYtY2FjMy00ZGZmLTg5NWMtYzYzZGQxNmEyODc3Ij48L2lkPjxtZXRhPjxwcm9maWxlIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vS0JWX1BSX0VSUF9NZWRpY2F0aW9uX0ZyZWVUZXh0fDEuMS4wIj48L3Byb2ZpbGU+PC9tZXRhPjxleHRlbnNpb24gdXJsPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vS0JWX0VYX0VSUF9NZWRpY2F0aW9uX0NhdGVnb3J5Ij48dmFsdWVDb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9Db2RlU3lzdGVtL0tCVl9DU19FUlBfTWVkaWNhdGlvbl9DYXRlZ29yeSI+PC9zeXN0ZW0+PGNvZGUgdmFsdWU9IjAwIj48L2NvZGU+PC92YWx1ZUNvZGluZz48L2V4dGVuc2lvbj48ZXh0ZW5zaW9uIHVybD0iaHR0cHM6Ly9maGlyLmtidi5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL0tCVl9FWF9FUlBfTWVkaWNhdGlvbl9WYWNjaW5lIj48dmFsdWVCb29sZWFuIHZhbHVlPSJmYWxzZSI+PC92YWx1ZUJvb2xlYW4+PC9leHRlbnNpb24+PGNvZGU+PGNvZGluZz48c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL0NvZGVTeXN0ZW0vS0JWX0NTX0VSUF9NZWRpY2F0aW9uX1R5cGUiPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSJmcmVpdGV4dCI+PC9jb2RlPjwvY29kaW5nPjx0ZXh0IHZhbHVlPSJEaWNsbyA1MCBUYmwgMTAwU1QiPjwvdGV4dD48L2NvZGU+PC9NZWRpY2F0aW9uPjwvcmVzb3VyY2U+PC9lbnRyeT48ZW50cnk+PGZ1bGxVcmwgdmFsdWU9Imh0dHA6Ly9wdnMucHJheGlzLmxvY2FsL2ZoaXIvTWVkaWNhdGlvblJlcXVlc3QvNjAwZmE2ZDUtMWRlZC00ODU5LThjNzktYjJiMTRlNjc2NjViIj48L2Z1bGxVcmw+PHJlc291cmNlPjxNZWRpY2F0aW9uUmVxdWVzdD48aWQgdmFsdWU9IjYwMGZhNmQ1LTFkZWQtNDg1OS04Yzc5LWIyYjE0ZTY3NjY1YiI+PC9pZD48bWV0YT48cHJvZmlsZSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL0tCVl9QUl9FUlBfUHJlc2NyaXB0aW9ufDEuMS4wIj48L3Byb2ZpbGU+PC9tZXRhPjxleHRlbnNpb24gdXJsPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vS0JWX0VYX0ZPUl9TdGF0dXNDb1BheW1lbnQiPjx2YWx1ZUNvZGluZz48c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL0NvZGVTeXN0ZW0vS0JWX0NTX0ZPUl9TdGF0dXNDb1BheW1lbnQiPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSIwIj48L2NvZGU+PC92YWx1ZUNvZGluZz48L2V4dGVuc2lvbj48ZXh0ZW5zaW9uIHVybD0iaHR0cHM6Ly9maGlyLmtidi5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL0tCVl9FWF9FUlBfRW1lcmdlbmN5U2VydmljZXNGZWUiPjx2YWx1ZUJvb2xlYW4gdmFsdWU9ImZhbHNlIj48L3ZhbHVlQm9vbGVhbj48L2V4dGVuc2lvbj48ZXh0ZW5zaW9uIHVybD0iaHR0cHM6Ly9maGlyLmtidi5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL0tCVl9FWF9FUlBfQlZHIj48dmFsdWVCb29sZWFuIHZhbHVlPSJmYWxzZSI+PC92YWx1ZUJvb2xlYW4+PC9leHRlbnNpb24+PGV4dGVuc2lvbiB1cmw9Imh0dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9LQlZfRVhfRVJQX011bHRpcGxlX1ByZXNjcmlwdGlvbiI+PGV4dGVuc2lvbiB1cmw9Iktlbm56ZWljaGVuIj48dmFsdWVCb29sZWFuIHZhbHVlPSJmYWxzZSI+PC92YWx1ZUJvb2xlYW4+PC9leHRlbnNpb24+PC9leHRlbnNpb24+PHN0YXR1cyB2YWx1ZT0iYWN0aXZlIj48L3N0YXR1cz48aW50ZW50IHZhbHVlPSJvcmRlciI+PC9pbnRlbnQ+PG1lZGljYXRpb25SZWZlcmVuY2U+PHJlZmVyZW5jZSB2YWx1ZT0iTWVkaWNhdGlvbi8xYWQ1NDU3Ni1jYWMzLTRkZmYtODk1Yy1jNjNkZDE2YTI4NzciPjwvcmVmZXJlbmNlPjwvbWVkaWNhdGlvblJlZmVyZW5jZT48c3ViamVjdD48cmVmZXJlbmNlIHZhbHVlPSJQYXRpZW50Lzk4NDM4ODQ5LWZjOTItNGEyMS04YzhkLWUyMjMwODVkMmQ5ZCI+PC9yZWZlcmVuY2U+PC9zdWJqZWN0PjxhdXRob3JlZE9uIHZhbHVlPSIyMDI0LTAxLTIyIj48L2F1dGhvcmVkT24+PHJlcXVlc3Rlcj48cmVmZXJlbmNlIHZhbHVlPSJQcmFjdGl0aW9uZXIvMGQxMDFhMTktZGRlMi00M2QyLWEwMzEtNzk0MDEzNmRkNzA1Ij48L3JlZmVyZW5jZT48L3JlcXVlc3Rlcj48aW5zdXJhbmNlPjxyZWZlcmVuY2UgdmFsdWU9IkNvdmVyYWdlL2EzYjg1NGYxLTk1NWEtNDU4Zi1hMjZhLTc5YzFhY2Q0NjUzMCI+PC9yZWZlcmVuY2U+PC9pbnN1cmFuY2U+PGRvc2FnZUluc3RydWN0aW9uPjxleHRlbnNpb24gdXJsPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vS0JWX0VYX0VSUF9Eb3NhZ2VGbGFnIj48dmFsdWVCb29sZWFuIHZhbHVlPSJ0cnVlIj48L3ZhbHVlQm9vbGVhbj48L2V4dGVuc2lvbj48dGV4dCB2YWx1ZT0iMS0wLTAiPjwvdGV4dD48L2Rvc2FnZUluc3RydWN0aW9uPjxkaXNwZW5zZVJlcXVlc3Q+PHF1YW50aXR5Pjx2YWx1ZSB2YWx1ZT0iMTAwIj48L3ZhbHVlPjxzeXN0ZW0gdmFsdWU9Imh0dHA6Ly91bml0c29mbWVhc3VyZS5vcmciPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSJ7UGFja2FnZX0iPjwvY29kZT48L3F1YW50aXR5PjwvZGlzcGVuc2VSZXF1ZXN0PjxzdWJzdGl0dXRpb24+PGFsbG93ZWRCb29sZWFuIHZhbHVlPSJ0cnVlIj48L2FsbG93ZWRCb29sZWFuPjwvc3Vic3RpdHV0aW9uPjwvTWVkaWNhdGlvblJlcXVlc3Q+PC9yZXNvdXJjZT48L2VudHJ5PjxlbnRyeT48ZnVsbFVybCB2YWx1ZT0iaHR0cDovL3B2cy5wcmF4aXMubG9jYWwvZmhpci9QcmFjdGl0aW9uZXIvMGQxMDFhMTktZGRlMi00M2QyLWEwMzEtNzk0MDEzNmRkNzA1Ij48L2Z1bGxVcmw+PHJlc291cmNlPjxQcmFjdGl0aW9uZXI+PGlkIHZhbHVlPSIwZDEwMWExOS1kZGUyLTQzZDItYTAzMS03OTQwMTM2ZGQ3MDUiPjwvaWQ+PG1ldGE+PHByb2ZpbGUgdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9LQlZfUFJfRk9SX1ByYWN0aXRpb25lcnwxLjEuMCI+PC9wcm9maWxlPjwvbWV0YT48aWRlbnRpZmllcj48dHlwZT48Y29kaW5nPjxzeXN0ZW0gdmFsdWU9Imh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vdjItMDIwMyI+PC9zeXN0ZW0+PGNvZGUgdmFsdWU9IkxBTlIiPjwvY29kZT48L2NvZGluZz48L3R5cGU+PHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9OYW1pbmdTeXN0ZW0vS0JWX05TX0Jhc2VfQU5SIj48L3N5c3RlbT48dmFsdWUgdmFsdWU9Ijk5OTk5OTk5MSI+PC92YWx1ZT48L2lkZW50aWZpZXI+PG5hbWU+PHVzZSB2YWx1ZT0ib2ZmaWNpYWwiPjwvdXNlPjxmYW1pbHkgdmFsdWU9Ik9sZGVuYnVyZyI+PGV4dGVuc2lvbiB1cmw9Imh0dHA6Ly9obDcub3JnL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9odW1hbm5hbWUtb3duLW5hbWUiPjx2YWx1ZVN0cmluZyB2YWx1ZT0iT2xkZW5idXJnIj48L3ZhbHVlU3RyaW5nPjwvZXh0ZW5zaW9uPjwvZmFtaWx5PjxnaXZlbiB2YWx1ZT0iTcOjcmlhbm5lIEdyw6RmaW4iPjwvZ2l2ZW4+PC9uYW1lPjxxdWFsaWZpY2F0aW9uPjxjb2RlPjxjb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9Db2RlU3lzdGVtL0tCVl9DU19GT1JfUXVhbGlmaWNhdGlvbl9UeXBlIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iMDAiPjwvY29kZT48L2NvZGluZz48L2NvZGU+PC9xdWFsaWZpY2F0aW9uPjxxdWFsaWZpY2F0aW9uPjxjb2RlPjxjb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9Db2RlU3lzdGVtL0tCVl9DU19GT1JfQmVydWZzYmV6ZWljaG51bmciPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSJCZXJ1ZnNiZXplaWNobnVuZyI+PC9jb2RlPjwvY29kaW5nPjx0ZXh0IHZhbHVlPSJBcnp0Ij48L3RleHQ+PC9jb2RlPjwvcXVhbGlmaWNhdGlvbj48L1ByYWN0aXRpb25lcj48L3Jlc291cmNlPjwvZW50cnk+PGVudHJ5PjxmdWxsVXJsIHZhbHVlPSJodHRwOi8vcHZzLnByYXhpcy5sb2NhbC9maGlyL09yZ2FuaXphdGlvbi85OTI3YmNiNS1kYWM0LTRmZTktOWVlYS1hOThiOWViNTgwNjEiPjwvZnVsbFVybD48cmVzb3VyY2U+PE9yZ2FuaXphdGlvbj48aWQgdmFsdWU9Ijk5MjdiY2I1LWRhYzQtNGZlOS05ZWVhLWE5OGI5ZWI1ODA2MSI+PC9pZD48bWV0YT48cHJvZmlsZSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL0tCVl9QUl9GT1JfT3JnYW5pemF0aW9ufDEuMS4wIj48L3Byb2ZpbGU+PC9tZXRhPjxpZGVudGlmaWVyPjx0eXBlPjxjb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS92Mi0wMjAzIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iQlNOUiI+PC9jb2RlPjwvY29kaW5nPjwvdHlwZT48c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL05hbWluZ1N5c3RlbS9LQlZfTlNfQmFzZV9CU05SIj48L3N5c3RlbT48dmFsdWUgdmFsdWU9IjExMTIyMjMzMyI+PC92YWx1ZT48L2lkZW50aWZpZXI+PG5hbWUgdmFsdWU9IlZpbmNlbnprcmFua2VuaGF1c1RFU1QtT05MWSI+PC9uYW1lPjx0ZWxlY29tPjxzeXN0ZW0gdmFsdWU9InBob25lIj48L3N5c3RlbT48dmFsdWUgdmFsdWU9IjA2OTEyMzEyMzEiPjwvdmFsdWU+PC90ZWxlY29tPjxhZGRyZXNzPjx0eXBlIHZhbHVlPSJib3RoIj48L3R5cGU+PGxpbmUgdmFsdWU9IlN1bmRnYXVhbGxlZSA1OSI+PGV4dGVuc2lvbiB1cmw9Imh0dHA6Ly9obDcub3JnL2ZoaXIvU3RydWN0dXJlRGVmaW5pdGlvbi9pc28yMTA5MC1BRFhQLXN0cmVldE5hbWUiPjx2YWx1ZVN0cmluZyB2YWx1ZT0iU3VuZGdhdWFsbGVlIj48L3ZhbHVlU3RyaW5nPjwvZXh0ZW5zaW9uPjxleHRlbnNpb24gdXJsPSJodHRwOi8vaGw3Lm9yZy9maGlyL1N0cnVjdHVyZURlZmluaXRpb24vaXNvMjEwOTAtQURYUC1ob3VzZU51bWJlciI+PHZhbHVlU3RyaW5nIHZhbHVlPSI1OSI+PC92YWx1ZVN0cmluZz48L2V4dGVuc2lvbj48L2xpbmU+PGNpdHkgdmFsdWU9IkZyZWlidXJnIj48L2NpdHk+PHBvc3RhbENvZGUgdmFsdWU9Ijc5MTE0Ij48L3Bvc3RhbENvZGU+PGNvdW50cnkgdmFsdWU9IkQiPjwvY291bnRyeT48L2FkZHJlc3M+PC9Pcmdhbml6YXRpb24+PC9yZXNvdXJjZT48L2VudHJ5PjxlbnRyeT48ZnVsbFVybCB2YWx1ZT0iaHR0cDovL3B2cy5wcmF4aXMubG9jYWwvZmhpci9Db3ZlcmFnZS9hM2I4NTRmMS05NTVhLTQ1OGYtYTI2YS03OWMxYWNkNDY1MzAiPjwvZnVsbFVybD48cmVzb3VyY2U+PENvdmVyYWdlPjxpZCB2YWx1ZT0iYTNiODU0ZjEtOTU1YS00NThmLWEyNmEtNzljMWFjZDQ2NTMwIj48L2lkPjxtZXRhPjxwcm9maWxlIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vS0JWX1BSX0ZPUl9Db3ZlcmFnZXwxLjEuMCI+PC9wcm9maWxlPjwvbWV0YT48ZXh0ZW5zaW9uIHVybD0iaHR0cDovL2ZoaXIuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9na3YvYmVzb25kZXJlLXBlcnNvbmVuZ3J1cHBlIj48dmFsdWVDb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9Db2RlU3lzdGVtL0tCVl9DU19TRkhJUl9LQlZfUEVSU09ORU5HUlVQUEUiPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSIwMCI+PC9jb2RlPjwvdmFsdWVDb2Rpbmc+PC9leHRlbnNpb24+PGV4dGVuc2lvbiB1cmw9Imh0dHA6Ly9maGlyLmRlL1N0cnVjdHVyZURlZmluaXRpb24vZ2t2L2RtcC1rZW5uemVpY2hlbiI+PHZhbHVlQ29kaW5nPjxzeXN0ZW0gdmFsdWU9Imh0dHBzOi8vZmhpci5rYnYuZGUvQ29kZVN5c3RlbS9LQlZfQ1NfU0ZISVJfS0JWX0RNUCI+PC9zeXN0ZW0+PGNvZGUgdmFsdWU9IjAwIj48L2NvZGU+PC92YWx1ZUNvZGluZz48L2V4dGVuc2lvbj48ZXh0ZW5zaW9uIHVybD0iaHR0cDovL2ZoaXIuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi9na3Yvd29wIj48dmFsdWVDb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9Db2RlU3lzdGVtL0tCVl9DU19TRkhJUl9JVEFfV09QIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iMjAiPjwvY29kZT48L3ZhbHVlQ29kaW5nPjwvZXh0ZW5zaW9uPjxleHRlbnNpb24gdXJsPSJodHRwOi8vZmhpci5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uL2drdi92ZXJzaWNoZXJ0ZW5hcnQiPjx2YWx1ZUNvZGluZz48c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL0NvZGVTeXN0ZW0vS0JWX0NTX1NGSElSX0tCVl9WRVJTSUNIRVJURU5TVEFUVVMiPjwvc3lzdGVtPjxjb2RlIHZhbHVlPSIxIj48L2NvZGU+PC92YWx1ZUNvZGluZz48L2V4dGVuc2lvbj48c3RhdHVzIHZhbHVlPSJhY3RpdmUiPjwvc3RhdHVzPjx0eXBlPjxjb2Rpbmc+PHN5c3RlbSB2YWx1ZT0iaHR0cDovL2ZoaXIuZGUvQ29kZVN5c3RlbS92ZXJzaWNoZXJ1bmdzYXJ0LWRlLWJhc2lzIj48L3N5c3RlbT48Y29kZSB2YWx1ZT0iR0tWIj48L2NvZGU+PC9jb2Rpbmc+PC90eXBlPjxiZW5lZmljaWFyeT48cmVmZXJlbmNlIHZhbHVlPSJQYXRpZW50Lzk4NDM4ODQ5LWZjOTItNGEyMS04YzhkLWUyMjMwODVkMmQ5ZCI+PC9yZWZlcmVuY2U+PC9iZW5lZmljaWFyeT48cGF5b3I+PGlkZW50aWZpZXI+PHN5c3RlbSB2YWx1ZT0iaHR0cDovL2ZoaXIuZGUvc2lkL2FyZ2UtaWsvaWtuciI+PC9zeXN0ZW0+PHZhbHVlIHZhbHVlPSIxMDIxNzEwMTIiPjwvdmFsdWU+PC9pZGVudGlmaWVyPjxkaXNwbGF5IHZhbHVl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"/></Binary></resource></entry></Bundle> \ No newline at end of file