diff --git a/README.md b/README.md index e99815b60..7fe254409 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ configuration/ ├── locations/ ├── locationtagmaps/ ├── locationtags/ + ├── medicationsideeffects/ ├── messageproperties/ ├── metadatasetmembers/ ├── metadatasets/ @@ -160,6 +161,7 @@ This is the list of currently supported domains in their loading order: 1. [Identifier Sources (CSV files)](readme/idgen.md) 1. [Autogeneration Options (CSV files)](readme/autogenerationoptions.md) 1. [Drugs (CSV files)](readme/drugs.md) +1. [Medication Side Effects (CSV files)](readme/medicationsideeffects.md) 1. [Order Frequencies (CSV files)](readme/freqs.md) 1. [Order Types (CSV files)](readme/ordertypes.md) 1. [Bahmni Appointment Specialities (CSV files)](readme/appointmentspecialities.md) diff --git a/api-2.3/src/test/java/org/openmrs/module/initializer/api/loaders/LoadersOrderTest.java b/api-2.3/src/test/java/org/openmrs/module/initializer/api/loaders/LoadersOrderTest.java index 2f0b131a9..4cb47e6ec 100644 --- a/api-2.3/src/test/java/org/openmrs/module/initializer/api/loaders/LoadersOrderTest.java +++ b/api-2.3/src/test/java/org/openmrs/module/initializer/api/loaders/LoadersOrderTest.java @@ -74,6 +74,7 @@ protected boolean matchesSafely(List loaders, Description mismatchDescri exclude.add(Domain.BILLABLE_SERVICES.getName()); exclude.add(Domain.CASH_POINTS.getName()); exclude.add(Domain.CASHIER_ITEM_PRICES.getName()); + exclude.add(Domain.MEDICATION_SIDE_EFFECTS.getName()); exclude.add(Domain.CONCEPT_REFERENCE_RANGE.getName()); exclude.add(Domain.FLAGS.getName()); exclude.add(Domain.FLAG_PRIORITIES.getName()); diff --git a/api-2.4/pom.xml b/api-2.4/pom.xml index 3f0ef4c15..3c2e94cbc 100644 --- a/api-2.4/pom.xml +++ b/api-2.4/pom.xml @@ -86,6 +86,13 @@ ${billingVersion} provided + + + org.openmrs.module + medicationsideeffects-api + ${medicationsideeffectsVersion} + provided + org.openmrs.module diff --git a/api-2.4/src/main/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectLineProcessor.java b/api-2.4/src/main/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectLineProcessor.java new file mode 100644 index 000000000..6ed7ecd18 --- /dev/null +++ b/api-2.4/src/main/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectLineProcessor.java @@ -0,0 +1,83 @@ +/* + * 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.api.medicationsideeffects; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.Concept; +import org.openmrs.Drug; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.api.ConceptService; +import org.openmrs.module.initializer.api.BaseLineProcessor; +import org.openmrs.module.initializer.api.CsvLine; +import org.openmrs.module.medicationsideeffects.model.MedicationSideEffect; +import org.openmrs.module.medicationsideeffects.model.SideEffectClassification; +import org.springframework.beans.factory.annotation.Autowired; + +@OpenmrsProfile(modules = { "medicationsideeffects:1.0.0 - 9.*" }) +public class MedicationSideEffectLineProcessor extends BaseLineProcessor { + + protected static final String HEADER_DRUG_UUID = "Drug Uuid"; + + protected static final String HEADER_CLASSIFICATION = "Classification"; + + protected static final String HEADER_CONCEPT_UUID = "Side Effect Concept Uuid"; + + protected static final String HEADER_SIDE_EFFECT_TEXT = "Side Effect Text"; + + protected static final String HEADER_RECOMMENDED_ACTION = "Recommended Action"; + + protected static final String HEADER_NOTES = "Notes"; + + private final ConceptService conceptService; + + @Autowired + public MedicationSideEffectLineProcessor(ConceptService conceptService) { + this.conceptService = conceptService; + } + + @Override + public MedicationSideEffect fill(MedicationSideEffect instance, CsvLine line) throws IllegalArgumentException { + String drugUuid = line.get(HEADER_DRUG_UUID, true); + Drug drug = conceptService.getDrugByUuid(drugUuid); + if (drug == null) { + throw new IllegalArgumentException("No drug found for uuid '" + drugUuid + "'"); + } + instance.setDrug(drug); + + String classification = line.get(HEADER_CLASSIFICATION, true); + try { + instance.setClassification(SideEffectClassification.valueOf(classification.toUpperCase())); + } + catch (IllegalArgumentException e) { + throw new IllegalArgumentException( + "Invalid classification '" + classification + "' (expected common or serious)"); + } + + String conceptUuid = line.getString(HEADER_CONCEPT_UUID); + Concept concept = null; + if (StringUtils.isNotBlank(conceptUuid)) { + concept = conceptService.getConceptByUuid(conceptUuid); + if (concept == null) { + throw new IllegalArgumentException("No concept found for uuid '" + conceptUuid + "'"); + } + } + instance.setSideEffectConcept(concept); + + instance.setSideEffectText(line.getString(HEADER_SIDE_EFFECT_TEXT)); + instance.setRecommendedAction(line.getString(HEADER_RECOMMENDED_ACTION)); + instance.setNotes(line.getString(HEADER_NOTES)); + + if (concept == null && StringUtils.isBlank(instance.getSideEffectText())) { + throw new IllegalArgumentException("either 'Side Effect Concept Uuid' or 'Side Effect Text' must be provided"); + } + + return instance; + } +} diff --git a/api-2.4/src/main/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectsCsvParser.java b/api-2.4/src/main/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectsCsvParser.java new file mode 100644 index 000000000..8078081c9 --- /dev/null +++ b/api-2.4/src/main/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectsCsvParser.java @@ -0,0 +1,56 @@ +/* + * 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.api.medicationsideeffects; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.annotation.OpenmrsProfile; +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.openmrs.module.medicationsideeffects.model.MedicationSideEffect; +import org.openmrs.module.medicationsideeffects.service.MedicationSideEffectService; +import org.springframework.beans.factory.annotation.Autowired; + +@OpenmrsProfile(modules = { "medicationsideeffects:1.0.0 - 9.*" }) +public class MedicationSideEffectsCsvParser extends CsvParser> { + + private final MedicationSideEffectService service; + + @Autowired + public MedicationSideEffectsCsvParser(MedicationSideEffectService service, + MedicationSideEffectLineProcessor lineProcessor) { + super(lineProcessor); + this.service = service; + } + + @Override + public MedicationSideEffect bootstrap(CsvLine line) throws IllegalArgumentException { + String uuid = line.getUuid(); + MedicationSideEffect sideEffect = service.getByUuid(uuid); + if (sideEffect == null) { + sideEffect = new MedicationSideEffect(); + if (StringUtils.isNotBlank(uuid)) { + sideEffect.setUuid(uuid); + } + } + return sideEffect; + } + + @Override + public MedicationSideEffect save(MedicationSideEffect instance) { + return service.saveMedicationSideEffect(instance); + } + + @Override + public Domain getDomain() { + return Domain.MEDICATION_SIDE_EFFECTS; + } +} diff --git a/api-2.4/src/main/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectsLoader.java b/api-2.4/src/main/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectsLoader.java new file mode 100644 index 000000000..5e0b8460e --- /dev/null +++ b/api-2.4/src/main/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectsLoader.java @@ -0,0 +1,24 @@ +/* + * 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.api.medicationsideeffects; + +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.initializer.api.loaders.BaseCsvLoader; +import org.openmrs.module.medicationsideeffects.model.MedicationSideEffect; +import org.springframework.beans.factory.annotation.Autowired; + +@OpenmrsProfile(modules = { "medicationsideeffects:1.0.0 - 9.*" }) +public class MedicationSideEffectsLoader extends BaseCsvLoader { + + @Autowired + public void setParser(MedicationSideEffectsCsvParser parser) { + this.parser = parser; + } +} diff --git a/api-2.4/src/test/java/org/openmrs/module/initializer/api/DomainBaseModuleContextSensitive_2_4_test.java b/api-2.4/src/test/java/org/openmrs/module/initializer/api/DomainBaseModuleContextSensitive_2_4_test.java index 8f92eb699..1a552e7f4 100644 --- a/api-2.4/src/test/java/org/openmrs/module/initializer/api/DomainBaseModuleContextSensitive_2_4_test.java +++ b/api-2.4/src/test/java/org/openmrs/module/initializer/api/DomainBaseModuleContextSensitive_2_4_test.java @@ -28,6 +28,11 @@ public DomainBaseModuleContextSensitive_2_4_test() { mod.setFile(new File("")); ModuleFactory.getStartedModulesMap().put(mod.getModuleId(), mod); } + { + Module mod = new Module("", "medicationsideeffects", "", "", "", "1.0.0"); + mod.setFile(new File("")); + ModuleFactory.getStartedModulesMap().put(mod.getModuleId(), mod); + } } @Override diff --git a/api-2.4/src/test/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectLineProcessorTest.java b/api-2.4/src/test/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectLineProcessorTest.java new file mode 100644 index 000000000..0a8bedaad --- /dev/null +++ b/api-2.4/src/test/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectLineProcessorTest.java @@ -0,0 +1,97 @@ +/* + * 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.api.medicationsideeffects; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.when; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.openmrs.Concept; +import org.openmrs.Drug; +import org.openmrs.api.ConceptService; +import org.openmrs.module.initializer.api.CsvLine; +import org.openmrs.module.medicationsideeffects.model.MedicationSideEffect; +import org.openmrs.module.medicationsideeffects.model.SideEffectClassification; + +public class MedicationSideEffectLineProcessorTest { + + private static final String[] HEADERS = new String[] { "Uuid", "Void/Retire", "Drug Uuid", "Classification", + "Side Effect Concept Uuid", "Side Effect Text", "Recommended Action", "Notes" }; + + private static final String DRUG_UUID = "a1a1a1a1-0000-0000-0000-000000000001"; + + private static final String CONCEPT_UUID = "b1b1b1b1-0000-0000-0000-000000000001"; + + @Mock + private ConceptService conceptService; + + private MedicationSideEffectLineProcessor processor; + + private Drug drug; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + processor = new MedicationSideEffectLineProcessor(conceptService); + drug = new Drug(); + drug.setUuid(DRUG_UUID); + when(conceptService.getDrugByUuid(DRUG_UUID)).thenReturn(drug); + } + + private CsvLine line(String... values) { + return new CsvLine(HEADERS, values); + } + + @Test + public void fill_shouldMapCodedCommonEffect() { + Concept concept = new Concept(); + concept.setUuid(CONCEPT_UUID); + when(conceptService.getConceptByUuid(CONCEPT_UUID)).thenReturn(concept); + + MedicationSideEffect result = processor.fill(new MedicationSideEffect(), + line(null, null, DRUG_UUID, "common", CONCEPT_UUID, null, null, "Nausea note")); + + assertEquals(drug, result.getDrug()); + assertEquals(SideEffectClassification.COMMON, result.getClassification()); + assertEquals(concept, result.getSideEffectConcept()); + assertNull(result.getSideEffectText()); + assertEquals("Nausea note", result.getNotes()); + } + + @Test + public void fill_shouldMapFreeTextSeriousEffect() { + MedicationSideEffect result = processor.fill(new MedicationSideEffect(), + line(null, null, DRUG_UUID, "serious", null, "Signs of liver injury", "Seek urgent care", null)); + + assertEquals(SideEffectClassification.SERIOUS, result.getClassification()); + assertNull(result.getSideEffectConcept()); + assertEquals("Signs of liver injury", result.getSideEffectText()); + assertEquals("Seek urgent care", result.getRecommendedAction()); + } + + @Test(expected = IllegalArgumentException.class) + public void fill_shouldThrowWhenDrugNotFound() { + processor.fill(new MedicationSideEffect(), line(null, null, "missing-drug-uuid", "common", null, "x", null, null)); + } + + @Test(expected = IllegalArgumentException.class) + public void fill_shouldThrowWhenClassificationInvalid() { + processor.fill(new MedicationSideEffect(), line(null, null, DRUG_UUID, "moderate", null, "x", null, null)); + } + + @Test(expected = IllegalArgumentException.class) + public void fill_shouldThrowWhenNeitherConceptNorTextProvided() { + processor.fill(new MedicationSideEffect(), line(null, null, DRUG_UUID, "common", null, null, null, null)); + } +} diff --git a/api-2.4/src/test/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectsLoaderIntegrationTest.java b/api-2.4/src/test/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectsLoaderIntegrationTest.java new file mode 100644 index 000000000..90b15be1e --- /dev/null +++ b/api-2.4/src/test/java/org/openmrs/module/initializer/api/medicationsideeffects/MedicationSideEffectsLoaderIntegrationTest.java @@ -0,0 +1,114 @@ +/* + * 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.api.medicationsideeffects; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.Locale; + +import org.junit.Before; +import org.junit.Test; +import org.openmrs.Concept; +import org.openmrs.ConceptName; +import org.openmrs.Drug; +import org.openmrs.api.ConceptService; +import org.openmrs.api.context.Context; +import org.openmrs.module.initializer.api.DomainBaseModuleContextSensitive_2_4_test; +import org.openmrs.module.medicationsideeffects.model.MedicationSideEffect; +import org.openmrs.module.medicationsideeffects.model.SideEffectClassification; +import org.openmrs.module.medicationsideeffects.service.MedicationSideEffectService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +public class MedicationSideEffectsLoaderIntegrationTest extends DomainBaseModuleContextSensitive_2_4_test { + + private static final String DRUG_UUID = "a1a1a1a1-0000-0000-0000-000000000001"; + + private static final String CONCEPT_UUID = "b1b1b1b1-0000-0000-0000-000000000001"; + + private static final String UUID_TO_CREATE = "c1c1c1c1-0000-0000-0000-000000000011"; + + private static final String UUID_TO_EDIT = "c1c1c1c1-0000-0000-0000-000000000012"; + + private static final String UUID_TO_RETIRE = "c1c1c1c1-0000-0000-0000-000000000013"; + + @Autowired + @Qualifier("conceptService") + private ConceptService cs; + + @Autowired + private MedicationSideEffectsLoader loader; + + private MedicationSideEffectService service; + + @Before + public void setup() { + service = Context.getService(MedicationSideEffectService.class); + + Concept effect = new Concept(); + effect.setUuid(CONCEPT_UUID); + effect.setShortName(new ConceptName("Test Nausea", Locale.ENGLISH)); + effect.setConceptClass(cs.getConceptClassByName("Misc")); + effect.setDatatype(cs.getConceptDatatypeByName("Text")); + cs.saveConcept(effect); + + Concept drugConcept = new Concept(); + drugConcept.setShortName(new ConceptName("Test Drug Concept", Locale.ENGLISH)); + drugConcept.setConceptClass(cs.getConceptClassByName("Drug")); + drugConcept.setDatatype(cs.getConceptDatatypeByName("Text")); + drugConcept = cs.saveConcept(drugConcept); + + Drug drug = new Drug(); + drug.setUuid(DRUG_UUID); + drug.setName("Test Drug 100mg"); + drug.setConcept(drugConcept); + cs.saveDrug(drug); + + MedicationSideEffect toEdit = new MedicationSideEffect(); + toEdit.setUuid(UUID_TO_EDIT); + toEdit.setDrug(drug); + toEdit.setClassification(SideEffectClassification.COMMON); + toEdit.setSideEffectText("Old text"); + service.saveMedicationSideEffect(toEdit); + + MedicationSideEffect toRetire = new MedicationSideEffect(); + toRetire.setUuid(UUID_TO_RETIRE); + toRetire.setDrug(drug); + toRetire.setClassification(SideEffectClassification.SERIOUS); + toRetire.setSideEffectText("To be voided"); + service.saveMedicationSideEffect(toRetire); + } + + @Test + public void load_shouldLoadMedicationSideEffectsAccordingToCsvFiles() { + loader.load(); + + MedicationSideEffect created = service.getByUuid(UUID_TO_CREATE); + assertNotNull(created); + assertEquals(SideEffectClassification.COMMON, created.getClassification()); + assertEquals(DRUG_UUID, created.getDrug().getUuid()); + assertNotNull(created.getSideEffectConcept()); + assertEquals(CONCEPT_UUID, created.getSideEffectConcept().getUuid()); + + MedicationSideEffect edited = service.getByUuid(UUID_TO_EDIT); + assertNotNull(edited); + assertEquals(SideEffectClassification.SERIOUS, edited.getClassification()); + assertNull(edited.getSideEffectConcept()); + assertEquals("Updated serious text", edited.getSideEffectText()); + assertEquals("Stop the medication", edited.getRecommendedAction()); + + MedicationSideEffect voided = service.getByUuid(UUID_TO_RETIRE); + assertNotNull(voided); + assertTrue(voided.getVoided()); + } +} diff --git a/api-2.4/src/test/resources/test-hibernate.cfg.xml b/api-2.4/src/test/resources/test-hibernate.cfg.xml index e8d4e48fc..476726f47 100644 --- a/api-2.4/src/test/resources/test-hibernate.cfg.xml +++ b/api-2.4/src/test/resources/test-hibernate.cfg.xml @@ -9,5 +9,6 @@ + diff --git a/api-2.4/src/test/resources/testAppDataDir/configuration/medicationsideeffects/medication_side_effects.csv b/api-2.4/src/test/resources/testAppDataDir/configuration/medicationsideeffects/medication_side_effects.csv new file mode 100644 index 000000000..6c912cbc6 --- /dev/null +++ b/api-2.4/src/test/resources/testAppDataDir/configuration/medicationsideeffects/medication_side_effects.csv @@ -0,0 +1,4 @@ +Uuid,Void/Retire,Drug Uuid,Classification,Side Effect Concept Uuid,Side Effect Text,Recommended Action,Notes +c1c1c1c1-0000-0000-0000-000000000011,,a1a1a1a1-0000-0000-0000-000000000001,common,b1b1b1b1-0000-0000-0000-000000000001,,,Created coded common effect +c1c1c1c1-0000-0000-0000-000000000012,,a1a1a1a1-0000-0000-0000-000000000001,serious,,Updated serious text,Stop the medication,Edited effect +c1c1c1c1-0000-0000-0000-000000000013,true,,,,,, 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 a3aefc826..670241e95 100644 --- a/api/src/main/java/org/openmrs/module/initializer/Domain.java +++ b/api/src/main/java/org/openmrs/module/initializer/Domain.java @@ -43,6 +43,7 @@ public enum Domain { IDGEN, AUTO_GENERATION_OPTIONS, DRUGS, + MEDICATION_SIDE_EFFECTS, ORDER_FREQUENCIES, ORDER_TYPES, APPOINTMENT_SPECIALITIES, diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index eafbd9b01..cffec13aa 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -86,6 +86,9 @@ org.openmrs.module.tasks + + org.openmrs.module.medicationsideeffects + diff --git a/pom.xml b/pom.xml index e45ca39b4..635772849 100644 --- a/pom.xml +++ b/pom.xml @@ -80,6 +80,7 @@ 2.4.0 1.6.0 1.1.0 + 1.0.0-SNAPSHOT 2.0.2 3.0.9 diff --git a/readme/medicationsideeffects.md b/readme/medicationsideeffects.md new file mode 100644 index 000000000..65e83b366 --- /dev/null +++ b/readme/medicationsideeffects.md @@ -0,0 +1,44 @@ +## Domain 'medicationsideeffects' +The **Medication Side Effects** subfolder contains CSV import files for saving known side effects of medications. Each row links a side effect to a `Drug` (at the drug/formulation level, not the concept), classified as *common* or *serious*. The effect itself is represented either by a coded `Concept` or as free text, and may carry a recommended clinical action. + +```bash +medicationsideeffects/ + ├──medication_side_effects.csv + └── ... +``` +Below are the possible headers with a sample data set: + +| Uuid | Drug Uuid | Classification | Side Effect Concept Uuid | Side Effect Text | Recommended Action | Notes | +|-------------------------------------------------|--------------------------------------------------|---------------------------|--------------------------------------------------|--------------------------------------|------------------------------------------|---------------------------| +| 7341f6c7-8b0a-4d4d-aae0-ecc5d1aa611c | dfd36a48-1946-454c-bc04-8dc7cada7120 | common | 5978AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | | | Nausea | +| 6ef54985-ce83-4af1-9cfe-73e87724470a | dfd36a48-1946-454c-bc04-8dc7cada7120 | serious | | Signs of liver injury | Stop and seek urgent care | Free-text effect| + +Let's review the headers below. + +###### Header `Uuid` *(optional)* +The UUID of the side-effect record. If empty a random UUID is generated; if provided, the row updates the existing record with that UUID (or creates one with that UUID). + +###### Header `Void/Retire` *(optional)* +When set to `true`, the rest of the row is ignored and the existing record (identified by `Uuid`) is voided. See [CSV conventions](csv_conventions.md). + +###### Header `Drug Uuid` *(required)* +The UUID of an existing `Drug`. The Initializer module does not create drugs; the referenced drug must already exist (see [Drugs](drugs.md)). + +###### Header `Classification` *(required)* +One of `common` or `serious` (case-insensitive). + +###### Header `Side Effect Concept Uuid` *(required if `Side Effect Text` is empty)* +The UUID of an existing `Concept` describing the effect (typically used for coded, common effects). + +###### Header `Side Effect Text` *(required if `Side Effect Concept Uuid` is empty)* +Free-text description of the effect (typically used for serious effects). **At least one** of `Side Effect Concept Uuid` or `Side Effect Text` must be provided on each row (both may be set). + +###### Header `Recommended Action` *(optional)* +Free-text recommended clinical action for this effect. + +###### Header `Notes` *(optional)* +Free-text internal notes. + +#### Requirements +* The [medicationsideeffects module](https://github.com/openmrs/openmrs-module-medicationsideeffects) must be installed; the loader is activated only when it is present. +* The OpenMRS version must be 2.4.0 or higher. \ No newline at end of file