Skip to content

Commit

Permalink
Added in structuremap for D1 and D13. Refactored to reuse duplicated …
Browse files Browse the repository at this point in the history
…FML code. Added some representative examples for D13.
  • Loading branch information
lukeaduncan committed Jan 31, 2025
1 parent c4d2197 commit 6163d5d
Show file tree
Hide file tree
Showing 17 changed files with 636 additions and 257 deletions.
2 changes: 1 addition & 1 deletion input/fsh/examples/IMMZ.C.Patient.1.fsh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Usage: #example
* given[+] = "Thabo"
* given[+] = "Mbulelo"
* gender = #male
* birthDate = "1942-06-18"
* birthDate = "2020-06-18"
* address.text = "123 Main Street, Cape Town, Western Cape, 8001, ZA"
* telecom[immzPhone]
* system = #phone
Expand Down
15 changes: 15 additions & 0 deletions input/fsh/examples/IMMZ.C.Patient.2.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
Instance: IMMZ.C.Patient.2
InstanceOf: IMMZPatient
Usage: #example

* identifier.value = "12345-ZA"
* name[immzName]
* text = "Zanele Mbeki"
* family = "Mbeki"
* given[+] = "Zanele"
* gender = #male
* birthDate = "1998-09-22"
* address.text = "123 Main Street, Cape Town, Western Cape, 8001, ZA"
* telecom[immzPhone]
* system = #phone
* value = "+27 21 465 8000"
3 changes: 2 additions & 1 deletion input/fsh/examples/IMMZ.D1.QuestionnaireResponse.BCG.fsh
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ Usage: #example
* subject = Reference(IMMZ.C.Patient.1)

