diff --git a/departments/department-programs-config.json b/departments/department-programs-config.json index 63cdd985c..1a2f0c3e9 100755 --- a/departments/department-programs-config.json +++ b/departments/department-programs-config.json @@ -24,7 +24,7 @@ }, { "uuid": "334c9e98-173f-4454-a8ce-f80b20b7fdf0", - "name": "HIV DIFFERENTIATED CARE PROGRAM" + "name": "DIFFERENTIATED SERVICE DELIVERY PROGRAM" }, { "uuid": "8c1a3a68-d91d-488d-8663-ad572673232b", diff --git a/programs/patient-data-resolver.service.js b/programs/patient-data-resolver.service.js index bbb04bbfa..5bb7fa37f 100755 --- a/programs/patient-data-resolver.service.js +++ b/programs/patient-data-resolver.service.js @@ -18,6 +18,7 @@ const availableKeys = { patientEncounters: getPatientEncounters, isPatientTransferredOut: checkTransferOut, dcQualifedVisits: getQualifiedDcVisits, + validateMedicationRefill: getMedicationRefillVisits, latestCovidAssessment: getLatestCovidAssessment, isViremicHighVL: getLatestVL }; @@ -32,6 +33,7 @@ const def = { getPatientEncounters: getPatientEncounters, checkTransferOut: checkTransferOut, dcQualifedVisits: getQualifiedDcVisits, + validateMedicationRefill: getMedicationRefillVisits, getLatestCovidAssessment: getLatestCovidAssessment, isViremicHighVL: getLatestVL }; @@ -116,6 +118,39 @@ function checkTransferOut(patientUuid, params) { }); } +function getMedicationRefillVisits(patientUuid) { + const expectedAdultReturnEncounter = '8d5b2be0-c2cc-11de-8d13-0010c6dffd0f'; + + const patientEncounters = encounterService.getPatientEncounters({ + patientUuid, + v: + 'custom:(encounterDatetime,encounterType:(uuid,display),obs:(uuid,obsDatetime,concept:(uuid,name:(uuid,name)),value:(uuid,display)))' + }); + + return new Promise((resolve, reject) => { + patientEncounters + .then((encounters) => { + const medicationRefillEncounters = encounters + .filter( + (encounter) => + encounter.encounterType && + encounter.encounterType.uuid === expectedAdultReturnEncounter + ) + .sort( + (a, b) => + new Date(b.encounterDatetime).getTime() - + new Date(a.encounterDatetime).getTime() + ); + + resolve(medicationRefillEncounters[0] || null); + }) + .catch((e) => { + console.error('An error occurred fetching encounters: ', e); + reject(e); + }); + }); +} + function getPatientEncounters(patientUuid) { const patientEncounters = encounterService.getPatientEncounters({ patientUuid, diff --git a/programs/patient-program-config.json b/programs/patient-program-config.json index 577077560..5c25e815d 100755 --- a/programs/patient-program-config.json +++ b/programs/patient-program-config.json @@ -266,10 +266,6 @@ { "uuid": "37770eca-8a2f-48d6-b3c8-54af0fa989c2", "display": "MENTALHEALTHSCREENING" - }, - { - "uuid": "987009c6-6f24-43f7-9640-c285d6553c63", - "display": "DRUGPICKUP" } ] }, @@ -738,6 +734,17 @@ } ] }, + { + "uuid": "a2a265dc-508d-4f31-94ee-0bf8a58049d7", + "name": "HCW-Peer Delivery Visit", + "allowedIf": "!isEligibleForCommunityVisit", + "encounterTypes": [ + { + "uuid": "987009c6-6f24-43f7-9640-c285d6553c63", + "display": "DRUGPICKUP" + } + ] + }, { "uuid": "06eca2a8-1da9-4ac4-95c6-15afedd4de21", "name": "HIV Lab Visit", @@ -2759,10 +2766,6 @@ { "uuid": "2226e81f-38fc-4672-a615-1d37e1c8e637", "display": "ADHERENCE" - }, - { - "uuid": "987009c6-6f24-43f7-9640-c285d6553c63", - "display": "DRUGPICKUP" } ] }, @@ -2894,7 +2897,7 @@ ] }, "334c9e98-173f-4454-a8ce-f80b20b7fdf0": { - "name": "HIV DIFFERENTIATED CARE PROGRAM", + "name": "DIFFERENTIATED SERVICE DELIVERY PROGRAM", "dataDependencies": [ "patient", "enrollment", @@ -2903,6 +2906,7 @@ "patientEncounters", "isPatientTransferredOut", "dcQualifedVisits", + "validateMedicationRefill", "latestCovidAssessment" ], "enrollmentOptions": { @@ -2976,8 +2980,8 @@ "visitTypes": [ { "uuid": "0becf5b9-0522-47c8-960c-c9d660c56501", - "name": "Medication Refill Visit", - "allowedIf": "programLocation === intendedVisitLocationUuid && qualifiesMedicationRefillVisit", + "name": "Facilty Medication Delivery Visit", + "allowedIf": "qualifiesMedicationRefillVisit && isEligibleForMedicationRefill", "message": "Patient has to be in the location he enrolled into the HIV Care and Treatment program ", "encounterTypes": [ { @@ -3041,7 +3045,7 @@ }, { "uuid": "380d79a7-6fb0-41bf-be3d-aa3d25da187c", - "name": "Standard HIV Visit for Differentiated Care ", + "name": "Standard for Differentiated Service Delivery", "allowedIf": "age >= 10 && programLocation === intendedVisitLocationUuid && !isFirstAMPATHHIVVisit && qualifiesForStandardVisit", "encounterTypes": [ { @@ -3118,10 +3122,6 @@ { "uuid": "37770eca-8a2f-48d6-b3c8-54af0fa989c2", "display": "MENTALHEALTHSCREENING" - }, - { - "uuid": "987009c6-6f24-43f7-9640-c285d6553c63", - "display": "DRUGPICKUP" } ] }, @@ -3305,6 +3305,29 @@ "display": "HIVMENTALHEALTHSCREENING" } ] + }, + { + "uuid": "3c1906a1-6d85-4184-9a43-0912cbac3d74", + "name": "Community Medication Delivery Visit", + "allowedIf": "qualifiesMedicationRefillVisit && isEligibleForCommunityVisit", + "message": "Patient has to be in the location he enrolled into the HIV Care and Treatment program ", + "encounterTypes": [ + { + "uuid": "987009c6-6f24-43f7-9640-c285d6553c63", + "display": "DRUGPICKUP" + } + ] + }, + { + "uuid": "a2a265dc-508d-4f31-94ee-0bf8a58049d7", + "name": "HCW-Peer Delivery Visit", + "allowedIf": "!isEligibleForCommunityVisit", + "encounterTypes": [ + { + "uuid": "987009c6-6f24-43f7-9640-c285d6553c63", + "display": "DRUGPICKUP" + } + ] } ] }, @@ -4598,10 +4621,6 @@ { "uuid": "37770eca-8a2f-48d6-b3c8-54af0fa989c2", "display": "MENTALHEALTHSCREENING" - }, - { - "uuid": "987009c6-6f24-43f7-9640-c285d6553c63", - "display": "DRUGPICKUP" } ] }, diff --git a/programs/scope-builder.service.js b/programs/scope-builder.service.js index 411a7ec22..1c0b1b287 100755 --- a/programs/scope-builder.service.js +++ b/programs/scope-builder.service.js @@ -16,7 +16,9 @@ function buildScope(dataDictionary) { lastCovidScreeningDate: '', retroSpective: false, screenedForCovidToday: false, - isViremicHighVL: false + isViremicHighVL: false, + isEligibleForMedicationRefill: false, + isEligibleForCommunityVisit: false }; let isStandardDcVisit = false; @@ -178,6 +180,16 @@ function buildScope(dataDictionary) { if (dataDictionary.dcQualifedVisits) { const result = conditionalDCVisits(dataDictionary); + const medicationRefillResults = validateMedicationRefillEligibility( + dataDictionary.validateMedicationRefill + ); + if (medicationRefillResults.communityVisit) { + scope.isEligibleForCommunityVisit = true; + } + + if (medicationRefillResults.medicationRefill) { + scope.isEligibleForMedicationRefill = true; + } if (result) { isStandardDcVisit = true; } @@ -406,6 +418,45 @@ function conditionalDCVisits(patient) { } } +function validateMedicationRefillEligibility(validateMedicationRefill) { + if (!validateMedicationRefill || !validateMedicationRefill.obs) { + console.warn('No encounter or observations found.'); + return; + } + + const conceptMap = { + medicationRefillEligibility: 'd5e8c52f-7a38-44ed-a76a-bc771cc9b2ee', + communityVisitEligibility: 'f930b22e-8b8e-4b8c-8d19-4c34a5d34a5e' + }; + + const icadAnswerUuid = '7e5e7759-e9f7-4b16-b904-041fcdddb390'; + + let isEligibleForMedicationRefill = false; + let isEligibleForCommunityVisit = false; + + for (const obs of validateMedicationRefill.obs) { + const conceptUuid = obs.concept?.uuid; + + if (!conceptUuid) continue; + + if (conceptUuid === conceptMap.medicationRefillEligibility) { + isEligibleForMedicationRefill = true; + } + + if ( + conceptUuid === conceptMap.communityVisitEligibility && + obs.value?.uuid === icadAnswerUuid + ) { + isEligibleForCommunityVisit = true; + } + } + + return { + medicationRefill: isEligibleForMedicationRefill, + communityVisit: isEligibleForCommunityVisit + }; +} + function buildPatientScopeMembers(scope, patient) { scope.age = patient.person.age; scope.gender = patient.person.gender;