From 7b00fe1a2f90e507eb2ffd1ea8c13092ab5c0a56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 4 Nov 2022 14:10:25 +0100 Subject: [PATCH] #10837 - Add jurisdiction type filter to case filter form --- .../symeda/sormas/api/caze/CaseCriteria.java | 15 ++++ .../sormas/api/caze/CaseJurisdictionType.java | 16 +++++ .../de/symeda/sormas/api/i18n/Captions.java | 1 + .../src/main/resources/captions.properties | 1 + sormas-api/src/main/resources/enum.properties | 6 +- .../backend/caze/CaseCriteriaHelper.java | 71 ++++++++++++++----- .../sormas/backend/caze/CaseService.java | 23 +++--- .../symeda/sormas/ui/caze/CaseFilterForm.java | 9 ++- 8 files changed, 114 insertions(+), 28 deletions(-) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseJurisdictionType.java diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseCriteria.java index 5e236c19811..afb73828a54 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseCriteria.java @@ -84,6 +84,7 @@ public class CaseCriteria extends CriteriaWithDateType implements ExternalShareC public static final String ONLY_CASES_WITH_DONT_SHARE_WITH_EXTERNAL_SURV_TOOL = "onlyCasesWithDontShareWithExternalSurvTool"; public static final String ONLY_SHOW_CASES_WITH_FULFILLED_REFERENCE_DEFINITION = "onlyShowCasesWithFulfilledReferenceDefinition"; public static final String PERSON_LIKE = "personLike"; + public static final String JURISDICTION_TYPE = "jurisdictionType"; private UserRoleReferenceDto reportingUserRole; private Disease disease; @@ -92,6 +93,7 @@ public class CaseCriteria extends CriteriaWithDateType implements ExternalShareC private CaseClassification caseClassification; private InvestigationStatus investigationStatus; private PresentCondition presentCondition; + private CaseJurisdictionType jurisdictionType; private RegionReferenceDto region; private DistrictReferenceDto district; private CommunityReferenceDto community; @@ -213,6 +215,19 @@ public DiseaseVariant getDiseaseVariant() { return diseaseVariant; } + public void setJurisdictionType(CaseJurisdictionType jurisdictionType) { + this.jurisdictionType = jurisdictionType; + } + + public CaseCriteria jurisdictionType(CaseJurisdictionType jurisdictionType) { + setJurisdictionType(jurisdictionType); + return this; + } + + public CaseJurisdictionType getJurisdictionType() { + return jurisdictionType; + } + public void setRegion(RegionReferenceDto region) { this.region = region; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseJurisdictionType.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseJurisdictionType.java new file mode 100644 index 00000000000..bc746d511c0 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseJurisdictionType.java @@ -0,0 +1,16 @@ +package de.symeda.sormas.api.caze; + +import de.symeda.sormas.api.i18n.I18nProperties; + +public enum CaseJurisdictionType { + + ALL, + RESPONSIBLE, + PLACE_OF_STAY; + + @Override + public String toString() { + return I18nProperties.getEnumCaption(this); + } + +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java index 7283ebba87b..75cefece1e4 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java @@ -535,6 +535,7 @@ public interface Captions { String caseImportErrorDescription = "caseImportErrorDescription"; String caseImportMergeCase = "caseImportMergeCase"; String caseInfrastructureDataChanged = "caseInfrastructureDataChanged"; + String caseJurisdictionType = "caseJurisdictionType"; String caseMergeDuplicates = "caseMergeDuplicates"; String caseMinusDays = "caseMinusDays"; String caseNewCase = "caseNewCase"; diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 23521aa6142..c34750d02d8 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -390,6 +390,7 @@ caseSelect=Select case caseCreateNew=Create new case caseDataEnterHomeAddressNow=Enter home address of the case person now caseCancelDeletion=Cancel case deletion +caseJurisdictionType=Jurisdiction type CaseData=Case CaseData.ageAndBirthDate=Age and birth date CaseData.additionalDetails=General comment diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index 01559d2e615..ef60365e661 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -183,7 +183,11 @@ ScreeningType.OTHER = Other CaseCountOrIncidence.CASE_COUNT = Case count CaseCountOrIncidence.CASE_INCIDENCE = Case incidence - + +CaseJurisdictionType.RESPONSIBLE = Responsible jurisdiction +CaseJurisdictionType.PLACE_OF_STAY = Place of stay +CaseJurisdictionType.ALL = All + # CaseMeasure CaseMeasure.CASE_COUNT = Case count CaseMeasure.CASE_INCIDENCE = Case incidence proportion diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseCriteriaHelper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseCriteriaHelper.java index 8a89c4ed33c..ed634219d42 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseCriteriaHelper.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseCriteriaHelper.java @@ -18,6 +18,7 @@ import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.Predicate; +import de.symeda.sormas.api.caze.CaseJurisdictionType; import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; @@ -31,26 +32,62 @@ public class CaseCriteriaHelper { private CaseCriteriaHelper() { } - public static Predicate createRegionFilterWithFallback(CriteriaBuilder cb, CaseJoins joins, RegionReferenceDto region) { - return CriteriaBuilderHelper.or( - cb, - cb.and(cb.isNotNull(joins.getRegion()), cb.equal(joins.getRegion().get(Region.UUID), region.getUuid())), - cb.and(cb.isNotNull(joins.getResponsibleRegion()), cb.equal(joins.getResponsibleRegion().get(Region.UUID), region.getUuid()))); + public static Predicate createRegionCriteriaFilter( + CriteriaBuilder cb, + CaseJoins joins, + RegionReferenceDto region, + CaseJurisdictionType jurisdictionType) { + + Predicate responsibleJurisdictionPredicate = + cb.and(cb.isNotNull(joins.getResponsibleRegion()), cb.equal(joins.getResponsibleRegion().get(Region.UUID), region.getUuid())); + Predicate placeOfStayPredicate = cb.and(cb.isNotNull(joins.getRegion()), cb.equal(joins.getRegion().get(Region.UUID), region.getUuid())); + + if (jurisdictionType == null || jurisdictionType == CaseJurisdictionType.ALL) { + return CriteriaBuilderHelper.or(cb, responsibleJurisdictionPredicate, placeOfStayPredicate); + } else if (jurisdictionType == CaseJurisdictionType.RESPONSIBLE) { + return responsibleJurisdictionPredicate; + } else { + return placeOfStayPredicate; + } } - public static Predicate createDistrictFilterWithFallback(CriteriaBuilder cb, CaseJoins joins, DistrictReferenceDto district) { - return CriteriaBuilderHelper.or( - cb, - cb.and(cb.isNotNull(joins.getDistrict()), cb.equal(joins.getDistrict().get(District.UUID), district.getUuid())), - cb.and(cb.isNotNull(joins.getResponsibleDistrict()), cb.equal(joins.getResponsibleDistrict().get(District.UUID), district.getUuid()))); + public static Predicate createDistrictCriteriaFilter( + CriteriaBuilder cb, + CaseJoins joins, + DistrictReferenceDto district, + CaseJurisdictionType jurisdictionType) { + + Predicate responsibleJurisdictionPredicate = + cb.and(cb.isNotNull(joins.getResponsibleDistrict()), cb.equal(joins.getResponsibleDistrict().get(District.UUID), district.getUuid())); + Predicate placeOfStayPredicate = + cb.and(cb.isNotNull(joins.getDistrict()), cb.equal(joins.getDistrict().get(District.UUID), district.getUuid())); + + if (jurisdictionType == null || jurisdictionType == CaseJurisdictionType.ALL) { + return CriteriaBuilderHelper.or(cb, responsibleJurisdictionPredicate, placeOfStayPredicate); + } else if (jurisdictionType == CaseJurisdictionType.RESPONSIBLE) { + return responsibleJurisdictionPredicate; + } else { + return placeOfStayPredicate; + } } - public static Predicate createCommunityFilterWithFallback(CriteriaBuilder cb, CaseJoins joins, CommunityReferenceDto community) { - return CriteriaBuilderHelper.or( - cb, - cb.and(cb.isNotNull(joins.getCommunity()), cb.equal(joins.getCommunity().get(Community.UUID), community.getUuid())), - cb.and( - cb.isNotNull(joins.getResponsibleCommunity()), - cb.equal(joins.getResponsibleCommunity().get(Community.UUID), community.getUuid()))); + public static Predicate createCommunityCriteriaFilter( + CriteriaBuilder cb, + CaseJoins joins, + CommunityReferenceDto community, + CaseJurisdictionType jurisdictionType) { + + Predicate responsibleJurisdictionPredicate = + cb.and(cb.isNotNull(joins.getResponsibleCommunity()), cb.equal(joins.getResponsibleCommunity().get(Community.UUID), community.getUuid())); + Predicate placeOfStayPredicate = + cb.and(cb.isNotNull(joins.getCommunity()), cb.equal(joins.getCommunity().get(Community.UUID), community.getUuid())); + + if (jurisdictionType == null || jurisdictionType == CaseJurisdictionType.ALL) { + return CriteriaBuilderHelper.or(cb, responsibleJurisdictionPredicate, placeOfStayPredicate); + } else if (jurisdictionType == CaseJurisdictionType.RESPONSIBLE) { + return responsibleJurisdictionPredicate; + } else { + return placeOfStayPredicate; + } } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index b05ed81e9a4..3ddbeda3f71 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -655,15 +655,22 @@ public Predicate createCriteriaFilter(CaseCrite filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.OUTCOME), caseCriteria.getOutcome())); } if (caseCriteria.getRegion() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, CaseCriteriaHelper.createRegionFilterWithFallback(cb, joins, caseCriteria.getRegion())); + filter = CriteriaBuilderHelper.and( + cb, + filter, + CaseCriteriaHelper.createRegionCriteriaFilter(cb, joins, caseCriteria.getRegion(), caseCriteria.getJurisdictionType())); } if (caseCriteria.getDistrict() != null) { - filter = - CriteriaBuilderHelper.and(cb, filter, CaseCriteriaHelper.createDistrictFilterWithFallback(cb, joins, caseCriteria.getDistrict())); + filter = CriteriaBuilderHelper.and( + cb, + filter, + CaseCriteriaHelper.createDistrictCriteriaFilter(cb, joins, caseCriteria.getDistrict(), caseCriteria.getJurisdictionType())); } if (caseCriteria.getCommunity() != null) { - filter = - CriteriaBuilderHelper.and(cb, filter, CaseCriteriaHelper.createCommunityFilterWithFallback(cb, joins, caseCriteria.getCommunity())); + filter = CriteriaBuilderHelper.and( + cb, + filter, + CaseCriteriaHelper.createCommunityCriteriaFilter(cb, joins, caseCriteria.getCommunity(), caseCriteria.getJurisdictionType())); } if (caseCriteria.getFollowUpStatus() != null) { filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.FOLLOW_UP_STATUS), caseCriteria.getFollowUpStatus())); @@ -1121,9 +1128,7 @@ public void delete(Case caze, DeletionDetails deletionDetails) { @Override public void undelete(Case caze) { // un-delete all samples that are only associated with this case - caze.getSamples() - .stream() - .forEach(sample -> sampleService.undelete(sample)); + caze.getSamples().stream().forEach(sample -> sampleService.undelete(sample)); super.undelete(caze); } @@ -1849,7 +1854,7 @@ private Predicate getSimilarityFilters(CaseSimilarityCriteria criteria, Criteria Predicate regionFilter = null; RegionReferenceDto criteriaRegion = caseCriteria.getRegion(); if (criteriaRegion != null) { - regionFilter = CriteriaBuilderHelper.or(cb, regionFilter, CaseCriteriaHelper.createRegionFilterWithFallback(cb, joins, criteriaRegion)); + regionFilter = CriteriaBuilderHelper.or(cb, regionFilter, CaseCriteriaHelper.createRegionCriteriaFilter(cb, joins, criteriaRegion, null)); } Predicate reportDateFilter = criteria.getReportDate() != null diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java index ff86e2819f1..e1051ff8f02 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFilterForm.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.caze.CaseCriteria; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseIndexDto; +import de.symeda.sormas.api.caze.CaseJurisdictionType; import de.symeda.sormas.api.caze.CaseOrigin; import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.contact.ContactCriteria; @@ -75,6 +76,7 @@ public class CaseFilterForm extends AbstractFilterForm { private static final String MORE_FILTERS_HTML_LAYOUT = filterLocs( CaseCriteria.PRESENT_CONDITION, + CaseCriteria.JURISDICTION_TYPE, CaseDataDto.REGION, CaseDataDto.DISTRICT, CaseDataDto.COMMUNITY, @@ -180,10 +182,15 @@ protected void addFields() { @Override public void addMoreFilters(CustomLayout moreFiltersContainer) { + UserDto user = currentUserDto(); + ComboBox presentConditionField = addField(moreFiltersContainer, FieldConfiguration.pixelSized(CaseCriteria.PRESENT_CONDITION, 140)); presentConditionField.setInputPrompt(I18nProperties.getPrefixCaption(PersonDto.I18N_PREFIX, PersonDto.PRESENT_CONDITION)); - UserDto user = currentUserDto(); + ComboBox jurisdictionTypeField = addField(moreFiltersContainer, FieldConfiguration.pixelSized(CaseCriteria.JURISDICTION_TYPE, 140)); + jurisdictionTypeField.setInputPrompt(I18nProperties.getCaption(Captions.caseJurisdictionType)); + FieldHelper.updateEnumData(jurisdictionTypeField, Arrays.asList(CaseJurisdictionType.values())); + ComboBox regionField = null; if (user.getRegion() == null) { regionField = addField(moreFiltersContainer, FieldConfiguration.pixelSized(CaseDataDto.REGION, 140));