Skip to content

Commit b919846

Browse files
committed
#827 | Evaluate Enrolment Eligibility Check rule.
1 parent 22fa9ce commit b919846

File tree

5 files changed

+50
-9
lines changed

5 files changed

+50
-9
lines changed

src/RuleExecutor.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import {mapProgramEncounter} from './models/programEncounterModel';
22
import {createEncounterType, mapEncounter} from './models/encounterModel';
33
import {mapIndividual} from './models/individualModel';
44
import {mapProgramEnrolment} from './models/programEnrolmentModel';
5+
import {createProgram} from "./models/programModel";
56
import {
67
checkListRule,
78
decisionRule,
89
isEligibleForEncounter,
910
programSummaryRule,
1011
subjectSummaryRule,
1112
visitScheduleRule,
12-
messagingRule
13+
messagingRule, isEligibleForProgramEnrolment
1314
} from './services/RuleEvalService';
1415
import {map} from 'lodash';
1516

@@ -35,6 +36,16 @@ const summaryRule = {
3536
"SubjectSummary": subjectSummaryRule,
3637
};
3738

39+
const createTypeMapper = {
40+
"EncounterType": createEncounterType,
41+
"Program": createProgram
42+
}
43+
44+
const eligibilityCheckMapper = {
45+
"EncounterType": isEligibleForEncounter,
46+
"Program": isEligibleForProgramEnrolment
47+
}
48+
3849
export const executeRule = async (requestBody) => {
3950
const mapEntity = mappers[requestBody.rule.workFlowType];
4051
if (!mapEntity)
@@ -58,10 +69,10 @@ export const executeSummaryRule = async (requestBody) => {
5869
}
5970
};
6071

61-
export const executeEncounterEligibilityRule = async (requestBody) => {
62-
const {individual, encounterTypes} = requestBody;
72+
export const executeEligibilityCheckRule = async (requestBody) => {
73+
const {individual, entityTypes, ruleEntityType} = requestBody;
6374
const individualModel = mapIndividual(individual);
64-
const eligibilityRuleEntities = await Promise.all(map(encounterTypes, et => isEligibleForEncounter(individualModel, createEncounterType(et))));
75+
const eligibilityRuleEntities = await Promise.all(map(entityTypes, et => eligibilityCheckMapper[ruleEntityType](individualModel, createTypeMapper[ruleEntityType](et))));
6576
return {eligibilityRuleEntities};
6677
};
6778

src/controllers/rulesController.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {
2-
executeEncounterEligibilityRule,
2+
executeEligibilityCheckRule,
33
executeRule,
44
executeSummaryRule,
55
executeMessagingRule,
@@ -72,4 +72,4 @@ export const buildObservationAndRunRules = async (req, res, next) => {
7272
export const rulesController = delegateTo(executeRule);
7373
export const summary = delegateTo(executeSummaryRule);
7474
export const messagingResponse = delegateTo(executeMessagingRule);
75-
export const encounterEligibility = delegateTo(executeEncounterEligibilityRule);
75+
export const encounterEligibility = delegateTo(executeEligibilityCheckRule);

src/models/encounterModel.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export const createEncounterType = (encounterTypeParam) => {
6666
encounterType.operationalEncounterTypeName = encounterTypeParam.operationalEncounterTypeName;
6767
encounterType.displayName = encounterTypeParam.displayName;
6868
encounterType.voided = encounterTypeParam.voided;
69-
encounterType.encounterEligibilityCheckRule = encounterTypeParam.encounterEligibilityCheckRule;
69+
encounterType.entityEligibilityCheckRule = encounterTypeParam.entityEligibilityCheckRule;
7070
encounterType.active = encounterTypeParam.active;
7171
return encounterType;
7272
};

src/models/programModel.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import {Program} from "openchs-models";
2+
3+
export const createProgram = (programParam) => {
4+
const program = new Program();
5+
program.uuid = programParam.uuid;
6+
program.name = programParam.name;
7+
program.voided = programParam.voided;
8+
program.entityEligibilityCheckRule = programParam.entityEligibilityCheckRule;
9+
program.active = programParam.active;
10+
return program;
11+
};

src/services/RuleEvalService.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ export const subjectSummaryRule = async (rule, entity) => {
129129
export const isEligibleForEncounter = async (individual, encounterType) => {
130130
let eligible = true;
131131
const rulesFromTheBundle = await getAllRuleItemsFor(encounterType.uuid, "EncounterEligibilityCheck", "EncounterType");
132-
if (!_.isNil(encounterType.encounterEligibilityCheckRule) && !_.isEmpty(_.trim(encounterType.encounterEligibilityCheckRule))) {
133-
const code = removeStrictFromRuleCode(encounterType.encounterEligibilityCheckRule);
132+
if (!_.isNil(encounterType.entityEligibilityCheckRule) && !_.isEmpty(_.trim(encounterType.entityEligibilityCheckRule))) {
133+
const code = removeStrictFromRuleCode(encounterType.entityEligibilityCheckRule);
134134
const ruleFunc = eval(code);
135135
eligible = ruleFunc({
136136
params: {entity: individual, services},
@@ -145,6 +145,25 @@ export const isEligibleForEncounter = async (individual, encounterType) => {
145145
};
146146
};
147147

148+
export const isEligibleForProgramEnrolment = async (individual, program) => {
149+
let eligible = true;
150+
const rulesFromTheBundle = await getAllRuleItemsFor(program.uuid, "EnrolmentEligibilityCheck", "Program");
151+
if (!_.isNil(program.entityEligibilityCheckRule) && !_.isEmpty(_.trim(program.entityEligibilityCheckRule))) {
152+
const code = removeStrictFromRuleCode(program.entityEligibilityCheckRule);
153+
const ruleFunc = eval(code);
154+
eligible = ruleFunc({
155+
params: {entity: individual, services},
156+
imports: {rulesConfig, lodash, moment}
157+
});
158+
} else if (!_.isEmpty(rulesFromTheBundle)) {
159+
eligible = runRuleAndSaveFailure(_.last(rulesFromTheBundle), 'Program', {individual}, true);
160+
}
161+
return {
162+
"isEligible": eligible,
163+
"typeUUID": program.uuid,
164+
};
165+
};
166+
148167
export const messagingRule = async (rule, entity) => {
149168
const code = removeStrictFromRuleCode(rule);
150169
const ruleFunc = eval(code);

0 commit comments

Comments
 (0)