diff --git a/apmis-flow/src/main/java/com/cinoteck/application/views/campaigndata/CampaignFormBuilder.java b/apmis-flow/src/main/java/com/cinoteck/application/views/campaigndata/CampaignFormBuilder.java index 471a7dcf35b..6248a4f1031 100644 --- a/apmis-flow/src/main/java/com/cinoteck/application/views/campaigndata/CampaignFormBuilder.java +++ b/apmis-flow/src/main/java/com/cinoteck/application/views/campaigndata/CampaignFormBuilder.java @@ -342,18 +342,25 @@ public CampaignFormBuilder(List formElements, List districtsList = FacadeProvider.getDistrictFacade() .getAllActiveByRegion(e.getValue().getUuid()); + + System.out.println(districtsList + "districtsListdistrictsListdistrictsListdistrictsList============================"); List allDistrictList = new ArrayList<>(); popDto.forEach(popDtoc -> allDistrictList.add(popDtoc.getDistrict())); + + System.out.println(allDistrictList + "allDistrictListallDistrictListallDistrictList=============2222222222222222222222"); + List filteredDistrictListwithDup = districtsList.stream() .filter(allDistrictList::contains).collect(Collectors.toList()); + // Remove duplicates using Set Set uniqueSet = new HashSet<>(filteredDistrictListwithDup); // Convert the set back to a list (if needed) List filteredDistrictList = new ArrayList<>(uniqueSet); + System.out.println(filteredDistrictList + "filteredDistrictListfilteredDistrictListfilteredDistrictList=============3333333333333333"); districts = filteredDistrictList; // districts = FacadeProvider.getDistrictFacade().getAllActiveByRegion(e.getValue().getUuid()); diff --git a/apmis-flow/src/main/java/com/cinoteck/application/views/utils/DownloadTransposedDaywiseDataUtility.java b/apmis-flow/src/main/java/com/cinoteck/application/views/utils/DownloadTransposedDaywiseDataUtility.java index 9f0031b2ca6..38bb7f7cfaf 100644 --- a/apmis-flow/src/main/java/com/cinoteck/application/views/utils/DownloadTransposedDaywiseDataUtility.java +++ b/apmis-flow/src/main/java/com/cinoteck/application/views/utils/DownloadTransposedDaywiseDataUtility.java @@ -182,10 +182,10 @@ public static StreamResource createTransposedDataFromIndexList(CampaignFormDataC individualTransposedFormData.getCreatingUser() != null ? individualTransposedFormData.getCreatingUser().toString() : ""); - row.set(14, day); + row.set(14, day.split("_")[1]); for (String variable : uniqueVariablePartsWithoutDaySuffixForColumnHeader) { - String key = variable + "_" + day; + String key = variable + day; if (formDataMaxp.containsKey(key)) { String keyValue = formDataMaxp.get(key); int colIndex = columnNames.indexOf(variable); diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 0bcbae648e9..63de1d04114 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -79,6 +79,8 @@ org.glassfish.jersey.media jersey-media-json-jackson + + com.github.mpkorstanje @@ -106,6 +108,17 @@ log4j-core 2.20.0 + + + com.vladmihalcea + hibernate-types-52 + 2.21.1 + + + com.fasterxml.jackson.core + jackson-databind + 2.13.0 + diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/campaign/form/CampaignFormMetaFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/form/CampaignFormMetaFacade.java index 333cf94e735..f9eac25f247 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/campaign/form/CampaignFormMetaFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/form/CampaignFormMetaFacade.java @@ -83,4 +83,6 @@ List getIndexList(CampaignFormCriteria campaignFormCriteria List getCampaignFormByCampaignAndFormType(String campaignUuid, String formType); + List getFormsMetaHistory(String formUuid); + } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/campaign/form/CampaignFormMetaHistoryExtractDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/form/CampaignFormMetaHistoryExtractDto.java new file mode 100644 index 00000000000..aa0917ba90c --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/campaign/form/CampaignFormMetaHistoryExtractDto.java @@ -0,0 +1,181 @@ +package de.symeda.sormas.api.campaign.form; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import javax.persistence.Column; +import javax.persistence.Entity; + + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.vladmihalcea.hibernate.type.json.JsonStringType; + +@JsonInclude(JsonInclude.Include.NON_NULL) + +public class CampaignFormMetaHistoryExtractDto implements Serializable, Comparable { + + private String uuid; + private String formname; + +// private Map campaignFormElements = new HashMap<>(); +// private List campaignFormElements; // To store JSON data +private String campaignFormElements; + private String formid; + private LocalDateTime start_date; + private LocalDateTime end_date; + +// public CampaignFormMetaHistoryExtractDto(String uuid, String formName, Map campaignFormElements, +// String formId, LocalDateTime startDate, Object endDate) { +// this.uuid = uuid; +// this.formname = formName; +// this.campaignFormElements = campaignFormElements != null +// ? campaignFormElements +// : new HashMap<>(); // it's +// // never +// // null +// this.formid = formId; +// this.start_date = startDate; +// this.end_date = (endDate instanceof LocalDateTime) ? (LocalDateTime) endDate : null; +// } + +// public CampaignFormMetaHistoryExtractDto(String uuid, String formName, List campaignFormElements, String formId, +// LocalDateTime startDate, Object endDate) { +// this.uuid = uuid; +// this.formname = formName; +// this.campaignFormElements = campaignFormElements; // Ensure it's never null +// this.formid = formId; +// this.start_date = startDate; +// this.end_date = (endDate instanceof LocalDateTime) ? (LocalDateTime) endDate : null; +// } + +// public CampaignFormMetaHistoryExtractDto(String uuid, String formName, +// List campaignFormElements, // Change type +// String formId, LocalDateTime startDate, Object endDate) { +// this.uuid = uuid; +// this.formname = formName; +// this.campaignFormElements = campaignFormElements != null +// ? campaignFormElements +// : new ArrayList<>(); // Ensure never null +// this.formid = formId; +// this.start_date = startDate; +// this.end_date = (endDate instanceof LocalDateTime) +// ? (LocalDateTime) endDate +// : null; +// } + + + public CampaignFormMetaHistoryExtractDto(String uuid, String formName, + String campaignFormElements, // Change type + String formId, LocalDateTime startDate, Object endDate) { + this.uuid = uuid; + this.formname = formName; + this.campaignFormElements = campaignFormElements; // Ensure never null + this.formid = formId; + this.start_date = startDate; + this.end_date = (endDate instanceof LocalDateTime) + ? (LocalDateTime) endDate + : null; + } + + + + + // Getters and setters + public String getCampaignFormElements() { + return campaignFormElements; + } + + public void setCampaignFormElements(String campaignFormElements) { + this.campaignFormElements = campaignFormElements; + } + + + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getFormname() { + return formname; + } + + public void setFormname(String formname) { + this.formname = formname; + } + + public String getFormid() { + return formid; + } + + public void setFormid(String formid) { + this.formid = formid; + } + + public LocalDateTime getStart_date() { + return start_date; + } + + public void setStart_date(LocalDateTime start_date) { + this.start_date = start_date; + } + + public LocalDateTime getEnd_date() { + return end_date; + } + + public void setEnd_date(LocalDateTime end_date) { + this.end_date = end_date; + } +// +// public Map getCampaignFormElements() { +// return campaignFormElements; +// } +// +// public void setCampaignFormElements(Map campaignFormElements) { +// this.campaignFormElements = campaignFormElements; +// } +// +// public String getCampaignFormElementsx() { +// return campaignFormElementsx; +// } +// +// public void setCampaignFormElementsx(String campaignFormElementsx) { +// this.campaignFormElementsx = campaignFormElementsx; +// } + + @Override + public int hashCode() { + return Objects.hash(campaignFormElements, end_date, formid, formname, start_date, uuid); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CampaignFormMetaHistoryExtractDto other = (CampaignFormMetaHistoryExtractDto) obj; + return Objects.equals(campaignFormElements, other.campaignFormElements) + && Objects.equals(end_date, other.end_date) && Objects.equals(formid, other.formid) + && Objects.equals(formname, other.formname) && Objects.equals(start_date, other.start_date) + && Objects.equals(uuid, other.uuid); + } + + @Override + public int compareTo(CampaignFormMetaHistoryExtractDto o) { + // TODO Auto-generated method stub + return 0; + } + +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/area/AreaDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/area/AreaDto.java index 2f0f3ab739f..555fed886af 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/area/AreaDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/area/AreaDto.java @@ -1,5 +1,7 @@ package de.symeda.sormas.api.infrastructure.area; +import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -42,6 +44,10 @@ public class AreaDto extends EntityDto { private Long areaid; private String uuid_; private boolean isDryRun; + + private LocalDateTime startDate; + private LocalDateTime endDate; + //TODO check if you want to leave this here @@ -64,6 +70,24 @@ public AreaDto(@Size(max = 512, message = "textTooLong") String name, Long popul this.uuid_ = uuid_; this.externalId = cxternalID; } + + public AreaDto(String uuid, String name, Boolean archived, Long externalID, LocalDateTime startDate, LocalDateTime endDate) { + this.uuid_ = uuid; + this.name = name; + this.archived = archived; + this.externalId = externalID; + this.startDate = startDate; + this.endDate = endDate; + } + public AreaDto(String string, String string2, Boolean boolean1, long l, LocalDateTime localDateTime, Object object) { + this.uuid_ = string; + this.name = string2; + this.archived = boolean1; + this.externalId = l; + this.startDate = localDateTime; + this.endDate = (object instanceof LocalDateTime) ? (LocalDateTime) object : null; + } + public AreaReferenceDto toReference() { return new AreaReferenceDto(getUuid()); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/area/AreaFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/area/AreaFacade.java index 558f180552b..d74d735bdff 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/area/AreaFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/area/AreaFacade.java @@ -37,5 +37,7 @@ public interface AreaFacade extends GeoLocationFacade getAreasHistory(String uuid); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/area/AreaHistoryExtractDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/area/AreaHistoryExtractDto.java new file mode 100644 index 00000000000..6ccdb8491f8 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/area/AreaHistoryExtractDto.java @@ -0,0 +1,104 @@ +package de.symeda.sormas.api.infrastructure.area; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Objects; +import de.symeda.sormas.api.report.CampaignDataExtractDto; + +public class AreaHistoryExtractDto implements Serializable, Comparable { + //@NotNull(message = "Please enter valid externalID") + + private String uuid_; + private String name; + private boolean archived; + private Long externalId; + private LocalDateTime startDate; + private LocalDateTime endDate; + + + public AreaHistoryExtractDto(String uuid, String name, Boolean archived, Long externalID, LocalDateTime startDate, LocalDateTime endDate) { + this.uuid_ = uuid; + this.name = name; + this.archived = archived; + this.externalId = externalID; + this.startDate = startDate; + this.endDate = endDate; + } + public AreaHistoryExtractDto(String string, String string2, Boolean boolean1, long l, LocalDateTime localDateTime, Object object) { + this.uuid_ = string; + this.name = string2; + this.archived = boolean1; + this.externalId = l; + this.startDate = localDateTime; + this.endDate = (object instanceof LocalDateTime) ? (LocalDateTime) object : null; + } + + + + + + public String getUuid_() { + return uuid_; + } + public void setUuid_(String uuid_) { + this.uuid_ = uuid_; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public boolean isArchived() { + return archived; + } + public void setArchived(boolean archived) { + this.archived = archived; + } + public Long getExternalId() { + return externalId; + } + public void setExternalId(Long externalId) { + this.externalId = externalId; + } + public LocalDateTime getStartDate() { + return startDate; + } + public void setStartDate(LocalDateTime startDate) { + this.startDate = startDate; + } + public LocalDateTime getEndDate() { + return endDate; + } + public void setEndDate(LocalDateTime endDate) { + this.endDate = endDate; + } + @Override + public int hashCode() { + return Objects.hash(uuid_, externalId, name, archived, startDate, endDate); + } + + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + AreaHistoryExtractDto other = (AreaHistoryExtractDto) obj; + return Objects.equals(uuid_, other.uuid_) + && Objects.equals(externalId, other.externalId) + && Objects.equals(name, other.name) && Objects.equals(archived, other.archived) + && Objects.equals(startDate, other.startDate) && Objects.equals(endDate, other.endDate) +; + } + @Override + public int compareTo(AreaHistoryExtractDto o) { + // TODO Auto-generated method stub + return 0; + } + + +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/community/CommunityFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/community/CommunityFacade.java index 43101926bf3..8dad11cda4e 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/community/CommunityFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/community/CommunityFacade.java @@ -74,4 +74,6 @@ public interface CommunityFacade extends GeoLocationFacade getAllAfterWithDistrict(Date date, Set rDistdto); + List getClustersHistory(String uuid); + } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/community/CommunityHistoryExtractDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/community/CommunityHistoryExtractDto.java new file mode 100644 index 00000000000..fcc7d7e2a2d --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/community/CommunityHistoryExtractDto.java @@ -0,0 +1,129 @@ +/******************************************************************************* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2018 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.community; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.Objects; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import de.symeda.sormas.api.ClusterFloatStatus; +import de.symeda.sormas.api.EntityDto; +import de.symeda.sormas.api.ImportIgnore; +import de.symeda.sormas.api.i18n.Validations; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionHistoryExtractDto; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.FieldConstraints; + + +public class CommunityHistoryExtractDto implements Serializable, Comparable { + + private String uuid_; + private String name; + private Long externalId; + private boolean archived; + private LocalDateTime startDate; + private LocalDateTime endDate; + + + public CommunityHistoryExtractDto(String uuid, String name, Boolean archived, Long externalID, LocalDateTime startDate, LocalDateTime endDate) { + this.uuid_ = uuid; + this.name = name; + this.archived = archived; + this.externalId = externalID; + this.startDate = startDate; + this.endDate = endDate; + } + public CommunityHistoryExtractDto(String string, String string2, Boolean boolean1, long l, LocalDateTime localDateTime, Object object) { + this.uuid_ = string; + this.name = string2; + this.archived = boolean1; + this.externalId = l; + this.startDate = localDateTime; + this.endDate = (object instanceof LocalDateTime) ? (LocalDateTime) object : null; + } + public String getUuid_() { + return uuid_; + } + public void setUuid_(String uuid_) { + this.uuid_ = uuid_; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public Long getExternalId() { + return externalId; + } + public void setExternalId(Long externalId) { + this.externalId = externalId; + } + public boolean isArchived() { + return archived; + } + public void setArchived(boolean archived) { + this.archived = archived; + } + public LocalDateTime getStartDate() { + return startDate; + } + public void setStartDate(LocalDateTime startDate) { + this.startDate = startDate; + } + public LocalDateTime getEndDate() { + return endDate; + } + public void setEndDate(LocalDateTime endDate) { + this.endDate = endDate; + } + @Override + public int hashCode() { + return Objects.hash(archived, endDate, externalId, name, startDate, uuid_); + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CommunityHistoryExtractDto other = (CommunityHistoryExtractDto) obj; + return archived == other.archived && Objects.equals(endDate, other.endDate) + && Objects.equals(externalId, other.externalId) && Objects.equals(name, other.name) + && Objects.equals(startDate, other.startDate) && Objects.equals(uuid_, other.uuid_); + } + @Override + public int compareTo(CommunityHistoryExtractDto o) { + // TODO Auto-generated method stub + return 0; + } + + + + + + +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictFacade.java index 3db417e11b2..d3618935ff9 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictFacade.java @@ -28,7 +28,6 @@ import de.symeda.sormas.api.infrastructure.GeoLocationFacade; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.SortProperty; - @Remote public interface DistrictFacade extends GeoLocationFacade { @@ -83,4 +82,6 @@ public interface DistrictFacade extends GeoLocationFacade getAllActiveByRegionAndSelectedInCampaign(String uuid, String campaingUUID); String getMapDiagramDistrictHascByUuid(String districtUuid); + + List getDistrictsHistory(String uuid); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictHistoryExtractDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictHistoryExtractDto.java new file mode 100644 index 00000000000..1f9b0aa9d08 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictHistoryExtractDto.java @@ -0,0 +1,147 @@ +/******************************************************************************* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2018 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.district; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.Objects; + +import javax.validation.constraints.Min; +import javax.validation.constraints.Size; + +import de.symeda.sormas.api.EntityDto; +import de.symeda.sormas.api.i18n.Validations; +import de.symeda.sormas.api.infrastructure.region.RegionHistoryExtractDto; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.FieldConstraints; + +public class DistrictHistoryExtractDto implements Serializable, Comparable { + + private String uuid_; + private String name; + private Long externalId; + private boolean archived; + private LocalDateTime startDate; + private LocalDateTime endDate; + + +// private Long populationData; +// +// private Long populationData5_10; +// private Long campaignPopulationData; +// private String selectedPopulationData; +// private Long regionId; +// private String regionUuid_; +// private String uuid_; +// private String mapHasc; +// private String districtModality; +// private String districtStatus; +// private String ageGroup; +// +// +// +// //@Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong) +// +// //@Min(2) +// private Long externalId; +// private String externalIddummy; + + + public DistrictHistoryExtractDto(String uuid, String name, Boolean archived, Long externalID, LocalDateTime startDate, LocalDateTime endDate) { + this.uuid_ = uuid; + this.name = name; + this.archived = archived; + this.externalId = externalID; + this.startDate = startDate; + this.endDate = endDate; + } + public DistrictHistoryExtractDto(String string, String string2, Boolean boolean1, long l, LocalDateTime localDateTime, Object object) { + this.uuid_ = string; + this.name = string2; + this.archived = boolean1; + this.externalId = l; + this.startDate = localDateTime; + this.endDate = (object instanceof LocalDateTime) ? (LocalDateTime) object : null; + } + public String getUuid_() { + return uuid_; + } + public void setUuid_(String uuid_) { + this.uuid_ = uuid_; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public Long getExternalId() { + return externalId; + } + public void setExternalId(Long externalId) { + this.externalId = externalId; + } + public boolean isArchived() { + return archived; + } + public void setArchived(boolean archived) { + this.archived = archived; + } + public LocalDateTime getStartDate() { + return startDate; + } + public void setStartDate(LocalDateTime startDate) { + this.startDate = startDate; + } + public LocalDateTime getEndDate() { + return endDate; + } + public void setEndDate(LocalDateTime endDate) { + this.endDate = endDate; + } + @Override + public int hashCode() { + return Objects.hash(archived, endDate, externalId, name, startDate, uuid_); + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DistrictHistoryExtractDto other = (DistrictHistoryExtractDto) obj; + return archived == other.archived && Objects.equals(endDate, other.endDate) + && Objects.equals(externalId, other.externalId) && Objects.equals(name, other.name) + && Objects.equals(startDate, other.startDate) && Objects.equals(uuid_, other.uuid_); + } + @Override + public int compareTo(DistrictHistoryExtractDto o) { + // TODO Auto-generated method stub + return 0; + } + + + + + + +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java index c8118b9d3a0..9bb8e4eb0b4 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java @@ -25,7 +25,6 @@ import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.infrastructure.GeoLocationFacade; import de.symeda.sormas.api.utils.SortProperty; - import de.symeda.sormas.api.campaign.CampaignDto; @Remote @@ -75,4 +74,6 @@ public interface RegionFacade extends GeoLocationFacade getAllRegions(); String getMapDiagramRegionHascByUuid(String chartrandom); + + List getProvincesHistory(String uuid); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionHistoryExtractDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionHistoryExtractDto.java new file mode 100644 index 00000000000..c78e9f4b6e1 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionHistoryExtractDto.java @@ -0,0 +1,158 @@ +/******************************************************************************* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2018 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.region; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.Objects; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +import de.symeda.sormas.api.EntityDto; +import de.symeda.sormas.api.feature.FeatureType; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Validations; +import de.symeda.sormas.api.infrastructure.area.AreaReferenceDto; +import de.symeda.sormas.api.infrastructure.country.CountryReferenceDto; +import de.symeda.sormas.api.report.CampaignDataExtractDto; +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DependingOnFeatureType; +import de.symeda.sormas.api.utils.FieldConstraints; + +public class RegionHistoryExtractDto implements Serializable, Comparable { + + private String uuid_; + private String name; + private Long externalId; + private boolean archived; + private LocalDateTime startDate; + private LocalDateTime endDate; + +// private String fa_af; +// private String ps_af; +// private String epidCode; +// private Float growthRate; +// +// +// private AreaReferenceDto area; +// private CountryReferenceDto country; +// private String externalIddummy; +// private Long populationData; +// private Long regionId; +// private String areaUuid_; +// private String mapHasc; + + public RegionHistoryExtractDto(String uuid, String name, Boolean archived, Long externalID, LocalDateTime startDate, LocalDateTime endDate) { + this.uuid_ = uuid; + this.name = name; + this.archived = archived; + this.externalId = externalID; + this.startDate = startDate; + this.endDate = endDate; + } + public RegionHistoryExtractDto(String string, String string2, Boolean boolean1, long l, LocalDateTime localDateTime, Object object) { + this.uuid_ = string; + this.name = string2; + this.archived = boolean1; + this.externalId = l; + this.startDate = localDateTime; + this.endDate = (object instanceof LocalDateTime) ? (LocalDateTime) object : null; + } + + + + + + public String getUuid_() { + return uuid_; + } + public void setUuid_(String uuid_) { + this.uuid_ = uuid_; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public Long getExternalId() { + return externalId; + } + public void setExternalId(Long externalId) { + this.externalId = externalId; + } + public boolean isArchived() { + return archived; + } + public void setArchived(boolean archived) { + this.archived = archived; + } + public LocalDateTime getStartDate() { + return startDate; + } + public void setStartDate(LocalDateTime startDate) { + this.startDate = startDate; + } + public LocalDateTime getEndDate() { + return endDate; + } + public void setEndDate(LocalDateTime endDate) { + this.endDate = endDate; + } + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + Objects.hash(archived, endDate, externalId, + name, startDate, uuid_); + return result; + } + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + RegionHistoryExtractDto other = (RegionHistoryExtractDto) obj; + return archived == other.archived +// && Objects.equals(area, other.area) +// && Objects.equals(areaUuid_, other.areaUuid_) && Objects.equals(country, other.country) + && Objects.equals(endDate, other.endDate) +// && Objects.equals(epidCode, other.epidCode) + && Objects.equals(externalId, other.externalId) +// && Objects.equals(externalIddummy, other.externalIddummy) && Objects.equals(fa_af, other.fa_af) +// && Objects.equals(growthRate, other.growthRate) && Objects.equals(mapHasc, other.mapHasc) + && Objects.equals(name, other.name) +// && Objects.equals(populationData, other.populationData) +// && Objects.equals(ps_af, other.ps_af) && Objects.equals(regionId, other.regionId) + && Objects.equals(startDate, other.startDate) && Objects.equals(uuid_, other.uuid_); + } + + @Override + public int compareTo(RegionHistoryExtractDto o) { + // TODO Auto-generated method stub + return 0; + } + + + +} diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/config/ConfigProvider.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/config/ConfigProvider.java index 1ab6b61e0b2..2af87e0ce10 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/config/ConfigProvider.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/config/ConfigProvider.java @@ -95,7 +95,7 @@ public final class ConfigProvider { private static String LBDS_KEYSTORE_ALIAS_AES_SECRET = "LBDS_AES_SECRET"; public static String APPVERSIONNUMBER = "1.0.36"; - public static String APPRELEASEDATE = "11 October, 2024"; + public static String APPRELEASEDATE = "13 December, 2024"; private static final String FULL_COUNTRY_LOCALE_PATTERN = "[a-zA-Z]*-[a-zA-Z]*"; diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/campaign/edit/CampaignFormDataNewFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/campaign/edit/CampaignFormDataNewFragment.java index 173b15b8a01..9a032176c74 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/campaign/edit/CampaignFormDataNewFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/campaign/edit/CampaignFormDataNewFragment.java @@ -1144,6 +1144,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa mTabHost.getTabWidget().getChildAt(2).getLayoutParams().width = 140; } if (countr > 3) { + System.out.println("333333333333333333334444444444444444444"); + spec = mTabHost.newTabSpec("tab4").setIndicator("D4",//caption_1, res.getDrawable(R.drawable.ic_clear_black_24dp)) .setContent(R.id.tabSheet4); @@ -1152,6 +1154,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa } if (countr > 3 && countr == 5) { // 3 DAY DaywiseForm + + System.out.println("33333333333333333333555555555555555555555"); spec = mTabHost.newTabSpec("tab5").setIndicator(" ",//caption_1, res.getDrawable(R.drawable.ic_clear_black_24dp)) .setContent(R.id.tabSheet5); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/form/CampaignFormMetaFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/form/CampaignFormMetaFacadeEjb.java index 7a0cc36d67a..58a009a3992 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/form/CampaignFormMetaFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/form/CampaignFormMetaFacadeEjb.java @@ -1,6 +1,9 @@ package de.symeda.sormas.backend.campaign.form; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.math.BigInteger; +import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -8,6 +11,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -33,8 +37,11 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; +import org.joda.time.LocalDateTime; import org.jsoup.safety.Whitelist; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import de.symeda.sormas.api.Modality; import de.symeda.sormas.api.ReferenceDto; @@ -48,11 +55,13 @@ import de.symeda.sormas.api.campaign.form.CampaignFormMetaDto; import de.symeda.sormas.api.campaign.form.CampaignFormMetaExpiryDto; import de.symeda.sormas.api.campaign.form.CampaignFormMetaFacade; +import de.symeda.sormas.api.campaign.form.CampaignFormMetaHistoryExtractDto; import de.symeda.sormas.api.campaign.form.CampaignFormMetaIndexDto; import de.symeda.sormas.api.campaign.form.CampaignFormMetaReferenceDto; import de.symeda.sormas.api.campaign.form.CampaignFormTranslations; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Validations; +import de.symeda.sormas.api.infrastructure.community.CommunityHistoryExtractDto; import de.symeda.sormas.api.user.FormAccess; import de.symeda.sormas.api.utils.HtmlHelper; import de.symeda.sormas.api.utils.SortProperty; @@ -851,6 +860,130 @@ public Date formExpiryDate(CampaignFormDataCriteria criteria) { return null; } } + + @Override + public List getFormsMetaHistory (String formUuid){ + + ObjectMapper objectMapper = new ObjectMapper(); + List resultData = new ArrayList<>(); + + + StringBuilder queryStringBuilder = new StringBuilder(); + queryStringBuilder.append("WITH current_data AS (") + .append("SELECT id, uuid, CAST(campaignformelements AS TEXT) AS campaignformelements, formid, formname, changedate AS start_date, ") + .append("LEAD(changedate) OVER (PARTITION BY uuid ORDER BY changedate) AS end_date ") + .append("FROM campaignformmeta_history "); + + if (formUuid != null) { + queryStringBuilder.append("WHERE uuid = '").append(formUuid).append("' "); + } + + queryStringBuilder.append("), ") + .append("updated_end_date AS (") + .append("SELECT cd.id, cd.uuid, cd.campaignformelements, cd.formid, cd.formname, cd.start_date, ") + .append("COALESCE(cd.end_date, (SELECT changedate FROM campaignformmeta WHERE campaignformmeta.uuid = cd.uuid)) AS end_date ") + .append("FROM current_data cd) ") + .append("SELECT uuid, formname, campaignformelements, formid, start_date, end_date ") + .append("FROM updated_end_date ") + .append("ORDER BY start_date ASC;"); + + String queryString = queryStringBuilder.toString(); + + Query seriesDataQuery = em.createNativeQuery(queryString); + @SuppressWarnings("unchecked") + List resultList = seriesDataQuery.getResultList(); + +// resultData.addAll(resultList.stream() +// .map(result -> { +// +//// String campaignFormElementsJson = (String) result[2]; +//// Map campaignFormElements = Collections.emptyMap(); +//// if (campaignFormElementsJson != null && !campaignFormElementsJson.trim().isEmpty()) { +//// try { +//// campaignFormElements = objectMapper.readValue(outputStream, Map.class); +//// } catch (Exception e) { +//// e.printStackTrace(); +//// } +//// }else { +//// System.out.println("Null Discovered "); +//// } +// +//// String campaignFormElementsJson = (String) result[2]; +//// Map campaignFormElements = null; +//// try { +//// campaignFormElements = objectMapper.readValue(campaignFormElementsJson, Map.class); +//// } catch (Exception e) { +//// e.printStackTrace(); +//// } +// return new CampaignFormMetaHistoryExtractDto( +// (String) result[0], // UUID +// (String) result[1], // Name +// ((String) result[1]).toString(), // Campaign Form Elements +// (String) result[3], // External ID +// ((Timestamp) result[4]).toLocalDateTime(), // Start Date +// result[5] != null ? ((Timestamp) result[5]).toLocalDateTime() : LocalDateTime.now() // End Date +// ); +// }) +// .collect(Collectors.toList())); +// +// ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + +// resultData.addAll(resultList.stream() +// .map(result -> { +// String campaignFormElementsJson = (String) result[2]; +// Map campaignFormElements = new HashMap<>(); +// if (campaignFormElementsJson != null && !campaignFormElementsJson.trim().isEmpty()) { +// try { +// campaignFormElements = objectMapper.readValue(campaignFormElementsJson, Map.class); +// } catch (Exception e) { +// // Log error or handle appropriately +// e.printStackTrace(); +// } +// } +// return new CampaignFormMetaHistoryExtractDto( +// (String) result[0], +// (String) result[1], +// campaignFormElements, +// (String) result[3], +// ((Timestamp) result[4]).toLocalDateTime(), +// result[5] != null ? ((Timestamp) result[5]).toLocalDateTime() : LocalDateTime.now() +// ); +// }) +// .collect(Collectors.toList())); + + resultData.addAll(resultList.stream() + .map(result -> { + String campaignFormElementsJson = (String) result[2]; + List campaignFormElements = new ArrayList<>(); + + if (campaignFormElementsJson != null && !campaignFormElementsJson.trim().isEmpty()) { + try { + campaignFormElements = objectMapper.readValue( + campaignFormElementsJson, + new TypeReference>() {} + ); + } catch (Exception e) { +// logger.error("Error parsing JSON for campaign form elements", e); + } + } + + return new CampaignFormMetaHistoryExtractDto( + (String) result[0], + (String) result[1], + (String) result[2], + (String) result[3], + ((Timestamp) result[4]).toLocalDateTime(), + result[5] != null + ? ((Timestamp) result[5]).toLocalDateTime() + : LocalDateTime.now() + ); + }) + .collect(Collectors.toList())); + + return resultData; + } + @Override public List getCampaignFormByCampaignAndFormType(String campaignUuid, @@ -893,6 +1026,5 @@ public CampaignFormMetaFacadeEjbLocal() { - } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/area/AreaFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/area/AreaFacadeEjb.java index 6feb9964bf2..69f8aee5015 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/area/AreaFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/area/AreaFacadeEjb.java @@ -1,6 +1,7 @@ package de.symeda.sormas.backend.infrastructure.area; import java.math.BigInteger; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.Date; @@ -25,6 +26,8 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; +import org.joda.time.LocalDateTime; + import de.symeda.sormas.api.campaign.CampaignDto; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Validations; @@ -32,6 +35,7 @@ import de.symeda.sormas.api.infrastructure.area.AreaCriteria; import de.symeda.sormas.api.infrastructure.area.AreaDto; import de.symeda.sormas.api.infrastructure.area.AreaFacade; +import de.symeda.sormas.api.infrastructure.area.AreaHistoryExtractDto; import de.symeda.sormas.api.infrastructure.area.AreaReferenceDto; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; @@ -482,4 +486,75 @@ public static Set toReferenceDto(Set area) { // save return dtos; } + + @Override + public List getAreasHistory(String external){ + + List resultData = new ArrayList<>(); + +// if(external != null) { +// String whereclause = "WHERE uuid = ' " + external + "'"; +// } +// String queryStringBuilder = "WITH current_data AS (select id, uuid, archived, externalid, name, changedate AS start_date, \n" +// + "LEAD(changedate) OVER (PARTITION BY uuid ORDER BY changedate) AS end_date FROM areas_history \n" +// + (external != null ? "WHERE uuid = ? " : "") +// + ")," +// + "updated_end_date AS (SELECT cd.id, cd.uuid, cd.archived, cd.externalid, cd.name, cd.start_date, \n" +// + "COALESCE(cd.end_date, (SELECT changedate FROM areas WHERE areas.uuid = cd.uuid)) AS end_date FROM current_data cd ) \n" +// + "SELECT id, uuid, archived, externalid, name, start_date, end_date FROM updated_end_date \n" +// + "ORDER BY start_date ASC;"; + + StringBuilder queryStringBuilder = new StringBuilder(); + queryStringBuilder.append("WITH current_data AS (") + .append("SELECT id, uuid, archived, externalid, name, changedate AS start_date, ") + .append("LEAD(changedate) OVER (PARTITION BY uuid ORDER BY changedate) AS end_date ") + .append("FROM areas_history "); + + if (external != null) { + queryStringBuilder.append("WHERE uuid = '").append(external).append("' "); + } + + queryStringBuilder.append("), ") + .append("updated_end_date AS (") + .append("SELECT cd.id, cd.uuid, cd.archived, cd.externalid, cd.name, cd.start_date, ") + .append("COALESCE(cd.end_date, (SELECT changedate FROM areas WHERE areas.uuid = cd.uuid)) AS end_date ") + .append("FROM current_data cd) ") + .append("SELECT uuid, name, archived, externalid, start_date, end_date ") + .append("FROM updated_end_date ") + .append("ORDER BY start_date ASC;"); + + String queryString = queryStringBuilder.toString(); + + Query seriesDataQuery = em.createNativeQuery(queryString); + @SuppressWarnings("unchecked") + List resultList = seriesDataQuery.getResultList(); + resultData.addAll(resultList.stream() + .map(result -> new AreaHistoryExtractDto( + (String) result[0], // UUID + (String) result[1], // Name + (Boolean) result[2], // Archived + result[3] != null ? ((BigInteger) result[3]).longValue() : 0L, // External ID + ((Timestamp) result[4]).toLocalDateTime(), // Start Date + result[5] != null ? ((Timestamp) result[5]).toLocalDateTime() : LocalDateTime.now() // End Date + )) + .collect(Collectors.toList())); + +// resultData.addAll(resultList.stream() +// .map(result -> new AreaDto( +// (String) result[0].toString(), +// (String) result[1].toString(), +// (Boolean) result[2], +// result[3] != null ? ((BigInteger) result[3]).longValue() : 0L, +// ((Timestamp) result[4]).toLocalDateTime(), +// result[5] != null ? ((Timestamp) result[5]).toLocalDateTime() : "" +// )) +// .collect(Collectors.toList())); + + + + + + return resultData; + + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/community/CommunityFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/community/CommunityFacadeEjb.java index c6d38ce739f..44d51f56370 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/community/CommunityFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/community/CommunityFacadeEjb.java @@ -1,6 +1,7 @@ package de.symeda.sormas.backend.infrastructure.community; import java.math.BigInteger; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -31,6 +32,8 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; +import org.joda.time.LocalDateTime; + import com.vladmihalcea.hibernate.type.util.SQLExtractor; import de.symeda.sormas.api.ClusterFloatStatus; @@ -48,8 +51,10 @@ import de.symeda.sormas.api.infrastructure.community.CommunityCriteriaNew; import de.symeda.sormas.api.infrastructure.community.CommunityDto; import de.symeda.sormas.api.infrastructure.community.CommunityFacade; +import de.symeda.sormas.api.infrastructure.community.CommunityHistoryExtractDto; import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionHistoryExtractDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.report.CommunityUserReportModelDto; import de.symeda.sormas.api.user.FormAccess; @@ -1186,7 +1191,51 @@ public List getAllActiveCommunitytoRerencexx(Commun return QueryHelper.getResultList(em, cq, null, null, this::toDtoList); // TODO Auto-generated method stub - }@Override + } + + @Override + public List getClustersHistory(String uuid){ + List resultData = new ArrayList<>(); + + StringBuilder queryStringBuilder = new StringBuilder(); + queryStringBuilder.append("WITH current_data AS (") + .append("SELECT id, uuid, archived, externalid, name, changedate AS start_date, ") + .append("LEAD(changedate) OVER (PARTITION BY uuid ORDER BY changedate) AS end_date ") + .append("FROM community_history "); + + if (uuid != null) { + queryStringBuilder.append("WHERE uuid = '").append(uuid).append("' "); + } + + queryStringBuilder.append("), ") + .append("updated_end_date AS (") + .append("SELECT cd.id, cd.uuid, cd.archived, cd.externalid, cd.name, cd.start_date, ") + .append("COALESCE(cd.end_date, (SELECT changedate FROM community WHERE community.uuid = cd.uuid)) AS end_date ") + .append("FROM current_data cd) ") + .append("SELECT uuid, name, archived, externalid, start_date, end_date ") + .append("FROM updated_end_date ") + .append("ORDER BY start_date ASC;"); + + String queryString = queryStringBuilder.toString(); + + Query seriesDataQuery = em.createNativeQuery(queryString); + @SuppressWarnings("unchecked") + List resultList = seriesDataQuery.getResultList(); + resultData.addAll(resultList.stream() + .map(result -> new CommunityHistoryExtractDto( + (String) result[0], // UUID + (String) result[1], // Name + (Boolean) result[2], // Archived + result[3] != null ? ((BigInteger) result[3]).longValue() : 0L, // External ID + ((Timestamp) result[4]).toLocalDateTime(), // Start Date + result[5] != null ? ((Timestamp) result[5]).toLocalDateTime() : LocalDateTime.now() // End Date + )) + .collect(Collectors.toList())); + + return resultData; + } + + @Override public List getAllCommunities() { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Community.class); @@ -1243,5 +1292,9 @@ public List getAllActiveCommunitytoRerenceNew(Integ //if(isCounter) return QueryHelper.getResultList(em, cq, null, null, this::toDtoList);//.stream().filter(e -> e.getMessage() != "Correctly assigned").collect(Collectors.toList()); } + + + + } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/district/DistrictFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/district/DistrictFacadeEjb.java index b58b81c72f3..cf66a323ea2 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/district/DistrictFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/district/DistrictFacadeEjb.java @@ -15,6 +15,7 @@ package de.symeda.sormas.backend.infrastructure.district; import java.math.BigInteger; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -45,6 +46,8 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; +import org.joda.time.LocalDateTime; + import com.vladmihalcea.hibernate.type.util.SQLExtractor; import de.symeda.sormas.api.EntityRelevanceStatus; @@ -60,6 +63,7 @@ import de.symeda.sormas.api.infrastructure.district.DistrictCriteria; import de.symeda.sormas.api.infrastructure.district.DistrictDto; import de.symeda.sormas.api.infrastructure.district.DistrictFacade; +import de.symeda.sormas.api.infrastructure.district.DistrictHistoryExtractDto; import de.symeda.sormas.api.infrastructure.district.DistrictIndexDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionDto; @@ -774,6 +778,48 @@ public String getMapDiagramDistrictHascByUuid(String districtUuid) { return ""; } } + + @Override + public List getDistrictsHistory(String uuid){ + List resultData = new ArrayList<>(); + + StringBuilder queryStringBuilder = new StringBuilder(); + queryStringBuilder.append("WITH current_data AS (") + .append("SELECT id, uuid, archived, externalid, name, changedate AS start_date, ") + .append("LEAD(changedate) OVER (PARTITION BY uuid ORDER BY changedate) AS end_date ") + .append("FROM district_history "); + + if (uuid != null) { + queryStringBuilder.append("WHERE uuid = '").append(uuid).append("' "); + } + + queryStringBuilder.append("), ") + .append("updated_end_date AS (") + .append("SELECT cd.id, cd.uuid, cd.archived, cd.externalid, cd.name, cd.start_date, ") + .append("COALESCE(cd.end_date, (SELECT changedate FROM district WHERE district.uuid = cd.uuid)) AS end_date ") + .append("FROM current_data cd) ") + .append("SELECT uuid, name, archived, externalid, start_date, end_date ") + .append("FROM updated_end_date ") + .append("ORDER BY start_date ASC;"); + + String queryString = queryStringBuilder.toString(); + + Query seriesDataQuery = em.createNativeQuery(queryString); + @SuppressWarnings("unchecked") + List resultList = seriesDataQuery.getResultList(); + resultData.addAll(resultList.stream() + .map(result -> new DistrictHistoryExtractDto( + (String) result[0], // UUID + (String) result[1], // Name + (Boolean) result[2], // Archived + result[3] != null ? ((BigInteger) result[3]).longValue() : 0L, // External ID + ((Timestamp) result[4]).toLocalDateTime(), // Start Date + result[5] != null ? ((Timestamp) result[5]).toLocalDateTime() : LocalDateTime.now() // End Date + )) + .collect(Collectors.toList())); + + return resultData; + } public static Set toReferenceDto(Set district) { // save diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java index 85e60316de3..5ca9b710d4b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java @@ -15,6 +15,7 @@ package de.symeda.sormas.backend.infrastructure.region; import java.math.BigInteger; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -45,6 +46,8 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; +import org.joda.time.LocalDateTime; + import com.vladmihalcea.hibernate.type.util.SQLExtractor; import de.symeda.sormas.api.campaign.CampaignDto; @@ -53,6 +56,7 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.infrastructure.area.AreaDto; +import de.symeda.sormas.api.infrastructure.area.AreaHistoryExtractDto; import de.symeda.sormas.api.infrastructure.area.AreaReferenceDto; import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto; import de.symeda.sormas.api.infrastructure.country.CountryReferenceDto; @@ -60,6 +64,7 @@ import de.symeda.sormas.api.infrastructure.region.RegionCriteria; import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.api.infrastructure.region.RegionFacade; +import de.symeda.sormas.api.infrastructure.region.RegionHistoryExtractDto; import de.symeda.sormas.api.infrastructure.region.RegionIndexDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.SortProperty; @@ -655,6 +660,48 @@ public String getMapDiagramRegionHascByUuid(String regionUuid) { } } + @Override + public List getProvincesHistory(String uuid){ + List resultData = new ArrayList<>(); + + StringBuilder queryStringBuilder = new StringBuilder(); + queryStringBuilder.append("WITH current_data AS (") + .append("SELECT id, uuid, archived, externalid, name, changedate AS start_date, ") + .append("LEAD(changedate) OVER (PARTITION BY uuid ORDER BY changedate) AS end_date ") + .append("FROM region_history "); + + if (uuid != null) { + queryStringBuilder.append("WHERE uuid = '").append(uuid).append("' "); + } + + queryStringBuilder.append("), ") + .append("updated_end_date AS (") + .append("SELECT cd.id, cd.uuid, cd.archived, cd.externalid, cd.name, cd.start_date, ") + .append("COALESCE(cd.end_date, (SELECT changedate FROM region WHERE region.uuid = cd.uuid)) AS end_date ") + .append("FROM current_data cd) ") + .append("SELECT uuid, name, archived, externalid, start_date, end_date ") + .append("FROM updated_end_date ") + .append("ORDER BY start_date ASC;"); + + String queryString = queryStringBuilder.toString(); + + Query seriesDataQuery = em.createNativeQuery(queryString); + @SuppressWarnings("unchecked") + List resultList = seriesDataQuery.getResultList(); + resultData.addAll(resultList.stream() + .map(result -> new RegionHistoryExtractDto( + (String) result[0], // UUID + (String) result[1], // Name + (Boolean) result[2], // Archived + result[3] != null ? ((BigInteger) result[3]).longValue() : 0L, // External ID + ((Timestamp) result[4]).toLocalDateTime(), // Start Date + result[5] != null ? ((Timestamp) result[5]).toLocalDateTime() : LocalDateTime.now() // End Date + )) + .collect(Collectors.toList())); + + return resultData; + } + public static Set toReferenceDto(Set region) { // save Set dtos = new HashSet(); diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index 0ff51fddd60..d3d64382037 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -10798,6 +10798,43 @@ CREATE UNIQUE INDEX camapaigndata_admin_fieldid_idxxx ON public.camapaigndata_ad INSERT INTO schema_version (version_number, comment) VALUES (479, 'Admin Data Completeness report formatting - data source selection'); +--Create Versioning table for Province/District/Cluster + +--region +CREATE TABLE region_history (LIKE region); +CREATE TRIGGER versioning_trigger BEFORE INSERT OR UPDATE OR DELETE ON region +FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', 'region_history', true); +ALTER TABLE region_history OWNER TO sormas_user; + +ALTER TABLE region ADD COLUMN sys_period tstzrange NOT NULL DEFAULT tstzrange(now(), null); +ALTER TABLE region_history ADD COLUMN sys_period tstzrange NOT NULL; + + +--District +CREATE TABLE district_history (LIKE district); +CREATE TRIGGER versioning_trigger BEFORE INSERT OR UPDATE OR DELETE ON district +FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', 'district_history', true); +ALTER TABLE district_history OWNER TO sormas_user; + +ALTER TABLE district ADD COLUMN sys_period tstzrange NOT NULL DEFAULT tstzrange(now(), null); +ALTER TABLE district_history ADD COLUMN sys_period tstzrange NOT NULL; + +--Clusters + +CREATE TABLE community_history (LIKE community); +CREATE TRIGGER versioning_trigger BEFORE INSERT OR UPDATE OR DELETE ON community +FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', 'community_history', true); +ALTER TABLE community_history OWNER TO sormas_user; + +ALTER TABLE community ADD COLUMN sys_period tstzrange NOT NULL DEFAULT tstzrange(now(), null); +ALTER TABLE community_history ADD COLUMN sys_period tstzrange NOT NULL; + + + + +INSERT INTO schema_version (version_number, comment) VALUES (480, 'Geography: Tracking Active Status over Time #750'); + + -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 2b70f8d85ca..fcb260303ba 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -83,6 +83,13 @@ org.eclipse.microprofile.config microprofile-config-api + + + com.vladmihalcea + hibernate-types-52 + 2.21.1 + + diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/AreaResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/AreaResource.java index d68c8fdda16..0c69865c646 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/AreaResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/AreaResource.java @@ -9,10 +9,13 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.infrastructure.area.AreaDto; +import de.symeda.sormas.api.infrastructure.area.AreaHistoryExtractDto; +import de.symeda.sormas.api.infrastructure.area.AreaReferenceDto; @Path("/areas") @Produces(MediaType.APPLICATION_JSON + "; charset=UTF-8") @@ -39,4 +42,11 @@ public List getByUuids(List uuids) { public List getAllUuids() { return FacadeProvider.getAreaFacade().getAllUuids(); } + + @GET + @Path("/areaHistory") + public List getAreasHistory(@QueryParam("getAreaHistory") String uuid) { + System.out.println(uuid + "UUUID from area resource"); + return FacadeProvider.getAreaFacade().getAreasHistory(uuid); + } } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignFormMetaResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignFormMetaResource.java index 77d80b2dd78..89c63fc3427 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignFormMetaResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignFormMetaResource.java @@ -12,11 +12,13 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.campaign.form.CampaignFormMetaDto; import de.symeda.sormas.api.campaign.form.CampaignFormMetaExpiryDto; +import de.symeda.sormas.api.campaign.form.CampaignFormMetaHistoryExtractDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; @Path("/campaignFormMeta") @@ -87,4 +89,11 @@ public List getAllUuids() { public List getAllFormsWithExpiry() { return FacadeProvider.getCampaignFormMetaFacade().getFormsWithExpiry(); } + + + @GET + @Path("/getFormMetaHistory") + public List getFormsMetaHistory(@QueryParam("getFormMetaHistory") String formUuid) { + return FacadeProvider.getCampaignFormMetaFacade().getFormsMetaHistory(formUuid); + } } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/CommunityResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/CommunityResource.java index b47c380875b..9839d872853 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/CommunityResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/CommunityResource.java @@ -40,8 +40,10 @@ import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.infrastructure.community.CommunityCriteriaNew; import de.symeda.sormas.api.infrastructure.community.CommunityDto; +import de.symeda.sormas.api.infrastructure.community.CommunityHistoryExtractDto; import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionHistoryExtractDto; import de.symeda.sormas.api.user.UserDto; import io.swagger.v3.oas.annotations.parameters.RequestBody; @@ -147,4 +149,12 @@ public Page getIndexList(@RequestBody CriteriaWithSorting getClustersHistory(@QueryParam("getClusterHistory") String uuid) { + System.out.println(uuid + "UUUID from province resource"); + return FacadeProvider.getCommunityFacade().getClustersHistory(uuid); + } } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/DistrictResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/DistrictResource.java index 550e0dbf1f7..490528e7a2e 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/DistrictResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/DistrictResource.java @@ -38,8 +38,10 @@ import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto; import de.symeda.sormas.api.infrastructure.district.DistrictCriteria; import de.symeda.sormas.api.infrastructure.district.DistrictDto; +import de.symeda.sormas.api.infrastructure.district.DistrictHistoryExtractDto; import de.symeda.sormas.api.infrastructure.district.DistrictIndexDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionHistoryExtractDto; import io.swagger.v3.oas.annotations.parameters.RequestBody; /** @@ -121,4 +123,12 @@ public Page getIndexList( return FacadeProvider.getDistrictFacade() .getIndexPage(criteriaWithSorting.getCriteria(), offset, size, criteriaWithSorting.getSortProperties()); } + + + @GET + @Path("/districtsHistory") + public List getDistrictsHistory(@QueryParam("getDistrictHistory") String uuid) { + System.out.println(uuid + "UUUID from province resource"); + return FacadeProvider.getDistrictFacade().getDistrictsHistory(uuid); + } } diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/RegionResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/RegionResource.java index fc89886450e..eea03106073 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/RegionResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/RegionResource.java @@ -32,8 +32,10 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CriteriaWithSorting; import de.symeda.sormas.api.common.Page; +import de.symeda.sormas.api.infrastructure.area.AreaHistoryExtractDto; import de.symeda.sormas.api.infrastructure.region.RegionCriteria; import de.symeda.sormas.api.infrastructure.region.RegionDto; +import de.symeda.sormas.api.infrastructure.region.RegionHistoryExtractDto; import de.symeda.sormas.api.infrastructure.region.RegionIndexDto; import io.swagger.v3.oas.annotations.parameters.RequestBody; @@ -77,4 +79,11 @@ public Page getIndexList( return FacadeProvider.getRegionFacade() .getIndexPage(criteriaWithSorting.getCriteria(), offset, size, criteriaWithSorting.getSortProperties()); } + + @GET + @Path("/provincesHistory") + public List getProvincesHistory(@QueryParam("getProvinceHistory") String uuid) { + System.out.println(uuid + "UUUID from province resource"); + return FacadeProvider.getRegionFacade().getProvincesHistory(uuid); + } }