Skip to content

Commit

Permalink
Framework
Browse files Browse the repository at this point in the history
  • Loading branch information
patrickwladowska committed Aug 31, 2022
1 parent eca0543 commit 364cda9
Show file tree
Hide file tree
Showing 10 changed files with 364 additions and 0 deletions.
50 changes: 50 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# 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 push or pull request events but only for the master branch
push:
branches: [ master ]
pull_request:
branches: [ master ]

# 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/[email protected]
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_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/'
5 changes: 5 additions & 0 deletions INSTALL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
1. Create GitHub Repsitory
2. Follow the instructions to create the first project via GitHub webpage
3. Settings > Actions > check "Allow all actions and reusable workflows" + "Require approval for first-time contributers" + "Read and write permissions" + "Allow GitHub Actions to create and approve pull requests" > save ;)
4. Settings > Secrets > create repository secrets > "SIMPLIFIER_PASSWORD" + "SIMPLIFIER_USERNAME" + values
5. Settings > Brances > Branch protection rule > Add rule > check "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 ;)
164 changes: 164 additions & 0 deletions Resources/input/fsh/Example_Patient.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
Profile: ISiKPatient
Parent: Patient
Id: ISiKPatient
Description: "Dieses Profil beschreibt die Nutzung von administrativen Patientendaten in ISiK-Szenarien."
* insert Meta
* obeys isik-pat-1
* . ^constraint[5].source = Canonical(ISiKPatient)
* 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(ISiKPatient)
* 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(ISiKPatient)

Instance: PatientinMusterfrau
InstanceOf: ISiKPatient
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"

Invariant: isik-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()"
37 changes: 37 additions & 0 deletions Resources/input/fsh/Example_ValueSet.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
Profile: ISiKValueSet
Parent: ValueSet
Id: ISiKValueSet
Description: "Dieses Profil beschreibt die maschinenlesbare Auswahl von Codes für die Kodierung spezifischer FHIR-Elemente in ISiK-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: ISiKValueSetExample
InstanceOf: ISiKValueSet
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"
41 changes: 41 additions & 0 deletions Resources/input/fsh/aliases.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
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

/*
// Backup
Alias: $loinc = http://loinc.org
Alias: $sct = http://snomed.info/sct
Alias: $condition-clinical = http://terminology.hl7.org/CodeSystem/condition-clinical
Alias: $diagnosis-role = http://terminology.hl7.org/CodeSystem/diagnosis-role
Alias: $v3-ActCode = http://terminology.hl7.org/CodeSystem/v3-ActCode
Alias: $DiagnosisRole = http://terminology.hl7.org/CodeSystem/diagnosis-role
Alias: $LocationPhysicalType = http://terminology.hl7.org/CodeSystem/location-physical-type
Alias: $icd-10-gm = http://fhir.de/CodeSystem/bfarm/icd-10-gm
Alias: $icd-10-gm-mehrfachcodierungs-kennzeichen-cs = http://fhir.de/CodeSystem/icd-10-gm-mehrfachcodierungs-kennzeichen
Alias: $icd-10-gm-mehrfachcodierungs-kennzeichen-sd = http://fhir.de/StructureDefinition/icd-10-gm-mehrfachcodierungs-kennzeichen
Alias: $AufnahmegrundErsteUndZweiteStelle = http://fhir.de/CodeSystem/dkgev/AufnahmegrundErsteUndZweiteStelle
Alias: $AufnahmegrundDritteStelle = http://fhir.de/CodeSystem/dkgev/AufnahmegrundDritteStelle
Alias: $AufnahmegrundVierteStelle = http://fhir.de/CodeSystem/dkgev/AufnahmegrundVierteStelle
Alias: $kontaktart-de = http://fhir.de/CodeSystem/kontaktart-de
Alias: $Kontaktebene = http://fhir.de/CodeSystem/Kontaktebene
Alias: $FachabteilungsschluesselCS = http://fhir.de/CodeSystem/dkgev/Fachabteilungsschluessel
Alias: $FachabteilungsschluesselVS = http://fhir.de/ValueSet/dkgev/Fachabteilungsschluessel
Alias: $FachabteilungsschluesselErweitertCS = http://fhir.de/CodeSystem/dkgev/Fachabteilungsschluessel-erweitert
Alias: $FachabteilungsschluesselErweitertVS = http://fhir.de/ValueSet/dkgev/Fachabteilungsschluessel-erweitert
Alias: $Aufnahmeanlass = http://fhir.de/CodeSystem/dgkev/Aufnahmeanlass
Alias: $EntlassungsgrundErsteUndZweiteStelle = http://fhir.de/CodeSystem/dkgev/EntlassungsgrundErsteUndZweiteStelle
Alias: $EntlassungsgrundDritteStelle = http://fhir.de/CodeSystem/dkgev/EntlassungsgrundDritteStelle
Alias: $ops = http://fhir.de/CodeSystem/bfarm/ops
Alias: $versicherungsart-de-basis = http://fhir.de/CodeSystem/versicherungsart-de-basis
Alias: $WahlleistungExtension = http://fhir.de/StructureDefinition/Wahlleistung
Alias: $Abrechnungsart = http://fhir.de/CodeSystem/dkgev/Abrechnungsart
Alias: $alpha-id = http://fhir.de/ValueSet/bfarm/alpha-id
Alias: $condition-related = http://hl7.org/fhir/StructureDefinition/condition-related
Alias: $data-absent-reason = http://hl7.org/fhir/StructureDefinition/data-absent-reason
Alias: $diagnosesSCT = https://gematik.de/fhir/isik/v2/Basismodul/ValueSet/DiagnosesSCT
Alias: $ProzedurenKategorieSCT = https://gematik.de/fhir/isik/v2/Basismodul/ValueSet/ProzedurenKategorieSCT
Alias: $KBV_VS_Base_Practitioner_Speciality = https://fhir.kbv.de/ValueSet/KBV_VS_Base_Practitioner_Speciality
Alias: $ProzedurenCodesSCT = https://gematik.de/fhir/isik/v2/Basismodul/ValueSet/ProzedurenCodesSCT
Alias: $capabilitystatement-expectation = http://hl7.org/fhir/StructureDefinition/capabilitystatement-expectation
*/
1 change: 1 addition & 0 deletions Resources/input/fsh/codeSystems.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

4 changes: 4 additions & 0 deletions Resources/input/fsh/invariants.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
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'))"
5 changes: 5 additions & 0 deletions Resources/input/fsh/ruleset.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
RuleSet: Meta
* ^status = #active
* ^experimental = false
* ^publisher = "gematik GmbH"
* ^date = "2022-06-30"
41 changes: 41 additions & 0 deletions Resources/input/fsh/valueSets.fsh
Original file line number Diff line number Diff line change
@@ -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: ISiKLocationPhysicalType
Id: ISiKLocationPhysicalType
* insert Meta
* LocationType#bd "Bed"
* LocationType#ro "Room"
* LocationType#wa "Ward"


ValueSet: ISiKAccountType
Id: ISiKAccountType
Title: "ISiKAccountType"
* insert Meta
* $v3-ActCode#AMB "ambulatory"
* $v3-ActCode#IMP "inpatient encounter"

16 changes: 16 additions & 0 deletions Resources/sushi-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
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: [email protected]
dependencies:
de.basisprofil.r4: 1.4.0
hl7.fhir.r4.core: 4.0.1
hl7.fhir.extensions.r5: 4.0.1

0 comments on commit 364cda9

Please sign in to comment.