SDOH Clinical Care
2.2.0 - STU 2.2 United States of America flag

SDOH Clinical Care, published by HL7 International / Patient Care. This guide is not an authorized publication; it is the continuous build for version 2.2.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/HL7/fhir-sdoh-clinicalcare/ and changes regularly. See the Directory of published versions

StructureMap: SDOHCCPRAPAREMap

Official URL: http://hl7.org/fhir/us/sdoh-clinicalcare/StructureMap/SDOHCC-StructureMapPRAPARE Version: 2.2.0
Standards status: Trial-use Computable Name: SDOHCCPRAPAREMap
/// name = "SDOHCCPRAPAREMap"
/// status = draft
/// title = "SDOHCC StructureMap PRAPARE"
/// description = "A StructureMap instance that represents the resource that transforms specific questions and answers from the PRAPARE questionnaire represented in LOINC (code 93025-5) into their corresponding Observations and derived Conditions (health concerns)."


// This is a more complex example where the author has chosen to extract *all* answers to Observations and to create a grouping Observation

map "http://hl7.org/fhir/us/sdoh-clinicalcare/StructureMap/SDOHCC-StructureMapPRAPARE" = "SDOHCCPRAPAREMap"

uses "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaireresponse" alias questionnaireResponse as source
uses "http://hl7.org/fhir/StructureDefinition/Bundle" as target
uses "http://hl7.org/fhir/StructureDefinition/Observation" as target
uses "http://hl7.org/fhir/StructureDefinition/Condition" alias sdohccCondition as target
uses "http://hl7.org/fhir/StructureDefinition/Observation" alias sdohccObservation as target

group sdohMapping(source src : questionnaireResponse, target bundle : Bundle) {
  //temporarily set id to human-readable id as example
  //src -> bundle.id = uuid();
  src -> bundle.id = 'SDOHCC-BundlePRAPAREExample' "bundleId";
  src -> bundle.type = 'transaction' "bundleType";
    
  //for each answer item in the questionnareResponse, create an Observation and add it to the groupObservation
  src.item as rootItem then 
    rootContent(src, rootItem, bundle);

  //create group observation containing all observations as hasMember
  src -> bundle.entry as entry, entry.resource = create('sdohccObservation') as groupObservation then 
    TransformGroupObservation(src, bundle, groupObservation, entry) "bundleGroupObsn";  
}

group rootContent(source qResponse: questionnaireResponse, source rootItem, target bundle) {
  rootItem.item as groupItem then 
    groupContent(qResponse, groupItem, bundle);
}

group groupContent(source qResponse: questionnaireResponse, source groupItem, target bundle) {
  groupItem.item as answerItem then
    itemContent(qResponse, answerItem, bundle);
}

group itemContent(source qResponse: questionnaireResponse, source answerItem, target bundle) {
  //create a single Observation for questions that can only have one answer
  answerItem where answerItem.linkId != '/93043-8/32624-9' and answerItem.linkId != '/93041-2/93031-3' and answerItem.linkId != '/93041-2/93030-5'-> bundle.entry as entry, entry.resource = create('sdohccObservation') as observation then 
    TransformObservation(qResponse, answerItem, bundle, observation, entry, bundle) "obsn";

  //create multiple Observations for each answer on questions that can have multiple answers (Question 2, 14 and 15)
  answerItem.answer as answer where answerItem.linkId = '/93043-8/32624-9' or answerItem.linkId = '/93041-2/93031-3' or answerItem.linkId = '/93041-2/93030-5' -> bundle.entry as entry, entry.resource = create('sdohccObservation') as observation then 
    TransformObservation(qResponse, answerItem, bundle, observation, entry, bundle),
    SetValueCodeableConceptFromAnswer(answer, observation);
}

group SetValueCodeableConceptFromAnswer(source answer, target observation) {
  answer -> observation.value = create('CodeableConcept') as newCC then {
    answer.value as coding -> newCC.coding = coding as newCoding;
  } "obsnValue";
}

