Skip to content

Commit

Permalink
Merge pull request #74 from EyeSeeTea/feat/pps-patient-tracker
Browse files Browse the repository at this point in the history
feat: use new tracker program for PPS patient
  • Loading branch information
MiquelAdell authored Nov 28, 2024
2 parents e8967b2 + b1a1a21 commit 41bdbc0
Show file tree
Hide file tree
Showing 9 changed files with 137 additions and 76 deletions.
19 changes: 10 additions & 9 deletions src/data/entities/D2Survey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,22 @@ import { Id } from "../../domain/entities/Ref";
export const PPS_SURVEY_FORM_ID = "OGOw5Kt3ytv";
export const PPS_COUNTRY_QUESTIONNAIRE_ID = "a4aYe2Eoaul";
export const PPS_HOSPITAL_FORM_ID = "mesnCzaLc7u";
export const PPS_PATIENT_REGISTER_ID = "GWcT6PN9NmI";
export const PPS_PATIENT_REGISTER_ID = "ceSJyvSGyHm";
export const PPS_WARD_REGISTER_ID = "aIyAtgpYYrS";
//PPS Data element Ids

export const START_DATE_DATAELEMENT_ID = "OmkxlG2rNw3";
export const SURVEY_TYPE_DATAELEMENT_ID = "Oyi27xcPzAY";
export const SURVEY_COMPLETED_DATAELEMENT_ID = "KuGRIx3I16f";
export const SURVEY_ID_DATAELEMENT_ID = "JHw6Hs0T2Lb";
export const SURVEY_ID_PATIENT_DATAELEMENT_ID = "X2EkNfUHANO";
export const WARD_ID_DATAELEMENT_ID = "o4YMhVrXTeG";
export const SURVEY_ID_PATIENT_TEA_ID = "Yc0jYZn0lwa";
export const WARD_ID_TEA_ID = "pUZFmyeWHZa";
export const WARD2_ID_DATAELEMENT_ID = "aSI3ZfIb3YS";
export const SURVEY_NAME_DATAELEMENT_ID = "mEQnAQQjdO8";
export const SURVEY_HOSPITAL_CODE_DATAELEMENT_ID = "uAe6Mlw2XlE";
export const SURVEY_WARD_CODE_DATAELEMENT_ID = "q4mg5z04dzd";
export const SURVEY_PATIENT_CODE_DATAELEMENT_ID = "yScrOW1eTvm";
export const SURVEY_PATIENT_ID_DATAELEMENT_ID = "eKUbBRlR684";
export const SURVEY_PATIENT_CODE_TEA_ID = "qX450py29V3";
export const SURVEY_PATIENT_ID_TEA_ID = "HkBG3DVELBM";
//Prevalence Program Ids

export const PREVALENCE_SURVEY_FORM_ID = "WcSw803XiUk";
Expand Down Expand Up @@ -72,6 +72,7 @@ export const PREVALENCE_CENTRAL_REF_LAB_TET = "yqa88gKCdV8";
export const PREVALENCE_PATHOGEN_ISOLATES_TET = "aWIdBmjFWF0";
export const PREVALENCE_SUPRANATIONAL_TET = "KQMBM3q32FC";
export const PREVALENCE_MORTALITY_FOLLOW_UP_TET = "m8YpTxNjHbn";
export const PPS_PATIENT_TET = "EHN9A3tEP5s";

