Skip to content

Commit

Permalink
Merge development and solve conflicts
Browse files Browse the repository at this point in the history
  • Loading branch information
anagperal committed Dec 12, 2024
2 parents ee21c49 + 4adcbff commit f0f7722
Show file tree
Hide file tree
Showing 43 changed files with 780 additions and 154 deletions.
12 changes: 6 additions & 6 deletions i18n/en.pot
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ msgstr ""
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"POT-Creation-Date: 2024-11-21T08:13:13.190Z\n"
"PO-Revision-Date: 2024-11-21T08:13:13.190Z\n"
"POT-Creation-Date: 2024-11-27T21:40:09.970Z\n"
"PO-Revision-Date: 2024-11-27T21:40:09.970Z\n"

msgid "Low"
msgstr ""
Expand Down Expand Up @@ -153,9 +153,6 @@ msgstr ""
msgid "Dashboard"
msgstr ""

msgid "Respond, alert, watch"
msgstr ""

msgid "Select duration"
msgstr ""

Expand Down Expand Up @@ -183,7 +180,10 @@ msgstr ""
msgid "Create Risk Assessment"
msgstr ""

msgid "Add new Assessment"
msgid "Edit Risk Assessment"
msgstr ""

msgid "Add new Grade"
msgstr ""

msgid "Risk assessment incomplete"
Expand Down
10 changes: 5 additions & 5 deletions i18n/es.po
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: i18next-conv\n"
"POT-Creation-Date: 2024-11-21T08:13:13.190Z\n"
"POT-Creation-Date: 2024-11-27T21:40:09.970Z\n"
"PO-Revision-Date: 2018-10-25T09:02:35.143Z\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
Expand Down Expand Up @@ -152,9 +152,6 @@ msgstr ""
msgid "Dashboard"
msgstr ""

msgid "Respond, alert, watch"
msgstr ""

msgid "Select duration"
msgstr ""

Expand Down Expand Up @@ -182,7 +179,10 @@ msgstr ""
msgid "Create Risk Assessment"
msgstr ""

msgid "Add new Assessment"
msgid "Edit Risk Assessment"
msgstr ""

msgid "Add new Grade"
msgstr ""

msgid "Risk assessment incomplete"
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "zebra",
"description": "Zambia Emergency Bridge for Response Application",
"version": "0.1.0",
"version": "1.0.1",
"license": "GPL-3.0",
"author": "EyeSeeTea team",
"homepage": ".",
Expand Down
9 changes: 8 additions & 1 deletion src/CompositionRoot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ import { CompleteEventTrackerUseCase } from "./domain/usecases/CompleteEventTrac
import { CasesFileD2Repository } from "./data/repositories/CasesFileD2Repository";
import { CasesFileRepository } from "./domain/repositories/CasesFileRepository";
import { CasesFileTestRepository } from "./data/repositories/test/CasesFileTestRepository";
import { UserGroupD2Repository } from "./data/repositories/UserGroupD2Repository";
import { UserGroupRepository } from "./domain/repositories/UserGroupRepository";
import { UserGroupTestRepository } from "./data/repositories/test/UserGroupTestRepository";

export type CompositionRoot = ReturnType<typeof getCompositionRoot>;

Expand All @@ -90,6 +93,7 @@ type Repositories = {
systemRepository: SystemRepository;
configurationsRepository: ConfigurationsRepository;
casesFileRepository: CasesFileRepository;
userGroupRepository: UserGroupRepository;
};