group TransformObservation(source src: questionnaireResponse, source answerItem, source srcBundle: Bundle, target observation: sdohccObservation, target entry, target bundle: Bundle)
{
  src -> observation.id = uuid() then
  	SetObservationFullUrl(observation, entry) "obsnFullUrl";
  src -> observation.status = 'final' "obsnStatus";
  src -> observation.category = cc('http://terminology.hl7.org/CodeSystem/observation-category', 'social-history', 'Social History') "obsnCatSocialHistory";
  src -> observation.category = cc('http://terminology.hl7.org/CodeSystem/observation-category', 'survey', 'Survey') "obsnCatSurvey";
 
  src -> observation.meta = create('Meta') as newMeta then {
    src -> newMeta.profile = 'http://hl7.org/fhir/us/sdoh-clinicalcare/StructureDefinition/SDOHCC-ObservationScreeningResponse' "obsnMetaProfile";
  } "obsnMeta";

  //set dates
  src.authored as authored -> observation.issued = authored, observation.effective = authored;
  
  src.subject as qSubject -> observation.subject = create('Reference') as newReference then {
    qSubject.reference as qReference -> newReference.reference = qReference;
    qSubject.display as qDisplay -> newReference.display = qDisplay;
  };
  src.subject as qSubject -> observation.performer = create('Reference') as newReference then {
    qSubject.reference as qReference -> newReference.reference = qReference;
    qSubject.display as qDisplay -> newReference.display = qDisplay;
  };  

  src.id as id -> observation.derivedFrom = create('Reference') as newReference then {
    id -> newReference.reference = append('QuestionnaireResponse/', id) "obsnDerivedFromReference";
  } "obsnDerivedFrom";

  //answerItem.answer as answer -> observation.id = uuid() then
  //	SetValue(answer, observation);

  //Set observation.code mapping for each corresponding answer

  // 1. Ethnicity
  answerItem where linkId = '/93043-8/56051-6' -> observation.code = cc('http://loinc.org', '56051-6') as code then 
    SetValueCodeableConcept(answerItem, observation) "obsnCodeEthnicity";
  answerItem where linkId = '/93043-8/56051-6' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'sdoh-category-unspecified' "obsnCatCodingCode";
      src -> newCoding.display = 'SDOH Category Unspecified' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 2. Race
  //TBD: How to handle "Others" text?
  answerItem where linkId = '/93043-8/32624-9' -> observation.code = cc('http://loinc.org', '32624-9') as code "obsCodeRace";
  answerItem where linkId = '/93043-8/32624-9' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'sdoh-category-unspecified' "obsnCatCodingCode";
      src -> newCoding.display = 'SDOH Category Unspecified' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 3. Farm Worker Status
  answerItem where linkId = '/93043-8/93035-4' -> observation.code = cc('http://loinc.org', '93035-4') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeFarmWorkerStatus";
  answerItem where linkId = '/93043-8/93035-4' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'sdoh-category-unspecified' "obsnCatCodingCode";
      src -> newCoding.display = 'SDOH Category Unspecified' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 4. Veteran Status
  answerItem where linkId = '/93043-8/93034-7' -> observation.code = cc('http://loinc.org', '93034-7') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeVetStatus";
  answerItem where linkId = '/93043-8/93034-7' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'veteran-status' "obsnCatCodingCode";
      src -> newCoding.display = 'Veteran Status' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";  
  
  // 5. English Proficiency
  answerItem where linkId = '/93043-8/54899-0' -> observation.code = cc('http://loinc.org', '54899-0') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeEngProf";
  answerItem where linkId = '/93043-8/54899-0' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'sdoh-category-unspecified' "obsnCatCodingCode";
      src -> newCoding.display = 'SDOH Category Unspecified' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 6. Household Size
  answerItem where linkId = '/93042-0/63512-8' -> observation.code = cc('http://loinc.org', '63512-8') as code then {
    answerItem.answer as answer -> observation.value = create('Quantity') as newQty then {
      answer.value as vs -> newQty.value = vs "obsnQtyValue";
      src -> newQty.unit = '{#}' "obsnQtyUnit";
      src -> newQty.system = 'http://unitsofmeasure.org' "obsnQtySystem";
      src -> newQty.code = '{#}' "obsnQtyCode";
    } "obsnValue";
  } "obsnCodeHouseholdSize";
  answerItem where linkId = '/93042-0/63512-8' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'sdoh-category-unspecified' "obsnCatCodingCode";
      src -> newCoding.display = 'SDOH Category Unspecified' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 7. Housing
  answerItem where linkId = '/93042-0/71802-3' -> observation.code = cc('http://loinc.org', '71802-3') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeHousing";
  answerItem where linkId = '/93042-0/71802-3' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'homelessness' "obsnCatCodingCode";
      src -> newCoding.display = 'Homelessness' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 8. Housing Status
  answerItem where linkId = '/93042-0/93033-9' -> observation.code = cc('http://loinc.org', '93033-9') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeHousingStatus";
  answerItem where linkId = '/93042-0/93033-9' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'housing-instability' "obsnCatCodingCode";
      src -> newCoding.display = 'Housing Instability' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 9. Neighborhood
  answerItem where linkId = '/93042-0/56799-0' -> observation.code = cc('http://loinc.org', '56799-0') as code then
    SetValue(answerItem, observation) "obsnCodeNeighborhood";
  answerItem where linkId = '/93042-0/56799-0' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'sdoh-category-unspecified' "obsnCatCodingCode";
      src -> newCoding.display = 'SDOH Category Unspecified' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 10. Education
  answerItem where linkId = '/93041-2/82589-3' -> observation.code = cc('http://loinc.org', '82589-3') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeEducation";
  answerItem where linkId = '/93041-2/82589-3' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'educational-attainment' "obsnCatCodingCode";
      src -> newCoding.display = 'Educational Attainment' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 11. Employment
  answerItem where linkId = '/93041-2/67875-5' -> observation.code = cc('http://loinc.org', '67875-5') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeEmployment";
  answerItem where linkId = '/93041-2/67875-5' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'employment-status' "obsnCatCodingCode";
      src -> newCoding.display = 'Employment Status' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 12. Insurance
  answerItem where linkId = '/93041-2/76437-3' -> observation.code = cc('http://loinc.org', '76437-3') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeInsurance";
  answerItem where linkId = '/93041-2/76437-3' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'health-insurance-coverage-status' "obsnCatCodingCode";
      src -> newCoding.display = 'Health Insurance Coverage Status' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 13. Household Income
  answerItem where linkId = '/93041-2/63586-2' -> observation.code = cc('http://loinc.org', '63586-2') as code then {
    answerItem.answer as answer -> observation.value = create('Quantity') as newQty then {
      answer.value as vs -> newQty.value = vs "obsnQtyValue";
      src -> newQty.unit = '/a' "obsnQtyUnit";
      src -> newQty.system = 'http://unitsofmeasure.org' "obsnQtySystem";
      src -> newQty.code = '/a' "obsnQtyCode";
    } "obsnBalue";
  } "obsnCodeHouseholdIncome";
  answerItem where linkId = '/93041-2/63586-2' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'sdoh-category-unspecified' "obsnCatCodingCode";
      src -> newCoding.display = 'SDOH Category Unspecified' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";  

  // 14. Material Security
  answerItem where linkId = '/93041-2/93031-3' -> observation.code = cc('http://loinc.org', '93031-3') as code "obsnCodeMaterialSecurity";
  // answer: Food
  answerItem where linkId = '/93041-2/93031-3' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'material-hardship' "obsnCatCodingCode";
      src -> newCoding.display = 'Material Hardship' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";
  
  // 15. Transportation
  answerItem where linkId = '/93041-2/93030-5' -> observation.code = cc('http://loinc.org', '93030-5') as code "obsnCodeTransportation";
  answerItem where linkId = '/93041-2/93030-5' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'transportation-insecurity' "obsnCatCodingCode";
      src -> newCoding.display = 'Transportation Insecurity' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 16. Social Integration
  answerItem where linkId = '/93040-4/93029-7' -> observation.code = cc('http://loinc.org', '93029-7') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeSocInteg";
  answerItem where linkId = '/93040-4/93029-7' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'social-connection' "obsnCatCodingCode";
      src -> newCoding.display = 'Social Connection' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 17. Stress
  answerItem where linkId = '/93040-4/93038-8' -> observation.code = cc('http://loinc.org', '93038-8') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeStress";
  answerItem where linkId = '/93040-4/93038-8' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'stress' "obsnCatCodingCode";
      src -> newCoding.display = 'Stress' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 18. Incarceration
  answerItem where linkId = '/93039-6/93028-9' -> observation.code = cc('http://loinc.org', '93028-9') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeIncarceration";
  answerItem where linkId = '/93039-6/93028-9' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'sdoh-category-unspecified' "obsnCatCodingCode";
      src -> newCoding.display = 'SDOH Category Unspecified' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 19. Refugee
  answerItem where linkId = '/93039-6/93027-1' -> observation.code = cc('http://loinc.org', '93027-1') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeRefugee";
  answerItem where linkId = '/93039-6/93027-1' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'sdoh-category-unspecified' "obsnCatCodingCode";
      src -> newCoding.display = 'SDOH Category Unspecified' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 20. Safety
  answerItem where linkId = '/93039-6/93026-3' -> observation.code = cc('http://loinc.org', '93026-3') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeSafety";
  answerItem where linkId = '/93039-6/93026-3' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'sdoh-category-unspecified' "obsnCatCodingCode";
      src -> newCoding.display = 'SDOH Category Unspecified' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  // 21. Domestic Violence
  answerItem where linkId = '/93039-6/76501-6' -> observation.code = cc('http://loinc.org', '76501-6') as code then
    SetValueCodeableConcept(answerItem, observation) "obsnCodeDomViolence";
  answerItem where linkId = '/93039-6/76501-6' -> observation.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "obsnCatCodingSystem";
      src -> newCoding.code = 'intimate-partner-violence' "obsnCatCodingCode";
      src -> newCoding.display = 'Intimate Partner Violence' "obsnCatCodingDisplay";
    } "obsnCatCoding";
  } "obsnCat";

  //create a Condition if homeless
  answerItem where linkId = '/93042-0/71802-3' and answer.value.code ='LA30190-5' -> bundle.entry as entry, entry.resource = create('sdohccCondition') as condition then
    TransformCondition(src, bundle, condition, entry), SetConditionCodeAndEvidence1(src, srcBundle, condition) "conditionHomeless";

  //create a Condition if unemployed
  answerItem where linkId = '/93041-2/67875-5' and answer.value.code ='LA17956-6' -> bundle.entry as entry, entry.resource = create('sdohccCondition') as condition then
    TransformCondition(src, bundle, condition, entry), SetConditionCodeAndEvidence2(src, srcBundle, condition) "conditionUnemployed";

  src -> entry.request as request then {
    src -> request.method = 'POST' "obsnRequestMethod";
    src -> request.url = 'Observation' "obsnRequestUrl";
  } "obsnEntryRequest";
}

