Skip to content

Commit 72844a9

Browse files
authored
HDPI-3873-submission-confirmation-backend (#1831)
1 parent 766cd19 commit 72844a9

7 files changed

Lines changed: 107 additions & 11 deletions

File tree

src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/CounterClaim.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import uk.gov.hmcts.ccd.sdk.api.CCD;
88
import uk.gov.hmcts.ccd.sdk.type.FieldType;
99
import uk.gov.hmcts.ccd.sdk.type.ListValue;
10+
import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.CitizenAccess;
1011
import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.DefendantAccess;
1112
import uk.gov.hmcts.reform.pcs.ccd.annotation.JacksonMoneyGBP;
1213
import uk.gov.hmcts.reform.pcs.ccd.domain.Party;
@@ -63,4 +64,7 @@ public class CounterClaim {
6364
)
6465
private List<ListValue<Party>> counterClaimAgainst;
6566

67+
@CCD(access = {CitizenAccess.class})
68+
private CounterClaimStatus status;
69+
6670
}

src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,7 @@ public class DefendantResponses {
129129
typeParameterOverride = "RespondToClaimSection"
130130
)
131131
private List<RespondToClaimSection> completedSections;
132+
133+
@CCD
134+
private DefendantResponseStatus status;
132135
}

src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/strategy/CitizenStartEventStrategy.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@
33
import lombok.AllArgsConstructor;
44
import lombok.extern.slf4j.Slf4j;
55
import org.springframework.stereotype.Component;
6+
import uk.gov.hmcts.ccd.sdk.type.YesOrNo;
67
import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.UserRole;
78
import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase;
9+
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponseStatus;
10+
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses;
811
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PossessionClaimResponse;
912
import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity;
1013
import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity;
1114
import uk.gov.hmcts.reform.pcs.ccd.event.respondpossessionclaim.utils.DefendantOnlyDraftBuilder;
1215
import uk.gov.hmcts.reform.pcs.ccd.event.respondpossessionclaim.utils.PossessionClaimDraftBuilder;
1316
import uk.gov.hmcts.reform.pcs.ccd.event.respondpossessionclaim.utils.PossessionClaimMerger;
17+
import uk.gov.hmcts.reform.pcs.ccd.repository.DefendantResponseRepository;
1418
import uk.gov.hmcts.reform.pcs.ccd.service.DraftCaseDataService;
1519
import uk.gov.hmcts.reform.pcs.ccd.service.PcsCaseService;
1620
import uk.gov.hmcts.reform.pcs.ccd.service.party.DefendantAccessValidator;
@@ -19,6 +23,7 @@
1923
import uk.gov.hmcts.reform.pcs.security.SecurityContextService;
2024

2125
import java.util.List;
26+
import java.util.UUID;
2227

2328
import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.respondPossessionClaim;
2429

@@ -35,6 +40,7 @@ public class CitizenStartEventStrategy implements RespondPossessionClaimStartEve
3540
private final PossessionClaimMerger possessionClaimMerger;
3641
private final PossessionClaimDraftBuilder possessionClaimDraftBuilder;
3742
private final DefendantOnlyDraftBuilder defendantOnlyDraftBuilder;
43+
private final DefendantResponseRepository defendantResponseRepository;
3844