type SURVEY_DATA_ELEMENT_KEYS =
| "startDate"
Expand Down Expand Up @@ -105,7 +106,7 @@ export const keyToDataElementMap: SurveyKeyDataElementMapType[] = [
key: "parentPPSSurveyId",
dataElements: [
SURVEY_ID_DATAELEMENT_ID,
SURVEY_ID_PATIENT_DATAELEMENT_ID,
SURVEY_ID_PATIENT_TEA_ID,
AMR_SURVEYS_PREVALENCE_DEA_SURVEY_ID,
],
},
Expand All @@ -115,9 +116,9 @@ export const keyToDataElementMap: SurveyKeyDataElementMapType[] = [
},
{ key: "hospitalCode", dataElements: [SURVEY_HOSPITAL_CODE_DATAELEMENT_ID] },
{ key: "wardCode", dataElements: [SURVEY_WARD_CODE_DATAELEMENT_ID] },
{ key: "patientId", dataElements: [SURVEY_PATIENT_ID_DATAELEMENT_ID] },
{ key: "patientCode", dataElements: [SURVEY_PATIENT_CODE_DATAELEMENT_ID] },
{ key: "parentWardRegisterId", dataElements: [WARD_ID_DATAELEMENT_ID] },
{ key: "patientId", dataElements: [SURVEY_PATIENT_ID_TEA_ID] },
{ key: "patientCode", dataElements: [SURVEY_PATIENT_CODE_TEA_ID] },
{ key: "parentWardRegisterId", dataElements: [WARD_ID_TEA_ID] },
{ key: "uniqueSurveyPatientId", dataElements: [AMR_SURVEYS_PREVALENCE_TEA_UNIQUE_PATIENT_ID] },
{ key: "astGuideline", dataElements: [AMR_SURVEYS_PREVALENCE_DEA_AST_GUIDELINES] },
{ key: "customAstGuideline", dataElements: [AMR_SURVEYS_PREVALENCE_DEA_CUSTOM_AST_GUIDE] },
Expand Down
49 changes: 22 additions & 27 deletions src/data/repositories/PaginatedSurveyD2Repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import {
AMR_SURVEYS_PREVALENCE_TEA_UNIQUE_PATIENT_ID,
PPS_PATIENT_REGISTER_ID,
PREVALENCE_CASE_REPORT_FORM_ID,
SURVEY_PATIENT_CODE_DATAELEMENT_ID,
SURVEY_PATIENT_ID_DATAELEMENT_ID,
WARD_ID_DATAELEMENT_ID,
SURVEY_PATIENT_CODE_TEA_ID,
SURVEY_PATIENT_ID_TEA_ID,
WARD_ID_TEA_ID,
} from "../entities/D2Survey";
import { mapEventToSurvey, mapTrackedEntityToSurvey } from "../utils/surveyListMappers";
import { getSurveyChildCount, SurveyChildCountType } from "../utils/surveyChildCountHelper";
Expand Down Expand Up @@ -49,7 +49,6 @@ export class PaginatedSurveyD2Repository implements PaginatedSurveyRepository {
);
}