group SetValue(source answerItem, target observation) {
  answerItem.answer as answer -> observation.id as id then {
    answer.value as vs -> observation.value = vs;
  };
}

group SetValueCodeableConcept(source src, target observation) {
  src.answer as answer -> observation.value = create('CodeableConcept') as newCC then {
    answer.value as coding -> newCC.coding = coding as newCoding;
  };
}

group SetObservationFullUrl(source observation: Observation, target entry)
{
  observation.id as id -> entry.fullUrl = append('http://hl7.org/fhir/us/sdoh-clinicalcare/Observation/', id);
}

group TransformCondition(source src: questionnaireResponse, source bundle, target condition: sdohccCondition, target entry)
{
  src -> condition.id = uuid() then
    SetConditionFullUrl(condition, entry) "conditionFullUrl";

  src -> condition.meta = create('Meta') as newMeta then {
    src -> newMeta.profile = 'http://hl7.org/fhir/us/sdoh-clinicalcare/StructureDefinition/SDOHCC-Condition' "conditionMetaProfile";
  } "conditionMeta";

  src -> condition.clinicalStatus = cc('http://terminology.hl7.org/CodeSystem/condition-clinical', 'active', 'Active') "conditionClinicalStatus";
  src -> condition.verificationStatus = cc('http://terminology.hl7.org/CodeSystem/condition-ver-status', 'unconfirmed', 'Unconfirmed') "conditionVerificationStatus";

  src -> condition.category = create('CodeableConcept') as newCC then {
    src -> newCC.coding = create('Coding') as newCoding then {
      src -> newCoding.system = 'http://hl7.org/fhir/us/core/CodeSystem/condition-category' "conditionCatCodingSystem";
      src -> newCoding.code = 'health-concern' "conditionCatCodingCode";
      src -> newCoding.display = 'Health Concern' "conditionCatCodingDisplay";
    } "conditionCatCoding";
  } "conditionCat";
    
  src.authored as authored -> condition.onset = create('Period') as period,
    period.start = authored "conditionOnset";

  src.subject as qSubject -> condition.subject = create('Reference') as newReference then {
    qSubject.reference as qReference -> newReference.reference = qReference;
    qSubject.display as qDisplay -> newReference.display = qDisplay;
  };

  src.subject as qSubject -> condition.asserter = create('Reference') as newReference then {
    qSubject.reference as qReference -> newReference.reference = qReference;
    qSubject.display as qDisplay -> newReference.display = qDisplay;
  };

  src -> entry.request as request then {
    src -> request.method = 'POST' "conditionRequestMethod";
    src -> request.url = 'Condition' "conditionRequestUrl";
  } "conditionEntryRequest";    
}

