execute method

Future<TrackerRuleResult> execute({
  1. required TrackedEntityInstance trackedEntityInstance,
  2. required String program,
  3. TrackedEntityAttributeValue? changedAttributeValue,
})

Implementation

Future<TrackerRuleResult> execute(
    {required TrackedEntityInstance trackedEntityInstance,
    required String program,
    TrackedEntityAttributeValue? changedAttributeValue}) async {
  List<ProgramRule> programRules = await ProgramRuleQuery(database: database)
      .withActions()
      .where(attribute: 'program', value: program)
      .get();

  List<ProgramRuleVariable> programRuleVariables =
      await ProgramRuleVariableQuery(database: database)
          .where(attribute: 'program', value: program)
          .get();

  List<TrackedEntityAttributeValue> attributes =
      await TrackedEntityAttributeValueQuery(database: database)
          .where(
              attribute: 'trackedEntityInstance',
              value: trackedEntityInstance.trackedEntityInstance)
          .get();

  final dataValueEntities = DataValueEntities.fromAttributeValues(attributes);

  List<ProgramRuleAction> programRuleActions = ProgramRuleEngine.execute(
      dataValueEntities: dataValueEntities,
      programRules: programRules,
      programRuleVariables: programRuleVariables);

  final queue = Queue(parallel: 50);
  num availableItemCount = 0;

  programRuleActions.forEach((programRuleAction) {
    if (programRuleAction.programRuleActionType == 'ASSIGN') {
      availableItemCount++;
      queue.add(() => TrackedEntityAttributeValueQuery(database: database)
          .setData(TrackedEntityAttributeValue(
              dirty: true,
              attribute: programRuleAction.trackedEntityAttribute as String,
              trackedEntityInstance:
                  trackedEntityInstance.trackedEntityInstance,
              value: programRuleAction.data as String))
          .save());
    }
  });

  if (availableItemCount == 0) {
    queue.cancel();
  } else {
    await queue.onComplete;
  }

  TrackedEntityInstance updatedTrackedEntityInstance =
      await TrackedEntityInstanceQuery(database: database)
          .withAttributes()
          .withEnrollments()
          .byId(trackedEntityInstance.id as String)
          .getOne();

  return TrackerRuleResult(
      programRuleActions: programRuleActions,
      trackedEntityInstance: updatedTrackedEntityInstance);
}