Social Care Interoperability Platform FHIR Implementation Guide
Version: 0.1.0, Status: draft

Social Care Interoperability Platform FHIR Implementation Guide - Local Development build (v0.1.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions

StructureMap: ProxyForSubjectOfCareToRelatedPerson

Official URL: https://metadata.phase2.scip.synanetics.cloud/fhir/r4/StructureMap/ProxyForSubjectOfCare-RelatedPerson Version: 0.1.0
Draft as of 2026-03-24 Computable Name: ProxyForSubjectOfCareToRelatedPerson

map "https://metadata.phase2.scip.synanetics.cloud/fhir/r4/StructureMap/ProxyForSubjectOfCare-RelatedPerson" = "ProxyForSubjectOfCareToRelatedPerson"

uses "https://metadata.phase2.scip.synanetics.cloud/fhir/r4/StructureDefinition/MODS-ProxyForSubjectOfCare" alias Proxy as source
uses "https://metadata.phase2.scip.synanetics.cloud/fhir/r4/StructureDefinition/MODS-RelatedPerson" alias RelatedPerson as target

group RelatedPerson(source src : Proxy, target tgt : RelatedPerson) {
  src -> tgt.id = evaluate(src, id) "setRelatedPersonId";
  src.organisation as careProvider -> tgt.extension as careProviderExt then {
    src -> careProviderExt.url = 'https://metadata.phase2.scip.synanetics.cloud/fhir/r4/StructureDefinition/Extension-MODS-PersonCareProvider' "84e82c22-a3b9-499d-94e4-65cbc8cf09bd";
    src -> careProviderExt.valueReference as careProviderReference then {
      src -> careProviderReference.reference = evaluate(careProvider, 'Organization/'+id) "10f19978-1a3b-4330-a464-e00e74022603";
      src -> careProviderReference.display = evaluate(careProvider, display) "9e1f7105-7878-4767-9ba7-b34630c3cc19";
      src -> careProviderReference.identifier as careProviderReferenceIdentifier then {
        src -> careProviderReferenceIdentifier.value = evaluate(careProvider, id) "fe9135e9-76d2-46b0-8ed6-5fbe0978c07b";
      } "b5a04295-4c12-4a37-880b-c9ddf5df3891";
    } "80515323-a2f5-4454-a056-a66f29d8a9bb";
  } "setRelatedPersonOrganization";
  src.subjectOfCare as subjectOfCare then {
    src -> tgt.patient as patient then {
      src -> patient.reference = evaluate(subjectOfCare, 'Patient/'+id) "8c477486-b778-4ec4-81dd-561aae6b2c5a";
      src -> patient.display = evaluate(subjectOfCare, display) "a0061ba6-78b4-4dd6-99cc-91a9b04bc2a7";
    } "eea3c368-1db6-4d5e-9f38-7e1d597a1d75";
  } "setRelatedPersonPatient";
  src.relationship as relationship -> tgt.relationship as rel then {
    src -> rel.coding as coding then {
      src -> coding.system = 'https://fhir.hl7.org.uk/CodeSystem/UKCore-AdditionalPersonRelationshipRole' "86fbb967-22b7-48f7-95be-064d96767f09";
      src -> coding.code = evaluate(relationship, code) "68c419db-fdd1-4e3c-9d46-8464cf1a3d31";
      src -> coding.display = evaluate(relationship, display) "ebafb674-ab9d-4bcf-a5ea-a3b1c07c03f3";
    } "setRelationship";
    src -> tgt.name as name then {
      src -> name.given = evaluate(src, name.given) "2a1ca90f-461f-49e7-bbba-114fdafcb6aa";
      src -> name.family = evaluate(src, name.family) "b4b5a11f-de18-484d-a198-9efccb601ebb";
    } "setRelatedPersonName";
    src.contactDetails as emailContactDetails then {
      emailContactDetails.emailAddressDetails as emailAddressDetails -> tgt.telecom as telecom then {
        src -> telecom.system = 'email' "73d0b81c-c56e-4233-a5c3-91219197176f";
        src -> telecom.value = evaluate(emailAddressDetails, emailAddress) "501d8d52-d80b-4ded-b721-067d3b3764b8";
        src -> telecom.rank = evaluate(emailAddressDetails, preferredOrder) "935aec0d-6230-42b6-85f8-e50b703261f7";
        src -> src.emailAddressType = create('Coding') as etvt then {
          src -> etvt.system = 'https://data.digitisingsocialcare.co.uk/mods/v1/person-email-address-type' "8334eb82-2e66-41a1-a2f6-5a9f9b348fcc";
          src -> etvt.code = evaluate(emailAddressDetails, type.code) "82d1af1f-91c7-4fa4-ade5-074f7c47bca0";
          src -> telecom.use = translate(etvt, 'https://metadata.phase2.scip.synanetics.cloud/fhir/r4/ConceptMap/MODS-FHIREmailContactPointUse-1', 'code') "64b1a04f-d0d0-41d9-b60c-484b1bf2a7f4";
          src -> telecom.extension as emailTypeExt then {
            src -> emailTypeExt.url = 'https://metadata.phase2.scip.synanetics.cloud/fhir/r4/StructureDefinition/Extension-MODS-PersonEmailAddressType' "93979724-f372-4d49-8363-f0c4529a5a28";
            src -> emailTypeExt.valueCoding as emailTypeValueCoding then {
              src -> emailTypeValueCoding.system = 'https://metadata.phase2.scip.synanetics.cloud/fhir/r4/CodeSystem/MODS-EmailAddressType-1' "5e3ae7d6-7344-44e1-8cb4-b459747147cb";
              src -> emailTypeValueCoding.code = evaluate(emailAddressDetails, type.code) "0d51bd5f-f840-4616-9f9c-79cc9964bc1b";
              src -> emailTypeValueCoding.display = evaluate(emailAddressDetails, type.display) "27622a7c-6dc7-4e13-aba5-c71def50d96f";
            } "cff5ff28-6a4e-413d-a852-2174e35c516f";
          } "356b17ef-0162-4897-8b72-2d0b2c33993b";
        } "0c837111-e697-409b-b988-d9fc3c263b1e";
      } "setRelatedPersonEmailAddress";
      src.contactDetails as telephoneContactDetails then {
        telephoneContactDetails.telephoneDetails as telephoneNumberDetails -> tgt.telecom as telecom then {
          src -> telecom.system = 'phone' "b4d6b8e8-f286-4f97-aeeb-d1907ca0ac40";
          src -> telecom.value = evaluate(telephoneNumberDetails, telephoneNumber) "89d733a1-3d42-4671-9fec-aadc810584b8";
          src -> telecom.rank = evaluate(telephoneNumberDetails, preferredOrder) "564c94bd-4b0c-4762-934b-03905504f4a2";
          src -> src.telephoneType = create('Coding') as ttvt then {
            src -> ttvt.system = 'https://data.digitisingsocialcare.co.uk/mods/v1/person-telephone-type' "bc7fe429-0b68-4378-8641-e5b8e1ed57e0";
            src -> ttvt.code = evaluate(telephoneNumberDetails, type.code) "b4a55359-5287-47fb-8c2f-3075238ee200";
            src -> telecom.use = translate(ttvt, 'https://metadata.phase2.scip.synanetics.cloud/fhir/r4/ConceptMap/MODS-FHIRTelephoneContactPointUse-1', 'code') "9297bf96-fea5-4b12-b841-b3dc14c391b2";
          } "bea44f63-f600-4ec1-aa98-9d55ebdc39d7";
          src -> telecom.extension as telephoneTypeExt then {
            src -> telephoneTypeExt.url = 'https://metadata.phase2.scip.synanetics.cloud/fhir/r4/StructureDefinition/Extension-MODS-PersonTelephoneNumberType' "59db6052-36d2-42d4-88a9-1ad7487930c3";
            src -> telephoneTypeExt.valueCoding as telephoneNumberTypeCoding then {
              src -> telephoneNumberTypeCoding.system = 'https://metadata.phase2.scip.synanetics.cloud/fhir/r4/CodeSystem/MODS-TelephoneNumberType-1' "bafcc922-3810-4961-9cf8-822323334ea4";
              src -> telephoneNumberTypeCoding.code = evaluate(telephoneNumberDetails, type.code) "c0196cf7-00a6-4cbd-9092-3677be5b4e41";
              src -> telephoneNumberTypeCoding.display = evaluate(telephoneNumberDetails, type.display) "d23489af-6751-4a08-8263-103266bac33b";
            } "6ca9449f-c52d-45a5-8940-008d22528a1c";
          } "8a47a3dc-74aa-4d7e-99a5-b06eb1508ab6";
        } "setRelatedPersonTelephone";
        src.address as address where $this.country.empty().not() -> src.addresses as addresses then {
          addresses as addr then {
            address -> addr.line = evaluate(address, addressEntry1) "6a116fbc-5744-4779-90dd-66e559386d59";
            address -> addr.line = evaluate(address, addressEntry2) "c3dfdb56-b427-4124-a98d-c1bce19b0dae";
            address -> addr.line = evaluate(address, addressEntry3) "035659e3-0c73-4dba-a5a8-4cb3d696fd64";
            address -> addr.line = evaluate(address, addressEntry4) "b95916a3-ac59-44b9-80f5-bfe482a00081";
            address -> addr.postalCode = evaluate(address, postCode) "d483dfa0-70e6-4fd4-8336-31d4fad5877b";
            address -> addr.country = evaluate(address, country.display) "91e4014d-280c-4ea6-89e6-7de5a975ef17";
            address -> addr.extension as extension then {
              address -> extension.url = 'https://metadata.phase2.scip.synanetics.cloud/fhir/r4/StructureDefinition/Extension-MODS-AddressCountry' "9d87f04c-c43d-4736-b5b8-f622ec1cf2b5";
              address -> extension.valueCoding as countryCoding then {
                address -> countryCoding.system = 'https://metadata.phase2.scip.synanetics.cloud/fhir/r4/CodeSystem/MODS-Country-1' "6cc292ce-9d14-42dc-bbdc-fc24868a5f30";
                address -> countryCoding.code = evaluate(address, country.code) "0fd119da-e46b-4ed2-9be1-b549953e30d2";
                address -> countryCoding.display = evaluate(address, country.display) "09faf68f-6d11-43ba-a721-0c4a84f6de54";
              } "d7b5495b-8db0-4c9c-b081-a22784757a4d";
            } "c33a8771-90f6-442b-9f21-683a7f4f1e08";
          } "8a05ffe4-c158-4171-aa73-85651dd79ed5";
          addresses -> tgt.address "14c1d340-4e47-440f-9f38-9630b7127a81";
        } "setRelatedPersonAddressWithCountry";
      };
    };
  };
}