function getCompositionRoot(repositories: Repositories) {
Expand All @@ -109,7 +113,8 @@ function getCompositionRoot(repositories: Repositories) {
getConfigurations: new GetConfigurationsUseCase(
repositories.configurationsRepository,
repositories.teamMemberRepository,
repositories.orgUnitRepository
repositories.orgUnitRepository,
repositories.userGroupRepository
),
complete: new CompleteEventTrackerUseCase(repositories),
},
Expand Down Expand Up @@ -164,6 +169,7 @@ export function getWebappCompositionRoot(api: D2Api) {
systemRepository: new SystemD2Repository(api),
configurationsRepository: new ConfigurationsD2Repository(api),
casesFileRepository: new CasesFileD2Repository(api, dataStoreClient),
userGroupRepository: new UserGroupD2Repository(api),
};

return getCompositionRoot(repositories);
Expand All @@ -187,6 +193,7 @@ export function getTestCompositionRoot() {
systemRepository: new SystemTestRepository(),
configurationsRepository: new ConfigurationsTestRepository(),
casesFileRepository: new CasesFileTestRepository(),
userGroupRepository: new UserGroupTestRepository(),
};

return getCompositionRoot(repositories);
Expand Down
40 changes: 36 additions & 4 deletions src/data/repositories/IncidentActionD2Repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,18 @@ import {
mapDataElementsToIncidentResponseActions,
mapIncidentActionToDataElements,
} from "./utils/IncidentActionMapper";
import { ActionPlanFormData, ResponseActionFormData } from "../../domain/entities/ConfigurableForm";
import {
ActionPlanFormData,
ResponseActionFormData,
SingleResponseActionFormData,
} from "../../domain/entities/ConfigurableForm";
import { getProgramStage } from "./utils/MetadataHelper";
import { Future } from "../../domain/entities/generic/Future";
import { Status, Verification } from "../../domain/entities/incident-action-plan/ResponseAction";
import { assertOrError } from "./utils/AssertOrError";
import { D2TrackerEvent } from "@eyeseetea/d2-api/api/trackerEvents";
import { statusCodeMap, verificationCodeMap } from "./consts/IncidentActionConstants";
import { FormType } from "../../webapp/pages/form-page/FormPage";

export const incidentActionPlanIds = {
iapType: "wr1I51WTHhl",
Expand Down Expand Up @@ -128,8 +133,9 @@ export class IncidentActionD2Repository implements IncidentActionRepository {
}

saveIncidentAction(
formData: ActionPlanFormData | ResponseActionFormData,
diseaseOutbreakId: Id
formData: ActionPlanFormData | ResponseActionFormData | SingleResponseActionFormData,
diseaseOutbreakId: Id,
formOptionsToDelete?: Id[]
): FutureData<void> {
const programStageId = this.getProgramStageByFormType(formData.type);

Expand Down Expand Up @@ -173,13 +179,38 @@ export class IncidentActionD2Repository implements IncidentActionRepository {
if (saveResponse.status === "ERROR" || !diseaseOutbreakId) {
return Future.error(new Error(`Error saving Incident Action`));
} else {
if (formOptionsToDelete && formOptionsToDelete.length > 0) {
return this.deleteIncidentResponseAction(formOptionsToDelete);
}

return Future.success(undefined);
}
});
});
});
}

private deleteIncidentResponseAction(events: Id[]): FutureData<void> {
const d2Events: D2TrackerEvent[] = events.map(event => ({
event: event,
status: "COMPLETED",
program: RTSL_ZEBRA_PROGRAM_ID,
orgUnit: RTSL_ZEBRA_ORG_UNIT_ID,
occurredAt: "",
dataValues: [],
}));

return apiToFuture(
this.api.tracker.post({ importStrategy: "DELETE" }, { events: d2Events })
).flatMap(response => {
if (response.status === "ERROR") {
return Future.error(new Error(`Error deleting Response Action`));
} else {
return Future.success(undefined);
}
});
}

updateIncidentResponseAction(options: UpdateIncidentResponseActionOptions): FutureData<void> {
const { diseaseOutbreakId, eventId, responseAction } = options;

Expand Down Expand Up @@ -242,10 +273,11 @@ export class IncidentActionD2Repository implements IncidentActionRepository {
});
}

