avniproject / apfodishanutrition

GNU Affero General Public License v3.0
0 stars 0 forks source link

APF Phase 2| Training Feedback: ANC Form: QRT Scheduling logic for Severe Anemic Case, #309

Closed AnjaliBhagabati closed 1 month ago

AnjaliBhagabati commented 3 months ago

Tech notes

adamsanadi6 commented 3 months ago

Backup:

//SAMPLE RULE EXAMPLE
"use strict";
({params, imports}) => {
    const programEncounter = params.entity;
    const scheduleBuilder = new imports.rulesConfig.VisitScheduleBuilder({
        programEncounter
    });
    const moment = imports.moment;
    const _ = imports.lodash;

  const condition0 = ! programEncounter.programEnrolment.programExitDateTime;

  const scheduledOrCompletedEncountersOfType = (type,nextVisitDate) => {
      const nextDateMonth = moment(nextVisitDate).month();
      const nextDateYear = moment(nextVisitDate).year();          
      const data = programEncounter.programEnrolment.encounters.filter((enc)=> enc.encounterType.name === type && enc.voided == false && enc.cancelDateTime == null && moment(enc.earliestVisitDateTime).year()==nextDateYear  && moment(enc.earliestVisitDateTime).month()==nextDateMonth )
      return data;
  }

  function lastfilledEncounter(encounterType) {
        const lastVisitEncounters = programEncounter.programEnrolment.getEncountersOfType(encounterType, false);
        const latestEncounter = _.chain(lastVisitEncounters)
            .filter((encounter) => encounter.encounterDateTime && encounter.voided == false)
            .maxBy((encounter) => encounter.encounterDateTime)
            .value();
        return latestEncounter;
    }

  let nextDate = moment(programEncounter.earliestVisitDateTime).add(1,'M').startOf('month').toDate();

  const condition1 = scheduledOrCompletedEncountersOfType("ANC",nextDate).length == 0;
  const condition2 = ! programEncounter.programEnrolment.hasCompletedEncounterOfType('Delivery');

  const qrtCondition1 = new imports.rulesConfig.RuleCondition({programEncounter}).when.latestValueInEntireEnrolment("35f880ca-60b5-4240-97e1-813c0a7a78c4").containsAnswerConceptName("8ebbf088-f292-483e-9084-7de919ce67b7").matches();

  //programEncounter.getObservationReadableValue("Is there a medical facillity intervention required for treatment?") == 'Yes';
  const qrtCondition2 = programEncounter.getObservationReadableValue("Did the ANM recommend for a medical facility intervention?") == 'Yes';
  const qrtCondition3 = programEncounter.getObservationReadableValue('High risk condition');    

  const condition3 = qrtCondition1 || qrtCondition2 ;

  if(condition0 && condition1 && condition2){
      scheduleBuilder.add({
            name: 'ANC',
            encounterType: 'ANC',
            earliestDate: nextDate,
            maxDate: moment(nextDate).add(7, 'days').toDate()
        });
  }

  const qrtDate = moment(programEncounter.encounterDateTime).toDate();
  const qrtCondition = scheduledOrCompletedEncountersOfType("QRT PW", qrtDate).length == 0;

  const ancEncounter = lastfilledEncounter('ANC');
  const isEditScenario = ancEncounter ? ancEncounter.uuid === programEncounter.uuid : false;

  if(condition0 && qrtCondition && condition3 && condition2){
    scheduleBuilder.add({
            name: 'QRT PW',
            encounterType: 'QRT PW',
            earliestDate:qrtDate,
            maxDate: moment(qrtDate).add(30, 'days').toDate()
      });
  }else if (!isEditScenario && qrtCondition3 && !qrtCondition1 && !qrtCondition2 && condition2){
  nextDate = moment(programEncounter.earliestVisitDateTime).add(1,'M').startOf('month').toDate();
  scheduleBuilder
            .add({
                name: "PW Home Visit",
                encounterType: "PW Home Visit",
                earliestDate: nextDate,
                maxDate: moment(nextDate).add(7, 'days').toDate()
            });
  }

    return scheduleBuilder.getAll();
};
adamsanadi6 commented 3 months ago

Note: Created the new condition called isSevereAnemic and added in const condition3 = isSevereAnemic || qrtCondition1 || qrtCondition2 ;. condition3 was already there.