execute static method

List<ProgramRuleAction> execute({
  1. required Map<String, DataValueObject> dataValueEntities,
  2. required List<ProgramRule> programRules,
  3. required List<ProgramRuleVariable> programRuleVariables,
})

Implementation

static List<ProgramRuleAction> execute(
    {required Map<String, DataValueObject> dataValueEntities,
    required List<ProgramRule> programRules,
    required List<ProgramRuleVariable> programRuleVariables}) {
  List<ProgramRuleAction> programRulesActions = [];

  Map<String, dynamic> evaluationContext =
      ProgramRuleEngine._getEvaluationContext(
          dataValueEntities: dataValueEntities,
          programRuleVariables: programRuleVariables);

  programRules.forEach((programRule) {
    String ruleConditionForEvaluation = programRule.condition;
    // .replaceAll("#{", "")
    // .replaceAll("A{", "")
    // .replaceAll("}", "");

    evaluationContext.keys.forEach((key) {
      final value = evaluationContext[key];
      ruleConditionForEvaluation = ruleConditionForEvaluation.replaceAll(
          "#{" + key + "}", ProgramRuleEngine._parseRuleValue(value));

      ruleConditionForEvaluation = ruleConditionForEvaluation.replaceAll(
          "A{" + key + "}", ProgramRuleEngine._parseRuleValue(value));
    });

    // d2 functions
    if (ruleConditionForEvaluation.contains('d2:')) {
      ruleConditionForEvaluation =
          dhisD2Functions(ruleConditionForEvaluation, {});
    }

    try {
      Expression expression = Expression.parse(ruleConditionForEvaluation);

      final evaluator = const ExpressionEvaluator();
      var evaluationResult = evaluator.eval(expression, evaluationContext);

      final newProgramRuleActions =
          programRule.programRuleActions?.map((ruleAction) {
        return ProgramRuleAction.fromJson({
          ...ruleAction.toJson(),
          'programRuleActionType':
              evaluationResult == true ? ruleAction.programRuleActionType : ""
        });
      }).toList();

      programRulesActions = List.from([
        ...programRulesActions,
        ...(newProgramRuleActions as List<ProgramRuleAction>)
      ]);
    } catch (e) {
      final newProgramRuleActions =
          programRule.programRuleActions?.map((ruleAction) {
        return ProgramRuleAction.fromJson(
            {...ruleAction.toJson(), 'programRuleActionType': ''});
      }).toList();

      programRulesActions = List.from([
        ...programRulesActions,
        ...(newProgramRuleActions as List<ProgramRuleAction>)
      ]);
    }
  });

  return programRulesActions;
}