group SetConditionFullUrl(source condition: sdohccCondition, target entry)
{
  condition.id as id -> entry.fullUrl = append('http://hl7.org/fhir/us/sdoh-clinicalcare/Condition/', id);
}

group SetConditionCodeAndEvidence1(source src: questionnaireResponse, source bundle, target condition)
{
  src -> condition.code = create('CodeableConcept') as newCodeCC then {
      src -> newCodeCC.coding = create('Coding') as newCoding then {
        src -> newCoding.system = 'http://snomed.info/sct' "conditionCodeCodingSystem";
        src -> newCoding.code = '32911000' "conditionCodeCodingCode";
        src -> newCoding.display = 'Homeless' "conditionCodeCodingDisplay";
    } "conditionCoding";
    src -> newCodeCC.coding = create('Coding') as newCoding2 then {
        src -> newCoding2.system = 'http://hl7.org/fhir/sid/icd-10-cm' "conditionCodeCodingSystem";
        src -> newCoding2.code = 'Z59.0' "conditionCodeCodingCode";
        src -> newCoding2.display = 'Homelessness' "conditionCodeCodingDisplay";
    } "conditionCoding";
  } "conditionCode";
  
  //Add sdoh category
  src -> condition.category = create('CodeableConcept') as newCC then {
      src -> newCC.coding = create('Coding') as newCoding then {
        src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "conditionCatCodingSystem";
        src -> newCoding.code = 'homelessness' "conditionCatCodingCode";
        src -> newCoding.display = 'Homelessness' "conditionCatCodingDisplay";
    } "conditionCatCoding";
  } "conditionCat";

  bundle.entry as entries -> condition.evidence as evidence, evidence.detail = create('Reference') as detailReference then {
  	entries.resource as obs where code.coding.code = '71802-3'-> detailReference.reference = reference(obs) "conditionEvidence";
  };
}

