From 48ec7d41acdf7a7cb04689490d721ed1ad32ea17 Mon Sep 17 00:00:00 2001 From: herman Date: Wed, 23 Aug 2023 11:14:38 +0300 Subject: [PATCH 1/8] add fhir contact point map to initializer --- api-2.5/pom.xml | 75 ++++++++++ .../cpm/FhirContactPointMapCsvParser.java | 138 ++++++++++++++++++ .../cpm/FhirContactPointMapLineProcessor.java | 50 +++++++ .../fhir/cpm/FhirContactPointMapLoader.java | 16 ++ ...inBaseModuleContextSensitive_2_5_Test.java | 18 +++ .../fhircontactpointmap/contactPointMap.csv | 5 + .../openmrs/module/initializer/Domain.java | 1 + ...PatientContactPointMapIntegrationTest.java | 99 +++++++++++++ .../attributetypes/attribute_types.csv | 3 +- omod/src/main/resources/config.xml | 6 +- pom.xml | 4 +- readme/fhir.md | 38 ++++- 12 files changed, 449 insertions(+), 4 deletions(-) create mode 100644 api-2.5/pom.xml create mode 100644 api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java create mode 100644 api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java create mode 100644 api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java create mode 100644 api-2.5/src/test/java/org/openmrs/module/initializer/DomainBaseModuleContextSensitive_2_5_Test.java create mode 100644 api-2.5/src/test/resources/testAppDataDir/configuration/fhircontactpointmap/contactPointMap.csv create mode 100644 api/src/test/java/org/openmrs/module/initializer/api/FhirPatientContactPointMapIntegrationTest.java diff --git a/api-2.5/pom.xml b/api-2.5/pom.xml new file mode 100644 index 000000000..43312e229 --- /dev/null +++ b/api-2.5/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + org.openmrs.module + initializer + 2.6.0-SNAPSHOT + + + initializer-api-2.5 + jar + Initializer API 2.5 + API 2.5 project for Initializer + + + ${openmrsVersion2.5} + + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api + ${project.parent.version} + provided + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api + ${project.parent.version} + test + test-jar + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.4 + ${project.parent.version} + provided + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.3 + ${project.parent.version} + provided + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.3 + ${project.parent.version} + test + test-jar + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.2 + ${project.parent.version} + provided + + + + ${project.parent.groupId} + ${project.parent.artifactId}-api-2.2 + ${project.parent.version} + test + test-jar + + + + diff --git a/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java b/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java new file mode 100644 index 000000000..c19d260ca --- /dev/null +++ b/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java @@ -0,0 +1,138 @@ +package org.openmrs.module.initializer.api.fhir.cpm; + +import org.openmrs.PersonAttributeType; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.api.LocationService; +import org.openmrs.api.PersonService; +import org.openmrs.api.ProviderService; +import org.openmrs.attribute.BaseAttributeType; +import org.openmrs.module.fhir2.api.FhirContactPointMapService; +import org.openmrs.module.initializer.Domain; +import org.openmrs.module.fhir2.model.FhirContactPointMap; +import org.openmrs.module.initializer.api.BaseLineProcessor; +import org.openmrs.module.initializer.api.CsvLine; +import org.openmrs.module.initializer.api.CsvParser; +import org.springframework.beans.factory.annotation.Autowired; + +@OpenmrsProfile(modules = { "fhir2:1.11.* - 9.*" }, openmrsPlatformVersion = "2.5.13 - 2.5.*, 2.6.2 - 2.6.*, 2.7.* - 9.*") +public class FhirContactPointMapCsvParser extends CsvParser> { + + public static final String ATTRIBUTE_TYPE_DOMAIN_HEADER = "Entity name"; + + public static final String ATTRIBUTE_TYPE = "Attribute type"; + + private static final String LOCATION = "location"; + + private static final String PERSON = "person"; + + private static final String PROVIDER = "provider"; + + private final LocationService locationService; + + private final PersonService personService; + + private final ProviderService providerService; + + private final FhirContactPointMapService fhirContactPointMapService; + + @Autowired + protected FhirContactPointMapCsvParser(FhirContactPointMapService fhirContactPointMapService,BaseLineProcessor lineProcessor, + LocationService locationService, PersonService personService, ProviderService providerService) { + super(lineProcessor); + this.fhirContactPointMapService = fhirContactPointMapService; + this.locationService = locationService; + this.personService = personService; + this.providerService = providerService; + } + + @Override + public FhirContactPointMap bootstrap(CsvLine line) throws IllegalArgumentException { + FhirContactPointMap contactPointMap = null; + if (line.getUuid() != null) { + contactPointMap = fhirContactPointMapService.getFhirConactPointMapByUuid(line.getUuid()); + } + + if (contactPointMap != null) { + return contactPointMap; + } + + String attributeTypeDomain = line.get(ATTRIBUTE_TYPE_DOMAIN_HEADER, true); + String attributeType = line.get(ATTRIBUTE_TYPE, true); + + if (attributeTypeDomain.equals(PERSON)) { + PersonAttributeType personAttributeType = getPersonAttributeType(attributeType); + + if (personAttributeType == null) { + throw new IllegalArgumentException("PersonAttributeType " + attributeType + + " does not exist. Please ensure your Initializer configuration contains this attribute type."); + } + + contactPointMap = fhirContactPointMapService.getFhirContactPointMapForPersonAttributeType(personAttributeType) + .orElse(null); + } else { + BaseAttributeType baseAttributeType = getBaseAttributeType(attributeTypeDomain, attributeType); + + if (baseAttributeType == null) { + throw new IllegalArgumentException( + "Could not find attribute type " + attributeType + " for attribute domain " + attributeTypeDomain); + } + + contactPointMap = fhirContactPointMapService.getFhirContactPointMapForAttributeType(baseAttributeType) + .orElse(null); + } + + if (contactPointMap != null) { + return contactPointMap; + } + + return new FhirContactPointMap(); + } + + + @Override + public FhirContactPointMap save(FhirContactPointMap instance) { + return fhirContactPointMapService.saveFhirContactPointMap(instance); + } + + @Override + public Domain getDomain() { + return Domain.FHIR_CONTACT_POINT_MAP; + } + + protected PersonAttributeType getPersonAttributeType(String attributeType) { + PersonAttributeType personAttributeType = personService.getPersonAttributeTypeByName(attributeType); + + if (personAttributeType != null) { + return personAttributeType; + } + + personAttributeType = personService.getPersonAttributeTypeByUuid(attributeType); + + return personAttributeType; + } + + protected BaseAttributeType getBaseAttributeType(String attributeDomain, String attributeType) { + BaseAttributeType baseAttributeType = null; + + switch (attributeDomain) { + case LOCATION: + baseAttributeType = locationService.getLocationAttributeTypeByName(attributeType); + + if (baseAttributeType != null) { + return baseAttributeType; + } + + return locationService.getLocationAttributeTypeByUuid(attributeType); + break; + case PROVIDER: + baseAttributeType = providerService.getProviderAttributeTypeByName(attributeType); + + if (baseAttributeType != null) { + return baseAttributeType; + } + + return providerService.getProviderAttributeTypeByUuid(attributeType); + break; + } + } +} diff --git a/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java b/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java new file mode 100644 index 000000000..92323ce95 --- /dev/null +++ b/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java @@ -0,0 +1,50 @@ +package org.openmrs.module.initializer.api.fhir.cpm; + +import org.apache.commons.lang3.StringUtils; +import org.hl7.fhir.r4.model.ContactPoint; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.fhir2.model.FhirContactPointMap; +import org.openmrs.module.initializer.api.BaseLineProcessor; +import org.openmrs.module.initializer.api.CsvLine; + +import static org.openmrs.module.initializer.api.fhir.cpm.FhirContactPointMapCsvParser.ATTRIBUTE_TYPE_DOMAIN_HEADER; + +@OpenmrsProfile(modules = { "fhir2:1.11.* - 9.*" }, openmrsPlatformVersion = "2.5.13 - 2.5.*, 2.6.2 - 2.6.*, 2.7.* - 9.*") +public class FhirContactPointMapLineProcessor extends BaseLineProcessor { + + private static final String SYSTEM_HEADER = "system"; + private static final String USE_HEADER = "use"; + private static final String RANK_HEADER = "rank"; + @Override + public FhirContactPointMap fill(FhirContactPointMap instance, CsvLine line) throws IllegalArgumentException { + String uuid = line.getUuid(); + + if (StringUtils.isNotBlank(uuid)) { + instance.setUuid(line.getUuid()); + } + + line.get(ATTRIBUTE_TYPE_DOMAIN_HEADER, true); + + String system = line.get(SYSTEM_HEADER, false); + String use = line.get(USE_HEADER, false); + String rank = line.get(RANK_HEADER, false); + + if (system != null) { + instance.setSystem(ContactPoint.ContactPointSystem.valueOf(system)); + } + + if (use != null) { + instance.setUse(ContactPoint.ContactPointUse.valueOf(use)); + } + + if (rank != null) { + int rankInt = Integer.parseInt(rank); + if (rankInt < 1) { + throw new IllegalArgumentException("Rank must be a positive integer, i.e., 1+"); + } + instance.setRank(rankInt); + } + + return instance; + } +} diff --git a/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java b/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java new file mode 100644 index 000000000..02d3cda9e --- /dev/null +++ b/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java @@ -0,0 +1,16 @@ +package org.openmrs.module.initializer.api.fhir.cpm; + +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.fhir2.model.FhirContactPointMap; +import org.openmrs.module.initializer.api.loaders.BaseCsvLoader; +import org.springframework.beans.factory.annotation.Autowired; + +@OpenmrsProfile(modules = { "fhir2:1.11.* - 9.*" }, openmrsPlatformVersion = "2.5.13 - 2.5.*, 2.6.2 - 2.6.*, 2.7.* - 9.*") +public class FhirContactPointMapLoader extends BaseCsvLoader { + + @Autowired + public void setParser(FhirContactPointMapCsvParser parser) { + this.parser = parser; + } + +} diff --git a/api-2.5/src/test/java/org/openmrs/module/initializer/DomainBaseModuleContextSensitive_2_5_Test.java b/api-2.5/src/test/java/org/openmrs/module/initializer/DomainBaseModuleContextSensitive_2_5_Test.java new file mode 100644 index 000000000..422b23a84 --- /dev/null +++ b/api-2.5/src/test/java/org/openmrs/module/initializer/DomainBaseModuleContextSensitive_2_5_Test.java @@ -0,0 +1,18 @@ +/** + * This Source Code Form is subject to the terms of the Mozilla Public License, + * v. 2.0. If a copy of the MPL was not distributed with this file, You can + * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under + * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. + * + * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS + * graphic logo is a trademark of OpenMRS Inc. + */ +package org.openmrs.module.initializer; + +public abstract class DomainBaseModuleContextSensitive_2_5_Test extends DomainBaseModuleContextSensitiveTest { + + @Override + public void updateSearchIndex() { + // to prevent Data Filter's 'Illegal Record Access' + } +} diff --git a/api-2.5/src/test/resources/testAppDataDir/configuration/fhircontactpointmap/contactPointMap.csv b/api-2.5/src/test/resources/testAppDataDir/configuration/fhircontactpointmap/contactPointMap.csv new file mode 100644 index 000000000..7f35b5098 --- /dev/null +++ b/api-2.5/src/test/resources/testAppDataDir/configuration/fhircontactpointmap/contactPointMap.csv @@ -0,0 +1,5 @@ +Uuid,Void/Retire,Entity name,Attribute Type,System,Use,Rank,_order:1000 +fa48acc4-ef1f-46d6-b0af-150b00ddee9d,,person,717ec942-3c4a-11ea-b024-ffc81a23382e,phone,work,1, +,,person,PAT_RENAME_NEW_NAME,phone,home,, +bcf23315-a236-42aa-be95-b9e0931e22b0,,provider,Provider Speciality,email,home,2, +800e48ba-666c-445c-b871-68e54eec6de8,,location,e7aacc6e-d151-4d9e-a808-6ed9ff761212,phone,temp,3, diff --git a/api/src/main/java/org/openmrs/module/initializer/Domain.java b/api/src/main/java/org/openmrs/module/initializer/Domain.java index 9f7ac0d3a..541fd10f5 100644 --- a/api/src/main/java/org/openmrs/module/initializer/Domain.java +++ b/api/src/main/java/org/openmrs/module/initializer/Domain.java @@ -46,6 +46,7 @@ public enum Domain { COHORT_ATTRIBUTE_TYPES, FHIR_CONCEPT_SOURCES, FHIR_PATIENT_IDENTIFIER_SYSTEMS, + FHIR_CONTACT_POINT_MAP, AMPATH_FORMS, AMPATH_FORMS_TRANSLATIONS, HTML_FORMS; diff --git a/api/src/test/java/org/openmrs/module/initializer/api/FhirPatientContactPointMapIntegrationTest.java b/api/src/test/java/org/openmrs/module/initializer/api/FhirPatientContactPointMapIntegrationTest.java new file mode 100644 index 000000000..2416d461f --- /dev/null +++ b/api/src/test/java/org/openmrs/module/initializer/api/FhirPatientContactPointMapIntegrationTest.java @@ -0,0 +1,99 @@ +package org.openmrs.module.initializer.api; + +import org.hl7.fhir.r4.model.ContactPoint; +import org.junit.Before; +import org.junit.Test; +import org.openmrs.LocationAttributeType; +import org.openmrs.PersonAttributeType; +import org.openmrs.ProviderAttributeType; +import org.openmrs.api.LocationService; +import org.openmrs.api.PersonService; +import org.openmrs.api.ProviderService; +import org.openmrs.attribute.BaseAttributeType; +import org.openmrs.module.fhir2.api.FhirContactPointMapService; +import org.openmrs.module.fhir2.model.FhirContactPointMap; +import org.openmrs.module.initializer.DomainBaseModuleContextSensitiveTest; +import org.openmrs.module.initializer.api.fhir.cpm.FhirContactPointMapLoader; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Optional; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; + +public class FhirPatientContactPointMapIntegrationTest extends DomainBaseModuleContextSensitiveTest { + + @Autowired + private FhirContactPointMapService fhirContactPointMapService; + + @Autowired + private FhirContactPointMapLoader fhirContactPointMapLoader; + + @Autowired + private LocationService locationService; + + @Autowired + private PersonService personService; + + @Autowired + private ProviderService providerService; + + FhirContactPointMap fhirContactPointMap; + + PersonAttributeType personAttributeType; + + LocationAttributeType locationAttributeType; + + ProviderAttributeType providerAttributeType; + + @Before + public void setup() { + personAttributeType = new PersonAttributeType(); + providerAttributeType = new ProviderAttributeType(); + locationAttributeType = new LocationAttributeType(); + + fhirContactPointMap = new FhirContactPointMap(); + fhirContactPointMap.setUuid("fa48acc4-ef1f-46d6-b0af-150b00ddee9d"); + fhirContactPointMap.setAttributeTypeDomain("person"); + fhirContactPointMap.setAttributeTypeId(10001); + fhirContactPointMap.setSystem(ContactPoint.ContactPointSystem.PHONE); + fhirContactPointMap.setUse(ContactPoint.ContactPointUse.WORK); + fhirContactPointMap.setRank(1); + fhirContactPointMapService.saveFhirContactPointMap(fhirContactPointMap); + personService.savePersonAttributeType(personAttributeType); + } + + @Test + public void loader_shouldLoadFhirContactPointMapAccordingToCSVFiles() { + fhirContactPointMapLoader.load(); + + FhirContactPointMap firstFhirContactPointMap = assertPersonAttributeType(personAttributeType); + FhirContactPointMap secondFhirContactPointMap = assertBaseAttributeType(providerAttributeType); + FhirContactPointMap thirdFhirContactPointMap = assertBaseAttributeType(locationAttributeType); + + assertThat(firstFhirContactPointMap.getAttributeTypeDomain(), equalTo("person")); + assertThat(firstFhirContactPointMap.getSystem(), equalTo(ContactPoint.ContactPointSystem.PHONE)); + assertThat(firstFhirContactPointMap.getUse(), equalTo(ContactPoint.ContactPointUse.WORK)); + + assertThat(secondFhirContactPointMap.getAttributeTypeDomain(), equalTo("provider")); + assertThat(firstFhirContactPointMap.getSystem(), equalTo(ContactPoint.ContactPointSystem.EMAIL)); + assertThat(firstFhirContactPointMap.getUse(), equalTo(ContactPoint.ContactPointUse.HOME)); + + assertThat(thirdFhirContactPointMap.getAttributeTypeDomain(), equalTo("location")); + assertThat(firstFhirContactPointMap.getSystem(), equalTo(ContactPoint.ContactPointSystem.URL)); + assertThat(firstFhirContactPointMap.getUse(), equalTo(ContactPoint.ContactPointUse.TEMP)); + } + + protected FhirContactPointMap assertPersonAttributeType(PersonAttributeType attributeType) { + Optional contactPointMap = fhirContactPointMapService.getFhirContactPointMapForPersonAttributeType(attributeType); + assertThat(contactPointMap.isPresent(), is(true)); + return contactPointMap.get(); + } + + protected FhirContactPointMap assertBaseAttributeType(BaseAttributeType attributeType) { + Optional contactPointMap = fhirContactPointMapService.getFhirContactPointMapForAttributeType(attributeType); + assertThat(contactPointMap.isPresent(), is(true)); + return contactPointMap.get(); + } +} diff --git a/api/src/test/resources/testAppDataDir/configuration/attributetypes/attribute_types.csv b/api/src/test/resources/testAppDataDir/configuration/attributetypes/attribute_types.csv index 581eaba89..8801b8f8c 100644 --- a/api/src/test/resources/testAppDataDir/configuration/attributetypes/attribute_types.csv +++ b/api/src/test/resources/testAppDataDir/configuration/attributetypes/attribute_types.csv @@ -1,5 +1,6 @@ Uuid,Void/Retire,Entity name,Name,Description,Min occurs,Max occurs,Datatype classname,Datatype config,Preferred handler classname,Handler config,_order:1000 0bb29984-3193-11e7-93ae-92367f002671,,Location,Location Height,Location Height's description,1,1,org.openmrs.customdatatype.datatype.FloatDatatype,,,, +e7aacc6e-d151-4d9e-a808-6ed9ff761212,,Location,Location Phone Number,Location Phone Numbers's description,1,1,org.openmrs.customdatatype.datatype.FreeTextDataType,,,, 0bc29982-3193-11e3-93ae-92367f222671,,Visit,Visit Color,Visit Color's description,1,1,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, 9eca4f4e-707f-4bb8-8289-2f9b6e93803c,,Location,Location ISO Code,Location ISO Code's description,1,10,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, ,,Provider,Provider Speciality,Clinical speciality for this provider,0,7,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, @@ -8,4 +9,4 @@ Uuid,Void/Retire,Entity name,Name,Description,Min occurs,Max occurs,Datatype cla 3884c889-35f5-47b4-a6b7-5b1165cee218,,Program,Program Assessment,Program Assessment's description,1,,org.openmrs.customdatatype.datatype.FreeTextDatatype,,,, 9398c839-4f39-428c-9022-e457980ccfa8,,Program,CodedConcept attribute type,This is a Program's CodedConcept attribute type,0,1,org.bahmni.module.bahmnicore.customdatatype.datatype.CodedConceptDatatype,8295308d-e5b2-41c7-adc1-2e0e83f0f16e,,, b1d98f27-c058-46f2-9c12-87dd7c92f7e3,,Program,Program Efficiency Indicator,Metric of the program efficiency,0,1,org.openmrs.customdatatype.datatype.FloatDatatype,,,, -,TRUE,Concept,Concept Family,,,,,,,, \ No newline at end of file +,TRUE,Concept,Concept Family,,,,,,,, diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index c1ed69e08..49bf609a3 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -17,7 +17,11 @@ /lib/initializer-api-2.4-${project.version}.jar - 2.4.* - 2.* + 2.4.* - 9.* + + + /lib/initializer-api-2.5-${project.version}.jar + 2.5.13 - 9.* diff --git a/pom.xml b/pom.xml index 37ae77927..f1fda99f0 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,7 @@ api-2.2 api-2.3 api-2.4 + api-2.5 omod @@ -54,6 +55,7 @@ 2.2.0 2.3.6 2.4.0 + 2.5.13-SNAPSHOT ${openmrsVersion2.1} @@ -67,7 +69,7 @@ 1.2.2 1.3.4 1.2.9 - 1.6.0 + 1.11.0-SNAPSHOT 1.0.0 diff --git a/readme/fhir.md b/readme/fhir.md index 97b9adfb5..5d247680d 100644 --- a/readme/fhir.md +++ b/readme/fhir.md @@ -73,4 +73,40 @@ This is the URL of the code system in FHIR. For terminologies identified [in the FHIR CodeSystem registry](https://www.hl7.org/fhir/terminologies-systems.html), this should be the preferred URL for that code system, e.g. SNOMED CT is "http://snomed.info/sct". If the code system is not defined by HL7 or that table, then the code systems own preferred URL should be used, e.g., for CIEL we tend to use -"https://api.openconceptlab.org/orgs/CIEL/sources/CIEL". \ No newline at end of file +"https://api.openconceptlab.org/orgs/CIEL/sources/CIEL". + +## Domain 'fhirContactPointMap' + +The **fhirContactPointMap** subfolder contains CSV import files for defining contact point fields like system, use, rank for any of person, provider and location in your OpenMRS instance. +These are used in data exchange to store contact attributes a person, provider or location may have. If none are provided, the identifier type UUID is used as the "system" for these attributes. + +This is a possible example of its contents: +```bash +fhirContactPointMap/ + ├──contactPointMap.csv + └── ... +``` +The format of this CSV should be as follows: + +| Uuid | Void/Retire | Attribute Type Domain | Attribute Type Id | System | Use | Rank | _order:1000 +| - | - | - | - | - | - | - | - | +| fa48acc4-ef1f-46d6-b0af-150b00ddee9d | | person | | 10001 | | phone | | work | | 1 | +| bcf23315-a236-42aa-be95-b9e0931e22b0 | | provider | | 10002 | | email | | home | | 2 | +| 800e48ba-666c-445c-b871-68e54eec6de8 | | location | | 10003 | | url | | temp | | 3 | + +Headers that start with an underscore such as `_order:1000` are metadata headers. The values in the columns under those headers are never read by the CSV parser. + +###### Attribute Type Domain(mandatory) +This is a *required* field for every entry. This can either be person, provider or location which represent the **Person Attribute Type**, **Provider Attribute Type** and **Location Attribute Type** respectively. + +###### System(mandatory) + +This can be any of phone, fax, email, pager, url, sms. Take a look at [ContactPointSystem](https://www.hl7.org/fhir/valueset-contact-point-system.html) for more information. + +###### Use(mandatory) + +This represents the actual purpose of the contact point. It could be any of home ,work ,temp ,old ,mobile. Take a deeper look at [ContactPointUse](https://www.hl7.org/fhir/valueset-contact-point-use.html). + +###### Rank(mandatory) + +This specifies the preferred order of use (1 = highest). From c1163dd6bdae3674b8d9dc5b6da3937f88c0c657 Mon Sep 17 00:00:00 2001 From: herman Date: Wed, 23 Aug 2023 11:14:38 +0300 Subject: [PATCH 2/8] add fhir contact point map to initializer --- .../cpm/FhirContactPointMapCsvParser.java | 117 ++++++++++++++++++ .../cpm/FhirContactPointMapLineProcessor.java | 48 +++++++ .../fhir/cpm/FhirContactPointMapLoader.java | 16 +++ .../fhirContactPointMap/contactPointMap.csv | 2 + readme/fhir.md | 8 +- 5 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java create mode 100644 api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java create mode 100644 api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java create mode 100644 api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java new file mode 100644 index 000000000..57c7ccb09 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java @@ -0,0 +1,117 @@ +package org.openmrs.module.initializer.api.fhir.cpm; + +import org.apache.commons.lang.StringUtils; +import org.openmrs.PersonAttributeType; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.api.LocationService; +import org.openmrs.api.PersonService; +import org.openmrs.api.ProviderService; +import org.openmrs.attribute.BaseAttributeType; +import org.openmrs.module.fhir2.api.FhirContactPointMapService; +import org.openmrs.module.initializer.Domain; +import org.openmrs.module.fhir2.model.FhirContactPointMap; +import org.openmrs.module.initializer.api.BaseLineProcessor; +import org.openmrs.module.initializer.api.CsvLine; +import org.openmrs.module.initializer.api.CsvParser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import java.util.Optional; + +@OpenmrsProfile(modules = { "fhir2:1.6.* - 9.*" }) +public class FhirContactPointMapCsvParser extends CsvParser> { + + private static final String ATTRIBUTE_TYPE_DOMAIN_HEADER = "Attribute Type Domain"; + + private static final String LOCATION = "location"; + + private static final String PERSON = "person"; + + private static final String PROVIDER = "provider"; + + private final LocationService locationService; + + private final PersonService personService; + + private final ProviderService providerService; + + private final FhirContactPointMapService fhirContactPointMapService; + + @Autowired + protected FhirContactPointMapCsvParser(@Qualifier("fhirContactPointMapService")FhirContactPointMapService fhirContactPointMapService,BaseLineProcessor lineProcessor, + LocationService locationService, PersonService personService, ProviderService providerService) { + super(lineProcessor); + this.fhirContactPointMapService = fhirContactPointMapService; + this.locationService = locationService; + this.personService = personService; + this.providerService = providerService; + } + + @Override + public FhirContactPointMap bootstrap(CsvLine line) throws IllegalArgumentException { + String attributeTypeDomain = line.getString(ATTRIBUTE_TYPE_DOMAIN_HEADER); + BaseAttributeType baseAttributeType; + PersonAttributeType personAttributeType; + FhirContactPointMap newFhirContactPointMap = new FhirContactPointMap(); + + if (StringUtils.isBlank(attributeTypeDomain)) { + throw new IllegalArgumentException("Attribute Type Domain is missing."); + } + + switch (attributeTypeDomain) { + case LOCATION: + baseAttributeType = locationService.getLocationAttributeTypeByName(attributeTypeDomain); + Optional locationContactPointMap = fhirContactPointMapService.getFhirContactPointMapForAttributeType( + baseAttributeType); + + if (locationContactPointMap.isPresent()) { + return locationContactPointMap.get(); + } + + newFhirContactPointMap.setSystem(locationContactPointMap.get().getSystem()); + newFhirContactPointMap.setUse(locationContactPointMap.get().getUse()); + newFhirContactPointMap.setRank(locationContactPointMap.get().getRank()); + break; + case PERSON: + personAttributeType = personService.getPersonAttributeTypeByName(attributeTypeDomain); + Optional contactPointMap = fhirContactPointMapService.getFhirContactPointMapForPersonAttributeType( + personAttributeType); + + if (contactPointMap.isPresent()) { + return contactPointMap.get(); + } + + FhirContactPointMap newPersonContactPointMap = new FhirContactPointMap(); + newPersonContactPointMap.setSystem(contactPointMap.get().getSystem()); + newPersonContactPointMap.setUse(contactPointMap.get().getUse()); + newPersonContactPointMap.setRank(contactPointMap.get().getRank()); + break; + case PROVIDER: + baseAttributeType = providerService.getProviderAttributeTypeByUuid(attributeTypeDomain); + Optional providerContactPointMap = fhirContactPointMapService.getFhirContactPointMapForAttributeType( + baseAttributeType); + + if (providerContactPointMap.isPresent()) { + return providerContactPointMap.get(); + } + + FhirContactPointMap newProviderContactPointMap = new FhirContactPointMap(); + newProviderContactPointMap.setSystem(providerContactPointMap.get().getSystem()); + newProviderContactPointMap.setUse(providerContactPointMap.get().getUse()); + newProviderContactPointMap.setRank(providerContactPointMap.get().getRank()); + break; + } + return newFhirContactPointMap; + } + + + @Override + public FhirContactPointMap save(FhirContactPointMap instance) { + return fhirContactPointMapService.saveFhirContactPointMap(instance); + } + + @Override + public Domain getDomain() { + return Domain.FHIR_CONTACT_POINT_MAP; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java new file mode 100644 index 000000000..dab16b750 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java @@ -0,0 +1,48 @@ +package org.openmrs.module.initializer.api.fhir.cpm; + +import org.apache.commons.lang3.StringUtils; +import org.hl7.fhir.r4.model.ContactPoint; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.fhir2.model.FhirContactPointMap; +import org.openmrs.module.initializer.api.BaseLineProcessor; +import org.openmrs.module.initializer.api.CsvLine; + +@OpenmrsProfile(modules = { "fhir2:1.6.* - 9.*" }) +public class FhirContactPointMapLineProcessor extends BaseLineProcessor { + + private static final String SYSTEM_HEADER = "system"; + private static final String USE_HEADER = "use"; + private static final String RANK_HEADER = "rank"; + @Override + public FhirContactPointMap fill(FhirContactPointMap instance, CsvLine line) throws IllegalArgumentException { + String uuid = line.getUuid(); + + if (StringUtils.isNotBlank(uuid)) { + instance.setUuid(line.getUuid()); + } + + // The Bootstrap method of the FhirContactPointMapCsvParser should set the attribute Type Domain. + // If this has not happened, throw an exception + if (instance.getAttributeTypeDomain() == null) { + throw new IllegalArgumentException( + "attribute type domain is missing from FHIR concept source " + instance.getUuid()); + } + + instance.setAttributeTypeDomain(instance.getAttributeTypeDomain()); + + String system = line.get(SYSTEM_HEADER, true); + String use = line.get(USE_HEADER, true); + String rank = line.get(RANK_HEADER, true); + + boolean requiredFields = (instance.getId() == null || !BaseLineProcessor.getVoidOrRetire(line)); + if (requiredFields && (StringUtils.isBlank(system) || StringUtils.isBlank(rank) || StringUtils.isBlank(use))) { + throw new IllegalStateException("system, rank, and use must be supplied"); + } + + instance.setSystem(ContactPoint.ContactPointSystem.valueOf(system)); + instance.setUse(ContactPoint.ContactPointUse.valueOf(use)); + instance.setRank(Integer.valueOf(rank)); + + return instance; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java new file mode 100644 index 000000000..d37d66159 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java @@ -0,0 +1,16 @@ +package org.openmrs.module.initializer.api.fhir.cpm; + +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.fhir2.model.FhirContactPointMap; +import org.openmrs.module.initializer.api.loaders.BaseCsvLoader; +import org.springframework.beans.factory.annotation.Autowired; + +@OpenmrsProfile(modules = { "fhir2:1.6.* - 9.*" }) +public class FhirContactPointMapLoader extends BaseCsvLoader { + + @Autowired + public void setParser(FhirContactPointMapCsvParser parser) { + this.parser = parser; + } + +} diff --git a/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv b/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv new file mode 100644 index 000000000..6b393b314 --- /dev/null +++ b/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv @@ -0,0 +1,2 @@ +Uuid,Void/Retire,Attribute Type Domain,System,Use,Rank,_order:1000 +87c87473-b394-430b-93d3-b46d0faca26e,,person,phone,work,1, diff --git a/readme/fhir.md b/readme/fhir.md index 5d247680d..a7c4457e1 100644 --- a/readme/fhir.md +++ b/readme/fhir.md @@ -88,11 +88,9 @@ fhirContactPointMap/ ``` The format of this CSV should be as follows: -| Uuid | Void/Retire | Attribute Type Domain | Attribute Type Id | System | Use | Rank | _order:1000 -| - | - | - | - | - | - | - | - | -| fa48acc4-ef1f-46d6-b0af-150b00ddee9d | | person | | 10001 | | phone | | work | | 1 | -| bcf23315-a236-42aa-be95-b9e0931e22b0 | | provider | | 10002 | | email | | home | | 2 | -| 800e48ba-666c-445c-b871-68e54eec6de8 | | location | | 10003 | | url | | temp | | 3 | +| Uuid |Void/Retire | Attribute Type Domain | Attribute Type | System | Use | Rank | _order:1000 | +| - | - | - | - | - | +| person | | Phone Number | | phone | | home | |1 | Headers that start with an underscore such as `_order:1000` are metadata headers. The values in the columns under those headers are never read by the CSV parser. From 20b247ccd78c7e2b1ffbbea2092c64ed0628927a Mon Sep 17 00:00:00 2001 From: herman Date: Wed, 23 Aug 2023 11:24:28 +0300 Subject: [PATCH 3/8] add more rows in csv --- .../fhirContactPointMap/contactPointMap.csv | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv b/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv index 6b393b314..f4d8b1f74 100644 --- a/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv +++ b/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv @@ -1,2 +1,7 @@ -Uuid,Void/Retire,Attribute Type Domain,System,Use,Rank,_order:1000 -87c87473-b394-430b-93d3-b46d0faca26e,,person,phone,work,1, +Uuid,Void/Retire,Attribute Type Domain,System,Use,Rank,_order:1000,,, +87c87473-b394-430b-93d3-b46d0faca26e,,person,phone,work,1,,,, +ed2571ad-6a0b-413d-8506-362266c7595e,,provider,email,home,2,,,, +73f4f1d6-6086-41d5-a0f1-6d688a4b10af,,location,url,temp,3,,,, +,,,,,,,,, +,,,,,,,,, +,,,,,,,,, From d667087e07351eb2fbd8485dae885ec863220570 Mon Sep 17 00:00:00 2001 From: herman Date: Wed, 23 Aug 2023 11:27:52 +0300 Subject: [PATCH 4/8] remove unused/blank rows --- .../fhirContactPointMap/contactPointMap.csv | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv b/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv index f4d8b1f74..08b60996c 100644 --- a/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv +++ b/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv @@ -1,7 +1,4 @@ -Uuid,Void/Retire,Attribute Type Domain,System,Use,Rank,_order:1000,,, -87c87473-b394-430b-93d3-b46d0faca26e,,person,phone,work,1,,,, -ed2571ad-6a0b-413d-8506-362266c7595e,,provider,email,home,2,,,, -73f4f1d6-6086-41d5-a0f1-6d688a4b10af,,location,url,temp,3,,,, -,,,,,,,,, -,,,,,,,,, -,,,,,,,,, +Uuid,Void/Retire,Attribute Type Domain,System,Use,Rank,_order:1000 +87c87473-b394-430b-93d3-b46d0faca26e,,person,phone,work,1, +ed2571ad-6a0b-413d-8506-362266c7595e,,provider,email,home,2, +73f4f1d6-6086-41d5-a0f1-6d688a4b10af,,location,url,temp,3, From e6f21f6db53342d2b3debf6368b558b371079050 Mon Sep 17 00:00:00 2001 From: herman Date: Wed, 23 Aug 2023 14:06:44 +0300 Subject: [PATCH 5/8] add test --- .../api/fhir/cpm/FhirContactPointMapCsvParser.java | 3 +-- .../configuration/fhirContactPointMap/contactPointMap.csv | 8 ++++---- readme/fhir.md | 8 +++++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java index 57c7ccb09..6fed79f8a 100644 --- a/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java +++ b/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java @@ -14,7 +14,6 @@ import org.openmrs.module.initializer.api.CsvLine; import org.openmrs.module.initializer.api.CsvParser; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import java.util.Optional; @@ -38,7 +37,7 @@ public class FhirContactPointMapCsvParser extends CsvParser lineProcessor, + protected FhirContactPointMapCsvParser(FhirContactPointMapService fhirContactPointMapService,BaseLineProcessor lineProcessor, LocationService locationService, PersonService personService, ProviderService providerService) { super(lineProcessor); this.fhirContactPointMapService = fhirContactPointMapService; diff --git a/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv b/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv index 08b60996c..01b294df9 100644 --- a/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv +++ b/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv @@ -1,4 +1,4 @@ -Uuid,Void/Retire,Attribute Type Domain,System,Use,Rank,_order:1000 -87c87473-b394-430b-93d3-b46d0faca26e,,person,phone,work,1, -ed2571ad-6a0b-413d-8506-362266c7595e,,provider,email,home,2, -73f4f1d6-6086-41d5-a0f1-6d688a4b10af,,location,url,temp,3, +Uuid,Void/Retire,Attribute Type Domain,Attribute Type Id,System,Use,Rank,_order:1000 +fa48acc4-ef1f-46d6-b0af-150b00ddee9d,,person,10001,phone,work,1, +bcf23315-a236-42aa-be95-b9e0931e22b0,,provider,10002,email,home,2, +800e48ba-666c-445c-b871-68e54eec6de8,,location,10003,url,temp,3, diff --git a/readme/fhir.md b/readme/fhir.md index a7c4457e1..71e34cbc1 100644 --- a/readme/fhir.md +++ b/readme/fhir.md @@ -88,9 +88,11 @@ fhirContactPointMap/ ``` The format of this CSV should be as follows: -| Uuid |Void/Retire | Attribute Type Domain | Attribute Type | System | Use | Rank | _order:1000 | -| - | - | - | - | - | -| person | | Phone Number | | phone | | home | |1 | +| Uuid |,Void/Retire,Attribute Type Domain,System,Use,Rank,_order:1000 +fa48acc4-ef1f-46d6-b0af-150b00ddee9d,,person,phone,work,1, +bcf23315-a236-42aa-be95-b9e0931e22b0,,provider,email,home,2, +800e48ba-666c-445c-b871-68e54eec6de8,,location,url,temp,3, + Headers that start with an underscore such as `_order:1000` are metadata headers. The values in the columns under those headers are never read by the CSV parser. From 470a7991b322836bb7cb327294a1c35af82b7fb2 Mon Sep 17 00:00:00 2001 From: herman Date: Wed, 23 Aug 2023 14:23:00 +0300 Subject: [PATCH 6/8] improve docs --- readme/fhir.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/readme/fhir.md b/readme/fhir.md index 71e34cbc1..5d247680d 100644 --- a/readme/fhir.md +++ b/readme/fhir.md @@ -88,11 +88,11 @@ fhirContactPointMap/ ``` The format of this CSV should be as follows: -| Uuid |,Void/Retire,Attribute Type Domain,System,Use,Rank,_order:1000 -fa48acc4-ef1f-46d6-b0af-150b00ddee9d,,person,phone,work,1, -bcf23315-a236-42aa-be95-b9e0931e22b0,,provider,email,home,2, -800e48ba-666c-445c-b871-68e54eec6de8,,location,url,temp,3, - +| Uuid | Void/Retire | Attribute Type Domain | Attribute Type Id | System | Use | Rank | _order:1000 +| - | - | - | - | - | - | - | - | +| fa48acc4-ef1f-46d6-b0af-150b00ddee9d | | person | | 10001 | | phone | | work | | 1 | +| bcf23315-a236-42aa-be95-b9e0931e22b0 | | provider | | 10002 | | email | | home | | 2 | +| 800e48ba-666c-445c-b871-68e54eec6de8 | | location | | 10003 | | url | | temp | | 3 | Headers that start with an underscore such as `_order:1000` are metadata headers. The values in the columns under those headers are never read by the CSV parser. From d05c5fd60e28bf29a24c08abf2908e27e2808b8c Mon Sep 17 00:00:00 2001 From: Ian Date: Fri, 25 Aug 2023 14:05:53 -0400 Subject: [PATCH 7/8] Code review --- .../cpm/FhirContactPointMapCsvParser.java | 116 ------------------ .../cpm/FhirContactPointMapLineProcessor.java | 48 -------- .../fhir/cpm/FhirContactPointMapLoader.java | 16 --- .../fhirContactPointMap/contactPointMap.csv | 4 - 4 files changed, 184 deletions(-) delete mode 100644 api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java delete mode 100644 api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java delete mode 100644 api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java delete mode 100644 api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java deleted file mode 100644 index 6fed79f8a..000000000 --- a/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java +++ /dev/null @@ -1,116 +0,0 @@ -package org.openmrs.module.initializer.api.fhir.cpm; - -import org.apache.commons.lang.StringUtils; -import org.openmrs.PersonAttributeType; -import org.openmrs.annotation.OpenmrsProfile; -import org.openmrs.api.LocationService; -import org.openmrs.api.PersonService; -import org.openmrs.api.ProviderService; -import org.openmrs.attribute.BaseAttributeType; -import org.openmrs.module.fhir2.api.FhirContactPointMapService; -import org.openmrs.module.initializer.Domain; -import org.openmrs.module.fhir2.model.FhirContactPointMap; -import org.openmrs.module.initializer.api.BaseLineProcessor; -import org.openmrs.module.initializer.api.CsvLine; -import org.openmrs.module.initializer.api.CsvParser; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.Optional; - -@OpenmrsProfile(modules = { "fhir2:1.6.* - 9.*" }) -public class FhirContactPointMapCsvParser extends CsvParser> { - - private static final String ATTRIBUTE_TYPE_DOMAIN_HEADER = "Attribute Type Domain"; - - private static final String LOCATION = "location"; - - private static final String PERSON = "person"; - - private static final String PROVIDER = "provider"; - - private final LocationService locationService; - - private final PersonService personService; - - private final ProviderService providerService; - - private final FhirContactPointMapService fhirContactPointMapService; - - @Autowired - protected FhirContactPointMapCsvParser(FhirContactPointMapService fhirContactPointMapService,BaseLineProcessor lineProcessor, - LocationService locationService, PersonService personService, ProviderService providerService) { - super(lineProcessor); - this.fhirContactPointMapService = fhirContactPointMapService; - this.locationService = locationService; - this.personService = personService; - this.providerService = providerService; - } - - @Override - public FhirContactPointMap bootstrap(CsvLine line) throws IllegalArgumentException { - String attributeTypeDomain = line.getString(ATTRIBUTE_TYPE_DOMAIN_HEADER); - BaseAttributeType baseAttributeType; - PersonAttributeType personAttributeType; - FhirContactPointMap newFhirContactPointMap = new FhirContactPointMap(); - - if (StringUtils.isBlank(attributeTypeDomain)) { - throw new IllegalArgumentException("Attribute Type Domain is missing."); - } - - switch (attributeTypeDomain) { - case LOCATION: - baseAttributeType = locationService.getLocationAttributeTypeByName(attributeTypeDomain); - Optional locationContactPointMap = fhirContactPointMapService.getFhirContactPointMapForAttributeType( - baseAttributeType); - - if (locationContactPointMap.isPresent()) { - return locationContactPointMap.get(); - } - - newFhirContactPointMap.setSystem(locationContactPointMap.get().getSystem()); - newFhirContactPointMap.setUse(locationContactPointMap.get().getUse()); - newFhirContactPointMap.setRank(locationContactPointMap.get().getRank()); - break; - case PERSON: - personAttributeType = personService.getPersonAttributeTypeByName(attributeTypeDomain); - Optional contactPointMap = fhirContactPointMapService.getFhirContactPointMapForPersonAttributeType( - personAttributeType); - - if (contactPointMap.isPresent()) { - return contactPointMap.get(); - } - - FhirContactPointMap newPersonContactPointMap = new FhirContactPointMap(); - newPersonContactPointMap.setSystem(contactPointMap.get().getSystem()); - newPersonContactPointMap.setUse(contactPointMap.get().getUse()); - newPersonContactPointMap.setRank(contactPointMap.get().getRank()); - break; - case PROVIDER: - baseAttributeType = providerService.getProviderAttributeTypeByUuid(attributeTypeDomain); - Optional providerContactPointMap = fhirContactPointMapService.getFhirContactPointMapForAttributeType( - baseAttributeType); - - if (providerContactPointMap.isPresent()) { - return providerContactPointMap.get(); - } - - FhirContactPointMap newProviderContactPointMap = new FhirContactPointMap(); - newProviderContactPointMap.setSystem(providerContactPointMap.get().getSystem()); - newProviderContactPointMap.setUse(providerContactPointMap.get().getUse()); - newProviderContactPointMap.setRank(providerContactPointMap.get().getRank()); - break; - } - return newFhirContactPointMap; - } - - - @Override - public FhirContactPointMap save(FhirContactPointMap instance) { - return fhirContactPointMapService.saveFhirContactPointMap(instance); - } - - @Override - public Domain getDomain() { - return Domain.FHIR_CONTACT_POINT_MAP; - } -} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java deleted file mode 100644 index dab16b750..000000000 --- a/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLineProcessor.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.openmrs.module.initializer.api.fhir.cpm; - -import org.apache.commons.lang3.StringUtils; -import org.hl7.fhir.r4.model.ContactPoint; -import org.openmrs.annotation.OpenmrsProfile; -import org.openmrs.module.fhir2.model.FhirContactPointMap; -import org.openmrs.module.initializer.api.BaseLineProcessor; -import org.openmrs.module.initializer.api.CsvLine; - -@OpenmrsProfile(modules = { "fhir2:1.6.* - 9.*" }) -public class FhirContactPointMapLineProcessor extends BaseLineProcessor { - - private static final String SYSTEM_HEADER = "system"; - private static final String USE_HEADER = "use"; - private static final String RANK_HEADER = "rank"; - @Override - public FhirContactPointMap fill(FhirContactPointMap instance, CsvLine line) throws IllegalArgumentException { - String uuid = line.getUuid(); - - if (StringUtils.isNotBlank(uuid)) { - instance.setUuid(line.getUuid()); - } - - // The Bootstrap method of the FhirContactPointMapCsvParser should set the attribute Type Domain. - // If this has not happened, throw an exception - if (instance.getAttributeTypeDomain() == null) { - throw new IllegalArgumentException( - "attribute type domain is missing from FHIR concept source " + instance.getUuid()); - } - - instance.setAttributeTypeDomain(instance.getAttributeTypeDomain()); - - String system = line.get(SYSTEM_HEADER, true); - String use = line.get(USE_HEADER, true); - String rank = line.get(RANK_HEADER, true); - - boolean requiredFields = (instance.getId() == null || !BaseLineProcessor.getVoidOrRetire(line)); - if (requiredFields && (StringUtils.isBlank(system) || StringUtils.isBlank(rank) || StringUtils.isBlank(use))) { - throw new IllegalStateException("system, rank, and use must be supplied"); - } - - instance.setSystem(ContactPoint.ContactPointSystem.valueOf(system)); - instance.setUse(ContactPoint.ContactPointUse.valueOf(use)); - instance.setRank(Integer.valueOf(rank)); - - return instance; - } -} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java deleted file mode 100644 index d37d66159..000000000 --- a/api/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapLoader.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.openmrs.module.initializer.api.fhir.cpm; - -import org.openmrs.annotation.OpenmrsProfile; -import org.openmrs.module.fhir2.model.FhirContactPointMap; -import org.openmrs.module.initializer.api.loaders.BaseCsvLoader; -import org.springframework.beans.factory.annotation.Autowired; - -@OpenmrsProfile(modules = { "fhir2:1.6.* - 9.*" }) -public class FhirContactPointMapLoader extends BaseCsvLoader { - - @Autowired - public void setParser(FhirContactPointMapCsvParser parser) { - this.parser = parser; - } - -} diff --git a/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv b/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv deleted file mode 100644 index 01b294df9..000000000 --- a/api/src/test/resources/testAppDataDir/configuration/fhirContactPointMap/contactPointMap.csv +++ /dev/null @@ -1,4 +0,0 @@ -Uuid,Void/Retire,Attribute Type Domain,Attribute Type Id,System,Use,Rank,_order:1000 -fa48acc4-ef1f-46d6-b0af-150b00ddee9d,,person,10001,phone,work,1, -bcf23315-a236-42aa-be95-b9e0931e22b0,,provider,10002,email,home,2, -800e48ba-666c-445c-b871-68e54eec6de8,,location,10003,url,temp,3, From 93423e2e564d4da84800731f986f5465014a8133 Mon Sep 17 00:00:00 2001 From: mherman22 Date: Fri, 20 Oct 2023 10:49:06 +0300 Subject: [PATCH 8/8] update fhir version from snapshot version --- api-2.5/pom.xml | 5 +++-- .../api/fhir/cpm/FhirContactPointMapCsvParser.java | 4 +++- pom.xml | 2 +- readme/fhir.md | 11 ++++++----- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/api-2.5/pom.xml b/api-2.5/pom.xml index 43312e229..bbbfceffc 100644 --- a/api-2.5/pom.xml +++ b/api-2.5/pom.xml @@ -2,12 +2,13 @@ - 4.0.0 + org.openmrs.module initializer - 2.6.0-SNAPSHOT + 2.7.0-SNAPSHOT + 4.0.0 initializer-api-2.5 jar diff --git a/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java b/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java index c19d260ca..d70b62797 100644 --- a/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java +++ b/api-2.5/src/main/java/org/openmrs/module/initializer/api/fhir/cpm/FhirContactPointMapCsvParser.java @@ -49,7 +49,8 @@ protected FhirContactPointMapCsvParser(FhirContactPointMapService fhirContactPoi public FhirContactPointMap bootstrap(CsvLine line) throws IllegalArgumentException { FhirContactPointMap contactPointMap = null; if (line.getUuid() != null) { - contactPointMap = fhirContactPointMapService.getFhirConactPointMapByUuid(line.getUuid()); + contactPointMap = fhirContactPointMapService.getFhirContactPointMapByUuid(line.getUuid()) + .orElse(null); } if (contactPointMap != null) { @@ -134,5 +135,6 @@ protected BaseAttributeType getBaseAttributeType(String attributeDomain, Stri return providerService.getProviderAttributeTypeByUuid(attributeType); break; } + return baseAttributeType; } } diff --git a/pom.xml b/pom.xml index f1fda99f0..81c9c1c68 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ 1.2.2 1.3.4 1.2.9 - 1.11.0-SNAPSHOT + 1.11.0 1.0.0 diff --git a/readme/fhir.md b/readme/fhir.md index 5d247680d..3651376e7 100644 --- a/readme/fhir.md +++ b/readme/fhir.md @@ -88,11 +88,12 @@ fhirContactPointMap/ ``` The format of this CSV should be as follows: -| Uuid | Void/Retire | Attribute Type Domain | Attribute Type Id | System | Use | Rank | _order:1000 -| - | - | - | - | - | - | - | - | -| fa48acc4-ef1f-46d6-b0af-150b00ddee9d | | person | | 10001 | | phone | | work | | 1 | -| bcf23315-a236-42aa-be95-b9e0931e22b0 | | provider | | 10002 | | email | | home | | 2 | -| 800e48ba-666c-445c-b871-68e54eec6de8 | | location | | 10003 | | url | | temp | | 3 | +| Uuid | Void/Retire | Entity name | Attribute Type | System | Use | Rank | _order:1000 | +|--------------------------------------|-------------|-------------|--------------------------------------|--------|------|------|-------------| +| fa48acc4-ef1f-46d6-b0af-150b00ddee9d | | person | 717ec942-3c4a-11ea-b024-ffc81a23382e | phone | work | 1 | | +| | | person | PAT_RENAME_NEW_NAME | phone | home | | | +| bcf23315-a236-42aa-be95-b9e0931e22b0 | | provider | Provider Speciality | email | home | 2 | | +| 800e48ba-666c-445c-b871-68e54eec6de8 | | location | e7aacc6e-d151-4d9e-a808-6ed9ff761212 | phone | temp | 3 | | Headers that start with an underscore such as `_order:1000` are metadata headers. The values in the columns under those headers are never read by the CSV parser.