Skip to content

Commit

Permalink
DMP-2205 - add pending retention to auto closed cases. (#1403)
Browse files Browse the repository at this point in the history
  • Loading branch information
cmagowan-hmcts authored May 2, 2024
1 parent 62f0fb0 commit d9deadf
Show file tree
Hide file tree
Showing 7 changed files with 116 additions and 23 deletions.
12 changes: 11 additions & 1 deletion .idea/codeStyles/Project.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package uk.gov.hmcts.darts.cases.service;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import uk.gov.hmcts.darts.common.entity.CaseRetentionEntity;
import uk.gov.hmcts.darts.common.entity.CourtCaseEntity;
import uk.gov.hmcts.darts.common.entity.EventEntity;
import uk.gov.hmcts.darts.common.entity.HearingEntity;
Expand All @@ -14,6 +19,8 @@
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.UUID;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
Expand All @@ -25,17 +32,30 @@ class CloseOldCasesProcessorTest extends IntegrationBase {
@Autowired
CloseOldCasesProcessor closeOldCasesProcessor;

private static final String REQUESTER_EMAIL = "[email protected]";

@BeforeEach
void beforeEach() {
Jwt jwt = Jwt.withTokenValue("test")
.header("alg", "RS256")
.claim("sub", UUID.randomUUID().toString())
.claim("emails", List.of(REQUESTER_EMAIL))
.build();
SecurityContextHolder.getContext().setAuthentication(new JwtAuthenticationToken(jwt));
dartsDatabase.createTestUserAccount();
}

@Test
void givenClosedEventsUseDateAsClosedDate() {
HearingEntity hearing = dartsDatabase.createHearing("a_courthouse", "1", "1078", LocalDateTime.now().minusYears(7).plusMonths(3));

OffsetDateTime closeDate = OffsetDateTime.now().minusYears(7);

EventEntity eventEntity1 = dartsDatabase.getEventStub().createEvent(hearing, 8);
EventEntity eventEntity1 = dartsDatabase.getEventStub().createEvent(hearing, 8);//Re-examination
eventEntity1.setCreatedDateTime(OffsetDateTime.now().minusYears(7).plusDays(10));
EventEntity eventEntity2 = dartsDatabase.getEventStub().createEvent(hearing, 214);
EventEntity eventEntity2 = dartsDatabase.getEventStub().createEvent(hearing, 214);//case closed
eventEntity2.setCreatedDateTime(closeDate);
EventEntity eventEntity3 = dartsDatabase.getEventStub().createEvent(hearing, 23);
EventEntity eventEntity3 = dartsDatabase.getEventStub().createEvent(hearing, 23);//Application: No case to answer
eventEntity3.setCreatedDateTime(OffsetDateTime.now().minusYears(7).plusDays(5));
dartsDatabase.saveAll(eventEntity1, eventEntity2, eventEntity3);

Expand All @@ -51,6 +71,9 @@ void givenClosedEventsUseDateAsClosedDate() {
assertTrue(updatedCourtCaseEntity.getClosed());
assertEquals(closeDate.truncatedTo(ChronoUnit.MINUTES),
updatedCourtCaseEntity.getCaseClosedTimestamp().truncatedTo(ChronoUnit.MINUTES));
CaseRetentionEntity caseRetentionEntity = dartsDatabase.getCaseRetentionRepository().findAll().get(0);
assertEquals(courtCaseEntity.getId(), caseRetentionEntity.getCourtCase().getId());
assertEquals(closeDate.plusYears(7).truncatedTo(ChronoUnit.DAYS), caseRetentionEntity.getRetainUntil());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,23 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import uk.gov.hmcts.darts.authorisation.api.AuthorisationApi;
import uk.gov.hmcts.darts.cases.service.CloseOldCasesProcessor;
import uk.gov.hmcts.darts.common.entity.CaseRetentionEntity;
import uk.gov.hmcts.darts.common.entity.CourtCaseEntity;
import uk.gov.hmcts.darts.common.entity.EventEntity;
import uk.gov.hmcts.darts.common.entity.HearingEntity;
import uk.gov.hmcts.darts.common.entity.MediaEntity;
import uk.gov.hmcts.darts.common.entity.UserAccountEntity;
import uk.gov.hmcts.darts.common.repository.CaseRepository;
import uk.gov.hmcts.darts.common.repository.EventRepository;
import uk.gov.hmcts.darts.common.repository.MediaRepository;
import uk.gov.hmcts.darts.common.repository.CaseRetentionRepository;
import uk.gov.hmcts.darts.retention.api.RetentionApi;
import uk.gov.hmcts.darts.retention.enums.CaseRetentionStatus;
import uk.gov.hmcts.darts.retention.enums.RetentionPolicyEnum;
import uk.gov.hmcts.darts.retention.helper.RetentionDateHelper;
import uk.gov.hmcts.darts.retentions.model.PostRetentionRequest;

import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.util.ArrayList;
Expand All @@ -28,11 +36,14 @@
@RequiredArgsConstructor
@Slf4j
public class CloseOldCasesProcessorImpl implements CloseOldCasesProcessor {
private static final String CLOSE_CASE_RETENTION_COMMENT = "CloseOldCases Automated job setting retention period to Default";
private final CaseRepository caseRepository;
private final CaseRetentionRepository caseRetentionRepository;
private final RetentionApi retentionApi;
private final RetentionDateHelper retentionDateHelper;
private final AuthorisationApi authorisationApi;

private final EventRepository eventRepository;

private final MediaRepository mediaRepository;
private UserAccountEntity userAccount;

@Value("${darts.retention.close-open-cases-older-than-years}")
long years;
Expand All @@ -45,6 +56,7 @@ public class CloseOldCasesProcessorImpl implements CloseOldCasesProcessor {
public void closeCases() {
List<CourtCaseEntity> courtCaseEntityList = caseRepository.findOpenCasesToClose(OffsetDateTime.now().minusYears(years));

userAccount = authorisationApi.getCurrentUser();
courtCaseEntityList.forEach(this::closeCase);
}

Expand All @@ -60,10 +72,10 @@ private void closeCase(CourtCaseEntity courtCase) {
eventList.stream().filter(eventEntity -> closeEvents.contains(eventEntity.getEventType().getEventName())).findFirst();

if (closedEvent.isPresent()) {
closeCaseInDb(courtCase, closedEvent.get().getCreatedDateTime());
closeCaseInDbAndAddRetention(courtCase, closedEvent.get().getCreatedDateTime());
} else {
//look for the last event and use that date
closeCaseInDb(courtCase, eventList.get(0).getCreatedDateTime());
closeCaseInDbAndAddRetention(courtCase, eventList.get(0).getCreatedDateTime());
}
} else if (!courtCase.getHearings().isEmpty()) {
//look for the last audio and use its recorded date
Expand All @@ -73,24 +85,34 @@ private void closeCase(CourtCaseEntity courtCase) {
}
if (!mediaList.isEmpty()) {
mediaList.sort(Comparator.comparing(MediaEntity::getCreatedDateTime).reversed());
closeCaseInDb(courtCase, mediaList.get(0).getCreatedDateTime());
closeCaseInDbAndAddRetention(courtCase, mediaList.get(0).getCreatedDateTime());
} else {
//look for the last hearing date and use that
courtCase.getHearings().sort(Comparator.comparing(HearingEntity::getHearingDate).reversed());
HearingEntity lastHearingEntity = courtCase.getHearings().get(0);
closeCaseInDb(courtCase, OffsetDateTime.of(lastHearingEntity.getHearingDate().atStartOfDay(), ZoneOffset.UTC));
closeCaseInDbAndAddRetention(courtCase, OffsetDateTime.of(lastHearingEntity.getHearingDate().atStartOfDay(), ZoneOffset.UTC));
}
} else {
//set to created date
closeCaseInDb(courtCase, courtCase.getCreatedDateTime());
closeCaseInDbAndAddRetention(courtCase, courtCase.getCreatedDateTime());
}


}

private void closeCaseInDb(CourtCaseEntity courtCase, OffsetDateTime caseClosedDate) {
private void closeCaseInDbAndAddRetention(CourtCaseEntity courtCase, OffsetDateTime caseClosedDate) {
courtCase.setClosed(TRUE);
courtCase.setCaseClosedTimestamp(caseClosedDate);
caseRepository.save(courtCase);

LocalDate retentionDate = retentionDateHelper.getRetentionDateForPolicy(courtCase, RetentionPolicyEnum.DEFAULT);

PostRetentionRequest postRetentionRequest = new PostRetentionRequest();
postRetentionRequest.setComments(CLOSE_CASE_RETENTION_COMMENT);
postRetentionRequest.setRetentionDate(retentionDate);

CaseRetentionEntity retentionEntity = retentionApi.createRetention(postRetentionRequest, courtCase, retentionDate, userAccount,
CaseRetentionStatus.PENDING);
caseRetentionRepository.save(retentionEntity);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
package uk.gov.hmcts.darts.retention.api;

import uk.gov.hmcts.darts.common.entity.CaseRetentionEntity;
import uk.gov.hmcts.darts.common.entity.CourtCaseEntity;
import uk.gov.hmcts.darts.common.entity.RetentionPolicyTypeEntity;
import uk.gov.hmcts.darts.common.entity.UserAccountEntity;
import uk.gov.hmcts.darts.retention.enums.CaseRetentionStatus;
import uk.gov.hmcts.darts.retentions.model.PostRetentionRequest;

import java.time.LocalDate;

public interface RetentionApi {
LocalDate applyPolicyStringToDate(LocalDate dateToAppend, String policyString, RetentionPolicyTypeEntity retentionPolicyType);

CaseRetentionEntity createRetention(PostRetentionRequest postRetentionRequest, CourtCaseEntity courtCase, LocalDate newRetentionDate,
UserAccountEntity userAccount, CaseRetentionStatus caseRetentionStatus);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import uk.gov.hmcts.darts.common.entity.CaseRetentionEntity;
import uk.gov.hmcts.darts.common.entity.CourtCaseEntity;
import uk.gov.hmcts.darts.common.entity.RetentionPolicyTypeEntity;
import uk.gov.hmcts.darts.common.entity.UserAccountEntity;
import uk.gov.hmcts.darts.retention.api.RetentionApi;
import uk.gov.hmcts.darts.retention.enums.CaseRetentionStatus;
import uk.gov.hmcts.darts.retention.helper.RetentionDateHelper;
import uk.gov.hmcts.darts.retention.service.RetentionPostService;
import uk.gov.hmcts.darts.retentions.model.PostRetentionRequest;

import java.time.LocalDate;

Expand All @@ -13,9 +19,17 @@
public class RetentionApiImpl implements RetentionApi {

private final RetentionDateHelper retentionDateHelper;
private final RetentionPostService retentionPostService;

@Override
public LocalDate applyPolicyStringToDate(LocalDate dateToAppend, String policyString, RetentionPolicyTypeEntity retentionPolicyType) {
return retentionDateHelper.applyPolicyString(dateToAppend, policyString, retentionPolicyType);
}

@Override
public CaseRetentionEntity createRetention(PostRetentionRequest postRetentionRequest, CourtCaseEntity courtCase, LocalDate newRetentionDate,
UserAccountEntity userAccount, CaseRetentionStatus caseRetentionStatus) {
return retentionPostService.createNewCaseRetention(postRetentionRequest, courtCase,
newRetentionDate, userAccount, caseRetentionStatus);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
package uk.gov.hmcts.darts.retention.service;

import uk.gov.hmcts.darts.common.entity.CaseRetentionEntity;
import uk.gov.hmcts.darts.common.entity.CourtCaseEntity;
import uk.gov.hmcts.darts.common.entity.UserAccountEntity;
import uk.gov.hmcts.darts.retention.enums.CaseRetentionStatus;
import uk.gov.hmcts.darts.retentions.model.PostRetentionRequest;
import uk.gov.hmcts.darts.retentions.model.PostRetentionResponse;

import java.time.LocalDate;

public interface RetentionPostService {

PostRetentionResponse postRetention(Boolean validateOnly, PostRetentionRequest postRetentionRequest);

CaseRetentionEntity createNewCaseRetention(PostRetentionRequest postRetentionRequest, CourtCaseEntity courtCase,
LocalDate newRetentionDate, UserAccountEntity userAccount, CaseRetentionStatus caseRetentionStatus);
}
Original file line number Diff line number Diff line change
Expand Up @@ -163,30 +163,37 @@ private CaseRetentionEntity getLatestCompletedCaseRetention(CourtCaseEntity cour
return latestCompletedAutomatedRetentionOpt.get();
}

private CaseRetentionEntity createNewCaseRetention(PostRetentionRequest postRetentionRequest, CourtCaseEntity courtCase,
LocalDate newRetentionDate) {
@Override
public CaseRetentionEntity createNewCaseRetention(PostRetentionRequest postRetentionRequest, CourtCaseEntity courtCase,
LocalDate newRetentionDate, UserAccountEntity userAccount, CaseRetentionStatus caseRetentionStatus) {
CaseRetentionEntity caseRetention = new CaseRetentionEntity();
caseRetention.setCourtCase(courtCase);
UserAccountEntity currentUser = authorisationApi.getCurrentUser();
caseRetention.setLastModifiedBy(currentUser);
caseRetention.setCreatedBy(currentUser);
caseRetention.setSubmittedBy(currentUser);
caseRetention.setLastModifiedBy(userAccount);
caseRetention.setCreatedBy(userAccount);
caseRetention.setSubmittedBy(userAccount);
caseRetention.setComments(postRetentionRequest.getComments());
caseRetention.setRetainUntil(newRetentionDate.atTime(OffsetTime.of(0, 0, 0, 0, ZoneOffset.UTC)));
caseRetention.setCurrentState(String.valueOf(CaseRetentionStatus.COMPLETE));
caseRetention.setCurrentState(String.valueOf(caseRetentionStatus));
caseRetention.setRetainUntilAppliedOn(currentTimeHelper.currentOffsetDateTime());

caseRetention.setRetentionPolicyType(getRetentionPolicy(postRetentionRequest.getIsPermanentRetention()));

caseRetentionRepository.saveAndFlush(caseRetention);
auditApi.recordAudit(
AuditActivity.APPLY_RETENTION,
currentUser,
userAccount,
courtCase
);
return caseRetention;
}

private CaseRetentionEntity createNewCaseRetention(PostRetentionRequest postRetentionRequest, CourtCaseEntity courtCase,
LocalDate newRetentionDate) {
UserAccountEntity currentUser = authorisationApi.getCurrentUser();
return createNewCaseRetention(postRetentionRequest, courtCase,
newRetentionDate, currentUser, CaseRetentionStatus.COMPLETE);
}

private RetentionPolicyTypeEntity getRetentionPolicy(Boolean isPermanent) {

String policyKey;
Expand Down

0 comments on commit d9deadf

Please sign in to comment.