diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..8cc07a9 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,55 @@ +FROM mcr.microsoft.com/devcontainers/base:alpine-3.18 + +# Setzen der Umgebungsvariablen +ENV FIRELY_TERMINAL_VERSION=3.1.0 +ENV JAVA_VALIDATOR_VERSION=6.0.11 +ENV SUSHI_VERSION=3.5.0 + +# Installieren der notwendige Tools +# Add Microsoft's .NET SDK repository and install .NET SDK +RUN wget https://dot.net/v1/dotnet-install.sh \ + && chmod +x dotnet-install.sh \ + && ./dotnet-install.sh --channel 6.0 --install-dir /usr/share/dotnet \ + && ln -s /usr/share/dotnet/dotnet /usr/local/bin \ + && rm dotnet-install.sh + +# Install ICU libraries +RUN apk add --no-cache icu-libs + +# Install Node.js and npm +RUN apk add --no-cache nodejs npm + +# Install Java (OpenJDK) +RUN apk add --no-cache openjdk11 + +# Install Firely Terminal as vscode user +# Switch to the vscode user +USER vscode + +# Install Firely Terminal +RUN dotnet tool install --global Firely.Terminal --version $FIRELY_TERMINAL_VERSION + +# Add .NET tools to PATH for vscode user +ENV PATH="/home/vscode/.dotnet/tools:${PATH}" + +# Switch back to root user to perform remaining installations +USER root + +RUN npm install -g fsh-sushi@$SUSHI_VERSION + +# Installieren der zusätzliche Abhängigkeiten +RUN apk update && apk add --no-cache jq findutils curl ca-certificates + +# Setup for FHIR Validator +RUN mkdir -p /home/vscode/.fhir/validators/ +RUN wget -q https://github.com/hapifhir/org.hl7.fhir.core/releases/download/$JAVA_VALIDATOR_VERSION/validator_cli.jar -O /home/vscode/.fhir/validators/validator_cli.jar + +RUN mkdir -p /home/vscode/.fhir/settings/ +COPY codfsh-config.yaml /home/vscode/.fhir/settings/codfsh-config.yaml + +# Setzen des Arbeitsverzeichnis +WORKDIR /workspace + +COPY . /workspace + +CMD [ "/bin/bash" ] diff --git a/.devcontainer/codfsh-config.yaml b/.devcontainer/codfsh-config.yaml new file mode 100644 index 0000000..7b15112 --- /dev/null +++ b/.devcontainer/codfsh-config.yaml @@ -0,0 +1,9 @@ +sushi: + min_version: "3.5.0" +hapi: + min_version: "3.0.0" + parameters: + jurisdiction: DE + locale: de-DE + tx: "n/a" + debug: true diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..c5166eb --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,38 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the +// README at: https://github.com/devcontainers/templates/tree/main/src/alpine +{ + "name": "FHIR Development Container", + // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile + "build": { + "dockerfile": "Dockerfile" + }, + "customizations": { + "vscode": { + "extensions": [ + "gematikde.codfsh", + "MITRE-Health.vscode-language-fsh", + "ms-azuretools.vscode-docker", + "edenlabio.fhir-profiler-tool" + ], + "settings": { + "codfsh.HapiValidator.Executable": "/home/vscode/.fhir/validators/validator_cli.jar", + "codfsh.HapiValidator.Settings.SettingsFile": "/home/vscode/.fhir/settings/codfsh-config.yaml" + } + } + }, + "mounts": [ + "source=${localEnv:HOME}${localEnv:USERPROFILE}/.fhir/packages,target=/home/vscode/.fhir/packages,type=bind" + ] + + // Features to add to the dev container. More info: https://containers.dev/features. + // "features": {}, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + // "postCreateCommand": "uname -a", + + // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. + // "remoteUser": "root" +} diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..1835dbd --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,50 @@ +## Code of Conduct + +### Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +### Our Standards + +Examples of behavior that contributes to creating a positive environment include: +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Calls for violence, vilification and advertising +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +### Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +### Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +### Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at OSPO@gematik.de. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +### Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/BUG-REPORT.yml b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml new file mode 100644 index 0000000..b06dde6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/BUG-REPORT.yml @@ -0,0 +1,76 @@ +name: "🐛 Bug Report" +description: Create a new ticket for a bug. +title: "🐛 [BUG] - " +labels: [ + "bug", + "invalid" +] +body: + - type: textarea + id: description + attributes: + label: "Description" + description: Please enter an explicit description of the issue. + placeholder: | + Short and explicit description of the incident... + If you are able to specify, please also select the appropriate label: + - Bug, if something is technically not working, e.g. not compiling. + - Invalid, if something is technically working but does not seem to yield to correct outcome, e.g. 1+1 is 3. + validations: + required: true + - type: input + id: reprod-url + attributes: + label: "Reproduction URL" + description: Please enter the corresponding Simplifier URL (or other, e.g. GitHub) to provide a source for reproduction of the issue. + placeholder: ex. https://simplifier.net/REPO-NAME/RESOURCE-NAME + validations: + required: true + - type: input + id: version + attributes: + label: "Version or Branch" + description: If this bug occures only in a specific version or development branch, please tell us here. + placeholder: ex. Only occurs with ISiK 2.0.4. + validations: + required: false + - type: textarea + id: reprod + attributes: + label: "Reproduction Steps" + description: Please enter a step by step description of the issue. + value: | + + 1. At the interface '....' + 2. With Data '....' + 3. Execute Operation '....' + 4. See error + render: bash + validations: + required: true + - type: textarea + id: logs + attributes: + label: "Stack Trace and Logs" + description: Please copy and paste any relevant stack trace or log output. This will be automatically formatted into code. + render: bash + validations: + required: false + - type: textarea + id: screenshot + attributes: + label: "Screenshots" + description: If applicable, add screenshots to help explain your problem. + value: | + ![DESCRIPTION](LINK.png) + render: bash + validations: + required: false + - type: textarea + id: environment + attributes: + label: "Software and Environment" + description: Please describe the used software and your environment further. + placeholder: ex. I Use dotnet sdk 4.x and Firely Terminal to manage fhir packages + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml b/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml new file mode 100644 index 0000000..77974bb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/FEATURE-REQUEST.yml @@ -0,0 +1,72 @@ +name: "💡 Feature Request" +description: Create a new ticket for a new feature request +title: "💡 [REQUEST] - <title>" +labels: [ + "question", + "enhancement" +] +body: + - type: input + id: target_date + attributes: + label: "Target Date" + description: When would you need this feature to be available? + placeholder: "MM YYYY" + validations: + required: false + - type: input + id: implementation_pr + attributes: + label: "Implementation PR" + description: In case you already developed the feature yourself, please tell us the corresponding PR. Also, maybe you have seen this feature somewhere else? + placeholder: "Your Pull Request ID or link to a similar PR." + validations: + required: false + - type: textarea + id: reference_issues + attributes: + label: "Reference Issues" + description: Some common issues this feature would address. + placeholder: "Issues IDs and references" + validations: + required: false + - type: textarea + id: summary + attributes: + label: "Summary" + description: Please provide a brief explanation of the feature. + placeholder: | + Describe in a few lines your feature request ... + If you are able to specify, please also select the appropriate label: + - Question, if you would also be fine with more information, on how to address your request, e.g. with a workaround. + - Enhancement, if you are kinda sure your Request is an independent new addition, that could not be achieved otherwise. + validations: + required: true + - type: textarea + id: basic_example + attributes: + label: "Common Examples" + description: Indicate some basic examples of your feature or a common flow in which it would be used. + placeholder: | + In the use case of '...' + The necessary data will flow like '....' + Feature will be used '....' + With the result of '....' + validations: + required: true + - type: textarea + id: drawbacks + attributes: + label: "Drawbacks" + description: What are the drawbacks or mutual impacts of your feature request? + placeholder: Identify the drawbacks and mutual impacts with respect to other features. + validations: + required: true + - type: textarea + id: unadress_question + attributes: + label: "Unadressed questions" + description: What issues or questions still remain unadressed? + placeholder: Identify any unresolved issues or questions. + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..ec4bb38 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false \ No newline at end of file diff --git a/.github/LICENSE.md b/.github/LICENSE.md new file mode 100644 index 0000000..0984e3f --- /dev/null +++ b/.github/LICENSE.md @@ -0,0 +1,194 @@ +Apache License +============== + +_Version 2.0, January 2004_ +_<<http://www.apache.org/licenses/>>_ + +# TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +## 1. Definitions + +“License” shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +“Licensor” shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +“Legal Entity” shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, “control” means **(i)** the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the +outstanding shares, or **(iii)** beneficial ownership of such entity. + +“You” (or “Your”) shall mean an individual or Legal Entity exercising +permissions granted by this License. + +“Source” form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +“Object” form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +“Work” shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +“Derivative Works” shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +“Contribution” shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +“submitted” means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as “Not a Contribution.” + +“Contributor” shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +## 2. Grant of Copyright License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +## 3. Grant of Patent License + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +## 4. Redistribution + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +* **(a)** You must give any other recipients of the Work or Derivative Works a copy of +this License; and +* **(b)** You must cause any modified files to carry prominent notices stating that You +changed the files; and +* **(c)** You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +* **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. + +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +## 5. Submission of Contributions + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +## 6. Trademarks + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +## 7. Disclaimer of Warranty + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +## 8. Limitation of Liability + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +## 9. Accepting Warranty or Additional Liability + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +_END OF TERMS AND CONDITIONS_ + +# APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets `[]` replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same “printed page” as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..7753d41 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,11 @@ +Please go the the `Preview` tab and select the appropriate sub-template: + +[**Contributor PR**](?expand=1&template=PR_Template_Contributor.md) + +[Version Upgrade **(for Admins)**](?expand=1&template=PR_Template_VersionUpgrade.md) + + +<!--- If you have no idea, time, what so ever, you can also continue here without using a pull request template--> +<!--- Please keep in mind that if you use this short cut, your PR is lees likely to be merged, because of missing information.--> +## Pull Request Short Cut +<!--- Describe your changes briefly. If you need some space to describe, please use the contributor template as mentioned at the top--> \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/PR_Template_Contributor.md b/.github/PULL_REQUEST_TEMPLATE/PR_Template_Contributor.md new file mode 100644 index 0000000..4d41717 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/PR_Template_Contributor.md @@ -0,0 +1,32 @@ + +# Contributor Pull Request +<!--- Provide a general summary of your changes in the Title above --> + +## Description +<!--- Describe your changes in detail --> + +## Motivation and Context +<!--- Why is this change required? What problem does it solve? --> +<!--- If it fixes an open issue, please link to the issue here. --> +<!--- If it full fills an open feature request, please link to the feature request here. --> + +## How has this been tested? +<!--- Please describe in detail how you tested your changes. --> +<!--- Include details of your testing environment, especially --> +<!--- the software you teste your change with. --> +<!--- Are other areas of the specification affected? --> + +## Snippets or Screenshots (if necessary): + +## Types of changes +<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: --> +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) + +## Checklist: +<!--- Go over all the following points, and put an `x` in all the boxes that apply. --> +<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! --> +- [ ] My code follows the code style of this IG / specification. +- [ ] My change requires a change to the documentation or narrative (intend) of the IG. +- [ ] I have already updated the documentation / narrative (intend) accordingly. \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE/PR_Template_VersionUpgrade.md b/.github/PULL_REQUEST_TEMPLATE/PR_Template_VersionUpgrade.md new file mode 100644 index 0000000..27bd178 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/PR_Template_VersionUpgrade.md @@ -0,0 +1,54 @@ +# Version Upgrade Template +<!--- parameters of your upgrade --> + +Version: + +Date: + +## Description +<!--- CAVEAT: You to be an admin to perform all the necessary jobs. --> +This is a Pullreuqest that requires an increase in the Version number. Therefore, multiple outside-github, related Task have to be performed and checked. + +All jobs with an `x` in the boxes were performed to the best of knowledge. + +## Pre-Merge Activities +<!--- Lets check everything before we continue. --> +- [ ] This PR refers to a versioned Branch with a name and a version number in the form of N.n.n, e.g. "TC_3.2.1". +- [ ] This PR has a clean meaningful committ history. Minor committs or committs without descirption have been squashed, at the latest now. +- [ ] The _./github/workflows/main.yml_ refers to the correct Firetly Terminal and SUSHI Version. + > **_Firely Terminal Pipeline_** 0.4.0. + + > **_SUSHI Versions_** 3.5.0. +- [ ] By running the _Release_Publish.py_ script, release version and date was updated accordingly. The script ran without errors. +- [ ] Eventually, increase the dependency of to newer Basis Modul (package and sushi-config) +- [ ] New Release Notes were created, aglined to the committ history and cleaned. In Github, go to + - [ ] _-> Releases_ then _-> Draft a new release_ with the _Modul Name and Version_, then + - [ ] _-> Target the main-Branch_ and _->enter a new Tag according to the Version_, then click. + - [ ] Click _-> Generate Release notes_ , _->Adjust them if necessary_ and _-> Copy/Paste the Details in the RealeaseNotes.md_ of the very Branch you want to merge. + - [ ] Finally _-> Save as Draft_ + +## Merge and Publishing +<!--- Now lets do the merge. --> +<!--- Include details of your testing environment, especially --> +- [ ] With the updated Version, Dates, and Release Notes (as described above) with the last committ into the Branch you want to merge. +- [ ] In GitHub _-> Actions_ the _->CI (FHIR Validation)_ workflow terminates successfully. +- [ ] Add the Approve / the PR gets posivitly reviewed by a collegue. +- [ ] Merge (without squash) the PR, delete the Branch. + + +## Post-Merge Activities +<!--- Do some update, refreshe and cleanup of related resources. --> + +- [ ] Go to the corresponding SIMPLIFIER Project and _-> Github -> Reimport_ the project. +- [ ] Go to the corresponding SIMPLIFIER Project and _-> Packages -> Expand the Dropdown for Create -> Create new package_ for the project. + - [ ] With the corresponding version number, and + - [ ] The Release notes (from above) and a compare-link to the previous Release. +- [ ] Publish the previosuly drafteted Release, including version number, on GitHub. +- [ ] Provide / Archive the IG in the corresponding _gh-pages_ branch of the GitHub project. + - [ ] Checkout the Branch (no need to merge it later). + - [ ] Export from Simplifier via _-> Guides -> Expand the Modul ... -> Export_ + - [ ] Unpack the zip, remove the packages folder (because its kinda big), and move everything else to a (version coressponding) new folder in the branch folder structure. + - [ ] committ the branch. + + +## Finished diff --git a/.github/SECURITY.md b/.github/SECURITY.md new file mode 100644 index 0000000..9e1731f --- /dev/null +++ b/.github/SECURITY.md @@ -0,0 +1,6 @@ +# Security Policy + +Since this software is not a productive version, please submit an issue or pull request for any bugs or vulnerabilities you find. + +In case of a responsible disclosure, please follow instructions +on https://www.gematik.de/datensicherheit#c1227. diff --git a/.github/workflows/RenderAllDiagrams.yml b/.github/workflows/RenderAllDiagrams.yml new file mode 100644 index 0000000..e01d80e --- /dev/null +++ b/.github/workflows/RenderAllDiagrams.yml @@ -0,0 +1,102 @@ +name: Render All Diagrams + +on: + push: + paths: + - '**/Material/images/src/**/*.puml' + - '**/Material/images/src/**/*.drawio' + branches-ignore: + - 'main**' + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - name: Checkout repository + uses: actions/checkout@v4 + + # Installs Java distribution for running the plantUML jar + - name: Install Java + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + check-latest: true + + # Install graphviz for plantuml + - name: Setup Graphviz + uses: ts-graphviz/setup-graphviz@v2 + + # Download plantUML jar + - name: Download plantuml file + run: | + wget -O plantuml.jar "https://github.com/plantuml/plantuml/releases/latest/download/plantuml.jar" + + # Clean Folder + - name: Ensure and clean folder + run: | + img_dir=Material/images/diagrams + mkdir -p $img_dir + rm -rf Material/images/diagrams/*.svg + + # Generate the SVGs from PUML + - name: Render PUML to SVG and Move files + run: | + FileNamePaths=$(find . -path "*/images/src/*/*.puml" -exec dirname {} \; | sort -u) + for dir in $FileNamePaths + do + # Render SVGs from PUMLs + find $dir -name "*.puml" -exec java -jar plantuml.jar -tsvg {} \; + done + + # Remove plantUML jar + - name: remove plantuml file + run: | + rm -f plantuml.jar + + # Generate the SVGs from DrawIO + - name: Render DrawIO to SVG with predefined action + uses: rlespinasse/drawio-export-action@v2 + with: + path: ./Material/images/src/drawio/ + remove-page-suffix: true + output: . + format: svg + action-mode: all + + # copies the created SVG files to the images/diagrams folder and deletes the drawio files + - name: Move SVGs to target image folder + run: | + img_dir=Material/images/diagrams + # Find all unique directories containing *.SVGs files under any /imgsrc/ folder + FileNamePaths=$(find . -path "*/images/src/*/*.svg" -exec dirname {} \; | sort -u) + for dir in $FileNamePaths + do + # Move SVGs to out directory + find $dir -name "*.svg" -exec mv {} $img_dir \; + done + + ## add and commit the new generated files + #- name: Create Pull Request + # uses: peter-evans/create-pull-request@v5 + # with: + # branch: auto/images-generation + # commit-message: Generated Images from source Code by GitHub Action + # title: Generated Images from GitHub Action + # assignees: ${{ github.actor }} + # reviewers: ${{ github.actor }} + # delete-branch: true + # labels: automated pr + + - name: Commit rendered files + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_user_name: GitHub Actions Bot + commit_user_email: ActionBot@github.com + commit_message: auto-generated diagrams by GitHub Action after source code change \ No newline at end of file diff --git a/.github/workflows/RenderPlantUML.yml b/.github/workflows/RenderPlantUML.yml new file mode 100644 index 0000000..cf78f9e --- /dev/null +++ b/.github/workflows/RenderPlantUML.yml @@ -0,0 +1,72 @@ +name: Render PlantUML diagrams + +on: + push: + paths: + - '**/Material/imgsrc/**/*.puml' + branches-ignore: + - main** + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install dependencies + run: | + sudo apt-get install -y graphviz + wget -O plantuml.jar "https://github.com/plantuml/plantuml/releases/latest/download/plantuml.jar" + + - name: Render and Move PNG files + run: | + # Find all unique directories containing *.puml files under any /imgsrc/ folder + directories=$(find . -path "*/imgsrc/*/*.puml" -exec dirname {} \; | sort -u) + for dir in $directories; do + # Generate the corresponding out directory path + out_dir=ImplementationGuide/images/diagrams + mkdir -p $out_dir + + # Render PNGs from PUMLs + find $dir -name "*.puml" -exec java -jar plantuml.jar -tpng {} \; + + # Move PNGs to out directory + find $dir -name "*.png" -exec mv {} $out_dir \; + done + + # Remove plantUML jar + - name: remove plantuml file + run: | + rm -f plantuml.jar + + # # add and commit the new generated files + #- name: Create Pull Request + # uses: peter-evans/create-pull-request@v5 + # with: + # branch: auto/images-generation + # commit-message: Generated Images from source Code by GitHub Action + # title: Generated Images from GitHub Action + # assignees: ${{ github.actor }} + # reviewers: ${{ github.actor }} + # delete-branch: true + # labels: automated pr + + #- name: Commit and push + # run: | + # git config --local user.email "action@github.com" + # git config --local user.name "GitHub Action" + # git add -A + # git commit -m "Add rendered PlantUML to PNG diagrams" || exit 0 + # git push + + - name: Commit rendered files + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_user_name: GitHub Actions Bot + commit_user_email: ActionBot@github.com + commit_message: auto-generated diagrams by GitHub Action after source code change \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..61545d7 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,55 @@ +# This is a basic workflow to help you get started with Actions + +name: CI (FHIR Validation) + +# Controls when the action will run. +on: + # Triggers the workflow on all push or pull request events but only for the main branches + push: + branches: [ main* ] + pull_request: + branches: [ main* ] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + + # Validate all resources using Firely Terminal + CI_FHIR_VALIDATION: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - name: Checkout code + uses: actions/checkout@v2 + + # Java and .NET are already installed on ubuntu-latest + + - name: Firely.Terminal (GitHub Actions) + uses: FirelyTeam/firely-terminal-pipeline@v0.4.0 + with: + PATH_TO_CONFORMANCE_RESOURCES: Resources/fsh-generated/resources/ + #PATH_TO_EXAMPLES: Examples + PATH_TO_QUALITY_CONTROL_RULES: qc/custom + DOTNET_VALIDATION_ENABLED: true + JAVA_VALIDATION_ENABLED: true + OUTPUT_FORMAT: RAW + JAVA_VALIDATION_OPTIONS: -allow-example-urls true + SIMPLIFIER_USERNAME: ${{ secrets.SIMPLIFIER_USERNAME }} + SIMPLIFIER_PASSWORD: ${{ secrets.SIMPLIFIER_PASSWORD }} + SUSHI_ENABLED: true + SUSHI_VERSION: 3.5.0 + SUSHI_OPTIONS: Resources/ + EXPECTED_FAILS: VALIDATION_CONFORMANCE_DOTNET VALIDATION_CONFORMANCE_JAVA VALIDATION_EXAMPLES_JAVA + + # - name: Add & Commit + # uses: EndBug/add-and-commit@v7 + # with: + # add: 'Resources/fsh-generated/resources/' + + - name: Check for Uncommitted Changes + run: | + git diff --exit-code 'Resources/fsh-generated/resources'|| (echo "Es gibt Änderungen durch die Pipeline. Lokale Sushi Konfiguration prüfen!" && exit 1) \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5855e63 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +scripts/downloaded_validation_script.sh +scripts/validation_script-config.yaml +validation_results/** +fhirpkg.lock.json diff --git a/.vscode/keybindings.json b/.vscode/keybindings.json new file mode 100644 index 0000000..79192d7 --- /dev/null +++ b/.vscode/keybindings.json @@ -0,0 +1,11 @@ +[ + { + "key": "f5", + "command": "workbench.action.tasks.runTask", + "args": "buildWithReplaceIncludes" + }, + { + "key": "f5", + "command": "-workbench.action.debug.start" + } +] diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..7359920 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "buildWithReplaceIncludes", + "type": "shell", + "command": "./resources/scripts/build_with_replace_includes.sh", + "problemMatcher": [], + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..c38a26e --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +## Code of Conduct + +### Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +### Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +### Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +### Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +### Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +### Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..8ab8042 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,67 @@ +# Welcome to the gematik contributing guide <!-- omit in toc --> + +Thank you for investing your time in contributing to our projects! + +Read our [Code of Conduct](./CODE_OF_CONDUCT.md) to keep our community approachable and respectable. + +In this guide you will get an overview how you can contribute to our projects by opening an issue, creating, reviewing and merging a pull request. + +Use the table of contents icon on the top left corner of this document to get to a specific section of this guide quickly. + +## Reporting a security vulnerability + +Due to their public nature, GitHub and mailing lists are not appropriate places for reporting vulnerabilities. +Please refer to gematik's [security disclosure](gematik...) process when reporting issues that may be security related. + +## New contributor guide + +To get an overview of the project, read the [README](./README.md). + +## Getting started + +### Issues + +#### Create a new issue + +If you spot a problem with the docs, search if an issue already exists. +If a related issue doesn't exist, you can open a new issue. + +#### Solve an issue + +Scan through our existing issues to find one that interests you. If you find an issue to work on, you are welcome to open a PR with a fix. + +### Coding Style + +gematik projects follow the [google style guide](https://github.com/google/styleguide) conventions. Please follow them when working on your contributions. + +### Code Coverage, Sonars, OWASP, Code format, etc. + +- +- +- + + +### Commit your update + +Commit the changes once you are happy with them. + +### Pull Request Process + +- When you're finished with the changes, create a pull request, also known as a PR. +- Fill the pull request template so that we can review your PR. This template helps reviewers to understand your changes as well as the purpose of your pull request. +- Don't forget to [link the PR to the issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) if you are solving one. +- Update the [README.md](./README.md), the documentation and the [ReleaseRotes.md](./ReleaseNotes.md) with all details to document the changes made by this PR. +- Increase the version numbers in any necessary files and the [readme](./README.md) to the new version that this + Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). +- Once you submit your PR, a project team member will review your proposal. We may ask questions or request additional information. +- We may ask for changes to be made before a PR can be merged, either using [suggested changes](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/incorporating-feedback-in-your-pull-request) + or pull request comments. You can apply suggested changes directly through the UI. You can make any other changes in your fork, then commit them to your branch. +- As you update your PR and apply changes, mark each conversation as [resolved](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request#resolving-conversations). +- You may merge the Pull Request in once you have the sign-off of two other developers, or if you + do not have permission to do that, you may request the second reviewer to merge it for you. + +### Your PR is merged! + +Congratulations :tada::tada: The gematik team thanks you :sparkles:. + +Once your PR is merged, your contributions will be publicly visible on the [gematik github page](https://github.com/gematik/). \ No newline at end of file diff --git a/ExternalDependencies/readme.txt b/ExternalDependencies/readme.txt new file mode 100644 index 0000000..77bcdfb --- /dev/null +++ b/ExternalDependencies/readme.txt @@ -0,0 +1,2 @@ +This folder can contain project specific fhir ressources which are not part of a official fhir package but needed for the validation of the profiles in this repository. +The content of this folder will be copied to the local `~/.fhir`-folder at each start of the `validate-sh` script \ No newline at end of file diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 0000000..40cf695 --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,36 @@ +# Create the repository on GitHub +1. Request a new repository by creating a [OSPO ticket](https://service.gematik.de/secure/CreateIssue!default.jspa) + * Provide the [needed information](https://wiki.gematik.de/display/OSPO/GitHub+Berechtigungen#GitHubBerechtigungen-Anfordern) to the ticket + * The name should correspond to "spec-[NameOfYourSimplifierProject]" naming convention + * While creating this ticket, additionally provide information that + * you want to create your repository by cloning from "spec-TemplateForSimplifierProjects", so that a new repository will be created for you which is based on the [template repository](https://github.com/gematik/spec-TemplateForSimplifierProjects) + * you need appropriate access privileges to manipulate the settings of the new repository + + <br/> + +2. Your new repository is getting created, give it some time. After creation, the ticket will be set to DONE-state and your repository will be findable in the [repositories list](https://github.com/orgs/gematik/repositories) +3. Add your repository to our [GitHub Projects page](https://wiki.gematik.de/display/QM/GitHub+Projects) and leave the needed details + + <br/> + +# Configure the repository on GitHub +* Configure some settings to prepare your repository for the intended behaviour + * Settings > Actions > General > check + * "Allow all actions and reusable workflows" + * "Read and write permissions" + * "Allow GitHub Actions to create and approve pull requests" + * save! + * Settings > Secrets > Actions > create repository secrets > New repository secret + * Name: SIMPLIFIER_USERNAME, Secret: *your simplifier username* + * Name: SIMPLIFIER_PASSWORD, Secret: *your simplifier password* + * Settings > Branches > Branch protection rule > Add branch protection rule > check + * enter branch name pattern "*" + * "Require a pull request before merging" + * "Require approvals" + * "Require status checks to pass before merging" + * "Require branches to be up to date before merging" + * save + +Now you can clone your repository to your local machine. + +<br/> diff --git a/ImplementationGuide/Einfuehrung.md b/ImplementationGuide/Einfuehrung.md new file mode 100644 index 0000000..f0fa0cd --- /dev/null +++ b/ImplementationGuide/Einfuehrung.md @@ -0,0 +1,24 @@ +Bitte Ins Markdown schauen, um zu sehen wie SVGs einzubinden sind. + +<img src="https://raw.githubusercontent.com/gematik/spec-TemplateForSimplifierProjects/main/Material/images/Gematik_Logo_Flag.svg" alt="gematik logo" width="400"/> + +---- +Version: 3.0.1 + +Datum: 12.01.2024 + +Status: Aktiv + +Realm: Deutschland + +---- + +# Interoperabler Datenaustausch durch Informationssysteme im Beispiel (ISiK) + +Die gematik wurde vom Gesetzgeber beauftragt, im Benehmen mit der Deutschen Krankenhausgesellschaft (DKG) und den maßgeblichen Bundesverbänden der Industrie im Gesundheitswesen, verbindliche Standards für den Austausch von Gesundheitsdaten mit Informationssystemen im Krankenhaus zu erarbeiten. Dieser FHIR ImplementationGuide (IG) beschreibt die für diesen Zweck entwickelten FHIR Profile und das [REST](https://de.wikipedia.org/wiki/Representational_State_Transfer)-basierte Application Programming Interface (API). Die REST-API wird im Wesentlichen [vom FHIR Standard vorgegeben](https://www.hl7.org/fhir/R4/http.html). Dieser Leitfaden konkretisiert die ISiK-relevanten Funktionen der Standard-REST-API und trifft inhaltliche Festlegungen zu den ISiK-relevanten Ressourcen in Form von Ressourcen-Profilen. + +Hersteller bestätigungsrelevanter Systeme sollen durch diesen IG in die Lage versetzt werden, eine konforme Implementierung zu erstellen und das Bestätigungsverfahren der gematik erfolgreich zu absolvieren. + +Weitere Informationen siehe [§373 SGB V](https://www.gesetze-im-internet.de/sgb_5/__373.html). + +Hinweis: Sowohl für die Implementierung der ISiK-Spezifikation als auch für den Betrieb eines Produktes, das die ISiK-Spezifikation implementiert, ist eine SNOMED-CT-Lizenz notwendig. Diese kann beim [National Release Center für SNOMED CT in Deutschland](https://www.bfarm.de/DE/Kodiersysteme/Terminologien/SNOMED-CT/_node.html) beantragt werden. diff --git a/ImplementationGuide/ReleaseNotes.md b/ImplementationGuide/ReleaseNotes.md new file mode 100644 index 0000000..f4cd882 --- /dev/null +++ b/ImplementationGuide/ReleaseNotes.md @@ -0,0 +1,33 @@ +# Release Notes + +Im Rahmen des < PROJECT NAME > wird das [Semantic Versioning](https://semver.org/lang/de/) verwendet. + +Die erste Ziffer X bezeichnet ein Major-Release und regelt die Gültigkeit von Releases. Die dritte Ziffer Y (Release x.0.y) bezeichnet eine technische Korrektur und versioniert kleinere Änderungen (Packages) während eines Jahres, z. B. 1.0.1. + +Version: 3.0.1 < aktuelle Version> + +Datum: 08.01.2024 +< now a List of > +* Feature +* Bug Fix +* Change + +---- +Version: 3.0.0 < Vor-Version> + +Datum: 06.01.2024 + +* Feature +* Bug Fix +* Change + +---- +Version: 1.0.0 < Vor-Vor-Version> + +Datum: 04.01.2024 + +* Feature +* Bug Fix +* Change + +---- \ No newline at end of file diff --git a/Material/docs/Beispiel_MedikationsAbgleich.xlsx b/Material/docs/Beispiel_MedikationsAbgleich.xlsx new file mode 100644 index 0000000..8d7eb95 Binary files /dev/null and b/Material/docs/Beispiel_MedikationsAbgleich.xlsx differ diff --git a/Material/images/Gematik_Logo_Flag.svg b/Material/images/Gematik_Logo_Flag.svg new file mode 100644 index 0000000..2097670 --- /dev/null +++ b/Material/images/Gematik_Logo_Flag.svg @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.2" baseProfile="tiny" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + x="0px" y="0px" viewBox="0 0 400.33 74.22" xml:space="preserve"> +<rect x="2.33" y="1.96" fill="none" width="396.28" height="70.3"/> +<g> + <g> + <path d="M80.06,25.9H36.95c-2.09,0-3.78-1.69-3.78-3.78s1.69-3.78,3.78-3.78h43.11c2.09,0,3.78,1.69,3.78,3.78 + S82.15,25.9,80.06,25.9z"/> + </g> + <g> + <path fill="#E10000" d="M80.06,41.52H21.84c-2.09,0-3.78-1.69-3.78-3.78c0-2.09,1.69-3.78,3.78-3.78h58.22 + c2.09,0,3.78,1.69,3.78,3.78C83.84,39.83,82.15,41.52,80.06,41.52z"/> + </g> + <g> + <path fill="#FFCC00" d="M80.06,57.14H6.72c-2.09,0-3.78-1.69-3.78-3.78c0-2.09,1.69-3.78,3.78-3.78h73.34 + c2.09,0,3.78,1.69,3.78,3.78C83.84,55.45,82.15,57.14,80.06,57.14z"/> + </g> + <g> + <path fill="#000E52" d="M371.45,33.92h-0.3V3.36h-7.96v53.1h7.96V41.13h0.23l15.85,15.32H398l-19.8-19.27l19.65-17.14h-10.7 + L371.45,33.92z M342.78,56.45h7.96V20.04h-7.96V56.45z M346.72,2.6c-3.19,0-5.54,2.5-5.54,5.61c0,3.19,2.35,5.54,5.54,5.54 + c3.19,0,5.61-2.35,5.61-5.54C352.33,5.1,349.91,2.6,346.72,2.6 M319.19,27.25h13.96v-7.21h-13.96V9.12h-7.96v33.91 + c0,9.71,4.85,14.18,13.05,14.18c4.63,0,8.27-1.67,11.15-3.64l-3.11-6.37c-2.2,1.37-4.85,2.5-7.36,2.5c-3.19,0-5.76-1.97-5.76-6.83 + V27.25z M284.52,50.99c-5.99,0-7.96-2.43-7.96-4.78c0-2.35,1.67-4.55,7.13-5.08l10.01-0.99v9.56 + C291.5,50.46,288.09,50.99,284.52,50.99 M285.28,19.28c-4.93,0-10.32,1.06-15.4,4.25l2.96,6.45c3.26-1.9,7.89-3.64,12.14-3.64 + c5.54,0,8.72,2.12,8.72,6.98v0.61l-9.03,0.91c-10.01,0.99-16.08,4.55-16.08,11.3c0,6.68,4.63,11.07,16.31,11.07 + c5.92,0,12.74-1.44,16.76-3.57V32.86C301.66,23.91,295.67,19.36,285.28,19.28 M245.38,19.28c-4.55,0-9.41,1.37-13.05,3.64 + c-2.88-2.43-6.98-3.64-11.91-3.64c-6.07,0-12.59,2.43-16.01,5.99v31.18h7.96l-0.08-27c2.88-2.28,5.92-2.73,8.87-2.73 + c5.01,0,7.96,2.96,7.96,8.12v21.62h7.96V34.83c0-1.97-0.23-3.72-0.68-5.31c2.28-1.67,5.46-2.81,8.72-2.81 + c4.78,0,7.96,2.5,7.96,8.12v21.62h7.96V34.83C261.08,24.52,255.09,19.28,245.38,19.28 M169.23,34.61 + c0.99-5.08,4.63-8.42,10.09-8.42c5.08,0,8.34,2.96,9.25,8.42H169.23z M196.68,37.64c0-11.15-7.05-18.36-17.22-18.36 + c-10.7,0-18.58,7.51-18.58,18.66c0,12.06,8.19,19.27,19.12,19.27c5.46,0,10.47-1.37,14.94-5.08l-3.94-6.3 + c-3.03,3.11-6.9,4.55-10.54,4.55c-5.31,0-10.77-2.65-11.45-9.79h27.54C196.61,39.69,196.68,38.63,196.68,37.64 M151.63,25.28 + c-4.7-4.78-11.68-5.99-16.23-5.99c-13.12,0-20.86,7.59-20.86,19.04c0,10.92,7.36,18.13,17.9,18.13c3.03,0,4.7-1.44,4.7-3.87 + c0-2.28-1.67-3.57-4.7-3.57c-5.84,0-9.94-4.17-9.94-10.7c0-7.05,4.48-11.61,12.44-11.61c2.58,0,6.3,0.68,8.42,2.73L143.28,56 + c0,5.61-5.08,8.19-11.38,8.19c-5.76,0-9.56-2.58-10.32-2.96c-3.11-1.52-6.14-0.08-6.14,2.88c0,5.01,9.1,7.51,16.54,7.51 + c11.07,0,19.65-4.85,19.65-15.63V25.28z"/> + </g> +</g> +</svg> diff --git a/Material/images/diagrams/Components_Example.png b/Material/images/diagrams/Components_Example.png new file mode 100644 index 0000000..1a81eb1 Binary files /dev/null and b/Material/images/diagrams/Components_Example.png differ diff --git a/Material/images/diagrams/Components_Example.svg b/Material/images/diagrams/Components_Example.svg new file mode 100644 index 0000000..7d303e1 --- /dev/null +++ b/Material/images/diagrams/Components_Example.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="130px" preserveAspectRatio="none" style="width:224px;height:130px;background:#FFFFFF;" version="1.1" viewBox="0 0 224 130" width="224px" zoomAndPan="magnify"><defs/><g><!--entity client--><g id="elem_client"><ellipse cx="199" cy="57.31" fill="#F1F1F1" rx="8" ry="8" style="stroke:#181818;stroke-width:0.5;"/><path d="M199,65.31 L199,92.31 M186,73.31 L212,73.31 M199,92.31 L186,107.31 M199,92.31 L212,107.31 " fill="none" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="37" x="180.5" y="121.8051">client</text></g><!--entity app--><g id="elem_app"><polygon fill="#F1F1F1" points="79,73.81,89,63.81,145,63.81,145,100.1069,135,110.1069,79,110.1069,79,73.81" style="stroke:#181818;stroke-width:0.5;"/><line style="stroke:#181818;stroke-width:0.5;" x1="135" x2="145" y1="73.81" y2="63.81"/><line style="stroke:#181818;stroke-width:0.5;" x1="79" x2="135" y1="73.81" y2="73.81"/><line style="stroke:#181818;stroke-width:0.5;" x1="135" x2="135" y1="73.81" y2="110.1069"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="26" x="94" y="96.8051">app</text></g><!--entity db--><g id="elem_db"><path d="M6,74.31 C6,64.31 25,64.31 25,64.31 C25,64.31 44,64.31 44,74.31 L44,99.6069 C44,109.6069 25,109.6069 25,109.6069 C25,109.6069 6,109.6069 6,99.6069 L6,74.31 " fill="#F1F1F1" style="stroke:#181818;stroke-width:0.5;"/><path d="M6,74.31 C6,84.31 25,84.31 25,84.31 C25,84.31 44,84.31 44,74.31 " fill="none" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="18" x="16" y="101.3051">db</text></g><!--link db to app--><g id="link_db_app"><path d="M44.03,86.81 C55.62,86.81 61.22,86.81 72.81,86.81 " fill="none" id="db-to-app" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="78.81,86.81,69.81,82.81,73.81,86.81,69.81,90.81,78.81,86.81" style="stroke:#181818;stroke-width:1.0;"/></g><!--link app to client--><g id="link_app_client"><path d="M145.3,86.81 C156.91,86.81 162.52,86.81 174.12,86.81 " fill="none" id="app-to-client" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="180.12,86.81,171.12,82.81,175.12,86.81,171.12,90.81,180.12,86.81" style="stroke:#181818;stroke-width:1.0;"/></g><!--link client to db--><g id="link_client_db"><path d="M180.42,51.65 C171.68,38.86 159.96,25.83 145.5,18.81 C119.11,6 105.94,6.11 79.5,18.81 C60,28.17 48.2793,43.0934 39.0793,59.0334 " fill="none" id="client-to-db" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="36.08,64.23,44.0433,58.4347,38.5794,59.8995,37.1145,54.4356,36.08,64.23" style="stroke:#181818;stroke-width:1.0;"/></g><!--SRC=[IqmkoIzIICx9JCqhuShBJqbLI2meu4f9B4bCIYnELKX9uk9AILBGjGCB0p682LKDeK02AKa0]--></g></svg> \ No newline at end of file diff --git a/Material/images/diagrams/Klassendiagramm_Example.png b/Material/images/diagrams/Klassendiagramm_Example.png new file mode 100644 index 0000000..320c3c0 Binary files /dev/null and b/Material/images/diagrams/Klassendiagramm_Example.png differ diff --git a/Material/images/diagrams/Klassendiagramm_Example.svg b/Material/images/diagrams/Klassendiagramm_Example.svg new file mode 100644 index 0000000..46c555c --- /dev/null +++ b/Material/images/diagrams/Klassendiagramm_Example.svg @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="757px" height="472px" viewBox="-0.5 -0.5 757 472"><defs><clipPath id="mx-clip-19-31-152-26-0"><rect x="19" y="31" width="152" height="26"/></clipPath><clipPath id="mx-clip-19-193-152-26-0"><rect x="19" y="193" width="152" height="26"/></clipPath><clipPath id="mx-clip-19-227-152-26-0"><rect x="19" y="227" width="152" height="26"/></clipPath><clipPath id="mx-clip-599-193-152-26-0"><rect x="599" y="193" width="152" height="26"/></clipPath><clipPath id="mx-clip-299-31-152-26-0"><rect x="299" y="31" width="152" height="26"/></clipPath><clipPath id="mx-clip-299-65-152-26-0"><rect x="299" y="65" width="152" height="26"/></clipPath><clipPath id="mx-clip-299-191-152-26-0"><rect x="299" y="191" width="152" height="26"/></clipPath><clipPath id="mx-clip-299-225-152-26-0"><rect x="299" y="225" width="152" height="26"/></clipPath><clipPath id="mx-clip-299-351-152-26-0"><rect x="299" y="351" width="152" height="26"/></clipPath><clipPath id="mx-clip-299-385-152-26-0"><rect x="299" y="385" width="152" height="26"/></clipPath></defs><g><path d="M 15 26 L 15 0 L 175 0 L 175 26" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 15 26 L 15 90 L 175 90 L 175 26" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 15 26 L 175 26" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="94.5" y="17.5">Medikations-Liste</text></g><rect x="15" y="26" width="160" height="26" fill="none" stroke="none" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" clip-path="url(#mx-clip-19-31-152-26-0)" font-size="12px"><text x="20.5" y="43.5">...</text></g><path d="M 15 56 L 175 56" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="15" y="60" width="160" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 158px; height: 1px; padding-top: 67px; margin-left: 17px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">...</div></div></div></foreignObject><text x="17" y="79" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">...</text></switch></g><path d="M 15 188 L 15 162 L 175 162 L 175 188" fill="#cccccc" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 15 188 L 15 248 L 175 248 L 175 188" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 15 188 L 175 188" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="94.5" y="179.5">Patient</text></g><rect x="15" y="188" width="160" height="26" fill="none" stroke="none" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" clip-path="url(#mx-clip-19-193-152-26-0)" font-size="12px"><text x="20.5" y="205.5">...</text></g><path d="M 15 218 L 175 218" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="15" y="222" width="160" height="26" fill="none" stroke="none" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-decoration="underline" clip-path="url(#mx-clip-19-227-152-26-0)" font-size="12px"><text x="20.5" y="239.5">...</text></g><path d="M 595 188 L 595 162 L 755 162 L 755 188" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 595 188 L 595 252 L 755 252 L 755 188" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 595 188 L 755 188" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="674.5" y="179.5">Medikament</text></g><rect x="595" y="188" width="160" height="26" fill="none" stroke="none" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" clip-path="url(#mx-clip-599-193-152-26-0)" font-size="12px"><text x="600.5" y="205.5">...</text></g><path d="M 595 218 L 755 218" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="595" y="222" width="160" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 158px; height: 1px; padding-top: 229px; margin-left: 597px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">...</div></div></div></foreignObject><text x="597" y="241" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px">...</text></switch></g><path d="M 175 43 L 235 43 L 292.76 43" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 286.88 46.5 L 293.88 43 L 286.88 39.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"><text x="186.5" y="35.5">0..*</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="end" font-size="12px"><text x="283.5" y="35.5">1..*</text></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 31px; margin-left: 236px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">enthält</div></div></div></foreignObject><text x="236" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">enthält</text></switch></g><path d="M 295 26 L 295 0 L 455 0 L 455 26" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 295 26 L 295 86 L 455 86 L 455 26" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 295 26 L 455 26" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="374.5" y="17.5">Medikations-Information</text></g><rect x="295" y="26" width="160" height="26" fill="none" stroke="none" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" clip-path="url(#mx-clip-299-31-152-26-0)" font-size="12px"><text x="300.5" y="43.5">...</text></g><path d="M 295 56 L 455 56" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="295" y="60" width="160" height="26" fill="none" stroke="none" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" clip-path="url(#mx-clip-299-65-152-26-0)" font-size="12px"><text x="300.5" y="77.5">...</text></g><path d="M 455 43 L 685.08 43 L 685.08 160.3" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 681.58 154.42 L 685.08 161.42 L 688.58 154.42" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"><text x="463.5" y="35.5">0..*</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="end" font-size="12px"><text x="676.58" y="147.42">1</text></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 30px; margin-left: 576px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">bezieht sich auf</div></div></div></foreignObject><text x="576" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">bezieht sich auf</text></switch></g><path d="M 295 186 L 295 160 L 455 160 L 455 186" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 295 186 L 295 246 L 455 246 L 455 186" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 295 186 L 455 186" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="374.5" y="177.5">Medikations-Verordnung</text></g><rect x="295" y="186" width="160" height="26" fill="none" stroke="none" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" clip-path="url(#mx-clip-299-191-152-26-0)" font-size="12px"><text x="300.5" y="203.5">...</text></g><path d="M 295 216 L 455 216" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="295" y="220" width="160" height="26" fill="none" stroke="none" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" clip-path="url(#mx-clip-299-225-152-26-0)" font-size="12px"><text x="300.5" y="237.5">...</text></g><path d="M 295 346 L 295 320 L 455 320 L 455 346" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 295 346 L 295 406 L 455 406 L 455 346" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 295 346 L 455 346" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="middle" font-size="12px"><text x="374.5" y="337.5">Medikations-Verabreichung</text></g><rect x="295" y="346" width="160" height="26" fill="none" stroke="none" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" clip-path="url(#mx-clip-299-351-152-26-0)" font-size="12px"><text x="300.5" y="363.5">...</text></g><path d="M 295 376 L 455 376" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><rect x="295" y="380" width="160" height="26" fill="none" stroke="none" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" clip-path="url(#mx-clip-299-385-152-26-0)" font-size="12px"><text x="300.5" y="397.5">...</text></g><path d="M 454.68 172.04 L 454.68 200 L 592.76 200" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 586.88 203.5 L 593.88 200 L 586.88 196.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"><text x="463.18" y="195.54">0..*</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="end" font-size="12px"><text x="573.22" y="195.5">1</text></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 211px; margin-left: 525px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">bezieht sich auf</div></div></div></foreignObject><text x="525" y="214" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">bezieht sich auf</text></switch></g><path d="M 455 350 L 682.68 350 L 682.68 256.52" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 686.18 262.4 L 682.68 255.4 L 679.18 262.4" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"><text x="463.5" y="345.5">0..*</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="end" font-size="12px"><text x="673.18" y="266.18">1</text></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 340px; margin-left: 575px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">bezieht sich auf</div></div></div></foreignObject><text x="575" y="344" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">bezieht sich auf</text></switch></g><path d="M 95 90 L 95 120 L 95 157.76" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 91.5 151.88 L 95 158.88 L 98.5 151.88" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"><text x="103.5" y="105.5">0..*</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="end" font-size="12px"><text x="113.5" y="155.5">1</text></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 131px; margin-left: 116px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">gilt für</div></div></div></foreignObject><text x="116" y="134" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">gilt für</text></switch></g><path d="M 306.2 88.57 L 306.2 124 L 145 124 L 145 157.76" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 141.5 151.88 L 145 158.88 L 148.5 151.88" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"><text x="314.7" y="104.07">0..*</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="end" font-size="12px"><text x="163.5" y="155.87">1</text></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 110px; margin-left: 218px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">gilt für</div></div></div></foreignObject><text x="218" y="113" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">gilt für</text></switch></g><path d="M 295 205 L 255 205 L 177.24 205" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 183.12 201.5 L 176.12 205 L 183.12 208.5" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"><text x="266.5" y="195.5">0..*</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="end" font-size="12px"><text x="193.5" y="195.5">1</text></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 191px; margin-left: 236px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">gilt für</div></div></div></foreignObject><text x="236" y="194" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">gilt für</text></switch></g><path d="M 293.56 362.85 L 95 363 L 95 250.24" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 98.5 256.12 L 95 249.12 L 91.5 256.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px"><text x="265.21" y="353.5">0..*</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" text-anchor="end" font-size="12px"><text x="113.5" y="265.21">1</text></g><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 351px; margin-left: 126px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;">gilt für</div></div></div></foreignObject><text x="126" y="355" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">gilt für</text></switch></g><rect x="0" y="450" width="750" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 460px; margin-left: 375px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; white-space: nowrap;"><b><i>Weitere Datenobjekte (z.B. Organisationen, Fachpersonen, Aufenthalte) sind hier zur besseren Übersichtlichkeit nicht dargestellt.</i></b></div></div></div></foreignObject><text x="375" y="464" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">Weitere Datenobjekte (z.B. Organisationen, Fachpersonen, Aufenthalte) sind hier zur besseren Übersichtlichkeit nicht dargeste...</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.drawio.com/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg> \ No newline at end of file diff --git a/Material/images/diagrams/nameInSource_Example.png b/Material/images/diagrams/nameInSource_Example.png new file mode 100644 index 0000000..e385afa Binary files /dev/null and b/Material/images/diagrams/nameInSource_Example.png differ diff --git a/Material/images/diagrams/nameInSource_Example.svg b/Material/images/diagrams/nameInSource_Example.svg new file mode 100644 index 0000000..d5292d6 --- /dev/null +++ b/Material/images/diagrams/nameInSource_Example.svg @@ -0,0 +1 @@ +<?xml version="1.0" encoding="us-ascii" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="86px" preserveAspectRatio="none" style="width:224px;height:86px;background:#FFFFFF;" version="1.1" viewBox="0 0 224 86" width="224px" zoomAndPan="magnify"><defs/><g><!--entity client--><g id="elem_client"><ellipse cx="199" cy="14" fill="#F1F1F1" rx="8" ry="8" style="stroke:#181818;stroke-width:0.5;"/><path d="M199,22 L199,49 M186,30 L212,30 M199,49 L186,64 M199,49 L212,64 " fill="none" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="37" x="180.5" y="78.4951">client</text></g><!--entity app--><g id="elem_app"><polygon fill="#F1F1F1" points="79,30.5,89,20.5,145,20.5,145,56.7969,135,66.7969,79,66.7969,79,30.5" style="stroke:#181818;stroke-width:0.5;"/><line style="stroke:#181818;stroke-width:0.5;" x1="135" x2="145" y1="30.5" y2="20.5"/><line style="stroke:#181818;stroke-width:0.5;" x1="79" x2="135" y1="30.5" y2="30.5"/><line style="stroke:#181818;stroke-width:0.5;" x1="135" x2="135" y1="30.5" y2="66.7969"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="26" x="94" y="53.4951">app</text></g><!--entity db--><g id="elem_db"><path d="M6,31 C6,21 25,21 25,21 C25,21 44,21 44,31 L44,56.2969 C44,66.2969 25,66.2969 25,66.2969 C25,66.2969 6,66.2969 6,56.2969 L6,31 " fill="#F1F1F1" style="stroke:#181818;stroke-width:0.5;"/><path d="M6,31 C6,41 25,41 25,41 C25,41 44,41 44,31 " fill="none" style="stroke:#181818;stroke-width:0.5;"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="18" x="16" y="57.9951">db</text></g><!--link db to app--><g id="link_db_app"><path d="M44.03,43.5 C55.62,43.5 61.22,43.5 72.81,43.5 " fill="none" id="db-to-app" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="78.81,43.5,69.81,39.5,73.81,43.5,69.81,47.5,78.81,43.5" style="stroke:#181818;stroke-width:1.0;"/></g><!--link app to client--><g id="link_app_client"><path d="M145.3,43.5 C156.91,43.5 162.52,43.5 174.12,43.5 " fill="none" id="app-to-client" style="stroke:#181818;stroke-width:1.0;"/><polygon fill="#181818" points="180.12,43.5,171.12,39.5,175.12,43.5,171.12,47.5,180.12,43.5" style="stroke:#181818;stroke-width:1.0;"/></g><!--SRC=[IqmkoIzIICx9JCqhuShBJqbLI2meu4f9B4bCIYnELKX9uk9AILBGjGCB0p682L4D0000]--></g></svg> \ No newline at end of file diff --git a/Material/images/src/drawio/Klassendiagramm_Example.drawio b/Material/images/src/drawio/Klassendiagramm_Example.drawio new file mode 100644 index 0000000..8e160a1 --- /dev/null +++ b/Material/images/src/drawio/Klassendiagramm_Example.drawio @@ -0,0 +1,292 @@ +<mxfile host="65bd71144e"> + <diagram id="C5RBs43oDa-KdzZeNtuy" name="Example"> + <mxGraphModel dx="1044" dy="445" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="WIyWlLk6GJQsqaUBKTNV-0"/> + <mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0"/> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--0" value="Medikations-Liste" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxGeometry x="40" y="80" width="160" height="90" as="geometry"> + <mxRectangle x="230" y="140" width="160" height="26" as="alternateBounds"/> + </mxGeometry> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--1" value="..." style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--0" vertex="1"> + <mxGeometry y="26" width="160" height="26" as="geometry"/> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--4" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--0" vertex="1"> + <mxGeometry y="52" width="160" height="8" as="geometry"/> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-2" value="..." style="text;whiteSpace=wrap;html=1;" parent="zkfFHV4jXpPFQw0GAbJ--0" vertex="1"> + <mxGeometry y="60" width="160" height="30" as="geometry"/> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--6" value="Patient" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;labelBackgroundColor=none;fillColor=#CCCCCC;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxGeometry x="40" y="242" width="160" height="86" as="geometry"> + <mxRectangle x="130" y="380" width="160" height="26" as="alternateBounds"/> + </mxGeometry> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--7" value="..." style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--6" vertex="1"> + <mxGeometry y="26" width="160" height="26" as="geometry"/> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--9" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--6" vertex="1"> + <mxGeometry y="52" width="160" height="8" as="geometry"/> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--10" value="..." style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontStyle=4" parent="zkfFHV4jXpPFQw0GAbJ--6" vertex="1"> + <mxGeometry y="60" width="160" height="26" as="geometry"/> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--13" value="Medikament" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxGeometry x="620" y="242" width="160" height="90" as="geometry"> + <mxRectangle x="340" y="380" width="170" height="26" as="alternateBounds"/> + </mxGeometry> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--14" value="..." style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--13" vertex="1"> + <mxGeometry y="26" width="160" height="26" as="geometry"/> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--15" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--13" vertex="1"> + <mxGeometry y="52" width="160" height="8" as="geometry"/> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-1" value="..." style="text;whiteSpace=wrap;html=1;" parent="zkfFHV4jXpPFQw0GAbJ--13" vertex="1"> + <mxGeometry y="60" width="160" height="30" as="geometry"/> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--26" value="" style="endArrow=open;shadow=0;strokeWidth=1;rounded=0;endFill=1;edgeStyle=elbowEdgeStyle;elbow=vertical;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--0" target="zkfFHV4jXpPFQw0GAbJ--17" edge="1"> + <mxGeometry x="0.5" y="41" relative="1" as="geometry"> + <mxPoint x="380" y="192" as="sourcePoint"/> + <mxPoint x="540" y="192" as="targetPoint"/> + <mxPoint x="-40" y="32" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--27" value="0..*" style="resizable=0;align=left;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="zkfFHV4jXpPFQw0GAbJ--26" connectable="0" vertex="1"> + <mxGeometry x="-1" relative="1" as="geometry"> + <mxPoint x="10" y="-3" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--28" value="1..*" style="resizable=0;align=right;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="zkfFHV4jXpPFQw0GAbJ--26" connectable="0" vertex="1"> + <mxGeometry x="1" relative="1" as="geometry"> + <mxPoint x="-10" y="-3" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--29" value="enthält" style="text;html=1;resizable=0;points=[];;align=center;verticalAlign=middle;labelBackgroundColor=none;rounded=0;shadow=0;strokeWidth=1;fontSize=12;" parent="zkfFHV4jXpPFQw0GAbJ--26" vertex="1" connectable="0"> + <mxGeometry x="0.5" y="49" relative="1" as="geometry"> + <mxPoint x="-30" y="36" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--17" value="Medikations-Information" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxGeometry x="320" y="80" width="160" height="86" as="geometry"> + <mxRectangle x="550" y="140" width="160" height="26" as="alternateBounds"/> + </mxGeometry> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--18" value="..." style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--17" vertex="1"> + <mxGeometry y="26" width="160" height="26" as="geometry"/> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--23" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--17" vertex="1"> + <mxGeometry y="52" width="160" height="8" as="geometry"/> + </mxCell> + <mxCell id="zkfFHV4jXpPFQw0GAbJ--24" value="..." style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="zkfFHV4jXpPFQw0GAbJ--17" vertex="1"> + <mxGeometry y="60" width="160" height="26" as="geometry"/> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-17" value="" style="endArrow=open;shadow=0;strokeWidth=1;rounded=0;endFill=1;edgeStyle=elbowEdgeStyle;elbow=vertical;entryX=0.563;entryY=0.006;entryDx=0;entryDy=0;entryPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--17" target="zkfFHV4jXpPFQw0GAbJ--13" edge="1"> + <mxGeometry x="0.5" y="41" relative="1" as="geometry"> + <mxPoint x="490" y="110" as="sourcePoint"/> + <mxPoint x="620" y="122.71714285714289" as="targetPoint"/> + <mxPoint x="-40" y="32" as="offset"/> + <Array as="points"> + <mxPoint x="650" y="123"/> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-18" value="0..*" style="resizable=0;align=left;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-17" connectable="0" vertex="1"> + <mxGeometry x="-1" relative="1" as="geometry"> + <mxPoint x="7" y="-3" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-19" value="1" style="resizable=0;align=right;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-17" connectable="0" vertex="1"> + <mxGeometry x="1" relative="1" as="geometry"> + <mxPoint x="-7" y="-11" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-20" value="bezieht sich auf" style="text;html=1;resizable=0;points=[];;align=center;verticalAlign=middle;labelBackgroundColor=none;rounded=0;shadow=0;strokeWidth=1;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-17" vertex="1" connectable="0"> + <mxGeometry x="0.5" y="49" relative="1" as="geometry"> + <mxPoint x="-159" y="-45" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-21" value="Medikations-Verordnung" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxGeometry x="320" y="240" width="160" height="86" as="geometry"> + <mxRectangle x="550" y="140" width="160" height="26" as="alternateBounds"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-22" value="..." style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="-zzV5CLyMU1CWvgltZj0-21" vertex="1"> + <mxGeometry y="26" width="160" height="26" as="geometry"/> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-23" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="-zzV5CLyMU1CWvgltZj0-21" vertex="1"> + <mxGeometry y="52" width="160" height="8" as="geometry"/> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-24" value="..." style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="-zzV5CLyMU1CWvgltZj0-21" vertex="1"> + <mxGeometry y="60" width="160" height="26" as="geometry"/> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-25" value="Medikations-Verabreichung" style="swimlane;fontStyle=0;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;strokeWidth=1;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxGeometry x="320" y="400" width="160" height="86" as="geometry"> + <mxRectangle x="550" y="140" width="160" height="26" as="alternateBounds"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-26" value="..." style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="-zzV5CLyMU1CWvgltZj0-25" vertex="1"> + <mxGeometry y="26" width="160" height="26" as="geometry"/> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-27" value="" style="line;html=1;strokeWidth=1;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;" parent="-zzV5CLyMU1CWvgltZj0-25" vertex="1"> + <mxGeometry y="52" width="160" height="8" as="geometry"/> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-28" value="..." style="text;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="-zzV5CLyMU1CWvgltZj0-25" vertex="1"> + <mxGeometry y="60" width="160" height="26" as="geometry"/> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-29" value="" style="endArrow=open;shadow=0;strokeWidth=1;rounded=0;endFill=1;edgeStyle=elbowEdgeStyle;elbow=vertical;exitX=0.998;exitY=0.14;exitDx=0;exitDy=0;exitPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="-zzV5CLyMU1CWvgltZj0-21" target="zkfFHV4jXpPFQw0GAbJ--13" edge="1"> + <mxGeometry x="0.5" y="41" relative="1" as="geometry"> + <mxPoint x="490" y="133" as="sourcePoint"/> + <mxPoint x="660.0799999999999" y="250.53999999999996" as="targetPoint"/> + <mxPoint x="-40" y="32" as="offset"/> + <Array as="points"> + <mxPoint x="540" y="280"/> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-30" value="0..*" style="resizable=0;align=left;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-29" connectable="0" vertex="1"> + <mxGeometry x="-1" relative="1" as="geometry"> + <mxPoint x="7" y="28" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-31" value="1" style="resizable=0;align=right;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-29" connectable="0" vertex="1"> + <mxGeometry x="1" relative="1" as="geometry"> + <mxPoint x="-20" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-32" value="bezieht sich auf" style="text;html=1;resizable=0;points=[];;align=center;verticalAlign=middle;labelBackgroundColor=none;rounded=0;shadow=0;strokeWidth=1;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-29" vertex="1" connectable="0"> + <mxGeometry x="0.5" y="49" relative="1" as="geometry"> + <mxPoint x="-28" y="59" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-33" value="" style="endArrow=open;shadow=0;strokeWidth=1;rounded=0;endFill=1;edgeStyle=elbowEdgeStyle;elbow=vertical;entryX=0.548;entryY=1.076;entryDx=0;entryDy=0;entryPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="-zzV5CLyMU1CWvgltZj0-25" target="-zzV5CLyMU1CWvgltZj0-1" edge="1"> + <mxGeometry x="0.5" y="41" relative="1" as="geometry"> + <mxPoint x="489.68000000000006" y="262.03999999999996" as="sourcePoint"/> + <mxPoint x="630" y="290" as="targetPoint"/> + <mxPoint x="-40" y="32" as="offset"/> + <Array as="points"> + <mxPoint x="560" y="430"/> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-34" value="0..*" style="resizable=0;align=left;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-33" connectable="0" vertex="1"> + <mxGeometry x="-1" relative="1" as="geometry"> + <mxPoint x="7" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-35" value="1" style="resizable=0;align=right;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-33" connectable="0" vertex="1"> + <mxGeometry x="1" relative="1" as="geometry"> + <mxPoint x="-8" y="16" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-36" value="bezieht sich auf" style="text;html=1;resizable=0;points=[];;align=center;verticalAlign=middle;labelBackgroundColor=none;rounded=0;shadow=0;strokeWidth=1;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-33" vertex="1" connectable="0"> + <mxGeometry x="0.5" y="49" relative="1" as="geometry"> + <mxPoint x="-59" y="5" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-37" value="" style="endArrow=open;shadow=0;strokeWidth=1;rounded=0;endFill=1;edgeStyle=elbowEdgeStyle;elbow=vertical;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="-zzV5CLyMU1CWvgltZj0-2" edge="1"> + <mxGeometry x="0.5" y="41" relative="1" as="geometry"> + <mxPoint x="489.68000000000006" y="262.03999999999996" as="sourcePoint"/> + <mxPoint x="120" y="240" as="targetPoint"/> + <mxPoint x="-40" y="32" as="offset"/> + <Array as="points"> + <mxPoint x="160" y="200"/> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-38" value="0..*" style="resizable=0;align=left;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-37" connectable="0" vertex="1"> + <mxGeometry x="-1" relative="1" as="geometry"> + <mxPoint x="7" y="20" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-39" value="1" style="resizable=0;align=right;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-37" connectable="0" vertex="1"> + <mxGeometry x="1" relative="1" as="geometry"> + <mxPoint x="20" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-40" value="gilt für" style="text;html=1;resizable=0;points=[];;align=center;verticalAlign=middle;labelBackgroundColor=none;rounded=0;shadow=0;strokeWidth=1;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-37" vertex="1" connectable="0"> + <mxGeometry x="0.5" y="49" relative="1" as="geometry"> + <mxPoint x="-29" y="-13" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-41" value="" style="endArrow=open;shadow=0;strokeWidth=1;rounded=0;endFill=1;edgeStyle=elbowEdgeStyle;elbow=vertical;exitX=0.07;exitY=1.099;exitDx=0;exitDy=0;exitPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="zkfFHV4jXpPFQw0GAbJ--24" edge="1"> + <mxGeometry x="0.5" y="41" relative="1" as="geometry"> + <mxPoint x="130" y="180" as="sourcePoint"/> + <mxPoint x="170" y="240" as="targetPoint"/> + <mxPoint x="-40" y="32" as="offset"/> + <Array as="points"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-42" value="0..*" style="resizable=0;align=left;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-41" connectable="0" vertex="1"> + <mxGeometry x="-1" relative="1" as="geometry"> + <mxPoint x="7" y="20" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-43" value="1" style="resizable=0;align=right;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-41" connectable="0" vertex="1"> + <mxGeometry x="1" relative="1" as="geometry"> + <mxPoint x="20" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-44" value="gilt für" style="text;html=1;resizable=0;points=[];;align=center;verticalAlign=middle;labelBackgroundColor=none;rounded=0;shadow=0;strokeWidth=1;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-41" vertex="1" connectable="0"> + <mxGeometry x="0.5" y="49" relative="1" as="geometry"> + <mxPoint x="50" y="-64" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-45" value="" style="endArrow=open;shadow=0;strokeWidth=1;rounded=0;endFill=1;edgeStyle=elbowEdgeStyle;elbow=vertical;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="-zzV5CLyMU1CWvgltZj0-21" edge="1"> + <mxGeometry x="0.5" y="41" relative="1" as="geometry"> + <mxPoint x="140" y="190" as="sourcePoint"/> + <mxPoint x="200" y="285" as="targetPoint"/> + <mxPoint x="-40" y="32" as="offset"/> + <Array as="points"> + <mxPoint x="280" y="285"/> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-46" value="0..*" style="resizable=0;align=left;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-45" connectable="0" vertex="1"> + <mxGeometry x="-1" relative="1" as="geometry"> + <mxPoint x="-30" y="-5" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-47" value="1" style="resizable=0;align=right;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-45" connectable="0" vertex="1"> + <mxGeometry x="1" relative="1" as="geometry"> + <mxPoint x="20" y="-5" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-48" value="gilt für" style="text;html=1;resizable=0;points=[];;align=center;verticalAlign=middle;labelBackgroundColor=none;rounded=0;shadow=0;strokeWidth=1;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-45" vertex="1" connectable="0"> + <mxGeometry x="0.5" y="49" relative="1" as="geometry"> + <mxPoint x="30" y="-64" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-49" value="" style="endArrow=open;shadow=0;strokeWidth=1;rounded=0;endFill=1;edgeStyle=elbowEdgeStyle;elbow=vertical;exitX=-0.009;exitY=0.648;exitDx=0;exitDy=0;exitPerimeter=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="-zzV5CLyMU1CWvgltZj0-26" target="zkfFHV4jXpPFQw0GAbJ--10" edge="1"> + <mxGeometry x="0.5" y="41" relative="1" as="geometry"> + <mxPoint x="330" y="295" as="sourcePoint"/> + <mxPoint x="210" y="295" as="targetPoint"/> + <mxPoint x="-40" y="32" as="offset"/> + <Array as="points"> + <mxPoint x="220" y="443"/> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-50" value="0..*" style="resizable=0;align=left;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-49" connectable="0" vertex="1"> + <mxGeometry x="-1" relative="1" as="geometry"> + <mxPoint x="-30" y="-5" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-51" value="1" style="resizable=0;align=right;verticalAlign=bottom;labelBackgroundColor=none;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-49" connectable="0" vertex="1"> + <mxGeometry x="1" relative="1" as="geometry"> + <mxPoint x="20" y="22" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-52" value="gilt für" style="text;html=1;resizable=0;points=[];;align=center;verticalAlign=middle;labelBackgroundColor=none;rounded=0;shadow=0;strokeWidth=1;fontSize=12;" parent="-zzV5CLyMU1CWvgltZj0-49" vertex="1" connectable="0"> + <mxGeometry x="0.5" y="49" relative="1" as="geometry"> + <mxPoint x="79" y="24" as="offset"/> + </mxGeometry> + </mxCell> + <mxCell id="-zzV5CLyMU1CWvgltZj0-53" value="<b><i>Weitere Datenobjekte (z.B. Organisationen, Fachpersonen, Aufenthalte) sind hier zur besseren Übersichtlichkeit nicht dargestellt.</i></b>" style="text;html=1;resizable=0;autosize=1;align=center;verticalAlign=middle;points=[];fillColor=none;strokeColor=none;rounded=0;labelBackgroundColor=none;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1"> + <mxGeometry x="25" y="530" width="750" height="20" as="geometry"/> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> \ No newline at end of file diff --git a/Material/images/src/plantuml/Components_Example.puml b/Material/images/src/plantuml/Components_Example.puml new file mode 100644 index 0000000..24072ac --- /dev/null +++ b/Material/images/src/plantuml/Components_Example.puml @@ -0,0 +1,9 @@ +@startuml +actor client +node app +database db + +db -> app +app -> client +client -> db +@enduml \ No newline at end of file diff --git a/Material/images/src/plantuml/noName_Example.puml b/Material/images/src/plantuml/noName_Example.puml new file mode 100644 index 0000000..4b44791 --- /dev/null +++ b/Material/images/src/plantuml/noName_Example.puml @@ -0,0 +1,8 @@ +@startuml nameInSource_Example +actor client +node app +database db + +db -> app +app -> client +@enduml \ No newline at end of file diff --git a/PROJECT_README.md b/PROJECT_README.md new file mode 100644 index 0000000..a03411a --- /dev/null +++ b/PROJECT_README.md @@ -0,0 +1,45 @@ +<img align="right" width="250" height="47" src="/Material/images/Gematik_Logo_Flag.svg"/> <br/> + +# < PROJECT NAME > + +<details> + <summary>Table of Contents</summary> + <ol> + <li> + <a href="#about-the-project">About The Project</a> + <ul> + <li><a href="#release-notes">Release Notes</a></li> + </ul> + </li> + <li><a href="#license">License</a></li> + <li><a href="#contact">Contact</a></li> + </ol> +</details> + +## About The Project + +For full information and details, see [Simplifier Project Page for <PROJECT NAME>](https://simplifier.net/<ProjectNameLink>) + +### Release Notes +See [ReleaseNotes.md](/ImplementationGuide/markdown/ReleaseNotes.md) for all information regarding the (newest) releases. + +## License + +Copyright 2024 gematik GmbH + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. + +See the [LICENSE.md](./LICENSE.md) for the specific language governing permissions and limitations under the License. + +Unless required by applicable law the software is provided "as is" without warranty of any kind, either express or implied, including, but not limited to, the warranties of fitness for a particular purpose, merchantability, and/or non-infringement. The authors or copyright holders shall not be liable in any manner whatsoever for any damages or other claims arising from, out of or in connection with the software or the use or other dealings with the software, whether in an action of contract, tort, or otherwise. + +The software is the result of research and development activities, therefore not necessarily quality assured and without the character of a liable product. For this reason, gematik does not provide any support or other user assistance (unless otherwise stated in individual cases and without justification of a legal obligation). Furthermore, there is no claim to further development and adaptation of the results to a more current state of the art. + +Gematik may remove published results temporarily or permanently from the place of publication at any time without prior notice or justification. + +## Contact + +**Team Data – ISiK and ISiP** + +For issues and requests please refer to: +https://service.gematik.de/servicedesk/customer/portal/16 \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..affa1a0 --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +<img align="right" width="250" height="47" src="/Material/images/Gematik_Logo_Flag.svg"/> <br/> + + +# About +This template standardizes the development of fhir resources with .fsh resources. It should reduce time for setup and ease the development process. + +The following features are provided: + +* Best practices for modeling fsh files [see /Resources/input/fsh folder](./Resources/input/fsh). +* Scripted creation and validation of fsh files and the generated fhir resources using a Hapi validator. See [usage page](./USAGE.md). +* Sorting of validation results by severity in subfolders. +* Validation of committed fsh files via github-action with different validators (hapi, simplifier). +# Installation + +Here you can find the [installation instructions](INSTALL.md) + +# Setup +You can browse through the [best practice files](./Resources/input/fsh) for some examples. Before you start specifying your own artifacts you have to +* configure [sushi-config.yaml](./Resources/sushi-config.yaml) with the dependencies that your project needs. These will be placed in the ~/.fhir/packages directory +* Set the current year in the LICENSE file (bottom of the page) AND the Readme_template.md + +## Remove template files +Before you can start working within your project you need to delete the best-practise files. Feel free to review them before deletion. You can either run [setup.sh](./scripts/setup.sh) + +```bash +chmod u+x ./scripts/setup.sh && ./scripts/setup.sh +``` +or you can execute these steps manually: +* delete all files in [./Resources/input/fsh](./Resources/input/fsh) +* delete all files in [./Resources/fsh-generated/resources](./Resources/fsh-generated/resources) +* delete [downloaded_validation_script.sh](./scripts/downloaded_validation_script.sh) +* delete [install_fhir_tools.sh](./scripts/install_fhir_tools.sh) when you have already installed the FHIR Tools by using this script. Otherwise do not delete now. +* delete [this readme file](./README.md) and rename Readme_template.md with README.md + +Finally you will need to +* Create or re-use the OSPO conform README which can be found in this repository [PROJECT_README.md](/PROJECT_README.md) too. +* populate the new/renamed README.md with information for your repository. + +# Usage <a name = "usage"></a> +Information about using the preconfigured devontainer including sushi, hapi validator and the codfsh-Extension can be found in [usage page](./USAGE.md). + +# Help + +If you find issues with this template project, please leave an issue or create a Pull Request via the [template repository](https://github.com/gematik/spec-TemplateForSimplifierProjects). diff --git a/Readme_template.md b/Readme_template.md new file mode 100644 index 0000000..95e2132 --- /dev/null +++ b/Readme_template.md @@ -0,0 +1,67 @@ +<img align="right" width="200" height="37" src="Gematik_Logo_Flag.png"/> <br/> + +# ${fhir_name} FHIR-Profiles + + ${fhir_profiles_description} + +<details> + <summary>Table of Contents</summary> + <ol> + <li> + <a href="#about-the-project">About The Project</a> + <ul> + <li><a href="#release-notes">Release Notes</a></li> + </ul> + </li> + <li> + <a href="#getting-started">Getting Started</a> + <ul> + <li><a href="#prerequisites">Prerequisites</a></li> + <li><a href="#installation">Installation</a></li> + </ul> + </li> + <li><a href="#contributing">Contributing</a></li> + <li><a href="#license">License</a></li> + <li><a href="#contact">Contact</a></li> + </ol> +</details> + + +## About The Project +This Repo contains the fsh files to the published \${fhir_name} files on <https://simplifier.net/${simplifier_repo}> and a script to validate them. + +### Release Notes +See [ReleaseNotes.md](./ReleaseNotes.md) for all information regarding the (newest) releases. + +### Prerequisites +Clone this project to your local machine. + + +## Installation +To set up a development environment with support for FHIR profile compilation and validation: + +1. Ensure you have [Docker](https://www.docker.com/products/docker-desktop) installed on your machine. +2. Clone the repository and open it in [Visual Studio Code](https://code.visualstudio.com/). +3. When prompted, reopen the project in a container. This will build the Docker container based on the provided `Dockerfile`. +4. The container includes: + - [Firely Terminal](https://fire.ly/products/firely-terminal/) for FHIR operations. + - [SUSHI](https://fshschool.org/docs/sushi/) for compiling FHIR Shorthand (FSH) files. + - [HAPI FHIR Validator](https://github.com/hapifhir/hapi-fhir/releases) for validating FHIR profiles. +5. The [`codfsh` VS Code extension](https://marketplace.visualstudio.com/items?itemName=gematikde.codfsh) is also installed in the container for an enhanced FHIR profile development experience. +6. Once the container is built and running, you can use the integrated terminal in VS Code to run SUSHI and the HAPI FHIR Validator. + +Note: The `codfsh` extension settings are pre-configured in the [`.devcontainer/devcontainer.json`](https://code.visualstudio.com/docs/devcontainers/containers) file to use the correct paths for the HAPI Validator and its configuration. + +## Contributing +If you want to contribute, please check our [CONTRIBUTING.md](./CONTRIBUTING.md). + +## License + +Copyright [yyyy] gematik GmbH + +Licensed under the **Apache License, Version 2.0** (the "License"); you may not use this file except in compliance with the License. + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the [LICENSE](./LICENSE) for the specific language governing permissions and limitations under the License. + +## Contact +<!-- add your own text here --> \ No newline at end of file diff --git a/Resources/LICENSE b/Resources/LICENSE new file mode 100644 index 0000000..70ff9f9 --- /dev/null +++ b/Resources/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [gematik] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/Resources/fsh-generated/resources/CapabilityStatement-ExampleCapabilityStatement.json b/Resources/fsh-generated/resources/CapabilityStatement-ExampleCapabilityStatement.json new file mode 100644 index 0000000..c77cb7a --- /dev/null +++ b/Resources/fsh-generated/resources/CapabilityStatement-ExampleCapabilityStatement.json @@ -0,0 +1,140 @@ +{ + "resourceType": "CapabilityStatement", + "id": "ExampleCapabilityStatement", + "url": "https://gematik.de/fhir/yourProjectHere/v1/yourModuleHere/CapabilityStatement/yourCapabilityStatementPurposeNameHere", + "status": "active", + "experimental": false, + "version": "2.0.0", + "publisher": "gematik GmbH", + "date": "2022-06-20", + "name": "CapabilityStatementYourModuleServer", + "title": "CapabilityStatement YourModule Server", + "description": "Das vorliegende CapabilityStatement beschreibt alle verpflichtenden Interaktionen die ein Projekt-konformes System unterstützen muss um das Bestätigungsverfahren des Moduls "Dokumentenaustausch" zu bestehen.", + "jurisdiction": [ + { + "coding": [ + { + "code": "DE", + "system": "urn:iso:std:iso:3166", + "display": "Germany" + } + ] + } + ], + "kind": "requirements", + "fhirVersion": "4.0.1", + "format": [ + "application/fhir+xml", + "application/fhir+json" + ], + "implementationGuide": [ + "https://gematik.de/fhir/yourProject|1.0.0" + ], + "rest": [ + { + "mode": "server", + "resource": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "type": "Patient", + "supportedProfile": [ + "https://gematik.de/fhir/yourProjectHere/v1/yourModuleHere/StructureDefinition/ExamplePatient" + ], + "interaction": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "code": "read" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "code": "search-type" + } + ], + "searchParam": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "name": "_id", + "definition": "http://hl7.org/fhir/SearchParameter/Resource-id", + "type": "token" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "name": "identifier", + "definition": "http://hl7.org/fhir/SearchParameter/Patient-identifier", + "type": "token" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "name": "family", + "definition": "http://hl7.org/fhir/SearchParameter/individual-family", + "type": "string" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "name": "given", + "definition": "http://hl7.org/fhir/SearchParameter/individual-given", + "type": "string" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "name": "birthdate", + "definition": "http://hl7.org/fhir/SearchParameter/individual-birthdate", + "type": "date" + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation", + "valueCode": "SHALL" + } + ], + "name": "gender", + "definition": "http://hl7.org/fhir/SearchParameter/individual-gender", + "type": "token" + } + ] + } + ] + } + ] +} diff --git a/Resources/fsh-generated/resources/CodeSystem-EncounterPflegeArten.json b/Resources/fsh-generated/resources/CodeSystem-EncounterPflegeArten.json new file mode 100644 index 0000000..c1a438e --- /dev/null +++ b/Resources/fsh-generated/resources/CodeSystem-EncounterPflegeArten.json @@ -0,0 +1,43 @@ +{ + "resourceType": "CodeSystem", + "status": "active", + "content": "complete", + "name": "EncounterPflegeArten", + "id": "EncounterPflegeArten", + "url": "https://gematik.de/fhir/isik/v2/Basismodul/CodeSystem/EncounterPflegeArten", + "concept": [ + { + "code": "langzeitpflege", + "display": "Langzeitpflege" + }, + { + "code": "akutPflege", + "display": "Akutpflege" + }, + { + "code": "intensivpflege", + "display": "Intensivpflege" + }, + { + "code": "palliativpflege", + "display": "Palliativpflege" + }, + { + "code": "behindertenpflege", + "display": "Behindertenpflege" + }, + { + "code": "rehabilitationspflege", + "display": "Rehabilitationspflege" + }, + { + "code": "psychatrischepflege", + "display": "Psychiatrische Pflege" + }, + { + "code": "allgemeinepflege", + "display": "Allgemeine Pflege" + } + ], + "count": 8 +} diff --git a/Resources/fsh-generated/resources/OperationDefinition-AppointmentBookOperation.json b/Resources/fsh-generated/resources/OperationDefinition-AppointmentBookOperation.json new file mode 100644 index 0000000..39e5c35 --- /dev/null +++ b/Resources/fsh-generated/resources/OperationDefinition-AppointmentBookOperation.json @@ -0,0 +1,58 @@ +{ + "resourceType": "OperationDefinition", + "id": "AppointmentBookOperation", + "status": "active", + "experimental": false, + "version": "2.0.0", + "publisher": "gematik GmbH", + "date": "2022-06-20", + "name": "book", + "url": "https://gematik.de/fhir/yourProjectHere/v1/yourModuleHere/OperationDefinition/AppointmentBook", + "kind": "operation", + "code": "book", + "resource": [ + "Appointment" + ], + "system": false, + "type": true, + "instance": false, + "affectsState": true, + "description": "OperationDefinition für die Buchung eines Termins. Die Operation überprüft ob der Termin noch verfügbar ist im Termin-Repository.", + "parameter": [ + { + "name": "appt-resource", + "use": "in", + "min": 1, + "max": "1", + "documentation": "Eine Appointment-Ressource entsprechend dem dazugehörigen YourNameHere-Profil. Das Appointment MUSS den Status 'proposed' enthalten. Invalide Appointment-Ressourcen MÜSSEN mit einer OperationOutcome und dem Status Code HTTP 400 - Bad Request abgewiesen werden. Falls der Parameter als einzige Parameter verwendet wird KANN die Appointment-Ressource direkt im HTTP Body anstelle einer Parameter-Ressource übergeben werden. Die referenzierte Ressource MUSS dem YourNameHere-Termin-Profil entsprechen. Invalide Ressource MÜSSEN abgelehnt werden durch das Termin Repository.", + "type": "Appointment" + }, + { + "name": "cancelled-appt-id", + "use": "in", + "min": 0, + "max": "1", + "documentation": "Für die vorliegende Spezifikation ist die Verschiebung eines Termin eins zwei-stufiger Prozess, bei dem ein Termin storniert und ein neuer Termin neu gebucht wird. Dieser Parameter repräsentiert die Ressourcen-Id des stornierten Appointments. Der uri-Parameter kann eine absoulte URL enthalten, Server SOLLTEN jedoch nur Termine für ihre eigene Domäne verwalten. Im neu-angelegten Appointment MUSS eine Reference auf den abgesagten Termin hinterlegt werden (vgl. Appointment.extension:replaces). Der Status der abgesagten Ressource MUSS durch den Server angepasst werden.", + "type": "uri" + }, + { + "name": "schedule", + "use": "in", + "min": 0, + "max": "1", + "type": "Reference", + "documentation": "Im Falle das ein Appointment keine Referenz auf ein oder mehrere Slots enthält MUSS der Server die benötigten Slots auf Basis der Referenz auf Schedule, sowie dem Start- und Endzeitpunkt im Appointment ermitteln.", + "targetProfile": [ + "https://gematik.de/fhir/isik/v2/Basismodul/StructureDefinition/ExamplePatient" + ] + }, + { + "name": "return", + "use": "out", + "min": 0, + "max": "1", + "documentation": "Als Return-Parameter wird ein Bundle vom Typ 'searchset' zurückgegeben, welches eine aktualisierte Appointment- oder eine OperationOutcome-Ressource enthält. Im Falle das die Terminbuchung akzeptiert wird MUSS das Appointment persistiert werden. Das id-Element der Ressource MUSS korrekt gefüllt werden. Der Status der Appointment-Ressource muss auf 'booked' geändert werden. Der Server MUSS die verwendeten Slot-Ressourcen als Referenz im Appointment angeben.", + "type": "Bundle" + } + ] +} diff --git a/Resources/fsh-generated/resources/Patient-PatientinMusterfrau.json b/Resources/fsh-generated/resources/Patient-PatientinMusterfrau.json new file mode 100644 index 0000000..4328b7e --- /dev/null +++ b/Resources/fsh-generated/resources/Patient-PatientinMusterfrau.json @@ -0,0 +1,160 @@ +{ + "resourceType": "Patient", + "id": "PatientinMusterfrau", + "meta": { + "profile": [ + "https://gematik.de/fhir/isik/v2/Basismodul/StructureDefinition/ExamplePatient" + ] + }, + "identifier": [ + { + "type": { + "coding": [ + { + "code": "MR", + "system": "http://terminology.hl7.org/CodeSystem/v2-0203" + }, + { + "code": "GKV", + "system": "http://fhir.de/CodeSystem/identifier-type-de-basis" + } + ] + }, + "system": "http://fhir.de/sid/gkv/kvid-10", + "value": "A123456789" + }, + { + "type": { + "coding": [ + { + "code": "MR", + "system": "http://terminology.hl7.org/CodeSystem/v2-0203" + } + ] + }, + "system": "https://fhir.krankenhaus.example/NamingSystem/PID", + "value": "TestPID" + }, + { + "use": "secondary", + "type": { + "coding": [ + { + "code": "PKV", + "system": "http://fhir.de/CodeSystem/identifier-type-de-basis" + } + ] + }, + "value": "1234567890", + "assigner": { + "display": "Test PKV AG" + } + } + ], + "name": [ + { + "use": "official", + "family": "Fürstin von Musterfrau", + "_family": { + "extension": [ + { + "url": "http://fhir.de/StructureDefinition/humanname-namenszusatz", + "valueString": "Graf" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", + "valueString": "Musterfrau" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-prefix", + "valueString": "von" + } + ] + }, + "given": [ + "Erika" + ], + "prefix": [ + "Dr." + ], + "_prefix": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier", + "valueCode": "AC" + } + ] + } + ] + }, + { + "use": "maiden", + "family": "Gabler", + "_family": { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/humanname-own-name", + "valueString": "Gabler" + } + ] + } + } + ], + "active": true, + "gender": "female", + "birthDate": "1964-08-12", + "address": [ + { + "type": "both", + "line": [ + "Musterweg 2", + "3. Etage" + ], + "_line": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName", + "valueString": "Musterweg" + }, + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber", + "valueString": "2" + } + ] + }, + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator", + "valueString": "3. Etage" + } + ] + } + ], + "city": "Musterhausen", + "postalCode": "98764", + "country": "DE" + }, + { + "type": "postal", + "line": [ + "Postfach 8 15" + ], + "_line": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-postBox", + "valueString": "Postfach 8 15" + } + ] + } + ], + "city": "Musterhausen", + "postalCode": "98764", + "country": "DE" + } + ] +} diff --git a/Resources/fsh-generated/resources/StructureDefinition-ExamplePatient.json b/Resources/fsh-generated/resources/StructureDefinition-ExamplePatient.json new file mode 100644 index 0000000..48aa964 --- /dev/null +++ b/Resources/fsh-generated/resources/StructureDefinition-ExamplePatient.json @@ -0,0 +1,629 @@ +{ + "resourceType": "StructureDefinition", + "id": "ExamplePatient", + "url": "https://gematik.de/fhir/isik/v2/Basismodul/StructureDefinition/ExamplePatient", + "name": "ExamplePatient", + "status": "active", + "experimental": false, + "date": "2022-06-30", + "publisher": "gematik GmbH", + "description": "Dieses Profil beschreibt die Nutzung von administrativen Patientendaten in YourNameHere-Szenarien.", + "fhirVersion": "4.0.1", + "mapping": [ + { + "identity": "rim", + "uri": "http://hl7.org/v3", + "name": "RIM Mapping" + }, + { + "identity": "cda", + "uri": "http://hl7.org/v3/cda", + "name": "CDA (R2)" + }, + { + "identity": "w5", + "uri": "http://hl7.org/fhir/fivews", + "name": "FiveWs Pattern Mapping" + }, + { + "identity": "v2", + "uri": "http://hl7.org/v2", + "name": "HL7 v2 Mapping" + }, + { + "identity": "loinc", + "uri": "http://loinc.org", + "name": "LOINC code for the element" + }, + { + "identity": "CompositionDocumentReferenceMapping", + "name": "Metadaten eines strukturieren Dokumentes (Document-Bundle)", + "uri": "http://hl7.org/fhir/StructureDefinition/Composition" + } + ], + "kind": "resource", + "abstract": false, + "type": "Patient", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Patient", + "derivation": "constraint", + "differential": { + "element": [ + { + "id": "Patient", + "path": "Patient", + "constraint": [ + { + "key": "Example-pat-1", + "severity": "error", + "human": "Falls die Geschlechtsangabe 'other' gewählt wird, muss die amtliche Differenzierung per Extension angegeben werden", + "expression": "gender.exists() and gender='other' implies gender.extension('http://fhir.de/StructureDefinition/gender-amtlich-de').exists()", + "source": "https://gematik.de/fhir/isik/v2/Basismodul/StructureDefinition/ExamplePatient" + } + ] + }, + { + "id": "Patient.id", + "path": "Patient.id", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.identifier", + "path": "Patient.identifier", + "slicing": { + "discriminator": [ + { + "type": "pattern", + "path": "$this" + } + ], + "rules": "open" + }, + "min": 1, + "mustSupport": true, + "mapping": [ + { + "identity": "CompositionDocumentReferenceMapping", + "map": "Composition.identifier" + } + ] + }, + { + "id": "Patient.identifier:VersichertenId-GKV", + "path": "Patient.identifier", + "sliceName": "VersichertenId-GKV", + "min": 0, + "max": "1", + "type": [ + { + "code": "Identifier", + "profile": [ + "http://fhir.de/StructureDefinition/identifier-kvid-10" + ] + } + ], + "patternIdentifier": { + "type": { + "coding": [ + { + "code": "GKV", + "system": "http://fhir.de/CodeSystem/identifier-type-de-basis" + } + ] + } + }, + "mustSupport": true + }, + { + "id": "Patient.identifier:VersichertenId-GKV.type", + "path": "Patient.identifier.type", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.identifier:VersichertenId-GKV.system", + "path": "Patient.identifier.system", + "mustSupport": true + }, + { + "id": "Patient.identifier:VersichertenId-GKV.value", + "path": "Patient.identifier.value", + "mustSupport": true + }, + { + "id": "Patient.identifier:Patientennummer", + "path": "Patient.identifier", + "sliceName": "Patientennummer", + "min": 1, + "max": "*", + "type": [ + { + "code": "Identifier", + "profile": [ + "http://fhir.de/StructureDefinition/identifier-pid" + ] + } + ], + "patternIdentifier": { + "type": { + "coding": [ + { + "code": "MR", + "system": "http://terminology.hl7.org/CodeSystem/v2-0203" + } + ] + } + }, + "mustSupport": true + }, + { + "id": "Patient.identifier:Patientennummer.type", + "path": "Patient.identifier.type", + "mustSupport": true + }, + { + "id": "Patient.identifier:Patientennummer.system", + "path": "Patient.identifier.system", + "mustSupport": true + }, + { + "id": "Patient.identifier:Patientennummer.value", + "path": "Patient.identifier.value", + "mustSupport": true + }, + { + "id": "Patient.identifier:Versichertennummer_PKV", + "path": "Patient.identifier", + "sliceName": "Versichertennummer_PKV", + "min": 0, + "max": "1", + "type": [ + { + "code": "Identifier", + "profile": [ + "http://fhir.de/StructureDefinition/identifier-pkv" + ] + } + ], + "patternIdentifier": { + "type": { + "coding": [ + { + "code": "PKV", + "system": "http://fhir.de/CodeSystem/identifier-type-de-basis" + } + ] + } + }, + "mustSupport": false + }, + { + "id": "Patient.identifier:Versichertennummer_PKV.use", + "path": "Patient.identifier.use", + "mustSupport": true + }, + { + "id": "Patient.identifier:Versichertennummer_PKV.type", + "path": "Patient.identifier.type", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.identifier:Versichertennummer_PKV.value", + "path": "Patient.identifier.value", + "mustSupport": true + }, + { + "id": "Patient.identifier:Versichertennummer_PKV.assigner", + "path": "Patient.identifier.assigner", + "mustSupport": true + }, + { + "id": "Patient.identifier:Versichertennummer_PKV.assigner.identifier.system", + "path": "Patient.identifier.assigner.identifier.system", + "mustSupport": true + }, + { + "id": "Patient.identifier:Versichertennummer_PKV.assigner.identifier.value", + "path": "Patient.identifier.assigner.identifier.value", + "mustSupport": true + }, + { + "id": "Patient.identifier:Versichertennummer_PKV.assigner.display", + "path": "Patient.identifier.assigner.display", + "mustSupport": true + }, + { + "id": "Patient.active", + "path": "Patient.active", + "mustSupport": true + }, + { + "id": "Patient.name", + "path": "Patient.name", + "slicing": { + "discriminator": [ + { + "type": "pattern", + "path": "$this" + } + ], + "rules": "open" + }, + "comment": "In order to maintain the differntiations of name parts as given in the VSDM dataset or qualify prefixes as academic titles, vendors can opt to support the extensions specified in the German HumanName Base Profile https://simplifier.net/basisprofil-de-r4/humannamedebasis\r\nThis is however not required within the scope of this specification.", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.name:Name", + "path": "Patient.name", + "sliceName": "Name", + "min": 1, + "max": "1", + "type": [ + { + "code": "HumanName", + "profile": [ + "http://fhir.de/StructureDefinition/humanname-de-basis" + ] + } + ], + "patternHumanName": { + "use": "official" + }, + "mustSupport": true + }, + { + "id": "Patient.name:Name.use", + "path": "Patient.name.use", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.name:Name.family", + "path": "Patient.name.family", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.name:Name.family.extension:namenszusatz", + "path": "Patient.name.family.extension", + "sliceName": "namenszusatz", + "mustSupport": true + }, + { + "id": "Patient.name:Name.family.extension:nachname", + "path": "Patient.name.family.extension", + "sliceName": "nachname", + "mustSupport": true + }, + { + "id": "Patient.name:Name.family.extension:vorsatzwort", + "path": "Patient.name.family.extension", + "sliceName": "vorsatzwort", + "mustSupport": true + }, + { + "id": "Patient.name:Name.given", + "path": "Patient.name.given", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.name:Name.prefix", + "path": "Patient.name.prefix", + "mustSupport": true + }, + { + "id": "Patient.name:Name.prefix.extension:prefix-qualifier", + "path": "Patient.name.prefix.extension", + "sliceName": "prefix-qualifier", + "max": "1", + "mustSupport": true + }, + { + "id": "Patient.name:Name.prefix.extension:prefix-qualifier.value[x]", + "path": "Patient.name.prefix.extension.value[x]", + "fixedCode": "AC" + }, + { + "id": "Patient.name:Geburtsname", + "path": "Patient.name", + "sliceName": "Geburtsname", + "min": 0, + "max": "1", + "type": [ + { + "code": "HumanName", + "profile": [ + "http://fhir.de/StructureDefinition/humanname-de-basis" + ] + } + ], + "patternHumanName": { + "use": "maiden" + }, + "mustSupport": true + }, + { + "id": "Patient.name:Geburtsname.use", + "path": "Patient.name.use", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.name:Geburtsname.family", + "path": "Patient.name.family", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.name:Geburtsname.family.extension:namenszusatz", + "path": "Patient.name.family.extension", + "sliceName": "namenszusatz", + "mustSupport": true + }, + { + "id": "Patient.name:Geburtsname.family.extension:nachname", + "path": "Patient.name.family.extension", + "sliceName": "nachname", + "mustSupport": true + }, + { + "id": "Patient.name:Geburtsname.family.extension:vorsatzwort", + "path": "Patient.name.family.extension", + "sliceName": "vorsatzwort", + "mustSupport": true + }, + { + "id": "Patient.name:Geburtsname.given", + "path": "Patient.name.given", + "max": "0" + }, + { + "id": "Patient.name:Geburtsname.prefix", + "path": "Patient.name.prefix", + "max": "0" + }, + { + "id": "Patient.telecom.system", + "path": "Patient.telecom.system", + "min": 1 + }, + { + "id": "Patient.telecom.value", + "path": "Patient.telecom.value", + "min": 1 + }, + { + "id": "Patient.gender", + "path": "Patient.gender", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.gender.extension:Geschlecht-Administrativ", + "path": "Patient.gender.extension", + "sliceName": "Geschlecht-Administrativ", + "min": 0, + "max": "1", + "type": [ + { + "code": "Extension", + "profile": [ + "http://fhir.de/StructureDefinition/gender-amtlich-de" + ] + } + ], + "mustSupport": true + }, + { + "id": "Patient.birthDate", + "path": "Patient.birthDate", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.birthDate.extension:Data-Absent-Reason", + "path": "Patient.birthDate.extension", + "sliceName": "Data-Absent-Reason", + "min": 0, + "max": "1", + "type": [ + { + "code": "Extension", + "profile": [ + "http://hl7.org/fhir/StructureDefinition/data-absent-reason" + ] + } + ], + "mustSupport": true + }, + { + "id": "Patient.birthDate.extension:Data-Absent-Reason.value[x]", + "path": "Patient.birthDate.extension.value[x]", + "fixedCode": "unknown", + "mustSupport": true + }, + { + "id": "Patient.address", + "path": "Patient.address", + "slicing": { + "discriminator": [ + { + "type": "pattern", + "path": "$this" + } + ], + "rules": "open" + }, + "comment": "In order to differentiate between post box addresses and physical addresses, street names and house numbers, and to add city district names, vendors can opt to support the extensions as suggested in the German Address Base Profile http://fhir.de/StructureDefinition/address-de-basis.\r\nSuch differentiations are however not required within the scope of this specification.", + "mustSupport": true + }, + { + "id": "Patient.address:Strassenanschrift", + "path": "Patient.address", + "sliceName": "Strassenanschrift", + "min": 0, + "max": "*", + "type": [ + { + "code": "Address", + "profile": [ + "http://fhir.de/StructureDefinition/address-de-basis" + ] + } + ], + "patternAddress": { + "type": "both" + }, + "mustSupport": true + }, + { + "id": "Patient.address:Strassenanschrift.type", + "path": "Patient.address.type", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.address:Strassenanschrift.line", + "path": "Patient.address.line", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.address:Strassenanschrift.line.extension:Strasse", + "path": "Patient.address.line.extension", + "sliceName": "Strasse", + "mustSupport": true + }, + { + "id": "Patient.address:Strassenanschrift.line.extension:Hausnummer", + "path": "Patient.address.line.extension", + "sliceName": "Hausnummer", + "mustSupport": true + }, + { + "id": "Patient.address:Strassenanschrift.line.extension:Adresszusatz", + "path": "Patient.address.line.extension", + "sliceName": "Adresszusatz", + "mustSupport": true + }, + { + "id": "Patient.address:Strassenanschrift.line.extension:Postfach", + "path": "Patient.address.line.extension", + "sliceName": "Postfach", + "max": "0" + }, + { + "id": "Patient.address:Strassenanschrift.city", + "path": "Patient.address.city", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.address:Strassenanschrift.postalCode", + "path": "Patient.address.postalCode", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.address:Strassenanschrift.country", + "path": "Patient.address.country", + "min": 1, + "constraint": [ + { + "key": "address-cnt-2or3-char", + "severity": "warning", + "human": "The content of the country element (if present) SHALL be selected EITHER from ValueSet ISO Country Alpha-2 http://hl7.org/fhir/ValueSet/iso3166-1-2 OR MAY be selected from ISO Country Alpha-3 Value Set http://hl7.org/fhir/ValueSet/iso3166-1-3, IF the country is not specified in value Set ISO Country Alpha-2 http://hl7.org/fhir/ValueSet/iso3166-1-2.", + "expression": "country.empty() or (country.memberOf('http://hl7.org/fhir/ValueSet/iso3166-1-2') or country.memberOf('http://hl7.org/fhir/ValueSet/iso3166-1-3'))", + "source": "https://gematik.de/fhir/isik/v2/Basismodul/StructureDefinition/ExamplePatient" + } + ], + "mustSupport": true + }, + { + "id": "Patient.address:Postfach", + "path": "Patient.address", + "sliceName": "Postfach", + "min": 0, + "max": "*", + "type": [ + { + "code": "Address", + "profile": [ + "http://fhir.de/StructureDefinition/address-de-basis" + ] + } + ], + "patternAddress": { + "type": "postal" + }, + "mustSupport": true + }, + { + "id": "Patient.address:Postfach.type", + "path": "Patient.address.type", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.address:Postfach.line", + "path": "Patient.address.line", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.address:Postfach.line.extension:Strasse", + "path": "Patient.address.line.extension", + "sliceName": "Strasse", + "max": "0" + }, + { + "id": "Patient.address:Postfach.line.extension:Hausnummer", + "path": "Patient.address.line.extension", + "sliceName": "Hausnummer", + "max": "0" + }, + { + "id": "Patient.address:Postfach.line.extension:Adresszusatz", + "path": "Patient.address.line.extension", + "sliceName": "Adresszusatz", + "max": "0" + }, + { + "id": "Patient.address:Postfach.line.extension:Postfach", + "path": "Patient.address.line.extension", + "sliceName": "Postfach", + "mustSupport": true + }, + { + "id": "Patient.address:Postfach.city", + "path": "Patient.address.city", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.address:Postfach.postalCode", + "path": "Patient.address.postalCode", + "min": 1, + "mustSupport": true + }, + { + "id": "Patient.address:Postfach.country", + "path": "Patient.address.country", + "min": 1, + "constraint": [ + { + "key": "address-cnt-2or3-char", + "severity": "warning", + "human": "The content of the country element (if present) SHALL be selected EITHER from ValueSet ISO Country Alpha-2 http://hl7.org/fhir/ValueSet/iso3166-1-2 OR MAY be selected from ISO Country Alpha-3 Value Set http://hl7.org/fhir/ValueSet/iso3166-1-3, IF the country is not specified in value Set ISO Country Alpha-2 http://hl7.org/fhir/ValueSet/iso3166-1-2.", + "expression": "country.empty() or (country.memberOf('http://hl7.org/fhir/ValueSet/iso3166-1-2') or country.memberOf('http://hl7.org/fhir/ValueSet/iso3166-1-3'))", + "source": "https://gematik.de/fhir/isik/v2/Basismodul/StructureDefinition/ExamplePatient" + } + ], + "mustSupport": true + } + ] + } +} diff --git a/Resources/fsh-generated/resources/StructureDefinition-ExampleValueSet.json b/Resources/fsh-generated/resources/StructureDefinition-ExampleValueSet.json new file mode 100644 index 0000000..2e42ba7 --- /dev/null +++ b/Resources/fsh-generated/resources/StructureDefinition-ExampleValueSet.json @@ -0,0 +1,141 @@ +{ + "resourceType": "StructureDefinition", + "id": "ExampleValueSet", + "url": "https://gematik.de/fhir/isik/v2/Basismodul/StructureDefinition/ExampleValueSet", + "name": "ExampleValueSet", + "status": "active", + "experimental": false, + "date": "2022-06-30", + "publisher": "gematik GmbH", + "description": "Dieses Profil beschreibt die maschinenlesbare Auswahl von Codes für die Kodierung spezifischer FHIR-Elemente in YourNameHere-Szenarien", + "fhirVersion": "4.0.1", + "mapping": [ + { + "identity": "rim", + "uri": "http://hl7.org/v3", + "name": "RIM Mapping" + }, + { + "identity": "workflow", + "uri": "http://hl7.org/fhir/workflow", + "name": "Workflow Pattern" + }, + { + "identity": "w5", + "uri": "http://hl7.org/fhir/fivews", + "name": "FiveWs Pattern Mapping" + }, + { + "identity": "objimpl", + "uri": "http://hl7.org/fhir/object-implementation", + "name": "Object Implementation Information" + } + ], + "kind": "resource", + "abstract": false, + "type": "ValueSet", + "baseDefinition": "http://hl7.org/fhir/StructureDefinition/ValueSet", + "derivation": "constraint", + "differential": { + "element": [ + { + "id": "ValueSet.id", + "path": "ValueSet.id", + "min": 1, + "mustSupport": true + }, + { + "id": "ValueSet.url", + "path": "ValueSet.url", + "min": 1, + "mustSupport": true + }, + { + "id": "ValueSet.version", + "path": "ValueSet.version", + "min": 1, + "mustSupport": true + }, + { + "id": "ValueSet.name", + "path": "ValueSet.name", + "min": 1, + "mustSupport": true + }, + { + "id": "ValueSet.status", + "path": "ValueSet.status", + "mustSupport": true + }, + { + "id": "ValueSet.useContext", + "path": "ValueSet.useContext", + "min": 1, + "mustSupport": true + }, + { + "id": "ValueSet.useContext.code", + "path": "ValueSet.useContext.code", + "patternCoding": { + "code": "focus", + "system": "http://terminology.hl7.org/CodeSystem/usage-context-type" + } + }, + { + "id": "ValueSet.useContext.value[x]", + "path": "ValueSet.useContext.value[x]", + "type": [ + { + "code": "CodeableConcept" + } + ], + "binding": { + "strength": "required", + "valueSet": "http://hl7.org/fhir/ValueSet/resource-types", + "description": "One of the resource types defined as part of this version of FHIR." + } + }, + { + "id": "ValueSet.expansion", + "path": "ValueSet.expansion", + "min": 1, + "mustSupport": true + }, + { + "id": "ValueSet.expansion.timestamp", + "path": "ValueSet.expansion.timestamp", + "mustSupport": true + }, + { + "id": "ValueSet.expansion.contains", + "path": "ValueSet.expansion.contains", + "min": 1, + "mustSupport": true + }, + { + "id": "ValueSet.expansion.contains.system", + "path": "ValueSet.expansion.contains.system", + "min": 1, + "mustSupport": true + }, + { + "id": "ValueSet.expansion.contains.version", + "path": "ValueSet.expansion.contains.version", + "min": 1, + "mustSupport": true + }, + { + "id": "ValueSet.expansion.contains.code", + "path": "ValueSet.expansion.contains.code", + "min": 1, + "mustSupport": true + }, + { + "id": "ValueSet.expansion.contains.display", + "path": "ValueSet.expansion.contains.display", + "min": 1, + "mustSupport": true + } + ] + } +} diff --git a/Resources/fsh-generated/resources/ValueSet-DiagnosesSCT.json b/Resources/fsh-generated/resources/ValueSet-DiagnosesSCT.json new file mode 100644 index 0000000..612b6e4 --- /dev/null +++ b/Resources/fsh-generated/resources/ValueSet-DiagnosesSCT.json @@ -0,0 +1,35 @@ +{ + "resourceType": "ValueSet", + "status": "active", + "name": "DiagnosesSCT", + "id": "DiagnosesSCT", + "description": "Enthaelt alle SNOMED Clinical finding, Event und Situation with explicit context codes", + "url": "https://gematik.de/fhir/isik/v2/Basismodul/ValueSet/DiagnosesSCT", + "experimental": false, + "publisher": "gematik GmbH", + "date": "2022-06-30", + "compose": { + "include": [ + { + "system": "http://snomed.info/sct", + "filter": [ + { + "property": "concept", + "op": "is-a", + "value": "404684003" + }, + { + "property": "concept", + "op": "is-a", + "value": "272379006" + }, + { + "property": "concept", + "op": "is-a", + "value": "243796009" + } + ] + } + ] + } +} diff --git a/Resources/fsh-generated/resources/ValueSet-ExampleAccountType.json b/Resources/fsh-generated/resources/ValueSet-ExampleAccountType.json new file mode 100644 index 0000000..f5d00f7 --- /dev/null +++ b/Resources/fsh-generated/resources/ValueSet-ExampleAccountType.json @@ -0,0 +1,28 @@ +{ + "resourceType": "ValueSet", + "status": "active", + "name": "ExampleAccountType", + "id": "ExampleAccountType", + "title": "ExampleAccountType", + "url": "https://gematik.de/fhir/isik/v2/Basismodul/ValueSet/ExampleAccountType", + "experimental": false, + "publisher": "gematik GmbH", + "date": "2022-06-30", + "compose": { + "include": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v3-ActCode", + "concept": [ + { + "code": "AMB", + "display": "ambulatory" + }, + { + "code": "IMP", + "display": "inpatient encounter" + } + ] + } + ] + } +} diff --git a/Resources/fsh-generated/resources/ValueSet-ProzedurenCodesSCT.json b/Resources/fsh-generated/resources/ValueSet-ProzedurenCodesSCT.json new file mode 100644 index 0000000..8f9397e --- /dev/null +++ b/Resources/fsh-generated/resources/ValueSet-ProzedurenCodesSCT.json @@ -0,0 +1,25 @@ +{ + "resourceType": "ValueSet", + "status": "active", + "name": "ProzedurenCodesSCT", + "id": "ProzedurenCodesSCT", + "description": "Enthaelt alle SNOMED Procedure Codes", + "url": "https://gematik.de/fhir/isik/v2/Basismodul/ValueSet/ProzedurenCodesSCT", + "experimental": false, + "publisher": "gematik GmbH", + "date": "2022-06-30", + "compose": { + "include": [ + { + "system": "http://snomed.info/sct", + "filter": [ + { + "property": "concept", + "op": "descendent-of", + "value": "71388002" + } + ] + } + ] + } +} diff --git a/Resources/fsh-generated/resources/ValueSet-ProzedurenKategorieSCT.json b/Resources/fsh-generated/resources/ValueSet-ProzedurenKategorieSCT.json new file mode 100644 index 0000000..29d3842 --- /dev/null +++ b/Resources/fsh-generated/resources/ValueSet-ProzedurenKategorieSCT.json @@ -0,0 +1,44 @@ +{ + "resourceType": "ValueSet", + "status": "active", + "name": "ProzedurenKategorieSCT", + "id": "ProzedurenKategorieSCT", + "description": "Enthaelt alle SNOMED Codes für ein Mapping der OPS Klassentitel", + "url": "https://gematik.de/fhir/isik/v2/Basismodul/ValueSet/ProzedurenKategorieSCT", + "experimental": false, + "publisher": "gematik GmbH", + "date": "2022-06-30", + "compose": { + "include": [ + { + "system": "http://snomed.info/sct", + "concept": [ + { + "code": "103693007", + "display": "Diagnostic procedure" + }, + { + "code": "363679005", + "display": "Imaging" + }, + { + "code": "387713003", + "display": "Surgical procedure" + }, + { + "code": "18629005", + "display": "Administration of medicine" + }, + { + "code": "277132007", + "display": "Therapeutic procedure" + }, + { + "code": "394841004", + "display": "Other category" + } + ] + } + ] + } +} diff --git a/Resources/fsh-generated/resources/ValueSet-ValueSetExample.json b/Resources/fsh-generated/resources/ValueSet-ValueSetExample.json new file mode 100644 index 0000000..74e63a4 --- /dev/null +++ b/Resources/fsh-generated/resources/ValueSet-ValueSetExample.json @@ -0,0 +1,40 @@ +{ + "resourceType": "ValueSet", + "id": "ValueSetExample", + "meta": { + "profile": [ + "https://gematik.de/fhir/isik/v2/Basismodul/StructureDefinition/ExampleValueSet" + ] + }, + "useContext": [ + { + "code": { + "code": "focus", + "system": "http://terminology.hl7.org/CodeSystem/usage-context-type" + }, + "valueCodeableConcept": { + "coding": [ + { + "code": "Encounter", + "system": "http://hl7.org/fhir/resource-types" + } + ] + } + } + ], + "url": "http://example.org/fhir/ValueSet/TestValueSet", + "version": "1.0.0", + "name": "TestValueSet", + "status": "active", + "expansion": { + "timestamp": "2022-03-30", + "contains": [ + { + "system": "http://example.org/fhir/CodeSystem/TestKatalog", + "version": "1.0.0", + "code": "test", + "display": "Test" + } + ] + } +} diff --git a/Resources/fsh-generated/resources/ValueSet-YourNameHereLocationPhysicalType.json b/Resources/fsh-generated/resources/ValueSet-YourNameHereLocationPhysicalType.json new file mode 100644 index 0000000..284750d --- /dev/null +++ b/Resources/fsh-generated/resources/ValueSet-YourNameHereLocationPhysicalType.json @@ -0,0 +1,31 @@ +{ + "resourceType": "ValueSet", + "status": "active", + "name": "YourNameHereLocationPhysicalType", + "id": "YourNameHereLocationPhysicalType", + "url": "https://gematik.de/fhir/isik/v2/Basismodul/ValueSet/YourNameHereLocationPhysicalType", + "experimental": false, + "publisher": "gematik GmbH", + "date": "2022-06-30", + "compose": { + "include": [ + { + "system": "http://terminology.hl7.org/CodeSystem/location-physical-type", + "concept": [ + { + "code": "bd", + "display": "Bed" + }, + { + "code": "ro", + "display": "Room" + }, + { + "code": "wa", + "display": "Ward" + } + ] + } + ] + } +} diff --git a/Resources/input/fsh/Example_CapabilityStatement.fsh b/Resources/input/fsh/Example_CapabilityStatement.fsh new file mode 100644 index 0000000..29590f2 --- /dev/null +++ b/Resources/input/fsh/Example_CapabilityStatement.fsh @@ -0,0 +1,66 @@ +Instance: ExampleCapabilityStatement +InstanceOf: CapabilityStatement +Usage: #definition +* insert Meta-Inst +* url = "https://gematik.de/fhir/yourProjectHere/v1/yourModuleHere/CapabilityStatement/yourCapabilityStatementPurposeNameHere" +* name = "CapabilityStatementYourModuleServer" +* title = "CapabilityStatement YourModule Server" +* description = "Das vorliegende CapabilityStatement beschreibt alle verpflichtenden Interaktionen die ein Projekt-konformes System unterstützen muss um das Bestätigungsverfahren des Moduls "Dokumentenaustausch" zu bestehen." +* jurisdiction = urn:iso:std:iso:3166#DE "Germany" +* kind = #requirements +* fhirVersion = #4.0.1 +* format[0] = #application/fhir+xml +* format[+] = #application/fhir+json +* implementationGuide = "https://gematik.de/fhir/yourProject|1.0.0" +* rest.mode = #server +* rest.resource[+] + * extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" + * extension.valueCode = #SHALL + * type = #Patient + * supportedProfile = "https://gematik.de/fhir/yourProjectHere/v1/yourModuleHere/StructureDefinition/ExamplePatient" + * interaction[+] + * extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" + * extension.valueCode = #SHALL + * code = #read + * interaction[+] + * extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" + * extension.valueCode = #SHALL + * code = #search-type + * searchParam[+] + * extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" + * extension.valueCode = #SHALL + * name = "_id" + * definition = "http://hl7.org/fhir/SearchParameter/Resource-id" + * type = #token + * searchParam[+] + * extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" + * extension.valueCode = #SHALL + * name = "identifier" + * definition = "http://hl7.org/fhir/SearchParameter/Patient-identifier" + * type = #token + * searchParam[+] + * extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" + * extension.valueCode = #SHALL + * name = "family" + * definition = "http://hl7.org/fhir/SearchParameter/individual-family" + * type = #string + * searchParam[+] + * extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" + * extension.valueCode = #SHALL + * name = "given" + * definition = "http://hl7.org/fhir/SearchParameter/individual-given" + * type = #string + * searchParam[+] + * extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" + * extension.valueCode = #SHALL + * name = "birthdate" + * definition = "http://hl7.org/fhir/SearchParameter/individual-birthdate" + * type = #date + * searchParam[+] + * extension.url = "http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation" + * extension.valueCode = #SHALL + * name = "gender" + * definition = "http://hl7.org/fhir/SearchParameter/individual-gender" + * type = #token + + diff --git a/Resources/input/fsh/Example_Mapping.fsh b/Resources/input/fsh/Example_Mapping.fsh new file mode 100644 index 0000000..586716a --- /dev/null +++ b/Resources/input/fsh/Example_Mapping.fsh @@ -0,0 +1,10 @@ +Mapping: CompositionDocumentReferenceMapping +Source: ExamplePatient +Target: "http://hl7.org/fhir/StructureDefinition/Composition" +Id: CompositionDocumentReferenceMapping +Title: "Metadaten eines strukturieren Dokumentes (Document-Bundle)" +//Syntax: +//* -> "{map string}" "{comment string}" #{mime-type code} +//* <element> -> "{map string}" "{comment string}" #{mime-type code} + +* identifier -> "Composition.identifier" diff --git a/Resources/input/fsh/Example_Operation.fsh b/Resources/input/fsh/Example_Operation.fsh new file mode 100644 index 0000000..6bf7fc4 --- /dev/null +++ b/Resources/input/fsh/Example_Operation.fsh @@ -0,0 +1,45 @@ +Instance: ExampleOperation +InstanceOf: OperationDefinition +Usage: #example +* insert Meta-Inst +* id = "AppointmentBookOperation" +* name = "AppointmentBookOperation" +* url = "https://gematik.de/fhir/yourProjectHere/v1/yourModuleHere/OperationDefinition/AppointmentBook" +* kind = #operation +* name = "book" +* code = #book +* resource = #Appointment +* system = false +* type = true +* instance = false +* affectsState = true +* description = "OperationDefinition für die Buchung eines Termins. Die Operation überprüft ob der Termin noch verfügbar ist im Termin-Repository." +* parameter[+] + * name = #appt-resource + * use = #in + * min = 1 + * max = "1" + * documentation = "Eine Appointment-Ressource entsprechend dem dazugehörigen YourNameHere-Profil. Das Appointment MUSS den Status 'proposed' enthalten. Invalide Appointment-Ressourcen MÜSSEN mit einer OperationOutcome und dem Status Code HTTP 400 - Bad Request abgewiesen werden. Falls der Parameter als einzige Parameter verwendet wird KANN die Appointment-Ressource direkt im HTTP Body anstelle einer Parameter-Ressource übergeben werden. Die referenzierte Ressource MUSS dem YourNameHere-Termin-Profil entsprechen. Invalide Ressource MÜSSEN abgelehnt werden durch das Termin Repository." + * type = #Appointment +* parameter[+] + * name = #cancelled-appt-id + * use = #in + * min = 0 + * max = "1" + * documentation = "Für die vorliegende Spezifikation ist die Verschiebung eines Termin eins zwei-stufiger Prozess, bei dem ein Termin storniert und ein neuer Termin neu gebucht wird. Dieser Parameter repräsentiert die Ressourcen-Id des stornierten Appointments. Der uri-Parameter kann eine absoulte URL enthalten, Server SOLLTEN jedoch nur Termine für ihre eigene Domäne verwalten. Im neu-angelegten Appointment MUSS eine Reference auf den abgesagten Termin hinterlegt werden (vgl. Appointment.extension:replaces). Der Status der abgesagten Ressource MUSS durch den Server angepasst werden." + * type = #uri +* parameter[+] + * name = #schedule + * use = #in + * min = 0 + * max = "1" + * type = #Reference + * documentation = "Im Falle das ein Appointment keine Referenz auf ein oder mehrere Slots enthält MUSS der Server die benötigten Slots auf Basis der Referenz auf Schedule, sowie dem Start- und Endzeitpunkt im Appointment ermitteln." + * targetProfile = Canonical(ExamplePatient) +* parameter[+] + * name = #return + * use = #out + * min = 0 + * max = "1" + * documentation = "Als Return-Parameter wird ein Bundle vom Typ 'searchset' zurückgegeben, welches eine aktualisierte Appointment- oder eine OperationOutcome-Ressource enthält. Im Falle das die Terminbuchung akzeptiert wird MUSS das Appointment persistiert werden. Das id-Element der Ressource MUSS korrekt gefüllt werden. Der Status der Appointment-Ressource muss auf 'booked' geändert werden. Der Server MUSS die verwendeten Slot-Ressourcen als Referenz im Appointment angeben." + * type = #Bundle \ No newline at end of file diff --git a/Resources/input/fsh/Example_Patient.fsh b/Resources/input/fsh/Example_Patient.fsh new file mode 100644 index 0000000..c256d06 --- /dev/null +++ b/Resources/input/fsh/Example_Patient.fsh @@ -0,0 +1,159 @@ +Profile: ExamplePatient +Parent: Patient +Id: ExamplePatient +Description: "Dieses Profil beschreibt die Nutzung von administrativen Patientendaten in YourNameHere-Szenarien." +* insert Meta +* obeys Example-pat-1 +* . ^constraint[5].source = Canonical(ExamplePatient) +* id 1.. MS +* identifier MS + * ^slicing.discriminator.type = #pattern + * ^slicing.discriminator.path = "$this" + * ^slicing.rules = #open +* identifier contains + VersichertenId-GKV 0..1 MS and + Patientennummer 1..* MS and + Versichertennummer_PKV 0..1 +* identifier[VersichertenId-GKV] only IdentifierKvid10 + * ^patternIdentifier.type = $identifier-type-de-basis#GKV + * type 1.. MS + * system MS + * value MS +* identifier[Patientennummer] only IdentifierPid + * ^patternIdentifier.type = $v2-0203#MR + * type MS + * system MS + * value MS +* identifier[Versichertennummer_PKV] only IdentifierPkv + * ^patternIdentifier.type = $identifier-type-de-basis#PKV + * ^mustSupport = false + * use MS + * type 1.. MS + * value MS + * assigner MS + * identifier.system MS + * identifier.value MS + * display MS +* active MS +* name MS + * ^slicing.discriminator.type = #pattern + * ^slicing.discriminator.path = "$this" + * ^slicing.rules = #open + * ^comment = "In order to maintain the differntiations of name parts as given in the VSDM dataset or qualify prefixes as academic titles, vendors can opt to support the extensions specified in the German HumanName Base Profile https://simplifier.net/basisprofil-de-r4/humannamedebasis\r\nThis is however not required within the scope of this specification." +* name contains + Name 1..1 MS and + Geburtsname 0..1 MS +* name[Name] only HumannameDeBasis + * ^patternHumanName.use = #official + * use 1.. MS + * family 1.. MS + * extension[namenszusatz] 0..1 MS + * extension[nachname] 0..1 MS + * extension[vorsatzwort] 0..1 MS + * given 1.. MS + * prefix MS + * extension[prefix-qualifier] 0..1 MS + * extension[prefix-qualifier].value[x] = #AC (exactly) +* name[Geburtsname] only HumannameDeBasis + * ^patternHumanName.use = #maiden + * use 1.. MS + * family 1.. MS + * extension[namenszusatz] 0..1 MS + * extension[nachname] 0..1 MS + * extension[vorsatzwort] 0..1 MS + * given ..0 + * prefix ..0 +* telecom.system 1.. +* telecom.value 1.. +* gender 1.. MS + * extension contains GenderOtherDE named Geschlecht-Administrativ 0..1 MS +* birthDate 1.. MS + * extension contains $data-absent-reason named Data-Absent-Reason 0..1 MS + * extension[Data-Absent-Reason].value[x] = #unknown (exactly) + * extension[Data-Absent-Reason].value[x] MS +* address MS + * ^slicing.discriminator.type = #pattern + * ^slicing.discriminator.path = "$this" + * ^slicing.rules = #open + * ^comment = "In order to differentiate between post box addresses and physical addresses, street names and house numbers, and to add city district names, vendors can opt to support the extensions as suggested in the German Address Base Profile http://fhir.de/StructureDefinition/address-de-basis.\r\nSuch differentiations are however not required within the scope of this specification." +* address contains + Strassenanschrift 0..* MS and + Postfach 0..* MS +* address[Postfach] only AddressDeBasis + * ^patternAddress.type = #postal + * type 1.. MS + * line 1.. MS + * extension[Strasse] 0..0 + * extension[Hausnummer] 0..0 + * extension[Adresszusatz] 0..0 + * extension[Postfach] 0..1 MS + * city 1.. MS + * postalCode 1.. MS + * country 1.. MS + * obeys address-cnt-2or3-char + * ^constraint[1].source = Canonical(ExamplePatient) +* address[Strassenanschrift] only AddressDeBasis + * ^patternAddress.type = #both + * type 1.. MS + * line 1.. MS + * extension[Strasse] 0..1 MS + * extension[Hausnummer] 0..1 MS + * extension[Adresszusatz] 0..1 MS + * extension[Postfach] 0..0 + * city 1.. MS + * postalCode 1.. MS + * country 1.. MS + * obeys address-cnt-2or3-char + * ^constraint[1].source = Canonical(ExamplePatient) + +Instance: PatientinMusterfrau +InstanceOf: ExamplePatient +Usage: #example +* identifier[0].type = $identifier-type-de-basis#GKV +* identifier[=].system = "http://fhir.de/sid/gkv/kvid-10" +* identifier[=].value = "A123456789" +* identifier[+].type = $v2-0203#MR +* identifier[=].system = "https://fhir.krankenhaus.example/NamingSystem/PID" +* identifier[=].value = "TestPID" +* identifier[+].use = #secondary +* identifier[=].type = $identifier-type-de-basis#PKV +* identifier[=].value = "1234567890" +* identifier[=].assigner.display = "Test PKV AG" +* active = true +* name[0].use = #official +* name[=].family = "Fürstin von Musterfrau" + * extension[0].url = "http://fhir.de/StructureDefinition/humanname-namenszusatz" + * extension[=].valueString = "Graf" + * extension[+].url = "http://hl7.org/fhir/StructureDefinition/humanname-own-name" + * extension[=].valueString = "Musterfrau" + * extension[+].url = "http://hl7.org/fhir/StructureDefinition/humanname-own-prefix" + * extension[=].valueString = "von" +* name[=].given = "Erika" +* name[=].prefix = "Dr." + * extension.url = "http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier" + * extension.valueCode = #AC +* name[+].use = #maiden +* name[=].family = "Gabler" + * extension.url = "http://hl7.org/fhir/StructureDefinition/humanname-own-name" + * extension.valueString = "Gabler" +* gender = #female +* birthDate = "1964-08-12" +* address[0].type = #both +* address[=].line[0] = "Musterweg 2" +* address[=].line[+] = "3. Etage" +* address[=].line[0].extension[0].url = "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-streetName" +* address[=].line[=].extension[=].valueString = "Musterweg" +* address[=].line[=].extension[+].url = "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-houseNumber" +* address[=].line[=].extension[=].valueString = "2" +* address[=].line[+].extension.url = "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-additionalLocator" +* address[=].line[=].extension.valueString = "3. Etage" +* address[=].city = "Musterhausen" +* address[=].postalCode = "98764" +* address[=].country = "DE" +* address[+].type = #postal +* address[=].line = "Postfach 8 15" + * extension.url = "http://hl7.org/fhir/StructureDefinition/iso21090-ADXP-postBox" + * extension.valueString = "Postfach 8 15" +* address[=].city = "Musterhausen" +* address[=].postalCode = "98764" +* address[=].country = "DE" \ No newline at end of file diff --git a/Resources/input/fsh/Example_ValueSet.fsh b/Resources/input/fsh/Example_ValueSet.fsh new file mode 100644 index 0000000..6d0f8a9 --- /dev/null +++ b/Resources/input/fsh/Example_ValueSet.fsh @@ -0,0 +1,37 @@ +Profile: ExampleValueSet +Parent: ValueSet +Id: ExampleValueSet +Description: "Dieses Profil beschreibt die maschinenlesbare Auswahl von Codes für die Kodierung spezifischer FHIR-Elemente in YourNameHere-Szenarien" +* insert Meta +* id 1.. MS +* url 1.. MS +* version 1.. MS +* name 1.. MS +* status MS +* useContext 1.. MS +* useContext.code = http://terminology.hl7.org/CodeSystem/usage-context-type#focus +* useContext.value[x] only CodeableConcept +* useContext.value[x] from ResourceType (required) +* useContext.value[x] ^binding.description = "One of the resource types defined as part of this version of FHIR." +* expansion 1.. MS +* expansion.timestamp MS +* expansion.contains 1.. MS +* expansion.contains.system 1.. MS +* expansion.contains.version 1.. MS +* expansion.contains.code 1.. MS +* expansion.contains.display 1.. MS + +Instance: ValueSetExample +InstanceOf: ExampleValueSet +Usage: #example +* url = "http://example.org/fhir/ValueSet/TestValueSet" +* version = "1.0.0" +* name = "TestValueSet" +* status = #active +* useContext.code = http://terminology.hl7.org/CodeSystem/usage-context-type#focus +* useContext.valueCodeableConcept = http://hl7.org/fhir/resource-types#Encounter +* expansion.timestamp = "2022-03-30" +* expansion.contains.system = "http://example.org/fhir/CodeSystem/TestKatalog" +* expansion.contains.version = "1.0.0" +* expansion.contains.code = #test +* expansion.contains.display = "Test" \ No newline at end of file diff --git a/Resources/input/fsh/aliases.fsh b/Resources/input/fsh/aliases.fsh new file mode 100644 index 0000000..8e59e0c --- /dev/null +++ b/Resources/input/fsh/aliases.fsh @@ -0,0 +1,4 @@ +Alias: $v2-0203 = http://terminology.hl7.org/CodeSystem/v2-0203 +Alias: $identifier-type-de-basis = http://fhir.de/CodeSystem/identifier-type-de-basis +Alias: $data-absent-reason = http://hl7.org/fhir/StructureDefinition/data-absent-reason +Alias: $v3-ActCode = http://terminology.hl7.org/CodeSystem/v3-ActCode diff --git a/Resources/input/fsh/codeSystems.fsh b/Resources/input/fsh/codeSystems.fsh new file mode 100644 index 0000000..ff17097 --- /dev/null +++ b/Resources/input/fsh/codeSystems.fsh @@ -0,0 +1,9 @@ +CodeSystem: EncounterPflegeArten +* #langzeitpflege "Langzeitpflege" +* #akutPflege "Akutpflege" +* #intensivpflege "Intensivpflege" +* #palliativpflege "Palliativpflege" +* #behindertenpflege "Behindertenpflege" +* #rehabilitationspflege "Rehabilitationspflege" +* #psychatrischepflege "Psychiatrische Pflege" +* #allgemeinepflege "Allgemeine Pflege" diff --git a/Resources/input/fsh/invariants.fsh b/Resources/input/fsh/invariants.fsh new file mode 100644 index 0000000..f5fc0fc --- /dev/null +++ b/Resources/input/fsh/invariants.fsh @@ -0,0 +1,9 @@ +Invariant: address-cnt-2or3-char +Description: "The content of the country element (if present) SHALL be selected EITHER from ValueSet ISO Country Alpha-2 http://hl7.org/fhir/ValueSet/iso3166-1-2 OR MAY be selected from ISO Country Alpha-3 Value Set http://hl7.org/fhir/ValueSet/iso3166-1-3, IF the country is not specified in value Set ISO Country Alpha-2 http://hl7.org/fhir/ValueSet/iso3166-1-2." +Severity: #warning +Expression: "country.empty() or (country.memberOf('http://hl7.org/fhir/ValueSet/iso3166-1-2') or country.memberOf('http://hl7.org/fhir/ValueSet/iso3166-1-3'))" + +Invariant: Example-pat-1 +Description: "Falls die Geschlechtsangabe 'other' gewählt wird, muss die amtliche Differenzierung per Extension angegeben werden" +Severity: #error +Expression: "gender.exists() and gender='other' implies gender.extension('http://fhir.de/StructureDefinition/gender-amtlich-de').exists()" \ No newline at end of file diff --git a/Resources/input/fsh/readme.txt b/Resources/input/fsh/readme.txt new file mode 100644 index 0000000..f9b6995 --- /dev/null +++ b/Resources/input/fsh/readme.txt @@ -0,0 +1 @@ +This folder contains the fish-input files that wil be used to generate files to Resources/fsh-generated/Resources. \ No newline at end of file diff --git a/Resources/input/fsh/ruleset.fsh b/Resources/input/fsh/ruleset.fsh new file mode 100644 index 0000000..5354532 --- /dev/null +++ b/Resources/input/fsh/ruleset.fsh @@ -0,0 +1,12 @@ +RuleSet: Meta +* ^status = #active +* ^experimental = false +* ^publisher = "gematik GmbH" +* ^date = "2022-06-30" + +RuleSet: Meta-Inst +* status = #active +* experimental = false +* version = "2.0.0" +* publisher = "gematik GmbH" +* date = "2022-06-20" \ No newline at end of file diff --git a/Resources/input/fsh/valueSets.fsh b/Resources/input/fsh/valueSets.fsh new file mode 100644 index 0000000..defb729 --- /dev/null +++ b/Resources/input/fsh/valueSets.fsh @@ -0,0 +1,41 @@ +ValueSet: DiagnosesSCT +Id: DiagnosesSCT +Description: "Enthaelt alle SNOMED Clinical finding, Event und Situation with explicit context codes" +* insert Meta +* include codes from system SNOMED_CT + where concept is-a #404684003 and + concept is-a #272379006 and + concept is-a #243796009 + +ValueSet: ProzedurenCodesSCT +Id: ProzedurenCodesSCT +Description: "Enthaelt alle SNOMED Procedure Codes" +* insert Meta +* include codes from system SNOMED_CT where concept descendent-of #71388002 + +ValueSet: ProzedurenKategorieSCT +Id: ProzedurenKategorieSCT +Description: "Enthaelt alle SNOMED Codes für ein Mapping der OPS Klassentitel" +* insert Meta +* SNOMED_CT#103693007 "Diagnostic procedure" +* SNOMED_CT#363679005 "Imaging" +* SNOMED_CT#387713003 "Surgical procedure" +* SNOMED_CT#18629005 "Administration of medicine" +* SNOMED_CT#277132007 "Therapeutic procedure" +* SNOMED_CT#394841004 "Other category" + +ValueSet: YourNameHereLocationPhysicalType +Id: YourNameHereLocationPhysicalType +* insert Meta +* LocationType#bd "Bed" +* LocationType#ro "Room" +* LocationType#wa "Ward" + + +ValueSet: ExampleAccountType +Id: ExampleAccountType +Title: "ExampleAccountType" +* insert Meta +* $v3-ActCode#AMB "ambulatory" +* $v3-ActCode#IMP "inpatient encounter" + diff --git a/Resources/sushi-config.yaml b/Resources/sushi-config.yaml new file mode 100644 index 0000000..48cd09c --- /dev/null +++ b/Resources/sushi-config.yaml @@ -0,0 +1,15 @@ +canonical: https://gematik.de/fhir/isik/v2/Basismodul +fhirVersion: 4.0.1 +FSHOnly: true +applyExtensionMetadataToRoot: false +id: Implementierungsleitfaden gematik-Basismodul Stufe 1 1.0.0 +name: Implementierungsleitfaden gematik-Basismodul Stufe 1 1.0.0 +status: active +version: # "1.0.0" +publisher: + name: Gematik GmbH + url: https://www.gematik.de/ + email: info@gematik.de +dependencies: + de.basisprofil.r4: 1.4.0 + hl7.fhir.r4.core: 4.0.1 \ No newline at end of file diff --git a/USAGE.md b/USAGE.md new file mode 100644 index 0000000..7902767 --- /dev/null +++ b/USAGE.md @@ -0,0 +1,20 @@ +## Usage <a name = "usage"></a> + +### Installing FHIR tools on your local machine +To set up a development environment with support for FHIR profile compilation and validation: + +1. Ensure you have [Docker](https://www.docker.com/products/docker-desktop) installed on your machine. +2. Clone the repository and open it in [Visual Studio Code](https://code.visualstudio.com/). +3. When prompted, reopen the project in a container. This will build the Docker container based on the provided `Dockerfile`. +4. The container includes: + - [Firely Terminal](https://fire.ly/products/firely-terminal/) for FHIR operations. + - [SUSHI](https://fshschool.org/docs/sushi/) for compiling FHIR Shorthand (FSH) files. + - [HAPI FHIR Validator](https://github.com/hapifhir/hapi-fhir/releases) for validating FHIR profiles. +5. The [`codfsh` VS Code extension](https://marketplace.visualstudio.com/items?itemName=gematikde.codfsh) is also installed in the container for an enhanced FHIR profile development experience. +6. Once the container is built and running, you can use the integrated terminal in VS Code to run SUSHI and the HAPI FHIR Validator. + +Note: The `codfsh` extension settings are pre-configured in the [`.devcontainer/devcontainer.json`](https://code.visualstudio.com/docs/devcontainers/containers) file to use the correct paths for the HAPI Validator and its configuration. + +# Help + +If you find issues with this template project, please leave an issue or create a Pull Request via the [template repository](https://github.com/gematik/spec-TemplateForSimplifierProjects). \ No newline at end of file diff --git a/fhirpkg.lock.json b/fhirpkg.lock.json new file mode 100644 index 0000000..2fb73c2 --- /dev/null +++ b/fhirpkg.lock.json @@ -0,0 +1,9 @@ +{ + "updated": "2023-12-03T14:17:49.0951121+00:00", + "dependencies": { + "de.basisprofil.r4": "1.4.0", + "hl7.fhir.r4.core": "4.0.1", + "de.gematik.isik-basismodul": "2.0.0" + }, + "missing": {} +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..084d444 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "de.gematik.spec-templateforsimplifierprojects", + "version": "0.0.1", + "fhirVersions": [ + "4.0.1" + ], + "dependencies": { + "de.basisprofil.r4": " 1.4.0", + "de.gematik.isik-basismodul": "2.0.0", + "hl7.fhir.r4.core": " 4.0.1" + } +} diff --git a/plantuml.jar b/plantuml.jar new file mode 100644 index 0000000..a532c84 Binary files /dev/null and b/plantuml.jar differ diff --git a/scripts/build_with_replace_includes.sh b/scripts/build_with_replace_includes.sh new file mode 100644 index 0000000..745893f --- /dev/null +++ b/scripts/build_with_replace_includes.sh @@ -0,0 +1,67 @@ +#!/bin/bash +echo "Start building source files" + +# check prerequisites +required_asciidoctor_version="2.0.20" +actual_asciidoctor_version=$(asciidoctor --version) +if ! grep -q "$required_asciidoctor_version" <<<"$actual_asciidoctor_version"; then + echo "Incorrect asciidoctor version. Expected $required_asciidoctor_version but found $actual_asciidoctor_version" + exit 1 +fi + +required_asciidoctor_diagram_version="2.2.14" +actual_asciidoctor_diagram_version=$(gem list | grep "asciidoctor-diagram (") +if ! grep -q "$required_asciidoctor_diagram_version" <<<"$actual_asciidoctor_diagram_version"; then + echo "Incorrect asciidoctor diagram version. Expected $required_asciidoctor_diagram_version but found $actual_asciidoctor_diagram_version" + exit 1 +fi + +# STAGE_1: creates images from the puml files and will store them in /puml/images + +# prepare +cd "$(dirname "$0")" || exit +# rm ../../images/puml_* + +# loop through all puml files and create the image +for filename in $(find ../../puml -name '*.puml'); do + + filebase=$(basename -- "$filename") # test.adoc + name="${filebase%.*}" # test + + if ! git diff --quiet -- "$filename"; then + echo "$filebase has been modified. Creating Puml" + + pumlPath=../puml/${name}.puml + newFileRoot=../puml/${name} + newFileName=${newFileRoot//-source/} + echo "Creating Puml ${name}" + + tempAdocFile=../../docs_sources/${name}.adoc + + # creates a temporary adoc file in order to render with asciidoctor-diagram + touch ${tempAdocFile} + echo "[plantuml, target=../../images/puml_${name}, format=png] +.... +include::${pumlPath}[] +...." >${tempAdocFile} + asciidoctor -r asciidoctor-diagram -o ../puml/$newFileName ../../docs_sources/${name}.adoc + rm ../../docs_sources/${name}.adoc + fi + +done + +# cleanup temp files +if [ -d "../puml" ]; then + rm -r ../puml +fi + +# STAGE_2 this creates new adoc files in /docs/resources + +for filename in $(find ../../docs_sources -name '*.adoc'); do + newFileName=${filename//-source/} + newFileName=${newFileName//_sources/} + asciidoctor-reducer $filename -o $newFileName +done + +# Echo that the process is finished +echo "Finished building source files" diff --git a/scripts/release_publish.py b/scripts/release_publish.py new file mode 100644 index 0000000..92e9cca --- /dev/null +++ b/scripts/release_publish.py @@ -0,0 +1,170 @@ +import re +import subprocess +import os +import argparse +from datetime import date + +class FileWithVersionToUpdate: + def __init__(self, filename, version_regex) -> None: + self.filename = filename + self.version_regex = version_regex + self.location = None + + def set_file_location(self, location): + self.location = location + +class FileWithDateToUpdate: + def __init__(self, filename, date_regex) -> None: + self.filename = filename + self.date_regex = date_regex + self.location = None + + def set_file_location(self, location): + self.location = location + +# class FileWithDateToUpdate: +# def __init__(self, filename, date_regex, format) -> None: +# self.filename = filename +# self.date_regex = date_regex +# self.location = None +# self.format = format +# def set_file_location(self, location): +# self.location = location + + + + +def get_new_release_version_from_branch_name() -> str: + git_branch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).strip().decode() + return git_branch + +def replace_version_in_files(files : list, new_release_version: str): + if files is None: + print("Error: No Files found!") + return + + for file in files: + replace_version_in_file(file,new_release_version) + +def replace_version_in_file(file: FileWithVersionToUpdate,new_release_version: str): + with open(file.location, 'r') as input_file: + input_text = input_file.read() + + output_text = re.sub(file.version_regex, rf'\g<1>{new_release_version}\g<3>', input_text) + print(f"Info: Replaced version with '{new_release_version}' in file '{file.location}'.") + + with open(file.location, 'w') as output_file: + output_file.write(output_text) + +def replace_date_in_files(files : list, new_release_date: str): + if files is None: + print("Error: No Files found!") + return + + for file in files: + replace_date_in_file(file,new_release_date) + +def replace_date_in_file(file: FileWithVersionToUpdate, new_date: str): + with open(file.location, 'r') as input_file: + input_text = input_file.read() + + #output_text = re.sub(file.date_regex, rf'\g<1>{new_date.strftime(file.format)}\g<3>', input_text) #see https://www.programiz.com/python-programming/datetime#:~:text=Python%20format%20datetime&text=It%27s%20more%20common%20to%20use,()%20methods%20to%20handle%20this. + output_text = re.sub(file.date_regex, rf'\g<1>{new_date}\g<3>', input_text) + print(f"Info: Replaced date with '{new_date}' in file '{file.location}'.") + + with open(file.location, 'w') as output_file: + output_file.write(output_text) + +def get_file_to_update_version_list(): + file_list = [] + file_list.append(FileWithVersionToUpdate('package.json', r'("version":\s*")([\d\.]+.*)(")')) + file_list.append(FileWithVersionToUpdate('sushi-config.yaml', r'(version:\s*")(\d+\.\d+\.\d+.*)(")')) + file_list.append(FileWithVersionToUpdate('sushi-config.yaml', r'(version:\s*)(\d+\.\d+\.\d+.*)()')) + file_list.append(FileWithVersionToUpdate('ruleset.fsh', r'(\*\s*version\s*=\s*")([\d\.]+.*)(")')) + file_list.append(FileWithVersionToUpdate('ruleset.fsh', r'(\*\s*\^version\s*=\s*")([\d\.]+.*)(")')) + file_list.append(FileWithVersionToUpdate('Einfuehrung.md', r'(Version: \s*)(\d+\.\d+\.\d+.*)()')) + file_list.append(FileWithVersionToUpdate('ImplementierungsleitfadenIsiK_basismodul.json', r'("version":\s*")([\d\.]+.*)(")')) + file_list.append(FileWithVersionToUpdate('ImplementierungsleitfadenIsiK_Terminplanung.json', r'("version":\s*")([\d\.]+.*)(")')) + return file_list + +def get_file_to_update_date_list(): + file_list = [] + #file_list.append(FileWithDateToUpdate('ruleset.fsh', r'(date\s*=\s*")(\d+\-\d+\-\d+)(")'), '%m/%d/%Y' ) + #file_list.append(FileWithDateToUpdate('Einfuehrung.md', r'(Datum: \s*)(\d+\.\d+\.\d+)()') , '%m/%d/%Y') + file_list.append(FileWithDateToUpdate('ruleset.fsh', r'(\*\s*date\s*=\s*")(\d+\-\d+\-\d+)(")')) + file_list.append(FileWithDateToUpdate('ruleset.fsh', r'(\*\s*\^date\s*=\s*")(\d+\-\d+\-\d+)(")')) + file_list.append(FileWithDateToUpdate('Einfuehrung.md', r'(Datum:\s*)(\d+\.\d+\.\d+.*)()')) + return file_list + + +def locate_files_in_current_project(files: list): + return_list = [] + for current_file in files: + file_location = find_file(current_file.filename, ".") + if file_location is not None: + current_file.set_file_location(file_location) + return_list.append(current_file) + else: + print(f"Warning: File '{current_file.filename}' not found.") + return return_list + +def find_file(name, path="."): + for root, dirs, files in os.walk(path): + + if name in files: + print(f"Info: Found '{name}' in {root}.") + return os.path.join(root, name) + return None + +def get_latest_release_tag(): + cmd = 'git describe --abbrev=0 --tags --match "v*.*.*" HEAD' + try: + output = subprocess.check_output(cmd, shell=True) + return output.decode().strip() + except subprocess.CalledProcessError: + return None + +def output_commit_messages_since_last_release(): + latest_release_tag = get_latest_release_tag() + if latest_release_tag is None: + print("Warning: No release tag found.") + return + + cmd = f'git log --pretty=format:"%s" {latest_release_tag}..HEAD' + try: + output = subprocess.check_output(cmd, shell=True) + print(output.decode()) + except subprocess.CalledProcessError: + print("Warning: Failed to get commit messages.") + +def main(): + today = date.today() + + parser = argparse.ArgumentParser(description='Update release version number') + parser.add_argument('-b', '--branch', action='store_true', help='get new version from branch name') + parser.add_argument('-v', '--version', type=str, help='specify new version number') + parser.add_argument('-o', '--output', action='store_true', help='output commit messages since last release') + # TODO new argument -d if not date_time now + + args = parser.parse_args() + + if args.version: + new_release_version = args.version + elif args.branch: + new_release_version = get_new_release_version_from_branch_name() + else: + parser.error('No new release version specified. Please use either -v or -b to specify the new release version.') + + if args.output: + output_commit_messages_since_last_release() + + file_to_update_version_list = get_file_to_update_version_list() + file_version_list = locate_files_in_current_project(file_to_update_version_list) + replace_version_in_files(file_version_list, new_release_version) + + file_to_update_date_list = get_file_to_update_date_list() + file_date_list = locate_files_in_current_project(file_to_update_date_list) + replace_date_in_files(file_date_list, today) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/setup.sh b/scripts/setup.sh new file mode 100644 index 0000000..196c20e --- /dev/null +++ b/scripts/setup.sh @@ -0,0 +1,13 @@ +#!/bin/bash +rm ./Resources/input/fsh/*.fsh +rm ./Resources/fsh-generated/resources/* +rm ./Material/docs/* +rm ./Material/docs/imgsrc/drawio/* +rm ./Material/docs/imgsrc/plantuml/* +rm ./ImplementationGuide/diagrams/* +rm ./README.md +cat Readme_template.md USAGE.md > ./README.md +rm Readme_template.md +rm USAGE.md +rm INSTALL.md +rm ./scripts/setup.sh