group SetConditionCodeAndEvidence2(source src: questionnaireResponse, source bundle, target condition)
{
  src -> condition.code = create('CodeableConcept') as newCodeCC then {
      src -> newCodeCC.coding = create('Coding') as newCoding then {
        src -> newCoding.system = 'http://snomed.info/sct' "conditionCodeCodingSystem";
        src -> newCoding.code = '73438004' "conditionCodeCodingCode";
        src -> newCoding.display = 'Unemployed' "conditionCodeCodingDisplay";
    } "conditionCoding";
    src -> newCodeCC.coding = create('Coding') as newCoding2 then {
        src -> newCoding2.system = 'http://hl7.org/fhir/sid/icd-10-cm' "conditionCodeCodingSystem";
        src -> newCoding2.code = 'Z56.0' "conditionCodeCodingCode";
        src -> newCoding2.display = 'Unemployment, unspecified' "conditionCodeCodingDisplay";
    } "conditionCoding";
  } "conditionCode"; 
  //Add sdoh category
  src -> condition.category = create('CodeableConcept') as newCC then {
      src -> newCC.coding = create('Coding') as newCoding then {
        src -> newCoding.system = 'http://hl7.org/fhir/us/sdoh-clinicalcare/CodeSystem/SDOHCC-CodeSystemTemporaryCodes' "conditionCatCodingSystem";
        src -> newCoding.code = 'employment-status' "conditionCatCodingCode";
        src -> newCoding.display = 'Employment Status' "conditionCatCodingDisplay";
    } "conditionCatCoding";
  }"conditionCat";  
  bundle.entry as entries -> condition.evidence as evidence, evidence.detail = create('Reference') as detailReference then {
  	entries.resource as obs where code.coding.code = '67875-5'-> detailReference.reference = reference(obs)  "conditionEvidence"; 
  };
}