//Currently tracker programs are only in Prevalence module
getTrackerProgramSurveys(
surveyFormType: SURVEY_FORM_TYPES,
programId: Id,
Expand Down Expand Up @@ -107,7 +106,7 @@ export class PaginatedSurveyD2Repository implements PaginatedSurveyRepository {
page: page + 1,
pageSize,
totalPages: true,
filter: `${WARD_ID_DATAELEMENT_ID}:eq:${parentId}`,
filter: `${WARD_ID_TEA_ID}:eq:${parentId}`,
})
).flatMap(response => {
const events = response.instances;
Expand All @@ -133,24 +132,22 @@ export class PaginatedSurveyD2Repository implements PaginatedSurveyRepository {
parentId: Id
): FutureData<PaginatedReponse<Survey[]>> {
return apiToFuture(
this.api.tracker.events.get({
fields: { $all: true },
orgUnit: orgUnitId,
this.api.tracker.trackedEntities.get({
fields: { attributes: true, enrollments: true, trackedEntity: true, orgUnit: true },
program: PPS_PATIENT_REGISTER_ID,
orgUnit: orgUnitId,
pageSize: 10,
totalPages: true,
filter: ` ${SURVEY_PATIENT_ID_DATAELEMENT_ID}:like:${keyword}, ${WARD_ID_DATAELEMENT_ID}:eq:${parentId}`,
filter: ` ${SURVEY_PATIENT_ID_TEA_ID}:like:${keyword}, ${WARD_ID_TEA_ID}:eq:${parentId}`,
})
).flatMap(response => {
const events = response.instances;

const surveys = mapEventToSurvey(events, "PPSPatientRegister", PPS_PATIENT_REGISTER_ID);
).flatMap(trackedEntities => {
const surveys = mapTrackedEntityToSurvey(trackedEntities, "PPSPatientRegister");

const paginatedSurveys: PaginatedReponse<Survey[]> = {
pager: {
page: response.page,
pageSize: response.pageSize,
total: surveys.length,
page: trackedEntities.page,
pageSize: trackedEntities.pageSize,
total: trackedEntities.total,
},
objects: surveys,
};
Expand All @@ -165,24 +162,22 @@ export class PaginatedSurveyD2Repository implements PaginatedSurveyRepository {
parentId: Id
): FutureData<PaginatedReponse<Survey[]>> {
return apiToFuture(
this.api.tracker.events.get({
fields: { $all: true },
orgUnit: orgUnitId,
this.api.tracker.trackedEntities.get({
fields: { attributes: true, enrollments: true, trackedEntity: true, orgUnit: true },
program: PPS_PATIENT_REGISTER_ID,
orgUnit: orgUnitId,
pageSize: 10,
totalPages: true,
filter: ` ${SURVEY_PATIENT_CODE_DATAELEMENT_ID}:like:${keyword}, ${WARD_ID_DATAELEMENT_ID}:eq:${parentId}`,
filter: ` ${SURVEY_PATIENT_CODE_TEA_ID}:like:${keyword}, ${WARD_ID_TEA_ID}:eq:${parentId}`,
})
).flatMap(response => {
const events = response.instances;

const surveys = mapEventToSurvey(events, "PPSPatientRegister", PPS_PATIENT_REGISTER_ID);
).flatMap(trackedEntities => {
const surveys = mapTrackedEntityToSurvey(trackedEntities, "PPSPatientRegister");

const paginatedSurveys: PaginatedReponse<Survey[]> = {
pager: {
page: response.page,
pageSize: response.pageSize,
total: surveys.length,
page: trackedEntities.page,
pageSize: trackedEntities.pageSize,
total: trackedEntities.total,
},
objects: surveys,
};
Expand Down
12 changes: 6 additions & 6 deletions src/data/repositories/SurveyFormD2Repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ export class SurveyD2Repository implements SurveyRepository {
//If event specified,populate the form
if (eventId) {
if (isTrackerProgram(programId)) {
if (!orgUnitId) return Future.error(new Error("Survey not found"));
if (!orgUnitId && programId !== PPS_PATIENT_REGISTER_ID)
return Future.error(new Error("Survey not found"));
return this.getTrackerProgramById(eventId, programId).flatMap(
trackedEntity => {
if (resp.programs[0] && trackedEntity) {
Expand Down Expand Up @@ -249,7 +250,8 @@ export class SurveyD2Repository implements SurveyRepository {
orgUnitId: Id
): FutureData<Survey[]> {
const ouMode =
orgUnitId !== "" && programId === PREVALENCE_FACILITY_LEVEL_FORM_ID
(orgUnitId !== "" && programId === PREVALENCE_FACILITY_LEVEL_FORM_ID) ||
programId === PPS_PATIENT_REGISTER_ID
? "DESCENDANTS"
: undefined;

Expand Down Expand Up @@ -302,9 +304,7 @@ export class SurveyD2Repository implements SurveyRepository {
): FutureData<Survey[]> {
const ouMode =
orgUnitId !== "" &&
(programId === PPS_WARD_REGISTER_ID ||
programId === PPS_HOSPITAL_FORM_ID ||
programId === PPS_PATIENT_REGISTER_ID)
(programId === PPS_WARD_REGISTER_ID || programId === PPS_HOSPITAL_FORM_ID)
? "DESCENDANTS"
: undefined;
return apiToFuture(
Expand All @@ -326,7 +326,7 @@ export class SurveyD2Repository implements SurveyRepository {
programId: Id,
orgUnitId: Id | undefined
): FutureData<Questionnaire> {
if (isTrackerProgram(programId) && !orgUnitId)
if (isTrackerProgram(programId) && !orgUnitId && programId !== PPS_PATIENT_REGISTER_ID)
return Future.error(new Error("Unable to find survey"));
return this.getForm(programId, eventId, orgUnitId);
}
Expand Down
10 changes: 5 additions & 5 deletions src/data/utils/questionHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ import {
AMR_SURVEYS_PREVALENCE_TEA_SURVEY_ID_SSTF,
SURVEY_ID_DATAELEMENT_ID,
SURVEY_ID_FACILITY_LEVEL_DATAELEMENT_ID,
SURVEY_ID_PATIENT_DATAELEMENT_ID,
SURVEY_ID_PATIENT_TEA_ID,
WARD2_ID_DATAELEMENT_ID,
WARD_ID_DATAELEMENT_ID,
WARD_ID_TEA_ID,
} from "../entities/D2Survey";
import _ from "../../domain/entities/generic/Collection";
import { D2TrackerEvent } from "@eyeseetea/d2-api/api/trackerEvents";
Expand Down Expand Up @@ -282,8 +282,6 @@ export const mapProgramDataElementToQuestions = (
if (
currentQuestion &&
(currentQuestion.id === SURVEY_ID_DATAELEMENT_ID ||
currentQuestion.id === SURVEY_ID_PATIENT_DATAELEMENT_ID ||
currentQuestion.id === WARD_ID_DATAELEMENT_ID ||
currentQuestion.id === WARD2_ID_DATAELEMENT_ID ||
currentQuestion.id === AMR_SURVEYS_PREVALENCE_DEA_SURVEY_ID)
) {
Expand Down Expand Up @@ -375,7 +373,9 @@ export const mapTrackedAttributesToQuestions = (
currentQuestion.id === AMR_SURVEYS_PREVALENCE_TEA_PATIENT_IDA19 ||
currentQuestion.id === AMR_SURVEYS_MORTALITY_TEA_PAT_ID_FUP2 ||
currentQuestion.id === AMR_SURVEYS_MORTALITY_TEA_PAT_ID_DF2 ||
currentQuestion.id === AMR_SURVEYS_MORTALITY_TEA_PAT_ID_COH2)
currentQuestion.id === AMR_SURVEYS_MORTALITY_TEA_PAT_ID_COH2 ||
currentQuestion.id === SURVEY_ID_PATIENT_TEA_ID ||
currentQuestion.id === WARD_ID_TEA_ID)
) {
currentQuestion.disabled = true;
}
Expand Down
16 changes: 15 additions & 1 deletion src/data/utils/surveyChildCountHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { Future } from "../../domain/entities/generic/Future";
import {
PPS_COUNTRY_QUESTIONNAIRE_ID,
PPS_HOSPITAL_FORM_ID,
PPS_PATIENT_REGISTER_ID,
PREVALENCE_FACILITY_LEVEL_FORM_ID,
} from "../entities/D2Survey";
import { D2Api } from "@eyeseetea/d2-api/2.36";
Expand Down Expand Up @@ -38,7 +39,20 @@ export const getSurveyChildCount = (
const isTracker = isTrackerProgram(childId);

if (isTracker) {
if (childIds.type === "singleChild") {
if (
childIds.type === "singleChild" &&
childId === PPS_PATIENT_REGISTER_ID &&
secondaryparentId
) {
const eventCount = getTrackerSurveyCount(
childId,
orgUnitId,
secondaryparentId,
api
);

return { type: "value", value: eventCount };
} else if (childIds.type === "singleChild") {
const eventCount = getTrackerSurveyCount(childId, orgUnitId, parentSurveyId, api);

return { type: "value", value: eventCount };
Expand Down
29 changes: 25 additions & 4 deletions src/data/utils/surveyListMappers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ import {
AMR_SURVEYS_MORTALITY_TEA_SURVEY_ID_DF,
AMR_SURVEYS_MORTALITY_TEA_SURVEY_ID_COH,
AMR_SURVEYS_PREVALENCE_TEA_HOSPITAL_ID,
SURVEY_ID_PATIENT_TEA_ID,
SURVEY_PATIENT_ID_TEA_ID,
WARD_ID_TEA_ID,
SURVEY_PATIENT_CODE_TEA_ID,
} from "../entities/D2Survey";
import { D2TrackerEvent } from "@eyeseetea/d2-api/api/trackerEvents";
import { getSurveyNameBySurveyFormType } from "./surveyProgramHelper";
Expand All @@ -45,6 +49,10 @@ export const mapTrackedEntityToSurvey = (
attribute.attribute === AMR_SURVEYS_MORTALITY_TEA_SURVEY_ID_COH
)?.value ?? "";

const parentPPSSurveyId =
trackedEntity.attributes?.find(attr => attr.attribute === SURVEY_ID_PATIENT_TEA_ID)
?.value ?? "";

const patientId =
trackedEntity.attributes?.find(
attribute =>
Expand All @@ -54,19 +62,32 @@ export const mapTrackedEntityToSurvey = (
attribute.attribute === AMR_SURVEYS_PREVALENCE_TEA_PATIENT_IDA19 ||
attribute.attribute === AMR_SURVEYS_MORTALITY_TEA_PAT_ID_FUP2 ||
attribute.attribute === AMR_SURVEYS_MORTALITY_TEA_PAT_ID_DF2 ||
attribute.attribute === AMR_SURVEYS_MORTALITY_TEA_PAT_ID_COH2
attribute.attribute === AMR_SURVEYS_MORTALITY_TEA_PAT_ID_COH2 ||
attribute.attribute === SURVEY_PATIENT_ID_TEA_ID
)?.value ?? "";

const patientCode =
trackedEntity.attributes?.find(
attribute => attribute.attribute === SURVEY_PATIENT_CODE_TEA_ID
)?.value ?? "";

const facilityCode =
trackedEntity.attributes?.find(
attribute => attribute.attribute === AMR_SURVEYS_PREVALENCE_TEA_HOSPITAL_ID
)?.value ?? "";

const parentWardId =
trackedEntity.attributes?.find(attribute => attribute.attribute === WARD_ID_TEA_ID)
?.value ?? "";

const survey: Survey = {
id: trackedEntity.trackedEntity ?? "",
name: trackedEntity.trackedEntity ?? "",
rootSurvey: {
id: parentPrevalenceSurveyId ?? "",
id:
surveyFormType === "PPSPatientRegister"
? parentPPSSurveyId
: parentPrevalenceSurveyId,
name: "",
surveyType: "",
},
Expand All @@ -77,10 +98,10 @@ export const mapTrackedEntityToSurvey = (
name: trackedEntity.enrollments?.[0]?.orgUnitName ?? "",
},
surveyType: "",
parentWardRegisterId: undefined,
parentWardRegisterId: parentWardId,
surveyFormType: surveyFormType,
childCount: undefined,
uniquePatient: { id: patientId, code: "" },
uniquePatient: { id: patientId, code: patientCode },
facilityCode: facilityCode,
};
return survey;
Expand Down
8 changes: 6 additions & 2 deletions src/data/utils/surveyProgramHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import {
PREVALENCE_SURVEY_FORM_ID,
SURVEY_ID_DATAELEMENT_ID,
SURVEY_ID_FACILITY_LEVEL_DATAELEMENT_ID,
WARD_ID_DATAELEMENT_ID,
WARD_ID_TEA_ID,
PREVALENCE_MORTALITY_FOLLOWUP_FORM_D28,
PREVALENCE_MORTALITY_DISCHARGE_FORM,
PREVALENCE_MORTALITY_COHORT_ENORL_FORM,
Expand All @@ -33,6 +33,7 @@ import {
AMR_SURVEYS_MORTALITY_TEA_PAT_ID_DF2,
AMR_SURVEYS_MORTALITY_TEA_PAT_ID_COH2,
AMR_SURVEYS_PREVALENCE_TEA_AMRPATIENT_IDPREVALENCE,
PPS_PATIENT_TET,
} from "../entities/D2Survey";

export const isTrackerProgram = (programId: Id) => {
Expand All @@ -46,6 +47,7 @@ export const isTrackerProgram = (programId: Id) => {
case PREVALENCE_MORTALITY_FOLLOWUP_FORM_D28:
case PREVALENCE_MORTALITY_DISCHARGE_FORM:
case PREVALENCE_MORTALITY_COHORT_ENORL_FORM:
case PPS_PATIENT_REGISTER_ID:
return true;
default:
return false;
Expand All @@ -70,6 +72,8 @@ export const getTrackedEntityAttributeType = (programId: Id) => {
case PREVALENCE_MORTALITY_DISCHARGE_FORM:
case PREVALENCE_MORTALITY_COHORT_ENORL_FORM:
return PREVALENCE_MORTALITY_FOLLOW_UP_TET;
case PPS_PATIENT_REGISTER_ID:
return PPS_PATIENT_TET;

default:
return "";
Expand Down Expand Up @@ -130,7 +134,7 @@ export const getParentDataElementForProgram = (programId: Id): Id => {
case PPS_WARD_REGISTER_ID:
return SURVEY_ID_DATAELEMENT_ID;
case PPS_PATIENT_REGISTER_ID:
return WARD_ID_DATAELEMENT_ID;
return WARD_ID_TEA_ID;

default:
return "";
Expand Down
Loading

0 comments on commit 41bdbc0

Please sign in to comment.