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.
Patient
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 private String format :: not mapped private Boolean required = Boolean.FALSE :: not mapped private String formatDescription :: not mapped private Boolean checkDigit = Boolean.FALSE :: not mapped 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 = false :: if true, Patient.identifier.use = usual
Person
protected Integer personId :: [base]/Patient/[personId] private Set<PersonAddress> addresses = null :: Patient.address private Integer personAddressId :: not mapped private Person person :: not mapped private Boolean preferred = false :: Patient.address.use ? mapping private String address1 :: Patient.address.line private String address2 :: Patient.address.line private String address3 :: Patient.address.line private String address4 :: Patient.address.line private String address5 :: Patient.address.line private String address6 :: Patient.address.line private String cityVillage :: Patient.address.city private String countyDistrict :: Patient.address.extension : "http://hl7.org/fhir/Profile/iso-21090#address-part-county", valueString private String stateProvince :: Patient.address.state private String country :: Patient.address.country private String postalCode :: Patient.address.zip private String latitude :: Patient.address.extension -> Location private String longitude :: Patient.address.extension -> Location private Date startDate :: Patient.address.period.start private Date endDate :: Patient.address.period.end private Set<PersonName> names = null :: Patient.name private Integer personNameId :: not mapped private Person person :: not mapped private Boolean preferred = false :: Patient.name.use = usual private String prefix :: Patient.name.prefix private String givenName :: Patient.name.given private String middleName :: Patient.name.given private String familyNamePrefix :: folded into Patent.name.family (else, Patient.name.family with extension http://hl7.org/fhir/Profile/iso-21090#name-qualifer, valueCode = PFX) private String familyName :: Patent.name.family private String familyName2 :: Patent.name.family private String familyNameSuffix :: Patent.name.suffix private String degree :: Patent.name.suffix private Set<PersonAttribute> attributes = null :: private integer personAttributeTypeId :: mapping table that defines how attributes map - whether existing elements or extensions private String value :: depends on mapping private String gender :: Patient.gender (mapped: code = M or code = F, code system is http://hl7.org/fhir/v2/0001) private Date birthdate :: Patient.birthDate private Boolean birthdateEstimated = false :: Extension if worth mapping private Boolean deathdateEstimated = false :: Extension if worth mapping private Boolean dead = false :: if true, and no date, then Patient.deceasedBoolean= true private Date deathDate :: Patient.deceasedDate private Concept causeOfDeath :: Patient.extension private User personCreator :: not mapped (would be in provenance if worth mapping) private Date personDateCreated :: not mapped (would be in provenance if worth mapping) private User personChangedBy :: not mapped (would be in provenance if worth mapping) private Date personDateChanged :: not mapped (would be in provenance if worth mapping) private Boolean personVoided = false :: if true, Patient.active = false, else Patient.active = true private User personVoidedBy :: not mapped (would be in provenance if worth mapping) private Date personDateVoided :: not mapped (would be in provenance if worth mapping) private String personVoidReason :: not mapped (would be in provenance if worth mapping) private boolean isPatient :: not mapped
Obs
protected String accessionNumber :: Observation.identifier protected String comment :: Observation.comments protected ComplexData complexData :: -- not mapped -- protected Concept concept :: Observation.Name protected 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" protected Set<Obs> groupMembers:: Observation.relatedItem.target (type = has-component) protected Location location :: Observation.extension http://resources.openmrs.org/doc/fhir/profiles/vitalsigns.xml#location protected Date obsDatetime :: Observation.appliesDateTime protected Obs obsGroup:: n/a - back links are implicit not explicit protected Integer obsId :: n/a - goes in the URL e.g. [base]/Observation/[obsId] protected Order order :: not mapped (at least for now) protected Person person :: Observation.subject protected Integer personId :: not mapped static long serialVersionUID :: not mapped protected Concept valueCoded :: Observation.valueCodeableConcept protected ConceptName valueCodedName :: Observation.valueCodeableConcept protected String valueComplex :: Observation.valueAttachment protected Date valueDatetime :: Observation.valueDateTime protected Drug valueDrug :: Observation.valueCodeableConcept protected Integer valueGroupId :: not mapped protected String valueModifier :: not mapped protected Double valueNumeric :: Observation.valueQuantity protected String valueText:: Observation.valueStirng