3945
@Override
4046
public boolean supports(List<String> roles) {
@@ -44,12 +50,33 @@ public boolean supports(List<String> roles) {
4450
@Override
4551
public PCSCase loadDraft(long caseReference, PCSCase pcsCase) {
4652
PartyEntity defendant = loadAndValidateDefendant(caseReference);
53+
54+
if (hasSubmittedResponse(caseReference, securityContextService.getCurrentUserId())) {
55+
return buildSubmittedResponseCase(pcsCase);
56+
}
57+
4758
if (draftCaseDataService.hasUnsubmittedCaseData(caseReference, respondPossessionClaim)) {
4859
return restoreDraft(caseReference, pcsCase, defendant);
4960
}
5061
return initialiseDraft(caseReference, pcsCase, defendant);
5162
}
5263

64+
private boolean hasSubmittedResponse(long caseReference, UUID userId) {
65+
return userId != null
66+
&& defendantResponseRepository.existsByClaimPcsCaseCaseReferenceAndPartyIdamId(caseReference, userId);
67+
}
68+
69+
private PCSCase buildSubmittedResponseCase(PCSCase pcsCase) {
70+
return pcsCase.toBuilder()
71+
.possessionClaimResponse(PossessionClaimResponse.builder()
72+
.defendantResponses(DefendantResponses.builder()
73+
.status(DefendantResponseStatus.SUBMITTED)
74+
.build())
75+
.build())
76+
.hasUnsubmittedCaseData(YesOrNo.NO)
77+
.build();
78+
}
79+
5380
private PartyEntity loadAndValidateDefendant(long caseReference) {
5481
PcsCaseEntity caseEntity = pcsCaseService.loadCase(caseReference);
5582
return accessValidator.validateAndGetDefendant(caseEntity, securityContextService.getCurrentUserId());

src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
import org.springframework.util.CollectionUtils;
88
import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo;
99
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.CounterClaim;
10+
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.CounterClaimStatus;
1011
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.CounterClaimType;
12+
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponseStatus;
1113
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses;
1214
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PossessionClaimResponse;
1315
import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity;
@@ -160,13 +162,14 @@ private void saveDefendantResponseInternal(
160162
ClaimEntity claimRef = claimRepository.getReferenceById(claimId);
161163

162164
DefendantResponses responses = possessionClaimResponse.getDefendantResponses();
165+
LocalDateTime submittedAt = LocalDateTime.now(utcClock);
163166

164167
DefendantResponseEntity responseEntity =
165-
buildDefendantResponseEntity(claimRef, partyRef, responses);
168+
buildDefendantResponseEntity(claimRef, partyRef, responses, submittedAt);
166169

167170
buildAndLinkChildEntities(responseEntity, responses);
168171

169-
CounterClaimEntity savedCounterClaim = saveCounterClaim(responses, partyRef, claimRef);
172+
CounterClaimEntity savedCounterClaim = saveCounterClaim(responses, partyRef, claimRef, submittedAt);
170173

171174
DefendantResponseEntity savedResponse = defendantResponseRepository.save(responseEntity);
172175

@@ -206,11 +209,14 @@ private UUID requireCurrentUserId() {
206209

207210
private DefendantResponseEntity buildDefendantResponseEntity(ClaimEntity claimRef,
208211
PartyEntity partyRef,
209-
DefendantResponses responses) {
212+
DefendantResponses responses,
213+
LocalDateTime submittedAt) {
210214

211215
DefendantResponseEntity defendantResponse = DefendantResponseEntity.builder()
212216
.claim(claimRef)
213217
.party(partyRef)
218+
.status(DefendantResponseStatus.SUBMITTED)
219+
.responseSubmittedDate(submittedAt)
214220
.freeLegalAdvice(responses.getFreeLegalAdvice())
215221
.defendantNameConfirmation(responses.getDefendantNameConfirmation())
216222
.correspondenceAddressConfirmation(responses.getCorrespondenceAddressConfirmation())
@@ -260,7 +266,8 @@ private void buildAndLinkChildEntities(
260266

261267
private CounterClaimEntity saveCounterClaim(DefendantResponses responses,
262268
PartyEntity partyRef,
263-
ClaimEntity claimRef) {
269+
ClaimEntity claimRef,
270+
LocalDateTime submittedAt) {
264271
CounterClaim cc = responses.getCounterClaim();
265272
if (cc == null) {
266273
return null;
@@ -284,7 +291,8 @@ private CounterClaimEntity saveCounterClaim(DefendantResponses responses,
284291
.needHelpWithFees(cc.getNeedHelpWithFees())
285292
.appliedForHwf(cc.getAppliedForHwf())
286293
.hwfReferenceNumber(cc.getHwfReferenceNumber())
287-
.claimSubmittedDate(LocalDateTime.now(utcClock))
294+
.status(CounterClaimStatus.PENDING_COUNTER_CLAIM_ISSUED)
295+
.claimSubmittedDate(submittedAt)
288296
.party(partyRef)
289297
.build();
290298

src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ class RespondPossessionClaimTest extends BaseEventTest {
8989
@Mock
9090
private DefendantResponseService defendantResponseService;
9191

92+
@Mock
93+
private DefendantResponseRepository defendantResponseRepository;
94+
9295
@Mock
9396
private RespondToPossessionDraftSavePage respondToPossessionDraftSavePage;
9497

@@ -98,9 +101,6 @@ class RespondPossessionClaimTest extends BaseEventTest {
98101
@Mock
99102
private UserInfo userInfo;
100103

101-
@Mock
102-
private DefendantResponseRepository defendantResponseRepository;
103-
104104
@Mock
105105
private LegalRepForDefendantAccessValidator legalRepForDefendantAccessValidator;
106106

@@ -130,7 +130,8 @@ void setUp() {
130130
draftCaseDataService,
131131
possessionClaimMerger,
132132
possessionClaimDraftBuilder,
133-
defendantOnlyDraftBuilder),
133+
defendantOnlyDraftBuilder,
134+
defendantResponseRepository),
134135
new LegalRepStartEventStrategy(pcsCaseService,
135136
legalRepForDefendantAccessValidator,
136137
securityContextService,
@@ -258,6 +259,8 @@ void shouldPopulatePossessionClaimResponseWhenUserIsMatchingDefendant_ForCitizen
258259
eq(EventId.respondPossessionClaim)
259260
);
260261
verify(defendantOnlyDraftBuilder).createDefendantOnlyDraft(mockResponse);
262+
verify(defendantResponseRepository).existsByClaimPcsCaseCaseReferenceAndPartyIdamId(
263+
TEST_CASE_REFERENCE, defendantUserId);
261264
}
262265

263266
@Test

src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/strategy/CitizenStartEventStrategyTest.java

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
import uk.gov.hmcts.reform.pcs.ccd.domain.Party;
1616
import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo;
1717
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantContactDetails;
18+
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponseStatus;
1819
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PossessionClaimResponse;
1920
import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity;
2021
import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity;
2122
import uk.gov.hmcts.reform.pcs.ccd.event.respondpossessionclaim.utils.DefendantOnlyDraftBuilder;
2223
import uk.gov.hmcts.reform.pcs.ccd.event.respondpossessionclaim.utils.PossessionClaimDraftBuilder;
2324
import uk.gov.hmcts.reform.pcs.ccd.event.respondpossessionclaim.utils.PossessionClaimMerger;
25+
import uk.gov.hmcts.reform.pcs.ccd.repository.DefendantResponseRepository;
2426
import uk.gov.hmcts.reform.pcs.ccd.service.DraftCaseDataService;
2527
import uk.gov.hmcts.reform.pcs.ccd.service.PcsCaseService;
2628
import uk.gov.hmcts.reform.pcs.ccd.service.party.DefendantAccessValidator;
@@ -65,6 +67,8 @@ class CitizenStartEventStrategyTest {
6567
private PossessionClaimDraftBuilder possessionClaimDraftBuilder;
6668
@Mock
6769
private DefendantOnlyDraftBuilder defendantOnlyDraftBuilder;
70+
@Mock
71+
private DefendantResponseRepository defendantResponseRepository;
6872

6973
private CitizenStartEventStrategy underTest;
7074

@@ -78,7 +82,8 @@ void setUp() {
7882
draftCaseDataService,
7983
possessionClaimMerger,
8084
possessionClaimDraftBuilder,
81-
defendantOnlyDraftBuilder
85+
defendantOnlyDraftBuilder,
86+
defendantResponseRepository
8287
);
8388
}
8489

@@ -407,6 +412,48 @@ void shouldThrowExceptionWhenNoDraft() {
407412
verify(possessionClaimMerger, never()).mergeLatestCaseData(any(), any(), any());
408413
}
409414

415+
@Test
416+
void shouldReturnSubmittedStatusWhenResponseAlreadySubmitted() {
417+
// Given
418+
UUID defendantUserId = UUID.randomUUID();
419+
PartyEntity defendantEntity = PartyEntity.builder().idamId(defendantUserId).build();
420+
PcsCaseEntity pcsCaseEntity = PcsCaseEntity.builder().build();
421+
422+
when(securityContextService.getCurrentUserId()).thenReturn(defendantUserId);
423+
when(defendantResponseRepository.existsByClaimPcsCaseCaseReferenceAndPartyIdamId(
424+
CASE_REFERENCE, defendantUserId))
425+
.thenReturn(true);
426+
when(pcsCaseService.loadCase(CASE_REFERENCE)).thenReturn(pcsCaseEntity);
427+
when(accessValidator.validateAndGetDefendant(pcsCaseEntity, defendantUserId)).thenReturn(defendantEntity);
428+
429+
// When
430+
PCSCase result = underTest.loadDraft(CASE_REFERENCE, PCSCase.builder().build());
431+
432+
// Then
433+
assertThat(result.getPossessionClaimResponse().getDefendantResponses().getStatus())
434+
.isEqualTo(DefendantResponseStatus.SUBMITTED);
435+
}
436+
437+
@Test
438+
void shouldNotTreatResponseAsSubmittedWhenCurrentUserIdIsNull() {
439+
// Given
440+
PartyEntity defendantEntity = PartyEntity.builder().build();
441+
PcsCaseEntity pcsCaseEntity = PcsCaseEntity.builder().build();
442+
443+
when(securityContextService.getCurrentUserId()).thenReturn(null);
444+
when(pcsCaseService.loadCase(CASE_REFERENCE)).thenReturn(pcsCaseEntity);
445+
when(accessValidator.validateAndGetDefendant(pcsCaseEntity, null)).thenReturn(defendantEntity);
446+
when(draftCaseDataService.hasUnsubmittedCaseData(CASE_REFERENCE, respondPossessionClaim)).thenReturn(false);
447+
when(responseMapper.mapFrom(any(PCSCase.class), eq(defendantEntity)))
448+
.thenReturn(PossessionClaimResponse.builder().build());
449+
450+
// When
451+
PCSCase result = underTest.loadDraft(CASE_REFERENCE, PCSCase.builder().build());
452+
453+
// Then
454+
assertThat(result.getPossessionClaimResponse().getDefendantResponses()).isNull();
455+
}
456+
410457
@Test
411458
void supports_WithCitizenUser_ReturnsTrue() {
412459
// when / then

src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoPreferNotToSay;
2222
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.CounterClaim;
2323
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.CounterClaimType;
24+
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponseStatus;
2425
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses;
2526
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.HouseholdCircumstances;
2627
import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PaymentAgreement;
@@ -53,6 +54,7 @@
5354
import java.time.Clock;
5455
import java.time.Instant;
5556
import java.time.LocalDate;
57+
import java.time.LocalDateTime;
5658
import java.time.ZoneOffset;
5759
import java.util.List;
5860
import java.util.Optional;
@@ -175,6 +177,8 @@ void shouldSaveDefendantResponseWithJpaProxies() {
175177
assertThat(savedResponse.getFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.YES);
176178
assertThat(savedResponse.getRentArrearsAmountConfirmation()).isEqualTo(YesNoNotSure.NO);
177179
assertThat(savedResponse.getLandlordRegistered()).isEqualTo(YesNoNotSure.YES);
180+
assertThat(savedResponse.getStatus()).isEqualTo(DefendantResponseStatus.SUBMITTED);
181+
assertThat(savedResponse.getResponseSubmittedDate()).isEqualTo(LocalDateTime.now(FIXED_UTC_CLOCK));
178182
verify(pcsCaseEntity).addDefendantResponse(savedResponse);
179183

180184
}
@@ -951,7 +955,7 @@ void shouldSaveCounterClaimWithAllFields() {
951955
assertThat(saved.getNeedHelpWithFees()).isEqualTo(VerticalYesNo.YES);
952956
assertThat(saved.getAppliedForHwf()).isEqualTo(VerticalYesNo.NO);
953957
assertThat(saved.getHwfReferenceNumber()).isEqualTo("HWF-123-456");
954-
assertThat(saved.getClaimSubmittedDate()).isEqualTo("2026-04-22T21:00");
958+
assertThat(saved.getClaimSubmittedDate()).isEqualTo(LocalDateTime.now(FIXED_UTC_CLOCK));
955959
assertThat(saved.getParty()).isEqualTo(partyEntity);
956960
}
957961

0 commit comments

Comments
 (0)