group TransformGroupObservation(source src: questionnaireResponse, source bundle:Bundle, target groupObservation: Observation, target entry)
{
  src -> groupObservation.id = uuid() then
    SetObservationFullUrl(groupObservation, entry) "grpObsnFullUrl"; 
  src -> groupObservation.status = 'final' "grpObsnStatus"; 
  src -> groupObservation.category = cc('http://terminology.hl7.org/CodeSystem/observation-category', 'social-history', 'Social History') "grpObsnCatSocialHistory";
  src -> groupObservation.category = cc('http://terminology.hl7.org/CodeSystem/observation-category', 'survey', 'Survey') "grpObsnCatSurvey";

  src -> groupObservation.meta = create('Meta') as newMeta then {
    src -> newMeta.profile = 'http://hl7.org/fhir/us/sdoh-clinicalcare/StructureDefinition/SDOHCC-ObservationScreeningResponse' "grpObsnMetaProfile";
  } "grpObsMeta"; 

  src.authored as authored -> groupObservation.effective = authored;
  src.subject as qSubject -> groupObservation.subject = create('Reference') as newReference then {
    qSubject.reference as qReference -> newReference.reference = qReference "grpObsnSubjRef";
    qSubject.display as qDisplay -> newReference.display = qDisplay "grpObsnSubjDisplay";
  } "grpObsnSubject";  

  src -> groupObservation.code = cc('http://loinc.org', '93025-5') "grpObsnCode";   

  //only add observations that are derived from the answers
  bundle.entry as entries -> groupObservation.hasMember = create('Reference') as df then {
    entries.resource as obs where status.exists() and hasMember.exists().not() -> df.reference = reference(obs) "grpObsnHasMemberReference"; 
  } "grpObsnHasMember";

  src.id as id -> groupObservation.derivedFrom = create('Reference') as newReference then {
    id -> newReference.reference = append('QuestionnaireResponse/', id) "grpObsnDerivedFromReference";
  } "grpObsnDerivedFrom";

  src -> entry.request as request then {
    src -> request.method = 'POST' "obsnRequestMethod";
    src -> request.url = 'Observation' "obsnRequestUrl";
  } "obsnEntryRequest";    
}