From 1d4a1dc6b74558c54c9025a3e42b61c0649377fd Mon Sep 17 00:00:00 2001 From: Ian Date: Thu, 29 Sep 2022 12:09:05 -0400 Subject: [PATCH 1/3] Add domain for FHIR ObservationCategoryMaps --- README.md | 4 + .../openmrs/module/initializer/Domain.java | 1 + .../module/initializer/api/CsvParser.java | 2 +- .../FhirObservationCategoryMapCsvParser.java | 75 +++++++++++++ ...irObservationCategoryMapLineProcessor.java | 64 +++++++++++ .../ocm/FhirObservationCategoryMapLoader.java | 18 +++ ...ObservationCategoryMapIntegrationTest.java | 103 ++++++++++++++++++ .../observationcategorymaps.csv | 4 + readme/fhir.md | 34 ++++-- 9 files changed, 296 insertions(+), 9 deletions(-) create mode 100644 api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapCsvParser.java create mode 100644 api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLineProcessor.java create mode 100644 api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLoader.java create mode 100644 api/src/test/java/org/openmrs/module/initializer/api/FhirObservationCategoryMapIntegrationTest.java create mode 100644 api/src/test/resources/testAppDataDir/configuration/fhirobservationcategorymaps/observationcategorymaps.csv diff --git a/README.md b/README.md index a94101471..7fe503583 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ configuration/ ├── drugs/ ├── encountertypes/ ├── fhirconceptsources/ + ├── fhirobservationcategorymaps/ ├── fhirpatientidentifiersystems/ ├── globalproperties/ ├── htmlforms/ @@ -115,6 +116,7 @@ This is the list of currently supported domains in their loading order: 1. [Metadata Term Mappings (CSV files)](readme/mdm.md#domain-metadatatermmappings) 1. [FHIR Concept Sources (CSV files)](readme/fhir.md#domain-fhirconceptsources) 1. [FHIR Patient Identifier Systems (CSV Files)](readme/fhir.md#domain-fhirpatientidentifiersystems) +1. [FHIR Observation Category Maps (CSV Files)](readme/fhir.md#domain-fhirobservationcategorymaps) 1. [AMPATH Forms (JSON files)](readme/ampathforms.md) 1. [AMPATH Forms Translations (JSON files)](readme/ampathformstranslations.md) 1. [HTML Forms (XML files)](readme/htmlforms.md) @@ -138,6 +140,7 @@ mvn clean package * Metadata Sharing 1.2.2 (*compatible*) * Metadata Mapping 1.3.4 (*compatible*) * Open Concept Lab 1.2.9 (*compatible*) +* FHIR2 1.2.0 (*compatible*) ### How to test out your OpenMRS configs? See the [Initializer Validator README page](readme/validator.md). @@ -172,6 +175,7 @@ https://github.com/mekomsolutions/openmrs-module-initializer/issues * Enhancement to ensure that reloading Concept CSVs does not clear Members/Answers if those columns aren't part of CSV file. * 'concepts' domain to support a new expandable `MAPPINGS` header, thereby discouraging the older `Same as mappings`. * Concept references expanded to allow use of concept names in locales other than the default system locale +* Support for FHIR2 module and domains related to the metadata needed for FHIR #### Version 2.3.0 * Added configuration options for logging. 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 e99a4f44d..170ee2250 100644 --- a/api/src/main/java/org/openmrs/module/initializer/Domain.java +++ b/api/src/main/java/org/openmrs/module/initializer/Domain.java @@ -42,6 +42,7 @@ public enum Domain { METADATA_SET_MEMBERS, METADATA_TERM_MAPPINGS, FHIR_CONCEPT_SOURCES, + FHIR_OBSERVATION_CATEGORY_MAPS, FHIR_PATIENT_IDENTIFIER_SYSTEMS, AMPATH_FORMS, AMPATH_FORMS_TRANSLATIONS, diff --git a/api/src/main/java/org/openmrs/module/initializer/api/CsvParser.java b/api/src/main/java/org/openmrs/module/initializer/api/CsvParser.java index 39de4a747..46e50af8b 100644 --- a/api/src/main/java/org/openmrs/module/initializer/api/CsvParser.java +++ b/api/src/main/java/org/openmrs/module/initializer/api/CsvParser.java @@ -220,7 +220,7 @@ private T initialize(String[] line) throws APIException { final CsvLine csvLine = new CsvLine(headerLine, line); // - // 1. Boostrapping + // 1. Bootstrapping // T instance = bootstrap(csvLine); diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapCsvParser.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapCsvParser.java new file mode 100644 index 000000000..30388102f --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapCsvParser.java @@ -0,0 +1,75 @@ +package org.openmrs.module.initializer.api.fhir.ocm; + +import org.hibernate.SessionFactory; +import org.openmrs.ConceptClass; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.fhir2.model.FhirObservationCategoryMap; +import org.openmrs.module.initializer.Domain; +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 org.springframework.stereotype.Component; + +import static org.openmrs.module.initializer.Domain.FHIR_OBSERVATION_CATEGORY_MAPS; + +@Component +@OpenmrsProfile(modules = { "fhir2:1.*" }) +public class FhirObservationCategoryMapCsvParser extends CsvParser> { + + public static final String FHIR_OBS_CATEGORY_HEADER = "Fhir observation category"; + + public static final String CONCEPT_CLASS_HEADER = "Concept class"; + + private final SessionFactory sessionFactory; + + @Autowired + protected FhirObservationCategoryMapCsvParser(@Qualifier("sessionFactory") SessionFactory sessionFactory, + BaseLineProcessor lineProcessor) { + super(lineProcessor); + + this.sessionFactory = sessionFactory; + } + + @Override + public Domain getDomain() { + return FHIR_OBSERVATION_CATEGORY_MAPS; + } + + @Override + public FhirObservationCategoryMap bootstrap(CsvLine line) throws IllegalArgumentException { + FhirObservationCategoryMap result = null; + + String fhirObsCategory = line.get(FHIR_OBS_CATEGORY_HEADER); + String conceptClass = line.get(CONCEPT_CLASS_HEADER); + + if (fhirObsCategory != null && !fhirObsCategory.isEmpty() && conceptClass != null && !conceptClass.isEmpty()) { + result = (FhirObservationCategoryMap) sessionFactory.getCurrentSession() + .createQuery("from " + FhirObservationCategoryMap.class.getSimpleName() + + " where observationCategory = :fhirObsCategory and conceptClass = (" + "select cc from " + + ConceptClass.class.getSimpleName() + " cc where cc.name = :conceptClassName" + ")") + .setParameter("fhirObsCategory", fhirObsCategory).setParameter("conceptClassName", conceptClass) + .uniqueResult(); + } + + if (result == null && line.getUuid() != null && !line.getUuid().isEmpty()) { + result = (FhirObservationCategoryMap) sessionFactory.getCurrentSession() + .createQuery("from " + FhirObservationCategoryMap.class.getSimpleName() + " where uuid = :uuid") + .setParameter("uuid", line.getUuid()).uniqueResult(); + } + + if (result == null) { + result = new FhirObservationCategoryMap(); + result.setUuid(line.getUuid()); + } + + return result; + } + + @Override + public FhirObservationCategoryMap save(FhirObservationCategoryMap instance) { + sessionFactory.getCurrentSession().saveOrUpdate(instance); + return instance; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLineProcessor.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLineProcessor.java new file mode 100644 index 000000000..e9e2065ae --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLineProcessor.java @@ -0,0 +1,64 @@ +package org.openmrs.module.initializer.api.fhir.ocm; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.ConceptClass; +import org.openmrs.ConceptSource; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.api.ConceptService; +import org.openmrs.module.fhir2.model.FhirConceptSource; +import org.openmrs.module.fhir2.model.FhirObservationCategoryMap; +import org.openmrs.module.initializer.api.BaseLineProcessor; +import org.openmrs.module.initializer.api.CsvLine; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import static org.openmrs.module.initializer.api.fhir.cs.FhirConceptSourceCsvParser.CONCEPT_SOURCE_NAME_HEADER; +import static org.openmrs.module.initializer.api.fhir.ocm.FhirObservationCategoryMapCsvParser.CONCEPT_CLASS_HEADER; +import static org.openmrs.module.initializer.api.fhir.ocm.FhirObservationCategoryMapCsvParser.FHIR_OBS_CATEGORY_HEADER; + +@Component +@OpenmrsProfile(modules = { "fhir2:1.*" }) +public class FhirObservationCategoryMapLineProcessor extends BaseLineProcessor { + + private final ConceptService conceptService; + + @Autowired + public FhirObservationCategoryMapLineProcessor(ConceptService conceptService) { + this.conceptService = conceptService; + } + + @Override + public FhirObservationCategoryMap fill(FhirObservationCategoryMap instance, CsvLine line) + throws IllegalArgumentException { + if (StringUtils.isBlank(instance.getUuid()) && StringUtils.isBlank(line.getUuid())) { + throw new IllegalArgumentException("No UUID was found for FHIR observation category map"); + } + + String fhirObsCategory = line.get(FHIR_OBS_CATEGORY_HEADER, true); + if (StringUtils.isBlank(fhirObsCategory) && !instance.getRetired()) { + throw new IllegalArgumentException("'" + FHIR_OBS_CATEGORY_HEADER + + "' was not found for FHIR observation category map " + instance.getUuid()); + } + + String conceptClass = line.get(CONCEPT_CLASS_HEADER, true); + if (StringUtils.isBlank(conceptClass) && !instance.getRetired()) { + throw new IllegalArgumentException( + "'" + CONCEPT_CLASS_HEADER + "' was not found for FHIR observation category map " + instance.getUuid()); + } + + ConceptClass cc = conceptService.getConceptClassByName(conceptClass); + if (cc == null && !instance.getRetired()) { + throw new IllegalArgumentException("Concept class " + conceptClass + + " was not found while creating FHIR observation category map " + instance.getUuid()); + } + + if (StringUtils.isNotBlank(line.getUuid())) { + instance.setUuid(line.getUuid()); + } + + instance.setObservationCategory(fhirObsCategory); + instance.setConceptClass(cc); + + return instance; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLoader.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLoader.java new file mode 100644 index 000000000..112c66f5c --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLoader.java @@ -0,0 +1,18 @@ +package org.openmrs.module.initializer.api.fhir.ocm; + +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.fhir2.model.FhirConceptSource; +import org.openmrs.module.fhir2.model.FhirObservationCategoryMap; +import org.openmrs.module.initializer.api.loaders.BaseCsvLoader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +@OpenmrsProfile(modules = { "fhir2:1.*" }) +public class FhirObservationCategoryMapLoader extends BaseCsvLoader { + + @Autowired + public void setParser(FhirObservationCategoryMapCsvParser parser) { + this.parser = parser; + } +} diff --git a/api/src/test/java/org/openmrs/module/initializer/api/FhirObservationCategoryMapIntegrationTest.java b/api/src/test/java/org/openmrs/module/initializer/api/FhirObservationCategoryMapIntegrationTest.java new file mode 100644 index 000000000..69e131167 --- /dev/null +++ b/api/src/test/java/org/openmrs/module/initializer/api/FhirObservationCategoryMapIntegrationTest.java @@ -0,0 +1,103 @@ +package org.openmrs.module.initializer.api; + +import java.util.List; + +import org.hibernate.Query; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.Before; +import org.junit.Test; +import org.openmrs.ConceptClass; +import org.openmrs.api.ConceptService; +import org.openmrs.api.context.Context; +import org.openmrs.module.fhir2.model.FhirObservationCategoryMap; +import org.openmrs.module.initializer.DomainBaseModuleContextSensitiveTest; +import org.openmrs.module.initializer.api.fhir.ocm.FhirObservationCategoryMapLoader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.hasProperty; +import static org.hamcrest.Matchers.hasSize; + +public class FhirObservationCategoryMapIntegrationTest extends DomainBaseModuleContextSensitiveTest { + + @Autowired + @Qualifier("sessionFactory") + private SessionFactory sessionFactory; + + @Autowired + private ConceptService conceptService; + + @Autowired + private FhirObservationCategoryMapLoader loader; + + @Before + public void setup() { + { + ConceptClass conceptClass = conceptService.getConceptClassByName("Test"); + if (conceptClass == null) { + conceptClass = new ConceptClass(); + conceptClass.setName("Test"); + conceptClass.setUuid(ConceptClass.TEST_UUID); + sessionFactory.getCurrentSession().saveOrUpdate(conceptClass); + } + } + + { + ConceptClass conceptClass = conceptService.getConceptClassByName("Finding"); + if (conceptClass == null) { + conceptClass = new ConceptClass(); + conceptClass.setName("Finding"); + conceptClass.setUuid(ConceptClass.FINDING_UUID); + sessionFactory.getCurrentSession().saveOrUpdate(conceptClass); + } + } + + { + FhirObservationCategoryMap observationCategoryMap = new FhirObservationCategoryMap(); + observationCategoryMap.setObservationCategory("laboratory"); + observationCategoryMap.setConceptClass(conceptService.getConceptClassByName("Test")); + observationCategoryMap.setUuid("2309836d-bf13-4fea-b2d4-87bb997425c7"); + sessionFactory.getCurrentSession().saveOrUpdate(observationCategoryMap); + } + + Context.flushSession(); + } + + @Test + public void loader_shouldLoadFhirObservationCategoryMapsAccordingToCsvFiles() { + // Replay + loader.load(); + + // Verify + Session session = sessionFactory.getCurrentSession(); + Query getObsCategoryByCategoryQuery = session.createQuery("from " + FhirObservationCategoryMap.class.getSimpleName() + + " where observationCategory = :observationCategory"); + + { + List observationCategories = getObsCategoryByCategoryQuery + .setParameter("observationCategory", "laboratory").list(); + + assertThat(observationCategories, hasSize(2)); + assertThat(observationCategories, + hasItem(allOf(hasProperty("uuid", equalTo("e518de2a-be31-4202-9772-cc65c3ef7227")), + hasProperty("conceptClass", hasProperty("name", equalTo("Test")))))); + assertThat(observationCategories, + hasItem(allOf(hasProperty("uuid", equalTo("2374215a-8808-4eee-b5a5-9190423862a0")), + hasProperty("conceptClass", hasProperty("name", equalTo("LabSet")))))); + } + + { + List observationCategories = getObsCategoryByCategoryQuery + .setParameter("observationCategory", "exam").list(); + + assertThat(observationCategories, hasSize(1)); + assertThat(observationCategories.get(0), hasProperty("uuid", equalTo("5f8e2dd2-ce1f-42d3-bb34-55acb3f58c5d"))); + assertThat(observationCategories.get(0).getConceptClass(), hasProperty("name", equalTo("Finding"))); + } + } +} diff --git a/api/src/test/resources/testAppDataDir/configuration/fhirobservationcategorymaps/observationcategorymaps.csv b/api/src/test/resources/testAppDataDir/configuration/fhirobservationcategorymaps/observationcategorymaps.csv new file mode 100644 index 000000000..64cd682c6 --- /dev/null +++ b/api/src/test/resources/testAppDataDir/configuration/fhirobservationcategorymaps/observationcategorymaps.csv @@ -0,0 +1,4 @@ +Uuid,Void/Retire,Fhir observation category,Concept class,_order:1000 +e518de2a-be31-4202-9772-cc65c3ef7227,,laboratory,Test, +5f8e2dd2-ce1f-42d3-bb34-55acb3f58c5d,,exam,Finding, +2374215a-8808-4eee-b5a5-9190423862a0,,laboratory,LabSet, diff --git a/readme/fhir.md b/readme/fhir.md index 97b9adfb5..ced11e2ff 100644 --- a/readme/fhir.md +++ b/readme/fhir.md @@ -63,14 +63,32 @@ The format of this CSV should be as follows: 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. -###### Header `Patient identifier type` +## Domain 'fhirobservationcategorymaps' -This is *required* for every entry and is what is used to identify the underlying patient identifier type. This can refer to the name (if unique) or uuid of the patient identifier type that this entry refers to. This must refer to an existing Patient Identifier Type, added via the patientidentifiertypes domain. This will not create or modify the underlying patient identifier types. The name of this underlying patient identifier type will be used as the name of the FHIR patient identifier system. +The **fhirobservationcategorymaps** subfolder contains CSV import files for defining mappings between [FHIR Observation category +values](https://www.hl7.org/fhir/valueset-observation-category.html) and OpenMRS ConceptClasses. When configured, this ensures +that the `Observation.category` field on a FHIR Observation will have the value specified by the mapping and the ConceptClass. -###### Header `Url` +`ConceptClass`es referenced in this domain must exist before a category map can be created. However, arbitrary strings can +be used for the category name. However, it is recommended to use strings in the +[FHIR ValueSet for Observation category](https://www.hl7.org/fhir/valueset-observation-category.html) wherever possible to +ensure maximum compatibility. + +Please note that the ability to map OpenMRS ConceptClasses to FHIR Observation categories should be regarded as an experimental +feature and may be subject to change in the future. + +This is a possible example of its contents: +```bash +fhirobservationcategorymaps/ + ├──categorymaps.csv + └── ... +``` + +The format of this CSV should be as follows: + +| Uuid |Void/Retire | Fhir observation category | Concept class | _order:1000 | +| - | - | - | - | - | +| e518de2a-be31-4202-9772-cc65c3ef7227 | | laboratory | Test | | + +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. -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 From 795789d306d46578e793401b82258a80aaa47e7a Mon Sep 17 00:00:00 2001 From: Ian Date: Fri, 24 Feb 2023 12:23:45 -0500 Subject: [PATCH 2/3] Add support for name and UUID --- .../api/fhir/ocm/FhirObservationCategoryMapCsvParser.java | 6 ++---- .../fhir/ocm/FhirObservationCategoryMapLineProcessor.java | 5 ----- .../api/fhir/ocm/FhirObservationCategoryMapLoader.java | 3 --- 3 files changed, 2 insertions(+), 12 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapCsvParser.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapCsvParser.java index 30388102f..dab4a67fd 100644 --- a/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapCsvParser.java +++ b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapCsvParser.java @@ -10,11 +10,9 @@ import org.openmrs.module.initializer.api.CsvParser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; import static org.openmrs.module.initializer.Domain.FHIR_OBSERVATION_CATEGORY_MAPS; -@Component @OpenmrsProfile(modules = { "fhir2:1.*" }) public class FhirObservationCategoryMapCsvParser extends CsvParser> { @@ -48,8 +46,8 @@ public FhirObservationCategoryMap bootstrap(CsvLine line) throws IllegalArgument result = (FhirObservationCategoryMap) sessionFactory.getCurrentSession() .createQuery("from " + FhirObservationCategoryMap.class.getSimpleName() + " where observationCategory = :fhirObsCategory and conceptClass = (" + "select cc from " - + ConceptClass.class.getSimpleName() + " cc where cc.name = :conceptClassName" + ")") - .setParameter("fhirObsCategory", fhirObsCategory).setParameter("conceptClassName", conceptClass) + + ConceptClass.class.getSimpleName() + " cc where cc.name = :conceptClass or cc.uuid = :conceptClass" + ")") + .setParameter("fhirObsCategory", fhirObsCategory).setParameter("conceptClass", conceptClass) .uniqueResult(); } diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLineProcessor.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLineProcessor.java index e9e2065ae..7f1c867cf 100644 --- a/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLineProcessor.java +++ b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLineProcessor.java @@ -2,21 +2,16 @@ import org.apache.commons.lang3.StringUtils; import org.openmrs.ConceptClass; -import org.openmrs.ConceptSource; import org.openmrs.annotation.OpenmrsProfile; import org.openmrs.api.ConceptService; -import org.openmrs.module.fhir2.model.FhirConceptSource; import org.openmrs.module.fhir2.model.FhirObservationCategoryMap; import org.openmrs.module.initializer.api.BaseLineProcessor; import org.openmrs.module.initializer.api.CsvLine; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import static org.openmrs.module.initializer.api.fhir.cs.FhirConceptSourceCsvParser.CONCEPT_SOURCE_NAME_HEADER; import static org.openmrs.module.initializer.api.fhir.ocm.FhirObservationCategoryMapCsvParser.CONCEPT_CLASS_HEADER; import static org.openmrs.module.initializer.api.fhir.ocm.FhirObservationCategoryMapCsvParser.FHIR_OBS_CATEGORY_HEADER; -@Component @OpenmrsProfile(modules = { "fhir2:1.*" }) public class FhirObservationCategoryMapLineProcessor extends BaseLineProcessor { diff --git a/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLoader.java b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLoader.java index 112c66f5c..f01f5a4ef 100644 --- a/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLoader.java +++ b/api/src/main/java/org/openmrs/module/initializer/api/fhir/ocm/FhirObservationCategoryMapLoader.java @@ -1,13 +1,10 @@ package org.openmrs.module.initializer.api.fhir.ocm; import org.openmrs.annotation.OpenmrsProfile; -import org.openmrs.module.fhir2.model.FhirConceptSource; import org.openmrs.module.fhir2.model.FhirObservationCategoryMap; import org.openmrs.module.initializer.api.loaders.BaseCsvLoader; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -@Component @OpenmrsProfile(modules = { "fhir2:1.*" }) public class FhirObservationCategoryMapLoader extends BaseCsvLoader { From 251341814e7907600d6ea67f959b146d14d59828 Mon Sep 17 00:00:00 2001 From: Ian <52504170+ibacher@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:39:27 -0400 Subject: [PATCH 3/3] Add link --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2bfebc8bb..6a92e1e92 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ * [Setting up and controlling logging](#setting-up-and-controlling-logging) - [Get in touch](#get-in-touch) - [Releases notes](#releases-notes) + + [Version 2.8.0](#version-280) + [Version 2.7.0](#version-270) + [Version 2.6.0](#version-260) + [Version 2.5.2](#version-252)