From bdf12527ca67e56d379dccc87a88eb13fe615fbf Mon Sep 17 00:00:00 2001 From: Jonas Cirotzki Date: Mon, 15 Aug 2022 13:13:06 +0200 Subject: [PATCH 01/45] [#9693] refactor isEditAllowed --- .../backend/campaign/CampaignFacadeEjb.java | 4 ++-- .../backend/campaign/CampaignService.java | 23 ++++++++----------- .../sormas/backend/caze/CaseFacadeEjb.java | 6 ++--- .../sormas/backend/caze/CaseService.java | 12 +++------- .../common/AbstractCoreAdoService.java | 13 ++++------- .../backend/common/AbstractCoreFacadeEjb.java | 2 +- .../contact/ContactJurisdictionFlagsDto.java | 10 ++++---- .../backend/contact/ContactService.java | 6 ++--- .../event/EventParticipantService.java | 2 +- .../sormas/backend/event/EventService.java | 2 +- .../immunization/ImmunizationService.java | 2 +- .../services/TravelEntryListService.java | 5 ---- .../services/TravelEntryService.java | 2 +- 13 files changed, 35 insertions(+), 54 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java index 6923acff3ab..0e0c57683c7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java @@ -171,7 +171,7 @@ public long count(CampaignCriteria campaignCriteria) { public CampaignDto save(@Valid @NotNull CampaignDto dto) { validate(dto); Campaign campaign = fillOrBuildEntity(dto, service.getByUuid(dto.getUuid()), true); - if (!service.getEditPermissionType(campaign).equals(EditPermissionType.ALLOWED)) { + if (!service.isEditAllowed(campaign).equals(EditPermissionType.ALLOWED)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorEntityNotEditable)); } service.ensurePersisted(campaign); @@ -418,7 +418,7 @@ public DeletionInfoDto getAutomaticDeletionInfo(String uuid) { @Override public EditPermissionType isCampaignEditAllowed(String caseUuid) { Campaign campaign = service.getByUuid(caseUuid); - return service.getEditPermissionType(campaign); + return service.isEditAllowed(campaign); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java index 0ab38bcb7b2..48cb803b8e0 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java @@ -11,13 +11,14 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.campaign.CampaignCriteria; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.common.AbstractCoreAdoService; import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.CoreAdo; import de.symeda.sormas.backend.common.CriteriaBuilderHelper; +import de.symeda.sormas.backend.common.DeletableAdo; @Stateless @LocalBean @@ -33,12 +34,6 @@ protected Predicate createUserFilterInternal(CriteriaBuilder cb, CriteriaQuery c return createUserFilter(new CampaignQueryContext(cb, cq, from)); } - @Override - public EditPermissionType isEditAllowed(Campaign entity) { - // todo this case was not covered before? Feels like a bug fixed? - return getEditPermissionType(entity); - } - public Predicate createUserFilter(CampaignQueryContext queryContext) { // A user who has access to CampaignView can read all campaigns return null; @@ -51,7 +46,7 @@ public Predicate buildCriteriaFilter(CampaignQueryContext queryContext, Campaign Predicate filter = null; if (campaignCriteria.getDeleted() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Campaign.DELETED), campaignCriteria.getDeleted())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(DeletableAdo.DELETED), campaignCriteria.getDeleted())); } if (campaignCriteria.getStartDateAfter() != null || campaignCriteria.getStartDateBefore() != null) { filter = CriteriaBuilderHelper.and( @@ -72,16 +67,16 @@ public Predicate buildCriteriaFilter(CampaignQueryContext queryContext, Campaign Predicate likeFilters = cb.or( CriteriaBuilderHelper.unaccentedIlike(cb, from.get(Campaign.NAME), textFilter), - CriteriaBuilderHelper.ilike(cb, from.get(Campaign.UUID), textFilter)); + CriteriaBuilderHelper.ilike(cb, from.get(AbstractDomainObject.UUID), textFilter)); filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); } } if (campaignCriteria.getRelevanceStatus() != null) { if (campaignCriteria.getRelevanceStatus() == EntityRelevanceStatus.ACTIVE) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.or(cb.equal(from.get(Campaign.ARCHIVED), false), cb.isNull(from.get(Campaign.ARCHIVED)))); + filter = + CriteriaBuilderHelper.and(cb, filter, cb.or(cb.equal(from.get(CoreAdo.ARCHIVED), false), cb.isNull(from.get(CoreAdo.ARCHIVED)))); } else if (campaignCriteria.getRelevanceStatus() == EntityRelevanceStatus.ARCHIVED) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Campaign.ARCHIVED), true)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(CoreAdo.ARCHIVED), true)); } } return filter; @@ -100,7 +95,7 @@ public List getAllActiveUuids() { } cq.where(filter); - cq.select(from.get(Campaign.UUID)); + cq.select(from.get(AbstractDomainObject.UUID)); return em.createQuery(cq).getResultList(); } @@ -117,7 +112,7 @@ public List getAllActive() { } public Predicate createActiveCampaignsFilter(CriteriaBuilder cb, Root root) { - return cb.and(cb.isFalse(root.get(Campaign.ARCHIVED)), cb.isFalse(root.get(Campaign.DELETED))); + return cb.and(cb.isFalse(root.get(CoreAdo.ARCHIVED)), cb.isFalse(root.get(DeletableAdo.DELETED))); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 6fd79620c66..e62af5d3989 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -1492,7 +1492,7 @@ public Integer saveBulkCase( for (String caseUuid : caseUuidList) { Case caze = service.getByUuid(caseUuid); - if (service.getEditPermissionType(caze).equals(EditPermissionType.ALLOWED)) { + if (service.isEditAllowed(caze).equals(EditPermissionType.ALLOWED)) { CaseDataDto existingCaseDto = toDto(caze); updateCaseWithBulkData( @@ -1533,7 +1533,7 @@ public void saveBulkEditWithFacilities( for (String caseUuid : caseUuidList) { Case caze = service.getByUuid(caseUuid); - if (service.getEditPermissionType(caze).equals(EditPermissionType.ALLOWED)) { + if (service.isEditAllowed(caze).equals(EditPermissionType.ALLOWED)) { CaseDataDto existingCaseDto = toDto(caze); updateCaseWithBulkData( @@ -1608,7 +1608,7 @@ public CaseDataDto save(@Valid CaseDataDto dto, boolean handleChanges, boolean c Case existingCase = service.getByUuid(dto.getUuid()); FacadeHelper.checkCreateAndEditRights(existingCase, userService, UserRight.CASE_CREATE, UserRight.CASE_EDIT); - if (!systemSave && internal && existingCase != null && !service.getEditPermissionType(existingCase).equals(EditPermissionType.ALLOWED)) { + if (!systemSave && internal && existingCase != null && !service.isEditAllowed(existingCase).equals(EditPermissionType.ALLOWED)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorCaseNotEditable)); } 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 168a490bb08..05fe0cae748 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 @@ -1522,11 +1522,11 @@ public EditPermissionType isAddContactAllowed(Case caze) { return EditPermissionType.REFUSED; } - return super.getEditPermissionType(caze); + return super.isEditAllowed(caze); } @Override - public EditPermissionType getEditPermissionType(Case caze) { + public EditPermissionType isEditAllowed(Case caze) { if (caze.getSormasToSormasOriginInfo() != null && !caze.getSormasToSormasOriginInfo().isOwnershipHandedOver()) { return EditPermissionType.REFUSED; @@ -1536,16 +1536,10 @@ public EditPermissionType getEditPermissionType(Case caze) { return EditPermissionType.REFUSED; } - return super.getEditPermissionType(caze); + return super.isEditAllowed(caze); } - @Override - public EditPermissionType isEditAllowed(Case entity) { - // todo compared to ContactService this seems strange. - return getEditPermissionType(entity); - } - public boolean inJurisdiction(Case caze, User user) { CriteriaBuilder cb = em.getCriteriaBuilder(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index 811ab9f9b8a..05ec094f36e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -37,7 +37,6 @@ import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.feature.FeatureType; -import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal; import de.symeda.sormas.backend.util.IterableHelper; @@ -99,7 +98,7 @@ public Map calculateEndOfProcessingDate(List entityuuids) Expression aggregatedChangeDateExpression = addChangeDates(new AggregatedChangeDateExpressionBuilder(cb), from, true).build(); cq.multiselect(from.get(AbstractDomainObject.UUID), cb.max(aggregatedChangeDateExpression)); - cq.where(from.get(ADO.UUID).in(entityuuids)); + cq.where(from.get(AbstractDomainObject.UUID).in(entityuuids)); cq.groupBy(from.get(AbstractDomainObject.UUID)); Map collect = em.createQuery(cq).getResultList().stream().collect(Collectors.toMap(r -> (String) r[0], r -> (Date) r[1])); @@ -118,7 +117,7 @@ public void archive(String entityUuid, Date endOfProcessingDate) { Root root = cu.from(getElementClass()); cu.set(AbstractDomainObject.CHANGE_DATE, Timestamp.from(Instant.now())); - cu.set(root.get(Case.ARCHIVED), true); + cu.set(root.get(CoreAdo.ARCHIVED), true); cu.set(root.get(CoreAdo.END_OF_PROCESSING_DATE), endOfProcessingDate); cu.where(cb.equal(root.get(AbstractDomainObject.UUID), entityUuid)); @@ -138,7 +137,7 @@ public void archive(List entityUuids) { Root root = cu.from(getElementClass()); cu.set(AbstractDomainObject.CHANGE_DATE, Timestamp.from(Instant.now())); - cu.set(root.get(Case.ARCHIVED), true); + cu.set(root.get(CoreAdo.ARCHIVED), true); cu.set(root.get(CoreAdo.END_OF_PROCESSING_DATE), finalEndOfProcessingDate); cu.where(cb.equal(root.get(AbstractDomainObject.UUID), entityUuid)); @@ -156,7 +155,7 @@ public void dearchive(List entityUuids, String dearchiveReason) { Root root = cu.from(getElementClass()); cu.set(AbstractDomainObject.CHANGE_DATE, Timestamp.from(Instant.now())); - cu.set(root.get(Case.ARCHIVED), false); + cu.set(root.get(CoreAdo.ARCHIVED), false); cu.set(root.get(CoreAdo.END_OF_PROCESSING_DATE), (Date) null); cu.set(root.get(CoreAdo.ARCHIVE_UNDONE_REASON), dearchiveReason); @@ -166,7 +165,7 @@ public void dearchive(List entityUuids, String dearchiveReason) { }); } - public EditPermissionType getEditPermissionType(ADO entity) { + public EditPermissionType isEditAllowed(ADO entity) { if (entity.isArchived()) { return featureConfigurationFacade.isFeatureEnabled(FeatureType.EDIT_ARCHIVED_ENTITIES) ? EditPermissionType.ALLOWED @@ -175,6 +174,4 @@ public EditPermissionType getEditPermissionType(ADO entity) { return EditPermissionType.ALLOWED; } - - public abstract EditPermissionType isEditAllowed(ADO entity); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java index 0f1798ca5a0..4e3e1538af5 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java @@ -98,7 +98,7 @@ public List getAllAfter(Date date, Integer batchSize, String lastSynchroniz public DTO doSave(@Valid @NotNull DTO dto) { ADO existingAdo = dto.getUuid() != null ? service.getByUuid(dto.getUuid()) : null; - if (existingAdo != null && !service.getEditPermissionType(existingAdo).equals(EditPermissionType.ALLOWED)) { + if (existingAdo != null && !service.isEditAllowed(existingAdo).equals(EditPermissionType.ALLOWED)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorEntityNotEditable)); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactJurisdictionFlagsDto.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactJurisdictionFlagsDto.java index 35307d33c27..8ade057e586 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactJurisdictionFlagsDto.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactJurisdictionFlagsDto.java @@ -20,19 +20,19 @@ public class ContactJurisdictionFlagsDto implements Serializable { - private Boolean isInJurisdiction; - private Boolean isCaseInJurisdiction; + private final boolean isInJurisdiction; + private final boolean isCaseInJurisdiction; - public ContactJurisdictionFlagsDto(Boolean isInJurisdiction, Boolean isCaseInJurisdiction) { + public ContactJurisdictionFlagsDto(boolean isInJurisdiction, boolean isCaseInJurisdiction) { this.isInJurisdiction = isInJurisdiction; this.isCaseInJurisdiction = isCaseInJurisdiction; } - public Boolean getInJurisdiction() { + public boolean getInJurisdiction() { return isInJurisdiction; } - public Boolean getCaseInJurisdiction() { + public boolean getCaseInJurisdiction() { return isCaseInJurisdiction; } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java index 78f485785ea..39541f28cf4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java @@ -1564,7 +1564,7 @@ public ContactJurisdictionFlagsDto inJurisdictionOrOwned(Contact contact) { CriteriaQuery cq = cb.createQuery(ContactJurisdictionFlagsDto.class); Root root = cq.from(Contact.class); cq.multiselect(getJurisdictionSelections(new ContactQueryContext(cb, cq, root))); - cq.where(cb.equal(root.get(Contact.UUID), contact.getUuid())); + cq.where(cb.equal(root.get(AbstractDomainObject.UUID), contact.getUuid())); return em.createQuery(cq).getSingleResult(); } @@ -1587,13 +1587,13 @@ public EditPermissionType isEditAllowed(Contact contact) { return EditPermissionType.REFUSED; } - return getEditPermissionType(contact); + return super.isEditAllowed(contact); } public List> getJurisdictionSelections(ContactQueryContext qc) { final CriteriaBuilder cb = qc.getCriteriaBuilder(); - final ContactJoins joins = (ContactJoins) qc.getJoins(); + final ContactJoins joins = qc.getJoins(); return Arrays.asList( JurisdictionHelper.booleanSelector(cb, inJurisdictionOrOwned(qc, userService.getCurrentUser())), JurisdictionHelper.booleanSelector( diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java index d956539028f..ffa265fa2d3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java @@ -516,7 +516,7 @@ public EditPermissionType isEditAllowed(EventParticipant eventParticipant) { return EditPermissionType.REFUSED; } - return super.getEditPermissionType(eventParticipant); + return super.isEditAllowed(eventParticipant); } public Collection getByPersonUuids(List personUuids) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java index e4e96432b28..c4ed5e8df4b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java @@ -1009,7 +1009,7 @@ public EditPermissionType isEditAllowed(Event event) { return EditPermissionType.REFUSED; } - return super.getEditPermissionType(event); + return super.isEditAllowed(event); } public boolean inJurisdictionOrOwned(Event event, User user) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationService.java index 10c4fd3d691..85114436a17 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationService.java @@ -577,6 +577,6 @@ public EditPermissionType isEditAllowed(Immunization immunization) { return EditPermissionType.REFUSED; } - return super.getEditPermissionType(immunization); + return super.isEditAllowed(immunization); } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryListService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryListService.java index 4bd30bb6549..7d8ae915f94 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryListService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryListService.java @@ -80,9 +80,4 @@ private Predicate buildListEntryCriteriaFilter(Long personId, Long caseId, Trave return filter; } - @Override - public EditPermissionType isEditAllowed(TravelEntry travelEntry) { - // todo is the following correct? This was not covered before so I think this is a bug fixed - return getEditPermissionType(travelEntry); - } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java index 66ba6973668..1ad2ae5492e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java @@ -202,7 +202,7 @@ public EditPermissionType isEditAllowed(TravelEntry travelEntry) { return EditPermissionType.REFUSED; } - return super.getEditPermissionType(travelEntry); + return super.isEditAllowed(travelEntry); } @Override From ebd55659ef17e4f8e4ffa15292af2429d7d955af Mon Sep 17 00:00:00 2001 From: Jonas Cirotzki Date: Sun, 28 Aug 2022 14:59:57 +0200 Subject: [PATCH 02/45] [#9693] review comments --- .../backend/campaign/CampaignService.java | 17 ++++++++--------- .../backend/common/AbstractCoreAdoService.java | 6 +++--- .../contact/ContactJurisdictionFlagsDto.java | 10 +++++----- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java index 48cb803b8e0..31f8c21c457 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignService.java @@ -11,14 +11,13 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.campaign.CampaignCriteria; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.common.AbstractCoreAdoService; import de.symeda.sormas.backend.common.AbstractDomainObject; -import de.symeda.sormas.backend.common.CoreAdo; import de.symeda.sormas.backend.common.CriteriaBuilderHelper; -import de.symeda.sormas.backend.common.DeletableAdo; @Stateless @LocalBean @@ -46,7 +45,7 @@ public Predicate buildCriteriaFilter(CampaignQueryContext queryContext, Campaign Predicate filter = null; if (campaignCriteria.getDeleted() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(DeletableAdo.DELETED), campaignCriteria.getDeleted())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Campaign.DELETED), campaignCriteria.getDeleted())); } if (campaignCriteria.getStartDateAfter() != null || campaignCriteria.getStartDateBefore() != null) { filter = CriteriaBuilderHelper.and( @@ -67,16 +66,16 @@ public Predicate buildCriteriaFilter(CampaignQueryContext queryContext, Campaign Predicate likeFilters = cb.or( CriteriaBuilderHelper.unaccentedIlike(cb, from.get(Campaign.NAME), textFilter), - CriteriaBuilderHelper.ilike(cb, from.get(AbstractDomainObject.UUID), textFilter)); + CriteriaBuilderHelper.ilike(cb, from.get(Campaign.UUID), textFilter)); filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); } } if (campaignCriteria.getRelevanceStatus() != null) { if (campaignCriteria.getRelevanceStatus() == EntityRelevanceStatus.ACTIVE) { - filter = - CriteriaBuilderHelper.and(cb, filter, cb.or(cb.equal(from.get(CoreAdo.ARCHIVED), false), cb.isNull(from.get(CoreAdo.ARCHIVED)))); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.or(cb.equal(from.get(Campaign.ARCHIVED), false), cb.isNull(from.get(Campaign.ARCHIVED)))); } else if (campaignCriteria.getRelevanceStatus() == EntityRelevanceStatus.ARCHIVED) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(CoreAdo.ARCHIVED), true)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Campaign.ARCHIVED), true)); } } return filter; @@ -95,7 +94,7 @@ public List getAllActiveUuids() { } cq.where(filter); - cq.select(from.get(AbstractDomainObject.UUID)); + cq.select(from.get(Campaign.UUID)); return em.createQuery(cq).getResultList(); } @@ -112,7 +111,7 @@ public List getAllActive() { } public Predicate createActiveCampaignsFilter(CriteriaBuilder cb, Root root) { - return cb.and(cb.isFalse(root.get(CoreAdo.ARCHIVED)), cb.isFalse(root.get(DeletableAdo.DELETED))); + return cb.and(cb.isFalse(root.get(Campaign.ARCHIVED)), cb.isFalse(root.get(Campaign.DELETED))); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index 05ec094f36e..4b44c21ffa1 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -97,9 +97,9 @@ public Map calculateEndOfProcessingDate(List entityuuids) Root from = cq.from(getElementClass()); Expression aggregatedChangeDateExpression = addChangeDates(new AggregatedChangeDateExpressionBuilder(cb), from, true).build(); - cq.multiselect(from.get(AbstractDomainObject.UUID), cb.max(aggregatedChangeDateExpression)); - cq.where(from.get(AbstractDomainObject.UUID).in(entityuuids)); - cq.groupBy(from.get(AbstractDomainObject.UUID)); + cq.multiselect(from.get(CoreAdo.UUID), cb.max(aggregatedChangeDateExpression)); + cq.where(from.get(CoreAdo.UUID).in(entityuuids)); + cq.groupBy(from.get(CoreAdo.UUID)); Map collect = em.createQuery(cq).getResultList().stream().collect(Collectors.toMap(r -> (String) r[0], r -> (Date) r[1])); return collect; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactJurisdictionFlagsDto.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactJurisdictionFlagsDto.java index 8ade057e586..35307d33c27 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactJurisdictionFlagsDto.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactJurisdictionFlagsDto.java @@ -20,19 +20,19 @@ public class ContactJurisdictionFlagsDto implements Serializable { - private final boolean isInJurisdiction; - private final boolean isCaseInJurisdiction; + private Boolean isInJurisdiction; + private Boolean isCaseInJurisdiction; - public ContactJurisdictionFlagsDto(boolean isInJurisdiction, boolean isCaseInJurisdiction) { + public ContactJurisdictionFlagsDto(Boolean isInJurisdiction, Boolean isCaseInJurisdiction) { this.isInJurisdiction = isInJurisdiction; this.isCaseInJurisdiction = isCaseInJurisdiction; } - public boolean getInJurisdiction() { + public Boolean getInJurisdiction() { return isInJurisdiction; } - public boolean getCaseInJurisdiction() { + public Boolean getCaseInJurisdiction() { return isCaseInJurisdiction; } } From f8d49f2e0478aa134cd14525ca99b34c6d19614b Mon Sep 17 00:00:00 2001 From: Jonas Cirotzki Date: Sun, 28 Aug 2022 14:41:55 +0200 Subject: [PATCH 03/45] [#9693] unify usage of edit checks in UI --- .../java/de/symeda/sormas/api/CoreFacade.java | 8 +++-- .../sormas/api/campaign/CampaignFacade.java | 1 - .../sormas/api/sample/SampleFacade.java | 3 +- .../backend/campaign/CampaignFacadeEjb.java | 8 +---- .../sormas/backend/caze/CaseFacadeEjb.java | 6 ++-- .../sormas/backend/caze/CaseService.java | 6 ++-- .../common/AbstractCoreAdoService.java | 7 +++- .../backend/common/AbstractCoreFacadeEjb.java | 13 ++++--- .../backend/contact/ContactFacadeEjb.java | 4 +-- .../backend/contact/ContactService.java | 4 +-- .../sormas/backend/event/EventFacadeEjb.java | 4 +-- .../event/EventParticipantFacadeEjb.java | 2 +- .../event/EventParticipantService.java | 4 +-- .../sormas/backend/event/EventService.java | 4 +-- .../immunization/ImmunizationFacadeEjb.java | 2 +- .../immunization/ImmunizationService.java | 4 +-- .../backend/sample/SampleFacadeEjb.java | 35 +++++++++++-------- .../sormas/backend/sample/SampleService.java | 3 +- .../AbstractSormasToSormasInterface.java | 3 ++ .../caze/SormasToSormasCaseFacadeEjb.java | 2 +- .../SormasToSormasContactFacadeEjb.java | 2 +- .../event/SormasToSormasEventFacadeEjb.java | 2 +- .../services/TravelEntryService.java | 4 +-- .../caze/CaseFacadeEditRightsTest.java | 30 ++++++++-------- .../AbstractCampaignDataView.java | 3 -- .../ui/campaign/campaigns/CampaignView.java | 8 ++--- .../sormas/ui/caze/AbstractCaseView.java | 14 +++----- .../sormas/ui/caze/CaseContactsView.java | 3 +- .../symeda/sormas/ui/caze/CaseDataView.java | 2 +- .../ui/contact/AbstractContactView.java | 12 +++---- .../sormas/ui/contact/ContactDataView.java | 2 +- .../sormas/ui/events/AbstractEventView.java | 12 +++---- .../sormas/ui/events/EventActionsView.java | 2 +- .../sormas/ui/events/EventDataView.java | 2 +- .../ui/events/EventParticipantDataView.java | 2 +- .../ui/events/EventParticipantsView.java | 3 +- .../AbstractImmunizationView.java | 14 ++++---- .../ui/immunization/ImmunizationDataView.java | 2 +- .../sormas/ui/samples/AbstractSampleView.java | 10 +++--- .../travelentry/AbstractTravelEntryView.java | 14 +++----- .../ui/travelentry/TravelEntryDataView.java | 2 +- .../sormas/ui/utils/AbstractDetailView.java | 1 + .../utils/AbstractEditAllowedDetailView.java | 20 +++++++++++ 43 files changed, 150 insertions(+), 139 deletions(-) create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditAllowedDetailView.java diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java index 85576cce9b4..97917fa5422 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/CoreFacade.java @@ -46,13 +46,15 @@ public interface CoreFacade entityUuids, String dearchiveReason); default void setArchiveInExternalSurveillanceToolForEntity(String uuid, boolean archived) throws ExternalSurveillanceToolException { - }; + } default void setArchiveInExternalSurveillanceToolForEntities(List uuid, boolean archived) throws ExternalSurveillanceToolException { - }; + } Date calculateEndOfProcessingDate(String entityUuids); - EditPermissionType isEditAllowed(String uuid); + EditPermissionType getEditPermissionType(String uuid); + + boolean isEditAllowed(String uuid); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignFacade.java index 42c2331588d..0d8363a623d 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignFacade.java @@ -21,5 +21,4 @@ public interface CampaignFacade extends CoreFacade getByCaseUuids(List caseUuids); - Boolean isSampleEditAllowed(String sampleUuid); + // todo we might be able to reuse + Boolean isEditAllowed(String sampleUuid); List getByContactUuids(List contactUuids); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java index 0e0c57683c7..5fbdda3af0c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java @@ -171,7 +171,7 @@ public long count(CampaignCriteria campaignCriteria) { public CampaignDto save(@Valid @NotNull CampaignDto dto) { validate(dto); Campaign campaign = fillOrBuildEntity(dto, service.getByUuid(dto.getUuid()), true); - if (!service.isEditAllowed(campaign).equals(EditPermissionType.ALLOWED)) { + if (!service.isEditAllowed(campaign)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorEntityNotEditable)); } service.ensurePersisted(campaign); @@ -415,12 +415,6 @@ public DeletionInfoDto getAutomaticDeletionInfo(String uuid) { return null; // campaigns do not support automatic deletion yet } - @Override - public EditPermissionType isCampaignEditAllowed(String caseUuid) { - Campaign campaign = service.getByUuid(caseUuid); - return service.isEditAllowed(campaign); - } - @Override @RightsAllowed(UserRight._CAMPAIGN_ARCHIVE) public void archive(String entityUuid, Date endOfProcessingDate) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index e62af5d3989..dbf2dfd8cc4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -1492,7 +1492,7 @@ public Integer saveBulkCase( for (String caseUuid : caseUuidList) { Case caze = service.getByUuid(caseUuid); - if (service.isEditAllowed(caze).equals(EditPermissionType.ALLOWED)) { + if (service.isEditAllowed(caze)) { CaseDataDto existingCaseDto = toDto(caze); updateCaseWithBulkData( @@ -1533,7 +1533,7 @@ public void saveBulkEditWithFacilities( for (String caseUuid : caseUuidList) { Case caze = service.getByUuid(caseUuid); - if (service.isEditAllowed(caze).equals(EditPermissionType.ALLOWED)) { + if (service.isEditAllowed(caze)) { CaseDataDto existingCaseDto = toDto(caze); updateCaseWithBulkData( @@ -1608,7 +1608,7 @@ public CaseDataDto save(@Valid CaseDataDto dto, boolean handleChanges, boolean c Case existingCase = service.getByUuid(dto.getUuid()); FacadeHelper.checkCreateAndEditRights(existingCase, userService, UserRight.CASE_CREATE, UserRight.CASE_EDIT); - if (!systemSave && internal && existingCase != null && !service.isEditAllowed(existingCase).equals(EditPermissionType.ALLOWED)) { + if (!systemSave && internal && existingCase != null && !service.isEditAllowed(existingCase)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorCaseNotEditable)); } 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 05fe0cae748..29ac32f20c2 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 @@ -1522,11 +1522,11 @@ public EditPermissionType isAddContactAllowed(Case caze) { return EditPermissionType.REFUSED; } - return super.isEditAllowed(caze); + return super.getEditPermissionType(caze); } @Override - public EditPermissionType isEditAllowed(Case caze) { + public EditPermissionType getEditPermissionType(Case caze) { if (caze.getSormasToSormasOriginInfo() != null && !caze.getSormasToSormasOriginInfo().isOwnershipHandedOver()) { return EditPermissionType.REFUSED; @@ -1536,7 +1536,7 @@ public EditPermissionType isEditAllowed(Case caze) { return EditPermissionType.REFUSED; } - return super.isEditAllowed(caze); + return super.getEditPermissionType(caze); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java index 4b44c21ffa1..42557a1d220 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreAdoService.java @@ -165,7 +165,7 @@ public void dearchive(List entityUuids, String dearchiveReason) { }); } - public EditPermissionType isEditAllowed(ADO entity) { + public EditPermissionType getEditPermissionType(ADO entity) { if (entity.isArchived()) { return featureConfigurationFacade.isFeatureEnabled(FeatureType.EDIT_ARCHIVED_ENTITIES) ? EditPermissionType.ALLOWED @@ -174,4 +174,9 @@ public EditPermissionType isEditAllowed(ADO entity) { return EditPermissionType.ALLOWED; } + + public boolean isEditAllowed(ADO entity) { + return getEditPermissionType(entity) == EditPermissionType.ALLOWED; + } + } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java index 4e3e1538af5..d3173adb997 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractCoreFacadeEjb.java @@ -98,7 +98,7 @@ public List getAllAfter(Date date, Integer batchSize, String lastSynchroniz public DTO doSave(@Valid @NotNull DTO dto) { ADO existingAdo = dto.getUuid() != null ? service.getByUuid(dto.getUuid()) : null; - if (existingAdo != null && !service.isEditAllowed(existingAdo).equals(EditPermissionType.ALLOWED)) { + if (existingAdo != null && !service.isEditAllowed(existingAdo)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorEntityNotEditable)); } @@ -259,8 +259,13 @@ public Date calculateEndOfProcessingDate(String entityUuid) { return service.calculateEndOfProcessingDate(Collections.singletonList(entityUuid)).get(entityUuid); } - public EditPermissionType isEditAllowed(String uuid) { - ADO ado = service.getByUuid(uuid); - return service.isEditAllowed(ado); + @Override + public EditPermissionType getEditPermissionType(String uuid) { + return service.getEditPermissionType(service.getByUuid(uuid)); + } + + @Override + public boolean isEditAllowed(String uuid) { + return service.isEditAllowed(service.getByUuid(uuid)); } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java index eda91eb9dad..1edbd9c9742 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java @@ -361,7 +361,7 @@ public ContactDto save(ContactDto dto, boolean handleChanges, boolean handleCase final Contact existingContact = dto.getUuid() != null ? service.getByUuid(dto.getUuid()) : null; FacadeHelper.checkCreateAndEditRights(existingContact, userService, UserRight.CONTACT_CREATE, UserRight.CONTACT_EDIT); - if (internal && existingContact != null && !service.isEditAllowed(existingContact).equals(EditPermissionType.ALLOWED)) { + if (internal && existingContact != null && !service.isEditAllowed(existingContact)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorContactNotEditable)); } @@ -2193,7 +2193,7 @@ public int saveBulkContacts( for (String contactUuid : contactUuidlist) { Contact contact = service.getByUuid(contactUuid); - if (service.isEditAllowed(contact).equals(EditPermissionType.ALLOWED)) { + if (service.isEditAllowed(contact)) { ContactDto existingContactDto = toDto(contact); if (classificationChange) { existingContactDto.setContactClassification(updatedContactBulkEditData.getContactClassification()); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java index 39541f28cf4..18e1a21fa59 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java @@ -1577,7 +1577,7 @@ public Predicate inJurisdictionOrOwned(ContactQueryContext contactQueryContext, } @Override - public EditPermissionType isEditAllowed(Contact contact) { + public EditPermissionType getEditPermissionType(Contact contact) { if (contact.getSormasToSormasOriginInfo() != null && !contact.getSormasToSormasOriginInfo().isOwnershipHandedOver()) { return EditPermissionType.REFUSED; @@ -1587,7 +1587,7 @@ public EditPermissionType isEditAllowed(Contact contact) { return EditPermissionType.REFUSED; } - return super.isEditAllowed(contact); + return super.getEditPermissionType(contact); } public List> getJurisdictionSelections(ContactQueryContext qc) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index b5854316cc5..0b5a4fb465a 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -267,7 +267,7 @@ public EventDto save(@NotNull EventDto dto, boolean checkChangeDate, boolean int Event existingEvent = dto.getUuid() != null ? service.getByUuid(dto.getUuid()) : null; FacadeHelper.checkCreateAndEditRights(existingEvent, userService, UserRight.EVENT_CREATE, UserRight.EVENT_EDIT); - if (internal && existingEvent != null && !service.isEditAllowed(existingEvent).equals(EditPermissionType.ALLOWED)) { + if (internal && existingEvent != null && !service.isEditAllowed(existingEvent)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorEventNotEditable)); } @@ -1369,7 +1369,7 @@ public int saveBulkEvents( for (String evetUuid : eventUuidList) { Event event = service.getByUuid(evetUuid); - if (service.isEditAllowed(event).equals(EditPermissionType.ALLOWED)) { + if (service.isEditAllowed(event)) { EventDto eventDto = toDto(event); if (eventStatusChange) { eventDto.setEventStatus(updatedTempEvent.getEventStatus()); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java index 9057346a6af..5b19120ad3e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java @@ -335,7 +335,7 @@ public EventParticipantDto saveEventParticipant(@Valid EventParticipantDto dto, EventParticipant existingParticipant = dto.getUuid() != null ? service.getByUuid(dto.getUuid()) : null; FacadeHelper.checkCreateAndEditRights(existingParticipant, userService, UserRight.EVENTPARTICIPANT_CREATE, UserRight.EVENTPARTICIPANT_EDIT); - if (internal && existingParticipant != null && !service.isEditAllowed(existingParticipant).equals(EditPermissionType.ALLOWED)) { + if (internal && existingParticipant != null && !service.isEditAllowed(existingParticipant)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorEventParticipantNotEditable)); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java index ffa265fa2d3..3cc8d1c3f4b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java @@ -506,7 +506,7 @@ protected > T addChangeDates( } @Override - public EditPermissionType isEditAllowed(EventParticipant eventParticipant) { + public EditPermissionType getEditPermissionType(EventParticipant eventParticipant) { if (eventParticipant.getSormasToSormasOriginInfo() != null && !eventParticipant.getSormasToSormasOriginInfo().isOwnershipHandedOver()) { return EditPermissionType.REFUSED; @@ -516,7 +516,7 @@ public EditPermissionType isEditAllowed(EventParticipant eventParticipant) { return EditPermissionType.REFUSED; } - return super.isEditAllowed(eventParticipant); + return super.getEditPermissionType(eventParticipant); } public Collection getByPersonUuids(List personUuids) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java index c4ed5e8df4b..d6c119f0af5 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java @@ -999,7 +999,7 @@ public List getEventSummaryDetailsByContacts(List getPositiveOrLatest(SampleCriteria criteria, Function associatedObjectFn.apply(s).getUuid(), s -> s, (s1, s2) -> { - - // keep the positive one - if (s1.getPathogenTestResult() == PathogenTestResultType.POSITIVE) { - return s1; - } else if (s2.getPathogenTestResult() == PathogenTestResultType.POSITIVE) { - return s2; - } - - // ordered by creation date by default, so always keep the first one - return s1; - })) + .collect( + Collectors.toMap( + s -> associatedObjectFn.apply(s).getUuid(), + s -> s, + (s1, s2) -> { + + // keep the positive one + if (s1.getPathogenTestResult() == PathogenTestResultType.POSITIVE) { + return s1; + } else if (s2.getPathogenTestResult() == PathogenTestResultType.POSITIVE) { + return s2; + } + + // ordered by creation date by default, so always keep the first one + return s1; + })) .values() .stream() .map(s -> convertToDto(s, pseudonymizer)) @@ -1044,10 +1048,11 @@ public boolean isDeleted(String sampleUuid) { return count > 0; } - public Boolean isSampleEditAllowed(String sampleUuid) { + @Override + public Boolean isEditAllowed(String sampleUuid) { Sample sample = sampleService.getByUuid(sampleUuid); - return sampleService.isSampleEditAllowed(sample); + return sampleService.isEditAllowed(sample); } @RightsAllowed({ diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java index 2ae1f15aca1..883f0bee885 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java @@ -1094,7 +1094,8 @@ public Predicate createDefaultFilter(CriteriaBuilder cb, Root root) { return cb.isFalse(root.get(Sample.DELETED)); } - public Boolean isSampleEditAllowed(Sample sample) { + + public Boolean isEditAllowed(Sample sample) { if (sample.getSormasToSormasOriginInfo() != null && !sample.getSormasToSormasOriginInfo().isOwnershipHandedOver()) { return false; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java index ff1d1893a18..40826c62932 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java @@ -621,6 +621,9 @@ protected abstract void validateEntitiesBeforeShareInner( protected abstract ValidationErrorGroup buildEntityValidationGroupNameForAdo(ADO ado); + // todo all implementations only call the corresponding service.getEditAllowedType mehtod + // this can be implemented here. Inject service and call service method directly. Remove case/contact/event service + // from this class. protected abstract EditPermissionType isEntityEditAllowed(ADO ado); protected void validateEntitiesBeforeSend(List shares) throws SormasToSormasException { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java index 62cea8be536..33da87831c9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java @@ -156,7 +156,7 @@ protected ValidationErrorGroup buildEntityValidationGroupNameForAdo(Case caze) { @Override protected EditPermissionType isEntityEditAllowed(Case ado) { - return caseService.isEditAllowed(ado); + return caseService.getEditPermissionType(ado); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java index b70cf164de7..c1b0ce775f0 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java @@ -185,7 +185,7 @@ protected ValidationErrorGroup buildEntityValidationGroupNameForAdo(Contact cont @Override protected EditPermissionType isEntityEditAllowed(Contact contact) { - return contactService.isEditAllowed(contact); + return contactService.getEditPermissionType(contact); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java index 2b42e78ba74..3f28f9fedca 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java @@ -136,7 +136,7 @@ protected ValidationErrorGroup buildEntityValidationGroupNameForAdo(Event event) @Override protected EditPermissionType isEntityEditAllowed(Event event) { - return eventService.isEditAllowed(event); + return eventService.getEditPermissionType(event); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java index 1ad2ae5492e..2b10dedeb0c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java @@ -196,13 +196,13 @@ public List getAllByResultingCase(Case caze, boolean includeDeleted } @Override - public EditPermissionType isEditAllowed(TravelEntry travelEntry) { + public EditPermissionType getEditPermissionType(TravelEntry travelEntry) { if (!userService.hasRight(UserRight.TRAVEL_ENTRY_EDIT) || !inJurisdictionOrOwned(travelEntry)) { return EditPermissionType.REFUSED; } - return super.isEditAllowed(travelEntry); + return super.getEditPermissionType(travelEntry); } @Override diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEditRightsTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEditRightsTest.java index ee79f5dca6f..78ea1b87959 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEditRightsTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEditRightsTest.java @@ -103,8 +103,8 @@ public void testCanEditOwnedCase() { CaseDataDto ownedCase = createCase(rdcf2, districtUser2); CaseDataDto notOwnedCase = createCase(rdcf1, districtUser1); - assertThat(getCaseFacade().isEditAllowed(ownedCase.getUuid()), is(EditPermissionType.ALLOWED)); - assertThat(getCaseFacade().isEditAllowed(notOwnedCase.getUuid()), is(EditPermissionType.REFUSED)); + assertThat(getCaseFacade().getEditPermissionType(ownedCase.getUuid()), is(EditPermissionType.ALLOWED)); + assertThat(getCaseFacade().getEditPermissionType(notOwnedCase.getUuid()), is(EditPermissionType.REFUSED)); } @Test @@ -114,8 +114,8 @@ public void testCanEditCaseByPlaceOfStay() { CaseDataDto editableCase = createCase(rdcf1, districtUser1, rdcf2); CaseDataDto notEditableCase = createCase(rdcf1, districtUser1, rdcf1); - assertThat(getCaseFacade().isEditAllowed(editableCase.getUuid()), is(EditPermissionType.ALLOWED)); - assertThat(getCaseFacade().isEditAllowed(notEditableCase.getUuid()), is(EditPermissionType.REFUSED)); + assertThat(getCaseFacade().getEditPermissionType(editableCase.getUuid()), is(EditPermissionType.ALLOWED)); + assertThat(getCaseFacade().getEditPermissionType(notEditableCase.getUuid()), is(EditPermissionType.REFUSED)); } @Test @@ -125,8 +125,8 @@ public void testCanEditByResponsibleJurisdiction() { CaseDataDto editableCase = createCase(rdcf2, districtUser1); CaseDataDto notEditableCase = createCase(rdcf1, districtUser1); - assertThat(getCaseFacade().isEditAllowed(editableCase.getUuid()), is(EditPermissionType.ALLOWED)); - assertThat(getCaseFacade().isEditAllowed(notEditableCase.getUuid()), is(EditPermissionType.REFUSED)); + assertThat(getCaseFacade().getEditPermissionType(editableCase.getUuid()), is(EditPermissionType.ALLOWED)); + assertThat(getCaseFacade().getEditPermissionType(notEditableCase.getUuid()), is(EditPermissionType.REFUSED)); } @Test @@ -138,9 +138,9 @@ public void testCanEditResponsibleJurisdictionInRegion() { CaseDataDto editableCaseByJurisdiction = createCase(rdcf2, districtUser1); CaseDataDto notEditableCase = createCase(rdcf1, districtUser1, rdcf1); - assertThat(getCaseFacade().isEditAllowed(editableCaseByPlaceOfStay.getUuid()), is(EditPermissionType.ALLOWED)); - assertThat(getCaseFacade().isEditAllowed(editableCaseByJurisdiction.getUuid()), is(EditPermissionType.ALLOWED)); - assertThat(getCaseFacade().isEditAllowed(notEditableCase.getUuid()), is(EditPermissionType.REFUSED)); + assertThat(getCaseFacade().getEditPermissionType(editableCaseByPlaceOfStay.getUuid()), is(EditPermissionType.ALLOWED)); + assertThat(getCaseFacade().getEditPermissionType(editableCaseByJurisdiction.getUuid()), is(EditPermissionType.ALLOWED)); + assertThat(getCaseFacade().getEditPermissionType(notEditableCase.getUuid()), is(EditPermissionType.REFUSED)); } @Test @@ -152,9 +152,9 @@ public void testCanEditResponsibleJurisdictionInCommunity() { CaseDataDto editableCaseByJurisdiction = createCase(rdcf2, districtUser1); CaseDataDto notEditableCase = createCase(rdcf1, districtUser1, rdcf1); - assertThat(getCaseFacade().isEditAllowed(editableCaseByPlaceOfStay.getUuid()), is(EditPermissionType.ALLOWED)); - assertThat(getCaseFacade().isEditAllowed(editableCaseByJurisdiction.getUuid()), is(EditPermissionType.ALLOWED)); - assertThat(getCaseFacade().isEditAllowed(notEditableCase.getUuid()), is(EditPermissionType.REFUSED)); + assertThat(getCaseFacade().getEditPermissionType(editableCaseByPlaceOfStay.getUuid()), is(EditPermissionType.ALLOWED)); + assertThat(getCaseFacade().getEditPermissionType(editableCaseByJurisdiction.getUuid()), is(EditPermissionType.ALLOWED)); + assertThat(getCaseFacade().getEditPermissionType(notEditableCase.getUuid()), is(EditPermissionType.REFUSED)); } @Test @@ -166,9 +166,9 @@ public void testCanEditResponsibleJurisdictionInFacility() { CaseDataDto notEditableCaseByJurisdiction = createCase(rdcf1, districtUser1); CaseDataDto notEditableCase = createCase(rdcf1, districtUser1, rdcf1); - assertThat(getCaseFacade().isEditAllowed(editableCaseByPlaceOfStay.getUuid()), is(EditPermissionType.ALLOWED)); - assertThat(getCaseFacade().isEditAllowed(notEditableCaseByJurisdiction.getUuid()), is(EditPermissionType.REFUSED)); - assertThat(getCaseFacade().isEditAllowed(notEditableCase.getUuid()), is(EditPermissionType.REFUSED)); + assertThat(getCaseFacade().getEditPermissionType(editableCaseByPlaceOfStay.getUuid()), is(EditPermissionType.ALLOWED)); + assertThat(getCaseFacade().getEditPermissionType(notEditableCaseByJurisdiction.getUuid()), is(EditPermissionType.REFUSED)); + assertThat(getCaseFacade().getEditPermissionType(notEditableCase.getUuid()), is(EditPermissionType.REFUSED)); } private CaseDataDto createCase(TestDataCreator.RDCF responsibleRdcf, UserDto reportingUser) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java index ebfe40151d2..2f6d91133bf 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java @@ -68,7 +68,4 @@ protected String getRootViewName() { return ROOT_VIEW_NAME; } - protected boolean isCampaignEditAllowed() { - return FacadeProvider.getCampaignFacade().isCampaignEditAllowed(getReference().getUuid()).equals(EditPermissionType.ALLOWED); - } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigns/CampaignView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigns/CampaignView.java index b1ff15f8919..e9945cd2442 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigns/CampaignView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigns/CampaignView.java @@ -76,7 +76,7 @@ protected void initView(String params) { getViewTitleLabel().setValue(campaignDto.getName()); - EditPermissionType campaignEditAllowed = FacadeProvider.getCampaignFacade().isCampaignEditAllowed(campaignDto.getUuid()); + EditPermissionType campaignEditAllowed = FacadeProvider.getCampaignFacade().getEditPermissionType(campaignDto.getUuid()); if (campaignEditAllowed.equals(EditPermissionType.ARCHIVING_STATUS_ONLY)) { editComponent.setEditable(false, ArchivingController.ARCHIVE_DEARCHIVE_BUTTON_ID); @@ -85,10 +85,6 @@ protected void initView(String params) { } } - protected boolean isCampaignEditAllowed() { - return FacadeProvider.getCampaignFacade().isCampaignEditAllowed(getReference().getUuid()).equals(EditPermissionType.ALLOWED); - } - @Override public void refreshMenu(SubMenu menu, String params) { if (!findReferenceByParams(params)) { @@ -104,7 +100,7 @@ protected void setSubComponent(DirtyStateComponent newComponent) { super.setSubComponent(newComponent); CampaignDto campaignDto = FacadeProvider.getCampaignFacade().getByUuid(getReference().getUuid()); - if(campaignDto.isDeleted()){ + if (campaignDto.isDeleted()) { newComponent.setEnabled(false); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java index e5af39e5c38..7e33a0cd705 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java @@ -25,7 +25,6 @@ import com.vaadin.v7.ui.OptionGroup; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseOrigin; @@ -47,7 +46,7 @@ import de.symeda.sormas.ui.externalmessage.ExternalMessagesView; import de.symeda.sormas.ui.hospitalization.HospitalizationView; import de.symeda.sormas.ui.therapy.TherapyView; -import de.symeda.sormas.ui.utils.AbstractDetailView; +import de.symeda.sormas.ui.utils.AbstractEditAllowedDetailView; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.DirtyStateComponent; import de.symeda.sormas.ui.utils.ExternalJournalUtil; @@ -55,7 +54,7 @@ import de.symeda.sormas.ui.utils.ViewMode; @SuppressWarnings("serial") -public abstract class AbstractCaseView extends AbstractDetailView { +public abstract class AbstractCaseView extends AbstractEditAllowedDetailView { public static final String VIEW_MODE_URL_PREFIX = "v"; @@ -70,7 +69,7 @@ public abstract class AbstractCaseView extends AbstractDetailView { +public abstract class AbstractContactView extends AbstractEditAllowedDetailView { public static final String ROOT_VIEW_NAME = ContactsView.VIEW_NAME; protected AbstractContactView(String viewName) { - super(viewName); + super(viewName, FacadeProvider.getContactFacade()); } @Override @@ -140,12 +142,8 @@ public ContactReferenceDto getContactRef() { } public void setContactEditPermission(Component component) { - if (!isContactEditAllowed()) { + if (!isEditAllowed()) { getComponent(getComponentIndex(component)).setEnabled(false); } } - - protected boolean isContactEditAllowed() { - return FacadeProvider.getContactFacade().isEditAllowed(getContactRef().getUuid()).equals(EditPermissionType.ALLOWED); - } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java index 6108ac615ae..c9803376358 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java @@ -270,7 +270,7 @@ protected void initView(String params) { QuarantineOrderDocumentsComponent.addComponentToLayout(layout.getSidePanelComponent(), contactDto, documentList); - EditPermissionType contactEditAllowed = FacadeProvider.getContactFacade().isEditAllowed(contactDto.getUuid()); + EditPermissionType contactEditAllowed = FacadeProvider.getContactFacade().getEditPermissionType(contactDto.getUuid()); if (contactEditAllowed.equals(EditPermissionType.ARCHIVING_STATUS_ONLY)) { layout.disable(ArchivingController.ARCHIVE_DEARCHIVE_BUTTON_ID); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/AbstractEventView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/AbstractEventView.java index 0c737a63c9c..59c15791cdc 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/AbstractEventView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/AbstractEventView.java @@ -20,6 +20,7 @@ import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.Component; +import de.symeda.sormas.api.CoreFacade; import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.event.EventDto; @@ -29,15 +30,16 @@ import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.SubMenu; import de.symeda.sormas.ui.utils.AbstractDetailView; +import de.symeda.sormas.ui.utils.AbstractEditAllowedDetailView; import de.symeda.sormas.ui.utils.DirtyStateComponent; @SuppressWarnings("serial") -public abstract class AbstractEventView extends AbstractDetailView { +public abstract class AbstractEventView extends AbstractEditAllowedDetailView { public static final String ROOT_VIEW_NAME = EventsView.VIEW_NAME; protected AbstractEventView(String viewName) { - super(viewName); + super(viewName, FacadeProvider.getEventFacade()); } @Override @@ -90,15 +92,11 @@ protected void setSubComponent(DirtyStateComponent newComponent) { } public void setEventEditPermission(Component component) { - if (!isEventEditAllowed()) { + if (!isEditAllowed()) { component.setEnabled(false); } } - protected boolean isEventEditAllowed() { - return FacadeProvider.getEventFacade().isEditAllowed(getEventRef().getUuid()).equals(EditPermissionType.ALLOWED); - } - protected boolean isEventDeleted() { return FacadeProvider.getEventFacade().isDeleted(getEventRef().getUuid()); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsView.java index db13ef7a316..c241a2eaa31 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsView.java @@ -118,7 +118,7 @@ protected void initView(String params) { listLayout.addComponent(list); listLayout.setExpandRatio(list, 1); setSubComponent(listLayout); - listLayout.setEnabled(isEventEditAllowed() && !isEventDeleted()); + listLayout.setEnabled(isEditAllowed() && !isEventDeleted()); } updateFilterComponents(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java index a28bc6e6073..9a0a69ba598 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java @@ -207,7 +207,7 @@ protected void initView(String params) { layout.setEnabled(false); } - EditPermissionType eventEditAllowed = FacadeProvider.getEventFacade().isEditAllowed(event.getUuid()); + EditPermissionType eventEditAllowed = FacadeProvider.getEventFacade().getEditPermissionType(event.getUuid()); if (eventEditAllowed == EditPermissionType.ARCHIVING_STATUS_ONLY) { layout.disable(ArchivingController.ARCHIVE_DEARCHIVE_BUTTON_ID); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java index 05d4ee41150..a26b79c0c7d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantDataView.java @@ -210,7 +210,7 @@ protected void initView(String params) { } } - EditPermissionType eventParticipantEditAllowed = FacadeProvider.getEventParticipantFacade().isEditAllowed(eventParticipantRef.getUuid()); + EditPermissionType eventParticipantEditAllowed = FacadeProvider.getEventParticipantFacade().getEditPermissionType(eventParticipantRef.getUuid()); if (eventParticipantEditAllowed.equals(EditPermissionType.ARCHIVING_STATUS_ONLY)) { layout.disable(ArchivingController.ARCHIVE_DEARCHIVE_BUTTON_ID); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java index f0ce2cb53bc..4d3929a200e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java @@ -311,8 +311,7 @@ protected void initView(String params) { gridLayout.setStyleName("crud-main-layout"); grid.getDataProvider().addDataProviderListener(e -> updateStatusButtons()); setSubComponent(gridLayout); - gridLayout - .setEnabled(!isEventDeleted() && isEventEditAllowed() && UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_EDIT)); + gridLayout.setEnabled(!isEventDeleted() && isEditAllowed() && UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_EDIT)); } if (params.startsWith("?")) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/AbstractImmunizationView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/AbstractImmunizationView.java index 01f68dbc497..88cbc0b5342 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/AbstractImmunizationView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/AbstractImmunizationView.java @@ -3,6 +3,7 @@ import com.vaadin.navigator.ViewChangeListener; import com.vaadin.ui.Component; +import de.symeda.sormas.api.CoreFacade; import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.i18n.Captions; @@ -12,14 +13,15 @@ import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.SubMenu; import de.symeda.sormas.ui.utils.AbstractDetailView; +import de.symeda.sormas.ui.utils.AbstractEditAllowedDetailView; import de.symeda.sormas.ui.utils.DirtyStateComponent; -public class AbstractImmunizationView extends AbstractDetailView { +public abstract class AbstractImmunizationView extends AbstractEditAllowedDetailView { public static final String ROOT_VIEW_NAME = ImmunizationsView.VIEW_NAME; protected AbstractImmunizationView(String viewName) { - super(viewName); + super(viewName, FacadeProvider.getImmunizationFacade()); } @Override @@ -65,21 +67,17 @@ public void refreshMenu(SubMenu menu, String params) { } public void setImmunizationEditPermission(Component component) { - if (!isImmunizationEditAllowed()) { + if (!isEditAllowed()) { component.setEnabled(false); } } - protected boolean isImmunizationEditAllowed() { - return FacadeProvider.getImmunizationFacade().isEditAllowed(getReference().getUuid()).equals(EditPermissionType.ALLOWED); - } - @Override protected void setSubComponent(DirtyStateComponent newComponent) { super.setSubComponent(newComponent); ImmunizationDto dto = FacadeProvider.getImmunizationFacade().getByUuid(getReference().getUuid()); - if (dto.isDeleted()){ + if (dto.isDeleted()) { newComponent.setEnabled(false); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationDataView.java index 622a79b088b..b0bada583e8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationDataView.java @@ -61,7 +61,7 @@ protected void initView(String params) { layout.addComponent(sormasToSormasLocLayout, SORMAS_TO_SORMAS_LOC); } - EditPermissionType immunizationEditAllowed = FacadeProvider.getImmunizationFacade().isEditAllowed(immunization.getUuid()); + EditPermissionType immunizationEditAllowed = FacadeProvider.getImmunizationFacade().getEditPermissionType(immunization.getUuid()); if (immunizationEditAllowed.equals(EditPermissionType.ARCHIVING_STATUS_ONLY)) { layout.disable(ArchivingController.ARCHIVE_DEARCHIVE_BUTTON_ID); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java index 5e7b8b8dda7..43c0dc97441 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java @@ -118,15 +118,15 @@ protected void setSubComponent(DirtyStateComponent newComponent) { public void setSampleEditPermission(Component component) { - Boolean isSampleEditAllowed = isSampleEditAllowed(); - - if (!isSampleEditAllowed) { + Boolean isSampleEditAllowed = isEditAllowed(); + if (Boolean.FALSE.equals(isSampleEditAllowed)) { component.setEnabled(false); } } - protected Boolean isSampleEditAllowed() { - return FacadeProvider.getSampleFacade().isSampleEditAllowed(getSampleRef().getUuid()); + protected Boolean isEditAllowed() { + // Sample is not a Core + return FacadeProvider.getSampleFacade().isEditAllowed(getSampleRef().getUuid()); } public SampleReferenceDto getSampleRef() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/AbstractTravelEntryView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/AbstractTravelEntryView.java index 9c31cdfa722..58f7fd61c68 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/AbstractTravelEntryView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/AbstractTravelEntryView.java @@ -6,7 +6,6 @@ import com.vaadin.navigator.ViewChangeListener; import com.vaadin.ui.Component; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -17,15 +16,15 @@ import de.symeda.sormas.api.travelentry.TravelEntryReferenceDto; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.SubMenu; -import de.symeda.sormas.ui.utils.AbstractDetailView; +import de.symeda.sormas.ui.utils.AbstractEditAllowedDetailView; import de.symeda.sormas.ui.utils.DirtyStateComponent; -public abstract class AbstractTravelEntryView extends AbstractDetailView { +public abstract class AbstractTravelEntryView extends AbstractEditAllowedDetailView { public static final String ROOT_VIEW_NAME = TravelEntriesView.VIEW_NAME; protected AbstractTravelEntryView(String viewName) { - super(viewName); + super(viewName, FacadeProvider.getTravelEntryFacade()); } @Override @@ -59,16 +58,11 @@ public TravelEntryReferenceDto getTravelEntryRef() { } public void setTravelEntryEditPermission(Component component) { - boolean isTravelEntryEditAllowed = isTravelEntryEditAllowed(); - - if (!isTravelEntryEditAllowed) { + if (!isEditAllowed()) { component.setEnabled(false); } } - protected Boolean isTravelEntryEditAllowed() { - return FacadeProvider.getTravelEntryFacade().isEditAllowed(getReference().getUuid()).equals(EditPermissionType.ALLOWED); - } @Override protected void setSubComponent(DirtyStateComponent newComponent) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java index c78d0c69e62..f693c5811c4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java @@ -93,7 +93,7 @@ protected void initView(String params) { layout.addSidePanelComponent(taskList, TASKS_LOC); } - EditPermissionType travelEntryEditAllowed = FacadeProvider.getTravelEntryFacade().isEditAllowed(travelEntryDto.getUuid()); + EditPermissionType travelEntryEditAllowed = FacadeProvider.getTravelEntryFacade().getEditPermissionType(travelEntryDto.getUuid()); if (travelEntryEditAllowed.equals(EditPermissionType.ARCHIVING_STATUS_ONLY)) { layout.disable(ArchivingController.ARCHIVE_DEARCHIVE_BUTTON_ID); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractDetailView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractDetailView.java index e2951d1c35d..cfb56c48340 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractDetailView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractDetailView.java @@ -115,4 +115,5 @@ protected R getReference() { * The URL parameters String */ protected abstract void initView(String params); + } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditAllowedDetailView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditAllowedDetailView.java new file mode 100644 index 00000000000..791a041f77b --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditAllowedDetailView.java @@ -0,0 +1,20 @@ +package de.symeda.sormas.ui.utils; + +import de.symeda.sormas.api.CoreFacade; +import de.symeda.sormas.api.ReferenceDto; + +public abstract class AbstractEditAllowedDetailView extends AbstractDetailView { + + private R reference; + private CoreFacade coreFacade; + + protected AbstractEditAllowedDetailView(String viewName, CoreFacade coreFacade) { + super(viewName); + this.coreFacade = coreFacade; + } + + protected boolean isEditAllowed() { + String uuid = getReference().getUuid(); + return coreFacade.isEditAllowed(uuid); + } +} From 42c20a903b6d49827278fb0490a27302ba20294f Mon Sep 17 00:00:00 2001 From: Jonas Cirotzki Date: Sun, 28 Aug 2022 14:55:37 +0200 Subject: [PATCH 04/45] [#9693] wire up campaign view --- .../java/de/symeda/sormas/api/campaign/CampaignFacade.java | 1 - .../java/de/symeda/sormas/api/sample/SampleFacade.java | 3 +-- .../de/symeda/sormas/backend/contact/ContactService.java | 2 +- .../ui/campaign/campaigndata/AbstractCampaignDataView.java | 7 +++---- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignFacade.java index 0d8363a623d..959c95a394a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignFacade.java @@ -5,7 +5,6 @@ import javax.ejb.Remote; import de.symeda.sormas.api.CoreFacade; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.campaign.diagram.CampaignDashboardElement; @Remote diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java index 09de3b0afd0..02d9cf22621 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java @@ -77,8 +77,7 @@ public interface SampleFacade { List getByCaseUuids(List caseUuids); - // todo we might be able to reuse - Boolean isEditAllowed(String sampleUuid); + Boolean isSampleEditAllowed(String sampleUuid); List getByContactUuids(List contactUuids); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java index 18e1a21fa59..1b1670d2335 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java @@ -1564,7 +1564,7 @@ public ContactJurisdictionFlagsDto inJurisdictionOrOwned(Contact contact) { CriteriaQuery cq = cb.createQuery(ContactJurisdictionFlagsDto.class); Root root = cq.from(Contact.class); cq.multiselect(getJurisdictionSelections(new ContactQueryContext(cb, cq, root))); - cq.where(cb.equal(root.get(AbstractDomainObject.UUID), contact.getUuid())); + cq.where(cb.equal(root.get(Contact.UUID), contact.getUuid())); return em.createQuery(cq).getSingleResult(); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java index 2f6d91133bf..bfd66e0b82c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java @@ -17,22 +17,21 @@ import com.vaadin.navigator.ViewChangeListener; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.campaign.data.CampaignFormDataReferenceDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.ui.SubMenu; -import de.symeda.sormas.ui.utils.AbstractDetailView; +import de.symeda.sormas.ui.utils.AbstractEditAllowedDetailView; -public abstract class AbstractCampaignDataView extends AbstractDetailView { +public abstract class AbstractCampaignDataView extends AbstractEditAllowedDetailView { private static final long serialVersionUID = 4919695277077799182L; public static final String ROOT_VIEW_NAME = CampaignDataView.VIEW_NAME; protected AbstractCampaignDataView(String viewName) { - super(viewName); + super(viewName, FacadeProvider.getCampaignFacade()); } @Override From f838423db8578a654ed75a35b628eda2e14ba60a Mon Sep 17 00:00:00 2001 From: Jonas Cirotzki Date: Sun, 28 Aug 2022 15:09:56 +0200 Subject: [PATCH 05/45] [#9693] fix sample facade --- .../main/java/de/symeda/sormas/api/sample/SampleFacade.java | 2 +- .../de/symeda/sormas/backend/sample/SampleFacadeEjb.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java index 02d9cf22621..22c96ccd28e 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java @@ -77,7 +77,7 @@ public interface SampleFacade { List getByCaseUuids(List caseUuids); - Boolean isSampleEditAllowed(String sampleUuid); + Boolean isEditAllowed(String uuid); List getByContactUuids(List contactUuids); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java index 46d0f9f4b92..df760b67167 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java @@ -1049,9 +1049,8 @@ public boolean isDeleted(String sampleUuid) { } @Override - public Boolean isEditAllowed(String sampleUuid) { - Sample sample = sampleService.getByUuid(sampleUuid); - + public Boolean isEditAllowed(String uuid) { + Sample sample = sampleService.getByUuid(uuid); return sampleService.isEditAllowed(sample); } From f2b4a8d3b18c12d9d26032a6046f5ef7b6bef8f0 Mon Sep 17 00:00:00 2001 From: Jonas Cirotzki Date: Sun, 28 Aug 2022 15:53:36 +0200 Subject: [PATCH 06/45] [#9693] unify usage of edit checks in S2S --- .../AbstractSormasToSormasInterface.java | 74 +++++++++---------- .../caze/SormasToSormasCaseFacadeEjb.java | 10 +-- .../SormasToSormasContactFacadeEjb.java | 10 +-- .../event/SormasToSormasEventFacadeEjb.java | 10 +-- 4 files changed, 40 insertions(+), 64 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java index 40826c62932..ff81c34120f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java @@ -36,12 +36,10 @@ import javax.transaction.Transactional; import javax.validation.Valid; -import ca.uhn.fhir.rest.gclient.IFetchConformanceTyped; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.event.EventDto; @@ -79,9 +77,9 @@ import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.caze.CaseService; -import de.symeda.sormas.backend.common.AbstractDomainObject; -import de.symeda.sormas.backend.common.BaseAdoService; +import de.symeda.sormas.backend.common.AbstractCoreAdoService; import de.symeda.sormas.backend.common.ConfigFacadeEjb; +import de.symeda.sormas.backend.common.CoreAdo; import de.symeda.sormas.backend.contact.Contact; import de.symeda.sormas.backend.contact.ContactService; import de.symeda.sormas.backend.event.Event; @@ -122,7 +120,7 @@ import de.symeda.sormas.backend.user.UserService; import de.symeda.sormas.backend.util.RightsAllowed; -public abstract class AbstractSormasToSormasInterface> +public abstract class AbstractSormasToSormasInterface> implements SormasToSormasEntityInterface { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractSormasToSormasInterface.class); @@ -377,12 +375,10 @@ private void shareEntities(List entityUuids, SormasToSormasOptionsDto op @RightsAllowed(UserRight._SORMAS_TO_SORMAS_CLIENT) public SormasToSormasEncryptedDataDto saveSharedEntities(SormasToSormasEncryptedDataDto encryptedData) throws SormasToSormasException, SormasToSormasValidationException { - decryptAndPersist( - encryptedData, - (data, existingData) -> { - originInfoFacade.saveOriginInfo(data.getOriginInfo()); - processedEntitiesPersister.persistSharedData(data, data.getOriginInfo(), existingData); - }); + decryptAndPersist(encryptedData, (data, existingData) -> { + originInfoFacade.saveOriginInfo(data.getOriginInfo()); + processedEntitiesPersister.persistSharedData(data, data.getOriginInfo(), existingData); + }); return sormasToSormasEncryptionEjb .signAndEncrypt(new ShareRequestAcceptData(null, configFacadeEjb.getS2SConfig().getDistrictExternalId()), encryptedData.getSenderId()); @@ -393,29 +389,32 @@ public SormasToSormasEncryptedDataDto saveSharedEntities(SormasToSormasEncrypted public void syncShares(ShareTreeCriteria criteria) { User currentUser = userService.getCurrentUser(); - walkShareTree(criteria, (entity, originInfo, parentCriteria) -> { - // prevent stopping the iteration through the shares because of a failed sync operation - // sync with as much servers as possible - try { - syncEntityToOrigin(entity, originInfo, parentCriteria); - } catch (Exception e) { - LOGGER.error("Failed to sync to [{}]", originInfo.getOrganizationId(), e); - } - }, ((entity, shareInfo, reShareCriteria, noForward) -> { - // prevent stopping the iteration through the shares because of a failed sync operation - // sync with as much servers as possible - try { - if (!noForward) { - ShareRequestInfo latestRequestInfo = ShareInfoHelper.getLatestAcceptedRequest(shareInfo.getRequests().stream()).orElse(null); - syncEntityToShares(entity, latestRequestInfo, reShareCriteria, currentUser); - } else { - ShareRequestInfo latestRequestInfo = ShareInfoHelper.getLatestRequest(shareInfo.getRequests().stream()).orElse(null); - updateShareRequestInfo(latestRequestInfo, currentUser, entity); + walkShareTree( + criteria, + (entity, originInfo, parentCriteria) -> { + // prevent stopping the iteration through the shares because of a failed sync operation + // sync with as much servers as possible + try { + syncEntityToOrigin(entity, originInfo, parentCriteria); + } catch (Exception e) { + LOGGER.error("Failed to sync to [{}]", originInfo.getOrganizationId(), e); } - } catch (Exception e) { - LOGGER.error("Failed to sync to [{}]", shareInfo.getOrganizationId(), e); - } - })); + }, + ((entity, shareInfo, reShareCriteria, noForward) -> { + // prevent stopping the iteration through the shares because of a failed sync operation + // sync with as much servers as possible + try { + if (!noForward) { + ShareRequestInfo latestRequestInfo = ShareInfoHelper.getLatestAcceptedRequest(shareInfo.getRequests().stream()).orElse(null); + syncEntityToShares(entity, latestRequestInfo, reShareCriteria, currentUser); + } else { + ShareRequestInfo latestRequestInfo = ShareInfoHelper.getLatestRequest(shareInfo.getRequests().stream()).orElse(null); + updateShareRequestInfo(latestRequestInfo, currentUser, entity); + } + } catch (Exception e) { + LOGGER.error("Failed to sync to [{}]", shareInfo.getOrganizationId(), e); + } + })); } @Override @@ -563,7 +562,7 @@ private ValidationErrorGroup buildEntityValidationGroupName(String uuid) { return buildValidationGroupName(entityCaptionTag, uuid); } - protected abstract BaseAdoService getEntityService(); + protected abstract AbstractCoreAdoService getEntityService(); protected abstract Class getShareDataClass(); @@ -576,7 +575,7 @@ protected void validateEntitiesBeforeShare( List validationErrors = new ArrayList<>(); for (ADO ado : entities) { - if (!isEntityEditAllowed(ado).equals(EditPermissionType.ALLOWED)) { + if (!getEntityService().isEditAllowed(ado)) { validationErrors.add( new ValidationErrors( buildEntityValidationGroupNameForAdo(ado), @@ -621,11 +620,6 @@ protected abstract void validateEntitiesBeforeShareInner( protected abstract ValidationErrorGroup buildEntityValidationGroupNameForAdo(ADO ado); - // todo all implementations only call the corresponding service.getEditAllowedType mehtod - // this can be implemented here. Inject service and call service method directly. Remove case/contact/event service - // from this class. - protected abstract EditPermissionType isEntityEditAllowed(ADO ado); - protected void validateEntitiesBeforeSend(List shares) throws SormasToSormasException { validateEntitiesBeforeShare( shares.stream().map(this::extractFromShareInfo).filter(Objects::nonNull).collect(Collectors.toList()), diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java index 33da87831c9..b35dea756fc 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java @@ -32,7 +32,6 @@ import javax.ejb.LocalBean; import javax.ejb.Stateless; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.contact.ContactCriteria; @@ -56,7 +55,7 @@ import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.caze.CaseService; -import de.symeda.sormas.backend.common.BaseAdoService; +import de.symeda.sormas.backend.common.AbstractCoreAdoService; import de.symeda.sormas.backend.contact.Contact; import de.symeda.sormas.backend.contact.ContactService; import de.symeda.sormas.backend.immunization.ImmunizationService; @@ -119,7 +118,7 @@ public void share(List entityUuids, SormasToSormasOptionsDto options) th } @Override - protected BaseAdoService getEntityService() { + protected AbstractCoreAdoService getEntityService() { return caseService; } @@ -154,11 +153,6 @@ protected ValidationErrorGroup buildEntityValidationGroupNameForAdo(Case caze) { return buildCaseValidationGroupName(caze); } - @Override - protected EditPermissionType isEntityEditAllowed(Case ado) { - return caseService.getEditPermissionType(ado); - } - @Override protected Case extractFromShareInfo(SormasToSormasShareInfo shareInfo) { return shareInfo.getCaze(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java index c1b0ce775f0..33c7d9e34f7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java @@ -31,7 +31,6 @@ import javax.ejb.LocalBean; import javax.ejb.Stateless; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -52,7 +51,7 @@ import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.AccessDeniedException; import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; -import de.symeda.sormas.backend.common.BaseAdoService; +import de.symeda.sormas.backend.common.AbstractCoreAdoService; import de.symeda.sormas.backend.contact.Contact; import de.symeda.sormas.backend.contact.ContactService; import de.symeda.sormas.backend.immunization.ImmunizationService; @@ -117,7 +116,7 @@ public void share(List entityUuids, SormasToSormasOptionsDto options) th } @Override - protected BaseAdoService getEntityService() { + protected AbstractCoreAdoService getEntityService() { return contactService; } @@ -183,11 +182,6 @@ protected ValidationErrorGroup buildEntityValidationGroupNameForAdo(Contact cont return buildContactValidationGroupName(contact); } - @Override - protected EditPermissionType isEntityEditAllowed(Contact contact) { - return contactService.getEditPermissionType(contact); - } - @Override protected Contact extractFromShareInfo(SormasToSormasShareInfo shareInfo) { return shareInfo.getContact(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java index 3f28f9fedca..0c7a30a8abd 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java @@ -31,7 +31,6 @@ import javax.ejb.LocalBean; import javax.ejb.Stateless; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -47,7 +46,7 @@ import de.symeda.sormas.api.sormastosormas.validation.ValidationErrors; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.AccessDeniedException; -import de.symeda.sormas.backend.common.BaseAdoService; +import de.symeda.sormas.backend.common.AbstractCoreAdoService; import de.symeda.sormas.backend.event.Event; import de.symeda.sormas.backend.event.EventParticipant; import de.symeda.sormas.backend.event.EventParticipantService; @@ -134,11 +133,6 @@ protected ValidationErrorGroup buildEntityValidationGroupNameForAdo(Event event) return buildEventValidationGroupName(event); } - @Override - protected EditPermissionType isEntityEditAllowed(Event event) { - return eventService.getEditPermissionType(event); - } - @Override protected Event extractFromShareInfo(SormasToSormasShareInfo shareInfo) { return shareInfo.getEvent(); @@ -214,7 +208,7 @@ protected List getOrCreateShareInfos(Event event, Sorma } @Override - protected BaseAdoService getEntityService() { + protected AbstractCoreAdoService getEntityService() { return eventService; } From a245d0989ed8f8769adcb50350f77a54e687969b Mon Sep 17 00:00:00 2001 From: Jonas Cirotzki Date: Sun, 28 Aug 2022 15:54:05 +0200 Subject: [PATCH 07/45] [#9693] unify edit checks --- .../symeda/sormas/ui/caze/AbstractCaseView.java | 7 ------- .../symeda/sormas/ui/caze/CaseContactsView.java | 2 +- .../de/symeda/sormas/ui/caze/CasePersonView.java | 2 +- .../symeda/sormas/ui/caze/CaseSymptomsView.java | 2 +- .../de/symeda/sormas/ui/caze/CaseVisitsView.java | 2 +- .../maternalhistory/MaternalHistoryView.java | 2 +- .../caze/porthealthinfo/PortHealthInfoView.java | 2 +- .../ui/clinicalcourse/ClinicalCourseView.java | 2 +- .../sormas/ui/contact/AbstractContactView.java | 6 +----- .../sormas/ui/contact/ContactPersonView.java | 2 +- .../sormas/ui/contact/ContactVisitsView.java | 2 +- .../sormas/ui/epidata/CaseEpiDataView.java | 2 +- .../sormas/ui/epidata/ContactEpiDataView.java | 2 +- .../sormas/ui/events/AbstractEventView.java | 10 ---------- .../ui/hospitalization/HospitalizationView.java | 2 +- .../immunization/AbstractImmunizationView.java | 10 ---------- .../ui/immunization/ImmunizationPersonView.java | 2 +- .../sormas/ui/samples/AbstractSampleView.java | 2 +- .../de/symeda/sormas/ui/therapy/TherapyView.java | 2 +- .../ui/travelentry/AbstractTravelEntryView.java | 8 -------- .../ui/travelentry/TravelEntryPersonView.java | 2 +- .../ui/utils/AbstractEditAllowedDetailView.java | 16 +++++++++++++++- 22 files changed, 32 insertions(+), 57 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java index 7e33a0cd705..f4455c5a5da 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java @@ -18,7 +18,6 @@ package de.symeda.sormas.ui.caze; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; -import com.vaadin.ui.Component; import com.vaadin.ui.UI; import com.vaadin.ui.themes.ValoTheme; import com.vaadin.v7.data.Property; @@ -282,10 +281,4 @@ public ViewMode getViewMode() { return viewConfiguration.getViewMode(); } - - public void setCaseEditPermission(Component component) { - if (!isEditAllowed()) { - component.setEnabled(false); - } - } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java index ec7e133dabc..e71e16b6d12 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java @@ -394,7 +394,7 @@ protected void initView(String params) { updateFilterComponents(); grid.reload(); - setCaseEditPermission(gridLayout); + setEditPermission(gridLayout); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePersonView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePersonView.java index 36c0d4ac73a..e6f6190c3bf 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePersonView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasePersonView.java @@ -48,6 +48,6 @@ protected void initView(String params) { getViewMode()); setSubComponent(personEditComponent); - setCaseEditPermission(personEditComponent); + setEditPermission(personEditComponent); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseSymptomsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseSymptomsView.java index 99799db222f..7de9b87bdd8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseSymptomsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseSymptomsView.java @@ -37,6 +37,6 @@ protected void initView(String params) { CommitDiscardWrapperComponent caseSymptomsComponent = ControllerProvider.getCaseController().getSymptomsEditComponent(getCaseRef().getUuid(), getViewMode()); setSubComponent(caseSymptomsComponent); - setCaseEditPermission(caseSymptomsComponent); + setEditPermission(caseSymptomsComponent); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseVisitsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseVisitsView.java index 0150a1b5616..a0bf6792cee 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseVisitsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseVisitsView.java @@ -160,6 +160,6 @@ protected void initView(String params) { grid.reload(); - setCaseEditPermission(gridLayout); + setEditPermission(gridLayout); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/maternalhistory/MaternalHistoryView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/maternalhistory/MaternalHistoryView.java index 90b30764cea..53bf2dad9a6 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/maternalhistory/MaternalHistoryView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/maternalhistory/MaternalHistoryView.java @@ -37,6 +37,6 @@ protected void initView(String params) { ControllerProvider.getCaseController().getMaternalHistoryComponent(getCaseRef().getUuid(), getViewMode()); setSubComponent(maternalHistoryComponent); - setCaseEditPermission(maternalHistoryComponent); + setEditPermission(maternalHistoryComponent); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/porthealthinfo/PortHealthInfoView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/porthealthinfo/PortHealthInfoView.java index aa729eaf50a..a1d445a4631 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/porthealthinfo/PortHealthInfoView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/porthealthinfo/PortHealthInfoView.java @@ -37,6 +37,6 @@ protected void initView(String params) { ControllerProvider.getCaseController().getPortHealthInfoComponent(getCaseRef().getUuid()); setSubComponent(portHealthInfoComponent); - setCaseEditPermission(portHealthInfoComponent); + setEditPermission(portHealthInfoComponent); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalCourseView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalCourseView.java index f424d0cd310..2559f2ca7d1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalCourseView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/ClinicalCourseView.java @@ -154,6 +154,6 @@ protected void initView(String params) { update(); reloadClinicalVisitGrid(); - setCaseEditPermission(container); + setEditPermission(container); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactView.java index b504fda7683..7ab677e5f7b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactView.java @@ -23,8 +23,6 @@ import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.Component; -import de.symeda.sormas.api.CoreFacade; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.contact.ContactDto; @@ -42,12 +40,10 @@ import de.symeda.sormas.ui.caze.CaseContactsView; import de.symeda.sormas.ui.epidata.ContactEpiDataView; import de.symeda.sormas.ui.externalmessage.ExternalMessagesView; -import de.symeda.sormas.ui.utils.AbstractDetailView; import de.symeda.sormas.ui.utils.AbstractEditAllowedDetailView; import de.symeda.sormas.ui.utils.DirtyStateComponent; import de.symeda.sormas.ui.utils.ExternalJournalUtil; -@SuppressWarnings("serial") public abstract class AbstractContactView extends AbstractEditAllowedDetailView { public static final String ROOT_VIEW_NAME = ContactsView.VIEW_NAME; @@ -141,7 +137,7 @@ public ContactReferenceDto getContactRef() { return getReference(); } - public void setContactEditPermission(Component component) { + public void setEditPermission(Component component) { if (!isEditAllowed()) { getComponent(getComponentIndex(component)).setEnabled(false); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactPersonView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactPersonView.java index 4c00de23cdd..fd6efb80aff 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactPersonView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactPersonView.java @@ -44,6 +44,6 @@ protected void initView(String params) { .getPersonEditComponent(PersonContext.CONTACT,dto.getPerson().getUuid(), dto.getDisease(), dto.getDiseaseDetails(), UserRight.CONTACT_EDIT, null); setSubComponent(contactPersonComponent); - setContactEditPermission(contactPersonComponent); + setEditPermission(contactPersonComponent); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactVisitsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactVisitsView.java index 7928877516c..82685f44c70 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactVisitsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactVisitsView.java @@ -211,6 +211,6 @@ protected void initView(String params) { grid.reload(); // updateActiveStatusButtonCaption(); - setContactEditPermission(gridLayout); + setEditPermission(gridLayout); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/CaseEpiDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/CaseEpiDataView.java index 4210c296028..ca1cae3990f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/CaseEpiDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/CaseEpiDataView.java @@ -123,6 +123,6 @@ protected void initView(String params) { TRAVEL_ENTRIES_LOC); } - setCaseEditPermission(container); + setEditPermission(container); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/ContactEpiDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/ContactEpiDataView.java index 2fb98b1bd73..b861ac49b9e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/ContactEpiDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/ContactEpiDataView.java @@ -35,6 +35,6 @@ protected void initView(String params) { CommitDiscardWrapperComponent epidDataForm = ControllerProvider.getContactController().getEpiDataComponent(getContactRef().getUuid()); setSubComponent(epidDataForm); - setContactEditPermission(epidDataForm); + setEditPermission(epidDataForm); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/AbstractEventView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/AbstractEventView.java index 59c15791cdc..0c7f4441ffb 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/AbstractEventView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/AbstractEventView.java @@ -18,10 +18,7 @@ package de.symeda.sormas.ui.events; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; -import com.vaadin.ui.Component; -import de.symeda.sormas.api.CoreFacade; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventReferenceDto; @@ -29,7 +26,6 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.SubMenu; -import de.symeda.sormas.ui.utils.AbstractDetailView; import de.symeda.sormas.ui.utils.AbstractEditAllowedDetailView; import de.symeda.sormas.ui.utils.DirtyStateComponent; @@ -91,12 +87,6 @@ protected void setSubComponent(DirtyStateComponent newComponent) { } } - public void setEventEditPermission(Component component) { - if (!isEditAllowed()) { - component.setEnabled(false); - } - } - protected boolean isEventDeleted() { return FacadeProvider.getEventFacade().isDeleted(getEventRef().getUuid()); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/hospitalization/HospitalizationView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/hospitalization/HospitalizationView.java index 29e2c138165..c32cb36ffc7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/hospitalization/HospitalizationView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/hospitalization/HospitalizationView.java @@ -36,6 +36,6 @@ protected void initView(String params) { CommitDiscardWrapperComponent hospitalizationForm = ControllerProvider.getCaseController().getHospitalizationComponent(getCaseRef().getUuid(), getViewMode()); setSubComponent(hospitalizationForm); - setCaseEditPermission(hospitalizationForm); + setEditPermission(hospitalizationForm); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/AbstractImmunizationView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/AbstractImmunizationView.java index 88cbc0b5342..89366697565 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/AbstractImmunizationView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/AbstractImmunizationView.java @@ -1,10 +1,7 @@ package de.symeda.sormas.ui.immunization; import com.vaadin.navigator.ViewChangeListener; -import com.vaadin.ui.Component; -import de.symeda.sormas.api.CoreFacade; -import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -12,7 +9,6 @@ import de.symeda.sormas.api.immunization.ImmunizationReferenceDto; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.SubMenu; -import de.symeda.sormas.ui.utils.AbstractDetailView; import de.symeda.sormas.ui.utils.AbstractEditAllowedDetailView; import de.symeda.sormas.ui.utils.DirtyStateComponent; @@ -66,12 +62,6 @@ public void refreshMenu(SubMenu menu, String params) { setMainHeaderComponent(ControllerProvider.getImmunizationController().getImmunizationViewTitleLayout(getReference().getUuid())); } - public void setImmunizationEditPermission(Component component) { - if (!isEditAllowed()) { - component.setEnabled(false); - } - } - @Override protected void setSubComponent(DirtyStateComponent newComponent) { super.setSubComponent(newComponent); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationPersonView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationPersonView.java index 8e9709af2ca..f0c9222ecf4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationPersonView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/ImmunizationPersonView.java @@ -25,6 +25,6 @@ protected void initView(String params) { .getPersonEditComponent(PersonContext.IMMUNIZATION, dto.getPerson().getUuid(), dto.getDisease(), null, UserRight.IMMUNIZATION_EDIT, null); setSubComponent(immunizationPersonComponent); - setImmunizationEditPermission(immunizationPersonComponent); + setEditPermission(immunizationPersonComponent); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java index 43c0dc97441..5ac25476016 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/AbstractSampleView.java @@ -125,7 +125,7 @@ public void setSampleEditPermission(Component component) { } protected Boolean isEditAllowed() { - // Sample is not a Core + // Sample is not a Core ADO, therefore, we have to duplicate this unfortunately return FacadeProvider.getSampleFacade().isEditAllowed(getSampleRef().getUuid()); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/therapy/TherapyView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/therapy/TherapyView.java index 4ad2a47e8c0..125125827c4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/therapy/TherapyView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/therapy/TherapyView.java @@ -279,6 +279,6 @@ protected void initView(String params) { reloadPrescriptionGrid(); reloadTreatmentGrid(); - setCaseEditPermission(container); + setEditPermission(container); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/AbstractTravelEntryView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/AbstractTravelEntryView.java index 58f7fd61c68..4caa62060da 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/AbstractTravelEntryView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/AbstractTravelEntryView.java @@ -4,7 +4,6 @@ import java.util.List; import com.vaadin.navigator.ViewChangeListener; -import com.vaadin.ui.Component; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.i18n.Captions; @@ -57,13 +56,6 @@ public TravelEntryReferenceDto getTravelEntryRef() { return getReference(); } - public void setTravelEntryEditPermission(Component component) { - if (!isEditAllowed()) { - component.setEnabled(false); - } - } - - @Override protected void setSubComponent(DirtyStateComponent newComponent) { super.setSubComponent(newComponent); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryPersonView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryPersonView.java index 4d7f7026162..fa4ebf4ea66 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryPersonView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryPersonView.java @@ -31,7 +31,7 @@ protected void initView(String params) { null); setSubComponent(travelEntryPersonComponent); - setTravelEntryEditPermission(travelEntryPersonComponent); + setEditPermission(travelEntryPersonComponent); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditAllowedDetailView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditAllowedDetailView.java index 791a041f77b..eba28cc607f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditAllowedDetailView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditAllowedDetailView.java @@ -1,11 +1,19 @@ package de.symeda.sormas.ui.utils; +import com.vaadin.ui.Component; import de.symeda.sormas.api.CoreFacade; import de.symeda.sormas.api.ReferenceDto; +/** + * A detail view shows specific details of an object identified by the URL parameter. + * + * In addition to that, it contains generic code to check if the object is editable. + * + * @param + * {@link ReferenceDto} with the uuid as parsed from the URL. + */ public abstract class AbstractEditAllowedDetailView extends AbstractDetailView { - private R reference; private CoreFacade coreFacade; protected AbstractEditAllowedDetailView(String viewName, CoreFacade coreFacade) { @@ -17,4 +25,10 @@ protected boolean isEditAllowed() { String uuid = getReference().getUuid(); return coreFacade.isEditAllowed(uuid); } + + protected void setEditPermission(Component component){ + if (!isEditAllowed()) { + component.setEnabled(false); + } + } } From e7b49036f1d679e8b37efd4f84ceeef62f8bca4e Mon Sep 17 00:00:00 2001 From: Jonas Cirotzki Date: Mon, 29 Aug 2022 10:41:49 +0200 Subject: [PATCH 08/45] [#9693] review comment --- .../de/symeda/sormas/backend/sample/SampleService.java | 2 +- .../campaign/campaigndata/AbstractCampaignDataView.java | 8 +++++++- .../java/de/symeda/sormas/ui/caze/AbstractCaseView.java | 8 +++++++- .../de/symeda/sormas/ui/contact/AbstractContactView.java | 8 +++++++- .../de/symeda/sormas/ui/events/AbstractEventView.java | 8 +++++++- .../sormas/ui/immunization/AbstractImmunizationView.java | 8 +++++++- .../de/symeda/sormas/ui/samples/AbstractSampleView.java | 5 ++--- .../sormas/ui/travelentry/AbstractTravelEntryView.java | 8 +++++++- .../de/symeda/sormas/ui/utils/AbstractDetailView.java | 1 - .../sormas/ui/utils/AbstractEditAllowedDetailView.java | 9 +++++---- 10 files changed, 50 insertions(+), 15 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java index 883f0bee885..8443586609e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java @@ -1095,7 +1095,7 @@ public Predicate createDefaultFilter(CriteriaBuilder cb, Root root) { } - public Boolean isEditAllowed(Sample sample) { + public boolean isEditAllowed(Sample sample) { if (sample.getSormasToSormasOriginInfo() != null && !sample.getSormasToSormasOriginInfo().isOwnershipHandedOver()) { return false; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java index bfd66e0b82c..bc626f5a3a8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/AbstractCampaignDataView.java @@ -17,6 +17,7 @@ import com.vaadin.navigator.ViewChangeListener; +import de.symeda.sormas.api.CoreFacade; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.campaign.data.CampaignFormDataReferenceDto; import de.symeda.sormas.api.i18n.Captions; @@ -31,7 +32,12 @@ public abstract class AbstractCampaignDataView extends AbstractEditAllowedDetail public static final String ROOT_VIEW_NAME = CampaignDataView.VIEW_NAME; protected AbstractCampaignDataView(String viewName) { - super(viewName, FacadeProvider.getCampaignFacade()); + super(viewName); + } + + @Override + protected CoreFacade getCoreFacade() { + return FacadeProvider.getCampaignFacade(); } @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java index f4455c5a5da..f8795509f72 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseView.java @@ -23,6 +23,7 @@ import com.vaadin.v7.data.Property; import com.vaadin.v7.ui.OptionGroup; +import de.symeda.sormas.api.CoreFacade; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseDataDto; @@ -68,7 +69,7 @@ public abstract class AbstractCaseView extends AbstractEditAllowedDetailView extends AbstractDetailView { - private CoreFacade coreFacade; - protected AbstractEditAllowedDetailView(String viewName, CoreFacade coreFacade) { + protected AbstractEditAllowedDetailView(String viewName) { super(viewName); - this.coreFacade = coreFacade; + } + protected abstract CoreFacade getCoreFacade(); + protected boolean isEditAllowed() { String uuid = getReference().getUuid(); - return coreFacade.isEditAllowed(uuid); + return getCoreFacade().isEditAllowed(uuid); } protected void setEditPermission(Component component){ From d6961f0048e908634745a75b78a1b1334110d081 Mon Sep 17 00:00:00 2001 From: Bartha Barna Date: Tue, 30 Aug 2022 14:57:32 +0300 Subject: [PATCH 09/45] #3845 - fix event participant index list sorting --- .../event/EventParticipantFacadeEjb.java | 9 +++-- .../event/EventParticipantFacadeEjbTest.java | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java index fa65cf65853..a777fc7f4a3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java @@ -479,7 +479,7 @@ public List getIndexList( Join person = joins.getPerson(); Join resultingCase = joins.getResultingCase(); Join event = joins.getEvent(); - final Join samples = eventParticipant.join(EventParticipant.SAMPLES, JoinType.LEFT); + final Join samples = joins.getSamples(); samples.on( cb.and( cb.isFalse(samples.get(DeletableAdo.DELETED)), @@ -533,8 +533,6 @@ public List getIndexList( .and(cb, filter, cb.equal(samples.get(Sample.PATHOGEN_TEST_RESULT), eventParticipantCriteria.getPathogenTestResult())); } - cq.distinct(true); - Subquery latestSampleSubquery = sampleService.createSubqueryLatestSample(cq, cb, eventParticipant); Predicate latestSamplePredicate = cb.or(cb.isNull(samples.get(Sample.SAMPLE_DATE_TIME)), cb.equal(samples.get(Sample.SAMPLE_DATE_TIME), latestSampleSubquery)); @@ -562,11 +560,9 @@ public List getIndexList( case EventParticipantIndexDto.LAST_NAME: case SampleIndexDto.PATHOGEN_TEST_RESULT: expression = joins.getSamples().get(SampleIndexDto.PATHOGEN_TEST_RESULT); - order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); break; case SampleIndexDto.SAMPLE_DATE_TIME: expression = joins.getSamples().get(SampleIndexDto.SAMPLE_DATE_TIME); - order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); break; case EventParticipantIndexDto.FIRST_NAME: expression = person.get(sortProperty.propertyName); @@ -574,6 +570,9 @@ public List getIndexList( case EventParticipantIndexDto.CASE_UUID: expression = resultingCase.get(Case.UUID); break; + case EventParticipantIndexDto.CONTACT_COUNT: + expression = resultingCase.get(Case.UUID); + break; default: throw new IllegalArgumentException(sortProperty.propertyName); } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjbTest.java index 57bbec0aec8..dcbe15ddf3f 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjbTest.java @@ -63,10 +63,12 @@ import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.sample.PathogenTestResultType; import de.symeda.sormas.api.sample.SampleDto; +import de.symeda.sormas.api.sample.SampleIndexDto; import de.symeda.sormas.api.sample.SampleMaterial; import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.vaccination.VaccinationDto; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; @@ -399,6 +401,37 @@ public void testEventParticipantTestResultWithMultipleSamples() { assertEquals(PathogenTestResultType.NEGATIVE, eventParticipantIndexDtos.get(0).getPathogenTestResult()); assertEquals(calendarDay10.getTime(), eventParticipantIndexDtos.get(0).getSampleDateTime()); } + + @Test + public void testEventParticipantIndexListSorting() { + RDCF rdcf = new RDCF(creator.createRDCFEntities()); + UserDto user = creator.createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); + EventDto event = creator.createEvent(user.toReference()); + PersonDto person = creator.createPerson(); + + EventParticipantDto eventParticipant1 = creator.createEventParticipant(event.toReference(), person, user.toReference()); + EventParticipantDto eventParticipant2 = creator.createEventParticipant(event.toReference(), person, user.toReference()); + + Calendar calendarDay1 = Calendar.getInstance(); + calendarDay1.set(2022, 7, 1); + + creator.createSample( + eventParticipant1.toReference(), + calendarDay1.getTime(), + new Date(), + user.toReference(), + SampleMaterial.BLOOD, + rdcf.facility, + s -> s.setPathogenTestResult(PathogenTestResultType.POSITIVE)); + + EventParticipantCriteria eventParticipantCriteria = new EventParticipantCriteria(); + eventParticipantCriteria.setEvent(event.toReference()); + SortProperty sortProperty = new SortProperty(SampleIndexDto.SAMPLE_DATE_TIME, false); + List eventParticipantIndexDtos = + getEventParticipantFacade().getIndexList(eventParticipantCriteria, 0, 100, Arrays.asList(sortProperty)); + assertEquals(2, eventParticipantIndexDtos.size()); + assertEquals(eventParticipant1.getUuid(), eventParticipantIndexDtos.get(0).getUuid()); + } private UserDto createUser(TestDataCreator.RDCF rdcf) { return creator.createUser( From c6d252ed9bcf0f9f950d94143fcd24301f862365 Mon Sep 17 00:00:00 2001 From: Bartha Barna Date: Wed, 31 Aug 2022 16:47:57 +0300 Subject: [PATCH 10/45] #3845 - remove unnecesaryy code --- .../symeda/sormas/backend/event/EventParticipantFacadeEjb.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java index a777fc7f4a3..4fd9ab8eac6 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java @@ -570,9 +570,6 @@ public List getIndexList( case EventParticipantIndexDto.CASE_UUID: expression = resultingCase.get(Case.UUID); break; - case EventParticipantIndexDto.CONTACT_COUNT: - expression = resultingCase.get(Case.UUID); - break; default: throw new IllegalArgumentException(sortProperty.propertyName); } From 7ed76830af06719a8f575059ad8be950a9aa302e Mon Sep 17 00:00:00 2001 From: dinua Date: Thu, 1 Sep 2022 15:28:35 +0300 Subject: [PATCH 11/45] #10086 fix bug --- .../disease/burden/DiseaseBurdenComponent.java | 4 +++- .../statistics/EventStatisticsComponent.java | 16 +++++++++------- .../TestResultsStatisticsComponent.java | 14 ++++++++------ 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java index dec42b7bafa..101b39149e6 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java @@ -57,6 +57,8 @@ public DiseaseBurdenComponent() { public void refresh(List diseasesBurden) { grid.reload(diseasesBurden); - grid.setHeightByRows(diseasesBurden.size()); + if (diseasesBurden != null && diseasesBurden.size() > 0) { + grid.setHeightByRows(diseasesBurden.size()); + } } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/EventStatisticsComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/EventStatisticsComponent.java index 3c6eb182d5c..55b0b23119f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/EventStatisticsComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/EventStatisticsComponent.java @@ -28,12 +28,14 @@ public EventStatisticsComponent() { } public void update(Map events) { - updateTotalLabel(((Long) events.values().stream().mapToLong(Long::longValue).sum()).toString()); - - eventStatusCluster.updateCountLabel(events.getOrDefault(EventStatus.CLUSTER, 0L).toString()); - eventStatusConfirmed.updateCountLabel(events.getOrDefault(EventStatus.EVENT, 0L).toString()); - eventStatusPossible.updateCountLabel(events.getOrDefault(EventStatus.SIGNAL, 0L).toString()); - eventStatusScreening.updateCountLabel(events.getOrDefault(EventStatus.SCREENING, 0L).toString()); - eventStatusNotAnEvent.updateCountLabel(events.getOrDefault(EventStatus.DROPPED, 0L).toString()); + if (events != null) { + updateTotalLabel(((Long) events.values().stream().mapToLong(Long::longValue).sum()).toString()); + + eventStatusCluster.updateCountLabel(events.getOrDefault(EventStatus.CLUSTER, 0L).toString()); + eventStatusConfirmed.updateCountLabel(events.getOrDefault(EventStatus.EVENT, 0L).toString()); + eventStatusPossible.updateCountLabel(events.getOrDefault(EventStatus.SIGNAL, 0L).toString()); + eventStatusScreening.updateCountLabel(events.getOrDefault(EventStatus.SCREENING, 0L).toString()); + eventStatusNotAnEvent.updateCountLabel(events.getOrDefault(EventStatus.DROPPED, 0L).toString()); + } } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/TestResultsStatisticsComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/TestResultsStatisticsComponent.java index 6693b3f25fc..5c07ec1403b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/TestResultsStatisticsComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/statistics/TestResultsStatisticsComponent.java @@ -29,11 +29,13 @@ public TestResultsStatisticsComponent() { } public void update(Map testResults) { - updateTotalLabel(((Long) testResults.values().stream().mapToLong(Long::longValue).sum()).toString()); - - testResultPositive.updateCountLabel(testResults.getOrDefault(PathogenTestResultType.POSITIVE, 0L).toString()); - testResultNegative.updateCountLabel(testResults.getOrDefault(PathogenTestResultType.NEGATIVE, 0L).toString()); - testResultPending.updateCountLabel(testResults.getOrDefault(PathogenTestResultType.PENDING, 0L).toString()); - testResultIndeterminate.updateCountLabel(testResults.getOrDefault(PathogenTestResultType.INDETERMINATE, 0L).toString()); + if (testResults != null) { + updateTotalLabel(((Long) testResults.values().stream().mapToLong(Long::longValue).sum()).toString()); + + testResultPositive.updateCountLabel(testResults.getOrDefault(PathogenTestResultType.POSITIVE, 0L).toString()); + testResultNegative.updateCountLabel(testResults.getOrDefault(PathogenTestResultType.NEGATIVE, 0L).toString()); + testResultPending.updateCountLabel(testResults.getOrDefault(PathogenTestResultType.PENDING, 0L).toString()); + testResultIndeterminate.updateCountLabel(testResults.getOrDefault(PathogenTestResultType.INDETERMINATE, 0L).toString()); + } } } From 0ff6a1a1056a74d398b698d10f759e3244522e6e Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Thu, 8 Sep 2022 09:39:09 +0300 Subject: [PATCH 12/45] S2S_Cannot accept case sent with "Exclude personal data" #10225 --- .../pseudonymization/DtoPseudonymizer.java | 6 ++--- .../sormas/backend/caze/CaseFacadeEjb.java | 18 +++++++++++---- .../SurveillanceReportFacadeEjb.java | 7 +++++- .../backend/contact/ContactFacadeEjb.java | 10 ++++++-- .../backend/document/DocumentFacadeEjb.java | 7 +++++- .../sormas/backend/event/EventFacadeEjb.java | 7 +++++- .../immunization/ImmunizationFacadeEjb.java | 7 +++++- .../backend/sample/SampleFacadeEjb.java | 3 ++- .../backend/share/ExternalShareInfo.java | 1 + .../share/ExternalShareInfoFacadeEjb.java | 3 ++- .../travelentry/TravelEntryFacadeEjb.java | 7 +++++- .../sormas/backend/util/Pseudonymizer.java | 23 +++++++++++++++++-- .../vaccination/VaccinationFacadeEjb.java | 7 +++++- 13 files changed, 87 insertions(+), 19 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/DtoPseudonymizer.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/DtoPseudonymizer.java index 308e932e2b1..a06d9a2db03 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/DtoPseudonymizer.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/DtoPseudonymizer.java @@ -15,6 +15,8 @@ package de.symeda.sormas.api.utils.pseudonymization; +import static java.util.Objects.nonNull; + import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; @@ -26,8 +28,6 @@ import de.symeda.sormas.api.utils.fieldaccess.FieldAccessCheckers; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.DefaultValuePseudonymizer; -import static java.util.Objects.nonNull; - public class DtoPseudonymizer { protected FieldAccessCheckers inJurisdictionCheckers; @@ -35,7 +35,7 @@ public class DtoPseudonymizer { private final String stringValuePlaceholder; - private final boolean pseudonymizeMandatoryFields; + protected final boolean pseudonymizeMandatoryFields; protected DtoPseudonymizer( FieldAccessCheckers inJurisdictionCheckers, diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index b421bd26ee3..b5b00d80ca8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -674,8 +674,12 @@ public List getIndexDetailedList(CaseCriteria caseCriteria Boolean isInJurisdiction = caze.getInJurisdiction(); pseudonymizer.pseudonymizeDto(CaseIndexDetailedDto.class, caze, isInJurisdiction, c -> { pseudonymizer.pseudonymizeDto(AgeAndBirthDateDto.class, caze.getAgeAndBirthDate(), isInJurisdiction, null); - pseudonymizer - .pseudonymizeUser(userService.getByUuid(caze.getReportingUser().getUuid()), userService.getCurrentUser(), caze::setReportingUser); + pseudonymizer.pseudonymizeUser( + CaseDataDto.class, + CaseDataDto.REPORTING_USER, + userService.getByUuid(caze.getReportingUser().getUuid()), + userService.getCurrentUser(), + caze::setReportingUser); }); } @@ -2667,8 +2671,14 @@ public void pseudonymizeDto(Case source, CaseDataDto dto, Pseudonymizer pseudony pseudonymizer.pseudonymizeDto(CaseDataDto.class, dto, inJurisdiction, c -> { User currentUser = userService.getCurrentUser(); - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser); - pseudonymizer.pseudonymizeUser(source.getClassificationUser(), currentUser, dto::setClassificationUser); + pseudonymizer + .pseudonymizeUser(CaseDataDto.class, CaseDataDto.REPORTING_USER, source.getReportingUser(), currentUser, dto::setReportingUser); + pseudonymizer.pseudonymizeUser( + CaseDataDto.class, + CaseDataDto.CLASSIFICATION_USER, + source.getClassificationUser(), + currentUser, + dto::setClassificationUser); pseudonymizer.pseudonymizeDto( EpiDataDto.class, diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjb.java index 686df299ee7..ab014d885d7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/surveillancereport/SurveillanceReportFacadeEjb.java @@ -145,7 +145,12 @@ public List getIndexList(SurveillanceReportCriteria crite }, (reportDto, inJurisdiction) -> { Optional report = resultList.stream().filter(r -> r.getUuid().equals(r.getUuid())).findFirst(); report.ifPresent( - surveillanceReport -> pseudonymizer.pseudonymizeUser(surveillanceReport.getCreatingUser(), currentUser, reportDto::setCreatingUser)); + surveillanceReport -> pseudonymizer.pseudonymizeUser( + SurveillanceReportDto.class, + SurveillanceReportDto.CREATING_USER, + surveillanceReport.getCreatingUser(), + currentUser, + reportDto::setCreatingUser)); }); return reports; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java index 841d4e0c28b..d2d4cd35b67 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java @@ -1258,7 +1258,12 @@ public List getIndexDetailedList( Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); User currentUser = userService.getCurrentUser(); pseudonymizer.pseudonymizeDtoCollection(ContactIndexDetailedDto.class, dtos, c -> c.getInJurisdiction(), (c, isInJurisdiction) -> { - pseudonymizer.pseudonymizeUser(userService.getByUuid(c.getReportingUser().getUuid()), currentUser, c::setReportingUser); + pseudonymizer.pseudonymizeUser( + ContactIndexDetailedDto.class, + ContactIndexDetailedDto.REPORTING_USER, + userService.getByUuid(c.getReportingUser().getUuid()), + currentUser, + c::setReportingUser); if (c.getCaze() != null) { pseudonymizer.pseudonymizeDto(CaseReferenceDto.class, c.getCaze(), c.getCaseInJurisdiction(), null); } @@ -1533,7 +1538,8 @@ public void pseudonymizeDto(Contact source, ContactDto dto, Pseudonymizer pseudo User currentUser = userService.getCurrentUser(); pseudonymizer.pseudonymizeDto(ContactDto.class, dto, isInJurisdiction, (c) -> { - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser); + pseudonymizer + .pseudonymizeUser(ContactDto.class, ContactDto.REPORTING_USER, source.getReportingUser(), currentUser, dto::setReportingUser); if (c.getCaze() != null) { pseudonymizer.pseudonymizeDto(CaseReferenceDto.class, c.getCaze(), contactJurisdictionFlagsDto.getCaseInJurisdiction(), null); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/document/DocumentFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/document/DocumentFacadeEjb.java index b28edf056d2..5959140d7a2 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/document/DocumentFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/document/DocumentFacadeEjb.java @@ -182,7 +182,12 @@ private void pseudonymizeDto(Document document, DocumentDto dto, Pseudonymizer p DocumentDto.class, dto, inJurisdiction, - (e) -> pseudonymizer.pseudonymizeUser(document.getUploadingUser(), userService.getCurrentUser(), dto::setUploadingUser)); + (e) -> pseudonymizer.pseudonymizeUser( + DocumentDto.class, + DocumentDto.UPLOADING_USER, + document.getUploadingUser(), + userService.getCurrentUser(), + dto::setUploadingUser)); } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index 157160b1090..eb02729f317 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -1156,7 +1156,12 @@ protected void pseudonymizeDto(Event event, EventDto dto, Pseudonymizer pseudony boolean inJurisdiction = service.inJurisdictionOrOwned(event); pseudonymizer.pseudonymizeDto(EventDto.class, dto, inJurisdiction, (e) -> { - pseudonymizer.pseudonymizeUser(event.getReportingUser(), userService.getCurrentUser(), dto::setReportingUser); + pseudonymizer.pseudonymizeUser( + EventDto.class, + EventDto.REPORTING_USER, + event.getReportingUser(), + userService.getCurrentUser(), + dto::setReportingUser); }); } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java index 97881ddbc47..5de9cf1eb08 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/ImmunizationFacadeEjb.java @@ -378,7 +378,12 @@ protected void pseudonymizeDto(Immunization source, ImmunizationDto dto, Pseudon boolean inJurisdiction = service.inJurisdictionOrOwned(source); pseudonymizer.pseudonymizeDto(ImmunizationDto.class, dto, inJurisdiction, c -> { User currentUser = userService.getCurrentUser(); - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser); + pseudonymizer.pseudonymizeUser( + ImmunizationDto.class, + ImmunizationDto.REPORTING_USER, + source.getReportingUser(), + currentUser, + dto::setReportingUser); pseudonymizer.pseudonymizeDto(PersonReferenceDto.class, c.getPerson(), inJurisdiction, null); }); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java index cf5c3f4ef93..101325fc92b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java @@ -827,7 +827,8 @@ private void pseudonymizeDto(Sample source, SampleDto dto, Pseudonymizer pseudon User currentUser = userService.getCurrentUser(); pseudonymizer.pseudonymizeDto(SampleDto.class, dto, sampleJurisdictionFlagsDto.getInJurisdiction(), s -> { - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, s::setReportingUser); + pseudonymizer + .pseudonymizeUser(SampleDto.class, SampleDto.REPORTING_USER, source.getReportingUser(), currentUser, s::setReportingUser); pseudonymizeAssociatedObjects( s.getAssociatedCase(), s.getAssociatedContact(), diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfo.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfo.java index 29be45132f1..6b110e1ec5c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfo.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfo.java @@ -36,6 +36,7 @@ public class ExternalShareInfo extends AbstractDomainObject { public static final String CAZE = "caze"; public static final String EVENT = "event"; public static final String STATUS = "status"; + public static final String SENDER = "sender"; private Case caze; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfoFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfoFacadeEjb.java index b3a79210fd4..1a42953130f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfoFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/share/ExternalShareInfoFacadeEjb.java @@ -80,7 +80,8 @@ public List getIndexList(ExternalShareInfoCriteria criteri private ExternalShareInfoDto convertToDto(ExternalShareInfo source, Pseudonymizer pseudonymizer) { ExternalShareInfoDto dto = toDto(source); - boolean pseudonymized = pseudonymizer.pseudonymizeUser(source.getSender(), userService.getCurrentUser(), dto::setSender); + boolean pseudonymized = pseudonymizer + .pseudonymizeUser(ExternalShareInfo.class, ExternalShareInfo.SENDER, source.getSender(), userService.getCurrentUser(), dto::setSender); if (pseudonymized) { dto.setPseudonymized(true); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java index 41b6eb4dddc..658342c5146 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/TravelEntryFacadeEjb.java @@ -151,7 +151,12 @@ protected void pseudonymizeDto(TravelEntry source, TravelEntryDto dto, Pseudonym boolean inJurisdiction = service.inJurisdictionOrOwned(source); pseudonymizer.pseudonymizeDto(TravelEntryDto.class, dto, inJurisdiction, c -> { User currentUser = userService.getCurrentUser(); - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser); + pseudonymizer.pseudonymizeUser( + TravelEntryDto.class, + TravelEntryDto.REPORTING_USER, + source.getReportingUser(), + currentUser, + dto::setReportingUser); }); } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/Pseudonymizer.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/Pseudonymizer.java index 9b9d9c3e272..3573aeac4c0 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/Pseudonymizer.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/Pseudonymizer.java @@ -15,8 +15,11 @@ package de.symeda.sormas.backend.util; +import java.lang.reflect.Field; import java.util.function.Consumer; +import javax.validation.constraints.NotNull; + import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.user.JurisdictionLevel; @@ -63,11 +66,19 @@ private SensitiveDataFieldAccessChecker getSensitiveDataFieldAccessChecker(boole return getFieldAccessCheckers(inJurisdiction).getCheckerByType(SensitiveDataFieldAccessChecker.class); } - public boolean pseudonymizeUser(User dtoUser, User currentUser, Consumer setPseudonymizedValue) { + public boolean pseudonymizeUser( + Class dtoClass, + String dtoFieldName, + User dtoUser, + User currentUser, + Consumer setPseudonymizedValue) { boolean isInJurisdiction = dtoUser == null || isUserInJurisdiction(dtoUser, currentUser); SensitiveDataFieldAccessChecker sensitiveDataFieldAccessChecker = getSensitiveDataFieldAccessChecker(isInJurisdiction); - if (sensitiveDataFieldAccessChecker != null && !sensitiveDataFieldAccessChecker.hasRight()) { + boolean isConfiguredToCheck = sensitiveDataFieldAccessChecker != null + && (pseudonymizeMandatoryFields || !getDtoField(dtoClass, dtoFieldName).isAnnotationPresent(NotNull.class)); + + if (isConfiguredToCheck && !sensitiveDataFieldAccessChecker.hasRight()) { setPseudonymizedValue.accept(null); return true; @@ -76,6 +87,14 @@ public boolean pseudonymizeUser(User dtoUser, User currentUser, Consumer dtoClass, String dtoFieldName) { + try { + return dtoClass.getDeclaredField(dtoFieldName); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } + } + public void restoreUser( User originalDtoUser, User currentUser, diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java index 8ed9ee95832..bd4dce46823 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java @@ -390,7 +390,12 @@ private void pseudonymizeDto(Vaccination source, VaccinationDto dto, Pseudonymiz pseudonymizer.pseudonymizeDto(VaccinationDto.class, dto, inJurisdiction, c -> { User currentUser = userService.getCurrentUser(); - pseudonymizer.pseudonymizeUser(source.getReportingUser(), currentUser, dto::setReportingUser); + pseudonymizer.pseudonymizeUser( + VaccinationDto.class, + VaccinationDto.REPORTING_USER, + source.getReportingUser(), + currentUser, + dto::setReportingUser); }); } } From 8eb1a8c91f24fdc43e978bde860c0dda03a98557 Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Thu, 8 Sep 2022 16:31:30 +0300 Subject: [PATCH 13/45] Added locators, page methods and steps towards StatisticsPage --- .../statistics/StatisticsPage.java | 8 +++++++ .../statistics/StatisticsSteps.java | 24 +++++++++++++++++-- .../features/sanity/web/Statistics.feature | 10 +++++++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java index 228e2c3bc5c..46558abf044 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java @@ -3,6 +3,14 @@ import org.openqa.selenium.By; public class StatisticsPage { + public static final By ADD_FILTER_BUTTON = By.id("statisticsAddFilter"); + public static final By RESET_FILTER_BUTTON = By.id("statisticsResetFilters"); + public static final By REMOVE_FILTER_BUTTON = By.id("close"); + public static final By SELECT_ATTRIBUTE_DROPDOWN = By.cssSelector("[id='statisticsAttribute-0']"); + public static final By VISUALISATION_TYPE_TABLE_RADIO_BUTTON = + By.xpath("//label[text()='Table']"); + public static final By TABLE_ROWS_DROPDOWN = By.xpath("//label[text()='Table']"); + public static final By SWITCH_ROWS_AND_COLUMNS_BUTTON = By.id("switchRowsAndColumns"); public static final By DATABASE_EXPORT_TAB = By.cssSelector("#tab-statistics-database-export"); public static final By EVENT_GROUPS_CHECKBOX = By.xpath("//label[text()='Event groups']"); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java index 79854103b60..9551cff7501 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java @@ -1,8 +1,7 @@ package org.sormas.e2etests.steps.web.application.statistics; import static org.sormas.e2etests.pages.application.events.EventDirectoryPage.EVENT_EXPORT_BUTTON; -import static org.sormas.e2etests.pages.application.statistics.StatisticsPage.DATABASE_EXPORT_TAB; -import static org.sormas.e2etests.pages.application.statistics.StatisticsPage.EVENT_GROUPS_CHECKBOX; +import static org.sormas.e2etests.pages.application.statistics.StatisticsPage.*; import com.opencsv.CSVParser; import com.opencsv.CSVParserBuilder; @@ -91,6 +90,27 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { "Downloaded data does not contain change_user_id column!"); softly.assertAll(); }); + + And( + "^I Click on the +Add filter button from the statistics Page", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(ADD_FILTER_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(ADD_FILTER_BUTTON); + }); + + And( + "^I Click the Remove Filter Button from the statistics Page", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(REMOVE_FILTER_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(REMOVE_FILTER_BUTTON); + }); + + And( + "^I Click the Reset Filter Button from the statistics Page", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(RESET_FILTER_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(RESET_FILTER_BUTTON); + }); } public String[] parseEventGroupsDatabaseExportColumns(String fileName) { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature index eb113149e64..f449b2d0ecb 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature @@ -9,4 +9,12 @@ Feature: Statistics tab tests And I click on the Event Groups checkbox from Statistics directory Then I click on the Export button from Database Export tab And I unzip a downloaded file from Database export - Then I check if downloaded file generated by Event Groups database export contains required headers \ No newline at end of file + Then I check if downloaded file generated by Event Groups database export contains required headers + + @#7469 @env_main + Scenario Validate Statistics directory layout + Given I log in as a Admin User + And I click on the Statistics button from navbar + And I Click on the +Add filter button from the statistics Page + And I Click the Remove Filter Button from the statistics Page + And I Click the Reset Filter Button from the statistics Page From 38e4f822c2af468254efb931d06c50b3749ceb66 Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Thu, 8 Sep 2022 19:52:20 +0300 Subject: [PATCH 14/45] #7469 - Validate Statistics directory layout, added selectors and steps toward test --- .../statistics/StatisticsPage.java | 7 ++- .../statistics/StatisticsSteps.java | 49 +++++++++++++++++-- .../features/sanity/web/Statistics.feature | 14 ++++-- 3 files changed, 62 insertions(+), 8 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java index 46558abf044..90afa770de2 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java @@ -9,8 +9,13 @@ public class StatisticsPage { public static final By SELECT_ATTRIBUTE_DROPDOWN = By.cssSelector("[id='statisticsAttribute-0']"); public static final By VISUALISATION_TYPE_TABLE_RADIO_BUTTON = By.xpath("//label[text()='Table']"); - public static final By TABLE_ROWS_DROPDOWN = By.xpath("//label[text()='Table']"); + public static final By VISUALISATION_TYPE_MAP_RADIO_BUTTON = By.xpath("//label[text()='Map']"); + public static final By VISUALISATION_TYPE_CHART_RADIO_BUTTON = + By.xpath("//label[text()='Chart']"); + public static final By TABLE_ROWS_DROPDOWN = By.id("visualizationType"); public static final By SWITCH_ROWS_AND_COLUMNS_BUTTON = By.id("switchRowsAndColumns"); public static final By DATABASE_EXPORT_TAB = By.cssSelector("#tab-statistics-database-export"); public static final By EVENT_GROUPS_CHECKBOX = By.xpath("//label[text()='Event groups']"); + public static final By MAP_TYPE_REGIONS_RADIO_BUTTON = By.xpath("//label[text()='Regions']"); + public static final By MAP_TYPE_DISTRICTS_RADIO_BUTTON = By.xpath("//label[text()='Districts']"); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java index 9551cff7501..c490ec68ebe 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java @@ -92,25 +92,68 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { }); And( - "^I Click on the +Add filter button from the statistics Page", + "I click on the Add filter button from the Statistics Page", () -> { webDriverHelpers.waitUntilElementIsVisibleAndClickable(ADD_FILTER_BUTTON); webDriverHelpers.clickOnWebElementBySelector(ADD_FILTER_BUTTON); }); And( - "^I Click the Remove Filter Button from the statistics Page", + "I click the Remove Filter Button from the Statistics Page", () -> { webDriverHelpers.waitUntilElementIsVisibleAndClickable(REMOVE_FILTER_BUTTON); webDriverHelpers.clickOnWebElementBySelector(REMOVE_FILTER_BUTTON); }); And( - "^I Click the Reset Filter Button from the statistics Page", + "I click the Reset Filter Button from the Statistics Page", () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(RESET_FILTER_BUTTON); webDriverHelpers.waitUntilElementIsVisibleAndClickable(RESET_FILTER_BUTTON); webDriverHelpers.clickOnWebElementBySelector(RESET_FILTER_BUTTON); }); + + And( + "^I select Visualisation type ([^\"]*) from the Statistics Page", + (String visualisationType) -> { + switch (visualisationType) { + case "Table": + webDriverHelpers.waitUntilElementIsVisibleAndClickable( + VISUALISATION_TYPE_TABLE_RADIO_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(VISUALISATION_TYPE_TABLE_RADIO_BUTTON); + break; + case "Map": + webDriverHelpers.waitUntilElementIsVisibleAndClickable( + VISUALISATION_TYPE_MAP_RADIO_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(VISUALISATION_TYPE_MAP_RADIO_BUTTON); + break; + case "Chart": + webDriverHelpers.waitUntilElementIsVisibleAndClickable( + VISUALISATION_TYPE_CHART_RADIO_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(VISUALISATION_TYPE_CHART_RADIO_BUTTON); + break; + } + }); + + Then( + "I Verify the presence of Rows, Columns, and switch-between Button in the Statistics Page", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(TABLE_ROWS_DROPDOWN); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(SWITCH_ROWS_AND_COLUMNS_BUTTON); + }); + + Then( + "I Verify the presence of Map Type Regions and Districts buttons in the Statistics Page", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(MAP_TYPE_REGIONS_RADIO_BUTTON); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(MAP_TYPE_DISTRICTS_RADIO_BUTTON); + }); + + Then( + "I Verify the presence of Chart Type Column buttons in the Statistics Page", + () -> { + //WIP + }); } public String[] parseEventGroupsDatabaseExportColumns(String fileName) { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature index f449b2d0ecb..0dc48b4ab3b 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature @@ -12,9 +12,15 @@ Feature: Statistics tab tests Then I check if downloaded file generated by Event Groups database export contains required headers @#7469 @env_main - Scenario Validate Statistics directory layout + Scenario: Validate Statistics directory layout Given I log in as a Admin User And I click on the Statistics button from navbar - And I Click on the +Add filter button from the statistics Page - And I Click the Remove Filter Button from the statistics Page - And I Click the Reset Filter Button from the statistics Page + And I click on the Add filter button from the Statistics Page + And I click the Remove Filter Button from the Statistics Page + When I click the Reset Filter Button from the Statistics Page + And I select Visualisation type Table from the Statistics Page + Then I Verify the presence of Rows, Columns, and switch-between Button in the Statistics Page + And I select Visualisation type Map from the Statistics Page + Then I Verify the presence of Map Type Regions and Districts buttons in the Statistics Page + And I select Visualisation type Chart from the Statistics Page + Then I Verify the presence of Chart Type Column buttons in the Statistics Page From 58e973ee7ac8fadb93a41aff75b9273a1c1f2564 Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Fri, 9 Sep 2022 14:24:42 +0300 Subject: [PATCH 15/45] #7469 - added locators and steps towards Statistics Page --- .../statistics/StatisticsPage.java | 12 +++++ .../statistics/StatisticsSteps.java | 53 ++++++++++++++++--- .../features/sanity/web/Statistics.feature | 7 ++- 3 files changed, 64 insertions(+), 8 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java index 90afa770de2..679cd5bc614 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java @@ -18,4 +18,16 @@ public class StatisticsPage { public static final By EVENT_GROUPS_CHECKBOX = By.xpath("//label[text()='Event groups']"); public static final By MAP_TYPE_REGIONS_RADIO_BUTTON = By.xpath("//label[text()='Regions']"); public static final By MAP_TYPE_DISTRICTS_RADIO_BUTTON = By.xpath("//label[text()='Districts']"); + public static final By CHART_TYPE_COLUMN_RADIO_BUTTON = By.xpath("//label[text()='Column']"); + public static final By CHART_TYPE_STACKED_COLUMN_RADIO_BUTTON = + By.xpath("//label[text()='Stacked column']"); + public static final By CHART_TYPE_LINE_RADIO_BUTTON = By.xpath("//label[text()='Line']"); + public static final By CHART_TYPE_PIE_RADIO_BUTTON = By.xpath("//label[text()='Pie']"); + public static final By DATA_DISPLAYED_CASE_COUNT_RADIO_BUTTON = + By.xpath("//label[text()='Case count']"); + public static final By DATA_DISPLAYED_CASE_INCIDENCE_RADIO_BUTTON = + By.xpath("//label[text()='Case incidence']"); + public static final By SHOW_ZERO_VALUES_CHECKBOX = By.id("statisticsShowZeroValues"); + public static final By INCIDENCE_DIVISOR_INPUT = By.id("incidenceDivisor"); + public static final By GENERATE_BUTTON = By.id("actionGenerate"); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java index c490ec68ebe..78e5a7672d2 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java @@ -134,6 +134,23 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { break; } }); + And( + "^I select Options Data Displayed ([^\"]*) from the Statistics Page", + (String dataDisplayed) -> { + switch (dataDisplayed) { + case "Case Count": + webDriverHelpers.waitUntilElementIsVisibleAndClickable( + DATA_DISPLAYED_CASE_COUNT_RADIO_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(DATA_DISPLAYED_CASE_COUNT_RADIO_BUTTON); + break; + case "Case Incidence": + webDriverHelpers.waitUntilElementIsVisibleAndClickable( + DATA_DISPLAYED_CASE_INCIDENCE_RADIO_BUTTON); + webDriverHelpers.clickOnWebElementBySelector( + DATA_DISPLAYED_CASE_INCIDENCE_RADIO_BUTTON); + break; + } + }); Then( "I Verify the presence of Rows, Columns, and switch-between Button in the Statistics Page", @@ -145,15 +162,37 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { Then( "I Verify the presence of Map Type Regions and Districts buttons in the Statistics Page", () -> { - webDriverHelpers.waitUntilElementIsVisibleAndClickable(MAP_TYPE_REGIONS_RADIO_BUTTON); - webDriverHelpers.waitUntilElementIsVisibleAndClickable(MAP_TYPE_DISTRICTS_RADIO_BUTTON); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(MAP_TYPE_REGIONS_RADIO_BUTTON); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(MAP_TYPE_DISTRICTS_RADIO_BUTTON); + }); + + Then( + "I Verify the presence of Chart Type buttons from the Statistics Page", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(CHART_TYPE_COLUMN_RADIO_BUTTON); + webDriverHelpers.waitUntilElementIsVisibleAndClickable( + CHART_TYPE_STACKED_COLUMN_RADIO_BUTTON); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(CHART_TYPE_LINE_RADIO_BUTTON); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(CHART_TYPE_PIE_RADIO_BUTTON); }); - Then( - "I Verify the presence of Chart Type Column buttons in the Statistics Page", - () -> { - //WIP - }); + Then( + "I Verify the presence of Show Zero Values checkbox from the Statistics Page", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(SHOW_ZERO_VALUES_CHECKBOX); + }); + + Then( + "I Verify the presence of Incidence Divisor Input from the Statistics Page", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(INCIDENCE_DIVISOR_INPUT); + }); + + Then( + "I Verify the presence of the Generate Button from the Statistics Page", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(GENERATE_BUTTON); + }); } public String[] parseEventGroupsDatabaseExportColumns(String fileName) { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature index 0dc48b4ab3b..39e84e294a6 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature @@ -23,4 +23,9 @@ Feature: Statistics tab tests And I select Visualisation type Map from the Statistics Page Then I Verify the presence of Map Type Regions and Districts buttons in the Statistics Page And I select Visualisation type Chart from the Statistics Page - Then I Verify the presence of Chart Type Column buttons in the Statistics Page + Then I Verify the presence of Chart Type buttons from the Statistics Page + And I select Options Data Displayed Case Count from the Statistics Page + Then I Verify the presence of Show Zero Values checkbox from the Statistics Page + And I select Options Data Displayed Case Incidence from the Statistics Page + Then I Verify the presence of Incidence Divisor Input from the Statistics Page + Then I Verify the presence of the Generate Button from the Statistics Page From e1c3bd1c2fbdf9ea6ebed1147e356f3a0f442bcc Mon Sep 17 00:00:00 2001 From: Jonas Cirotzki Date: Mon, 12 Sep 2022 13:09:19 +0200 Subject: [PATCH 16/45] [#9693] fix recursion --- .../java/de/symeda/sormas/backend/contact/ContactService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java index eebba714be3..5533938c184 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java @@ -1635,7 +1635,7 @@ public EditPermissionType getEditPermissionType(Contact contact) { return EditPermissionType.REFUSED; } - if (!inJurisdictionOrOwned(contact).getInJurisdiction()) { + if (Boolean.FALSE.equals(inJurisdictionOrOwned(contact).getInJurisdiction())) { return EditPermissionType.REFUSED; } @@ -1643,7 +1643,7 @@ public EditPermissionType getEditPermissionType(Contact contact) { return EditPermissionType.DOCUMENTS_ONLY; } - return getEditPermissionType(contact); + return super.getEditPermissionType(contact); } public List> getJurisdictionSelections(ContactQueryContext qc) { From ffde72e9d20afc01b0e2dd6bbc0c1db32e0c6f94 Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Mon, 12 Sep 2022 18:02:14 +0300 Subject: [PATCH 17/45] Added new locators for StatisticsPage, added test steps towards statisticsSteps, added new helper method --- .../statistics/StatisticsPage.java | 97 ++++++++++- .../e2etests/helpers/WebDriverHelpers.java | 9 ++ .../statistics/StatisticsSteps.java | 152 ++++++++++++++++++ .../features/sanity/web/Statistics.feature | 9 ++ 4 files changed, 266 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java index 679cd5bc614..67d88fbdde9 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java @@ -15,7 +15,6 @@ public class StatisticsPage { public static final By TABLE_ROWS_DROPDOWN = By.id("visualizationType"); public static final By SWITCH_ROWS_AND_COLUMNS_BUTTON = By.id("switchRowsAndColumns"); public static final By DATABASE_EXPORT_TAB = By.cssSelector("#tab-statistics-database-export"); - public static final By EVENT_GROUPS_CHECKBOX = By.xpath("//label[text()='Event groups']"); public static final By MAP_TYPE_REGIONS_RADIO_BUTTON = By.xpath("//label[text()='Regions']"); public static final By MAP_TYPE_DISTRICTS_RADIO_BUTTON = By.xpath("//label[text()='Districts']"); public static final By CHART_TYPE_COLUMN_RADIO_BUTTON = By.xpath("//label[text()='Column']"); @@ -30,4 +29,100 @@ public class StatisticsPage { public static final By SHOW_ZERO_VALUES_CHECKBOX = By.id("statisticsShowZeroValues"); public static final By INCIDENCE_DIVISOR_INPUT = By.id("incidenceDivisor"); public static final By GENERATE_BUTTON = By.id("actionGenerate"); + public static final By SELECT_ALL_BUTTON_EXPORT_DATA = By.id("actionSelectAll"); + public static final By SELECT_ALL_SORMAS_DATA_BUTTON_EXPORT_DATA = + By.id("exportSelectSormasData"); + public static final By DESELECT_ALL_SORMAS_DATA_BUTTON_EXPORT_DATA = By.id("actionDeselectAll"); + public static final By CASES_CHECKBOX = + By.xpath("//label[text()='Cases']/preceding-sibling::input"); + public static final By HOSPITALIZATIONS_CHECKBOX = + By.xpath("//label[text()='Hospitalizations']/preceding-sibling::input"); + public static final By PREVIOUS_HOSPITALIZATIONS_CHECKBOX = + By.xpath("//label[text()='Previous hospitalizations']/preceding-sibling::input"); + public static final By THERAPIES_CHECKBOX = + By.xpath("//label[text()='Therapies']/preceding-sibling::input"); + public static final By PRESCRIPTIONS_CHECKBOX = + By.xpath("//label[text()='Prescriptions']/preceding-sibling::input"); + public static final By TREATMENTS_CHECKBOX = + By.xpath("//label[text()='Treatments']/preceding-sibling::input"); + public static final By CLINICAL_COURSES_CHECKBOX = + By.xpath("//label[text()='Clinical courses']/preceding-sibling::input"); + public static final By CLINICAL_VISITS_CHECKBOX = + By.xpath("//label[text()='Clinical visits']/preceding-sibling::input"); + public static final By PORT_HEALTH_INFORMATION_CHECKBOX = + By.xpath("//label[text()='Port health information']/preceding-sibling::input"); + public static final By MATERNAL_HISTORIES_CHECKBOX = + By.xpath("//label[text()='Maternal histories']/preceding-sibling::input"); + public static final By EPIDEMIOLOGICAL_DATA_CHECKBOX = + By.xpath("//label[text()='Epidemiological data']/preceding-sibling::input"); + public static final By EXPOSURES_CHECKBOX = + By.xpath("//label[text()='Exposures']/preceding-sibling::input"); + public static final By ACTIVITIES_AS_CASE_CHECKBOX = + By.xpath("//label[text()='Activities as case']/preceding-sibling::input"); + public static final By HEALTH_CONDITIONS_CHECKBOX = + By.xpath("//label[text()='Health conditions']/preceding-sibling::input"); + public static final By CONTACTS_CHECKBOX = + By.xpath("//label[text()='Contacts']/preceding-sibling::input"); + public static final By VISITS_CHECKBOX = + By.xpath("//label[text()='Visits']/preceding-sibling::input"); + public static final By SYMPTOMS_CHECKBOX = + By.xpath("//label[text()='Symptoms']/preceding-sibling::input"); + public static final By EVENTS_CHECKBOX = + By.xpath("//label[text()='Events']/preceding-sibling::input"); + public static final By EVENT_GROUPS_CHECKBOX = + By.xpath("//label[text()='Event groups']/preceding-sibling::input"); + public static final By PERSONS_INVOLVED_CHECKBOX = + By.xpath("//label[text()='Persons involved']/preceding-sibling::input"); + public static final By ACTIONS_CHECKBOX = + By.xpath("//label[text()='Actions']/preceding-sibling::input"); + public static final By IMMUNIZATIONS_CHECKBOX = + By.xpath("//label[text()='Immunizations']/preceding-sibling::input"); + public static final By VACCINATIONS_CHECKBOX = + By.xpath("//label[text()='Vaccinations']/preceding-sibling::input"); + public static final By SAMPLES_CHECKBOX = + By.xpath("//label[text()='Samples']/preceding-sibling::input"); + public static final By PATHOGEN_TESTS_CHECKBOX = + By.xpath("//label[text()='Pathogen tests']/preceding-sibling::input"); + public static final By ADDITIONAL_TESTS_CHECKBOX = + By.xpath("//label[text()='Additional tests']/preceding-sibling::input"); + public static final By TASKS_CHECKBOX = + By.xpath("//label[text()='Tasks']/preceding-sibling::input"); + public static final By PERSONS_CHECKBOX = + By.xpath("//label[text()='Persons']/preceding-sibling::input"); + public static final By PERSON_CONTACT_DETAILS_CHECKBOX = + By.xpath("//label[text()='Person contact details']/preceding-sibling::input"); + public static final By LOCATIONS_CHECKBOX = + By.xpath("//label[text()='Locations']/preceding-sibling::input"); + public static final By OUTBREAKS_CHECKBOX = + By.xpath("//label[text()='Outbreaks']/preceding-sibling::input"); + public static final By USERS_CHECKBOX = + By.xpath("//label[text()='Users']/preceding-sibling::input"); + public static final By USER_ROLES_CHECKBOX = + By.xpath("//label[text()='User roles']/preceding-sibling::input"); + public static final By AGGREGATE_REPORTS_CHECKBOX = + By.xpath("//label[text()='Aggregate reports']/preceding-sibling::input"); + public static final By WEEKLY_REPORTS_CHECKBOX = + By.xpath("//label[text()='Weekly reports']/preceding-sibling::input"); + public static final By WEEKLY_REPORT_ENTRIES_CHECKBOX = + By.xpath("//label[text()='Weekly report entries']/preceding-sibling::input"); + public static final By DOCUMENTS_CHECKBOX = + By.xpath("//label[text()='Documents']/preceding-sibling::input"); + public static final By CONTINENTS_CHECKBOX = + By.xpath("//label[text()='Continents']/preceding-sibling::input"); + public static final By SUBCONTINENTS_CHECKBOX = + By.xpath("//label[text()='Subcontinents']/preceding-sibling::input"); + public static final By COUNTRIES_CHECKBOX = + By.xpath("//label[text()='Countries']/preceding-sibling::input"); + public static final By REGIONS_CHECKBOX = + By.xpath("//label[text()='Regions']/preceding-sibling::input"); + public static final By DISTRICTS_CHECKBOX = + By.xpath("//label[text()='Districts']/preceding-sibling::input"); + public static final By COMMUNITIES_CHECKBOX = + By.xpath("//label[text()='Communities']/preceding-sibling::input"); + public static final By FACILITIES_CHECKBOX = + By.xpath("//label[text()='Facilities']/preceding-sibling::input"); + public static final By POINTS_OF_ENTRY_CHECKBOX = + By.xpath("//label[text()='Points of entry']/preceding-sibling::input"); + public static final By POPULATION_DATA_CHECKBOX = + By.xpath("//label[text()='Population data']/preceding-sibling::input"); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java index e67608148ee..e3dc693959f 100755 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java @@ -472,6 +472,15 @@ public boolean isElementEnabledAtAttributeLevel(By elementLocator) { return true; } + public boolean isElementChecked(By elementLocator) { + scrollToElement(elementLocator); + boolean isChecked = getAttributeFromWebElement(elementLocator, "checked").equals("true"); + if (isChecked) { + return true; + } + return false; + } + public void clickOnWebElementWhichMayNotBePresent(final By byObject, final int index) { try { log.info(PID + "Clicking on element: {}", byObject); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java index 78e5a7672d2..9f1d1c8e678 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java @@ -152,6 +152,158 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { } }); + And( + "^I click on the ([^\"]*) Button in Database Export tab of Statistics Page", + (String typeOfButton) -> { + switch (typeOfButton) { + case "Select All": + webDriverHelpers.waitUntilElementIsVisibleAndClickable(SELECT_ALL_BUTTON_EXPORT_DATA); + webDriverHelpers.clickOnWebElementBySelector(SELECT_ALL_BUTTON_EXPORT_DATA); + break; + case "Select all SORMAS data": + webDriverHelpers.waitUntilElementIsVisibleAndClickable( + SELECT_ALL_SORMAS_DATA_BUTTON_EXPORT_DATA); + webDriverHelpers.clickOnWebElementBySelector( + SELECT_ALL_SORMAS_DATA_BUTTON_EXPORT_DATA); + break; + case "Deselect all": + webDriverHelpers.waitUntilElementIsVisibleAndClickable( + DESELECT_ALL_SORMAS_DATA_BUTTON_EXPORT_DATA); + webDriverHelpers.clickOnWebElementBySelector( + DESELECT_ALL_SORMAS_DATA_BUTTON_EXPORT_DATA); + break; + } + }); + + Then( + "^I verify that All Checkboxes are ([^\"]*) in Database Export tab of Statistics Page", + (String checkBoxSelection) -> { + switch (checkBoxSelection) { + case "Selected": + softly.assertTrue( + webDriverHelpers.isElementChecked(CASES_CHECKBOX), + "Cases Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(HOSPITALIZATIONS_CHECKBOX), + "Hospitalization Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(PREVIOUS_HOSPITALIZATIONS_CHECKBOX), + "Previous Hospitalization Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(THERAPIES_CHECKBOX), + "Therapies Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(PRESCRIPTIONS_CHECKBOX), + "Prescriptions Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(TREATMENTS_CHECKBOX), + "Treatments Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(TREATMENTS_CHECKBOX), + "Treatments Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(CLINICAL_COURSES_CHECKBOX), + "Clinical Courses Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(CLINICAL_VISITS_CHECKBOX), + "Clinical Visits Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(PORT_HEALTH_INFORMATION_CHECKBOX), + "Port Health Information Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(MATERNAL_HISTORIES_CHECKBOX), + "Maternal Histories Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(EPIDEMIOLOGICAL_DATA_CHECKBOX), + "Epidemiological data Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(EXPOSURES_CHECKBOX), + "Exposures Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(ACTIVITIES_AS_CASE_CHECKBOX), + "Activities as case Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(HEALTH_CONDITIONS_CHECKBOX), + "Health conditions Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(CONTACTS_CHECKBOX), + "Contacts Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(VISITS_CHECKBOX), + "Visits Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(SYMPTOMS_CHECKBOX), + "Symptoms Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(EVENTS_CHECKBOX), + "Events Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(EVENT_GROUPS_CHECKBOX), + "Events Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(PERSONS_INVOLVED_CHECKBOX), + "Persons involved Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(ACTIONS_CHECKBOX), + "Actions Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(IMMUNIZATIONS_CHECKBOX), + "Immunizations Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(VACCINATIONS_CHECKBOX), + "Vaccinations Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(SAMPLES_CHECKBOX), + "Samples Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(PATHOGEN_TESTS_CHECKBOX), + "Samples Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(ADDITIONAL_TESTS_CHECKBOX), + "Additional tests Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(ADDITIONAL_TESTS_CHECKBOX), + "Additional tests Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(TASKS_CHECKBOX), + "Tasks Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(PERSONS_CHECKBOX), + "Persons Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(PERSON_CONTACT_DETAILS_CHECKBOX), + "Person Contact Details Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(LOCATIONS_CHECKBOX), + "Locations Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(OUTBREAKS_CHECKBOX), + "Outbreaks Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(USERS_CHECKBOX), + "Users Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(USER_ROLES_CHECKBOX), + "User Roles Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(AGGREGATE_REPORTS_CHECKBOX), + "Aggregate Reports Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(WEEKLY_REPORTS_CHECKBOX), + "Weekly Reports Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(WEEKLY_REPORT_ENTRIES_CHECKBOX), + "Weekly Report Entries Checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(DOCUMENTS_CHECKBOX), + "Documents checkbox is not checked in the database export page"); + softly.assertAll(); + break; + case "Deselected": + break; + } + }); + Then( "I Verify the presence of Rows, Columns, and switch-between Button in the Statistics Page", () -> { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature index 39e84e294a6..da06f2b8a27 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature @@ -29,3 +29,12 @@ Feature: Statistics tab tests And I select Options Data Displayed Case Incidence from the Statistics Page Then I Verify the presence of Incidence Divisor Input from the Statistics Page Then I Verify the presence of the Generate Button from the Statistics Page + + @#7469_1 @env_main + Scenario: Validate Statistics directory database export tab layout + Given I log in as a Admin User + And I click on the Statistics button from navbar + And I click on the Database Export tab from Statistics directory + And I click on the Select All Button in Database Export tab of Statistics Page + Then I verify that All Checkboxes are Selected in Database Export tab of Statistics Page + And I click on the Deselect all Button in Database Export tab of Statistics Page From 648af23ceb145021f09e50b126112e1e423c187f Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Tue, 13 Sep 2022 16:31:24 +0300 Subject: [PATCH 18/45] #7469 added helper method --- .../sormas/e2etests/helpers/WebDriverHelpers.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java index e3dc693959f..cff744fa6b2 100755 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java @@ -474,13 +474,24 @@ public boolean isElementEnabledAtAttributeLevel(By elementLocator) { public boolean isElementChecked(By elementLocator) { scrollToElement(elementLocator); - boolean isChecked = getAttributeFromWebElement(elementLocator, "checked").equals("true"); + boolean isChecked = elementContainsAttribute(elementLocator, "checked"); + System.out.println(isChecked); if (isChecked) { return true; } return false; } + public boolean elementContainsAttribute(By elementLocator, String attribute) { + scrollToElement(elementLocator); + boolean result = false; + String value = baseSteps.getDriver().findElement(elementLocator).getAttribute(attribute); + if (value != null) { + result = true; + } + return result; + } + public void clickOnWebElementWhichMayNotBePresent(final By byObject, final int index) { try { log.info(PID + "Clicking on element: {}", byObject); From 9d987a48df9b0e00e13b7b5af056d742d642a082 Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Tue, 13 Sep 2022 16:32:23 +0300 Subject: [PATCH 19/45] #7469 - added more methods and locators for Statistics page/steps --- .../statistics/StatisticsPage.java | 10 + .../statistics/StatisticsSteps.java | 204 ++++++++++++++++++ .../features/sanity/web/Statistics.feature | 1 + 3 files changed, 215 insertions(+) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java index 67d88fbdde9..08d82ad2c4d 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java @@ -125,4 +125,14 @@ public class StatisticsPage { By.xpath("//label[text()='Points of entry']/preceding-sibling::input"); public static final By POPULATION_DATA_CHECKBOX = By.xpath("//label[text()='Population data']/preceding-sibling::input"); + public static final By CUSTOMIZABLE_ENUM_VALUES_CHECKBOX = + By.xpath("//label[text()='Customizable enum values']/preceding-sibling::input"); + public static final By EXPORT_CONFIGURATION_CHECKBOX = + By.xpath("//label[text()='Export configurations']/preceding-sibling::input"); + public static final By FEATURE_CONFIGURATIONS_CHECKBOX = + By.xpath("//label[text()='Feature configurations']/preceding-sibling::input"); + public static final By DISEASE_CONFIGURATIONS_CHECKBOX = + By.xpath("//label[text()='Disease configurations']/preceding-sibling::input"); + public static final By DELETION_CONFIGURATIONS_CHECKBOX = + By.xpath("//label[text()='Deletion configurations']/preceding-sibling::input"); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java index 9f1d1c8e678..743a05b39a0 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java @@ -180,6 +180,7 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { (String checkBoxSelection) -> { switch (checkBoxSelection) { case "Selected": + TimeUnit.SECONDS.sleep(1); softly.assertTrue( webDriverHelpers.isElementChecked(CASES_CHECKBOX), "Cases Checkbox is not checked in the database export page"); @@ -297,9 +298,212 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { softly.assertTrue( webDriverHelpers.isElementChecked(DOCUMENTS_CHECKBOX), "Documents checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(CONTINENTS_CHECKBOX), + "Continents checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(SUBCONTINENTS_CHECKBOX), + "Subcontinents checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(COUNTRIES_CHECKBOX), + "Countries checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(REGIONS_CHECKBOX), + "Regions checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(DISTRICTS_CHECKBOX), + "Districts checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(COMMUNITIES_CHECKBOX), + "Communities checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(FACILITIES_CHECKBOX), + "Communities checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(POINTS_OF_ENTRY_CHECKBOX), + "Points of entry checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(POPULATION_DATA_CHECKBOX), + "Population data checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(CUSTOMIZABLE_ENUM_VALUES_CHECKBOX), + "Customizable enum values checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(EXPORT_CONFIGURATION_CHECKBOX), + "Export configuration checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(FEATURE_CONFIGURATIONS_CHECKBOX), + "Feature configurations checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(DISEASE_CONFIGURATIONS_CHECKBOX), + "Disease configurations checkbox is not checked in the database export page"); + softly.assertTrue( + webDriverHelpers.isElementChecked(DELETION_CONFIGURATIONS_CHECKBOX), + "Deletion configurations checkbox is not checked in the database export page"); softly.assertAll(); break; case "Deselected": + TimeUnit.SECONDS.sleep(2); + softly.assertFalse( + webDriverHelpers.isElementChecked(CASES_CHECKBOX), + "Cases Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(HOSPITALIZATIONS_CHECKBOX), + "Hospitalization Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(PREVIOUS_HOSPITALIZATIONS_CHECKBOX), + "Previous Hospitalization Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(THERAPIES_CHECKBOX), + "Therapies Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(PRESCRIPTIONS_CHECKBOX), + "Prescriptions Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(TREATMENTS_CHECKBOX), + "Treatments Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(TREATMENTS_CHECKBOX), + "Treatments Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(CLINICAL_COURSES_CHECKBOX), + "Clinical Courses Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(CLINICAL_VISITS_CHECKBOX), + "Clinical Visits Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(PORT_HEALTH_INFORMATION_CHECKBOX), + "Port Health Information Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(MATERNAL_HISTORIES_CHECKBOX), + "Maternal Histories Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(EPIDEMIOLOGICAL_DATA_CHECKBOX), + "Epidemiological data Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(EXPOSURES_CHECKBOX), + "Exposures Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(ACTIVITIES_AS_CASE_CHECKBOX), + "Activities as case Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(HEALTH_CONDITIONS_CHECKBOX), + "Health conditions Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(CONTACTS_CHECKBOX), + "Contacts Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(VISITS_CHECKBOX), + "Visits Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(SYMPTOMS_CHECKBOX), + "Symptoms Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(EVENTS_CHECKBOX), + "Events Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(EVENT_GROUPS_CHECKBOX), + "Events Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(PERSONS_INVOLVED_CHECKBOX), + "Persons involved Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(ACTIONS_CHECKBOX), + "Actions Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(IMMUNIZATIONS_CHECKBOX), + "Immunizations Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(VACCINATIONS_CHECKBOX), + "Vaccinations Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(SAMPLES_CHECKBOX), + "Samples Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(PATHOGEN_TESTS_CHECKBOX), + "Samples Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(ADDITIONAL_TESTS_CHECKBOX), + "Additional tests Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(ADDITIONAL_TESTS_CHECKBOX), + "Additional tests Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(TASKS_CHECKBOX), + "Tasks Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(PERSONS_CHECKBOX), + "Persons Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(PERSON_CONTACT_DETAILS_CHECKBOX), + "Person Contact Details Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(LOCATIONS_CHECKBOX), + "Locations Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(OUTBREAKS_CHECKBOX), + "Outbreaks Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(USERS_CHECKBOX), + "Users Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(USER_ROLES_CHECKBOX), + "User Roles Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(AGGREGATE_REPORTS_CHECKBOX), + "Aggregate Reports Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(WEEKLY_REPORTS_CHECKBOX), + "Weekly Reports Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(WEEKLY_REPORT_ENTRIES_CHECKBOX), + "Weekly Report Entries Checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(DOCUMENTS_CHECKBOX), + "Documents checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(CONTINENTS_CHECKBOX), + "Continents checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(SUBCONTINENTS_CHECKBOX), + "Subcontinents checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(COUNTRIES_CHECKBOX), + "Countries checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(REGIONS_CHECKBOX), + "Regions checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(DISTRICTS_CHECKBOX), + "Districts checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(COMMUNITIES_CHECKBOX), + "Communities checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(FACILITIES_CHECKBOX), + "Communities checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(POINTS_OF_ENTRY_CHECKBOX), + "Points of entry checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(POPULATION_DATA_CHECKBOX), + "Population data checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(CUSTOMIZABLE_ENUM_VALUES_CHECKBOX), + "Customizable enum values checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(EXPORT_CONFIGURATION_CHECKBOX), + "Export configuration checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(FEATURE_CONFIGURATIONS_CHECKBOX), + "Feature configurations checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(DISEASE_CONFIGURATIONS_CHECKBOX), + "Disease configurations checkbox is not checked in the database export page"); + softly.assertFalse( + webDriverHelpers.isElementChecked(DELETION_CONFIGURATIONS_CHECKBOX), + "Deletion configurations checkbox is not checked in the database export page"); + softly.assertAll(); break; } }); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature index da06f2b8a27..a11c63bd6d2 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature @@ -38,3 +38,4 @@ Feature: Statistics tab tests And I click on the Select All Button in Database Export tab of Statistics Page Then I verify that All Checkboxes are Selected in Database Export tab of Statistics Page And I click on the Deselect all Button in Database Export tab of Statistics Page + Then I verify that All Checkboxes are Deselected in Database Export tab of Statistics Page From 9011c50bef94505239f9d59ce8122b907393c2a5 Mon Sep 17 00:00:00 2001 From: lb-sgent Date: Wed, 14 Sep 2022 00:27:28 +0200 Subject: [PATCH 20/45] SORQA-419 --- .../pages/application/cases/EditCasePage.java | 9 +++++++ .../web/application/cases/EditCaseSteps.java | 14 +++++++++++ .../features/sanity/web/Case.feature | 25 ++++++++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java index acbb9b305e4..b9041838a80 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java @@ -360,4 +360,13 @@ public static By getByImmunizationUuid(String immunizationUuid) { public static final By LINKED_SHARED_ORGANIZATION_SELECTED_VALUE = By.xpath( "//div[@location='sormasToSormas']//div[@class='v-slot v-slot-s-list-entry v-slot-s-list-entry-no-border']"); + public static final By CLINICAL_ASSESSMENTS_LABEL_DE = + By.xpath("//div[contains(text(), 'Klinische Bewertungen')]"); + + public static By getPreExistingConditionCombobox_DE(String id) { + return By.xpath( + String.format( + "//div[@id='%s']//input[@value='on']/following-sibling::label[contains(text(),'Ja') or contains(text(),'Nein') or contains(text(),'Unbekannt')]", + id)); + } } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index fb5f1572f2d..f38460ccab4 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -2488,6 +2488,20 @@ public EditCaseSteps( break; } }); + + And( + "I check that {string} Pre-existing condition is visible on page", + (String preExistingCondition) -> { + Assert.assertTrue( + webDriverHelpers.isElementEnabled( + getPreExistingConditionCombobox_DE(preExistingCondition))); + }); + + Then( + "I check that Clinical Assessments heading is visible in DE", + () -> + Assert.assertTrue( + webDriverHelpers.isElementVisibleWithTimeout(CLINICAL_ASSESSMENTS_LABEL_DE, 15))); } private Vaccination collectVaccinationData() { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index 077be86fd3f..6f3868e7134 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1798,4 +1798,27 @@ Feature: Case end to end tests And I apply "Archived cases" to combobox on Case Directory Page And I check that number of displayed cases results is 1 And I apply "All cases" to combobox on Case Directory Page - And I check that number of displayed cases results is 1 \ No newline at end of file + And I check that number of displayed cases results is 1 + + @tmsLink=SORDEV-9789 @env_de + Scenario: Test Move health conditions from clinical course to the case + Given API: I create a new person + And API: I check that POST call body is "OK" + And API: I check that POST call status code is 200 + Given API: I create a new case + Then API: I check that POST call body is "OK" + And API: I check that POST call status code is 200 + Given I log in as a National User + Then I navigate to the last created case via the url + And I check that "diabetes" Pre-existing condition is visible on page + And I check that "immunodeficiencyIncludingHiv" Pre-existing condition is visible on page + And I check that "chronicLiverDisease" Pre-existing condition is visible on page + And I check that "malignancyChemotherapy" Pre-existing condition is visible on page + And I check that "chronicPulmonaryDisease" Pre-existing condition is visible on page + And I check that "chronicKidneyDisease" Pre-existing condition is visible on page + And I check that "chronicNeurologicCondition" Pre-existing condition is visible on page + And I check that "cardiovascularDiseaseIncludingHypertension" Pre-existing condition is visible on page + Then I click on Clinical Course tab from Edit Case page + Then I check that Clinical Assessments heading is visible in DE + + From 5d9877d4e40389ef185a94e2f064de0f7ab3c994 Mon Sep 17 00:00:00 2001 From: lb-sgent Date: Wed, 14 Sep 2022 01:26:02 +0200 Subject: [PATCH 21/45] SORQA-419 --- .../pages/application/cases/EditCasePage.java | 7 ++++++ .../application/cases/CaseDirectorySteps.java | 1 + .../web/application/cases/EditCaseSteps.java | 15 +++++++---- .../sanity/web/CaseImportExport.feature | 25 ++++++++++++++++++- ...eExistingCondition_DetailedImport_Test.csv | 5 ++++ 5 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 sormas-e2e-tests/uploads/PreExistingCondition_DetailedImport_Test.csv diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java index b9041838a80..4c388e5617f 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java @@ -369,4 +369,11 @@ public static By getPreExistingConditionCombobox_DE(String id) { "//div[@id='%s']//input[@value='on']/following-sibling::label[contains(text(),'Ja') or contains(text(),'Nein') or contains(text(),'Unbekannt')]", id)); } + + public static By getPreExistingConditionComboboxWithValue_DE(String id, String value) { + return By.xpath( + String.format( + "//div[@id='%s']//input[@value='on' and @checked]/following-sibling::label[contains(text(),'%s')]", + id, value)); + } } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java index 18f7c2c2e89..3392c8e2a19 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java @@ -252,6 +252,7 @@ public CaseDirectorySteps( webDriverHelpers.waitForPageLoadingSpinnerToDisappear(40); webDriverHelpers.waitUntilElementIsVisibleAndClickable(FIRST_CASE_ID_BUTTON); webDriverHelpers.clickOnWebElementBySelector(FIRST_CASE_ID_BUTTON); + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(40); }); When( diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index f38460ccab4..b304172cbd1 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -2491,11 +2491,16 @@ public EditCaseSteps( And( "I check that {string} Pre-existing condition is visible on page", - (String preExistingCondition) -> { - Assert.assertTrue( - webDriverHelpers.isElementEnabled( - getPreExistingConditionCombobox_DE(preExistingCondition))); - }); + (String preExistingCondition) -> + Assert.assertTrue( + webDriverHelpers.isElementEnabled( + getPreExistingConditionCombobox_DE(preExistingCondition)))); + And( + "I check that {string} Pre-existing condition have {string} selected", + (String preExistingCondition, String value) -> + Assert.assertTrue( + webDriverHelpers.isElementEnabled( + getPreExistingConditionComboboxWithValue_DE(preExistingCondition, value)))); Then( "I check that Clinical Assessments heading is visible in DE", diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/CaseImportExport.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/CaseImportExport.feature index d1d5f477a75..29f978bd21b 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/CaseImportExport.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/CaseImportExport.feature @@ -146,4 +146,27 @@ Feature: Case import and export tests And I select Responsible user data to export in existing Export Configuration for Custom Case Export Then I click Save Button from Custom Case Export Configuration When I download created custom case export file - When I check if downloaded data generated by custom case export is correct \ No newline at end of file + When I check if downloaded data generated by custom case export is correct + + @tmsLink=SORDEV-9789 @env_de + Scenario: Test healt conditions from imported case + Given I log in as a Admin User + Then I click on the Cases button from navbar + And I click on the Import button from Case directory + And I click on the detailed button from import Case tab + Then I select the "PreExistingCondition_DetailedImport_Test.csv" CSV file in the file picker + And I click on the "DATENIMPORT STARTEN" button from the Import Case popup + Then I click to create new person from the Case Import popup + And I check that an import success notification appears in the Import Case popup + Then I close Import Cases form + And I filter by "Margret Schmitt" as a Person's full name on Case Directory Page + And I click APPLY BUTTON in Case Directory Page + And I open last created case + And I check that "diabetes" Pre-existing condition have "Ja" selected + And I check that "immunodeficiencyIncludingHiv" Pre-existing condition have "Ja" selected + And I check that "chronicLiverDisease" Pre-existing condition have "Nein" selected + And I check that "malignancyChemotherapy" Pre-existing condition have "Unbekannt" selected + And I check that "chronicPulmonaryDisease" Pre-existing condition have "Ja" selected + And I check that "chronicKidneyDisease" Pre-existing condition have "Ja" selected + And I check that "chronicNeurologicCondition" Pre-existing condition have "Ja" selected + And I check that "cardiovascularDiseaseIncludingHypertension" Pre-existing condition have "Ja" selected \ No newline at end of file diff --git a/sormas-e2e-tests/uploads/PreExistingCondition_DetailedImport_Test.csv b/sormas-e2e-tests/uploads/PreExistingCondition_DetailedImport_Test.csv new file mode 100644 index 00000000000..9980ef012a7 --- /dev/null +++ b/sormas-e2e-tests/uploads/PreExistingCondition_DetailedImport_Test.csv @@ -0,0 +1,5 @@ +CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Location;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;Person;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;HealthConditions;HealthConditions;HealthConditions;HealthConditions;HealthConditions;HealthConditions;HealthConditions;HealthConditions;HealthConditions;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;Hospitalization;Hospitalization;Hospitalization;Hospitalization;Hospitalization;Hospitalization;Hospitalization;Hospitalization;Hospitalization;Hospitalization;Hospitalization;Hospitalization;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;Symptoms;EpiData;EpiData;EpiData;EpiData;EpiData;EpiData;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;MaternalHistory;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;PortHealthInfo;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;CaseData;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;Sample;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;PathogenTest;HealthConditions;HealthConditions;HealthConditions;HealthConditions;HealthConditions;HealthConditions;HealthConditions;HealthConditions;HealthConditions;Vaccination;Vaccination;Vaccination;Vaccination;Vaccination;Vaccination;Vaccination;Vaccination;Vaccination;Vaccination;Vaccination;Vaccination;Vaccination;Vaccination;Vaccination +disease;diseaseVariant;diseaseDetails;diseaseVariantDetails;plagueType;dengueFeverType;rabiesType;person.firstName;person.lastName;person.salutation;person.otherSalutation;person.birthName;person.namesOfGuardians;person.sex;person.birthdateDD;person.birthdateMM;person.birthdateYYYY;person.approximateAge;person.approximateAgeType;person.approximateAgeReferenceDate;person.presentCondition;person.deathDate;person.causeOfDeath;person.causeOfDeathDisease;person.causeOfDeathDetails;person.deathPlaceType;person.deathPlaceDescription;person.burialDate;person.burialPlaceDescription;person.burialConductor;person.address.continent;person.address.subcontinent;person.address.country;person.address.region;person.address.district;person.address.community;person.address.city;person.address.areaType;person.address.latitude;person.address.longitude;person.address.latLonAccuracy;person.address.postalCode;person.address.street;person.address.houseNumber;person.address.additionalInformation;person.address.addressType;person.address.addressTypeDetails;person.address.facilityType;person.address.facility;person.address.facilityDetails;person.address.contactPersonFirstName;person.address.contactPersonLastName;person.address.contactPersonPhone;person.address.contactPersonEmail;person.occupationType;person.occupationDetails;person.armedForcesRelationType;person.symptomJournalStatus;person.externalId;person.externalToken;person.internalToken;person.birthCountry;person.citizenship;person.additionalDetails;person.phone;person.emailAddress;reportDate;regionLevelDate;nationalLevelDate;districtLevelDate;caseClassification;caseIdentificationSource;screeningType;classificationDate;classificationComment;clinicalConfirmation;epidemiologicalConfirmation;laboratoryDiagnosticConfirmation;investigationStatus;investigatedDate;outcome;outcomeDate;sequelae;sequelaeDetails;responsibleRegion;responsibleDistrict;responsibleCommunity;region;district;community;facilityType;healthFacility;healthFacilityDetails;healthConditions.diabetes;healthConditions.chronicLiverDisease;healthConditions.malignancyChemotherapy;healthConditions.chronicPulmonaryDisease;healthConditions.chronicKidneyDisease;healthConditions.chronicNeurologicCondition;healthConditions.cardiovascularDiseaseIncludingHypertension;healthConditions.immunodeficiencyIncludingHiv;healthConditions.otherConditions;pregnant;vaccinationStatus;smallpoxVaccinationScar;smallpoxVaccinationReceived;smallpoxLastVaccinationDate;clinicianName;clinicianPhone;clinicianEmail;notifyingClinic;notifyingClinicDetails;reportLat;reportLon;reportLatLonAccuracy;hospitalization.admittedToHealthFacility;hospitalization.admissionDate;hospitalization.dischargeDate;hospitalization.isolated;hospitalization.isolationDate;hospitalization.leftAgainstAdvice;hospitalization.intensiveCareUnit;hospitalization.intensiveCareUnitStart;hospitalization.intensiveCareUnitEnd;hospitalization.hospitalizationReason;hospitalization.otherHospitalizationReason;hospitalization.description;symptoms.bloodPressureDiastolic;symptoms.bloodPressureSystolic;symptoms.chillsSweats;symptoms.cough;symptoms.diarrhea;symptoms.difficultyBreathing;symptoms.fever;symptoms.glasgowComaScale;symptoms.headache;symptoms.heartRate;symptoms.height;symptoms.midUpperArmCircumference;symptoms.musclePain;symptoms.nausea;symptoms.onsetDate;symptoms.onsetSymptom;symptoms.otherNonHemorrhagicSymptoms;symptoms.otherNonHemorrhagicSymptomsText;symptoms.rapidBreathing;symptoms.respiratoryRate;symptoms.runnyNose;symptoms.soreThroat;symptoms.symptomsComments;symptoms.temperature;symptoms.temperatureSource;symptoms.acuteRespiratoryDistressSyndrome;symptoms.pneumoniaClinicalOrRadiologic;symptoms.lossOfTaste;symptoms.lossOfSmell;symptoms.respiratoryDiseaseVentilation;symptoms.feelingIll;symptoms.fastHeartRate;symptoms.oxygenSaturationLower94;symptoms.weight;symptoms.shivering;epiData.exposureDetailsKnown;epiData.activityAsCaseDetailsKnown;epiData.contactWithSourceCaseKnown;epiData.highTransmissionRiskArea;epiData.largeOutbreaksArea;epiData.areaInfectedAnimals;maternalHistory.childrenNumber;maternalHistory.ageAtBirth;maternalHistory.conjunctivitis;maternalHistory.conjunctivitisOnset;maternalHistory.conjunctivitisMonth;maternalHistory.maculopapularRash;maternalHistory.maculopapularRashOnset;maternalHistory.maculopapularRashMonth;maternalHistory.swollenLymphs;maternalHistory.swollenLymphsOnset;maternalHistory.swollenLymphsMonth;maternalHistory.arthralgiaArthritis;maternalHistory.arthralgiaArthritisOnset;maternalHistory.arthralgiaArthritisMonth;maternalHistory.otherComplications;maternalHistory.otherComplicationsOnset;maternalHistory.otherComplicationsMonth;maternalHistory.otherComplicationsDetails;maternalHistory.rubella;maternalHistory.rubellaOnset;maternalHistory.rashExposure;maternalHistory.rashExposureDate;maternalHistory.rashExposureMonth;maternalHistory.rashExposureRegion;maternalHistory.rashExposureDistrict;maternalHistory.rashExposureCommunity;portHealthInfo.airlineName;portHealthInfo.flightNumber;portHealthInfo.departureDateTime;portHealthInfo.arrivalDateTime;portHealthInfo.freeSeating;portHealthInfo.seatNumber;portHealthInfo.departureAirport;portHealthInfo.numberOfTransitStops;portHealthInfo.transitStopDetails1;portHealthInfo.transitStopDetails2;portHealthInfo.transitStopDetails3;portHealthInfo.transitStopDetails4;portHealthInfo.transitStopDetails5;portHealthInfo.vesselName;portHealthInfo.vesselDetails;portHealthInfo.portOfDeparture;portHealthInfo.lastPortOfCall;portHealthInfo.conveyanceType;portHealthInfo.conveyanceTypeDetails;portHealthInfo.departureLocation;portHealthInfo.finalDestination;portHealthInfo.details;caseOrigin;pointOfEntry;pointOfEntryDetails;additionalDetails;externalID;externalToken;internalToken;sharedToCountry;nosocomialOutbreak;infectionSetting;quarantine;quarantineTypeDetails;quarantineFrom;quarantineTo;quarantineHelpNeeded;quarantineOrderedVerbally;quarantineOrderedOfficialDocument;quarantineOrderedVerballyDate;quarantineOrderedOfficialDocumentDate;quarantineHomePossible;quarantineHomePossibleComment;quarantineHomeSupplyEnsured;quarantineHomeSupplyEnsuredComment;quarantineExtended;quarantineReduced;quarantineOfficialOrderSent;quarantineOfficialOrderSentDate;postpartum;trimester;followUpStatus;followUpComment;followUpUntil;overwriteFollowUpUntil;prohibitionToWork;prohibitionToWorkFrom;prohibitionToWorkUntil;reInfection;previousInfectionDate;bloodOrganOrTissueDonated;notACaseReasonNegativeTest;notACaseReasonPhysicianInformation;notACaseReasonDifferentPathogen;notACaseReasonOther;notACaseReasonDetails;followUpStatusChangeDate;dontShareWithReportingTool;caseReferenceDefinition;previousQuarantineTo;quarantineChangeComment;externalData;labSampleID;fieldSampleID;sampleDateTime;reportDateTime;sampleMaterial;sampleMaterialText;samplePurpose;lab;labDetails;shipmentDate;shipmentDetails;receivedDate;specimenCondition;noTestPossibleReason;comment;sampleSource;shipped;received;pathogenTestResult;samplingReason;samplingReasonDetails;testedDisease;testedDiseaseVariant;testedDiseaseDetails;testedDiseaseVariantDetails;typingId;testType;pcrTestSpecification;testTypeText;testDateTime;lab;labDetails;testResult;testResultText;testResultVerified;fourFoldIncreaseAntibodyTiter;serotype;cqValue;reportDate;viaLims;externalId;externalOrderId;preliminary;healthConditions.diabetes;healthConditions.chronicLiverDisease;healthConditions.malignancyChemotherapy;healthConditions.chronicPulmonaryDisease;healthConditions.chronicKidneyDisease;healthConditions.chronicNeurologicCondition;healthConditions.cardiovascularDiseaseIncludingHypertension;healthConditions.immunodeficiencyIncludingHiv;healthConditions.otherConditions;reportDate;vaccinationDate;vaccineName;otherVaccineName;vaccineManufacturer;otherVaccineManufacturer;vaccineType;vaccineDose;vaccineInn;vaccineBatchNumber;vaccineUniiCode;vaccineAtcCode;vaccinationInfoSource;pregnant;trimester +##Krankheit;Krankheitsvariante;Name der Krankheit;Details zur Krankheitsvariante;Seuchentyp;Dengue-Fieber Art;Tollwutart;Vorname;Nachname;Anrede;Andere Anrede;Geburtsname;Namen der Erziehungsberechtigten/ gesetzlichen Vertreter;Geschlecht;Tag der Geburt;Geburtsmonat;Geburtsjahr;Alter;Einheit;Letzte Aktualisierung;Aktueller Zustand der Person;Datum des Todes;Todesursache;Verantwortliche Krankheit;Spezifizierte Todesursache;Art des Todesorts;Beschreibung des Sterbeorts;Datum der Bestattung;Beschreibung des Bestattungsorts;Bestattungsunternehmer;continent;subcontinent;country;region;district;community;Stadt;Gebietsart (städtisch/ländlich);GPS Breitengrad;GPS Längengrad;GPS-Genauigkeit in m;Postleitzahl;Straße;Hausnummer;Weitere Informationen;Adresstyp;Adressenname / Beschreibung;Art der Einrichtung;Einrichtung;Name & Beschreibung der Einrichtung;Ansprechperson Vorname;Ansprechperson Nachname;Telefonnummer der Ansprechperson;E-Mail-Adresse der Ansprechperson;Beschäftigungsart;Details;Zugehörigkeit zur Bundeswehr;Symptomtagebuch-Status;Externe ID;Externes Aktenzeichen;Internes Aktenzeichen;Geburtsland;Staatsangehörigkeit;Allgemeiner Kommentar;Primäre Telefonnummer;Primäre E-Mail-Adresse;Meldedatum;Empfangsdatum auf Bundesland-Ebene;Empfangsdatum auf nationaler Ebene;Empfangsdatum auf Landkreis-Ebene;Falldefinitionskategorie;Fall bekannt durch;Testung/Reihenuntersuchung;Datum der Klassifizierung;Kommentar zur Klassifizierung;Klinische Bestätigung;Epidemiologische Bestätigung;Labordiagnostische Bestätigung;Untersuchungsstatus;Untersuchungsdatum;Verlauf der Erkrankung des Falls;Datum des Verlaufs;Folgeschäden;Beschreiben Sie die Folgeschäden;Zuständiges Bundesland;Zuständige/r Landkreis/Kreisfreie Stadt;Zuständige Gemeinde;Bundesland;Landkreis/Kreisfreie Stadt;Gemeinde;Art der Einrichtung;Einrichtung;Name & Beschreibung der Einrichtung;Diabetes;Leberkrankheit;Krebserkrankung;Chronische Lungenerkrankung;Nierenerkrankung;Chronische neurologische/neuromuskuläre Erkrankung;Herz-Kreislauf-Erkrankung einschließlich Hypertonie;Immunschwäche, einschließlich HIV;Zusätzliche relevante Vorerkrankungen;Schwangerschaft;Impfstatus;Ist eine Pockenimpfungsnarbe vorhanden?;Wurde in der Vergangenheit eine Pockenimpfung erhalten?;Datum der letzten Pockenimpfung;Name der/des verantwortlichen Ärztin/Arztes;Telefonnummer der*des zuständigen Ärztin/Arztes;E-Mail-Adresse der*des verantwortlichen Ärztin/Arztes;Berichtende Klinik;Details der benachrichtigenden Klinik;Gemeldeter GPS-Breitengrad;Gemeldeter GPS-Längengrad;GPS-Genauigkeit in m;admittedToHealthFacility;admissionDate;dischargeDate;isolated;isolationDate;leftAgainstAdvice;intensiveCareUnit;intensiveCareUnitStart;intensiveCareUnitEnd;hospitalizationReason;otherHospitalizationReason;Beschreibung;Blutdruck (diastolisch);Blutdruck (systolisch);Schüttelfrost oder Schwitzen;Husten;Durchfall;Schwierigkeiten beim Atmen/Dyspnoe;Fieber;Glasgow Coma Score;Kopfschmerzen;Herzfrequenz (bpm);Größe (cm);Mittlerer-Oberarm-Umfang (cm);Muskelschmerz;Ãœbelkeit;Datum des Symptombeginns;Erstes Symptom;Andere klinische Symptome;Andere Symptome angeben;Schnelle Atmung (Tachypnoe);Atemgeschwindigkeit (bpm);Laufende Nase;Halsentzündung/Pharyngitis;Kommentare;Aktuelle Körpertemperatur in ° C;Art der Temperaturmessung;Akutes Atemnotsyndrom (ARDS);Lungenentzündung (klinisch oder radiologisch);Geschmacksverlust;Geruchsverlust;Respiratorische Insuffizienz, die eine assistierte Beatmung erfordert;Schweres Krankheitsgefühl;Erhöhte Herzfrequenz (Tachykardie);Sauerstoffsättigung < 94 %;Gewicht (kg);Frösteln;Expositionsdetails bekannt;Details zur Betreuung/Unterbringung/Tätigkeit in Einrichtung bekannt;Kontakte mit Indexfall bekannt;Wohnen oder Arbeiten in einem Gebiet mit hohem Ãœbertragungsrisiko der Krankheit, z.B. in geschlossenen Wohn- und Camp-ähnlichen Umgebungen;Wohnen oder Reisen in Ländern/Territorien/Gebieten mit größeren Ausbrüchen lokaler Transmissionen;Wohnen, Arbeiten oder Reisen in ein Gebiet, in dem infizierte Tiere bestätigt wurden;Gesamtzahl der Kinder;Das Alter der Mutter bei der Geburt de*r Patient*in;Konjunktivitis;Datum des Beginns;Schwangerschaftsmonat;Makulopapulärer Ausschlag;Datum des Beginns;Schwangerschaftsmonat;Geschwollene Lymphknoten;Datum des Beginns;Schwangerschaftsmonat;Arthralgie/Arthritis;Datum des Beginns;Schwangerschaftsmonat;Andere Komplikationen;Datum des Beginns;Schwangerschaftsmonat;Komplikationsdetails;Röteln (labordiagnostisch bestätigt);Datum des Beginns;Exposition zu Ausschlag während der Schwangerschaft;Datum der Exposition;Schwangerschaftsmonat;Bundesland;Landkreis;Gemeinde;Name der Fluggesellschaft;Flugnummer;Datum und Uhrzeit der Abreise;Datum und Uhrzeit der Ankunft;Freier Sitzplatz?;Sitznummer;Abreiseflughafen;Anzahl der Zwischenstopps;Details zum ersten Zwischenstopp;Details zum zweiten Zwischenstopp;Details zum dritten Zwischenstopp;Details zum vierten Zwischenstopp;Details zum fünften Zwischenstopp;Schiffsname;Schiffsdetails;Abreisehafen;Letzter Anlaufhafen;Beförderungstyp;Geben Sie den Beförderungstyp an;Abreiseort;Reiseziel;Einreiseort Details;Fall-Ursprung;Einreiseort;Einreiseort Name und Beschreibung;Allgemeiner Kommentar;Externe ID;Externes Aktenzeichen;Internes Aktenzeichen;Diesen Fall mit dem gesamten Land teilen;Resultierte aus einem nosokomialen Ausbruch;Infektionsumfeld;Isolation;Isolation Details;Beginn der Isolation;Ende der Isolation;Maßnahmen zur Gewährleistung der Versorgung?;Isolation mündlich verordnet?;Isolation schriftlich verordnet?;Datum der mündlichen Anordnung;Datum der schriftlichen Anordnung;Häusliche Isolation möglich?;Kommentar;Versorgung sichergestellt?;Kommentar;Isolation verlängert?;Isolationszeitraum verkürzt?;Offizieller Isolationsbescheid versendet?;Offizieller Isolationsbescheid wurde versendet am;Postpartum;Trimester;Nachverfolgungs-Status;Nachverfolgungs-Status-Kommentar;Nachverfolgung bis;Ende der Nachverfolgung überschreiben;Tätigkeitsverbot;Beginn des Tätigkeitsverbots;Ende des Tätigkeitsverbots;Reinfektion;Datum der vorherigen Infektion;Blut-/Organ-/Gewebespende in den letzten 6 Monaten;Negatives Testergebnis zur Krankheit;Information durch Arzt/Ärztin;Nachweis eines anderen Erregers;Sonstiges;Details zum Grund;Datum der Nachverfolgungs-Statusänderung;Senden an die Meldesoftware verhindern;Referenzdefinition;Vorheriges Ende der Isolation;Kommentar zur Änderung der Isolation;Externe Daten;Labor Proben-ID;Feld Proben-ID;Probenentnahme-Datum;Meldedatum;Probentyp;Anderer Typ angeben;Zweck der Probe;Labor;Laborname & Beschreibung;Datum Probenversendung;Versanddetails;Datum des Erhalts der Probe im Labor;Probenzustand;Grund;Kommentar;Probenquelle;Versandt;Erhalten;Endergebnis des Labors;Grund für Probenentnahme/Testen;Details zum Grund der Probenentnahme;Getestete Krankheit;Getestete Krankheitsvariante;Name der getesteten Krankheit;Details zur Krankheitsvariante;Typisierungs-ID;Art des Tests;Nukleinsäure-Nachweis Testspezifikation;Testdetails angeben;Datum und Uhrzeit des Ergebnisses;Labor;Laborname & Beschreibung;Testergebnis;Testergebnisdetails;Ergebnis verifiziert von Laborleitung;4-fache Erhöhung des Antikörpertiters;Serotyp;CQ/CT Wert;Datum der Meldung;Via DEMIS;Externe ID;Externe verknüpfte Auftragsnummer;Vorläufig;Diabetes;Leberkrankheit;Krebserkrankung;Chronische Lungenerkrankung;Nierenerkrankung;Chronische neurologische/neuromuskuläre Erkrankung;Herz-Kreislauf-Erkrankung einschließlich Hypertonie;Immunschwäche, einschließlich HIV;Zusätzliche relevante Vorerkrankungen;Meldedatum;Impfdatum;Impfstoffname;Impfstoffname-Details;Impfstoffhersteller;Impfstoffhersteller-Details;Impfstofftyp;Impfstoffdosis;INN;Chargennummer;UNII-Code;ATC-Code;Impf-Informationsquelle;Schwanger;Trimester +##CORONAVIRUS;;Text;Text;BUBONIC,PNEUMONIC,SEPTICAEMIC;DENGUE_FEVER,DENGUE_HEMORRHAGIC_FEVER,DENUGE_SHOCK_SYNDROME;FURIOUS_RABIES,PARALYTIC_RABIES;Text;Text;MR,MRS,MR_AND_MRS,FAMILY,GUARDIAN_OF_MINOR,OTHER;Text;Text;Text;MALE,FEMALE,OTHER,UNKNOWN;Nummer;Nummer;Nummer;Nummer;YEARS,MONTHS,DAYS;Datum: dd/MM/yyyy;ALIVE,DEAD,BURIED,UNKNOWN;Datum: dd/MM/yyyy;EPIDEMIC_DISEASE,OTHER_CAUSE;CORONAVIRUS;Text;COMMUNITY,HOSPITAL,OTHER;Text;Datum: dd/MM/yyyy;Text;FAMILY_COMMUNITY,OUTBREAK_TEAM;Name von Continent;Name von Subcontinent;Name von Country;Name von Region;Name von District;Name von Community;Text;URBAN,RURAL,UNKNOWN;Nummer;Nummer;Nummer;Text;Text;Text;Text;HOME,PLACE_OF_RESIDENCE,PLACE_OF_EXPOSURE,PLACE_OF_WORK,PLACE_OF_ISOLATION,EVENT_LOCATION,OTHER_ADDRESS;Text;ASSOCIATION,BUSINESS,BAR,CAMPSITE,CANTINE,CHILDRENS_DAY_CARE,CHILDRENS_HOME,CORRECTIONAL_FACILITY,CRUISE_SHIP,ELDERLY_DAY_CARE,EVENT_VENUE,FOOD_STALL,HOLIDAY_CAMP,HOMELESS_SHELTER,HOSPITAL,HOSTEL,HOTEL,KINDERGARTEN,LABORATORY,MASS_ACCOMMODATION,MILITARY_BARRACKS,MOBILE_NURSING_SERVICE,NIGHT_CLUB,OTHER_ACCOMMODATION,OTHER_CARE_FACILITY,OTHER_CATERING_OUTLET,OTHER_EDUCATIONAL_FACILITY,OTHER_LEISURE_FACILITY,OTHER_MEDICAL_FACILITY,OTHER_RESIDENCE,OTHER_WORKING_PLACE,OTHER_COMMERCE,OUTPATIENT_TREATMENT_FACILITY,PLACE_OF_WORSHIP,PUBLIC_PLACE,REFUGEE_ACCOMMODATION,REHAB_FACILITY,RESTAURANT,RETIREMENT_HOME,RETAIL,WHOLESALE,SCHOOL,SWIMMING_POOL,THEATER,UNIVERSITY,ZOO,AMBULATORY_SURGERY_FACILITY,DIALYSIS_FACILITY,DAY_HOSPITAL,MATERNITY_FACILITY,MEDICAL_PRACTICE,DENTAL_PRACTICE,OTHER_MEDICAL_PRACTICE,DIAGNOSTIC_PREVENTATIVE_THERAPEUTIC_FACILITY,EMERGENCY_MEDICAL_SERVICES,ELDERLY_CARE_FACILITY,DISABLED_PERSON_HABITATION,CARE_RECIPIENT_HABITATION,VISITING_AMBULATORY_AID,AFTER_SCHOOL;Name einer konfigurierten Einrichtung (facilityType erforderlich), OTHER_FACILITY (facilityType und healthFacilityDetails erforderlich) oder NO_FACILITY;Text;Text;Text;Text;Text;RETAIL_AND_REPAIR_SERVICE,MANUFACTURING,CONSTRUCTION,TRANSPORT_AND_STORAGE,HEALTH_AND_SOCIAL,EDUCATION,ACCOMMODATION_AND_FOOD_SERVICES,ARTS_ENTERTAINMENT_AND_RECREATION,PUBLIC_ADMINISTRATION_AND_DEFENCE,FINANCE_AND_INSURANCE,INFORMATION_AND_COMMUNICATION,PROFESSIONAL_SCIENTIFIC_AND_TECHNICAL,ADMINISTRATIVE_AND_SUPPORT,SERVICE_OTHER,REAL_ESTATE,ENERGY_SUPPLY,WATER_SUPPLY_AND_WASTE,EXTRATERRITORIAL_ORGANIZATIONS,AGRICULTURE,MINING,PRIVATE_HOUSEHOLD,FARMER,BUTCHER,HUNTER_MEAT_TRADER,MINER,RELIGIOUS_LEADER,HOUSEWIFE,PUPIL_STUDENT,CHILD,BUSINESSMAN_WOMAN,TRANSPORTER,HEALTHCARE_WORKER,TRADITIONAL_SPIRITUAL_HEALER,WORKING_WITH_ANIMALS,LABORATORY_STAFF,OTHER;Text;UNKNOWN,NO_RELATION,CIVIL,SOLDIER_OR_RELATIVE;UNREGISTERED,REGISTERED,ACCEPTED,REJECTED,DELETED;Text;Text;Text;Name von Country;Name von Country;Text;Text;Text;Datum: dd/MM/yyyy;Datum: dd/MM/yyyy;Datum: dd/MM/yyyy;Datum: dd/MM/yyyy;NOT_CLASSIFIED,SUSPECT,PROBABLE,CONFIRMED,CONFIRMED_NO_SYMPTOMS,CONFIRMED_UNKNOWN_SYMPTOMS,NO_CASE;UNKNOWN,OUTBREAK_INVESTIGATION,CONTACT_TRACKING_APP,SUSPICION_REPORT,CONTACT_TRACING,SCREENING,OTHER;ON_HOSPITAL_ADMISSION,ON_CARE_HOME_ADMISSION,ON_ASYLUM_ADMISSION,ON_ENTRY_FROM_RISK_AREA,HEALTH_SECTOR_EMPLOYEE,EDUCATIONAL_INSTITUTIONS,SELF_ARRANGED_TEST,SELF_CONDUCTED_TEST,OTHER;Datum: dd/MM/yyyy;Text;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;PENDING,DONE,DISCARDED;Datum: dd/MM/yyyy;NO_OUTCOME,DECEASED,RECOVERED,UNKNOWN;Datum: dd/MM/yyyy;YES,NO,UNKNOWN;Text;Name von Region;Name von District;Name von Community;Name von Region;Name von District;Name von Community;ASSOCIATION,BUSINESS,BAR,CAMPSITE,CANTINE,CHILDRENS_DAY_CARE,CHILDRENS_HOME,CORRECTIONAL_FACILITY,CRUISE_SHIP,ELDERLY_DAY_CARE,EVENT_VENUE,FOOD_STALL,HOLIDAY_CAMP,HOMELESS_SHELTER,HOSPITAL,HOSTEL,HOTEL,KINDERGARTEN,LABORATORY,MASS_ACCOMMODATION,MILITARY_BARRACKS,MOBILE_NURSING_SERVICE,NIGHT_CLUB,OTHER_ACCOMMODATION,OTHER_CARE_FACILITY,OTHER_CATERING_OUTLET,OTHER_EDUCATIONAL_FACILITY,OTHER_LEISURE_FACILITY,OTHER_MEDICAL_FACILITY,OTHER_RESIDENCE,OTHER_WORKING_PLACE,OTHER_COMMERCE,OUTPATIENT_TREATMENT_FACILITY,PLACE_OF_WORSHIP,PUBLIC_PLACE,REFUGEE_ACCOMMODATION,REHAB_FACILITY,RESTAURANT,RETIREMENT_HOME,RETAIL,WHOLESALE,SCHOOL,SWIMMING_POOL,THEATER,UNIVERSITY,ZOO,AMBULATORY_SURGERY_FACILITY,DIALYSIS_FACILITY,DAY_HOSPITAL,MATERNITY_FACILITY,MEDICAL_PRACTICE,DENTAL_PRACTICE,OTHER_MEDICAL_PRACTICE,DIAGNOSTIC_PREVENTATIVE_THERAPEUTIC_FACILITY,EMERGENCY_MEDICAL_SERVICES,ELDERLY_CARE_FACILITY,DISABLED_PERSON_HABITATION,CARE_RECIPIENT_HABITATION,VISITING_AMBULATORY_AID,AFTER_SCHOOL;Name einer konfigurierten Einrichtung (facilityType erforderlich), OTHER_FACILITY (facilityType und healthFacilityDetails erforderlich) oder NO_FACILITY;Text;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;Text;YES,NO,UNKNOWN;VACCINATED,UNVACCINATED,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;Text;Text;Text;PEDIATRIC_INPATIENT,NURSERY,EPU,CHER,OPD,EYE,ENT,CARDIOLOGY,OTHER;Text;Nummer;Nummer;Nummer;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;Datum: dd/MM/yyyy;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;YES,NO,UNKNOWN;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;Datum: dd/MM/yyyy;REPORTED_DISEASE,ISOLATION,OTHER,UNKNOWN;Text;Text;Nummer;Nummer;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;Nummer;YES,NO,UNKNOWN;Nummer;Nummer;Nummer;YES,NO,UNKNOWN;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;Text;YES,NO,UNKNOWN;Text;YES,NO,UNKNOWN;Nummer;YES,NO,UNKNOWN;YES,NO,UNKNOWN;Text;Nummer;AXILLARY,ORAL,RECTAL,NON_CONTACT;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;Nummer;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;Nummer;Nummer;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;Nummer;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;Nummer;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;Nummer;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;Nummer;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;Nummer;Text;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;Nummer;Name von Region;Name von District;Name von Community;Text;Text;Datum: dd/MM/yyyy;Datum: dd/MM/yyyy;YES,NO,UNKNOWN;Text;Text;Nummer;Text;Text;Text;Text;Text;Text;Text;Text;Text;CAR,BUS,MOTORBIKE,OTHER;Text;Text;Text;Text;IN_COUNTRY,POINT_OF_ENTRY;Name von PointOfEntry;Text;Text;Text;Text;Text;;;UNKNOWN,AMBULATORY,MEDICAL_PRACTICE,OPERATIVE_1200,HOSPITAL_1300,OTHER_OUTPATIENT_FACILITY,STATIONARY,HOSPITAL_2100,NORMAL_WARD,OPERATIVE_2111,NOT_OPERATIVE,HEMATOLOGICAL_ONCOLOGY,CHILDREN_WARD,NEONATOLOGY,INTENSIVE_CARE_UNIT,OTHER_STATION,NURSING_HOME,REHAB_FACILITY,OTHER_STATIONARY_FACILITY;HOME,INSTITUTIONELL,HOSPITAL,HOTEL,ASYLUM_ACCOMMODATION,NONE,UNKNOWN,OTHER;Text;Datum: dd/MM/yyyy;Datum: dd/MM/yyyy;Text;;;Datum: dd/MM/yyyy;Datum: dd/MM/yyyy;YES,NO,UNKNOWN;Text;YES,NO,UNKNOWN;Text;;;;Datum: dd/MM/yyyy;YES,NO,UNKNOWN;FIRST,SECOND,THIRD,UNKNOWN;FOLLOW_UP,COMPLETED,CANCELED,LOST,NO_FOLLOW_UP;Text;Datum: dd/MM/yyyy;;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;Datum: dd/MM/yyyy;YES,NO,UNKNOWN;Datum: dd/MM/yyyy;YES,NO,UNKNOWN;;;;;Text;Datum: dd/MM/yyyy;;FULFILLED,NOT_FULFILLED;Datum: dd/MM/yyyy;Text;;Text;Text;Datum: dd/MM/yyyy;Datum: dd/MM/yyyy;BLOOD,SERA,STOOL,NASAL_SWAB,THROAT_SWAB,NP_SWAB,RECTAL_SWAB,CEREBROSPINAL_FLUID,CRUST,TISSUE,URINE,CORNEA_PM,SALIVA,URINE_PM,NUCHAL_SKIN_BIOPSY,SPUTUM,ENDOTRACHEAL_ASPIRATE,BRONCHOALVEOLAR_LAVAGE,BRAIN_TISSUE,ANTERIOR_NARES_SWAB,OP_ASPIRATE,NP_ASPIRATE,PLEURAL_FLUID,OTHER;Text;EXTERNAL,INTERNAL;Name einer konfigurierten Einrichtung (facilityType erforderlich), OTHER_FACILITY (facilityType und healthFacilityDetails erforderlich) oder NO_FACILITY;Text;Datum: dd/MM/yyyy;Text;Datum: dd/MM/yyyy;ADEQUATE,NOT_ADEQUATE;Text;Text;HUMAN,ANIMAL,ENVIRONMENT;;;INDETERMINATE,PENDING,NEGATIVE,POSITIVE,NOT_DONE;PRESENCE_OF_SYMPTOMS,OUTBREAK,SCREENING,PROFESSIONAL_REASON,QUARANTINE_REGULATIONS,CONTACT_TO_CASE,PLANNING_TO_TRAVEL,RETURNING_TRAVELER,PERSONAL_REASON,MOVING_RETURNING_RETIREMENT_HOME,SWISS_COVID_APP_NOTIFICATION,QUARANTINE_END,UNKNOWN,OTHER_REASON;Text;CORONAVIRUS;;Text;Text;Text;ANTIBODY_DETECTION,ANTIGEN_DETECTION,RAPID_TEST,CULTURE,HISTOPATHOLOGY,ISOLATION,IGM_SERUM_ANTIBODY,IGG_SERUM_ANTIBODY,IGA_SERUM_ANTIBODY,INCUBATION_TIME,INDIRECT_FLUORESCENT_ANTIBODY,DIRECT_FLUORESCENT_ANTIBODY,MICROSCOPY,NEUTRALIZING_ANTIBODIES,PCR_RT_PCR,GRAM_STAIN,LATEX_AGGLUTINATION,CQ_VALUE_DETECTION,SEQUENCING,DNA_MICROARRAY,OTHER;VARIANT_SPECIFIC,N501Y_MUTATION_DETECTION;Text;Datum: dd/MM/yyyy;Name einer konfigurierten Einrichtung (facilityType erforderlich), OTHER_FACILITY (facilityType und healthFacilityDetails erforderlich) oder NO_FACILITY;Text;INDETERMINATE,PENDING,NEGATIVE,POSITIVE,NOT_DONE;Text;;;Text;Nummer;Datum: dd/MM/yyyy;;Text;Text;;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;YES,NO,UNKNOWN;Text;Datum: dd/MM/yyyy;Datum: dd/MM/yyyy;COMIRNATY,MRNA_1273,OXFORD_ASTRA_ZENECA,AD26_COV2_S,NVX_COV_2373,SANOFI_GSK,UNKNOWN,OTHER;Text;BIONTECH_PFIZER,MODERNA,ASTRA_ZENECA,JOHNSON_JOHNSON,NOVAVAX,SANOFI_GSK,UNKNOWN,OTHER;Text;Text;Text;Text;Text;Text;Text;VACCINATION_CARD,ORAL_COMMUNICATION,NO_EVIDENCE,UNKNOWN;YES,NO,UNKNOWN;FIRST,SECOND,THIRD,UNKNOWN +CORONAVIRUS;;COVID-19;;;;;Margret;Schmitt;MRS;;;;Female;1;1;1900;;;;ALIVE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;02.03.2022;;;;;;;;;;;;;;;;;;Berlin;SK Berlin Mitte;Gesundbrunnen;;;;HOSPITAL;OTHER_FACILITY;Krankenflügel;YES;NO;UNKNOWN;YES;YES;YES;YES;YES;Drachenpocken;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; From 59c5ce8131d6069923e0a1fcae38b9c864c82a0e Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Wed, 14 Sep 2022 17:49:23 +0300 Subject: [PATCH 22/45] Added locators and steps towards #7469 Statistics report generation flow check --- .../statistics/StatisticsPage.java | 12 +++- .../e2etests/helpers/WebDriverHelpers.java | 1 - .../statistics/StatisticsSteps.java | 56 ++++++++++++++++--- .../features/sanity/web/Statistics.feature | 20 ++++++- 4 files changed, 77 insertions(+), 12 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java index 08d82ad2c4d..9ff69ae9f4d 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java @@ -7,6 +7,10 @@ public class StatisticsPage { public static final By RESET_FILTER_BUTTON = By.id("statisticsResetFilters"); public static final By REMOVE_FILTER_BUTTON = By.id("close"); public static final By SELECT_ATTRIBUTE_DROPDOWN = By.cssSelector("[id='statisticsAttribute-0']"); + public static final By SELECT_DISEASE_DROPDOWN = + By.cssSelector("[class='v-filterselect-button']"); + public static final By ATTRIBUTE_DROPDOWN_VALUES = + By.cssSelector("[class='v-menubar-menuitem-caption']"); public static final By VISUALISATION_TYPE_TABLE_RADIO_BUTTON = By.xpath("//label[text()='Table']"); public static final By VISUALISATION_TYPE_MAP_RADIO_BUTTON = By.xpath("//label[text()='Map']"); @@ -69,8 +73,7 @@ public class StatisticsPage { By.xpath("//label[text()='Symptoms']/preceding-sibling::input"); public static final By EVENTS_CHECKBOX = By.xpath("//label[text()='Events']/preceding-sibling::input"); - public static final By EVENT_GROUPS_CHECKBOX = - By.xpath("//label[text()='Event groups']/preceding-sibling::input"); + public static final By EVENT_GROUPS_CHECKBOX = By.xpath("//label[text()='Event groups']"); public static final By PERSONS_INVOLVED_CHECKBOX = By.xpath("//label[text()='Persons involved']/preceding-sibling::input"); public static final By ACTIONS_CHECKBOX = @@ -135,4 +138,9 @@ public class StatisticsPage { By.xpath("//label[text()='Disease configurations']/preceding-sibling::input"); public static final By DELETION_CONFIGURATIONS_CHECKBOX = By.xpath("//label[text()='Deletion configurations']/preceding-sibling::input"); + public static final By STATISTICS_EXPORT_BUTTON = By.id("export"); + public static final By TABLE_RESULTS = By.cssSelector("td[class*='v-grid-cell']"); + public static final By MAP_CONTAINER_STATISTICS_PAGE = + By.cssSelector("[class*='leaflet-container']"); + public static final By CHART_RESULTS = By.cssSelector("[class*='highcharts-container']"); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java index cff744fa6b2..d0dde04358d 100755 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/WebDriverHelpers.java @@ -475,7 +475,6 @@ public boolean isElementEnabledAtAttributeLevel(By elementLocator) { public boolean isElementChecked(By elementLocator) { scrollToElement(elementLocator); boolean isChecked = elementContainsAttribute(elementLocator, "checked"); - System.out.println(isChecked); if (isChecked) { return true; } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java index 743a05b39a0..bfa4b098d72 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java @@ -180,7 +180,8 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { (String checkBoxSelection) -> { switch (checkBoxSelection) { case "Selected": - TimeUnit.SECONDS.sleep(1); + webDriverHelpers.waitUntilWebElementHasAttributeWithValue( + CASES_CHECKBOX, "checked", "true"); softly.assertTrue( webDriverHelpers.isElementChecked(CASES_CHECKBOX), "Cases Checkbox is not checked in the database export page"); @@ -238,9 +239,6 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { softly.assertTrue( webDriverHelpers.isElementChecked(EVENTS_CHECKBOX), "Events Checkbox is not checked in the database export page"); - softly.assertTrue( - webDriverHelpers.isElementChecked(EVENT_GROUPS_CHECKBOX), - "Events Checkbox is not checked in the database export page"); softly.assertTrue( webDriverHelpers.isElementChecked(PERSONS_INVOLVED_CHECKBOX), "Persons involved Checkbox is not checked in the database export page"); @@ -343,7 +341,8 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { softly.assertAll(); break; case "Deselected": - TimeUnit.SECONDS.sleep(2); + // TODO remove hardcoded sleep + TimeUnit.SECONDS.sleep(1); softly.assertFalse( webDriverHelpers.isElementChecked(CASES_CHECKBOX), "Cases Checkbox is not checked in the database export page"); @@ -401,9 +400,6 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { softly.assertFalse( webDriverHelpers.isElementChecked(EVENTS_CHECKBOX), "Events Checkbox is not checked in the database export page"); - softly.assertFalse( - webDriverHelpers.isElementChecked(EVENT_GROUPS_CHECKBOX), - "Events Checkbox is not checked in the database export page"); softly.assertFalse( webDriverHelpers.isElementChecked(PERSONS_INVOLVED_CHECKBOX), "Persons involved Checkbox is not checked in the database export page"); @@ -508,6 +504,21 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { } }); + And( + "^I Select the Attribute ([^\"]*) from the Statistics Page Filter Section in the Statistics Page", + (String parameter) -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(SELECT_ATTRIBUTE_DROPDOWN); + webDriverHelpers.clickOnWebElementBySelector(SELECT_ATTRIBUTE_DROPDOWN); + webDriverHelpers.clickWebElementByText(ATTRIBUTE_DROPDOWN_VALUES, parameter); + }); + + And( + "^I Select the ([^\"]*) option from the Disease Dropdown in the Statistics Page", + (String parameter) -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(SELECT_DISEASE_DROPDOWN); + webDriverHelpers.selectFromCombobox(SELECT_DISEASE_DROPDOWN, parameter); + }); + Then( "I Verify the presence of Rows, Columns, and switch-between Button in the Statistics Page", () -> { @@ -549,6 +560,35 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { () -> { webDriverHelpers.waitUntilElementIsVisibleAndClickable(GENERATE_BUTTON); }); + + And( + "I click on the Generate Button from the Statistics Page", + () -> { + webDriverHelpers.clickOnWebElementBySelector(GENERATE_BUTTON); + }); + + Then( + "I Verify the Presence of the Export Button from the Statistics Page", + () -> { + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable( + STATISTICS_EXPORT_BUTTON); + }); + + Then( + "^I validate the Results Section displays data for ([^\"]*) in the Statistics Page", + (String typeOfReport) -> { + switch (typeOfReport) { + case "Table": + webDriverHelpers.waitUntilElementIsVisibleAndClickable(TABLE_RESULTS); + break; + case "Map": + webDriverHelpers.waitUntilElementIsVisibleAndClickable(MAP_CONTAINER_STATISTICS_PAGE); + break; + case "Chart": + webDriverHelpers.waitUntilElementIsVisibleAndClickable(CHART_RESULTS); + break; + } + }); } public String[] parseEventGroupsDatabaseExportColumns(String fileName) { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature index a11c63bd6d2..f75c0f3a448 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Statistics.feature @@ -30,7 +30,7 @@ Feature: Statistics tab tests Then I Verify the presence of Incidence Divisor Input from the Statistics Page Then I Verify the presence of the Generate Button from the Statistics Page - @#7469_1 @env_main + @#7469 @env_main Scenario: Validate Statistics directory database export tab layout Given I log in as a Admin User And I click on the Statistics button from navbar @@ -39,3 +39,21 @@ Feature: Statistics tab tests Then I verify that All Checkboxes are Selected in Database Export tab of Statistics Page And I click on the Deselect all Button in Database Export tab of Statistics Page Then I verify that All Checkboxes are Deselected in Database Export tab of Statistics Page + + @#7469 @env_main + Scenario: Statistics report generation flow check + Given I log in as a Admin User + And I click on the Statistics button from navbar + And I click on the Add filter button from the Statistics Page + And I Select the Attribute Disease from the Statistics Page Filter Section in the Statistics Page + And I Select the COVID-19 option from the Disease Dropdown in the Statistics Page + And I select Visualisation type Table from the Statistics Page + And I click on the Generate Button from the Statistics Page + Then I Verify the Presence of the Export Button from the Statistics Page + Then I validate the Results Section displays data for Table in the Statistics Page + And I select Visualisation type Map from the Statistics Page + And I click on the Generate Button from the Statistics Page + Then I validate the Results Section displays data for Map in the Statistics Page + And I select Visualisation type Chart from the Statistics Page + And I click on the Generate Button from the Statistics Page + Then I validate the Results Section displays data for Chart in the Statistics Page From e27b0b2d045a5d41a28e8365fef58af5ec1d8987 Mon Sep 17 00:00:00 2001 From: Christopher Riedel Date: Thu, 15 Sep 2022 09:21:23 +0200 Subject: [PATCH 23/45] fixed #10305 (#10337) --- .../src/main/java/de/symeda/sormas/api/i18n/Validations.java | 1 + sormas-api/src/main/resources/validations.properties | 1 + .../de/symeda/sormas/backend/user/UserRoleFacadeEjb.java | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java index 188b2e13557..606556d3467 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java @@ -126,6 +126,7 @@ public interface Validations { String importWrongDataTypeError = "importWrongDataTypeError"; String infrastructureDataLocked = "infrastructureDataLocked"; String investigationStatusUnclassifiedCase = "investigationStatusUnclassifiedCase"; + String jurisdictionChangeUserAssignment = "jurisdictionChangeUserAssignment"; String missingRequiredUserRights = "missingRequiredUserRights"; String nameOrAnyOtherFieldShouldBeFilled = "nameOrAnyOtherFieldShouldBeFilled"; String noAddressCommunityInAddressDistrict = "noAddressCommunityInAddressDistrict"; diff --git a/sormas-api/src/main/resources/validations.properties b/sormas-api/src/main/resources/validations.properties index 9d3fee792ec..a97c4cb8c9c 100644 --- a/sormas-api/src/main/resources/validations.properties +++ b/sormas-api/src/main/resources/validations.properties @@ -72,6 +72,7 @@ importPersonContactDetailsWithoutFacilityType = You have to specify at least a f importProbablyInvalidSeparator=The uploaded csv file probably uses a different separator than the default separator. Please select the correct separator before importing. importIncompleteContent=The content of the file is incomplete. Header(s) are missing or there is no data to import. Please check the import instructions to create a valid import file. investigationStatusUnclassifiedCase = It's not allowed to set investigation status to done for an unclassified case. +jurisdictionChangeUserAssignment = The jurisdiction level cannot be changed because the user role is assigned to at least one user. caseClassificationInvalid = Case classification does not correspond to lab results and symptoms of the case. noCommunityInDistrict = Could not find a database entry for the specified community in the specified district noAddressCommunityInAddressDistrict = Could not find a database entry for the specified address community in the specified address district diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRoleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRoleFacadeEjb.java index 151dc33fd2d..5b0d64957c3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRoleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRoleFacadeEjb.java @@ -172,6 +172,11 @@ private void validate(UserRoleDto source) { requiredUserRights.stream().filter(r -> !userRights.contains(r)).map(UserRight::toString).collect(Collectors.joining(", ")))); } + UserRoleDto existingUserRole = getByUuid(source.getUuid()); + if (existingUserRole != null && source.getJurisdictionLevel() != existingUserRole.getJurisdictionLevel() && userService.countWithRole(source.toReference()) > 0) { + throw new ValidationRuntimeException(I18nProperties.getValidationError(Validations.jurisdictionChangeUserAssignment)); + } + User currentUser = userService.getCurrentUser(); if (currentUser != null && currentUser.getUserRoles().stream().anyMatch(r -> DataHelper.isSame(r, source))) { Set currentUserRoles = currentUser.getUserRoles(); From d2b2d246d8a9d17f640506f8d3e9c038f98a00b3 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Sep 2022 09:24:41 +0200 Subject: [PATCH 24/45] stabilization SORQA-529 --- .../steps/web/application/cases/CreateNewCaseSteps.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java index 604bf0f6bb2..ffffc9ee180 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java @@ -962,7 +962,7 @@ public CreateNewCaseSteps( When( "I check if ([^\"]*) file is downloaded correctly", (String fileType) -> { - String file = "./downloads/testCase_" + fileType + "." + fileType; + String file = "testCase_" + fileType + "." + fileType; FilesHelper.waitForFileToDownload(file, 40); FilesHelper.deleteFile(file); }); From 86685c8ce51dffdad3abafaf7cdb459ceaa5bb59 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Sep 2022 09:46:49 +0200 Subject: [PATCH 25/45] stabilization SORQA-519 - ignored test with Data Protection Dictionary --- .../src/test/resources/features/sanity/web/About.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature index 7900d4fe0ab..86c46e8c122 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature @@ -29,7 +29,7 @@ Feature: About Directory end to end tests Then I click on Case Classification Rules hyperlink and download HTML file in About directory Then I delete Case Classification Html downloaded file from About Directory - @env_main @#9768 + @env_main @#9768 @ignore #Data Protection Dictionary is no longer present for international env Scenario: Check Data Protection Dictionary existence and download Given I log in as a Admin User And I click on the About button from navbar From a7868e1e29659fbc16c0a67a47e9cc9b19465459 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Sep 2022 10:50:24 +0200 Subject: [PATCH 26/45] stabilization SORQA-530 --- .../e2etests/steps/web/application/cases/CreateNewCaseSteps.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java index ffffc9ee180..fad6300b189 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java @@ -712,6 +712,7 @@ public CreateNewCaseSteps( PERSON_CASE_WINDOW_SEARCH_FIRST_RESULT_OPTION); webDriverHelpers.waitUntilElementIsVisibleAndClickable( SELECT_PERSON_WINDOW_CONFIRM_BUTTON); + TimeUnit.SECONDS.sleep(2); // wait for system reaction webDriverHelpers.clickOnWebElementBySelector(SELECT_PERSON_WINDOW_CONFIRM_BUTTON); }); From c0c9d329dc9448e6f772203ddeff1d46e9b8fdc9 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Sep 2022 11:03:55 +0200 Subject: [PATCH 27/45] stabilization SORQA-530 --- .../e2etests/pages/application/cases/CreateNewCasePage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CreateNewCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CreateNewCasePage.java index 0804148ee9a..f7a2e15b7e0 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CreateNewCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CreateNewCasePage.java @@ -87,7 +87,7 @@ public class CreateNewCasePage { public static final By CREATE_A_NEW_PERSON_CONFIRMATION_BUTTON = By.xpath("//*[text()='Create a new person']"); public static final By SELECT_PERSON_WINDOW_CONFIRM_BUTTON = - By.xpath("//div[@class='v-window v-widget']//following::div[@id='commit']"); + By.xpath("//div[@class='v-window v-widget']//following::div[@id='commit'][2]"); public static final By PERSON_CASE_WINDOW_SEARCH_FIRST_RESULT_OPTION = By.xpath( "//div[@class='v-grid v-widget v-has-width']//div[@class='v-grid-tablewrapper']/table/tbody[@class='v-grid-body']/tr[@class='v-grid-row v-grid-row-has-data']"); From 2c1761b9aaaea198a93876c2ac6b19e5b03dcbca Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Sep 2022 11:48:17 +0200 Subject: [PATCH 28/45] stabilization SORQA-531 --- .../pages/application/cases/EpidemiologicalDataCasePage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java index a00a6d6b80b..4eb65620f11 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java @@ -32,7 +32,7 @@ public class EpidemiologicalDataCasePage { By.cssSelector(".v-window div#exposureRole div"); public static final By ACTIVITY_AS_CASE_OPTIONS = By.cssSelector("[id='activityAsCaseDetailsKnown'] [class='v-checkbox v-select-option']"); - public static final By NEW_ENTRY_POPUP = By.cssSelector(".v-window .popupContent"); + public static final By NEW_ENTRY_POPUP = By.cssSelector(".v-window .popupContent"); public static final By ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON = By.id("actionNewEntry"); public static final By EPIDEMIOLOGICAL_DATA_ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON = By.xpath("//div[@location='activitiesAsCase']//div[@id='actionNewEntry']"); From 1f5320f3a4a01bf9e18fe8e71bc300ddd74c3aa6 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Sep 2022 12:03:30 +0200 Subject: [PATCH 29/45] stabilization SORQA-531 --- .../steps/web/application/cases/CaseDirectorySteps.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java index 3708b9de899..207eb46d7e9 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java @@ -50,6 +50,7 @@ import static org.sormas.e2etests.pages.application.contacts.EditContactPage.SOURCE_CASE_WINDOW_CASE_INPUT; import static org.sormas.e2etests.pages.application.contacts.EditContactPage.SOURCE_CASE_WINDOW_SEARCH_CASE_BUTTON; import static org.sormas.e2etests.pages.application.contacts.EditContactPage.UUID_INPUT; +import static org.sormas.e2etests.pages.application.entries.CreateNewTravelEntryPage.ARRIVAL_DATE; import static org.sormas.e2etests.pages.application.entries.TravelEntryPage.CLOSE_IMPORT_TRAVEL_ENTRY_BUTTON; import static org.sormas.e2etests.pages.application.entries.TravelEntryPage.IMPORT_SUCCESS_DE; import static org.sormas.e2etests.pages.application.entries.TravelEntryPage.SELECT_ANOTHER_PERSON_DE; @@ -498,14 +499,16 @@ public CaseDirectorySteps( "I click on new entry button from Epidemiological Data tab", () -> { webDriverHelpers.clickOnWebElementBySelector(ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON); - webDriverHelpers.waitUntilIdentifiedElementIsPresent(NEW_ENTRY_POPUP); + // webDriverHelpers.waitUntilIdentifiedElementIsPresent(NEW_ENTRY_POPUP); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(ARRIVAL_DATE); }); Then( "I click on new entry button from Epidemiological Data tab for DE", () -> { webDriverHelpers.clickOnWebElementBySelector(ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON_DE); - webDriverHelpers.waitUntilIdentifiedElementIsPresent(NEW_ENTRY_POPUP); + // webDriverHelpers.waitUntilIdentifiedElementIsPresent(NEW_ENTRY_POPUP); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(ARRIVAL_DATE); }); And( From b6e659a25de7aeba07212c3ae8779e34d7243d17 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Sep 2022 12:18:04 +0200 Subject: [PATCH 30/45] stabilization SORQA-531 --- .../steps/web/application/persons/EditPersonSteps.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java index f33c2161a5a..275b84f07b4 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java @@ -25,6 +25,7 @@ import static org.sormas.e2etests.pages.application.contacts.EditContactPersonPage.CONTACT_PERSON_FIRST_NAME_INPUT; import static org.sormas.e2etests.pages.application.contacts.EditContactPersonPage.CONTACT_PERSON_LAST_NAME_INPUT; import static org.sormas.e2etests.pages.application.contacts.EditContactPersonPage.SEX_COMBOBOX; +import static org.sormas.e2etests.pages.application.entries.CreateNewTravelEntryPage.ARRIVAL_DATE; import static org.sormas.e2etests.pages.application.events.EventDirectoryPage.getByEventUuid; import static org.sormas.e2etests.pages.application.persons.EditPersonPage.ADDITIONAL_INFORMATION_INPUT; import static org.sormas.e2etests.pages.application.persons.EditPersonPage.AREA_TYPE_COMBOBOX; @@ -521,7 +522,9 @@ public EditPersonSteps( "I click on new entry button on Edit Person Page for DE", () -> { webDriverHelpers.clickOnWebElementBySelector(ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON_DE); - webDriverHelpers.waitUntilIdentifiedElementIsPresent(NEW_ENTRY_POPUP); + // webDriverHelpers.waitUntilIdentifiedElementIsPresent(NEW_ENTRY_POPUP); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(ARRIVAL_DATE); + }); When( "I check if added travel Entry appeared on Edit Person Page", From 3f033f15b321d455136c3234efc1b8f0a0d4f3a9 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Sep 2022 12:38:18 +0200 Subject: [PATCH 31/45] stabilization SORQA-531 --- .../steps/web/application/cases/CaseDirectorySteps.java | 4 +--- .../steps/web/application/persons/EditPersonSteps.java | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java index 207eb46d7e9..1435f3aad05 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java @@ -499,15 +499,13 @@ public CaseDirectorySteps( "I click on new entry button from Epidemiological Data tab", () -> { webDriverHelpers.clickOnWebElementBySelector(ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON); - // webDriverHelpers.waitUntilIdentifiedElementIsPresent(NEW_ENTRY_POPUP); - webDriverHelpers.waitUntilElementIsVisibleAndClickable(ARRIVAL_DATE); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(ARRIVAL_DATE); }); Then( "I click on new entry button from Epidemiological Data tab for DE", () -> { webDriverHelpers.clickOnWebElementBySelector(ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON_DE); - // webDriverHelpers.waitUntilIdentifiedElementIsPresent(NEW_ENTRY_POPUP); webDriverHelpers.waitUntilElementIsVisibleAndClickable(ARRIVAL_DATE); }); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java index 275b84f07b4..6dd3d2612d2 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java @@ -522,8 +522,7 @@ public EditPersonSteps( "I click on new entry button on Edit Person Page for DE", () -> { webDriverHelpers.clickOnWebElementBySelector(ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON_DE); - // webDriverHelpers.waitUntilIdentifiedElementIsPresent(NEW_ENTRY_POPUP); - webDriverHelpers.waitUntilElementIsVisibleAndClickable(ARRIVAL_DATE); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(ARRIVAL_DATE); }); When( From 5201c4d1b9bf01c58a3779a6d9ef87442a2f2297 Mon Sep 17 00:00:00 2001 From: Levente Gal <62599627+leventegal-she@users.noreply.github.com> Date: Thu, 15 Sep 2022 13:57:02 +0300 Subject: [PATCH 32/45] #9755 S2S_Revision of the 'share requests' directory_ Part 1 - delete rejected or revoked requests on receiving side (#10332) Co-authored-by: Levente Gal --- .../SormasToSormasShareRequestDto.java | 22 ++----------------- .../SormasToSormasFacadeEjb.java | 15 +++++-------- .../ui/person/PersonSelectionFilterForm.java | 2 +- .../ShareRequestFilterForm.java | 19 +++++++++++++--- .../ShareRequestGridComponent.java | 6 ++--- .../sormas/ui/utils/AbstractFilterForm.java | 11 +++++++--- 6 files changed, 35 insertions(+), 40 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasShareRequestDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasShareRequestDto.java index d23f0f477bb..b007bba9005 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasShareRequestDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasShareRequestDto.java @@ -1,19 +1,16 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ package de.symeda.sormas.api.sormastosormas.share.incoming; @@ -125,21 +122,6 @@ public void setResponseComment(String responseComment) { this.responseComment = responseComment; } - public void setRejected(String comment) { - setStatus(ShareRequestStatus.REJECTED); - setCases(null); - setContacts(null); - setEvents(null); - setResponseComment(comment); - } - - public void setRevoked() { - setStatus(ShareRequestStatus.REVOKED); - setCases(null); - setContacts(null); - setEvents(null); - } - public static SormasToSormasShareRequestDto build() { SormasToSormasShareRequestDto dto = new SormasToSormasShareRequestDto(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/SormasToSormasFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/SormasToSormasFacadeEjb.java index 2e467187152..e601b09826c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/SormasToSormasFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/SormasToSormasFacadeEjb.java @@ -19,7 +19,6 @@ import java.util.Arrays; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -66,6 +65,7 @@ import de.symeda.sormas.backend.sormastosormas.rest.SormasToSormasRestClient; import de.symeda.sormas.backend.sormastosormas.share.ShareRequestAcceptData; import de.symeda.sormas.backend.sormastosormas.share.incoming.SormasToSormasShareRequestFacadeEJB.SormasToSormasShareRequestFacadeEJBLocal; +import de.symeda.sormas.backend.sormastosormas.share.incoming.SormasToSormasShareRequestService; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo; import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfoService; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; @@ -94,6 +94,8 @@ public class SormasToSormasFacadeEjb implements SormasToSormasFacade { @EJB private SormasToSormasShareRequestFacadeEJBLocal shareRequestFacade; @EJB + private SormasToSormasShareRequestService shareRequestService; + @EJB private SormasToSormasCaseFacadeEjbLocal sormasToSormasCaseFacade; @EJB private SormasToSormasContactFacadeEjbLocal sormasToSormasContactFacade; @@ -146,10 +148,7 @@ public void rejectRequest(ShareRequestDataType dataType, String uuid, String com String organizationId = shareRequest.getOriginInfo().getOrganizationId(); sormasToSormasRestClient.post(organizationId, REJECT_REQUEST_ENDPOINT, new RequestResponseDataDto(uuid, comment), null); - shareRequest.setChangeDate(new Date()); - shareRequest.setRejected(comment); - - shareRequestFacade.saveShareRequest(shareRequest); + shareRequestService.deletePermanentByUuids(Collections.singletonList(shareRequest.getUuid())); } @Override @@ -240,11 +239,7 @@ public void requestsRevoked(SormasToSormasEncryptedDataDto encryptedRequestUuids throw SormasToSormasException.fromStringProperty(Strings.errorSormasToSormasRequestProcessed); } - shareRequests.forEach(shareRequest -> { - shareRequest.setChangeDate(new Date()); - shareRequest.setRevoked(); - shareRequestFacade.saveShareRequest(shareRequest); - }); + shareRequestService.deletePermanentByUuids(shareRequests.stream().map(SormasToSormasShareRequestDto::getUuid).collect(Collectors.toList())); } /** diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionFilterForm.java index 5a9cf932c39..a5b0b80a536 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionFilterForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonSelectionFilterForm.java @@ -34,7 +34,7 @@ public class PersonSelectionFilterForm extends AbstractFilterForm filterResetHandler.run()); filterForm.addApplyHandler(e -> filterChangeHandler.run()); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractFilterForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractFilterForm.java index fc69bb15f38..723801ac6ca 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractFilterForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractFilterForm.java @@ -47,8 +47,12 @@ protected AbstractFilterForm(Class type, String propertyI18nPrefix) { this(type, propertyI18nPrefix, null); } + protected AbstractFilterForm(Class type, String propertyI18nPrefix, boolean addFields) { + this(type, propertyI18nPrefix, null, Captions.actionApplyFilters, Captions.actionResetFilters, addFields); + } + protected AbstractFilterForm(Class type, String propertyI18nPrefix, FieldVisibilityCheckers fieldVisibilityCheckers) { - this(type, propertyI18nPrefix, fieldVisibilityCheckers, Captions.actionApplyFilters, Captions.actionResetFilters); + this(type, propertyI18nPrefix, fieldVisibilityCheckers, Captions.actionApplyFilters, Captions.actionResetFilters, true); } protected AbstractFilterForm( @@ -56,9 +60,10 @@ protected AbstractFilterForm( String propertyI18nPrefix, FieldVisibilityCheckers fieldVisibilityCheckers, String applyCaptionTag, - String resetCaptionTag) { + String resetCaptionTag, + boolean addFields) { - super(type, propertyI18nPrefix, new SormasFieldGroupFieldFactory(fieldVisibilityCheckers, null), true); + super(type, propertyI18nPrefix, new SormasFieldGroupFieldFactory(fieldVisibilityCheckers, null), addFields); String moreFiltersHtmlLayout = createMoreFiltersHtmlLayout(); boolean hasMoreFilters = moreFiltersHtmlLayout != null && moreFiltersHtmlLayout.length() > 0; From 4c56f2e3a36a670b409a3937bd2096032ea0fcd0 Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Thu, 15 Sep 2022 14:39:52 +0300 Subject: [PATCH 33/45] #7469 stability fix, removed sleep --- .../pages/application/statistics/StatisticsPage.java | 1 + .../steps/web/application/statistics/StatisticsSteps.java | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java index 9ff69ae9f4d..5b7007f09fb 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/statistics/StatisticsPage.java @@ -11,6 +11,7 @@ public class StatisticsPage { By.cssSelector("[class='v-filterselect-button']"); public static final By ATTRIBUTE_DROPDOWN_VALUES = By.cssSelector("[class='v-menubar-menuitem-caption']"); + public static final By DISEASE_DROPDOWN_VALUES = By.cssSelector("[class='gwt-MenuItem']"); public static final By VISUALISATION_TYPE_TABLE_RADIO_BUTTON = By.xpath("//label[text()='Table']"); public static final By VISUALISATION_TYPE_MAP_RADIO_BUTTON = By.xpath("//label[text()='Map']"); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java index bfa4b098d72..fc8afd1c59a 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/statistics/StatisticsSteps.java @@ -341,8 +341,7 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { softly.assertAll(); break; case "Deselected": - // TODO remove hardcoded sleep - TimeUnit.SECONDS.sleep(1); + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(100); softly.assertFalse( webDriverHelpers.isElementChecked(CASES_CHECKBOX), "Cases Checkbox is not checked in the database export page"); @@ -516,7 +515,8 @@ public StatisticsSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { "^I Select the ([^\"]*) option from the Disease Dropdown in the Statistics Page", (String parameter) -> { webDriverHelpers.waitUntilElementIsVisibleAndClickable(SELECT_DISEASE_DROPDOWN); - webDriverHelpers.selectFromCombobox(SELECT_DISEASE_DROPDOWN, parameter); + webDriverHelpers.clickOnWebElementBySelector(SELECT_DISEASE_DROPDOWN); + webDriverHelpers.clickWebElementByText(DISEASE_DROPDOWN_VALUES, parameter); }); Then( From 5b8680ba0ced88802cde846147b50565d1429d06 Mon Sep 17 00:00:00 2001 From: lb-sgnt Date: Fri, 16 Sep 2022 00:47:57 +0200 Subject: [PATCH 34/45] SORQA-419 --- sormas-e2e-tests/build.gradle | 1 + .../pages/application/cases/EditCasePage.java | 4 ++++ .../cases/CaseImportExportSteps.java | 12 ++++++++++++ .../web/application/cases/EditCaseSteps.java | 16 ++++++++++++++++ .../features/sanity/web/Case.feature | 19 +++++++++++++++++++ .../sanity/web/CaseImportExport.feature | 2 +- 6 files changed, 53 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/build.gradle b/sormas-e2e-tests/build.gradle index eeb8cdbf8b2..d3d039cf661 100755 --- a/sormas-e2e-tests/build.gradle +++ b/sormas-e2e-tests/build.gradle @@ -81,6 +81,7 @@ dependencies { implementation group: 'org.apache.tika', name: 'tika-langdetect-optimaize', version: '2.3.0' implementation group: 'org.apache.tika', name: 'tika-langdetect', version: '2.3.0', ext: 'pom' implementation group: 'org.apache.tika', name: 'tika-core', version: '2.3.0' + implementation group: 'org.apache.poi', name: 'poi', version: '3.17' } diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java index 46919eec5e2..5f5198412f6 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java @@ -164,8 +164,12 @@ public class EditCasePage { public static final By EXTRA_COMMENT_INPUT = By.cssSelector(".popupContent [class='v-textfield v-widget v-has-width']"); public static final By CREATE_DOCUMENT_BUTTON = By.cssSelector("[id='Create']"); + public static final By CREATE_DOCUMENT_BUTTON_DE = By.cssSelector("[id='Erstellen']"); + public static final By CREATE_QUARANTINE_ORDER_BUTTON = By.cssSelector(".popupContent [id='Create']"); + public static final By CREATE_QUARANTINE_ORDER_BUTTON_DE = + By.cssSelector(".popupContent [id='Erstellen']"); public static final By EXTRA_COMMENT_TEXTAREA = By.cssSelector(".popupContent [class='v-textfield v-widget v-has-width']"); public static final By QUARANTINE_ORDER_COMBOBOX = diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java index 923bcb25488..edbe84ebd86 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java @@ -280,6 +280,18 @@ public CaseImportExportSteps( When( "I delete created custom case export file", () -> webDriverHelpers.clickOnWebElementBySelector(CUSTOM_CASE_DELETE_BUTTON)); + + When( + "I check if downloaded docx file is correct", + () -> { + // String file = "./downloads/sormas_fälle_" + LocalDate.now().format(formatter) + + // "_.csv"; + String file = "C:\\Users\\lukas\\Downloads" + LocalDate.now().format(formatter) + "_.csv"; + + Case reader = parseExtendCustomCaseExport(file); + Path path = Paths.get(file); + Files.delete(path); + }); } public CustomCaseExportCSV parseCustomCaseExport(String fileName) { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index 9880ee2e957..172b6e3b695 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -1343,6 +1343,10 @@ public EditCaseSteps( "I click on the Create button from Case Document Templates", () -> webDriverHelpers.clickOnWebElementBySelector(CREATE_DOCUMENT_BUTTON)); + When( + "I click on the Create button from Case Document Templates in DE", + () -> webDriverHelpers.clickOnWebElementBySelector(CREATE_DOCUMENT_BUTTON_DE)); + When( "I change the Case Classification field for {string} value", (String caseClassificationValue) -> { @@ -2525,6 +2529,18 @@ public EditCaseSteps( () -> Assert.assertTrue( webDriverHelpers.isElementVisibleWithTimeout(CLINICAL_ASSESSMENTS_LABEL_DE, 15))); + + And( + "I select {string} from documents templates list", + (String templateName) -> { + selectQuarantineOrderTemplate(templateName); + }); + Then( + "I click download in case document create page in DE", + () -> { + webDriverHelpers.clickOnWebElementBySelector(CREATE_QUARANTINE_ORDER_BUTTON_DE); + TimeUnit.SECONDS.sleep(10); + }); } private Vaccination collectVaccinationData() { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index 23dda4f071b..fbdaad746b0 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1836,4 +1836,23 @@ Feature: Case end to end tests Then I click on Clinical Course tab from Edit Case page Then I check that Clinical Assessments heading is visible in DE + @tmsLink=SORDEV-9789 @env_de + Scenario: Test health conditions document template + Given I log in as a Admin User + Then I click on the Cases button from navbar + And I click on the Import button from Case directory + And I click on the detailed button from import Case tab + Then I select the "PreExistingCondition_DetailedImport_Test.csv" CSV file in the file picker + And I click on the "DATENIMPORT STARTEN" button from the Import Case popup + Then I click to create new person from the Case Import popup + And I check that an import success notification appears in the Import Case popup + Then I close Import Cases form + And I filter by "Margret Schmitt" as a Person's full name on Case Directory Page + And I click APPLY BUTTON in Case Directory Page + And I open last created case + And I click on the Create button from Case Document Templates in DE + And I select "preExistingConditions.docx" from documents templates list + Then I click download in case document create page in DE + When I check if downloaded docx file is correct + diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/CaseImportExport.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/CaseImportExport.feature index 6957b3073ca..d0d95e46527 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/CaseImportExport.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/CaseImportExport.feature @@ -164,7 +164,7 @@ Feature: Case import and export tests And I check if citizenship and country of birth is not present in Detailed Case export file @tmsLink=SORDEV-9789 @env_de - Scenario: Test healt conditions from imported case + Scenario: Test health conditions from imported case Given I log in as a Admin User Then I click on the Cases button from navbar And I click on the Import button from Case directory From bd39188c6c7787f390238b422fd2c2e8f40d37a7 Mon Sep 17 00:00:00 2001 From: lb-sgnt Date: Fri, 16 Sep 2022 12:33:31 +0200 Subject: [PATCH 35/45] SORQA-419 --- .../cases/CaseImportExportSteps.java | 32 +++++++++++++++---- .../web/application/cases/EditCaseSteps.java | 5 +++ .../features/sanity/web/Case.feature | 3 +- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java index edbe84ebd86..c1804340003 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java @@ -38,6 +38,7 @@ import com.opencsv.CSVReaderBuilder; import com.opencsv.exceptions.CsvException; import cucumber.api.java8.En; +import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.nio.file.Files; @@ -50,6 +51,8 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.xwpf.extractor.XWPFWordExtractor; +import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.sormas.e2etests.entities.pojo.csv.CustomCaseExportCSV; import org.sormas.e2etests.entities.pojo.web.Case; import org.sormas.e2etests.enums.CaseClassification; @@ -57,6 +60,7 @@ import org.sormas.e2etests.helpers.WebDriverHelpers; import org.sormas.e2etests.helpers.files.FilesHelper; import org.sormas.e2etests.state.ApiState; +import org.testng.Assert; import org.testng.asserts.SoftAssert; @Slf4j @@ -284,13 +288,29 @@ public CaseImportExportSteps( When( "I check if downloaded docx file is correct", () -> { - // String file = "./downloads/sormas_fälle_" + LocalDate.now().format(formatter) + - // "_.csv"; - String file = "C:\\Users\\lukas\\Downloads" + LocalDate.now().format(formatter) + "_.csv"; + String uuidFirstChars = EditCaseSteps.caseUuid.substring(0, 6); + String file = String.format("./downloads/%s-preExistingConditions.docx", + uuidFirstChars); - Case reader = parseExtendCustomCaseExport(file); - Path path = Paths.get(file); - Files.delete(path); + /* + String file = + String.format( + "C:\\Users\\lukas\\Downloads\\%s-preExistingConditions.docx", uuidFirstChars); + + */ + FileInputStream docx = new FileInputStream(file); + XWPFDocument document = new XWPFDocument(docx); + XWPFWordExtractor document_extracted = new XWPFWordExtractor(document); + String docx_string = document_extracted.getText(); + Assert.assertTrue(docx_string.contains("Diabetes: Ja"), "There is no expected Pre Existing Condition value in docx file!"); + Assert.assertTrue(docx_string.contains("Immunodeficiency including HIV: Ja"), "There is no expected Pre Existing Condition value in docx file!"); + Assert.assertTrue(docx_string.contains("Liver disease: Nein"), "There is no expected Pre Existing Condition value in docx file!"); + Assert.assertTrue(docx_string.contains("Malignancy: Unbekannt"), "There is no expected Pre Existing Condition value in docx file!"); + Assert.assertTrue(docx_string.contains("Chronic pulmonary disease\u00A0: Ja"), "There is no expected Pre Existing Condition value in docx file!"); + Assert.assertTrue(docx_string.contains("Renal disease: Ja"), "There is no expected Pre Existing Condition value in docx file!"); + Assert.assertTrue(docx_string.contains("Chronic neurologic / neuromuscular disease: Ja"), "There is no expected Pre Existing Condition value in docx file!"); + Assert.assertTrue(docx_string.contains("Chardiovascular disesase including hypertension: Ja"), "There is no expected Pre Existing Condition value in docx file!"); + Files.delete(Paths.get(file)); }); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index 172b6e3b695..3f0d549323a 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -275,6 +275,7 @@ public class EditCaseSteps implements En { public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("M/d/yyyy"); public static final DateTimeFormatter DATE_FORMATTER_DE = DateTimeFormatter.ofPattern("d.M.yyyy"); public static final String userDirPath = System.getProperty("user.dir"); + public static String caseUuid; @SneakyThrows @Inject @@ -1255,6 +1256,10 @@ public EditCaseSteps( "I collect the case person UUID displayed on Edit case page", () -> aCase = collectCasePersonUuid()); + When( + "I get the case person UUID displayed on Edit case page", + () -> caseUuid = webDriverHelpers.getValueFromWebElement(UUID_INPUT)); + When( "I check case created from created contact is correctly displayed on Edit Case page", () -> { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index fbdaad746b0..5767d75715a 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1837,7 +1837,7 @@ Feature: Case end to end tests Then I check that Clinical Assessments heading is visible in DE @tmsLink=SORDEV-9789 @env_de - Scenario: Test health conditions document template + Scenario: Test health conditions document template export Given I log in as a Admin User Then I click on the Cases button from navbar And I click on the Import button from Case directory @@ -1850,6 +1850,7 @@ Feature: Case end to end tests And I filter by "Margret Schmitt" as a Person's full name on Case Directory Page And I click APPLY BUTTON in Case Directory Page And I open last created case + When I get the case person UUID displayed on Edit case page And I click on the Create button from Case Document Templates in DE And I select "preExistingConditions.docx" from documents templates list Then I click download in case document create page in DE From 16dd6f2dd33528280d324ff900fd1096250e6f67 Mon Sep 17 00:00:00 2001 From: lb-sgnt Date: Fri, 16 Sep 2022 12:56:06 +0200 Subject: [PATCH 36/45] SORQA-419 --- .../steps/web/application/cases/CaseImportExportSteps.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java index c1804340003..373765e8035 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseImportExportSteps.java @@ -291,13 +291,6 @@ public CaseImportExportSteps( String uuidFirstChars = EditCaseSteps.caseUuid.substring(0, 6); String file = String.format("./downloads/%s-preExistingConditions.docx", uuidFirstChars); - - /* - String file = - String.format( - "C:\\Users\\lukas\\Downloads\\%s-preExistingConditions.docx", uuidFirstChars); - - */ FileInputStream docx = new FileInputStream(file); XWPFDocument document = new XWPFDocument(docx); XWPFWordExtractor document_extracted = new XWPFWordExtractor(document); From 648ba446043884fb318a99aebd420ef8638ccc5d Mon Sep 17 00:00:00 2001 From: Jonas Cirotzki Date: Fri, 16 Sep 2022 13:56:14 +0200 Subject: [PATCH 37/45] #10364 has UUID all dtos (#10370) * [#10364] move HasUuid to dedicated package * [#10364] add AbstractUuidDto * [#10364] let DTOs with uuid extend AbstractUuidDto * [#10364] reset serail UID * [#10364] fix EmbeddedSampleExportDto constructor * [#10364] fix HasUuid package path in App --- .../java/de/symeda/sormas/api/EntityDto.java | 10 ++-- .../sormas/api/EntityDtoAccessHelper.java | 1 + .../symeda/sormas/api/MergeableIndexDto.java | 2 + .../de/symeda/sormas/api/ReferenceDto.java | 18 +++--- .../sormas/api/campaign/CampaignIndexDto.java | 32 ++++++----- .../data/CampaignFormDataIndexDto.java | 20 ++----- .../symeda/sormas/api/caze/CaseExportDto.java | 35 +++++------- .../api/caze/EmbeddedSampleExportDto.java | 50 +++++++---------- .../de/symeda/sormas/api/caze/MapCaseDto.java | 26 +++------ .../sormas/api/caze/PreviousCaseDto.java | 13 ++--- .../clinicalcourse/ClinicalVisitIndexDto.java | 30 ++++++---- .../sormas/api/contact/ContactExportDto.java | 19 +++---- .../sormas/api/contact/FollowUpStatusDto.java | 32 ++++++----- .../sormas/api/contact/MapContactDto.java | 24 ++------ .../api/dashboard/DashboardCaseDto.java | 25 ++------- .../api/dashboard/DashboardEventDto.java | 25 ++------- .../sormas/api/event/EventExportDto.java | 16 ++---- .../sormas/api/event/EventGroupIndexDto.java | 28 +++------- .../sormas/api/event/EventIndexDto.java | 19 +++---- .../api/externaldata/ExternalDataDto.java | 35 ++++++------ .../ExternalMessageIndexDto.java | 31 ++++++----- .../feature/FeatureConfigurationIndexDto.java | 37 ++++++------- .../facility/FacilityExportDto.java | 25 +++------ .../facility/FacilityIndexDto.java | 2 +- .../sormas/api/person/JournalPersonDto.java | 34 ++++++++---- .../sormas/api/person/PersonExportDto.java | 37 ++++++++----- .../sormas/api/person/PersonNameDto.java | 33 ++++------- .../sormas/api/person/SimilarPersonDto.java | 38 ++++++++----- .../sormas/api/sample/SampleExportDto.java | 38 ++++++++----- .../api/sormastosormas/ShareTreeCriteria.java | 2 +- .../share/ShareRequestIndexDto.java | 23 ++------ .../incoming/PreviewNotImplementedDto.java | 2 +- .../incoming/RequestResponseDataDto.java | 2 +- .../incoming/SormasToSormasCasePreview.java | 2 +- .../SormasToSormasContactPreview.java | 2 +- ...SormasToSormasEventParticipantPreview.java | 2 +- .../incoming/SormasToSormasEventPreview.java | 2 +- .../symeda/sormas/api/task/TaskIndexDto.java | 6 +- .../api/therapy/PrescriptionIndexDto.java | 29 ++++++---- .../sormas/api/therapy/TreatmentIndexDto.java | 29 ++++++---- .../symeda/sormas/api/utils/DataHelper.java | 6 +- .../PseudonymizableIndexDto.java | 21 ++----- .../sormas/api/uuid/AbstractUuidDto.java | 38 +++++++++++++ .../symeda/sormas/api/{ => uuid}/HasUuid.java | 2 +- .../vaccination/VaccinationListEntryDto.java | 12 ++-- .../sormas/api/visit/ExternalVisitDto.java | 2 +- .../sormas/api/visit/VisitExportDto.java | 32 ++++++----- .../api/visit/VisitSummaryExportDto.java | 34 ++++++++---- .../symeda/sormas/api/ArchitectureTest.java | 55 +++++++++++-------- .../caze/ResponsibleJurisdictionDto.java | 4 +- .../backend/common/AbstractDomainObject.java | 4 +- .../de/symeda/auditlog/api/AuditListener.java | 2 +- .../java/de/symeda/auditlog/api/Auditor.java | 2 +- .../java/de/symeda/auditlog/api/EntityId.java | 2 +- .../format/DefaultCollectionFormatter.java | 2 +- .../value/format/DefaultValueFormatter.java | 2 +- .../backend/audit/AuditLoggerInterceptor.java | 2 +- .../auditlog/AuditListenerCdiWrapper.java | 2 +- .../auditlog/DefaultAuditListener.java | 2 +- .../backend/common/AbstractDomainObject.java | 2 +- .../sormas/backend/common/AdoAttributes.java | 2 +- .../backend/common/CriteriaBuilderHelper.java | 2 +- .../DocumentTemplateFacadeEjb.java | 2 +- .../backend/person/PersonFacadeEjb.java | 3 +- .../sormas/backend/person/PersonService.java | 12 ++-- .../sormastosormas/ValidationHelper.java | 2 +- .../entities/SormasToSormasShareable.java | 2 +- .../sormas/backend/util/PatchHelper.java | 2 +- .../vaccination/VaccinationFacadeEjb.java | 3 +- .../auditlog/api/sample/AnonymizedEntity.java | 2 +- .../auditlog/api/sample/BaseEntity.java | 2 +- .../auditlog/api/sample/CollectionEntity.java | 2 +- .../de/symeda/auditlog/api/sample/Entity.java | 2 +- .../api/sample/EntityWithEmbedables.java | 2 +- .../sample/EntityWithHelperAttributes.java | 2 +- .../api/sample/EntityWithIgnoredMethods.java | 2 +- .../api/sample/OverridingFormatterEntity.java | 2 +- .../api/sample/SimpleBooleanFlagEntity.java | 2 +- .../InfrastructureController.java | 2 +- .../AbstractLabMessageProcessingFlowTest.java | 23 +++----- 80 files changed, 555 insertions(+), 582 deletions(-) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/uuid/AbstractUuidDto.java rename sormas-api/src/main/java/de/symeda/sormas/api/{ => uuid}/HasUuid.java (96%) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/EntityDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/EntityDto.java index 6c1be57f071..a8da1fa9904 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/EntityDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/EntityDto.java @@ -1,20 +1,17 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ + */ package de.symeda.sormas.api; import java.io.Serializable; @@ -31,6 +28,7 @@ import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.utils.FieldConstraints; import de.symeda.sormas.api.utils.Outbreaks; +import de.symeda.sormas.api.uuid.HasUuid; /** * All inheriting classes of EntityDto must include a build() method that sets diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/EntityDtoAccessHelper.java b/sormas-api/src/main/java/de/symeda/sormas/api/EntityDtoAccessHelper.java index 14ed96f1840..6cb86012e1b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/EntityDtoAccessHelper.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/EntityDtoAccessHelper.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.Map; +import de.symeda.sormas.api.uuid.HasUuid; import org.apache.commons.lang3.StringUtils; import de.symeda.sormas.api.caze.BirthDateDto; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/MergeableIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/MergeableIndexDto.java index 6634351c3ad..b16b9e7b4db 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/MergeableIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/MergeableIndexDto.java @@ -18,6 +18,8 @@ package de.symeda.sormas.api; +import de.symeda.sormas.api.uuid.HasUuid; + public interface MergeableIndexDto extends HasUuid { /** * diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/ReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/ReferenceDto.java index f35f2c262a0..a3c2cd437cf 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/ReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/ReferenceDto.java @@ -1,20 +1,18 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ + */ + package de.symeda.sormas.api; import java.io.Serializable; @@ -25,8 +23,8 @@ import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.utils.Required; +import de.symeda.sormas.api.uuid.HasUuid; -@SuppressWarnings("serial") public abstract class ReferenceDto implements Serializable, HasUuid, Comparable { public static final String CAPTION = "caption"; @@ -37,15 +35,15 @@ public abstract class ReferenceDto implements Serializable, HasUuid, Comparable< private String uuid; private String caption; - public ReferenceDto() { + protected ReferenceDto() { } - public ReferenceDto(String uuid) { + protected ReferenceDto(String uuid) { this.uuid = uuid; } - public ReferenceDto(String uuid, String caption) { + protected ReferenceDto(String uuid, String caption) { this.uuid = uuid; this.caption = caption; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignIndexDto.java index 3002f890f8a..744c2cd54c9 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignIndexDto.java @@ -1,39 +1,43 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.campaign; -import java.io.Serializable; import java.util.Date; -public class CampaignIndexDto implements Serializable { +import de.symeda.sormas.api.uuid.AbstractUuidDto; +public class CampaignIndexDto extends AbstractUuidDto { private static final long serialVersionUID = 2448753530580084851L; public static final String I18N_PREFIX = "Campaign"; - - public static final String UUID = "uuid"; public static final String NAME = "name"; public static final String START_DATE = "startDate"; public static final String END_DATE = "endDate"; - private String uuid; private String name; private Date startDate; private Date endDate; public CampaignIndexDto(String uuid, String name, Date startDate, Date endDate) { - this.uuid = uuid; + super(uuid); this.name = name; this.startDate = startDate; this.endDate = endDate; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public String getName() { return name; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/campaign/data/CampaignFormDataIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/data/CampaignFormDataIndexDto.java index fafdf198f05..d0d62f3c5d5 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/campaign/data/CampaignFormDataIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/data/CampaignFormDataIndexDto.java @@ -1,6 +1,6 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2020 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -15,15 +15,14 @@ package de.symeda.sormas.api.campaign.data; -import java.io.Serializable; import java.util.Date; import java.util.List; -public class CampaignFormDataIndexDto implements Serializable, Cloneable { +import de.symeda.sormas.api.uuid.AbstractUuidDto; - public static final String I18N_PREFIX = "CampaignFormData"; +public class CampaignFormDataIndexDto extends AbstractUuidDto implements Cloneable { - public static final String UUID = "uuid"; + public static final String I18N_PREFIX = "CampaignFormData"; public static final String CAMPAIGN = "campaign"; public static final String FORM = "form"; public static final String REGION = "region"; @@ -33,7 +32,6 @@ public class CampaignFormDataIndexDto implements Serializable, Cloneable { private static final long serialVersionUID = -6672198324526771162L; - private String uuid; private String campaign; private String form; private List formValues; @@ -51,7 +49,7 @@ public CampaignFormDataIndexDto( String district, String community, Date formDate) { - this.uuid = uuid; + super(uuid); this.campaign = campaign; this.form = form; this.formValues = (List) formValues; @@ -61,14 +59,6 @@ public CampaignFormDataIndexDto( this.formDate = formDate; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public String getCampaign() { return campaign; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseExportDto.java index 9b51f42ef44..67349cc900b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseExportDto.java @@ -1,23 +1,19 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ + */ package de.symeda.sormas.api.caze; -import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -71,6 +67,7 @@ import de.symeda.sormas.api.utils.YesNoUnknown; import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.PostalCodePseudonymizer; +import de.symeda.sormas.api.uuid.AbstractUuidDto; import de.symeda.sormas.api.vaccination.VaccinationDto; /** @@ -83,7 +80,7 @@ * recommended to remove properties that are removed from this file from existing export configurations. */ @ExportEntity(CaseDataDto.class) -public class CaseExportDto implements Serializable { +public class CaseExportDto extends AbstractUuidDto { private static final long serialVersionUID = 8581579464816945555L; @@ -123,7 +120,7 @@ public class CaseExportDto implements Serializable { private long hospitalizationId; private long symptomsId; private long healthConditionsId; - private String uuid; + private String epidNumber; private Disease disease; private String diseaseDetails; @@ -262,9 +259,9 @@ public class CaseExportDto implements Serializable { private int numberOfPrescriptions; private int numberOfTreatments; private int numberOfClinicalVisits; - private EmbeddedSampleExportDto sample1 = new EmbeddedSampleExportDto(); - private EmbeddedSampleExportDto sample2 = new EmbeddedSampleExportDto(); - private EmbeddedSampleExportDto sample3 = new EmbeddedSampleExportDto(); + private EmbeddedSampleExportDto sample1 = new EmbeddedSampleExportDto(null); + private EmbeddedSampleExportDto sample2 = new EmbeddedSampleExportDto(null); + private EmbeddedSampleExportDto sample3 = new EmbeddedSampleExportDto(null); private List otherSamples = new ArrayList<>(); private Boolean nosocomialOutbreak; @@ -394,7 +391,7 @@ public CaseExportDto(long id, long personId, Double personAddressLatitude, Doubl String associatedWithOutbreak, boolean isInJurisdiction ) { //@formatter:on - + super(uuid); this.id = id; this.personId = personId; this.addressGpsCoordinates = LocationHelper.buildGpsCoordinatesCaption(personAddressLatitude, personAddressLongitude, personAddressLatLonAcc); @@ -402,7 +399,6 @@ public CaseExportDto(long id, long personId, Double personAddressLatitude, Doubl this.symptomsId = symptomsId; this.hospitalizationId = hospitalizationId; this.healthConditionsId = healthConditionsId; - this.uuid = uuid; this.epidNumber = epidNumber; this.armedForcesRelationType = ArmedForcesRelationType; this.disease = disease; @@ -499,7 +495,7 @@ public CaseExportDto(long id, long personId, Double personAddressLatitude, Doubl this.trimester = trimester; this.followUpStatus = followUpStatus; this.followUpUntil = followUpUntil; - + this.eventCount = eventCount; this.numberOfPrescriptions = prescriptionCount != null ? prescriptionCount.intValue() : 0; this.numberOfTreatments = treatmentCount != null ? treatmentCount.intValue() : 0; @@ -533,7 +529,7 @@ public CaseExportDto(long id, long personId, Double personAddressLatitude, Doubl } public CaseReferenceDto toReference() { - return new CaseReferenceDto(uuid, firstName, lastName); + return new CaseReferenceDto(getUuid(), firstName, lastName); } public Boolean getInJurisdiction() { @@ -586,8 +582,9 @@ public long getHospitalizationId() { CaseExportType.CASE_MANAGEMENT }) @ExportProperty(CaseDataDto.UUID) @ExportGroup(ExportGroupType.CORE) + @Override public String getUuid() { - return uuid; + return super.getUuid(); } @Order(3) @@ -2406,10 +2403,6 @@ public void setHospitalizationId(long hospitalizationId) { this.hospitalizationId = hospitalizationId; } - public void setUuid(String uuid) { - this.uuid = uuid; - } - public void setEpidNumber(String epidNumber) { this.epidNumber = epidNumber; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/EmbeddedSampleExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/EmbeddedSampleExportDto.java index 91f995f71f1..fb3d9d45aab 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/EmbeddedSampleExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/EmbeddedSampleExportDto.java @@ -1,47 +1,43 @@ /* - * ****************************************************************************** - * * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * * Copyright © 2016-2020 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * * - * * This program is free software: you can redistribute it and/or modify - * * it under the terms of the GNU General Public License as published by - * * the Free Software Foundation, either version 3 of the License, or - * * (at your option) any later version. - * * - * * This program is distributed in the hope that it will be useful, - * * but WITHOUT ANY WARRANTY; without even the implied warranty of - * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * * GNU General Public License for more details. - * * - * * You should have received a copy of the GNU General Public License - * * along with this program. If not, see . - * ****************************************************************************** + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ package de.symeda.sormas.api.caze; -import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.infrastructure.facility.FacilityHelper; import de.symeda.sormas.api.sample.PathogenTestResultType; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.SensitiveData; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class EmbeddedSampleExportDto implements Serializable { +public class EmbeddedSampleExportDto extends AbstractUuidDto { - private String uuid; private Date dateTime; @SensitiveData private String lab; private PathogenTestResultType result; private Long caseId; - public EmbeddedSampleExportDto() { + public EmbeddedSampleExportDto(String uuid) { + // FIXME: used in CaseExportDto where the uuid is not set. Call-site looks quite strange. + super(uuid); } public EmbeddedSampleExportDto(String uuid, Date dateTime, String lab, PathogenTestResultType result) { - this.uuid = uuid; + super(uuid); this.dateTime = dateTime; this.lab = lab; this.result = result; @@ -55,7 +51,7 @@ public EmbeddedSampleExportDto( String labDetails, PathogenTestResultType result, Long caseId) { - this.uuid = uuid; + super(uuid); this.dateTime = dateTime; this.lab = labUuid != null ? FacilityHelper.buildFacilityString(labUuid, labName, labDetails) : null; this.result = result; @@ -98,14 +94,6 @@ public void setResult(PathogenTestResultType result) { this.result = result; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public Long getCaseId() { return caseId; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/MapCaseDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/MapCaseDto.java index 02db6cd7eb2..9905f1581cd 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/MapCaseDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/MapCaseDto.java @@ -1,23 +1,19 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ + */ package de.symeda.sormas.api.caze; -import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.Disease; @@ -28,14 +24,14 @@ import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.LatitudePseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.LongitudePseudonymizer; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class MapCaseDto implements Serializable { +public class MapCaseDto extends AbstractUuidDto { private static final long serialVersionUID = -3021332968056368431L; public static final String I18N_PREFIX = "CaseData"; - private String uuid; private Date reportDate; private CaseClassification caseClassification; private Disease disease; @@ -84,7 +80,7 @@ public MapCaseDto( Double addressLon, boolean isInJurisdiction) { - this.uuid = uuid; + super(uuid); this.reportDate = reportDate; this.caseClassification = caseClassification; this.disease = disease; @@ -99,14 +95,6 @@ public MapCaseDto( this.isInJurisdiction = isInJurisdiction; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public Date getReportDate() { return reportDate; } @@ -177,7 +165,7 @@ public void setAddressLon(Double addressLon) { @Override public String toString() { - return person.toString() + " (" + DataHelper.getShortUuid(uuid) + ")"; + return person.toString() + " (" + DataHelper.getShortUuid(getUuid()) + ")"; } public Double getHealthFacilityLat() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/PreviousCaseDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/PreviousCaseDto.java index 03902c291af..2e1b5e21c74 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/PreviousCaseDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/PreviousCaseDto.java @@ -1,6 +1,6 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2021 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -15,33 +15,28 @@ package de.symeda.sormas.api.caze; -import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.disease.DiseaseVariant; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class PreviousCaseDto implements Serializable { +public class PreviousCaseDto extends AbstractUuidDto { private static final long serialVersionUID = 5816724717269837258L; - private final String uuid; private final Date reportDate; private final String externalToken; private final DiseaseVariant diseaseVariant; private final Date onsetDate; public PreviousCaseDto(String uuid, Date reportDate, String externalToken, DiseaseVariant diseaseVariant, Date onsetDate) { - this.uuid = uuid; + super(uuid); this.reportDate = reportDate; this.externalToken = externalToken; this.diseaseVariant = diseaseVariant; this.onsetDate = onsetDate; } - public String getUuid() { - return uuid; - } - public Date getReportDate() { return reportDate; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/clinicalcourse/ClinicalVisitIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/clinicalcourse/ClinicalVisitIndexDto.java index 11b8f727d33..c8cbd98da78 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/clinicalcourse/ClinicalVisitIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/clinicalcourse/ClinicalVisitIndexDto.java @@ -1,13 +1,28 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.clinicalcourse; -import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.symptoms.SymptomsHelper; import de.symeda.sormas.api.symptoms.TemperatureSource; import de.symeda.sormas.api.utils.SensitiveData; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class ClinicalVisitIndexDto implements Serializable { +public class ClinicalVisitIndexDto extends AbstractUuidDto { private static final long serialVersionUID = -7587908114350685830L; @@ -21,7 +36,6 @@ public class ClinicalVisitIndexDto implements Serializable { public static final String HEART_RATE = "heartRate"; public static final String SIGNS_AND_SYMPTOMS_COUNT = "signsAndSymptomsCount"; - private String uuid; private Date visitDateTime; @SensitiveData private String visitingPerson; @@ -48,7 +62,7 @@ public ClinicalVisitIndexDto( Long symptomsId, boolean isInJurisdiction) { - this.uuid = uuid; + super(uuid); this.visitDateTime = visitDateTime; this.visitingPerson = visitingPerson; this.visitRemarks = visitRemarks; @@ -59,14 +73,6 @@ public ClinicalVisitIndexDto( this.isInJurisdiction = isInJurisdiction; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public Date getVisitDateTime() { return visitDateTime; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactExportDto.java index 3f4475047f7..780add19ae1 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactExportDto.java @@ -1,6 +1,6 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2020 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -15,7 +15,6 @@ package de.symeda.sormas.api.contact; -import java.io.Serializable; import java.util.Date; import java.util.Set; @@ -57,10 +56,11 @@ import de.symeda.sormas.api.utils.YesNoUnknown; import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.PostalCodePseudonymizer; +import de.symeda.sormas.api.uuid.AbstractUuidDto; import de.symeda.sormas.api.vaccination.VaccinationDto; @ExportEntity(ContactDto.class) -public class ContactExportDto implements Serializable { +public class ContactExportDto extends AbstractUuidDto { private static final long serialVersionUID = 2054231712903661096L; @@ -83,7 +83,6 @@ public class ContactExportDto implements Serializable { private long id; private long personId; - private String uuid; private String sourceCaseUuid; private CaseClassification caseClassification; private Disease disease; @@ -266,10 +265,9 @@ public ContactExportDto(long id, long personId, String uuid, String sourceCaseUu boolean isInJurisdiction ) { //@formatter:on - + super(uuid); this.id = id; this.personId = personId; - this.uuid = uuid; this.sourceCaseUuid = sourceCaseUuid; this.caseClassification = caseClassification; this.disease = disease; @@ -363,7 +361,7 @@ public ContactExportDto(long id, long personId, String uuid, String sourceCaseUu } public ContactReferenceDto toReference() { - return new ContactReferenceDto(uuid); + return new ContactReferenceDto(getUuid()); } public long getId() { @@ -381,8 +379,9 @@ public long getEpiDataId() { @Order(0) @ExportProperty(ContactDto.UUID) @ExportGroup(ExportGroupType.CORE) + @Override public String getUuid() { - return uuid; + return super.getUuid(); } @Order(1) @@ -1280,10 +1279,6 @@ public void setPersonId(long personId) { this.personId = personId; } - public void setUuid(String uuid) { - this.uuid = uuid; - } - public void setSourceCaseUuid(String sourceCaseUuid) { this.sourceCaseUuid = sourceCaseUuid; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/FollowUpStatusDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/FollowUpStatusDto.java index 7332470802d..9061ac72753 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/FollowUpStatusDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/FollowUpStatusDto.java @@ -1,27 +1,31 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.contact; -import java.io.Serializable; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class FollowUpStatusDto implements Serializable { +public class FollowUpStatusDto extends AbstractUuidDto { private static final long serialVersionUID = 6075542609471404489L; - private String uuid; private FollowUpStatus followUpStatus; public FollowUpStatusDto(String uuid, FollowUpStatus followUpStatus) { - - this.uuid = uuid; + super(uuid); this.followUpStatus = followUpStatus; - - } - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; } public FollowUpStatus getFollowUpStatus() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/MapContactDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/MapContactDto.java index 996fcab6d09..45a2c2f6356 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/MapContactDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/MapContactDto.java @@ -1,23 +1,19 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ + */ package de.symeda.sormas.api.contact; -import java.io.Serializable; import java.util.Date; import org.apache.commons.lang3.StringUtils; @@ -29,12 +25,12 @@ import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.LatitudePseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.LongitudePseudonymizer; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class MapContactDto implements Serializable { +public class MapContactDto extends AbstractUuidDto { private static final long serialVersionUID = -5840120135940125045L; - private String uuid; private ContactClassification contactClassification; @SensitiveData @Pseudonymizer(LatitudePseudonymizer.class) @@ -75,7 +71,7 @@ public MapContactDto( String casePersonFirstName, String casePersonLastName) { - this.uuid = uuid; + super(uuid); this.contactClassification = contactClassification; this.reportLat = reportLat; this.reportLon = reportLon; @@ -90,14 +86,6 @@ public MapContactDto( this.casePersonLastName = casePersonLastName; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public ContactClassification getContactClassification() { return contactClassification; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java index 92b3c67deef..24012d904ab 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java @@ -1,38 +1,34 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ + */ package de.symeda.sormas.api.dashboard; -import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseReferenceDefinition; import de.symeda.sormas.api.person.PresentCondition; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class DashboardCaseDto implements Serializable { +public class DashboardCaseDto extends AbstractUuidDto { private static final long serialVersionUID = -5705128377788207648L; public static final String I18N_PREFIX = "CaseData"; private long id; - private String uuid; private Date reportDate; private CaseClassification caseClassification; private Disease disease; @@ -53,9 +49,8 @@ public DashboardCaseDto( Date quarantineFrom, Date quarantineTo, CaseReferenceDefinition caseReferenceDefinition) { - + super(uuid); this.id = id; - this.uuid = uuid; this.reportDate = reportDate; this.caseClassification = caseClassification; this.disease = disease; @@ -73,14 +68,6 @@ public void setId(long id) { this.id = id; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public Date getReportDate() { return reportDate; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardEventDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardEventDto.java index e2d0dd10024..48bccb3a96a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardEventDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardEventDto.java @@ -1,23 +1,19 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ + */ package de.symeda.sormas.api.dashboard; -import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.Disease; @@ -25,18 +21,17 @@ import de.symeda.sormas.api.event.EventReferenceDto; import de.symeda.sormas.api.event.EventStatus; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class DashboardEventDto implements Serializable { +public class DashboardEventDto extends AbstractUuidDto { private static final long serialVersionUID = -4108181804263076837L; public static final String I18N_PREFIX = "Event"; - public static final String EVENT_STATUS = "eventStatus"; public static final String EVENT_INVESTIGATION_STATUS = "eventInvestigationStatus"; public static final String DISEASE = "disease"; - private String uuid; private EventStatus eventStatus; private EventInvestigationStatus eventInvestigationStatus; private Disease disease; @@ -69,7 +64,7 @@ public DashboardEventDto( String communityUuid, boolean isInJurisdiction) { - this.uuid = uuid; + super(uuid); this.eventStatus = eventStatus; this.eventInvestigationStatus = eventInvestigationStatus; this.disease = disease; @@ -84,14 +79,6 @@ public DashboardEventDto( this.isInJurisdiction = isInJurisdiction; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public EventStatus getEventStatus() { return eventStatus; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventExportDto.java index b3442f90707..7ef44af77cf 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventExportDto.java @@ -1,6 +1,6 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2020 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -15,7 +15,6 @@ package de.symeda.sormas.api.event; -import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.Disease; @@ -30,9 +29,10 @@ import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.Order; import de.symeda.sormas.api.utils.YesNoUnknown; +import de.symeda.sormas.api.uuid.AbstractUuidDto; @ExportEntity(EventDto.class) -public class EventExportDto implements Serializable { +public class EventExportDto extends AbstractUuidDto { public static final String I18N_PREFIX = "EventExport"; @@ -44,7 +44,6 @@ public class EventExportDto implements Serializable { public static final String CONTACT_COUNT = "contactCount"; public static final String CONTACT_COUNT_SOURCE_IN_EVENT = "contactCountSourceInEvent"; - private String uuid; private String externalId; private String externalToken; private String internalToken; @@ -155,7 +154,7 @@ public EventExportDto( boolean isInJurisdictionOrOwned, EventManagementStatus eventManagementStatus, EventIdentificationSource eventIdentificationSource) { - this.uuid = uuid; + super(uuid); this.externalId = externalId; this.externalToken = externalToken; this.internalToken = internalToken; @@ -206,12 +205,9 @@ public EventExportDto( @Order(0) @ExportProperty(EventDto.UUID) @ExportGroup(ExportGroupType.CORE) + @Override public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; + return super.getUuid(); } @Order(1) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventGroupIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventGroupIndexDto.java index dea1ea43dd1..ad5675a0e91 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventGroupIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventGroupIndexDto.java @@ -1,26 +1,24 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ + */ package de.symeda.sormas.api.event; -import java.io.Serializable; import java.util.Date; -public class EventGroupIndexDto implements Serializable { +import de.symeda.sormas.api.uuid.AbstractUuidDto; + +public class EventGroupIndexDto extends AbstractUuidDto { private static final long serialVersionUID = 8322646404033924938L; @@ -31,26 +29,17 @@ public class EventGroupIndexDto implements Serializable { public static final String EVENT_COUNT = "eventCount"; public static final String CHANGED_DATE = "changeDate"; - private String uuid; private String name; private Long eventCount; private Date changeDate; public EventGroupIndexDto(String uuid, String name, Date changeDate, Long eventCount) { - this.uuid = uuid; + super(uuid); this.name = name; this.changeDate = changeDate; this.eventCount = eventCount; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public String getName() { return name; } @@ -88,13 +77,14 @@ public boolean equals(Object o) { EventGroupIndexDto that = (EventGroupIndexDto) o; - return uuid.equals(that.uuid); + return getUuid().equals(that.getUuid()); } @Override public int hashCode() { final int prime = 31; int result = 1; + final String uuid = getUuid(); result = prime * result + ((uuid == null) ? 0 : uuid.hashCode()); return result; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventIndexDto.java index d734d60938b..63e1967f1d5 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventIndexDto.java @@ -1,20 +1,18 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2021 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ + */ + package de.symeda.sormas.api.event; import java.io.Serializable; @@ -27,7 +25,7 @@ import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -public class EventIndexDto extends PseudonymizableIndexDto implements Serializable { +public class EventIndexDto extends PseudonymizableIndexDto { private static final long serialVersionUID = 8322646404033924938L; @@ -118,9 +116,6 @@ public class EventIndexDto extends PseudonymizableIndexDto implements Serializab private Long surveillanceToolShareCount; private ExternalShareStatus surveillanceToolStatus; - public EventIndexDto() { - } - public EventIndexDto( Long id, String uuid, @@ -198,6 +193,10 @@ public EventIndexDto( this.eventIdentificationSource = eventIdentificationSource; } + public EventIndexDto(String uuid) { + super(uuid); + } + public Long getId() { return id; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/externaldata/ExternalDataDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/externaldata/ExternalDataDto.java index 3c390be510f..0de9c26a231 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/externaldata/ExternalDataDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/externaldata/ExternalDataDto.java @@ -1,33 +1,36 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.externaldata; -import static de.symeda.sormas.api.HasUuid.UUID_REGEX; import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_DEFAULT; -import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_UUID_MAX; -import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_UUID_MIN; - -import java.io.Serializable; -import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; import de.symeda.sormas.api.i18n.Validations; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class ExternalDataDto implements Serializable, HasExternalData { +public class ExternalDataDto extends AbstractUuidDto implements HasExternalData { - @Pattern(regexp = UUID_REGEX, message = Validations.uuidPatternNotMatching) - @Size(min = CHARACTER_LIMIT_UUID_MIN, max = CHARACTER_LIMIT_UUID_MAX, message = Validations.textSizeNotInRange) - private String uuid; @Size(max = CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong) private String externalId; @Size(max = CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong) private String externalToken; - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; + public ExternalDataDto(String uuid) { + super(uuid); } public String getExternalId() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageIndexDto.java index a1e7058ea26..9b573318bcd 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageIndexDto.java @@ -1,18 +1,32 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.externalmessage; -import java.io.Serializable; import java.util.Calendar; import java.util.Date; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.sample.PathogenTestResultType; import de.symeda.sormas.api.user.UserReferenceDto; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class ExternalMessageIndexDto implements Serializable { +public class ExternalMessageIndexDto extends AbstractUuidDto { public static final String I18N_PREFIX = "ExternalMessage"; - public static final String UUID = "uuid"; public static final String MESSAGE_DATE_TIME = "messageDateTime"; public static final String TYPE = "type"; public static final String REPORTER_NAME = "reporterName"; @@ -26,7 +40,6 @@ public class ExternalMessageIndexDto implements Serializable { public static final String STATUS = "status"; public static final String ASSIGNEE = "assignee"; - private String uuid; private ExternalMessageType type; private Date messageDateTime; private String reporterName; @@ -59,7 +72,7 @@ public ExternalMessageIndexDto( String assigneeFirstName, String assigneeLastName) { - this.uuid = uuid; + super(uuid); this.type = type; this.messageDateTime = messageDateTime; this.reporterName = reporterName; @@ -86,14 +99,6 @@ public ExternalMessageIndexDto( } } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public ExternalMessageType getType() { return type; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureConfigurationIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureConfigurationIndexDto.java index 9dcca137e0a..e415419350a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureConfigurationIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureConfigurationIndexDto.java @@ -1,10 +1,23 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.feature; -import static de.symeda.sormas.api.HasUuid.UUID_REGEX; import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_UUID_MAX; import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_UUID_MIN; -import java.io.Serializable; import java.util.Date; import javax.validation.constraints.Pattern; @@ -12,21 +25,18 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.i18n.Validations; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class FeatureConfigurationIndexDto implements Serializable { +public class FeatureConfigurationIndexDto extends AbstractUuidDto { private static final long serialVersionUID = -8033830301352311580L; public static final String I18N_PREFIX = "FeatureConfiguration"; - public static final String REGION_NAME = "regionName"; public static final String DISTRICT_NAME = "districtName"; public static final String ENABLED = "enabled"; public static final String END_DATE = "endDate"; - @Pattern(regexp = UUID_REGEX, message = Validations.patternNotMatching) - @Size(min = CHARACTER_LIMIT_UUID_MIN, max = CHARACTER_LIMIT_UUID_MAX, message = Validations.textSizeNotInRange) - private String uuid; @Pattern(regexp = UUID_REGEX, message = Validations.patternNotMatching) @Size(min = CHARACTER_LIMIT_UUID_MIN, max = CHARACTER_LIMIT_UUID_MAX, message = Validations.textSizeNotInRange) private String regionUuid; @@ -49,7 +59,7 @@ public FeatureConfigurationIndexDto( Boolean enabled, Date endDate) { - this.uuid = uuid; + super(uuid); this.regionUuid = regionUuid; this.regionName = regionName; this.districtUuid = districtUuid; @@ -59,17 +69,6 @@ public FeatureConfigurationIndexDto( this.endDate = endDate; } - public FeatureConfigurationIndexDto() { - } - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public String getRegionUuid() { return regionUuid; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityExportDto.java index 3f64fe51261..5a3f254db8d 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityExportDto.java @@ -1,32 +1,28 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ -package de.symeda.sormas.api.infrastructure.facility; + */ -import java.io.Serializable; +package de.symeda.sormas.api.infrastructure.facility; import de.symeda.sormas.api.infrastructure.area.AreaType; import de.symeda.sormas.api.utils.Order; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class FacilityExportDto implements Serializable { +public class FacilityExportDto extends AbstractUuidDto { public static final String I18N_PREFIX = "FacilityExport"; - public static final String UUID = "uuid"; public static final String NAME = "name"; public static final String REGION = "region"; public static final String DISTRICT = "district"; @@ -46,7 +42,6 @@ public class FacilityExportDto implements Serializable { public static final String TYPE = "type"; public static final String EXTERNAL_ID = "externalID"; - private String uuid; private String name; private FacilityType type; private String region; @@ -87,7 +82,7 @@ public FacilityExportDto( Double longitude, String externalID) { - this.uuid = uuid; + super(uuid); this.name = name; this.type = type; this.region = region; @@ -110,11 +105,7 @@ public FacilityExportDto( @Order(0) public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; + return super.getUuid(); } @Order(1) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityIndexDto.java index 40d1a91f24f..362472ff615 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/facility/FacilityIndexDto.java @@ -19,7 +19,7 @@ import java.io.Serializable; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/person/JournalPersonDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/person/JournalPersonDto.java index 50ec8e4baef..afce5136cb5 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/person/JournalPersonDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/person/JournalPersonDto.java @@ -1,18 +1,32 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.person; -import java.io.Serializable; import java.util.Date; import java.util.Objects; import de.symeda.sormas.api.contact.FollowUpStatus; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.SensitiveData; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class JournalPersonDto implements Serializable { +public class JournalPersonDto extends AbstractUuidDto { private static final long serialVersionUID = 3561284010406711305L; - private String uuid; private boolean pseudonymized; @PersonalData private String firstName; @@ -33,12 +47,8 @@ public class JournalPersonDto implements Serializable { private Date latestFollowUpEndDate; private FollowUpStatus followUpStatus; - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; + public JournalPersonDto(String uuid) { + super(uuid); } public boolean isPseudonymized() { @@ -131,7 +141,7 @@ public void setFollowUpStatus(FollowUpStatus followUpStatus) { @Override public String toString() { - return uuid + ' ' + firstName + ' ' + lastName; + return getUuid() + ' ' + firstName + ' ' + lastName; } @Override @@ -142,7 +152,7 @@ public boolean equals(Object o) { return false; JournalPersonDto that = (JournalPersonDto) o; return pseudonymized == that.pseudonymized - && Objects.equals(uuid, that.uuid) + && Objects.equals(getUuid(), that.getUuid()) && Objects.equals(firstName, that.firstName) && Objects.equals(lastName, that.lastName) && Objects.equals(emailAddress, that.emailAddress) @@ -158,7 +168,7 @@ public boolean equals(Object o) { @Override public int hashCode() { return Objects.hash( - uuid, + getUuid(), pseudonymized, firstName, lastName, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonExportDto.java index 099d4958832..92860594d84 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonExportDto.java @@ -1,6 +1,6 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2021 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -15,7 +15,6 @@ package de.symeda.sormas.api.person; -import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.CountryHelper; @@ -34,8 +33,9 @@ import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.PostalCodePseudonymizer; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class PersonExportDto implements Serializable { +public class PersonExportDto extends AbstractUuidDto { private static final long serialVersionUID = -6902138630884671263L; @@ -43,7 +43,6 @@ public class PersonExportDto implements Serializable { public static final String ADDRESS_GPS_COORDINATES = "addressGpsCoordinates"; - private String uuid; @PersonalData @SensitiveData private String firstName; @@ -211,7 +210,7 @@ public PersonExportDto( String citizenshipCountryName, String additionalDetails, Boolean isInJurisdiction) { - this.uuid = uuid; + super(uuid); this.firstName = firstName; this.lastName = lastName; this.salutation = salutation; @@ -278,7 +277,7 @@ public PersonExportDto( String email, boolean isInJurisdiction) { - this.uuid = uuid; + super(uuid); this.firstName = firstName; this.lastName = lastName; this.sex = sex; @@ -296,7 +295,7 @@ public PersonExportDto( @ExportProperty(PersonDto.UUID) @ExportGroup(ExportGroupType.CORE) public String getUuid() { - return uuid; + return super.getUuid(); } @Order(1) @@ -376,7 +375,9 @@ public String getNickname() { @Order(17) @ExportProperty(PersonDto.MOTHERS_NAME) @ExportGroup(ExportGroupType.ADDITIONAL) - @HideForCountries(countries = {CountryHelper.COUNTRY_CODE_GERMANY, CountryHelper.COUNTRY_CODE_FRANCE}) + @HideForCountries(countries = { + CountryHelper.COUNTRY_CODE_GERMANY, + CountryHelper.COUNTRY_CODE_FRANCE }) public String getMothersName() { return mothersName; } @@ -384,7 +385,9 @@ public String getMothersName() { @Order(18) @ExportProperty(PersonDto.MOTHERS_MAIDEN_NAME) @ExportGroup(ExportGroupType.ADDITIONAL) - @HideForCountries(countries = {CountryHelper.COUNTRY_CODE_GERMANY, CountryHelper.COUNTRY_CODE_FRANCE}) + @HideForCountries(countries = { + CountryHelper.COUNTRY_CODE_GERMANY, + CountryHelper.COUNTRY_CODE_FRANCE }) public String getMothersMaidenName() { return mothersMaidenName; } @@ -392,7 +395,9 @@ public String getMothersMaidenName() { @Order(19) @ExportProperty(PersonDto.FATHERS_NAME) @ExportGroup(ExportGroupType.ADDITIONAL) - @HideForCountries(countries = {CountryHelper.COUNTRY_CODE_GERMANY, CountryHelper.COUNTRY_CODE_FRANCE}) + @HideForCountries(countries = { + CountryHelper.COUNTRY_CODE_GERMANY, + CountryHelper.COUNTRY_CODE_FRANCE }) public String getFathersName() { return fathersName; } @@ -561,7 +566,9 @@ public String getOtherContactDetails() { @Order(54) @ExportProperty(value = PersonDto.EDUCATION_TYPE, combined = true) @ExportGroup(ExportGroupType.PERSON) - @HideForCountries(countries = {CountryHelper.COUNTRY_CODE_GERMANY, CountryHelper.COUNTRY_CODE_FRANCE}) + @HideForCountries(countries = { + CountryHelper.COUNTRY_CODE_GERMANY, + CountryHelper.COUNTRY_CODE_FRANCE }) public EducationType getEducationType() { return educationType; } @@ -569,7 +576,9 @@ public EducationType getEducationType() { @Order(55) @ExportProperty(value = PersonDto.EDUCATION_TYPE, combined = true) @ExportGroup(ExportGroupType.PERSON) - @HideForCountries(countries = {CountryHelper.COUNTRY_CODE_GERMANY, CountryHelper.COUNTRY_CODE_FRANCE}) + @HideForCountries(countries = { + CountryHelper.COUNTRY_CODE_GERMANY, + CountryHelper.COUNTRY_CODE_FRANCE }) public String getEducationDetails() { return educationDetails; } @@ -599,7 +608,9 @@ public ArmedForcesRelationType getArmedForcesRelationType() { @Order(60) @ExportProperty(PersonDto.PASSPORT_NUMBER) @ExportGroup(ExportGroupType.CORE) - @HideForCountries(countries = {CountryHelper.COUNTRY_CODE_GERMANY, CountryHelper.COUNTRY_CODE_FRANCE}) + @HideForCountries(countries = { + CountryHelper.COUNTRY_CODE_GERMANY, + CountryHelper.COUNTRY_CODE_FRANCE }) public String getPassportNumber() { return passportNumber; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonNameDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonNameDto.java index 1848dca128e..aff4b46db67 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonNameDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonNameDto.java @@ -1,37 +1,32 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ + */ package de.symeda.sormas.api.person; -import java.io.Serializable; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class PersonNameDto implements Serializable { +public class PersonNameDto extends AbstractUuidDto { private static final long serialVersionUID = 8807952809814344983L; private String firstName; private String lastName; - private String uuid; public PersonNameDto(String firstName, String lastName, String uuid) { - + super(uuid); this.firstName = firstName; this.lastName = lastName; - this.uuid = uuid; } public String getFirstName() { @@ -50,19 +45,12 @@ public void setLastName(String lastName) { this.lastName = lastName; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - @Override public int hashCode() { final int prime = 31; int result = 1; + final String uuid = getUuid(); result = prime * result + ((uuid == null) ? 0 : uuid.hashCode()); return result; } @@ -77,10 +65,9 @@ public boolean equals(Object obj) { if (getClass() != obj.getClass()) return false; PersonNameDto other = (PersonNameDto) obj; - if (uuid == null) { - if (other.uuid != null) - return false; - } else if (!uuid.equals(other.uuid)) + if (getUuid() == null) { + return other.getUuid() == null; + } else if (!getUuid().equals(other.getUuid())) return false; return true; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/person/SimilarPersonDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/person/SimilarPersonDto.java index 7555211e151..fc774c1c6a6 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/person/SimilarPersonDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/person/SimilarPersonDto.java @@ -1,13 +1,28 @@ -package de.symeda.sormas.api.person; +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ -import de.symeda.sormas.api.CountryHelper; -import de.symeda.sormas.api.utils.HideForCountries; +package de.symeda.sormas.api.person; -import java.io.Serializable; import java.util.Arrays; import java.util.List; -public class SimilarPersonDto implements Serializable { +import de.symeda.sormas.api.CountryHelper; +import de.symeda.sormas.api.utils.HideForCountries; +import de.symeda.sormas.api.uuid.AbstractUuidDto; + +public class SimilarPersonDto extends AbstractUuidDto { public static final String I18N_PREFIX = "Person"; public static final String I18N_PREFIX_LOCATION = "Location"; @@ -30,7 +45,6 @@ public class SimilarPersonDto implements Serializable { private static final List LOCATION_DETAILS = Arrays.asList(POSTAL_CODE, CITY, STREET, HOUSE_NUMBER); - private String uuid; private String firstName; private String lastName; @HideForCountries @@ -47,15 +61,13 @@ public class SimilarPersonDto implements Serializable { private String houseNumber; @HideForCountries private String nationalHealthId; - @HideForCountries(countries = {CountryHelper.COUNTRY_CODE_GERMANY, CountryHelper.COUNTRY_CODE_FRANCE}) + @HideForCountries(countries = { + CountryHelper.COUNTRY_CODE_GERMANY, + CountryHelper.COUNTRY_CODE_FRANCE }) private String passportNumber; - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; + public SimilarPersonDto(String uuid) { + super(uuid); } public String getFirstName() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java index ef8c22c94eb..6f946029b3c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java @@ -1,3 +1,18 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.sample; import java.io.Serializable; @@ -31,15 +46,15 @@ import de.symeda.sormas.api.utils.SensitiveData; import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.EmptyValuePseudonymizer; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class SampleExportDto implements Serializable { +public class SampleExportDto extends AbstractUuidDto { private static final long serialVersionUID = -3027326087594387560L; public static final String I18N_PREFIX = "SampleExport"; private long id; - private String uuid; private String labSampleID; private String epidNumber; @EmbeddedPersonalData @@ -136,9 +151,8 @@ public SampleExportDto(long id, String uuid, String labSampleId, Date sampleRepo String caseCommunity, String caseHealthFacility, String caseFacilityDetails, String contactRegion, String contactDistrict, String contactCommunity, Date contactReportDate, Date lastContactDate, ContactClassification contactClassification, ContactStatus contactStatus, String labUuid, String caseHealthFacilityUuid, boolean isInJurisdiction, boolean isCaseInJurisdiction, boolean isContactInJurisdiction, boolean isContactCaseInJurisdiction, boolean isEventParticipantInJurisdiction) { //@formatter:on - + super(uuid); this.id = id; - this.uuid = uuid; this.labSampleID = labSampleId; this.epidNumber = epidNumber; this.sampleReportDate = sampleReportDate; @@ -248,11 +262,11 @@ public SampleExportDto(long id, String uuid, String labSampleId, Date sampleRepo this.contactStatus = contactStatus; this.sampleJurisdictionFlagsDto = new SampleJurisdictionFlagsDto( - isInJurisdiction, - isCaseInJurisdiction, - isContactInJurisdiction, - isContactCaseInJurisdiction, - isEventParticipantInJurisdiction); + isInJurisdiction, + isCaseInJurisdiction, + isContactInJurisdiction, + isContactCaseInJurisdiction, + isEventParticipantInJurisdiction); } @Order(0) @@ -266,11 +280,7 @@ public void setId(long id) { @Order(1) public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; + return super.getUuid(); } @Order(2) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/ShareTreeCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/ShareTreeCriteria.java index 421924aa988..0106e56c894 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/ShareTreeCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/ShareTreeCriteria.java @@ -15,7 +15,7 @@ package de.symeda.sormas.api.sormastosormas; -import static de.symeda.sormas.api.HasUuid.UUID_REGEX; +import static de.symeda.sormas.api.uuid.HasUuid.UUID_REGEX; import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_DEFAULT; import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_UUID_MAX; import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_UUID_MIN; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/ShareRequestIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/ShareRequestIndexDto.java index e7cc383b467..b340fabb2f3 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/ShareRequestIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/ShareRequestIndexDto.java @@ -1,36 +1,32 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ package de.symeda.sormas.api.sormastosormas.share; -import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.sormastosormas.share.incoming.ShareRequestDataType; import de.symeda.sormas.api.sormastosormas.share.incoming.ShareRequestStatus; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class ShareRequestIndexDto implements Serializable { +public class ShareRequestIndexDto extends AbstractUuidDto { private static final long serialVersionUID = 2314636780125234734L; public static final String I18N_PREFIX = "SormasToSormasShareRequestIndex"; - public static final String UUID = "uuid"; public static final String CREATION_DATE = "creationDate"; public static final String DATA_TYPE = "dataType"; public static final String STATUS = "status"; @@ -40,7 +36,6 @@ public class ShareRequestIndexDto implements Serializable { public static final String OWNERSHIP_HANDED_OVER = "ownershipHandedOver"; public static final String COMMENT = "comment"; - private String uuid; private Date creationDate; private ShareRequestDataType dataType; private ShareRequestStatus status; @@ -59,7 +54,7 @@ public ShareRequestIndexDto( String senderName, boolean ownershipHandedOver, String comment) { - this.uuid = uuid; + super(uuid); this.creationDate = creationDate; this.dataType = dataType; this.status = status; @@ -69,14 +64,6 @@ public ShareRequestIndexDto( this.comment = comment; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public Date getCreationDate() { return creationDate; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/PreviewNotImplementedDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/PreviewNotImplementedDto.java index 3b3796cc716..44f093b0afe 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/PreviewNotImplementedDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/PreviewNotImplementedDto.java @@ -15,7 +15,7 @@ package de.symeda.sormas.api.sormastosormas.share.incoming; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableDto; public class PreviewNotImplementedDto extends PseudonymizableDto implements HasUuid { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/RequestResponseDataDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/RequestResponseDataDto.java index f5a4d204b0e..4b5536d0e62 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/RequestResponseDataDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/RequestResponseDataDto.java @@ -23,7 +23,7 @@ import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.utils.FieldConstraints; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasCasePreview.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasCasePreview.java index dc10919bfe3..4dd6e54cf2e 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasCasePreview.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasCasePreview.java @@ -25,7 +25,7 @@ import javax.validation.constraints.Size; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseOutcome; import de.symeda.sormas.api.caze.InvestigationStatus; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasContactPreview.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasContactPreview.java index 00c0d636ace..b45b027dcf0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasContactPreview.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasContactPreview.java @@ -25,7 +25,7 @@ import javax.validation.constraints.Size; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.contact.ContactCategory; import de.symeda.sormas.api.contact.ContactClassification; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasEventParticipantPreview.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasEventParticipantPreview.java index 65a30ac4d36..5b3a5729432 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasEventParticipantPreview.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasEventParticipantPreview.java @@ -22,7 +22,7 @@ import javax.validation.Valid; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.event.EventReferenceDto; import de.symeda.sormas.api.utils.EmbeddedPersonalData; import de.symeda.sormas.api.utils.EmbeddedSensitiveData; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasEventPreview.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasEventPreview.java index 7b2e2bed0e7..006bea448a6 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasEventPreview.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/share/incoming/SormasToSormasEventPreview.java @@ -25,7 +25,7 @@ import javax.validation.constraints.Size; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.location.LocationDto; import de.symeda.sormas.api.utils.EmbeddedPersonalData; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskIndexDto.java index af84bd8276c..66a840b4ea5 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskIndexDto.java @@ -17,7 +17,6 @@ *******************************************************************************/ package de.symeda.sormas.api.task; -import java.io.Serializable; import java.util.Date; import org.apache.commons.lang3.StringUtils; @@ -42,13 +41,12 @@ import de.symeda.sormas.api.utils.pseudonymization.Pseudonymizer; import de.symeda.sormas.api.utils.pseudonymization.valuepseudonymizers.EmptyValuePseudonymizer; -public class TaskIndexDto extends PseudonymizableIndexDto implements Serializable { +public class TaskIndexDto extends PseudonymizableIndexDto { private static final long serialVersionUID = 2439546041916003653L; public static final String I18N_PREFIX = "Task"; - public static final String UUID = "uuid"; public static final String ASSIGNEE_REPLY = "assigneeReply"; public static final String ASSIGNEE_USER = "assigneeUser"; public static final String CAZE = "caze"; @@ -121,7 +119,7 @@ public TaskIndexDto(String uuid, TaskContext taskContext, String caseUuid, Strin boolean isInJurisdiction, boolean isCaseInJurisdiction, boolean isContactInJurisdiction, boolean isContactCaseInJurisdiction, boolean isEventInJurisdiction, boolean isTravelEntryInJurisdiction) { //@formatter:on - this.setUuid(uuid); + super(uuid); this.taskContext = taskContext; if (caseUuid != null) { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/therapy/PrescriptionIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/therapy/PrescriptionIndexDto.java index 945812374fe..0de62f6adae 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/therapy/PrescriptionIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/therapy/PrescriptionIndexDto.java @@ -1,11 +1,27 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.therapy; import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.utils.SensitiveData; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class PrescriptionIndexDto implements Serializable { +public class PrescriptionIndexDto extends AbstractUuidDto { private static final long serialVersionUID = 9189039796173435070L; @@ -19,7 +35,6 @@ public class PrescriptionIndexDto implements Serializable { public static final String PRESCRIPTION_ROUTE = "prescriptionRoute"; public static final String PRESCRIBING_CLINICIAN = "prescribingClinician"; - private String uuid; private PrescriptionIndexType prescriptionIndexType; private Date prescriptionDate; private PeriodDto prescriptionPeriod; @@ -46,7 +61,7 @@ public PrescriptionIndexDto( String prescribingClinician, boolean isInJurisdiction) { - this.uuid = uuid; + super(uuid); this.prescriptionIndexType = new PrescriptionIndexType(prescriptionType, prescriptionDetails, typeOfDrug); this.prescriptionDate = prescriptionDate; this.prescriptionPeriod = new PeriodDto(prescriptionStart, prescriptionEnd); @@ -57,14 +72,6 @@ public PrescriptionIndexDto( this.isInJurisdiction = isInJurisdiction; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public String getPrescriptionType() { return prescriptionIndexType.formatString(); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/therapy/TreatmentIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/therapy/TreatmentIndexDto.java index c8671a3a498..848826db266 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/therapy/TreatmentIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/therapy/TreatmentIndexDto.java @@ -1,11 +1,27 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.therapy; import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.utils.SensitiveData; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class TreatmentIndexDto implements Serializable { +public class TreatmentIndexDto extends AbstractUuidDto { private static final long serialVersionUID = 8736174497617079947L; @@ -38,8 +54,7 @@ public TreatmentIndexDto( String routeDetails, String executingClinician, boolean isInJurisdiction) { - - this.uuid = uuid; + super(uuid); this.treatmentIndexType = new TreatmentIndexType(treatmentType, treatmentDetails, typeOfDrug); this.treatmentDateTime = treatmentDateTime; this.dose = dose; @@ -48,14 +63,6 @@ public TreatmentIndexDto( this.isInJurisdiction = isInJurisdiction; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public TreatmentIndexType getTreatmentIndexType() { return treatmentIndexType; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/DataHelper.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/DataHelper.java index 3015adece69..07aadb6458d 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/DataHelper.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/DataHelper.java @@ -17,10 +17,6 @@ import static java.util.stream.Collectors.joining; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.io.Serializable; import java.math.BigDecimal; import java.math.RoundingMode; @@ -44,7 +40,7 @@ import com.google.common.base.CharMatcher; import de.symeda.sormas.api.AgeGroup; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.Language; import de.symeda.sormas.api.caze.AgeAndBirthDateDto; import de.symeda.sormas.api.caze.BirthDateDto; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/PseudonymizableIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/PseudonymizableIndexDto.java index d16e270a7f8..96533fb34de 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/PseudonymizableIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/PseudonymizableIndexDto.java @@ -1,6 +1,6 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2020 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -15,14 +15,12 @@ package de.symeda.sormas.api.utils.pseudonymization; -import java.io.Serializable; - +import de.symeda.sormas.api.uuid.AbstractUuidDto; import org.apache.commons.lang3.StringUtils; -public class PseudonymizableIndexDto implements Pseudonymizable, Serializable { +public class PseudonymizableIndexDto extends AbstractUuidDto implements Pseudonymizable { private boolean pseudonymized; - private String uuid; public boolean isPseudonymized() { return pseudonymized; @@ -32,19 +30,8 @@ public void setPseudonymized(boolean pseudonymized) { this.pseudonymized = pseudonymized; } - public PseudonymizableIndexDto() { - } - public PseudonymizableIndexDto(String uuid) { - this.uuid = uuid; - } - - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; + super(uuid); } public String getCaption() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/uuid/AbstractUuidDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/uuid/AbstractUuidDto.java new file mode 100644 index 00000000000..ef4346d575c --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/uuid/AbstractUuidDto.java @@ -0,0 +1,38 @@ +package de.symeda.sormas.api.uuid; + +import java.io.Serializable; + +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +import de.symeda.sormas.api.i18n.Validations; +import de.symeda.sormas.api.utils.FieldConstraints; + +/** + * An abstract class for all DTOs that have an UUID. + */ + +public class AbstractUuidDto implements HasUuid, Serializable { +// FIXME(@JonasCir): I would like to make this class the base class for EntityDto, but there is an @Outbreak annotation +// which needs special handling. Also, this should be the base class for ReferenceDto, however, the uuid field there is +// required. I argue that the uuid field in this class should be required here as well, however, this would be a big +// breaking change which we need to handle separately. + + public static final String UUID = "uuid"; + @Pattern(regexp = UUID_REGEX, message = Validations.uuidPatternNotMatching) + @Size(min = FieldConstraints.CHARACTER_LIMIT_UUID_MIN, max = FieldConstraints.CHARACTER_LIMIT_UUID_MAX, message = Validations.textSizeNotInRange) + private String uuid; + + public AbstractUuidDto(String uuid) { + this.uuid = uuid; + } + + @Override + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/HasUuid.java b/sormas-api/src/main/java/de/symeda/sormas/api/uuid/HasUuid.java similarity index 96% rename from sormas-api/src/main/java/de/symeda/sormas/api/HasUuid.java rename to sormas-api/src/main/java/de/symeda/sormas/api/uuid/HasUuid.java index 1171b05d0b9..199ea32fa40 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/HasUuid.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/uuid/HasUuid.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package de.symeda.sormas.api; +package de.symeda.sormas.api.uuid; public interface HasUuid { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/vaccination/VaccinationListEntryDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/vaccination/VaccinationListEntryDto.java index b63362a5331..dfa49333295 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/vaccination/VaccinationListEntryDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/vaccination/VaccinationListEntryDto.java @@ -15,7 +15,6 @@ package de.symeda.sormas.api.vaccination; -import java.io.Serializable; import java.util.Date; import de.symeda.sormas.api.Disease; @@ -25,9 +24,8 @@ import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateFormatHelper; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; -import org.apache.commons.lang3.StringUtils; -public class VaccinationListEntryDto extends PseudonymizableIndexDto implements Serializable, Cloneable { +public class VaccinationListEntryDto extends PseudonymizableIndexDto implements Cloneable { private static final long serialVersionUID = 5665903874736291912L; @@ -38,6 +36,10 @@ public class VaccinationListEntryDto extends PseudonymizableIndexDto implements private boolean isRelevant; private String nonRelevantMessage; + public VaccinationListEntryDto(String uuid) { + super(uuid); + } + public Vaccine getVaccineName() { return vaccineName; } @@ -95,12 +97,12 @@ public String getCaption() { String date = DateFormatHelper.formatLocalDate(vaccinationDate); final String vaccine; - if(vaccineName != null) { + if (vaccineName != null) { vaccine = vaccineName != Vaccine.OTHER ? vaccineName.toString() : otherVaccineName; } else { vaccine = I18nProperties.getString(Strings.labelNoVaccineName); } - return (date.isEmpty() ? "" : date + " - ") + vaccine + " (" + DataHelper.getShortUuid(getUuid()) +")"; + return (date.isEmpty() ? "" : date + " - ") + vaccine + " (" + DataHelper.getShortUuid(getUuid()) + ")"; } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/visit/ExternalVisitDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/visit/ExternalVisitDto.java index 6a5709294d7..b4f801575bf 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/visit/ExternalVisitDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/visit/ExternalVisitDto.java @@ -1,6 +1,6 @@ package de.symeda.sormas.api.visit; -import static de.symeda.sormas.api.HasUuid.UUID_REGEX; +import static de.symeda.sormas.api.uuid.HasUuid.UUID_REGEX; import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_DEFAULT; import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_UUID_MAX; import static de.symeda.sormas.api.utils.FieldConstraints.CHARACTER_LIMIT_UUID_MIN; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitExportDto.java index 3043e928794..a1cce34a4cf 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitExportDto.java @@ -1,6 +1,20 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.visit; -import java.io.Serializable; import java.util.Date; import java.util.Set; @@ -19,15 +33,16 @@ import de.symeda.sormas.api.utils.Order; import de.symeda.sormas.api.utils.PersonalData; import de.symeda.sormas.api.utils.SensitiveData; +import de.symeda.sormas.api.uuid.AbstractUuidDto; -public class VisitExportDto implements Serializable { +public class VisitExportDto extends AbstractUuidDto { private static final long serialVersionUID = 6432390815000039126L; public static final String I18N_PREFIX = "VisitExport"; private Long id; - private String uuid; + private Long personId; private Long symptomsId; @PersonalData @@ -74,9 +89,8 @@ public VisitExportDto( VisitOrigin origin, String personUuid, boolean isInJurisdiction) { - + super(uuid); this.id = id; - this.uuid = uuid; this.personId = personId; this.firstName = firstName; this.lastName = lastName; @@ -97,10 +111,6 @@ public Long getId() { return id; } - public String getUuid() { - return uuid; - } - public Long getSymptomsId() { return symptomsId; } @@ -217,10 +227,6 @@ public void setId(Long id) { this.id = id; } - public void setUuid(String uuid) { - this.uuid = uuid; - } - public void setSymptomsId(Long symptomsId) { this.symptomsId = symptomsId; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitSummaryExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitSummaryExportDto.java index f16d5ce25b5..942f5295a2a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitSummaryExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/visit/VisitSummaryExportDto.java @@ -1,11 +1,29 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package de.symeda.sormas.api.visit; -import java.io.Serializable; +import de.symeda.sormas.api.uuid.AbstractUuidDto; + import java.util.ArrayList; import java.util.Date; import java.util.List; -public class VisitSummaryExportDto implements Serializable { +public class VisitSummaryExportDto extends AbstractUuidDto + +{ private static final long serialVersionUID = 7066530434713936967L; @@ -13,7 +31,7 @@ public class VisitSummaryExportDto implements Serializable { private Long contactId; private Integer maximumFollowUpVisits; - private String uuid; + private String firstName; private String lastName; private Date lastContactDate; @@ -21,7 +39,7 @@ public class VisitSummaryExportDto implements Serializable { private List visitDetails = new ArrayList<>(); public VisitSummaryExportDto(String uuid, Long contactId, String firstName, String lastName, Date lastContactDate, Date followUpUntil) { - this.uuid = uuid; + super(uuid); this.contactId = contactId; this.firstName = firstName; this.lastName = lastName; @@ -49,14 +67,6 @@ public void setMaximumFollowUpVisits(Integer maximumFollowUpVisits) { this.maximumFollowUpVisits = maximumFollowUpVisits; } - public String getUuid() { - return uuid; - } - - public void setUuid(String uuid) { - this.uuid = uuid; - } - public String getFirstName() { return firstName; } diff --git a/sormas-api/src/test/java/de/symeda/sormas/api/ArchitectureTest.java b/sormas-api/src/test/java/de/symeda/sormas/api/ArchitectureTest.java index 1dc14391476..d32ee664138 100644 --- a/sormas-api/src/test/java/de/symeda/sormas/api/ArchitectureTest.java +++ b/sormas-api/src/test/java/de/symeda/sormas/api/ArchitectureTest.java @@ -1,36 +1,34 @@ package de.symeda.sormas.api; -import com.tngtech.archunit.core.domain.JavaClass; -import com.tngtech.archunit.core.domain.JavaClasses; -import com.tngtech.archunit.core.domain.JavaMethod; -import com.tngtech.archunit.lang.ArchCondition; -import com.tngtech.archunit.lang.ConditionEvents; -import com.tngtech.archunit.lang.SimpleConditionEvent; -import org.junit.Test; -import org.junit.runner.RunWith; - -import com.tngtech.archunit.junit.AnalyzeClasses; -import com.tngtech.archunit.junit.ArchTest; -import com.tngtech.archunit.junit.ArchUnitRunner; -import com.tngtech.archunit.lang.ArchRule; -import com.tngtech.archunit.lang.syntax.ArchRuleDefinition; - -import javax.ejb.Remote; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - +import static com.tngtech.archunit.core.domain.properties.HasName.Predicates.name; import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes; import static de.symeda.sormas.api.audit.Constants.createPrefix; import static de.symeda.sormas.api.audit.Constants.deletePrefix; import static de.symeda.sormas.api.audit.Constants.executePrefix; import static de.symeda.sormas.api.audit.Constants.readPrefix; import static de.symeda.sormas.api.audit.Constants.updatePrefix; -import static java.lang.reflect.Modifier.PUBLIC; import static java.util.stream.Collectors.toList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.ejb.Remote; + +import de.symeda.sormas.api.uuid.HasUuid; +import org.junit.runner.RunWith; + +import com.tngtech.archunit.core.domain.JavaClass; +import com.tngtech.archunit.core.domain.JavaMethod; +import com.tngtech.archunit.junit.AnalyzeClasses; +import com.tngtech.archunit.junit.ArchTest; +import com.tngtech.archunit.junit.ArchUnitRunner; +import com.tngtech.archunit.lang.ArchCondition; +import com.tngtech.archunit.lang.ArchRule; +import com.tngtech.archunit.lang.ConditionEvents; +import com.tngtech.archunit.lang.SimpleConditionEvent; +import com.tngtech.archunit.lang.syntax.ArchRuleDefinition; + @RunWith(ArchUnitRunner.class) @AnalyzeClasses(packages = "de.symeda.sormas.api") public class ArchitectureTest { @@ -40,6 +38,7 @@ public class ArchitectureTest { ArchRuleDefinition.theClass(FacadeProvider.class).should().onlyBeAccessed().byClassesThat().belongToAnyOf(FacadeProvider.class); private static final Set allowedPrefix = new HashSet() { + { addAll(createPrefix); addAll(readPrefix); @@ -80,4 +79,14 @@ public void check(JavaClass javaClass, ConditionEvents events) { } }); + @ArchTest + public static final ArchRule testDtosWithUuidFieldMustImplementHasUuid = classes().that() + .resideInAPackage("de.symeda.sormas.api.(*)..") + .and() + .haveSimpleNameEndingWith("Dto") + .and() + .containAnyFieldsThat(name("uuid")) + .should() + .implement(HasUuid.class); + } diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/caze/ResponsibleJurisdictionDto.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/caze/ResponsibleJurisdictionDto.java index 9082826b407..f3b3f2e9dcf 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/caze/ResponsibleJurisdictionDto.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/caze/ResponsibleJurisdictionDto.java @@ -1,6 +1,6 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2021 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -17,7 +17,7 @@ import java.io.Serializable; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; public class ResponsibleJurisdictionDto implements Serializable { diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AbstractDomainObject.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AbstractDomainObject.java index 68921095931..be413405913 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AbstractDomainObject.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AbstractDomainObject.java @@ -1,6 +1,6 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -35,7 +35,7 @@ import androidx.databinding.BaseObservable; import androidx.recyclerview.widget.DiffUtil; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.i18n.I18nProperties; @MappedSuperclass diff --git a/sormas-backend/src/main/java/de/symeda/auditlog/api/AuditListener.java b/sormas-backend/src/main/java/de/symeda/auditlog/api/AuditListener.java index ae3618a7521..27af0baf8dc 100644 --- a/sormas-backend/src/main/java/de/symeda/auditlog/api/AuditListener.java +++ b/sormas-backend/src/main/java/de/symeda/auditlog/api/AuditListener.java @@ -17,7 +17,7 @@ *******************************************************************************/ package de.symeda.auditlog.api; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; /** * Interface to build the entity listener for JPA entities. diff --git a/sormas-backend/src/main/java/de/symeda/auditlog/api/Auditor.java b/sormas-backend/src/main/java/de/symeda/auditlog/api/Auditor.java index 21d3f0f78a9..028486ee6d1 100644 --- a/sormas-backend/src/main/java/de/symeda/auditlog/api/Auditor.java +++ b/sormas-backend/src/main/java/de/symeda/auditlog/api/Auditor.java @@ -40,7 +40,7 @@ import de.symeda.auditlog.api.value.format.override.DateFormatOverrideDetector; import de.symeda.auditlog.api.value.format.override.OverrideDetector; import de.symeda.auditlog.api.value.reflection.EntityInspector; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; /** * Class for the inspection of entity states. diff --git a/sormas-backend/src/main/java/de/symeda/auditlog/api/EntityId.java b/sormas-backend/src/main/java/de/symeda/auditlog/api/EntityId.java index 8f8f2ac7dcd..421df6e604c 100644 --- a/sormas-backend/src/main/java/de/symeda/auditlog/api/EntityId.java +++ b/sormas-backend/src/main/java/de/symeda/auditlog/api/EntityId.java @@ -17,7 +17,7 @@ *******************************************************************************/ package de.symeda.auditlog.api; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; /** * Class for the unique differentiation of different entities, both in terms of the entity type as well as for the differentiation diff --git a/sormas-backend/src/main/java/de/symeda/auditlog/api/value/format/DefaultCollectionFormatter.java b/sormas-backend/src/main/java/de/symeda/auditlog/api/value/format/DefaultCollectionFormatter.java index 1711b87ac45..27f5a0b52dc 100644 --- a/sormas-backend/src/main/java/de/symeda/auditlog/api/value/format/DefaultCollectionFormatter.java +++ b/sormas-backend/src/main/java/de/symeda/auditlog/api/value/format/DefaultCollectionFormatter.java @@ -20,7 +20,7 @@ import java.io.Serializable; import java.util.Comparator; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; /** * Supports the following elements in Collections (relevant for a reliable sorting): diff --git a/sormas-backend/src/main/java/de/symeda/auditlog/api/value/format/DefaultValueFormatter.java b/sormas-backend/src/main/java/de/symeda/auditlog/api/value/format/DefaultValueFormatter.java index a65b6081af9..eda7167ee38 100644 --- a/sormas-backend/src/main/java/de/symeda/auditlog/api/value/format/DefaultValueFormatter.java +++ b/sormas-backend/src/main/java/de/symeda/auditlog/api/value/format/DefaultValueFormatter.java @@ -23,7 +23,7 @@ import de.symeda.auditlog.api.value.DefaultValueContainer; import de.symeda.auditlog.api.value.SimpleValueContainer; import de.symeda.auditlog.api.value.ValueContainer; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; /** * Default formatter for {@link AuditedAttribute} that supports the following types: diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/audit/AuditLoggerInterceptor.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/audit/AuditLoggerInterceptor.java index 53f66397ec3..892197ef9ee 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/audit/AuditLoggerInterceptor.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/audit/AuditLoggerInterceptor.java @@ -19,7 +19,7 @@ import javax.interceptor.AroundInvoke; import javax.interceptor.InvocationContext; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.backend.auditlog.AuditContextProducer; import de.symeda.sormas.backend.auditlog.AuditLogServiceBean; import de.symeda.sormas.backend.common.ConfigFacadeEjb; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/auditlog/AuditListenerCdiWrapper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/auditlog/AuditListenerCdiWrapper.java index f2df90031de..35e36a5f229 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/auditlog/AuditListenerCdiWrapper.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/auditlog/AuditListenerCdiWrapper.java @@ -29,7 +29,7 @@ import javax.persistence.PreUpdate; import de.symeda.auditlog.api.AuditListener; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; public class AuditListenerCdiWrapper implements Serializable, AuditListener { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/auditlog/DefaultAuditListener.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/auditlog/DefaultAuditListener.java index 0787260f68b..20e30fcbd25 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/auditlog/DefaultAuditListener.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/auditlog/DefaultAuditListener.java @@ -36,7 +36,7 @@ import de.symeda.auditlog.api.EntityId; import de.symeda.auditlog.api.TransactionId; import de.symeda.auditlog.api.UserId; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; /** * Entity life cycle listener that can detect changes on entities. diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDomainObject.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDomainObject.java index cc8648e1170..faf2427cfb9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDomainObject.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDomainObject.java @@ -46,7 +46,7 @@ import com.vladmihalcea.hibernate.type.json.JsonBinaryType; import com.vladmihalcea.hibernate.type.json.JsonType; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.user.CurrentUserService; import de.symeda.sormas.backend.user.User; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoAttributes.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoAttributes.java index 264a383d77c..fc0f9144513 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoAttributes.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AdoAttributes.java @@ -20,7 +20,7 @@ import java.io.Serializable; import java.util.Date; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; public class AdoAttributes implements Serializable, HasUuid { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CriteriaBuilderHelper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CriteriaBuilderHelper.java index adf9cded386..13348629c60 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CriteriaBuilderHelper.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CriteriaBuilderHelper.java @@ -19,7 +19,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections4.ListUtils; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.ExtendedPostgreSQL94Dialect; import de.symeda.sormas.backend.util.ModelConstants; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/docgeneration/DocumentTemplateFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/docgeneration/DocumentTemplateFacadeEjb.java index c5651536657..f0cde504a6a 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/docgeneration/DocumentTemplateFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/docgeneration/DocumentTemplateFacadeEjb.java @@ -41,7 +41,7 @@ import org.apache.commons.lang3.StringUtils; import de.symeda.sormas.api.EntityDtoAccessHelper; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.ReferenceDto; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.contact.ContactReferenceDto; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java index 6735ed92e61..8b0bdf87c63 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java @@ -343,8 +343,7 @@ public boolean isEnrolledInExternalJournal(String uuid) { public JournalPersonDto getPersonForJournal(PersonDto detailedPerson) { //only specific attributes of the person shall be returned: if (detailedPerson != null) { - JournalPersonDto exportPerson = new JournalPersonDto(); - exportPerson.setUuid(detailedPerson.getUuid()); + JournalPersonDto exportPerson = new JournalPersonDto(detailedPerson.getUuid()); exportPerson.setPseudonymized(detailedPerson.isPseudonymized()); exportPerson.setFirstName(detailedPerson.getFirstName()); exportPerson.setLastName(detailedPerson.getLastName()); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonService.java index 9c7b1c1f97f..a67f1282e00 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonService.java @@ -1,20 +1,17 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ + */ package de.symeda.sormas.backend.person; import static de.symeda.sormas.backend.ExtendedPostgreSQL94Dialect.SIMILARITY_OPERATOR; @@ -685,8 +682,7 @@ private SimilarPersonDto toSimilarPersonDto(Person entity) { approximateAgeType = pair.getElement1(); } - SimilarPersonDto similarPersonDto = new SimilarPersonDto(); - similarPersonDto.setUuid(entity.getUuid()); + SimilarPersonDto similarPersonDto = new SimilarPersonDto(entity.getUuid()); similarPersonDto.setFirstName(entity.getFirstName()); similarPersonDto.setLastName(entity.getLastName()); similarPersonDto.setNickname(entity.getNickname()); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/ValidationHelper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/ValidationHelper.java index ba3f205fdd6..926b21281fa 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/ValidationHelper.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/ValidationHelper.java @@ -19,7 +19,7 @@ import java.util.List; import java.util.function.Supplier; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.externalmessage.ExternalMessageDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.Validations; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasShareable.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasShareable.java index 39e58863b19..d8945648944 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasShareable.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasShareable.java @@ -17,7 +17,7 @@ import java.util.List; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfo; import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; import de.symeda.sormas.backend.user.User; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/PatchHelper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/PatchHelper.java index 99310dcc95b..9a3459e6039 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/PatchHelper.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/PatchHelper.java @@ -18,7 +18,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.symeda.sormas.api.EntityDto; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.utils.Experimental; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java index 8ed9ee95832..40899d5fc73 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/vaccination/VaccinationFacadeEjb.java @@ -279,8 +279,7 @@ public List getEntriesList( } private VaccinationListEntryDto toVaccinationListEntryDto(Vaccination vaccination, boolean relevant, String message) { - VaccinationListEntryDto dto = new VaccinationListEntryDto(); - dto.setUuid(vaccination.getUuid()); + VaccinationListEntryDto dto = new VaccinationListEntryDto(vaccination.getUuid()); dto.setDisease(vaccination.getImmunization().getDisease()); dto.setVaccinationDate(vaccination.getVaccinationDate()); dto.setVaccineName(vaccination.getVaccineName()); diff --git a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/AnonymizedEntity.java b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/AnonymizedEntity.java index 41fd0a521be..6d5744b697b 100644 --- a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/AnonymizedEntity.java +++ b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/AnonymizedEntity.java @@ -19,7 +19,7 @@ import de.symeda.auditlog.api.Audited; import de.symeda.auditlog.api.AuditedAttribute; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; @Audited public class AnonymizedEntity implements HasUuid { diff --git a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/BaseEntity.java b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/BaseEntity.java index 0963cae7b42..8a9827babc5 100644 --- a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/BaseEntity.java +++ b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/BaseEntity.java @@ -19,7 +19,7 @@ import javax.persistence.Version; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; public class BaseEntity implements HasUuid { diff --git a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/CollectionEntity.java b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/CollectionEntity.java index 58b913936ed..33f69bcee4e 100644 --- a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/CollectionEntity.java +++ b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/CollectionEntity.java @@ -25,7 +25,7 @@ import de.symeda.auditlog.api.Audited; import de.symeda.auditlog.api.AuditedIgnore; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; @Audited public class CollectionEntity implements HasUuid { diff --git a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/Entity.java b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/Entity.java index f5b3206f957..108f49fae22 100644 --- a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/Entity.java +++ b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/Entity.java @@ -19,7 +19,7 @@ import de.symeda.auditlog.api.Audited; import de.symeda.auditlog.api.AuditedIgnore; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; @Audited public class Entity implements HasUuid { diff --git a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithEmbedables.java b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithEmbedables.java index 0c058874d0a..1b0167898a9 100644 --- a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithEmbedables.java +++ b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithEmbedables.java @@ -22,7 +22,7 @@ import de.symeda.auditlog.api.Audited; import de.symeda.auditlog.api.AuditedIgnore; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; @Audited public class EntityWithEmbedables implements HasUuid { diff --git a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithHelperAttributes.java b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithHelperAttributes.java index 51ee04b3532..8c91bb791aa 100644 --- a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithHelperAttributes.java +++ b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithHelperAttributes.java @@ -22,7 +22,7 @@ import de.symeda.auditlog.api.Audited; import de.symeda.auditlog.api.AuditedIgnore; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; @Audited public class EntityWithHelperAttributes implements HasUuid { diff --git a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithIgnoredMethods.java b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithIgnoredMethods.java index 67d3e21aa40..fdea179a4d4 100644 --- a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithIgnoredMethods.java +++ b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/EntityWithIgnoredMethods.java @@ -26,7 +26,7 @@ import de.symeda.auditlog.api.Audited; import de.symeda.auditlog.api.AuditedAttribute; import de.symeda.auditlog.api.AuditedIgnore; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; @Audited public class EntityWithIgnoredMethods implements HasUuid { diff --git a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/OverridingFormatterEntity.java b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/OverridingFormatterEntity.java index 807cabbba59..c932c9c1862 100644 --- a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/OverridingFormatterEntity.java +++ b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/OverridingFormatterEntity.java @@ -24,7 +24,7 @@ import de.symeda.auditlog.api.Audited; import de.symeda.auditlog.api.AuditedIgnore; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; @Audited public class OverridingFormatterEntity implements HasUuid { diff --git a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/SimpleBooleanFlagEntity.java b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/SimpleBooleanFlagEntity.java index 1dcd10fd4cf..b04c977ed4d 100644 --- a/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/SimpleBooleanFlagEntity.java +++ b/sormas-backend/src/test/java/de/symeda/auditlog/api/sample/SimpleBooleanFlagEntity.java @@ -19,7 +19,7 @@ import de.symeda.auditlog.api.Audited; import de.symeda.auditlog.api.AuditedAttribute; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; @Audited public class SimpleBooleanFlagEntity implements HasUuid { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/InfrastructureController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/InfrastructureController.java index b076a406f7c..f1ac871e209 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/InfrastructureController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/InfrastructureController.java @@ -31,7 +31,7 @@ import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.HasUuid; +import de.symeda.sormas.api.uuid.HasUuid; import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityIndexDto; import de.symeda.sormas.api.infrastructure.facility.FacilityType; diff --git a/sormas-ui/src/test/java/de/symeda/sormas/ui/externalmessage/labmessage/AbstractLabMessageProcessingFlowTest.java b/sormas-ui/src/test/java/de/symeda/sormas/ui/externalmessage/labmessage/AbstractLabMessageProcessingFlowTest.java index b5523ffe248..e0b528da91b 100644 --- a/sormas-ui/src/test/java/de/symeda/sormas/ui/externalmessage/labmessage/AbstractLabMessageProcessingFlowTest.java +++ b/sormas-ui/src/test/java/de/symeda/sormas/ui/externalmessage/labmessage/AbstractLabMessageProcessingFlowTest.java @@ -30,9 +30,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import de.symeda.sormas.ui.externalmessage.processing.AbstractProcessingFlow.HandlerCallback; -import de.symeda.sormas.ui.externalmessage.processing.flow.ProcessingResult; -import de.symeda.sormas.ui.externalmessage.processing.flow.ProcessingResultStatus; import java.util.Date; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -85,10 +82,13 @@ import de.symeda.sormas.ui.externalmessage.labmessage.processing.AbstractRelatedLabMessageHandler; import de.symeda.sormas.ui.externalmessage.labmessage.processing.AbstractRelatedLabMessageHandler.HandlerResult; import de.symeda.sormas.ui.externalmessage.labmessage.processing.AbstractRelatedLabMessageHandler.HandlerResultStatus; -import de.symeda.sormas.ui.externalmessage.processing.PickOrCreateEntryResult; import de.symeda.sormas.ui.externalmessage.labmessage.processing.PickOrCreateEventResult; import de.symeda.sormas.ui.externalmessage.labmessage.processing.PickOrCreateSampleResult; import de.symeda.sormas.ui.externalmessage.labmessage.processing.SampleAndPathogenTests; +import de.symeda.sormas.ui.externalmessage.processing.AbstractProcessingFlow.HandlerCallback; +import de.symeda.sormas.ui.externalmessage.processing.PickOrCreateEntryResult; +import de.symeda.sormas.ui.externalmessage.processing.flow.ProcessingResult; +import de.symeda.sormas.ui.externalmessage.processing.flow.ProcessingResultStatus; public class AbstractLabMessageProcessingFlowTest extends AbstractBeanTest { @@ -999,8 +999,7 @@ public void testPickExistingEventAndCreateEventParticipant() throws ExecutionExc EventDto event = creator.createEvent(user.toReference(), Disease.CORONAVIRUS); PickOrCreateEventResult pickOrCreateEventResult = new PickOrCreateEventResult(); - EventIndexDto selectedEvent = new EventIndexDto(); - selectedEvent.setUuid(event.getUuid()); + EventIndexDto selectedEvent = new EventIndexDto(event.getUuid()); pickOrCreateEventResult.setEvent(selectedEvent); doAnswer((invocation) -> { getCallbackParam(invocation).done(pickOrCreateEventResult); @@ -1043,8 +1042,7 @@ public void testPickExistingEventWithExistingEventParticipantAndCreateSample() t EventDto event = creator.createEvent(user.toReference(), Disease.CORONAVIRUS); PickOrCreateEventResult pickOrCreateEventResult = new PickOrCreateEventResult(); - EventIndexDto selectedEvent = new EventIndexDto(); - selectedEvent.setUuid(event.getUuid()); + EventIndexDto selectedEvent = new EventIndexDto(event.getUuid()); pickOrCreateEventResult.setEvent(selectedEvent); doAnswer((invocation) -> { getCallbackParam(invocation).done(pickOrCreateEventResult); @@ -1081,8 +1079,7 @@ public void testPickExistingEventWithExistingEventParticipantAndCancel() throws doAnswer((invocation) -> { // pick event PickOrCreateEventResult pickOrCreateEventResult = new PickOrCreateEventResult(); - EventIndexDto selectedEvent = new EventIndexDto(); - selectedEvent.setUuid(event.getUuid()); + EventIndexDto selectedEvent = new EventIndexDto(event.getUuid()); pickOrCreateEventResult.setEvent(selectedEvent); getCallbackParam(invocation).done(pickOrCreateEventResult); @@ -1121,8 +1118,7 @@ public void testPickExistingEventWithExistingEventParticipantAndCancelThenCreate doAnswer((invocation) -> { // pick event for the first time PickOrCreateEventResult pickOrCreateEventResult = new PickOrCreateEventResult(); - EventIndexDto selectedEvent = new EventIndexDto(); - selectedEvent.setUuid(event.getUuid()); + EventIndexDto selectedEvent = new EventIndexDto(event.getUuid()); pickOrCreateEventResult.setEvent(selectedEvent); getCallbackParam(invocation).done(pickOrCreateEventResult); @@ -1166,8 +1162,7 @@ public void testPickExistingEventAndPickExistingEventParticipantAndPickExistingS EventDto event = creator.createEvent(user.toReference(), Disease.CORONAVIRUS); PickOrCreateEventResult pickOrCreateEventResult = new PickOrCreateEventResult(); - EventIndexDto selectedEvent = new EventIndexDto(); - selectedEvent.setUuid(event.getUuid()); + EventIndexDto selectedEvent = new EventIndexDto(event.getUuid()); pickOrCreateEventResult.setEvent(selectedEvent); doAnswer((invocation) -> { getCallbackParam(invocation).done(pickOrCreateEventResult); From d3e69d55cd97f569386aad59e9e4f71fe12f19ef Mon Sep 17 00:00:00 2001 From: sormas-vitagroup Date: Fri, 16 Sep 2022 12:53:42 +0000 Subject: [PATCH 38/45] [GitHub Actions] Update external visits API spec files --- openapi/external_visits_API.json | 3 +++ openapi/external_visits_API.yaml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/openapi/external_visits_API.json b/openapi/external_visits_API.json index 10fba393c51..ae271219dbb 100644 --- a/openapi/external_visits_API.json +++ b/openapi/external_visits_API.json @@ -210,6 +210,9 @@ "type" : "object", "properties" : { "uuid" : { + "maxLength" : 36, + "minLength" : 20, + "pattern" : "^[0-9a-zA-Z-]*$", "type" : "string" }, "pseudonymized" : { diff --git a/openapi/external_visits_API.yaml b/openapi/external_visits_API.yaml index f387eaf4b57..47261f4def0 100644 --- a/openapi/external_visits_API.yaml +++ b/openapi/external_visits_API.yaml @@ -355,6 +355,9 @@ components: type: object properties: uuid: + maxLength: 36 + minLength: 20 + pattern: "^[0-9a-zA-Z-]*$" type: string pseudonymized: type: boolean From 30a08ec379734d840b3d93f008cfcf95ac530c50 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Mon, 19 Sep 2022 09:39:37 +0300 Subject: [PATCH 39/45] #9946 S2S_ make comment fields mandatory --- .../symeda/sormas/api/i18n/Descriptions.java | 1 + .../symeda/sormas/api/i18n/Validations.java | 1 + .../SormasToSormasOptionsDto.java | 2 ++ .../SormasToSormasOriginInfoDto.java | 2 ++ .../SormasToSormasExternalMessageFacade.java | 3 +- .../main/resources/descriptions.properties | 3 ++ .../src/main/resources/validations.properties | 1 + .../entities/ReceivedEntitiesProcessor.java | 32 ++++++++++++------- .../caze/SormasToSormasCaseFacadeEjb.java | 3 +- .../event/SormasToSormasEventFacadeEjb.java | 3 +- ...ormasToSormasExternalMessageFacadeEjb.java | 3 +- .../share/ShareDataBuilderHelper.java | 4 +-- .../share/outgoing/ShareInfoHelper.java | 4 ++- .../SormasToSormasOptionsForm.java | 1 + 14 files changed, 45 insertions(+), 18 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Descriptions.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Descriptions.java index 36b49504354..3269c5c10d7 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Descriptions.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Descriptions.java @@ -133,6 +133,7 @@ public interface Descriptions { String Person_sex = "Person.sex"; String Sample_associatedLabMessages = "Sample.associatedLabMessages"; String Sample_sampleDateTime = "Sample.sampleDateTime"; + String SormasToSormasOptions_comment = "SormasToSormasOptions.comment"; String Symptoms_alteredConsciousness = "Symptoms.alteredConsciousness"; String Symptoms_bloodInStool = "Symptoms.bloodInStool"; String Symptoms_confusedDisoriented = "Symptoms.confusedDisoriented"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java index 606556d3467..c2456bf46be 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Validations.java @@ -178,6 +178,7 @@ public interface Validations { String sormasToSormasAcceptContactHasNoCase = "sormasToSormasAcceptContactHasNoCase"; String sormasToSormasAcceptContactWithoutCaseShared = "sormasToSormasAcceptContactWithoutCaseShared"; String sormasToSormasCaseExists = "sormasToSormasCaseExists"; + String sormasToSormasCommentMissing = "sormasToSormasCommentMissing"; String sormasToSormasCommunity = "sormasToSormasCommunity"; String sormasToSormasContactCaseNotExists = "sormasToSormasContactCaseNotExists"; String sormasToSormasContactCaseNotShared = "sormasToSormasContactCaseNotShared"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasOptionsDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasOptionsDto.java index 57e2a8d45f3..c95744d5fb2 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasOptionsDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasOptionsDto.java @@ -19,6 +19,7 @@ import java.io.Serializable; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Size; import de.symeda.sormas.api.i18n.Validations; @@ -46,6 +47,7 @@ public class SormasToSormasOptionsDto implements Serializable { private boolean pseudonymizeData; + @NotEmpty(message = Validations.requiredField) @Size(max = CHARACTER_LIMIT_BIG, message = Validations.textTooLong) private String comment; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasOriginInfoDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasOriginInfoDto.java index eaa3b79c5e6..5ec6e171e0c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasOriginInfoDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasOriginInfoDto.java @@ -15,6 +15,7 @@ package de.symeda.sormas.api.sormastosormas; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Size; import de.symeda.sormas.api.EntityDto; @@ -38,6 +39,7 @@ public class SormasToSormasOriginInfoDto extends EntityDto { private boolean withSamples; private boolean withEventParticipants; private boolean withImmunizations; + @NotEmpty(message = Validations.requiredField) @Size(max = FieldConstraints.CHARACTER_LIMIT_BIG, message = Validations.textTooLong) private String comment; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/externalmessage/SormasToSormasExternalMessageFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/externalmessage/SormasToSormasExternalMessageFacade.java index df44a02bdc8..3aee6c7663a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/externalmessage/SormasToSormasExternalMessageFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/externalmessage/SormasToSormasExternalMessageFacade.java @@ -18,6 +18,7 @@ import java.util.List; import javax.ejb.Remote; +import javax.validation.Valid; import de.symeda.sormas.api.sormastosormas.SormasToSormasEncryptedDataDto; import de.symeda.sormas.api.sormastosormas.SormasToSormasException; @@ -27,7 +28,7 @@ @Remote public interface SormasToSormasExternalMessageFacade { - void sendExternalMessages(List uuids, SormasToSormasOptionsDto options) throws SormasToSormasException; + void sendExternalMessages(List uuids, @Valid SormasToSormasOptionsDto options) throws SormasToSormasException; void saveExternalMessages(SormasToSormasEncryptedDataDto labMessages) throws SormasToSormasValidationException, SormasToSormasException; } diff --git a/sormas-api/src/main/resources/descriptions.properties b/sormas-api/src/main/resources/descriptions.properties index 7702ad44fec..8c97a6d476c 100644 --- a/sormas-api/src/main/resources/descriptions.properties +++ b/sormas-api/src/main/resources/descriptions.properties @@ -221,3 +221,6 @@ userRoleNotifications=Select the notifications that this user role will receive UserRole.hasOptionalHealthFacility=Allows to associate a user to a health facility even though the user is not on health facility jurisdiction level. UserRole.hasAssociatedDistrictUser=Allows to associate a user to another user on district jurisdiction level which will be used for weekly reports. UserRole.portHealthUser=User is a port health user, so created cases and other data will be associated to a point of entry. + +# SormasToSormasOptions +SormasToSormasOptions.comment = All comments entered must comply with GDPR rules as described during connection \ No newline at end of file diff --git a/sormas-api/src/main/resources/validations.properties b/sormas-api/src/main/resources/validations.properties index a97c4cb8c9c..f2bd8b229b2 100644 --- a/sormas-api/src/main/resources/validations.properties +++ b/sormas-api/src/main/resources/validations.properties @@ -189,6 +189,7 @@ sormasToSormasContactCaseNotExists=The linked case does not exist sormasToSormasShareInfoMissing = Sender information is missing sormasToSormasOrganizationIdMissing = Sender organization is is missing sormasToSormasSenderNameMissing = Sender name is missing +sormasToSormasCommentMissing = Comment is missing sormasToSormasSampleExists = This sample already exists sormasToSormasImmunizationExists = This immunization already exists sormasToSormasReturnEntityNotExists = Object does not exist diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/ReceivedEntitiesProcessor.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/ReceivedEntitiesProcessor.java index f19b81fae0c..b5a06165bb1 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/ReceivedEntitiesProcessor.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/ReceivedEntitiesProcessor.java @@ -81,7 +81,8 @@ public List processReceivedData(SormasToSormasDto receivedData List cases = receivedData.getCases(); if (CollectionUtils.isNotEmpty(cases)) { cases.forEach(c -> { - ValidationErrors caseErrors = caseProcessor.processReceivedData(c, existingEntities.getCases().get(c.getEntity().getUuid()), originInfo); + ValidationErrors caseErrors = + caseProcessor.processReceivedData(c, existingEntities.getCases().get(c.getEntity().getUuid()), originInfo); if (caseErrors.hasError()) { validationErrors.add(new ValidationErrors(ValidationHelper.buildCaseValidationGroupName(c.getEntity()), caseErrors)); @@ -92,7 +93,8 @@ public List processReceivedData(SormasToSormasDto receivedData List contacts = receivedData.getContacts(); if (CollectionUtils.isNotEmpty(contacts)) { contacts.forEach(c -> { - ValidationErrors contactErrors = contactProcessor.processReceivedData(c, existingEntities.getContacts().get(c.getEntity().getUuid()), originInfo); + ValidationErrors contactErrors = + contactProcessor.processReceivedData(c, existingEntities.getContacts().get(c.getEntity().getUuid()), originInfo); if (contactErrors.hasError()) { validationErrors.add(new ValidationErrors(ValidationHelper.buildContactValidationGroupName(c.getEntity()), contactErrors)); @@ -103,7 +105,8 @@ public List processReceivedData(SormasToSormasDto receivedData List events = receivedData.getEvents(); if (CollectionUtils.isNotEmpty(events)) { events.forEach(e -> { - ValidationErrors eventErrors = eventProcessor.processReceivedData(e, existingEntities.getEvents().get(e.getEntity().getUuid()), originInfo); + ValidationErrors eventErrors = + eventProcessor.processReceivedData(e, existingEntities.getEvents().get(e.getEntity().getUuid()), originInfo); if (eventErrors.hasError()) { validationErrors.add(new ValidationErrors(ValidationHelper.buildEventValidationGroupName(e.getEntity()), eventErrors)); @@ -114,8 +117,8 @@ public List processReceivedData(SormasToSormasDto receivedData List eventParticipants = receivedData.getEventParticipants(); if (CollectionUtils.isNotEmpty(eventParticipants)) { eventParticipants.forEach(ep -> { - ValidationErrors eventParticipantErrors = - eventParticipantProcessor.processReceivedData(ep, existingEntities.getEventParticipants().get(ep.getEntity().getUuid()), originInfo); + ValidationErrors eventParticipantErrors = eventParticipantProcessor + .processReceivedData(ep, existingEntities.getEventParticipants().get(ep.getEntity().getUuid()), originInfo); if (eventParticipantErrors.hasError()) { validationErrors @@ -127,7 +130,8 @@ public List processReceivedData(SormasToSormasDto receivedData List samples = receivedData.getSamples(); if (CollectionUtils.isNotEmpty(samples)) { samples.forEach(s -> { - ValidationErrors contactErrors = sampleProcessor.processReceivedData(s, existingEntities.getSamples().get(s.getEntity().getUuid()), originInfo); + ValidationErrors contactErrors = + sampleProcessor.processReceivedData(s, existingEntities.getSamples().get(s.getEntity().getUuid()), originInfo); if (contactErrors.hasError()) { validationErrors.add(new ValidationErrors(ValidationHelper.buildSampleValidationGroupName(s.getEntity()), contactErrors)); @@ -199,21 +203,27 @@ public List processReceivedRequest(ShareRequestData shareData) private ValidationErrors validateOriginInfo(SormasToSormasOriginInfoDto originInfo, String validationGroupCaption) { if (originInfo == null) { return ValidationErrors - .create(new ValidationErrorGroup(validationGroupCaption), new ValidationErrorMessage(Validations.sormasToSormasShareInfoMissing)); + .create(new ValidationErrorGroup(validationGroupCaption), new ValidationErrorMessage(Validations.sormasToSormasShareInfoMissing)); } ValidationErrors validationErrors = new ValidationErrors(); if (originInfo.getOrganizationId() == null) { validationErrors.add( - new ValidationErrorGroup(Captions.CaseData_sormasToSormasOriginInfo), - new ValidationErrorMessage(Validations.sormasToSormasOrganizationIdMissing)); + new ValidationErrorGroup(Captions.CaseData_sormasToSormasOriginInfo), + new ValidationErrorMessage(Validations.sormasToSormasOrganizationIdMissing)); } if (DataHelper.isNullOrEmpty(originInfo.getSenderName())) { validationErrors.add( - new ValidationErrorGroup(Captions.CaseData_sormasToSormasOriginInfo), - new ValidationErrorMessage(Validations.sormasToSormasSenderNameMissing)); + new ValidationErrorGroup(Captions.CaseData_sormasToSormasOriginInfo), + new ValidationErrorMessage(Validations.sormasToSormasSenderNameMissing)); + } + + if (DataHelper.isNullOrEmpty(originInfo.getComment())) { + validationErrors.add( + new ValidationErrorGroup(Captions.CaseData_sormasToSormasOriginInfo), + new ValidationErrorMessage(Validations.sormasToSormasCommentMissing)); } return validationErrors; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java index 59f21502ed1..fdb67ee5228 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java @@ -31,6 +31,7 @@ import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.validation.Valid; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseReferenceDto; @@ -106,7 +107,7 @@ public SormasToSormasCaseFacadeEjb() { @Override @RightsAllowed(UserRight._SORMAS_TO_SORMAS_SHARE) - public void share(List entityUuids, SormasToSormasOptionsDto options) throws SormasToSormasException { + public void share(List entityUuids, @Valid SormasToSormasOptionsDto options) throws SormasToSormasException { if (!userService.hasRight(UserRight.CASE_EDIT) || (options.isWithAssociatedContacts() && !userService.hasRight(UserRight.CONTACT_EDIT)) || (options.isWithSamples() && !userService.hasRight(UserRight.SAMPLE_EDIT)) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java index 9b70ffd5b15..30f327970d4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java @@ -30,6 +30,7 @@ import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.validation.Valid; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.i18n.Captions; @@ -98,7 +99,7 @@ public SormasToSormasEventFacadeEjb() { @Override @RightsAllowed(UserRight._SORMAS_TO_SORMAS_SHARE) - public void share(List entityUuids, SormasToSormasOptionsDto options) throws SormasToSormasException { + public void share(List entityUuids, @Valid SormasToSormasOptionsDto options) throws SormasToSormasException { if (!userService.hasRight(UserRight.EVENT_EDIT) || (options.isWithEventParticipants() && !userService.hasRight(UserRight.EVENTPARTICIPANT_EDIT)) || (options.isWithSamples() && !userService.hasRight(UserRight.SAMPLE_EDIT)) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/externalmessage/SormasToSormasExternalMessageFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/externalmessage/SormasToSormasExternalMessageFacadeEjb.java index 429deb5b996..d8e800a9b02 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/externalmessage/SormasToSormasExternalMessageFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/externalmessage/SormasToSormasExternalMessageFacadeEjb.java @@ -28,6 +28,7 @@ import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.inject.Inject; +import javax.validation.Valid; import de.symeda.sormas.api.externalmessage.ExternalMessageDto; import de.symeda.sormas.api.externalmessage.ExternalMessageStatus; @@ -76,7 +77,7 @@ public class SormasToSormasExternalMessageFacadeEjb implements SormasToSormasExt @Override @RightsAllowed(UserRight._SORMAS_TO_SORMAS_SHARE) - public void sendExternalMessages(List uuids, SormasToSormasOptionsDto options) throws SormasToSormasException { + public void sendExternalMessages(List uuids, @Valid SormasToSormasOptionsDto options) throws SormasToSormasException { if (!userService.hasRight(UserRight.EXTERNAL_MESSAGE_PROCESS)) { throw new AccessDeniedException(I18nProperties.getString(Strings.errorForbidden)); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilderHelper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilderHelper.java index 0b7d8d7febe..802d3981b33 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilderHelper.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/ShareDataBuilderHelper.java @@ -20,6 +20,7 @@ import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.validation.Valid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,7 +37,6 @@ import de.symeda.sormas.api.utils.fieldaccess.checkers.PersonalDataFieldAccessChecker; import de.symeda.sormas.api.utils.fieldaccess.checkers.SensitiveDataFieldAccessChecker; import de.symeda.sormas.backend.common.ConfigFacadeEjb; -import de.symeda.sormas.backend.contact.Contact; import de.symeda.sormas.backend.contact.ContactFacadeEjb; import de.symeda.sormas.backend.location.LocationFacadeEjb; import de.symeda.sormas.backend.person.Person; @@ -93,7 +93,7 @@ public SormasToSormasOriginInfoDto createSormasToSormasOriginInfo(User user, Sha return createSormasToSormasOriginInfo(user, createOptionsFormShareRequestInfo(requestInfo)); } - public SormasToSormasOriginInfoDto createSormasToSormasOriginInfo(User user, SormasToSormasOptionsDto options) { + public SormasToSormasOriginInfoDto createSormasToSormasOriginInfo(User user, @Valid SormasToSormasOptionsDto options) { SormasToSormasOriginInfoDto sormasToSormasOriginInfo = new SormasToSormasOriginInfoDto(); sormasToSormasOriginInfo.setOrganizationId(configFacadeEjb.getS2SConfig().getId()); sormasToSormasOriginInfo.setSenderName(String.format("%s %s", user.getFirstName(), user.getLastName())); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/outgoing/ShareInfoHelper.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/outgoing/ShareInfoHelper.java index bdb0afdaf49..5f1aa9ab291 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/outgoing/ShareInfoHelper.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/share/outgoing/ShareInfoHelper.java @@ -23,6 +23,8 @@ import java.util.function.BiConsumer; import java.util.stream.Stream; +import javax.validation.Valid; + import de.symeda.sormas.api.sormastosormas.SormasToSormasOptionsDto; import de.symeda.sormas.api.sormastosormas.share.incoming.ShareRequestStatus; import de.symeda.sormas.api.utils.DataHelper; @@ -46,7 +48,7 @@ public static SormasToSormasShareInfo createShareInfo( String organizationId, T entity, BiConsumer setEntity, - SormasToSormasOptionsDto options) { + @Valid SormasToSormasOptionsDto options) { SormasToSormasShareInfo shareInfo = new SormasToSormasShareInfo(); shareInfo.setUuid(DataHelper.createUuid()); shareInfo.setOrganizationId(organizationId); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasOptionsForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasOptionsForm.java index 80199dd6965..481b5d2d0c3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasOptionsForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasOptionsForm.java @@ -404,6 +404,7 @@ protected void addFields() { }); TextArea comment = addField(SormasToSormasOptionsDto.COMMENT, TextArea.class); + comment.setRequired(true); comment.setRows(3); if (customFieldDependencies != null) { From 9a0687534ba462b5baa3cb25228e72293e93fb4f Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Mon, 19 Sep 2022 11:06:28 +0300 Subject: [PATCH 40/45] #9770 - Allow editing of aggregated reports for no longer existing age groups - fix Expired label --- .../layout/row_report_aggregate_agegroup_layout.xml | 10 ++++++---- .../main/res/layout/row_report_aggregate_layout.xml | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/sormas-app/app/src/main/res/layout/row_report_aggregate_agegroup_layout.xml b/sormas-app/app/src/main/res/layout/row_report_aggregate_agegroup_layout.xml index 5ba5d3c2d2f..4dca1daabb5 100644 --- a/sormas-app/app/src/main/res/layout/row_report_aggregate_agegroup_layout.xml +++ b/sormas-app/app/src/main/res/layout/row_report_aggregate_agegroup_layout.xml @@ -52,7 +52,7 @@ android:id="@+id/aggregateReport_newCases" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="0.2" + android:layout_weight="0.18" android:paddingStart="2dp" android:paddingEnd="2dp" android:layout_marginBottom="12dp" @@ -66,7 +66,7 @@ android:id="@+id/aggregateReport_labConfirmations" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="0.2" + android:layout_weight="0.18" android:paddingStart="2dp" android:paddingEnd="2dp" android:layout_marginBottom="12dp" @@ -80,7 +80,7 @@ android:id="@+id/aggregateReport_deaths" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="0.2" + android:layout_weight="0.18" android:paddingStart="2dp" android:layout_marginBottom="12dp" android:layout_marginTop="12dp" @@ -93,8 +93,10 @@ android:id="@+id/expired" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="0.1" + android:layout_weight="0.16" + android:paddingStart="6dp" android:textSize="12sp" + android:textStyle="bold" android:textColor="@color/listActivityRowTertiaryText" android:fontFamily="sans-serif-light" android:ellipsize="none" diff --git a/sormas-app/app/src/main/res/layout/row_report_aggregate_layout.xml b/sormas-app/app/src/main/res/layout/row_report_aggregate_layout.xml index 29ed834255b..34af1f6b408 100644 --- a/sormas-app/app/src/main/res/layout/row_report_aggregate_layout.xml +++ b/sormas-app/app/src/main/res/layout/row_report_aggregate_layout.xml @@ -51,7 +51,7 @@ android:id="@+id/aggregateReport_newCases" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="0.2" + android:layout_weight="0.18" android:paddingStart="2dp" android:paddingEnd="2dp" android:layout_marginBottom="12dp" @@ -65,7 +65,7 @@ android:id="@+id/aggregateReport_labConfirmations" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="0.2" + android:layout_weight="0.18" android:paddingStart="2dp" android:paddingEnd="2dp" android:layout_marginBottom="12dp" @@ -79,7 +79,7 @@ android:id="@+id/aggregateReport_deaths" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="0.2" + android:layout_weight="0.18" android:paddingStart="2dp" android:layout_marginBottom="12dp" android:layout_marginTop="12dp" @@ -92,7 +92,7 @@ android:id="@+id/placeholder" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_weight="0.1" + android:layout_weight="0.16" android:textSize="16sp" android:textColor="@color/listActivityRowTertiaryText" android:fontFamily="sans-serif-medium" From dda8280f646e7d1ab8c057800910a659384ee3b7 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Mon, 19 Sep 2022 11:55:16 +0300 Subject: [PATCH 41/45] #9946 S2S_ make comment fields mandatory - fix tests --- .../sormas/backend/sormastosormas/SormasToSormasTest.java | 3 ++- .../entities/SormasToSormasCaseFacadeEjbTest.java | 3 ++- .../entities/SormasToSormasContactFacadeEjbTest.java | 5 ++--- .../entities/SormasToSormasEventFacadeEjbTest.java | 3 ++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/SormasToSormasTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/SormasToSormasTest.java index fe121387c3b..df68a684746 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/SormasToSormasTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/SormasToSormasTest.java @@ -26,7 +26,6 @@ import java.util.Date; import java.util.function.Consumer; -import de.symeda.sormas.api.user.DefaultUserRole; import org.junit.After; import org.mockito.Mockito; @@ -62,6 +61,7 @@ import de.symeda.sormas.api.sormastosormas.share.incoming.ShareRequestDataType; import de.symeda.sormas.api.sormastosormas.share.incoming.ShareRequestStatus; import de.symeda.sormas.api.sormastosormas.share.outgoing.SormasToSormasShareInfoDto; +import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.DataHelper; @@ -130,6 +130,7 @@ protected SormasToSormasOriginInfoDto createSormasToSormasOriginInfo(String serv source.setOrganizationId(serverId); source.setSenderName("John doe"); source.setOwnershipHandedOver(ownershipHandedOver); + source.setComment("Test comment"); return source; } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasCaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasCaseFacadeEjbTest.java index 0b6fa8d5578..9b4a2539f10 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasCaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasCaseFacadeEjbTest.java @@ -34,7 +34,6 @@ import javax.ws.rs.core.Response; -import de.symeda.sormas.api.immunization.ImmunizationDto; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatchers; @@ -53,6 +52,7 @@ import de.symeda.sormas.api.exposure.AnimalContactType; import de.symeda.sormas.api.exposure.ExposureDto; import de.symeda.sormas.api.exposure.ExposureType; +import de.symeda.sormas.api.immunization.ImmunizationDto; import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; import de.symeda.sormas.api.infrastructure.facility.FacilityType; @@ -1133,6 +1133,7 @@ public void testReportingUserIsIncludedButUpdated() throws SormasToSormasExcepti SormasToSormasOptionsDto options = new SormasToSormasOptionsDto(); options.setWithImmunizations(true); + options.setComment("Test comment"); options.setOrganization(new SormasServerDescriptor(SECOND_SERVER_ID)); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasContactFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasContactFacadeEjbTest.java index bd1f9c5a7cd..07980f633d2 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasContactFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasContactFacadeEjbTest.java @@ -32,7 +32,6 @@ import javax.ws.rs.core.Response; -import de.symeda.sormas.api.user.UserDto; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatchers; @@ -70,6 +69,7 @@ import de.symeda.sormas.api.sormastosormas.share.outgoing.SormasToSormasShareInfoDto; import de.symeda.sormas.api.sormastosormas.validation.SormasToSormasValidationException; import de.symeda.sormas.api.user.DefaultUserRole; +import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.MockProducer; @@ -475,8 +475,6 @@ public void testSyncContacts() throws SormasToSormasValidationException, SormasT public void testReportingUserIsIncludedButUpdated() throws SormasToSormasException { UserDto officer = creator.createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.SURVEILLANCE_OFFICER)); - - PersonDto person = creator.createPerson(); CaseDataDto caze = creator.createCase(officer.toReference(), creator.createPerson().toReference(), rdcf); @@ -484,6 +482,7 @@ public void testReportingUserIsIncludedButUpdated() throws SormasToSormasExcepti SormasToSormasOptionsDto options = new SormasToSormasOptionsDto(); options.setOrganization(new SormasServerDescriptor(SECOND_SERVER_ID)); + options.setComment("Test comment"); final String uuidCase = DataHelper.createUuid(); final String uuidContact = DataHelper.createUuid(); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasEventFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasEventFacadeEjbTest.java index 124cae94762..ae61dc9f306 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasEventFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sormastosormas/entities/SormasToSormasEventFacadeEjbTest.java @@ -31,7 +31,6 @@ import javax.ws.rs.core.Response; -import de.symeda.sormas.api.caze.CaseDataDto; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatchers; @@ -781,6 +780,8 @@ public void testReportingUserIsIncludedButUpdated() throws SormasToSormasExcepti options.setOrganization(new SormasServerDescriptor(SECOND_SERVER_ID)); options.setWithEventParticipants(true); options.setWithSamples(true); + options.setComment("Test comment"); + final String uuid = DataHelper.createUuid(); Mockito From 6a8ed092e4cb9b40baaca3741af8516b1e834958 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 19 Sep 2022 11:00:22 +0200 Subject: [PATCH 42/45] stabilization SORQA-535 --- .../sormas/e2etests/entities/services/TravelEntryService.java | 2 +- .../steps/web/application/cases/CaseDirectorySteps.java | 1 - .../steps/web/application/persons/EditPersonSteps.java | 1 - .../src/test/resources/features/sanity/web/Persons.feature | 3 +++ 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/TravelEntryService.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/TravelEntryService.java index 23db04374e9..c39a942b365 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/TravelEntryService.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/entities/services/TravelEntryService.java @@ -119,7 +119,7 @@ public TravelEntry buildGeneratedEntryWithDifferentPointOfEntryDE() { .responsibleCommunity(CommunityValues.VoreingestellteGemeinde.getName()) .disease("COVID-19") .pointOfEntry("Anderer Einreiseort") - .pointOfEntryDetails("Automated test dummy description " + LocalDate.now()) + .pointOfEntryDetails("Automated test dummy description " + LocalDate.now()) .build(); } } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java index 1435f3aad05..616ebe8feba 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java @@ -40,7 +40,6 @@ import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON; import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON_DE; import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_AS_CASE_OPTIONS; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.NEW_ENTRY_POPUP; import static org.sormas.e2etests.pages.application.configuration.DocumentTemplatesPage.FILE_PICKER; import static org.sormas.e2etests.pages.application.configuration.FacilitiesTabPage.CLOSE_DETAILED_EXPORT_POPUP; import static org.sormas.e2etests.pages.application.configuration.FacilitiesTabPage.IMPORT_SUCCESSFUL_FACILITY_IMPORT_CSV; diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java index 6dd3d2612d2..685e384a24a 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/persons/EditPersonSteps.java @@ -20,7 +20,6 @@ import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON_DE; import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.EDIT_TRAVEL_ENTRY_BUTTON; -import static org.sormas.e2etests.pages.application.cases.EpidemiologicalDataCasePage.NEW_ENTRY_POPUP; import static org.sormas.e2etests.pages.application.contacts.CreateNewContactPage.SAVE_BUTTON; import static org.sormas.e2etests.pages.application.contacts.EditContactPersonPage.CONTACT_PERSON_FIRST_NAME_INPUT; import static org.sormas.e2etests.pages.application.contacts.EditContactPersonPage.CONTACT_PERSON_LAST_NAME_INPUT; diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Persons.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Persons.feature index 67ccce03171..67435d34a00 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Persons.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Persons.feature @@ -150,6 +150,9 @@ Feature: Edit Persons Given API: I create a new person Then API: I check that POST call body is "OK" And API: I check that POST call status code is 200 + Then API: I create a new case + Then API: I check that POST call body is "OK" + And API: I check that POST call status code is 200 Given I log in as a National User Then I navigate to the last created via api Person page via URL And I check General comment field is enabled on Edit Person page From 2893b738f150b1b90bf33c1f840e4bde8f09fc0b Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Mon, 19 Sep 2022 12:20:51 +0300 Subject: [PATCH 43/45] #3845 - Add lazy loading to event participants grid - fix bulk mode trigger after ev participant import --- .../de/symeda/sormas/ui/events/EventParticipantsGrid.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java index eba407ba196..9d9b10e437e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java @@ -175,7 +175,10 @@ public void reload() { deselectAll(); } + if (ViewModelProviders.of(EventParticipantsView.class).get(ViewConfiguration.class).isInEagerMode()) { + setEagerDataProvider(); + } + getDataProvider().refreshAll(); - setEagerDataProvider(); } } From 89ca562313f2ba17634ac3875b9b5a9e5736d6e0 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Mon, 19 Sep 2022 15:49:16 +0300 Subject: [PATCH 44/45] #9946 S2S_ make comment fields mandatory - added missing newline in descriptions.properties --- sormas-api/src/main/resources/descriptions.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-api/src/main/resources/descriptions.properties b/sormas-api/src/main/resources/descriptions.properties index 8c97a6d476c..b14b0f85fc0 100644 --- a/sormas-api/src/main/resources/descriptions.properties +++ b/sormas-api/src/main/resources/descriptions.properties @@ -223,4 +223,4 @@ UserRole.hasAssociatedDistrictUser=Allows to associate a user to another user on UserRole.portHealthUser=User is a port health user, so created cases and other data will be associated to a point of entry. # SormasToSormasOptions -SormasToSormasOptions.comment = All comments entered must comply with GDPR rules as described during connection \ No newline at end of file +SormasToSormasOptions.comment = All comments entered must comply with GDPR rules as described during connection From 8bcdcc31fcf077d1192b390be551e3952b3f9fab Mon Sep 17 00:00:00 2001 From: valentinmikleuvg <112615459+valentinmikleuvg@users.noreply.github.com> Date: Mon, 19 Sep 2022 18:40:17 +0300 Subject: [PATCH 45/45] #10218 added a warning message when user click on Bulk Actions (#10374) --- .../sormas/ui/contact/ContactController.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java index e165567153e..cbd78e2c104 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java @@ -170,27 +170,32 @@ private void saveContactsFromLineListing(LineListingLayout lineListingForm, Link } public void openLineListingWindow(EventDto eventDto, Set eventParticipantIndexDtos) { - if (eventParticipantIndexDtos == null || eventParticipantIndexDtos.isEmpty()) { - return; - } + if (eventParticipantIndexDtos.size() == 0) { + new Notification( + I18nProperties.getString(Strings.headingNoEventParticipantsSelected), + I18nProperties.getString(Strings.messageNoEventParticipantsSelected), + Type.WARNING_MESSAGE, + false).show(Page.getCurrent()); + } else { - Window window = new Window(I18nProperties.getString(Strings.headingLineListing)); + Window window = new Window(I18nProperties.getString(Strings.headingLineListing)); - List uuids = eventParticipantIndexDtos.stream().map(EventParticipantIndexDto::getUuid).collect(Collectors.toList()); - List eventParticipantDtos = FacadeProvider.getEventParticipantFacade().getByUuids(uuids); + List uuids = eventParticipantIndexDtos.stream().map(EventParticipantIndexDto::getUuid).collect(Collectors.toList()); + List eventParticipantDtos = FacadeProvider.getEventParticipantFacade().getByUuids(uuids); - LineListingLayout lineListingForm = new LineListingLayout(window, eventDto, eventParticipantDtos); - lineListingForm.setSaveCallback(contacts -> saveContactsFromEventParticipantsLineListing(lineListingForm, contacts)); + LineListingLayout lineListingForm = new LineListingLayout(window, eventDto, eventParticipantDtos); + lineListingForm.setSaveCallback(contacts -> saveContactsFromEventParticipantsLineListing(lineListingForm, contacts)); - lineListingForm.setWidth(LineListingLayout.DEFAULT_WIDTH, Unit.PIXELS); + lineListingForm.setWidth(LineListingLayout.DEFAULT_WIDTH, Unit.PIXELS); - window.setContent(lineListingForm); - window.setModal(true); - window.setPositionX((int) Math.max(0, (Page.getCurrent().getBrowserWindowWidth() - lineListingForm.getWidth())) / 2); - window.setPositionY(70); - window.setResizable(false); + window.setContent(lineListingForm); + window.setModal(true); + window.setPositionX((int) Math.max(0, (Page.getCurrent().getBrowserWindowWidth() - lineListingForm.getWidth())) / 2); + window.setPositionY(70); + window.setResizable(false); - UI.getCurrent().addWindow(window); + UI.getCurrent().addWindow(window); + } } private void saveContactsFromEventParticipantsLineListing(LineListingLayout lineListingForm, LinkedList> contacts) {