* insert QRItem( Coding, typeOfDose, IMMZ.D#DE259 "Primary series" )
* insert QRItem( Boolean, completedThePrimaryVaccinationSeries, false )
* insert QRItem( Boolean, completedThePrimaryVaccinationSeries, true )
* insert QRItem( Boolean, completedTheBoosterSeries, false )
* insert QRItem( Date, dateWhenPrimaryVaccinationSeriesWasCompleted, "2020-07-01" )
* insert QRItem( Coding, hivStatus, IMMZ.D#DE206 "HIV-negative" )
* insert QRItem( Boolean, pretermBirth, false )
* insert QRItem( Boolean, immunocompromised, false )
Expand Down
7 changes: 4 additions & 3 deletions input/fsh/examples/IMMZ.D1.QuestionnaireResponse.DTP.fsh
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@ Usage: #example
* status = #completed
* authored = "2025-01-13T19:20:20.913Z"
* questionnaire = Canonical(QIMMZD1)
* subject = Reference(IMMZ.C.Patient.1)
* subject = Reference(IMMZ.C.Patient.2)

* insert QRItem( Coding, typeOfDose, IMMZ.D#DE259 "Primary series" )
* insert QRItem( Boolean, completedThePrimaryVaccinationSeries, false )
* insert QRItem( Boolean, completedTheBoosterSeries, false )
* insert QRItem( Boolean, completedThePrimaryVaccinationSeries, true )
* insert QRItem( Boolean, completedTheBoosterSeries, true )
* insert QRItem( Coding, hivStatus, IMMZ.D#DE206 "HIV-negative" )
* insert QRItem( Boolean, pretermBirth, false )
* insert QRItem( Boolean, immunocompromised, false )
* insert QRItem( Coding, vaccineType, IMMZ.Z#DE24 "DTP-containing vaccines" )
* insert QRItem( DateTime, dateAndTimeOfVaccination, "2020-08-05")
* insert QRItem( Date, contactDate, "2020-08-05" )
* insert QRItem( Integer, ancContactNumber, 5 )
* insert QRItem( Integer, doseNumber, 1 )
30 changes: 30 additions & 0 deletions input/fsh/examples/IMMZ.D13.QuestionnaireResponse.BCG.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
Instance: Example.IMMZ.D13.QuestionnaireResponse.BCG
InstanceOf: QuestionnaireResponse
Usage: #example
* status = #completed
* authored = "2025-01-30T19:20:20.913Z"
* questionnaire = Canonical(QIMMZD13)
* subject = Reference(IMMZ.C.Patient.1)

* insert QRItem( Coding, typeOfDose, IMMZ.D#DE259 "Primary series" )
* insert QRItem( Boolean, completedThePrimaryVaccinationSeries, true )
* insert QRItem( Boolean, completedTheBoosterSeries, false )
* insert QRItem( Date, dateWhenPrimaryVaccinationSeriesWasCompleted, "2020-07-01" )
* insert QRItem( Coding, hivStatus, IMMZ.D#DE206 "HIV-negative" )
* insert QRItem( Coding, vaccineType, IMMZ.Z#DE1 "BCG vaccines" )
* insert QRItem( DateTime, dateAndTimeOfVaccination, "2020-07-01")
* insert QRItem( Date, contactDate, "2020-07-01" )
* insert QRItem( Integer, doseNumber, 1 )
* insert QRItem( Coding, immunizationEventStatus, IMMZ.D#DE2 "Completed" )
* insert QRItem( Coding, vaccineBrand, IMMZ.Ex#brand "Example Brand" )
* insert QRItem( Boolean, liveVaccine, true )
* insert QRItem( Coding, countryOfVaccination, urn:iso:std:iso:3166#ZAF "South Africa" )
* insert QRItem( Coding, administrativeArea, urn:iso:std:iso:3166-2#ZA-WC "Western Cape" )
* insert QRItem( Coding, vaccineManufacturer, IMMZ.Ex#manufacturer "Example Manufacturer" )
* insert QRItem( String, vaccineBatchNumber, "148734" )
* insert QRItem( Coding, vaccineMarketAuthorizationHolder, IMMZ.Ex#marketauth "Example Market Authorization Holder" )
* insert QRItem( Date, expirationDate, "2022-01-01" )
* insert QRItem( Quantity, doseQuantity, 0.05 'mL')
* insert QRItem( String, healthWorkerIdentifier, "8723487" )
* insert QRItem( Decimal, totalDosesInSeries, 1 )
* insert QRItem( Coding, diseaseTargeted, IMMZ.D#DE139 "Tuberculosis" )
26 changes: 26 additions & 0 deletions input/fsh/examples/IMMZ.D13.QuestionnaireResponse.Measles.2.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
Instance: Example.IMMZ.D13.QuestionnaireResponse.Measles.2
InstanceOf: QuestionnaireResponse
Usage: #example
* status = #completed
* authored = "2025-01-30T19:20:20.913Z"
* questionnaire = Canonical(QIMMZD13)
* subject = Reference(IMMZ.C.Patient.1)

* insert QRItem( Coding, typeOfDose, IMMZ.D#DE259 "Primary series" )
* insert QRItem( Boolean, completedThePrimaryVaccinationSeries, false )
* insert QRItem( Boolean, completedTheBoosterSeries, false )
* insert QRItem( Coding, hivStatus, IMMZ.D#DE205 "HIV-positive" )
* insert QRItem( Coding, vaccineType, IMMZ.Z#DE9 "Measles-containing vaccines" )
* insert QRItem( DateTime, dateAndTimeOfVaccination, "2021-03-01")
* insert QRItem( Date, contactDate, "2021-03-01" )
* insert QRItem( Integer, doseNumber, 1 )
* insert QRItem( Coding, immunizationEventStatus, IMMZ.D#DE4 "Not done" )
* insert QRItem( Coding, reasonVaccineWasNotAdministered, IMMZ.D#DE17 "Immunization not carried out for other reasons" )
* insert QRItem( Coding, vaccineBrand, IMMZ.Ex#brand "Example Brand" )
* insert QRItem( Coding, countryOfVaccination, urn:iso:std:iso:3166#ZAF "South Africa" )
* insert QRItem( Coding, vaccineManufacturer, IMMZ.Ex#manufacturer "Example Manufacturer" )
* insert QRItem( Coding, vaccineMarketAuthorizationHolder, IMMZ.Ex#marketauth "Example Market Authorization Holder" )
* insert QRItem( String, healthWorkerIdentifier, "8723487" )
* insert QRItem( Decimal, totalDosesInSeries, 2 )
* insert QRItem( Coding, diseaseTargeted, IMMZ.D#DE129 "Measles" )
* insert QRItem( Date, dueDateOfNextDose, "2021-04-01" )
30 changes: 30 additions & 0 deletions input/fsh/examples/IMMZ.D13.QuestionnaireResponse.Measles.fsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
Instance: Example.IMMZ.D13.QuestionnaireResponse.Measles
InstanceOf: QuestionnaireResponse
Usage: #example
* status = #completed
* authored = "2025-01-30T19:20:20.913Z"
* questionnaire = Canonical(QIMMZD13)
* subject = Reference(IMMZ.C.Patient.1)

* insert QRItem( Coding, typeOfDose, IMMZ.D#DE259 "Primary series" )
* insert QRItem( Boolean, completedThePrimaryVaccinationSeries, false )
* insert QRItem( Boolean, completedTheBoosterSeries, false )
* insert QRItem( Coding, hivStatus, IMMZ.D#DE205 "HIV-positive" )
* insert QRItem( Coding, vaccineType, IMMZ.Z#DE9 "Measles-containing vaccines" )
* insert QRItem( DateTime, dateAndTimeOfVaccination, "2021-04-01")
* insert QRItem( Date, contactDate, "2021-04-01" )
* insert QRItem( Integer, doseNumber, 1 )
* insert QRItem( Coding, immunizationEventStatus, IMMZ.D#DE2 "Completed" )
* insert QRItem( Coding, vaccineBrand, IMMZ.Ex#brand "Example Brand" )
* insert QRItem( Boolean, liveVaccine, true )
* insert QRItem( Coding, countryOfVaccination, urn:iso:std:iso:3166#ZAF "South Africa" )
* insert QRItem( Coding, administrativeArea, urn:iso:std:iso:3166-2#ZA-WC "Western Cape" )
* insert QRItem( Coding, vaccineManufacturer, IMMZ.Ex#manufacturer "Example Manufacturer" )
* insert QRItem( String, vaccineBatchNumber, "454981" )
* insert QRItem( Coding, vaccineMarketAuthorizationHolder, IMMZ.Ex#marketauth "Example Market Authorization Holder" )
* insert QRItem( Date, expirationDate, "2024-01-01" )
* insert QRItem( Quantity, doseQuantity, 0.5 'mL')
* insert QRItem( String, healthWorkerIdentifier, "8723487" )
* insert QRItem( Decimal, totalDosesInSeries, 2 )
* insert QRItem( Coding, diseaseTargeted, IMMZ.D#DE129 "Measles" )
* insert QRItem( Date, dueDateOfNextDose, "2021-10-01" )
4 changes: 2 additions & 2 deletions input/fsh/models/IMMZD13.fsh
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ Description: "Data elements for the IMMZ.D13.Update client record Data Dictiona
* obeys IMMZ-D-statusNotDone-1
* ^code[+] = IMMZ.D#DE5
* ^code[+] = $ICD11#QC04 "Immunization not carried out"
* vaccineBrand 1..1 code "Vaccine brand" "The brand or trade name used to refer to the vaccine received"
* vaccineBrand 1..1 Coding "Vaccine brand" "The brand or trade name used to refer to the vaccine received"
* vaccineBrand from IMMZ.D.DE18 (example)
* ^code[+] = IMMZ.D#DE18
* liveVaccine 0..1 boolean "Live vaccine" "Uses a living but weakened version of the virus or one that is very similar"
Expand Down Expand Up @@ -139,7 +139,7 @@ Description: "Data elements for the IMMZ.D13.Update client record Data Dictiona
* ^code[+] = $LNC#82745-1 "Doses of vaccine given per symptom onset"
* healthWorkerIdentifier 0..1 string "Health worker identifier" "The person, organization or role of the entity that performed the act of giving the vaccine to the client. The implementing system can choose to populate this field using data from a health worker registry or health-care facility registry"
* ^code[+] = IMMZ.D#DE35
* totalDosesInSeries 0..1 decimal "Total doses in series" "The recommended number of doses for immunity according to the national immunization schedule (which may be based on product, age, etc.)"
* totalDosesInSeries 0..1 integer "Total doses in series" "The recommended number of doses for immunity according to the national immunization schedule (which may be based on product, age, etc.)"
* obeys IMMZ-D-reqGTZero-1
* ^code[+] = IMMZ.D#DE125
* diseaseTargeted 0..* Coding "Disease targeted" "Vaccine-preventable disease being targeted"
Expand Down
2 changes: 1 addition & 1 deletion input/maps/IMMZ.C4.QRToLM.fml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ map "http://smart.who.int/immunizations/StructureMap/IMMZ.C4.QRToLM" = "IMMZ.C4.
uses "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" alias QResp as source
uses "http://smart.who.int/immunizations/StructureDefinition/IMMZC4" alias immz as target

imports "http://smart.who.int/immunizations/StructureMap/IMMZ.QRToLM"
imports "http://smart.who.int/immunizations/StructureMap/IMMZ.Helpers"


group QRespToIMMZC ( source qr : QResp, target immz : IMMZC) {
Expand Down
123 changes: 7 additions & 116 deletions input/maps/IMMZ.D1.LMToBundle.fml
Original file line number Diff line number Diff line change
Expand Up @@ -6,131 +6,22 @@ uses "http://hl7.org/fhir/StructureDefinition/Bundle" alias Bundle as target
// uses "http://hl7.org/fhir/StructureDefinition/Patient" alias Patient as produced
// uses "http://hl7.org/fhir/StructureDefinition/RelatedPerson" alias RelatedPerson as produced

group IMMZD1ToBundle (source immz : IMMZD1, target bundle: Bundle) {

immz -> bundle.type = "transaction" "SetBundleType";

immz.patient as patient then {

immz.vaccineType as vaccineCode -> uuid() as iid,
bundle.entry as entry,
entry.fullUrl = append("urn:uuid:", iid),
entry.request as request,
request.method = "PUT",
request.url = append("Immunization/", iid),
entry.resource = create("Immunization") as imm then {

vaccineCode -> imm.vaccineCode = vaccineCode "SetVaccineCode";
immz.typeOfDose as typeOfDose -> imm.protocolApplied as pa then {
typeOfDose.code as code -> pa.series = code "SetSeriesToCode"; // if display is missing
typeOfDose.display as display -> pa.series = display "SetSeriesToDisplay";
immz.doseNumber as doseNumber -> pa.doseNumber = doseNumber "SetDoseNumber";
} "protocolApplied";

} "MakeImmunization";

immz.birthDose as content -> uuid() as oid,
bundle.entry as entry,
entry.fullUrl = append("urn:uuid:", oid),
entry.request as request,
request.method = "PUT",
request.url = append("Observation/", oid),
entry.resource = create("Observation") as obs,
c('http://smart.who.int/immunizations/CodeSystem/IMMZ.D', 'DE263', 'Birth dose') as code
then MakeObservation( patient, code, content, obs ) "birthDose";
imports "http://smart.who.int/immunizations/StructureMap/IMMZ.Helpers"

immz.completedThePrimaryVaccinationSeries as content -> uuid() as oid,
bundle.entry as entry,
entry.fullUrl = append("urn:uuid:", oid),
entry.request as request,
request.method = "PUT",
request.url = append("Observation/", oid),
entry.resource = create("Observation") as obs,
c('http://smart.who.int/immunizations/CodeSystem/IMMZ.D', 'DE203', 'Completed the primary vaccination series') as code
then MakeObservation( patient, code, content, obs ) "completedThePrimaryVaccinationSeries";

immz.completedTheBoosterSeries as content -> uuid() as oid,
bundle.entry as entry,
entry.fullUrl = append("urn:uuid:", oid),
entry.request as request,
request.method = "PUT",
request.url = append("Observation/", oid),
entry.resource = create("Observation") as obs,
c('http://smart.who.int/immunizations/CodeSystem/IMMZ.D', 'DE257', 'Completed the booster series') as code
then MakeObservation( patient, code, content, obs ) "completedTheBoosterSeries";

immz.dateWhenPrimaryVaccinationSeriesWasCompleted as content -> uuid() as oid,
bundle.entry as entry,
entry.fullUrl = append("urn:uuid:", oid),
entry.request as request,
request.method = "PUT",
request.url = append("Observation/", oid),
entry.resource = create("Observation") as obs,
c('http://smart.who.int/immunizations/CodeSystem/IMMZ.D', 'DE242', 'Date when primary vaccination series was completed') as code
then MakeObservation( patient, code, content, obs ) "dateWhenPrimaryVaccinationSeriesWasCompleted";

} "GetPatient";

group IMMZD1ToBundle (source immz : IMMZD1, target bundle: Bundle) {

/*
immz -> bundle.type = "transaction" "SetBundleType";

immz -> uuid() as pid,
bundle.entry as entry,
entry.fullUrl = append("urn:uuid:", pid),
entry.request as request,
request.method = "PUT",
request.url = append("Patient/", pid),
entry.resource = create("Patient") as patient
then {

immz -> patient.id = pid "SetId";

immz.uniqueId as id -> patient.identifier as identifier then {
id -> identifier.value = id "SetIdentifierValue";
} "SetIdentifier";

immz -> patient.name as pname then {
immz.name as fullName -> pname.text = fullName "SetFullName";
immz.firstName as firstName -> pname.given = firstName "SetFirstName";
immz.familyName as familyName -> pname.family = familyName "SetFamilyName";
}"SetName";
immz.patient as patient -> uuid() as immid then {

immz.sex as sex -> patient.gender = translate(sex, 'http://smart.who.int/immunizations/ConceptMap/IMMZ.C.ConceptMap', 'code') "SetGender";
immz then MakeImmunization( patient, immid, immz, bundle ) "MakeImmunization";

immz.dateOfBirth as birthDate -> patient.birthDate = birthDate "SetBirthDate";
immz then D1andD13Observations( patient, immid, immz, bundle ) "MakeD1andD13Observations";

immz.contactPhoneNumber as phone -> patient.telecom as telecom then {
phone as content -> telecom.value = content, telecom.system = 'phone' "SetPhoneValue";
} "SetPhone";
immz then D1Observations( patient, immid, immz, bundle ) "MakeD1Observations";

immz.address as address -> patient.address as taddress then {
address as content -> taddress.text = content "SetAddressText";
} "SetAddress";

immz.caregiversMultiple as caregiver -> uuid() as rpid,
bundle.entry as entry,
entry.fullUrl = append("urn:uuid:", rpid),
entry.request as request,
request.method = "PUT",
request.url = append("RelatedPerson/", rpid),
entry.resource = create("RelatedPerson") as person
then {
caregiver -> person.id = rpid "SetId";
caregiver -> person.patient as patient, patient.reference = append("Patient/", pid ) "setPatient";
caregiver -> person.name as pname then {
caregiver.caregiversFullName as fullName -> pname.text = fullName "SetFullName";
caregiver.caregiversFirstName as firstName -> pname.given = firstName "SetFirstName";
caregiver.caregiversFamilyName as familyName -> pname.family = familyName "SetFamilyName";
} "SetCaregiverName";
} "CreateRelatedPerson";
} "GetPatient";

} "CreatePatient";
*/
}

group MakeObservation( source patient : Reference, source code : Coding, source value, target obs ) {
patient -> obs.subject = patient "SetSubject";
code -> obs.code = code "SetCode";
value -> obs.value = value "SetValue";
}
Loading

0 comments on commit 6163d5d

Please sign in to comment.