Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

INTYGFV-16761: Implemented a solution that retrieves statistics from certificate service and adds it to the existing statistics already retrieved from Webcert. #1087

Merged
merged 10 commits into from
Aug 19, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ private MessageQueryCriteriaDTO convertFilter(QueryFragaSvarParameter queryFraga
}

private QuestionSenderType convertSenderType(QueryFragaSvarParameter queryFragaSvarParameter) {
if (queryFragaSvarParameter.getQuestionFromFK() == null && queryFragaSvarParameter.getQuestionFromWC() == null) {
if (Boolean.FALSE.equals(queryFragaSvarParameter.getQuestionFromFK()) && Boolean.FALSE.equals(
queryFragaSvarParameter.getQuestionFromWC())) {
return QuestionSenderType.SHOW_ALL;
}
return Boolean.TRUE.equals(queryFragaSvarParameter.getQuestionFromWC()) ? QuestionSenderType.WC : QuestionSenderType.FK;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.Base64;
import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
Expand Down Expand Up @@ -69,6 +70,7 @@
import se.inera.intyg.webcert.web.csintegration.integration.dto.SendMessageRequestDTO;
import se.inera.intyg.webcert.web.csintegration.integration.dto.SignCertificateRequestDTO;
import se.inera.intyg.webcert.web.csintegration.integration.dto.SignCertificateWithoutSignatureRequestDTO;
import se.inera.intyg.webcert.web.csintegration.integration.dto.UnitStatisticsRequestDTO;
import se.inera.intyg.webcert.web.csintegration.integration.dto.ValidateCertificateRequestDTO;
import se.inera.intyg.webcert.web.csintegration.message.MessageRequestConverter;
import se.inera.intyg.webcert.web.csintegration.message.dto.IncomingMessageRequestDTO;
Expand Down Expand Up @@ -551,4 +553,14 @@ public LockDraftsRequestDTO getLockDraftsRequestDTO(int lockedAfterDay) {
.cutoffDate(cutoffDate)
.build();
}

public UnitStatisticsRequestDTO getStatisticsRequest(List<String> unitIds) {
return UnitStatisticsRequestDTO.builder()
.unit(certificateServiceUnitHelper.getUnit())
.careUnit(certificateServiceUnitHelper.getCareUnit())
.careProvider(certificateServiceUnitHelper.getCareProvider())
.user(certificateServiceUserHelper.get())
.availableUnitIds(unitIds)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Qualifier;
Expand Down Expand Up @@ -107,6 +108,9 @@
import se.inera.intyg.webcert.web.csintegration.integration.dto.SignCertificateRequestDTO;
import se.inera.intyg.webcert.web.csintegration.integration.dto.SignCertificateResponseDTO;
import se.inera.intyg.webcert.web.csintegration.integration.dto.SignCertificateWithoutSignatureRequestDTO;
import se.inera.intyg.webcert.web.csintegration.integration.dto.StatisticsForUnitDTO;
import se.inera.intyg.webcert.web.csintegration.integration.dto.UnitStatisticsRequestDTO;
import se.inera.intyg.webcert.web.csintegration.integration.dto.UnitStatisticsResponseDTO;
import se.inera.intyg.webcert.web.csintegration.integration.dto.ValidateCertificateRequestDTO;
import se.inera.intyg.webcert.web.csintegration.integration.dto.ValidateCertificateResponseDTO;
import se.inera.intyg.webcert.web.csintegration.message.dto.IncomingMessageRequestDTO;
Expand Down Expand Up @@ -724,4 +728,16 @@ public List<Certificate> lockDrafts(LockDraftsRequestDTO request) {

return response.getCertificates();
}

public Map<String, StatisticsForUnitDTO> getStatistics(UnitStatisticsRequestDTO request) {
final var url = baseUrl + UNIT_ENDPOINT_URL + "/certificates/statistics";

final var response = restTemplate.postForObject(url, request, UnitStatisticsResponseDTO.class);

if (response == null || response.getUnitStatistics() == null) {
throw new IllegalStateException(NULL_RESPONSE_EXCEPTION);
}

return response.getUnitStatistics();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2024 Inera AB (http://www.inera.se)
*
* This file is part of sklintyg (https://github.com/sklintyg).
*
* sklintyg 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.
*
* sklintyg 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 <http://www.gnu.org/licenses/>.
*/

package se.inera.intyg.webcert.web.csintegration.integration.dto;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import lombok.Builder;
import lombok.Value;
import se.inera.intyg.webcert.web.csintegration.integration.dto.StatisticsForUnitDTO.StatisticsForUnitDTOBuilder;

@JsonDeserialize(builder = StatisticsForUnitDTOBuilder.class)
@Value
@Builder
public class StatisticsForUnitDTO {

int draftCount;
int unhandledMessageCount;

@JsonPOJOBuilder(withPrefix = "")
public static class StatisticsForUnitDTOBuilder {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright (C) 2024 Inera AB (http://www.inera.se)
*
* This file is part of sklintyg (https://github.com/sklintyg).
*
* sklintyg 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.
*
* sklintyg 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 <http://www.gnu.org/licenses/>.
*/

package se.inera.intyg.webcert.web.csintegration.integration.dto;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import java.util.List;
import lombok.Builder;
import lombok.Value;
import se.inera.intyg.webcert.web.csintegration.integration.dto.UnitStatisticsRequestDTO.UnitStatisticsRequestDTOBuilder;
import se.inera.intyg.webcert.web.csintegration.unit.CertificateServiceUnitDTO;
import se.inera.intyg.webcert.web.csintegration.user.CertificateServiceUserDTO;

@JsonDeserialize(builder = UnitStatisticsRequestDTOBuilder.class)
@Value
@Builder
public class UnitStatisticsRequestDTO {

CertificateServiceUserDTO user;
CertificateServiceUnitDTO unit;
CertificateServiceUnitDTO careUnit;
CertificateServiceUnitDTO careProvider;
List<String> availableUnitIds;

@JsonPOJOBuilder(withPrefix = "")
public static class UnitStatisticsRequestDTOBuilder {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2024 Inera AB (http://www.inera.se)
*
* This file is part of sklintyg (https://github.com/sklintyg).
*
* sklintyg 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.
*
* sklintyg 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 <http://www.gnu.org/licenses/>.
*/

package se.inera.intyg.webcert.web.csintegration.integration.dto;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import java.util.Map;
import lombok.Builder;
import lombok.Value;
import se.inera.intyg.webcert.web.csintegration.integration.dto.UnitStatisticsResponseDTO.UnitStatisticsResponseDTOBuilder;

@JsonDeserialize(builder = UnitStatisticsResponseDTOBuilder.class)
@Value
@Builder
public class UnitStatisticsResponseDTO {

Map<String, StatisticsForUnitDTO> unitStatistics;

@JsonPOJOBuilder(withPrefix = "")
public static class UnitStatisticsResponseDTOBuilder {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
/*
* Copyright (C) 2024 Inera AB (http://www.inera.se)
*
* This file is part of sklintyg (https://github.com/sklintyg).
*
* sklintyg 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.
*
* sklintyg 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 <http://www.gnu.org/licenses/>.
*/

package se.inera.intyg.webcert.web.csintegration.user;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import se.inera.intyg.infra.integration.hsatk.model.legacy.AbstractVardenhet;
import se.inera.intyg.infra.integration.hsatk.model.legacy.Vardgivare;
import se.inera.intyg.webcert.web.csintegration.integration.CSIntegrationRequestFactory;
import se.inera.intyg.webcert.web.csintegration.integration.CSIntegrationService;
import se.inera.intyg.webcert.web.csintegration.integration.dto.StatisticsForUnitDTO;
import se.inera.intyg.webcert.web.csintegration.util.CertificateServiceProfile;
import se.inera.intyg.webcert.web.service.facade.user.UnitStatisticsDTO;
import se.inera.intyg.webcert.web.service.facade.user.UserStatisticsDTO;
import se.inera.intyg.webcert.web.service.user.dto.WebCertUser;

@Service
@RequiredArgsConstructor
public class CertificateServiceStatisticService {

private final CertificateServiceProfile certificateServiceProfile;
private final CSIntegrationService csIntegrationService;
private final CSIntegrationRequestFactory csIntegrationRequestFactory;

public void add(UserStatisticsDTO statisticsFromWC, List<String> unitIds, WebCertUser user) {
if (!certificateServiceProfile.active()) {
return;
}

final var statisticsFromCS = csIntegrationService.getStatistics(
csIntegrationRequestFactory.getStatisticsRequest(unitIds)
);

if (user.getValdVardenhet() != null) {
statisticsFromWC.addNbrOfDraftsOnSelectedUnit(getNbrOfDraftsOnSelectedUnit(user, statisticsFromCS));
statisticsFromWC.addNbrOfUnhandledQuestionsOnSelectedUnit(getNbrOfUnhandledQuestionsOnSelectedUnit(user, statisticsFromCS));
statisticsFromWC.addTotalDraftsAndUnhandledQuestionsOnOtherUnits(
getTotalDraftsAndUnhandledQuestionsOnOtherUnits(user, statisticsFromCS)
);
}

final var careUnitsWithRelatedSubUnits = getAvailableCareUnitsWithSubUnits(user);
final var unitStatisticsDTO = buildUnitStatisticsFromCS(statisticsFromCS, careUnitsWithRelatedSubUnits);
statisticsFromWC.mergeUnitStatistics(unitStatisticsDTO);
}

private static Map<String, UnitStatisticsDTO> buildUnitStatisticsFromCS(Map<String, StatisticsForUnitDTO> statisticsFromCS,
Map<String, List<String>> careUnitsWithRelatedSubUnits) {
return statisticsFromCS.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
statisticForUnit -> {
final var unitStatistics = new UnitStatisticsDTO();
final var statistics = statisticForUnit.getValue();
unitStatistics.setDraftsOnUnit(statistics.getDraftCount());
unitStatistics.setQuestionsOnUnit(statistics.getUnhandledMessageCount());
if (careUnitsWithRelatedSubUnits.containsKey(statisticForUnit.getKey())) {
final var subUnits = careUnitsWithRelatedSubUnits.get(statisticForUnit.getKey());
subUnits.forEach(unit -> {
if (!statisticsFromCS.containsKey(unit)) {
return;
}
unitStatistics.addQuestionsOnSubUnits(statisticsFromCS.get(unit).getUnhandledMessageCount());
unitStatistics.addDraftsOnSubUnits(statisticsFromCS.get(unit).getDraftCount());
});
}
return unitStatistics;
}
));
}

private static Map<String, List<String>> getAvailableCareUnitsWithSubUnits(WebCertUser user) {
return user.getVardgivare().stream()
.map(Vardgivare::getVardenheter)
.flatMap(List::stream)
.collect(Collectors.toMap(
AbstractVardenhet::getId,
unit -> {
final var subUnits = unit.getHsaIds();
subUnits.remove(unit.getId());
return subUnits;
}
));
}

private static long getTotalDraftsAndUnhandledQuestionsOnOtherUnits(WebCertUser user,
Map<String, StatisticsForUnitDTO> statisticsFromCS) {
return statisticsFromCS.keySet().stream()
.filter(unitId -> !user.getIdsOfSelectedVardenhet().contains(unitId))
.mapToLong(unitId -> statisticsFromCS.get(unitId).getDraftCount() + statisticsFromCS.get(unitId).getUnhandledMessageCount())
.sum();
}

private static int getNbrOfUnhandledQuestionsOnSelectedUnit(WebCertUser user, Map<String, StatisticsForUnitDTO> statisticsFromCS) {
return statisticsFromCS.keySet().stream()
.filter(unitId -> user.getValdVardenhet().getId().equals(unitId))
.findFirst()
.map(unitId -> statisticsFromCS.get(unitId).getUnhandledMessageCount())
.orElse(0);
}

private static int getNbrOfDraftsOnSelectedUnit(WebCertUser user, Map<String, StatisticsForUnitDTO> statisticsFromCS) {
return statisticsFromCS.keySet().stream()
.filter(unitId -> user.getValdVardenhet().getId().equals(unitId))
.findFirst()
.map(unitId -> statisticsFromCS.get(unitId).getDraftCount())
.orElse(0);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ public class UnitStatisticsDTO {
private long draftsOnSubUnits;
private long questionsOnSubUnits;

public UnitStatisticsDTO() {
}

public UnitStatisticsDTO(long draftsOnUnit, long questionsOnUnit) {
this.draftsOnUnit = draftsOnUnit;
this.questionsOnUnit = questionsOnUnit;
Expand Down Expand Up @@ -68,4 +71,19 @@ public long getQuestionsOnSubUnits() {
public void setQuestionsOnSubUnits(long questionsOnSubUnits) {
this.questionsOnSubUnits = questionsOnSubUnits;
}

public void merge(UnitStatisticsDTO unitStatisticsDTO) {
this.draftsOnUnit += unitStatisticsDTO.draftsOnUnit;
this.questionsOnUnit += unitStatisticsDTO.questionsOnUnit;
this.draftsOnSubUnits += unitStatisticsDTO.draftsOnSubUnits;
this.questionsOnSubUnits += unitStatisticsDTO.questionsOnSubUnits;
}

public void addDraftsOnSubUnits(long draftsOnSubUnits) {
this.draftsOnSubUnits += draftsOnSubUnits;
}

public void addQuestionsOnSubUnits(long questionsOnSubUnits) {
this.questionsOnSubUnits += questionsOnSubUnits;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,25 @@ public void addUnitStatistics(String unitId, UnitStatisticsDTO statistics) {

unitStatistics.put(unitId, statistics);
}

public void mergeUnitStatistics(Map<String, UnitStatisticsDTO> unitStatistics) {
unitStatistics.forEach((key, value) ->
this.unitStatistics.merge(key, value, (unitStatistics1, unitStatistics2) -> {
unitStatistics1.merge(unitStatistics2);
return unitStatistics1;
})
);
}

public void addNbrOfDraftsOnSelectedUnit(long nbrOfDraftsOnSelectedUnit) {
this.nbrOfDraftsOnSelectedUnit += nbrOfDraftsOnSelectedUnit;
}

public void addNbrOfUnhandledQuestionsOnSelectedUnit(long nbrOfUnhandledQuestionsOnSelectedUnit) {
this.nbrOfUnhandledQuestionsOnSelectedUnit += nbrOfUnhandledQuestionsOnSelectedUnit;
}

public void addTotalDraftsAndUnhandledQuestionsOnOtherUnits(long totalDraftsAndUnhandledQuestionsOnOtherUnits) {
this.totalDraftsAndUnhandledQuestionsOnOtherUnits += totalDraftsAndUnhandledQuestionsOnOtherUnits;
}
}
Loading
Loading