Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ configuration/
├── orderfrequencies/
├── ordertypes/
├── paymentmodes/
├── flags/
├── flagpriorities/
├── flagtags/
├── patientidentifiertypes/
├── personattributetypes/
├── privileges/
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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*)
Expand Down Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ protected boolean matchesSafely(List<Loader> 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<String> loaderDomains = loaders.stream().map(Loader::getDomainName).collect(Collectors.toSet());
Expand Down
2 changes: 1 addition & 1 deletion api-2.4/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@
<version>${billingVersion}</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.openmrs.module</groupId>
<artifactId>stockmanagement-api</artifactId>
Expand Down
6 changes: 6 additions & 0 deletions api-2.4/src/test/resources/test-hibernate.cfg.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,11 @@
<mapping resource="Bill.hbm.xml"/>
<mapping resource="Cashier.hbm.xml"/>
<mapping resource="SequentialReceiptNumberGenerator.hbm.xml"/>
<!-- Patient Flags -->
<mapping resource="DisplayPoint.hbm.xml"/>
<mapping resource="Flag.hbm.xml"/>
<mapping resource="Priority.hbm.xml"/>
<mapping resource="Tag.hbm.xml"/>
<mapping resource="PatientFlag.hbm.xml"/>
</session-factory>
</hibernate-configuration>
3 changes: 3 additions & 0 deletions api/src/main/java/org/openmrs/module/initializer/Domain.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ public enum Domain {
BILLABLE_SERVICES,
PAYMENT_MODES,
CASH_POINTS,
FLAG_PRIORITIES,
FLAG_TAGS,
FLAGS,
PROGRAMS,
PROGRAM_WORKFLOWS,
PROGRAM_WORKFLOW_STATES,
Expand Down
Original file line number Diff line number Diff line change
@@ -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<DisplayPoint> {

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;
}
}
Original file line number Diff line number Diff line change
@@ -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<Flag, BaseLineProcessor<Flag>> {

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;
}
}
Original file line number Diff line number Diff line change
@@ -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<Flag> {

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<Tag> tags = new HashSet<Tag>(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;
}
}
Original file line number Diff line number Diff line change
@@ -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<Flag, FlagsCsvParser> {

@Autowired
public void setParser(FlagsCsvParser parser) {
this.parser = parser;
}
}
Original file line number Diff line number Diff line change
@@ -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<Priority, BaseLineProcessor<Priority>> {

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;
}
}
Loading