Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


 

Shown below is an example of how a number of OpenMRS module objects would map to FHIR resources , as proposed by Grahame Grieve.

The left side of the relationship indicates the OpenMRS attribute, while the right indicated the FHIR resource mapping.


Code Block
titlePatient
private Integer patientId :: n/a - unused
private Set<PatientIdentifier> identifiers :: Patient.identifier
    private Integer patientIdentifierId :: not mapped

   private Patient patient :: not mapped
   private String identifier :: patient.identifier.value
  private PatientIdentifierType identifierType ::
    
   private Integer patientIdentifierTypeId :: mapping table, type id ==> URL
   String format :: not mapped
   Boolean privaterequired String= formatBoolean.FALSE :: not mapped
   String formatDescription :: not mapped
private   Boolean requiredcheckDigit = Boolean.FALSE :: not mapped
   String validator :: not mapped
   LocationBehavior locationBehavior :: not mapped
private   StringUniquenessBehavior formatDescriptionuniquenessBehavior :: not mapped
   Location location :: Patient.identifier.assigner (URL)
  private Boolean checkDigit = Boolean.FALSE Boolean preferred = false :: if true, Patient.identifier.use = usual


Code Block
titlePerson
 Integer personId :: [base]/Patient/[personId]
 Set<PersonAddress> addresses = null :: Patient.address
   Integer personAddressId :: not mapped
   Person person :: not mapped
   Boolean preferred = false :: Patient.address.use  private String validator :: not mapped
        private LocationBehavior locationBehavior :: not mapped
        private UniquenessBehavior uniquenessBehavior :: not mapped
  private Location location :: Patient.identifier.assigner (URL)
  private Boolean preferred? mapping
   String address1 :: Patient.address.line
   String address2 :: Patient.address.line
   String address3 :: Patient.address.line
   String address4 :: Patient.address.line
   String address5 :: Patient.address.line
   String address6 :: Patient.address.line
   String cityVillage :: Patient.address.city
   String countyDistrict :: Patient.address.extension : "http://hl7.org/fhir/Profile/iso-21090#address-part-county", valueString
   String stateProvince :: Patient.address.state
   String country :: Patient.address.country
   String postalCode :: Patient.address.zip
   String latitude :: Patient.address.extension -> Location
   String longitude :: Patient.address.extension -> Location
   Date startDate :: Patient.address.period.start
   Date endDate ::  Patient.address.period.end
 Set<PersonName> names = null :: Patient.name
 Integer personNameId :: not mapped
   Person person ::  not mapped
   Boolean preferred = false :: Patient.name.use = usual
   String prefix :: Patient.name.prefix
   String givenName :: Patient.name.given
   String middleName :: Patient.name.given
   String familyNamePrefix :: folded into Patent.name.family (else, Patient.name.family with extension http://hl7.org/fhir/Profile/iso-21090#name-qualifer, valueCode = PFX)
   String familyName :: Patent.name.family
   String familyName2 :: Patent.name.family
   String familyNameSuffix :: Patent.name.suffix
   String degree :: Patent.name.suffix
 Set<PersonAttribute> attributes = null ::
   integer personAttributeTypeId :: mapping table that defines how attributes map - whether existing elements or extensions
   String value :: depends on mapping
 String gender :: Patient.gender (mapped: code = M or code = F, code system is http://hl7.org/fhir/v2/0001)
 Date birthdate :: Patient.birthDate
 Boolean birthdateEstimated = false :: Extension if worth mapping
 Boolean deathdateEstimated = false :: Extension if worth mapping
 Boolean dead = false :: if true, and no date, then Patient.deceasedBoolean= true
 Date deathDate :: Patient.deceasedDate
 Concept causeOfDeath :: Patient.extension
 User personCreator :: not mapped (would be in provenance if worth mapping)
 Date personDateCreated :: not mapped (would be in provenance if worth mapping)
 User personChangedBy :: not mapped (would be in provenance if worth mapping)
 Date personDateChanged :: not mapped (would be in provenance if worth mapping)
 Boolean personVoided = false :: if true, Patient.active = false, else Patient.active = true
 User personVoidedBy ::  not mapped (would be in provenance if worth mapping)
 Date personDateVoided ::  not mapped (would be in provenance if worth mapping)
 String personVoidReason :: not mapped (would be in provenance if worth mapping)
 boolean isPatient :: not mapped


Code Block
titleObs
  String accessionNumber :: Observation.identifier.use = usual
  String comment ::  Observation.comments
  ComplexData complexData :: -- not mapped --
  Concept concept ::  Observation.Name
  Encounter encounter :: Observation.extension http://resources.openmrs.org/doc/fhir/profiles/vitalsigns.xml#encounter  "Indicates that the information in the resource was gathered at a particular location"
  Set<Obs> groupMembers:: Observation.relatedItem.target (type = has-component)
  Location location :: Observation.extension  http://resources.openmrs.org/doc/fhir/profiles/vitalsigns.xml#location
  Date obsDatetime :: Observation.appliesDateTime
  Obs obsGroup:: n/a - back links are implicit not explicit
  Integer obsId :: n/a - goes in the URL e.g. [base]/Observation/[obsId]
  Order order :: not mapped (at least for now)
  Person person :: Observation.subject
  Integer personId :: not mapped
  static long serialVersionUID :: not mapped
  Concept valueCoded :: Observation.valueCodeableConcept
  ConceptName valueCodedName :: Observation.valueCodeableConcept
  String valueComplex :: Observation.valueAttachment
  Date valueDatetime :: Observation.valueDateTime
  Drug valueDrug :: Observation.valueCodeableConcept
  Integer valueGroupId :: not mapped
  String valueModifier :: not mapped
  Double valueNumeric :: Observation.valueQuantity
  String valueText::  Observation.valueString


Code Block
titleLocation
Integer uuid :: n/a - goes in the URL e.g. [base]/Location/[locationId]
String name :: Location.name
String description :: Location.description
String address1 :: Address.line
String address2 :: Address.line
String cityVillage :: Address.city
String stateProvince :: Address.state
String country :: Address.country
String postalCode ::Address.postalCode
String latitude :: Location.position.longitude
String longitude :: Location.position.latitude
String countyDistrict :: Address.district
String address3 :: Address.line
String address4 :: Address.line
String address6 :: Address.line
String address5 :: Address.line
Location parentLocation :: Location.partOf
Set<Location> childLocations :: not mapped

FHIR Family history resource is map to patient's relations in OpenMRS as follow

Code Block
titleFamilyHistory
Integer relationshipId :: not mapped
Person personA :: If PersonA is the requesting patient of family history then it will be mapped to FamilyHistory.subject else person will be map to relation attributes accordingly
 
Person's Relationships will be map as follow

RelationshipType relationshipType :: 
	String aIsToB :: FamilyHistory.relation.relationship (if patient resource relation ship is A to B)
	String bIsToA :: FamilyHistory.relation.relationship (if patient resource relation ship is B to A)
Person personB ::  If PersonA is the requesting patient of family history then it will be mapped to FamilyHistory.subject else person name will be map to FamilyHistory.relation.name 
Related person bithday :: FamilyHistory.relation.born[x]

FHIR Encounter resource is map with both the visit and encounter of OpenMRS. Below shows the mapping of encounter resource of OpenMRS to FHIR Encounter

Code Block
titleEncounter
Integer uuid :: n/a - goes in the URL e.g. [base]/Encounter/[encounterId]
Date encounterDatetime :: Encounter.period
Patient patient :: Encounter.subject
Integer patientId :: not mapped 
Set<EncounterProvider> encounterProviders :: Encounter.participant
Location location :: Encounter.location
EncounterType encounterType : not mapped
Set<Order> orders :: not mapped
Visit visit :: Encounter.partOf


Below shows the mapping of visit resource of OpenMRS to FHIR Encounter

Code Block
titleEncounter
Integer uuid :: n/a - goes in the URL e.g. [base]/Encounter/[encounterId]
Patient patient :: Encounter.subject
VisitType visitType :: not mapped
Concept indication :: Encounter.indication
Location location :: Encounter.location
startDatetime :: Encounter.period
Date stopDatetime :: Encounter.period
Set<Encounter> encounters :: not mapped

OpenMRS Encounter is map to FHIR composition resource

Code Block
titleComposition
Integer uuid :: not mapped
Date encounterDatetime :: Composition.date
Patient patient :: Encounter.subject
Integer patientId :: not mapped 
Set<EncounterProvider> encounterProviders :: Composition.author
Location location :: Composition.section
EncounterType encounterType : not mapped
Set<Order> orders :: not mapped
Visit visit :: not mapped

Set<Obs> obs :: Composition.section