private getProgramStageByFormType(formType: string) {
private getProgramStageByFormType(formType: FormType): Id {
switch (formType) {
case "incident-action-plan":
return RTSL_ZEBRA_INCIDENT_ACTION_PLAN_PROGRAM_STAGE_ID;
case "incident-response-actions":
case "incident-response-action":
return RTSL_ZEBRA_INCIDENT_RESPONSE_ACTION_PROGRAM_STAGE_ID;
default:
Expand Down
35 changes: 32 additions & 3 deletions src/data/repositories/RiskAssessmentD2Repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,8 @@ export class RiskAssessmentD2Repository implements RiskAssessmentRepository {
| RiskAssessmentGradingFormData
| RiskAssessmentSummaryFormData
| RiskAssessmentQuestionnaireFormData,
diseaseOutbreakId: Id
diseaseOutbreakId: Id,
formOptionsToDelete?: Id[]
): FutureData<void> {
if (formData.type === "risk-assessment-questionnaire") {
const { stdQuestionnaireStageId, customQuestionnaireStageId } =
Expand Down Expand Up @@ -295,7 +296,8 @@ export class RiskAssessmentD2Repository implements RiskAssessmentRepository {
customQuestionnaireDataElements,
formData,
diseaseOutbreakId,
customQuestionnaireStageId
customQuestionnaireStageId,
formOptionsToDelete
);
}
);
Expand Down Expand Up @@ -336,7 +338,8 @@ export class RiskAssessmentD2Repository implements RiskAssessmentRepository {
| RiskAssessmentSummaryFormData
| RiskAssessmentQuestionnaireFormData,
diseaseOutbreakId: Id,
programStageId: Id
programStageId: Id,
formOptionsToDelete?: Id[]
): FutureData<void> {
//Get the enrollment Id for the disease outbreak
return apiToFuture(
Expand Down Expand Up @@ -368,11 +371,37 @@ export class RiskAssessmentD2Repository implements RiskAssessmentRepository {
if (saveResponse.status === "ERROR" || !diseaseOutbreakId) {
return Future.error(new Error(`Error Risk Assessment Grading`));
} else {
if (formOptionsToDelete && formOptionsToDelete.length > 0) {
return this.deleteCustomQuestion(formOptionsToDelete);
}

return Future.success(undefined);
}
});
});
}

private deleteCustomQuestion(events: Id[]): FutureData<void> {
const d2Events: D2TrackerEvent[] = events.map(event => ({
event: event,
status: "COMPLETED",
program: RTSL_ZEBRA_PROGRAM_ID,
orgUnit: RTSL_ZEBRA_ORG_UNIT_ID,
occurredAt: "",
dataValues: [],
}));

return apiToFuture(
this.api.tracker.post({ importStrategy: "DELETE" }, { events: d2Events })
).flatMap(response => {
if (response.status === "ERROR") {
return Future.error(new Error(`Error deleting Custom Question`));
} else {
return Future.success(undefined);
}
});
}

private getProgramStageByFormType(formType: string) {
switch (formType) {
case "risk-assessment-grading":
Expand Down
2 changes: 1 addition & 1 deletion src/data/repositories/TeamMemberD2Repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { apiToFuture, FutureData } from "../api-futures";
import { assertOrError } from "./utils/AssertOrError";
import { Future } from "../../domain/entities/generic/Future";

const RTSL_ZEBRA_INCIDENTMANAGER = "RTSL_ZEBRA_INCIDENTMANAGER";
export const RTSL_ZEBRA_INCIDENTMANAGER = "RTSL_ZEBRA_INCIDENTMANAGER";
const RTSL_ZEBRA_RISKASSESSOR = "RTSL_ZEBRA_RISKASSESSOR";
const RTSL_ZEBRA_INCIDENT_MANAGEMENT_TEAM_MEMBERS = "RTSL_ZEBRA_INCIDENT_MANAGEMENT_TEAM_MEMBERS";
const RTSL_ZEBRA_INCIDENT_RESPONSE_OFFICERS = "RTSL_ZEBRA_INCIDENT_RESPONSE_OFFICERS";
Expand Down
29 changes: 29 additions & 0 deletions src/data/repositories/UserGroupD2Repository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { D2Api } from "@eyeseetea/d2-api/2.36";
import { UserGroupRepository } from "../../domain/repositories/UserGroupRepository";
import { apiToFuture, FutureData } from "../api-futures";
import { assertOrError } from "./utils/AssertOrError";
import { UserGroup } from "../../domain/entities/UserGroup";
import { RTSL_ZEBRA_INCIDENTMANAGER } from "./TeamMemberD2Repository";

export class UserGroupD2Repository implements UserGroupRepository {
constructor(private api: D2Api) {}

getIncidentManagerUserGroupByCode(): FutureData<UserGroup> {
return apiToFuture(
this.api.metadata.get({
userGroups: {
fields: {
id: true,
},
filter: {
code: { eq: RTSL_ZEBRA_INCIDENTMANAGER },
},
},
})
)
.flatMap(response =>
assertOrError(response.userGroups[0], `User group ${RTSL_ZEBRA_INCIDENTMANAGER}`)
)
.map(userGroup => userGroup);
}
}
8 changes: 4 additions & 4 deletions src/data/repositories/consts/IncidentActionConstants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,9 @@ export const statusCodeMap: Record<ResponseActionStatusType, string> = {
Complete: "RTSL_ZEB_OS_STATUS_COMPLETE",
} as const;

export function getStatusTypeByCode(iapTypeCode: string): Maybe<ResponseActionStatusType> {
export function getStatusTypeByCode(statusCode: string): Maybe<ResponseActionStatusType> {
return (Object.keys(statusCodeMap) as ResponseActionStatusType[]).find(
key => statusCodeMap[key] === iapTypeCode
key => statusCodeMap[key] === statusCode
);
}

Expand All @@ -94,10 +94,10 @@ export const verificationCodeMap: Record<ResponseActionVerificationType, string>
};

export function getVerificationTypeByCode(
iapTypeCode: string
verificationCode: string
): Maybe<ResponseActionVerificationType> {
return (Object.keys(verificationCodeMap) as ResponseActionVerificationType[]).find(
key => verificationCodeMap[key] === iapTypeCode
key => verificationCodeMap[key] === verificationCode
);
}

Expand Down
6 changes: 5 additions & 1 deletion src/data/repositories/test/IncidentActionTestRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ export class IncidentActionTestRepository implements IncidentActionRepository {
throw new Error("Method not implemented.");
}

saveIncidentAction(_formData: any, _diseaseOutbreakId: Id): FutureData<void> {
saveIncidentAction(
_formData: any,
_diseaseOutbreakId: Id,
_formOptionsToDelete?: Id[]
): FutureData<void> {
throw new Error("Method not implemented.");
}

Expand Down
12 changes: 12 additions & 0 deletions src/data/repositories/test/UserGroupTestRepository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { Future } from "../../../domain/entities/generic/Future";
import { UserGroup } from "../../../domain/entities/UserGroup";
import { UserGroupRepository } from "../../../domain/repositories/UserGroupRepository";
import { FutureData } from "../../api-futures";

export class UserGroupTestRepository implements UserGroupRepository {
getIncidentManagerUserGroupByCode(): FutureData<UserGroup> {
return Future.success({
id: "1",
});
}
}
Loading

0 comments on commit f0f7722

Please sign in to comment.