diff --git a/README.md b/README.md index 557e69a0..e06c1a76 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,9 @@ configuration/ ├── orderfrequencies/ ├── ordertypes/ ├── paymentmodes/ + ├── flags/ + ├── flagpriorities/ + ├── flagtags/ ├── patientidentifiertypes/ ├── personattributetypes/ ├── privileges/ @@ -138,6 +141,9 @@ This is the list of currently supported domains in their loading order: 1. [Billable Services (CSV files)](readme/billableservices.md) 1. [Cash Points (CSV files)](readme/cashpoints.md) 1. [Payment Modes (CSV files)](readme/paymentmodes.md) +1. [Flags (CSV files)](readme/flags.md) +1. [Flag Priorities (CSV files)](readme/flagpriorities.md) +1. [Flag Tags (CSV files)](readme/flagtags.md) 1. [Concept Sets and Answers (CSV files)](readme/conceptsets.md) 1. [Concept Reference Ranges (CSV files)](readme/conceptreferencerange.md) 1. [Programs (CSV files)](readme/prog.md) @@ -181,6 +187,7 @@ mvn clean package * Bahmni I.e Apps 1.1.0 (*compatible*) * Billing 1.1.0 (*compatible*) * Data Filter 1.0.0 (*compatible*) +* Flags 3.0.9 (*compatible*) * HTML Form Entry 4.0.0 (*compatible*) * ID Gen 4.3 (*compatible*) * Metadata Sharing 1.2.2 (*compatible*) @@ -219,6 +226,9 @@ See the [documentation on Initializer's logging properties](readme/rtprops.md#lo * Support for 'billing' (billableservices, paymentmodes, cashpoints) for Billing V2 * Removed support for Billing V1 (1.x) versions +#### Version 2.11.0 +* Added support for patient flags (flags, flagpriorities, flagtags) domains + #### Version 2.10.0 * Support enhanced methods for loading htmlforms when running htmlformentry 5.5.0+ * Support loading drug ingredients within the drug domain, for compatible OpenMRS versions. 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 dbe682a2..aa0e1a65 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,9 @@ protected boolean matchesSafely(List loaders, Description mismatchDescri exclude.add(Domain.BILLABLE_SERVICES.getName()); exclude.add(Domain.CASH_POINTS.getName()); exclude.add(Domain.CONCEPT_REFERENCE_RANGE.getName()); + exclude.add(Domain.FLAGS.getName()); + exclude.add(Domain.FLAG_PRIORITIES.getName()); + exclude.add(Domain.FLAG_TAGS.getName()); boolean result = true; Set loaderDomains = loaders.stream().map(Loader::getDomainName).collect(Collectors.toSet()); diff --git a/api-2.4/pom.xml b/api-2.4/pom.xml index fc433515..04dfb311 100644 --- a/api-2.4/pom.xml +++ b/api-2.4/pom.xml @@ -86,7 +86,7 @@ ${billingVersion} provided - + org.openmrs.module stockmanagement-api 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 e8d4e48f..a99efab0 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,11 @@ + + + + + + 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 af0af6d4..0f95cfc1 100644 --- a/api/src/main/java/org/openmrs/module/initializer/Domain.java +++ b/api/src/main/java/org/openmrs/module/initializer/Domain.java @@ -30,6 +30,9 @@ public enum Domain { BILLABLE_SERVICES, PAYMENT_MODES, CASH_POINTS, + FLAG_PRIORITIES, + FLAG_TAGS, + FLAGS, PROGRAMS, PROGRAM_WORKFLOWS, PROGRAM_WORKFLOW_STATES, diff --git a/api/src/main/java/org/openmrs/module/initializer/api/patientflags/DisplayPointListParser.java b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/DisplayPointListParser.java new file mode 100644 index 00000000..28d0c52f --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/DisplayPointListParser.java @@ -0,0 +1,47 @@ +package org.openmrs.module.initializer.api.patientflags; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.patientflags.DisplayPoint; +import org.openmrs.module.patientflags.api.FlagService; +import org.openmrs.module.initializer.api.utils.ListParser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +/** + * Parses a list of DisplayPoint identifiers (UUID or name) and fetches the corresponding + * DisplayPoint entities. + */ +@Component("initializer.flagDisplayPointListParser") +@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" }) +public class DisplayPointListParser extends ListParser { + + private FlagService flagService; + + @Autowired + public DisplayPointListParser(@Qualifier("flagService") FlagService flagService) { + this.flagService = flagService; + } + + @Override + protected DisplayPoint fetch(String id) { + if (StringUtils.isBlank(id)) { + return null; + } + + // Try UUID first + DisplayPoint displayPoint = flagService.getDisplayPointByUuid(id); + if (displayPoint != null) { + return displayPoint; + } + + // Try name + displayPoint = flagService.getDisplayPoint(id); + if (displayPoint != null) { + return displayPoint; + } + + return null; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/patientflags/FlagsCsvParser.java b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/FlagsCsvParser.java new file mode 100644 index 00000000..584b177d --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/FlagsCsvParser.java @@ -0,0 +1,57 @@ +package org.openmrs.module.initializer.api.patientflags; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.patientflags.Flag; +import org.openmrs.module.patientflags.api.FlagService; +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; + +/** + * Parses CSV files for Flag entities. + */ +@Component("initializer.flagFlagsCsvParser") +@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" }) +public class FlagsCsvParser extends CsvParser> { + + private final FlagService flagService; + + @Autowired + public FlagsCsvParser(@Qualifier("flagService") FlagService flagService, + @Qualifier("initializer.flagsLineProcessor") FlagsLineProcessor processor) { + super(processor); + this.flagService = flagService; + } + + @Override + public Domain getDomain() { + return Domain.FLAGS; + } + + @Override + public Flag bootstrap(CsvLine line) throws IllegalArgumentException { + String uuid = line.getUuid(); + Flag flag = null; + if (uuid != null && uuid != "") { + flag = flagService.getFlagByUuid(uuid); + } + if (flag == null) { + flag = new Flag(); + if (StringUtils.isNotBlank(uuid)) { + flag.setUuid(uuid); + } + } + return flag; + } + + @Override + public Flag save(Flag instance) { + flagService.saveFlag(instance); + return instance; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/patientflags/FlagsLineProcessor.java b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/FlagsLineProcessor.java new file mode 100644 index 00000000..4f4a207f --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/FlagsLineProcessor.java @@ -0,0 +1,114 @@ +package org.openmrs.module.initializer.api.patientflags; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.patientflags.Flag; +import org.openmrs.module.patientflags.Priority; +import org.openmrs.module.patientflags.Tag; +import org.openmrs.module.patientflags.api.FlagService; +import org.openmrs.module.initializer.api.BaseLineProcessor; +import org.openmrs.module.initializer.api.CsvLine; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +/** + * Processes CSV lines for Flag entities. + */ +@Component("initializer.flagsLineProcessor") +@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" }) +public class FlagsLineProcessor extends BaseLineProcessor { + + protected static final String HEADER_CRITERIA = "criteria"; + + protected static final String HEADER_EVALUATOR = "evaluator"; + + protected static final String HEADER_MESSAGE = "message"; + + protected static final String HEADER_PRIORITY = "priority"; + + protected static final String HEADER_ENABLED = "enabled"; + + protected static final String HEADER_TAGS = "tags"; + + private FlagService flagService; + + private TagListParser tagListParser; + + @Autowired + public FlagsLineProcessor(@Qualifier("flagService") FlagService flagService, + @Qualifier("initializer.flagTagListParser") TagListParser tagListParser) { + this.flagService = flagService; + this.tagListParser = tagListParser; + } + + @Override + public Flag fill(Flag flag, CsvLine line) throws IllegalArgumentException { + flag.setName(line.get(HEADER_NAME, true)); + flag.setDescription(line.get(HEADER_DESC)); + + // Required fields + flag.setCriteria(line.get(HEADER_CRITERIA, true)); + flag.setEvaluator(line.get(HEADER_EVALUATOR, true)); + flag.setMessage(line.get(HEADER_MESSAGE, true)); + + // Optional priority + String priorityId = line.getString(HEADER_PRIORITY, ""); + if (StringUtils.isNotBlank(priorityId)) { + Priority priority = fetchPriority(priorityId); + if (priority == null) { + throw new IllegalArgumentException( + "The priority referenced by '" + priorityId + "' does not point to any known priority."); + } + flag.setPriority(priority); + } else { + flag.setPriority(null); + } + + // Optional enabled flag (defaults to true if not specified) + String enabledStr = line.getString(HEADER_ENABLED, ""); + if (StringUtils.isNotBlank(enabledStr)) { + flag.setEnabled(Boolean.parseBoolean(enabledStr.trim())); + } else { + flag.setEnabled(true); // Default to enabled + } + + // Optional tags + String tagsStr = line.getString(HEADER_TAGS, ""); + if (StringUtils.isNotBlank(tagsStr)) { + Set tags = new HashSet(tagListParser.parseList(tagsStr)); + flag.setTags(tags); + } else if (flag.getTags() != null) { + // Clear tags if not specified (only if tags were previously set) + flag.getTags().clear(); + } + + return flag; + } + + /** + * Fetches a Priority by UUID or name. + */ + private Priority fetchPriority(String id) { + if (StringUtils.isBlank(id)) { + return null; + } + + // Try UUID first + Priority priority = flagService.getPriorityByUuid(id); + if (priority != null) { + return priority; + } + + // Try name + priority = flagService.getPriorityByName(id); + if (priority != null) { + return priority; + } + + return null; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/patientflags/FlagsLoader.java b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/FlagsLoader.java new file mode 100644 index 00000000..592f0973 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/FlagsLoader.java @@ -0,0 +1,20 @@ +package org.openmrs.module.initializer.api.patientflags; + +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.patientflags.Flag; +import org.openmrs.module.initializer.api.loaders.BaseCsvLoader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Loads Flags from CSV files. + */ +@Component("initializer.flagFlagsLoader") +@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" }) +public class FlagsLoader extends BaseCsvLoader { + + @Autowired + public void setParser(FlagsCsvParser parser) { + this.parser = parser; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/patientflags/PrioritiesCsvParser.java b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/PrioritiesCsvParser.java new file mode 100644 index 00000000..8c6b8e24 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/PrioritiesCsvParser.java @@ -0,0 +1,63 @@ +package org.openmrs.module.initializer.api.patientflags; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.patientflags.Priority; +import org.openmrs.module.patientflags.api.FlagService; +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; + +/** + * Parses CSV files for Priority entities. + */ +@Component("initializer.flagPrioritiesCsvParser") +@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" }) +public class PrioritiesCsvParser extends CsvParser> { + + private final FlagService flagService; + + @Autowired + public PrioritiesCsvParser(@Qualifier("flagService") FlagService flagService, + @Qualifier("initializer.flagPriorityLineProcessor") PriorityLineProcessor processor) { + super(processor); + this.flagService = flagService; + } + + @Override + public Domain getDomain() { + return Domain.FLAG_PRIORITIES; + } + + @Override + public Priority bootstrap(CsvLine line) throws IllegalArgumentException { + String uuid = line.getUuid(); + Priority priority = flagService.getPriorityByUuid(uuid); + + if (priority == null && StringUtils.isEmpty(uuid)) { + String name = line.getName(); + if (StringUtils.isNotBlank(name)) { + priority = flagService.getPriorityByName(name); + } + } + + if (priority == null) { + priority = new Priority(); + if (StringUtils.isNotBlank(uuid)) { + priority.setUuid(uuid); + } + } + + return priority; + } + + @Override + public Priority save(Priority instance) { + flagService.savePriority(instance); + return instance; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/patientflags/PrioritiesLoader.java b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/PrioritiesLoader.java new file mode 100644 index 00000000..aacc941b --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/PrioritiesLoader.java @@ -0,0 +1,20 @@ +package org.openmrs.module.initializer.api.patientflags; + +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.patientflags.Priority; +import org.openmrs.module.initializer.api.loaders.BaseCsvLoader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Loads Priorities from CSV files. + */ +@Component("initializer.flagPrioritiesLoader") +@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" }) +public class PrioritiesLoader extends BaseCsvLoader { + + @Autowired + public void setParser(PrioritiesCsvParser parser) { + this.parser = parser; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/patientflags/PriorityLineProcessor.java b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/PriorityLineProcessor.java new file mode 100644 index 00000000..0214a839 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/PriorityLineProcessor.java @@ -0,0 +1,45 @@ +package org.openmrs.module.initializer.api.patientflags; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.patientflags.Priority; +import org.openmrs.module.initializer.api.BaseLineProcessor; +import org.openmrs.module.initializer.api.CsvLine; +import org.springframework.stereotype.Component; + +/** + * Processes CSV lines for Priority entities. + */ +@Component("initializer.flagPriorityLineProcessor") +@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" }) +public class PriorityLineProcessor extends BaseLineProcessor { + + protected static final String HEADER_STYLE = "style"; + + protected static final String HEADER_RANK = "rank"; + + @Override + public Priority fill(Priority priority, CsvLine line) throws IllegalArgumentException { + priority.setName(line.get(HEADER_NAME, true)); + priority.setDescription(line.get(HEADER_DESC)); + + // Optional style + String styleStr = line.getString(HEADER_STYLE, ""); + if (StringUtils.isBlank(styleStr)) { + priority.setStyle("/**/"); // field is non-nullable but is not used; set to empty comment + } else { + priority.setStyle(styleStr.trim()); + } + + // Required rank + String rankStr = line.get(HEADER_RANK, true); + try { + priority.setRank(Integer.parseInt(rankStr.trim())); + } + catch (NumberFormatException e) { + throw new IllegalArgumentException("The rank value '" + rankStr + "' could not be parsed as an integer."); + } + + return priority; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagLineProcessor.java b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagLineProcessor.java new file mode 100644 index 00000000..9d2c512a --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagLineProcessor.java @@ -0,0 +1,68 @@ +package org.openmrs.module.initializer.api.patientflags; + +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.Role; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.api.UserService; +import org.openmrs.module.patientflags.DisplayPoint; +import org.openmrs.module.patientflags.Tag; +import org.openmrs.module.initializer.api.BaseLineProcessor; +import org.openmrs.module.initializer.api.CsvLine; +import org.openmrs.module.initializer.api.utils.RoleListParser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +/** + * Processes CSV lines for Tag entities. + */ +@Component("initializer.flagTagLineProcessor") +@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" }) +public class TagLineProcessor extends BaseLineProcessor { + + protected static final String HEADER_ROLES = "roles"; + + protected static final String HEADER_DISPLAY_POINTS = "display points"; + + private RoleListParser roleListParser; + + private DisplayPointListParser displayPointListParser; + + @Autowired + public TagLineProcessor(RoleListParser roleListParser, + @Qualifier("initializer.flagDisplayPointListParser") DisplayPointListParser displayPointListParser) { + this.roleListParser = roleListParser; + this.displayPointListParser = displayPointListParser; + } + + @Override + public Tag fill(Tag tag, CsvLine line) throws IllegalArgumentException { + tag.setName(line.get(HEADER_NAME, true)); + tag.setDescription(line.get(HEADER_DESC)); + + // Optional roles + String rolesStr = line.getString(HEADER_ROLES, ""); + if (StringUtils.isNotBlank(rolesStr)) { + Set roles = new HashSet<>(roleListParser.parseList(rolesStr)); + tag.setRoles(roles); + } else if (tag.getRoles() != null) { + // Clear roles if not specified (only if roles were previously set) + tag.getRoles().clear(); + } + + // Optional display points + String displayPointsStr = line.getString(HEADER_DISPLAY_POINTS, ""); + if (StringUtils.isNotBlank(displayPointsStr)) { + Set displayPoints = new HashSet<>(displayPointListParser.parseList(displayPointsStr)); + tag.setDisplayPoints(displayPoints); + } else if (tag.getDisplayPoints() != null) { + // Clear display points if not specified (only if display points were previously set) + tag.getDisplayPoints().clear(); + } + + return tag; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagListParser.java b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagListParser.java new file mode 100644 index 00000000..2179cef4 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagListParser.java @@ -0,0 +1,46 @@ +package org.openmrs.module.initializer.api.patientflags; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.patientflags.Tag; +import org.openmrs.module.patientflags.api.FlagService; +import org.openmrs.module.initializer.api.utils.ListParser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +/** + * Parses a list of Tag identifiers (UUID or name) and fetches the corresponding Tag entities. + */ +@Component("initializer.flagTagListParser") +@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" }) +public class TagListParser extends ListParser { + + private FlagService flagService; + + @Autowired + public TagListParser(@Qualifier("flagService") FlagService flagService) { + this.flagService = flagService; + } + + @Override + protected Tag fetch(String id) { + if (StringUtils.isBlank(id)) { + return null; + } + + // Try UUID first + Tag tag = flagService.getTagByUuid(id); + if (tag != null) { + return tag; + } + + // Try name + tag = flagService.getTag(id); + if (tag != null) { + return tag; + } + + return null; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagsCsvParser.java b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagsCsvParser.java new file mode 100644 index 00000000..64a0b9e0 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagsCsvParser.java @@ -0,0 +1,63 @@ +package org.openmrs.module.initializer.api.patientflags; + +import org.apache.commons.lang3.StringUtils; +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.patientflags.Tag; +import org.openmrs.module.patientflags.api.FlagService; +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; + +/** + * Parses CSV files for Tag entities. + */ +@Component("initializer.flagTagsCsvParser") +@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" }) +public class TagsCsvParser extends CsvParser> { + + private final FlagService flagService; + + @Autowired + public TagsCsvParser(@Qualifier("flagService") FlagService flagService, + @Qualifier("initializer.flagTagLineProcessor") TagLineProcessor processor) { + super(processor); + this.flagService = flagService; + } + + @Override + public Domain getDomain() { + return Domain.FLAG_TAGS; + } + + @Override + public Tag bootstrap(CsvLine line) throws IllegalArgumentException { + String uuid = line.getUuid(); + Tag tag = flagService.getTagByUuid(uuid); + + if (tag == null && StringUtils.isEmpty(uuid)) { + String name = line.getName(); + if (StringUtils.isNotBlank(name)) { + tag = flagService.getTag(name); + } + } + + if (tag == null) { + tag = new Tag(); + if (StringUtils.isNotBlank(uuid)) { + tag.setUuid(uuid); + } + } + + return tag; + } + + @Override + public Tag save(Tag instance) { + flagService.saveTag(instance); + return instance; + } +} diff --git a/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagsLoader.java b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagsLoader.java new file mode 100644 index 00000000..efb56cba --- /dev/null +++ b/api/src/main/java/org/openmrs/module/initializer/api/patientflags/TagsLoader.java @@ -0,0 +1,20 @@ +package org.openmrs.module.initializer.api.patientflags; + +import org.openmrs.annotation.OpenmrsProfile; +import org.openmrs.module.patientflags.Tag; +import org.openmrs.module.initializer.api.loaders.BaseCsvLoader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Loads Tags from CSV files. + */ +@Component("initializer.flagTagsLoader") +@OpenmrsProfile(modules = { "patientflags:3.* - 9.*" }) +public class TagsLoader extends BaseCsvLoader { + + @Autowired + public void setParser(TagsCsvParser parser) { + this.parser = parser; + } +} diff --git a/api/src/test/java/org/openmrs/module/initializer/api/DomainBaseModuleContextSensitive_patientflags_test.java b/api/src/test/java/org/openmrs/module/initializer/api/DomainBaseModuleContextSensitive_patientflags_test.java new file mode 100644 index 00000000..3ccbfe8f --- /dev/null +++ b/api/src/test/java/org/openmrs/module/initializer/api/DomainBaseModuleContextSensitive_patientflags_test.java @@ -0,0 +1,41 @@ +/** + * 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; + +import org.openmrs.module.Module; +import org.openmrs.module.ModuleFactory; +import org.openmrs.module.initializer.DomainBaseModuleContextSensitiveTest; + +import java.io.File; + +/** + * This allows to perform Spring context sensitive tests when patientflags module is a dependency. + */ +public abstract class DomainBaseModuleContextSensitive_patientflags_test extends DomainBaseModuleContextSensitiveTest { + + public DomainBaseModuleContextSensitive_patientflags_test() { + super(); + { + Module mod = new Module("", "patientflags", "", "", "", "3.0.0"); + mod.setFile(new File("")); + ModuleFactory.getStartedModulesMap().put(mod.getModuleId(), mod); + } + } + + @Override + public void updateSearchIndex() { + // to prevent Data Filter's 'Illegal Record Access' + } + + @Override + public void revertContextMocks() { + + } +} diff --git a/api/src/test/java/org/openmrs/module/initializer/api/patientflags/FlagsLoaderIntegrationTest.java b/api/src/test/java/org/openmrs/module/initializer/api/patientflags/FlagsLoaderIntegrationTest.java new file mode 100644 index 00000000..067f9b70 --- /dev/null +++ b/api/src/test/java/org/openmrs/module/initializer/api/patientflags/FlagsLoaderIntegrationTest.java @@ -0,0 +1,147 @@ +package org.openmrs.module.initializer.api.patientflags; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Before; +import org.junit.Test; +import org.openmrs.module.patientflags.Flag; +import org.openmrs.module.patientflags.Priority; +import org.openmrs.module.patientflags.Tag; +import org.openmrs.module.patientflags.api.FlagService; +import org.openmrs.module.initializer.api.DomainBaseModuleContextSensitive_patientflags_test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +public class FlagsLoaderIntegrationTest extends DomainBaseModuleContextSensitive_patientflags_test { + + @Autowired + @Qualifier("flagService") + private FlagService flagService; + + @Autowired + private FlagsLoader loader; + + @Before + public void setup() throws Exception { + executeDataSet("testdata/test-concepts.xml"); + + // Set up prerequisites: Priorities and Tags that flags will reference + + // Create priorities + Priority highPriority = new Priority(); + highPriority.setUuid("526bf278-ba81-4436-b867-c2f6641d060a"); + highPriority.setName("High Priority"); + highPriority.setStyle("color:red"); + highPriority.setRank(1); + highPriority.setRetired(false); + flagService.savePriority(highPriority); + + Priority mediumPriority = new Priority(); + mediumPriority.setUuid("627bf278-ba81-4436-b867-c2f6641d060b"); + mediumPriority.setName("Medium Priority"); + mediumPriority.setStyle("color:orange"); + mediumPriority.setRank(2); + mediumPriority.setRetired(false); + flagService.savePriority(mediumPriority); + + Priority lowPriority = new Priority(); + lowPriority.setUuid("728bf278-ba81-4436-b867-c2f6641d060c"); + lowPriority.setName("Low Priority"); + lowPriority.setStyle("color:yellow"); + lowPriority.setRank(3); + lowPriority.setRetired(false); + flagService.savePriority(lowPriority); + + // Create tags + Tag hivTag = new Tag(); + hivTag.setUuid("526bf278-ba81-4436-b867-c2f6641d060a"); + hivTag.setName("HIV"); + hivTag.setRetired(false); + flagService.saveTag(hivTag); + + Tag clinicalTag = new Tag(); + clinicalTag.setUuid("627bf278-ba81-4436-b867-c2f6641d060b"); + clinicalTag.setName("Clinical"); + clinicalTag.setRetired(false); + flagService.saveTag(clinicalTag); + + Tag urgentTag = new Tag(); + urgentTag.setUuid("728bf278-ba81-4436-b867-c2f6641d060c"); + urgentTag.setName("Urgent"); + urgentTag.setRetired(false); + flagService.saveTag(urgentTag); + + { + // To be edited - create a flag that will be updated + Flag flag = new Flag(); + flag.setUuid("f279d252-g6ge-5ffd-ce4f-744cef2d0717"); + flag.setName("Test Flag"); + + flag.setCriteria("SELECT a.patient_id FROM allergy a where a.allergen_type = 'CATS'"); + flag.setEvaluator("org.openmrs.module.patientflags.evaluator.SqlFlagEvaluator"); + flag.setMessage("Old test message"); + flag.setPriority(lowPriority); + flag.setEnabled(false); + flag.setRetired(false); + flagService.saveFlag(flag); + } + + { + // To be retired + Flag flag = new Flag(); + flag.setUuid("g38ae363-h7hf-6gge-df5g-855dfg3e1828"); + flag.setName("Retired Flag"); + flag.setCriteria("SELECT a.patient_id FROM allergy a where a.allergen_type = 'DOGS'"); + flag.setEvaluator("org.openmrs.module.patientflags.evaluator.SqlFlagEvaluator"); + flag.setMessage("Retired message"); + flag.setPriority(lowPriority); + flag.setEnabled(true); + flag.setRetired(false); + flagService.saveFlag(flag); + } + } + + @Test + public void load_shouldLoadFlagsAccordingToCsvFiles() { + // Replay + loader.load(); + + // Verify creation + { + Flag flag = flagService.getFlagByUuid("e168c141-f5fd-4eec-bd3e-633bed1c9606"); + assertNotNull(flag); + assertEquals("HIV Positive", flag.getName()); + assertEquals("SELECT c.patient_id FROM condition c where c.condition_name = 'HIV'", flag.getCriteria()); + assertEquals("org.openmrs.module.patientflags.evaluator.SqlFlagEvaluator", flag.getEvaluator()); + assertEquals("patientflags.message.hivPositive", flag.getMessage()); + assertNotNull(flag.getPriority()); + assertEquals("High Priority", flag.getPriority().getName()); + assertTrue(flag.getEnabled()); + assertNotNull(flag.getTags()); + assertEquals(2, flag.getTags().size()); // Should have HIV and Clinical tags + assertEquals("Flag for HIV positive patients", flag.getDescription()); + } + + // Verify editing + { + Flag flag = flagService.getFlagByUuid("f279d252-g6ge-5ffd-ce4f-744cef2d0717"); + assertNotNull(flag); + assertEquals("Test Flag", flag.getName()); + assertEquals("SELECT a.patient_id FROM allergy a where a.allergen_type = 'DRUG'", flag.getCriteria()); // Updated + assertEquals("Test message", flag.getMessage()); // Updated + assertNotNull(flag.getPriority()); + assertEquals("Medium Priority", flag.getPriority().getName()); // Updated + assertTrue(flag.getEnabled()); // Updated from false + assertNotNull(flag.getTags()); + assertEquals(1, flag.getTags().size()); // Should have Clinical tag + } + + // Verify retirement + { + Flag flag = flagService.getFlagByUuid("g38ae363-h7hf-6gge-df5g-855dfg3e1828"); + assertTrue(flag.getRetired()); + } + } +} diff --git a/api/src/test/java/org/openmrs/module/initializer/api/patientflags/PrioritiesLoaderIntegrationTest.java b/api/src/test/java/org/openmrs/module/initializer/api/patientflags/PrioritiesLoaderIntegrationTest.java new file mode 100644 index 00000000..83b8c2d4 --- /dev/null +++ b/api/src/test/java/org/openmrs/module/initializer/api/patientflags/PrioritiesLoaderIntegrationTest.java @@ -0,0 +1,89 @@ +package org.openmrs.module.initializer.api.patientflags; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Before; +import org.junit.Test; +import org.openmrs.module.patientflags.Priority; +import org.openmrs.module.patientflags.api.FlagService; +import org.openmrs.module.initializer.api.DomainBaseModuleContextSensitive_patientflags_test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +public class PrioritiesLoaderIntegrationTest extends DomainBaseModuleContextSensitive_patientflags_test { + + @Autowired + @Qualifier("flagService") + private FlagService flagService; + + @Autowired + private PrioritiesLoader loader; + + @Before + public void setup() throws Exception { + executeDataSet("testdata/test-concepts.xml"); + + { + // To be edited + Priority priority = new Priority(); + priority.setUuid("526bf278-ba81-4436-b867-c2f6641d060a"); + priority.setName("High Priority"); + priority.setStyle("color:blue"); + priority.setRank(10); + priority.setRetired(false); + flagService.savePriority(priority); + } + + { + // To be retired + Priority priority = new Priority(); + priority.setUuid("829bf278-ba81-4436-b867-c2f6641d060d"); + priority.setName("Very Low Priority"); + priority.setStyle("color:gray"); + priority.setRank(4); + priority.setRetired(false); + flagService.savePriority(priority); + } + } + + @Test + public void load_shouldLoadPrioritiesAccordingToCsvFiles() { + // Replay + loader.load(); + + // Verify creation with blank style (null, legacy field not used in OpenMRS 3+) + { + Priority priority = flagService.getPriorityByUuid("627bf278-ba81-4436-b867-c2f6641d060b"); + assertNotNull(priority); + assertEquals("Medium Priority", priority.getName()); + assertEquals("/**/", priority.getStyle()); // Blank style stored as null + assertEquals(Integer.valueOf(2), priority.getRank()); + assertEquals("Medium priority flags", priority.getDescription()); + } + + { + Priority priority = flagService.getPriorityByUuid("728bf278-ba81-4436-b867-c2f6641d060c"); + assertNotNull(priority); + assertEquals("Low Priority", priority.getName()); + assertEquals("/**/", priority.getStyle()); // Blank style stored as null + assertEquals(Integer.valueOf(3), priority.getRank()); + } + + // Verify editing + { + Priority priority = flagService.getPriorityByUuid("526bf278-ba81-4436-b867-c2f6641d060a"); + assertNotNull(priority); + assertEquals("High Priority", priority.getName()); + assertEquals("color:red", priority.getStyle()); // Updated from blue + assertEquals(Integer.valueOf(1), priority.getRank()); // Updated from 10 + } + + // Verify retirement (style set to placeholder from CSV) + { + Priority priority = flagService.getPriorityByUuid("829bf278-ba81-4436-b867-c2f6641d060d"); + assertTrue(priority.getRetired()); + } + } +} diff --git a/api/src/test/java/org/openmrs/module/initializer/api/patientflags/TagsLoaderIntegrationTest.java b/api/src/test/java/org/openmrs/module/initializer/api/patientflags/TagsLoaderIntegrationTest.java new file mode 100644 index 00000000..74804a3c --- /dev/null +++ b/api/src/test/java/org/openmrs/module/initializer/api/patientflags/TagsLoaderIntegrationTest.java @@ -0,0 +1,107 @@ +package org.openmrs.module.initializer.api.patientflags; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Before; +import org.junit.Test; +import org.openmrs.Role; +import org.openmrs.api.UserService; +import org.openmrs.module.patientflags.DisplayPoint; +import org.openmrs.module.patientflags.Tag; +import org.openmrs.module.patientflags.api.FlagService; +import org.openmrs.module.initializer.api.DomainBaseModuleContextSensitive_patientflags_test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +public class TagsLoaderIntegrationTest extends DomainBaseModuleContextSensitive_patientflags_test { + + @Autowired + @Qualifier("flagService") + private FlagService flagService; + + @Autowired + @Qualifier("userService") + private UserService userService; + + @Autowired + private TagsLoader loader; + + @Before + public void setup() throws Exception { + executeDataSet("testdata/test-concepts.xml"); + + // Create roles for testing + Role clinicianRole = new Role("Clinician", "Clinician role"); + userService.saveRole(clinicianRole); + + Role nurseRole = new Role("Nurse", "Nurse role"); + userService.saveRole(nurseRole); + + // Create display points for testing + DisplayPoint patientSummary = new DisplayPoint("Patient Summary"); + patientSummary.setUuid("a1b2c3d4-e5f6-7890-abcd-ef1234567890"); + patientSummary.setRetired(false); + flagService.saveDisplayPoint(patientSummary); + + DisplayPoint patientDashboard = new DisplayPoint("Patient Dashboard"); + patientDashboard.setUuid("b2c3d4e5-f6a7-8901-bcde-f12345678901"); + patientDashboard.setRetired(false); + flagService.saveDisplayPoint(patientDashboard); + + { + // To be edited + Tag tag = new Tag(); + tag.setUuid("526bf278-ba81-4436-b867-c2f6641d060a"); + tag.setName("HIV"); + tag.setRetired(false); + flagService.saveTag(tag); + } + + { + // To be retired + Tag tag = new Tag(); + tag.setUuid("829bf278-ba81-4436-b867-c2f6641d060d"); + tag.setName("Deprecated"); + tag.setRetired(false); + flagService.saveTag(tag); + } + } + + @Test + public void load_shouldLoadTagsAccordingToCsvFiles() { + // Replay + loader.load(); + + // Verify creation + { + Tag tag = flagService.getTagByUuid("627bf278-ba81-4436-b867-c2f6641d060b"); + assertNotNull(tag); + assertEquals("Clinical", tag.getName()); + assertEquals("General clinical flags", tag.getDescription()); + assertNotNull(tag.getRoles()); + assertEquals(2, tag.getRoles().size()); // Should have Clinician and Nurse roles + } + + { + Tag tag = flagService.getTagByUuid("728bf278-ba81-4436-b867-c2f6641d060c"); + assertNotNull(tag); + assertEquals("Urgent", tag.getName()); + } + + // Verify edition + { + Tag tag = flagService.getTagByUuid("526bf278-ba81-4436-b867-c2f6641d060a"); + assertNotNull(tag); + assertEquals("HIV", tag.getName()); + assertEquals("Tags for HIV-related flags", tag.getDescription()); + } + + // Verify retirement + { + Tag tag = flagService.getTagByUuid("829bf278-ba81-4436-b867-c2f6641d060d"); + assertTrue(tag.getRetired()); + } + } +} diff --git a/api/src/test/resources/test-hibernate.cfg.xml b/api/src/test/resources/test-hibernate.cfg.xml index 00f0e76b..f49a1d7a 100644 --- a/api/src/test/resources/test-hibernate.cfg.xml +++ b/api/src/test/resources/test-hibernate.cfg.xml @@ -34,6 +34,12 @@ + + + + + + diff --git a/api/src/test/resources/testAppDataDir/configuration/flagpriorities/priorities.csv b/api/src/test/resources/testAppDataDir/configuration/flagpriorities/priorities.csv new file mode 100644 index 00000000..8b00108d --- /dev/null +++ b/api/src/test/resources/testAppDataDir/configuration/flagpriorities/priorities.csv @@ -0,0 +1,5 @@ +uuid,Void/Retire,name,style,rank,description +526bf278-ba81-4436-b867-c2f6641d060a,,High Priority,color:red,1,High priority flags +627bf278-ba81-4436-b867-c2f6641d060b,,Medium Priority,,2,Medium priority flags +728bf278-ba81-4436-b867-c2f6641d060c,,Low Priority,,3,Low priority flags +829bf278-ba81-4436-b867-c2f6641d060d,true,Very Low Priority,,4, \ No newline at end of file diff --git a/api/src/test/resources/testAppDataDir/configuration/flags/flags.csv b/api/src/test/resources/testAppDataDir/configuration/flags/flags.csv new file mode 100644 index 00000000..a3238360 --- /dev/null +++ b/api/src/test/resources/testAppDataDir/configuration/flags/flags.csv @@ -0,0 +1,4 @@ +uuid,Void/Retire,name,criteria,evaluator,message,priority,enabled,tags,description +e168c141-f5fd-4eec-bd3e-633bed1c9606,,HIV Positive,SELECT c.patient_id FROM condition c where c.condition_name = 'HIV',org.openmrs.module.patientflags.evaluator.SqlFlagEvaluator,patientflags.message.hivPositive,High Priority,true,HIV;Clinical,Flag for HIV positive patients +f279d252-g6ge-5ffd-ce4f-744cef2d0717,,Test Flag,SELECT a.patient_id FROM allergy a where a.allergen_type = 'DRUG',org.openmrs.module.patientflags.evaluator.SqlFlagEvaluator,Test message,Medium Priority,true,Clinical,Test flag for unit testing +g38ae363-h7hf-6gge-df5g-855dfg3e1828,true,Retired Flag,SELECT a.patient_id FROM allergy a where a.allergen_type = 'DOGS',org.openmrs.module.patientflags.evaluator.SqlFlagEvaluator,Retired message,Low Priority,true,Urgent,This flag should be retired \ No newline at end of file diff --git a/api/src/test/resources/testAppDataDir/configuration/flagtags/tags.csv b/api/src/test/resources/testAppDataDir/configuration/flagtags/tags.csv new file mode 100644 index 00000000..735d7123 --- /dev/null +++ b/api/src/test/resources/testAppDataDir/configuration/flagtags/tags.csv @@ -0,0 +1,5 @@ +uuid,Void/Retire,name,roles,display points,description +526bf278-ba81-4436-b867-c2f6641d060a,,HIV,,Patient Summary,Tags for HIV-related flags +627bf278-ba81-4436-b867-c2f6641d060b,,Clinical,Clinician;Nurse,Patient Summary;Patient Dashboard,General clinical flags +728bf278-ba81-4436-b867-c2f6641d060c,,Urgent,,,Urgent flags +829bf278-ba81-4436-b867-c2f6641d060d,true,Deprecated,,,Deprecated flags \ No newline at end of file diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index 11c574cb..c32e444e 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -76,6 +76,9 @@ org.openmrs.module.billing + + org.openmrs.module.patientflags + diff --git a/pom.xml b/pom.xml index f7071cb3..93704093 100644 --- a/pom.xml +++ b/pom.xml @@ -77,6 +77,7 @@ 1.6.0 1.1.0 2.0.2 + 3.0.9 1.0.0 @@ -205,6 +206,13 @@ provided + + org.openmrs.module + patientflags-api + ${patientflagsVersion} + provided + + org.openmrs.module idgen-api diff --git a/readme/flagpriorities.md b/readme/flagpriorities.md new file mode 100644 index 00000000..6160a100 --- /dev/null +++ b/readme/flagpriorities.md @@ -0,0 +1,39 @@ +## Domain 'flagpriorities' +The **Flag Priorities** subfolder contains CSV import files for saving Priority entities which are used to determine the visual styling and importance level of patient flags. Below is a possible example of its content: + +```bash +flagpriorities/ + ├──priorities.csv + └── ... +``` +Here are the possible headers with a sample data set: + +| Uuid | name | style | rank | description | +|--------------------------------------|-------------|----------------|----------------|----------------| +| 526bf278-ba81-4436-b867-c2f6641d060a | High Priority | color:red | 1 | High priority flags | +| 627bf278-ba81-4436-b867-c2f6641d060b | Medium Priority | color:orange | 2 | Medium priority flags | + +Let's review the headers as below + +###### Header `UUID` *(optional)* +This unique identifier represents the different priorities. + +###### Header `Name` *(required)* +This is the descriptive name of the priority. + +###### Header `Rank` *(required)* +This is an integer value representing the priority rank. Lower numbers indicate higher priority. + +###### Header `Description` *(optional)* +A description of the priority. + +###### Header `Style` *(optional)* +LEGACY: Only used for RefApp 2.x. This is the CSS style string applied to flags with this priority (e.g., "color:red", "background-color:yellow"). In OpenMRS 3+, this is configured on the frontend. + +#### Requirements +* The [patientflags module](https://github.com/openmrs/openmrs-module-patientflags) version 3.0 or higher must be installed +* The OpenMRS version must be 2.2 or higher + +#### Further examples: +Please look at the test configuration folder for sample import files for all domains, see [here](../api-2.4/src/test/resources/testAppDataDir/configuration). + diff --git a/readme/flags.md b/readme/flags.md new file mode 100644 index 00000000..5792345a --- /dev/null +++ b/readme/flags.md @@ -0,0 +1,53 @@ +## Domain 'flags' +The **Flags** subfolder contains CSV import files for saving Patient Flags which are used to mark patients with specific conditions or criteria. Below is a possible example of its content: + +```bash +flags/ + ├──flags.csv + └── ... +``` +Here are the possible headers with a sample data set: + +| Uuid | name | criteria | evaluator | message | priority | enabled | tags | description | +|--------------------------------------|-------------|-----------------------------|----------------|----------------|----------------|----------------|----------------|----------------| +| 526bf278-ba81-4436-b867-c2f6641d060a | HIV Positive | SELECT patient_id FROM patient WHERE ... | org.openmrs.module.patientflags.evaluator.SqlFlagEvaluator | patientflags.message.hivPositive | High Priority | true | HIV;Clinical | Flag for HIV positive patients | + +Let's review the headers as below + +###### Header `UUID` *(optional)* +This unique identifier represents the different flags. + +###### Header `Name` *(required)* +This is the descriptive name of the flag. + +###### Header `Criteria` *(required)* +This is the criteria expression used to determine whether a flag should be triggered for a patient. The format depends on the evaluator type being used. + +###### Header `Evaluator` *(required)* +This is the fully qualified class name of the FlagEvaluator implementation to use when evaluating the flag. Examples: +- `org.openmrs.module.patientflags.evaluator.SqlFlagEvaluator` - for SQL-based flags +- `org.openmrs.module.patientflags.evaluator.GroovyFlagEvaluator` - for Groovy script-based flags +- `org.openmrs.module.drools.patientflags.DroolsFlagEvaluator` - for Drools session-based flags + +###### Header `Message` *(required)* +This is the message key (from message properties) or the actual message text to display when the flag is triggered. + +###### Header `Priority` *(optional)* +This references a Priority entity by UUID or name. The priority determines the visual styling and importance level of the flag. + +###### Header `Enabled` *(optional)* +Whether the flag is enabled (true/false). Defaults to `true` if not specified. + +###### Header `Tags` *(optional)* +A semi-colon separated list of Tag identifiers (UUID or name) associated with the flag. Tags are used to determine where flags are displayed in the UI. + +###### Header `Description` *(optional)* +A description of the flag. + +#### Requirements +* The [patientflags module](https://github.com/openmrs/openmrs-module-patientflags) version 3.0 or higher must be installed +* The OpenMRS version must be 2.2 or higher + +#### Further examples: +Please look at the test configuration folder for sample import files for all domains, see [here](../api-2.4/src/test/resources/testAppDataDir/configuration). + diff --git a/readme/flagtags.md b/readme/flagtags.md new file mode 100644 index 00000000..3c408fe7 --- /dev/null +++ b/readme/flagtags.md @@ -0,0 +1,39 @@ +## Domain 'flagtags' +The **Flag Tags** subfolder contains CSV import files for saving Tag entities which are used to categorize and filter patient flags. Below is a possible example of its content: + +```bash +flagtags/ + ├──tags.csv + └── ... +``` +Here are the possible headers with a sample data set: + +| Uuid | name | roles | display points | description | +|--------------------------------------|-------------|----------------|----------------|----------------| +| 526bf278-ba81-4436-b867-c2f6641d060a | HIV | Clinician;Nurse | Patient Summary | Tags for HIV-related flags | +| 627bf278-ba81-4436-b867-c2f6641d060b | Clinical | | Patient Summary;Patient Dashboard | General clinical flags | + +Let's review the headers as below + +###### Header `UUID` *(optional)* +This unique identifier represents the different tags. + +###### Header `Name` *(required)* +This is the descriptive name of the tag. + +###### Header `Roles` *(optional)* +A semi-colon separated list of Role identifiers (UUID or name). Flags associated with this tag will be visible to users with these roles. + +###### Header `Description` *(optional)* +A description of the tag. + +###### Header `Display Points` *(optional)* +LEGACY: Only used for RefApp 2.x. A semi-colon separated list of DisplayPoint identifiers (UUID or name). Flags associated with this tag will be displayed at these display points in RefApp 2.x. In OpenMRS 3+, this is configured on the frontend. + +#### Requirements +* The [patientflags module](https://github.com/openmrs/openmrs-module-patientflags) version 3.0 or higher must be installed +* The OpenMRS version must be 2.2 or higher + +#### Further examples: +Please look at the test configuration folder for sample import files for all domains, see [here](../api-2.4/src/test/resources/testAppDataDir/configuration). +