From ded4fe6c04d55167e08c9c4dd96d644b08c40ffd Mon Sep 17 00:00:00 2001 From: Alex Buzea Date: Mon, 9 Mar 2026 13:43:31 +0000 Subject: [PATCH 01/11] adding fields for data persistence of rent arrears page as per data model and updating existing tests --- .../DefendantResponses.java | 2 +- .../pcs/ccd/entity/DefendantResponseEntity.java | 15 +++++++++++++++ .../pcs/ccd/service/DefendantResponseService.java | 2 ++ .../V063__add_rent_arrears_response_fields.sql | 3 +++ .../SubmitEventHandlerTest.java | 2 +- .../RespondToPossessionDraftSavePageTest.java | 6 +++--- 6 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/db/migration/V063__add_rent_arrears_response_fields.sql diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java index 35a2aaf755..d2d511c344 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java @@ -27,7 +27,7 @@ public class DefendantResponses { private YesNoNotSure tenancyStartDateCorrect; @CCD - private YesNoNotSure oweRentArrears; + private YesNoNotSure rentArrearsAmountConfirmation; @CCD(typeOverride = FieldType.MoneyGBP) @JacksonMoneyGBP diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java index 1fe409bb6b..77ef9562a4 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java @@ -18,9 +18,15 @@ import lombok.Setter; import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; + +import uk.gov.hmcts.ccd.sdk.api.CCD; +import uk.gov.hmcts.ccd.sdk.type.FieldType; +import uk.gov.hmcts.reform.pcs.ccd.annotation.JacksonMoneyGBP; +import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoPreferNotToSay; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; +import java.math.BigDecimal; import java.util.UUID; @Entity @@ -51,4 +57,13 @@ public class DefendantResponseEntity { @JdbcTypeCode(SqlTypes.NAMED_ENUM) @Column(name = "received_free_legal_advice") private YesNoPreferNotToSay receivedFreeLegalAdvice; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + @Column(name = "rent_arrears_amount_confirmation") + private YesNoNotSure rentArrearsAmountConfirmation; + + @CCD(typeOverride = FieldType.MoneyGBP) + @JacksonMoneyGBP + private BigDecimal rentArrearsAmount; } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java index f797d33df1..47e10d770d 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java @@ -96,6 +96,8 @@ public void saveDefendantResponse(long caseReference, DefendantResponses respons .claim(claimRef) .party(partyRef) .receivedFreeLegalAdvice(responses.getReceivedFreeLegalAdvice()) + .rentArrearsAmountConfirmation(responses.getRentArrearsAmountConfirmation()) + .rentArrearsAmount(responses.getRentArrearsAmount()) .build(); defendantResponseRepository.save(defendantResponse); diff --git a/src/main/resources/db/migration/V063__add_rent_arrears_response_fields.sql b/src/main/resources/db/migration/V063__add_rent_arrears_response_fields.sql new file mode 100644 index 0000000000..c0eaa484c6 --- /dev/null +++ b/src/main/resources/db/migration/V063__add_rent_arrears_response_fields.sql @@ -0,0 +1,3 @@ +ALTER TABLE defendant_response + ADD COLUMN rent_arrears_amount_confirmation YES_NO_NOT_SURE, + ADD COLUMN rent_arrears_amount NUMERIC(10, 2); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandlerTest.java index 4dfacefada..c2e4369198 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandlerTest.java @@ -85,7 +85,7 @@ void shouldReturnErrorWhenPossessionClaimResponseIsNull() { void shouldAllowSubmitWithOnlyDefendantResponses() { DefendantResponses responses = DefendantResponses.builder() .tenancyTypeCorrect(YesNoNotSure.YES) - .oweRentArrears(YesNoNotSure.NO) + .rentArrearsAmountConfirmation(YesNoNotSure.NO) .build(); PCSCase caseData = createDraftSaveCaseData(null, responses); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionsclaim/RespondToPossessionDraftSavePageTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionsclaim/RespondToPossessionDraftSavePageTest.java index 42f55ac2f0..5ab0ae1602 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionsclaim/RespondToPossessionDraftSavePageTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionsclaim/RespondToPossessionDraftSavePageTest.java @@ -120,7 +120,7 @@ void shouldSkipValidationWhenPartyIsNull() { DefendantResponses responses = DefendantResponses.builder() .tenancyTypeCorrect(YesNoNotSure.YES) - .oweRentArrears(YesNoNotSure.NO) + .rentArrearsAmountConfirmation(YesNoNotSure.NO) .build(); PCSCase caseData = buildCaseData(contactDetails, responses); @@ -187,7 +187,7 @@ void shouldSaveDefendantResponsesData() { //Given DefendantResponses responses = DefendantResponses.builder() .tenancyTypeCorrect(YesNoNotSure.YES) - .oweRentArrears(YesNoNotSure.NO) + .rentArrearsAmountConfirmation(YesNoNotSure.NO) .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) .contactByEmail(VerticalYesNo.YES) .contactByPhone(VerticalYesNo.NO) @@ -207,7 +207,7 @@ void shouldSaveDefendantResponsesData() { PCSCase savedDraft = pcsCaseCaptor.getValue(); DefendantResponses savedResponses = savedDraft.getPossessionClaimResponse().getDefendantResponses(); assertThat(savedResponses.getTenancyTypeCorrect()).isEqualTo(YesNoNotSure.YES); - assertThat(savedResponses.getOweRentArrears()).isEqualTo(YesNoNotSure.NO); + assertThat(savedResponses.getRentArrearsAmountConfirmation()).isEqualTo(YesNoNotSure.NO); assertThat(savedResponses.getReceivedFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.YES); assertThat(savedResponses.getContactByEmail()).isEqualTo(VerticalYesNo.YES); assertThat(savedResponses.getContactByPhone()).isEqualTo(VerticalYesNo.NO); From efa25af2fa831fd55d9775adab63330a7c6ee9e6 Mon Sep 17 00:00:00 2001 From: arun Date: Thu, 12 Mar 2026 08:37:03 +0000 Subject: [PATCH 02/11] HDPI-3495: Fix migration naming and support 1 billion max --- ..._response_fields.sql => V063__add_rent_arrears_response.sql} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/resources/db/migration/{V063__add_rent_arrears_response_fields.sql => V063__add_rent_arrears_response.sql} (65%) diff --git a/src/main/resources/db/migration/V063__add_rent_arrears_response_fields.sql b/src/main/resources/db/migration/V063__add_rent_arrears_response.sql similarity index 65% rename from src/main/resources/db/migration/V063__add_rent_arrears_response_fields.sql rename to src/main/resources/db/migration/V063__add_rent_arrears_response.sql index c0eaa484c6..968b996da8 100644 --- a/src/main/resources/db/migration/V063__add_rent_arrears_response_fields.sql +++ b/src/main/resources/db/migration/V063__add_rent_arrears_response.sql @@ -1,3 +1,3 @@ ALTER TABLE defendant_response ADD COLUMN rent_arrears_amount_confirmation YES_NO_NOT_SURE, - ADD COLUMN rent_arrears_amount NUMERIC(10, 2); + ADD COLUMN rent_arrears_amount NUMERIC(12, 2); From 23a8791def5f8309c37767f7e745bd8c66882e42 Mon Sep 17 00:00:00 2001 From: arun Date: Thu, 12 Mar 2026 08:48:51 +0000 Subject: [PATCH 03/11] HDPI-3495: Add min/max validation and tests for rent arrears amount --- .../DefendantResponses.java | 9 ++- .../service/DefendantResponseServiceTest.java | 61 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java index d2d511c344..ea577da704 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java @@ -14,6 +14,9 @@ import java.math.BigDecimal; import java.time.LocalDate; +import static uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase.MAX_MONETARY_AMOUNT; +import static uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase.MIN_MONETARY_AMOUNT; + @Builder @Data @NoArgsConstructor @@ -29,7 +32,11 @@ public class DefendantResponses { @CCD private YesNoNotSure rentArrearsAmountConfirmation; - @CCD(typeOverride = FieldType.MoneyGBP) + @CCD( + typeOverride = FieldType.MoneyGBP, + min = MIN_MONETARY_AMOUNT, + max = MAX_MONETARY_AMOUNT + ) @JacksonMoneyGBP private BigDecimal rentArrearsAmount; diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index dd5e9e7170..654e1dc8c5 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -7,6 +7,7 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoPreferNotToSay; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; @@ -19,6 +20,7 @@ import uk.gov.hmcts.reform.pcs.exception.PartyNotFoundException; import uk.gov.hmcts.reform.pcs.security.SecurityContextService; +import java.math.BigDecimal; import java.util.Optional; import java.util.UUID; @@ -338,4 +340,63 @@ void shouldFollowOptimalExecutionOrder() { // 5. Save (only locks new row) verify(defendantResponseRepository).save(any(DefendantResponseEntity.class)); } + + @Test + void shouldSaveRentArrearsAmountUpToOneBillion() { + // Given - Maximum allowed amount (1 billion) + BigDecimal oneBillion = new BigDecimal("1000000000.00"); + + when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); + when(defendantResponseRepository.existsByClaimPcsCaseCaseReferenceAndPartyIdamId( + CASE_REFERENCE, USER_ID)).thenReturn(false); + when(partyService.getPartyEntityByIdamId(USER_ID, CASE_REFERENCE)).thenReturn(partyEntity); + when(partyEntity.getId()).thenReturn(PARTY_ID); + when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); + when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); + when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + + DefendantResponses responses = DefendantResponses.builder() + .rentArrearsAmountConfirmation(YesNoNotSure.YES) + .rentArrearsAmount(oneBillion) + .build(); + + // When + underTest.saveDefendantResponse(CASE_REFERENCE, responses); + + // Then + verify(defendantResponseRepository).save(responseCaptor.capture()); + DefendantResponseEntity savedResponse = responseCaptor.getValue(); + + assertThat(savedResponse.getRentArrearsAmountConfirmation()).isEqualTo(YesNoNotSure.YES); + assertThat(savedResponse.getRentArrearsAmount()).isEqualByComparingTo(oneBillion); + } + + @Test + void shouldSaveRentArrearsAmountWithDecimalPlaces() { + // Given - Amount with pennies + BigDecimal amountWithPennies = new BigDecimal("999999999.99"); + + when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); + when(defendantResponseRepository.existsByClaimPcsCaseCaseReferenceAndPartyIdamId( + CASE_REFERENCE, USER_ID)).thenReturn(false); + when(partyService.getPartyEntityByIdamId(USER_ID, CASE_REFERENCE)).thenReturn(partyEntity); + when(partyEntity.getId()).thenReturn(PARTY_ID); + when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); + when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); + when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + + DefendantResponses responses = DefendantResponses.builder() + .rentArrearsAmountConfirmation(YesNoNotSure.NO) + .rentArrearsAmount(amountWithPennies) + .build(); + + // When + underTest.saveDefendantResponse(CASE_REFERENCE, responses); + + // Then + verify(defendantResponseRepository).save(responseCaptor.capture()); + DefendantResponseEntity savedResponse = responseCaptor.getValue(); + + assertThat(savedResponse.getRentArrearsAmount()).isEqualByComparingTo(amountWithPennies); + } } From 3807b95517b78674be738ae3a3c6f349a4923c28 Mon Sep 17 00:00:00 2001 From: arun Date: Fri, 13 Mar 2026 13:46:53 +0000 Subject: [PATCH 04/11] HDPI-3495: Rename migration V063 rent arrears to V064 to fix conflict with tenancy details V063 --- ...t_arrears_response.sql => V064__add_rent_arrears_response.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V063__add_rent_arrears_response.sql => V064__add_rent_arrears_response.sql} (100%) diff --git a/src/main/resources/db/migration/V063__add_rent_arrears_response.sql b/src/main/resources/db/migration/V064__add_rent_arrears_response.sql similarity index 100% rename from src/main/resources/db/migration/V063__add_rent_arrears_response.sql rename to src/main/resources/db/migration/V064__add_rent_arrears_response.sql From f9a2eff5c8b4f5b8750d9deee7057d582fb0f4b4 Mon Sep 17 00:00:00 2001 From: arun Date: Fri, 13 Mar 2026 14:52:35 +0000 Subject: [PATCH 05/11] HDPI-3495: Remove rentArrearsAmount field from final submit, keep in draft only --- .../ccd/entity/DefendantResponseEntity.java | 8 --- .../ccd/service/DefendantResponseService.java | 1 - .../V064__add_rent_arrears_response.sql | 3 +- .../service/DefendantResponseServiceTest.java | 60 ------------------- 4 files changed, 1 insertion(+), 71 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java index cdc388bfb2..a4195bf9e0 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java @@ -19,14 +19,10 @@ import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; -import uk.gov.hmcts.ccd.sdk.api.CCD; -import uk.gov.hmcts.ccd.sdk.type.FieldType; -import uk.gov.hmcts.reform.pcs.ccd.annotation.JacksonMoneyGBP; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoPreferNotToSay; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; -import java.math.BigDecimal; import java.time.LocalDate; import java.util.UUID; @@ -64,10 +60,6 @@ public class DefendantResponseEntity { @Column(name = "rent_arrears_amount_confirmation") private YesNoNotSure rentArrearsAmountConfirmation; - @CCD(typeOverride = FieldType.MoneyGBP) - @JacksonMoneyGBP - private BigDecimal rentArrearsAmount; - @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) @Column(name = "tenancy_start_date_confirmation") diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java index 006bc6cc87..8a8f8164e6 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java @@ -99,7 +99,6 @@ public void saveDefendantResponse(long caseReference, DefendantResponses respons .party(partyRef) .receivedFreeLegalAdvice(responses.getReceivedFreeLegalAdvice()) .rentArrearsAmountConfirmation(responses.getRentArrearsAmountConfirmation()) - .rentArrearsAmount(responses.getRentArrearsAmount()) .tenancyStartDateConfirmation(tenancyStartDateConfirmation) .tenancyStartDate( tenancyStartDateConfirmation != null && tenancyStartDateConfirmation != YesNoNotSure.NOT_SURE diff --git a/src/main/resources/db/migration/V064__add_rent_arrears_response.sql b/src/main/resources/db/migration/V064__add_rent_arrears_response.sql index 968b996da8..8c57809629 100644 --- a/src/main/resources/db/migration/V064__add_rent_arrears_response.sql +++ b/src/main/resources/db/migration/V064__add_rent_arrears_response.sql @@ -1,3 +1,2 @@ ALTER TABLE defendant_response - ADD COLUMN rent_arrears_amount_confirmation YES_NO_NOT_SURE, - ADD COLUMN rent_arrears_amount NUMERIC(12, 2); + ADD COLUMN rent_arrears_amount_confirmation YES_NO_NOT_SURE; diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index dd46b7f8da..853df4d005 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -23,7 +23,6 @@ import uk.gov.hmcts.reform.pcs.exception.PartyNotFoundException; import uk.gov.hmcts.reform.pcs.security.SecurityContextService; -import java.math.BigDecimal; import java.time.LocalDate; import java.util.Optional; import java.util.UUID; @@ -346,65 +345,6 @@ void shouldFollowOptimalExecutionOrder() { verify(defendantResponseRepository).save(any(DefendantResponseEntity.class)); } - @Test - void shouldSaveRentArrearsAmountUpToOneBillion() { - // Given - Maximum allowed amount (1 billion) - BigDecimal oneBillion = new BigDecimal("1000000000.00"); - - when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); - when(defendantResponseRepository.existsByClaimPcsCaseCaseReferenceAndPartyIdamId( - CASE_REFERENCE, USER_ID)).thenReturn(false); - when(partyService.getPartyEntityByIdamId(USER_ID, CASE_REFERENCE)).thenReturn(partyEntity); - when(partyEntity.getId()).thenReturn(PARTY_ID); - when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); - when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); - when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); - - DefendantResponses responses = DefendantResponses.builder() - .rentArrearsAmountConfirmation(YesNoNotSure.YES) - .rentArrearsAmount(oneBillion) - .build(); - - // When - underTest.saveDefendantResponse(CASE_REFERENCE, responses); - - // Then - verify(defendantResponseRepository).save(responseCaptor.capture()); - DefendantResponseEntity savedResponse = responseCaptor.getValue(); - - assertThat(savedResponse.getRentArrearsAmountConfirmation()).isEqualTo(YesNoNotSure.YES); - assertThat(savedResponse.getRentArrearsAmount()).isEqualByComparingTo(oneBillion); - } - - @Test - void shouldSaveRentArrearsAmountWithDecimalPlaces() { - // Given - Amount with pennies - BigDecimal amountWithPennies = new BigDecimal("999999999.99"); - - when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); - when(defendantResponseRepository.existsByClaimPcsCaseCaseReferenceAndPartyIdamId( - CASE_REFERENCE, USER_ID)).thenReturn(false); - when(partyService.getPartyEntityByIdamId(USER_ID, CASE_REFERENCE)).thenReturn(partyEntity); - when(partyEntity.getId()).thenReturn(PARTY_ID); - when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); - when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); - when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); - - DefendantResponses responses = DefendantResponses.builder() - .rentArrearsAmountConfirmation(YesNoNotSure.NO) - .rentArrearsAmount(amountWithPennies) - .build(); - - // When - underTest.saveDefendantResponse(CASE_REFERENCE, responses); - - // Then - verify(defendantResponseRepository).save(responseCaptor.capture()); - DefendantResponseEntity savedResponse = responseCaptor.getValue(); - - assertThat(savedResponse.getRentArrearsAmount()).isEqualByComparingTo(amountWithPennies); - } - @Test void shouldNotSaveDefendantResponseWhenTenancyDateIsEmpty() { // Given From 9d03f5931a5ba4cf2817d19dd578d7c243e1d833 Mon Sep 17 00:00:00 2001 From: arun Date: Tue, 17 Mar 2026 12:47:43 +0000 Subject: [PATCH 06/11] HDPI-3495: Add defendantNameConfirmation field, restore V065/V066 migrations, renumber rent arrears to V067 --- .../domain/respondpossessionclaim/DefendantResponses.java | 3 +++ .../reform/pcs/ccd/entity/DefendantResponseEntity.java | 6 ++++++ .../pcs/ccd/page/resumepossessionclaim/RentArrears.java | 4 ++-- .../reform/pcs/ccd/service/DefendantResponseService.java | 1 + .../V065__add_name_confirmation_to_defendant_response.sql | 2 ++ .../db/migration/V066__add_date_of_birth_to_party.sql | 2 ++ ...ars_response.sql => V067__add_rent_arrears_response.sql} | 0 7 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/db/migration/V065__add_name_confirmation_to_defendant_response.sql create mode 100644 src/main/resources/db/migration/V066__add_date_of_birth_to_party.sql rename src/main/resources/db/migration/{V065__add_rent_arrears_response.sql => V067__add_rent_arrears_response.sql} (100%) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java index 2a4933d96c..1eb80f5e15 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java @@ -43,6 +43,9 @@ public class DefendantResponses { @JacksonMoneyGBP private BigDecimal rentArrearsAmount; + @CCD + private VerticalYesNo defendantNameConfirmation; + @CCD private YesNoNotSure noticeReceived; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java index 60ea0d4032..e25db93e35 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java @@ -19,6 +19,7 @@ import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; +import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoPreferNotToSay; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; @@ -60,6 +61,11 @@ public class DefendantResponseEntity { @Column(name = "rent_arrears_amount_confirmation") private YesNoNotSure rentArrearsAmountConfirmation; + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + @Column(name = "defendant_name_confirmation") + private VerticalYesNo defendantNameConfirmation; + @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) @Column(name = "tenancy_start_date_confirmation") diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/RentArrears.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/RentArrears.java index 64761f7729..3d77bbcd67 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/RentArrears.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/RentArrears.java @@ -51,7 +51,7 @@ public void addTo(PageBuilder pageBuilder) { """) - .mandatory(RentArrearsSection::getStatementDocuments) + .optional(RentArrearsSection::getStatementDocuments) // ---------- Total arrears ---------- .label("rentArrears-totalArrears-separator", "---") @@ -61,7 +61,7 @@ public void addTo(PageBuilder pageBuilder) {

How much are the total rent arrears as shown on the rent statement?

""") - .mandatory(RentArrearsSection::getTotal) + .optional(RentArrearsSection::getTotal) // ---------- Third-party payments ---------- .label("rentArrears-thirdPartyPayments-separator", "---") diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java index 795ad097dd..06e656081f 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java @@ -99,6 +99,7 @@ public void saveDefendantResponse(long caseReference, DefendantResponses respons .party(partyRef) .receivedFreeLegalAdvice(responses.getReceivedFreeLegalAdvice()) .rentArrearsAmountConfirmation(responses.getRentArrearsAmountConfirmation()) + .defendantNameConfirmation(responses.getDefendantNameConfirmation()) .landlordRegistered(responses.getLandlordRegistered()) .tenancyStartDateConfirmation(tenancyStartDateConfirmation) .tenancyStartDate( diff --git a/src/main/resources/db/migration/V065__add_name_confirmation_to_defendant_response.sql b/src/main/resources/db/migration/V065__add_name_confirmation_to_defendant_response.sql new file mode 100644 index 0000000000..f1df538ed2 --- /dev/null +++ b/src/main/resources/db/migration/V065__add_name_confirmation_to_defendant_response.sql @@ -0,0 +1,2 @@ +ALTER TABLE defendant_response + ADD COLUMN defendant_name_confirmation YES_NO; diff --git a/src/main/resources/db/migration/V066__add_date_of_birth_to_party.sql b/src/main/resources/db/migration/V066__add_date_of_birth_to_party.sql new file mode 100644 index 0000000000..17d3850314 --- /dev/null +++ b/src/main/resources/db/migration/V066__add_date_of_birth_to_party.sql @@ -0,0 +1,2 @@ +ALTER TABLE party + ADD COLUMN dob DATE; diff --git a/src/main/resources/db/migration/V065__add_rent_arrears_response.sql b/src/main/resources/db/migration/V067__add_rent_arrears_response.sql similarity index 100% rename from src/main/resources/db/migration/V065__add_rent_arrears_response.sql rename to src/main/resources/db/migration/V067__add_rent_arrears_response.sql From 1aead6a8f3e41b67901812086462ecd7a11f7072 Mon Sep 17 00:00:00 2001 From: arun Date: Tue, 17 Mar 2026 13:05:22 +0000 Subject: [PATCH 07/11] HDPI-3495: Restore RentArrears.java from master (local dev changes removed) --- .../pcs/ccd/page/resumepossessionclaim/RentArrears.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/RentArrears.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/RentArrears.java index 3d77bbcd67..64761f7729 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/RentArrears.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/RentArrears.java @@ -51,7 +51,7 @@ public void addTo(PageBuilder pageBuilder) { """) - .optional(RentArrearsSection::getStatementDocuments) + .mandatory(RentArrearsSection::getStatementDocuments) // ---------- Total arrears ---------- .label("rentArrears-totalArrears-separator", "---") @@ -61,7 +61,7 @@ public void addTo(PageBuilder pageBuilder) {

How much are the total rent arrears as shown on the rent statement?

""") - .optional(RentArrearsSection::getTotal) + .mandatory(RentArrearsSection::getTotal) // ---------- Third-party payments ---------- .label("rentArrears-thirdPartyPayments-separator", "---") From 8c95d16ff68c503865457c2038e3a10f5c885b75 Mon Sep 17 00:00:00 2001 From: arun Date: Tue, 17 Mar 2026 13:12:11 +0000 Subject: [PATCH 08/11] HDPI-3495: Add TODO comment for rentArrearsAmount future party attribute storage --- .../hmcts/reform/pcs/ccd/service/DefendantResponseService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java index 06e656081f..d9f4d7aae4 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java @@ -94,6 +94,7 @@ public void saveDefendantResponse(long caseReference, DefendantResponses respons ClaimEntity claimRef = claimRepository.getReferenceById(claimId); YesNoNotSure tenancyStartDateConfirmation = responses.getTenancyStartDateConfirmation(); + // TODO: rentArrearsAmount on final submit will be later stored in party attribute assertion DefendantResponseEntity defendantResponse = DefendantResponseEntity.builder() .claim(claimRef) .party(partyRef) From 50c4f572775e5c376e620f6d6135f6ba2c0b8100 Mon Sep 17 00:00:00 2001 From: arun Date: Thu, 19 Mar 2026 12:48:00 +0000 Subject: [PATCH 09/11] HDPI-3495: Remove duplicate V067 migration file as master V067 already includes rent_arrears_amount_confirmation --- .../resources/db/migration/V067__add_rent_arrears_response.sql | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 src/main/resources/db/migration/V067__add_rent_arrears_response.sql diff --git a/src/main/resources/db/migration/V067__add_rent_arrears_response.sql b/src/main/resources/db/migration/V067__add_rent_arrears_response.sql deleted file mode 100644 index 8c57809629..0000000000 --- a/src/main/resources/db/migration/V067__add_rent_arrears_response.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE defendant_response - ADD COLUMN rent_arrears_amount_confirmation YES_NO_NOT_SURE; From d74a3dd9f93af70f06ba68c1d08cf8866e65ee6d Mon Sep 17 00:00:00 2001 From: arun Date: Fri, 20 Mar 2026 12:50:10 +0000 Subject: [PATCH 10/11] HDPI-3495: Add disputeClaim and disputeClaimDetails fields with tests for draft save and final submit --- .../DefendantResponses.java | 6 +++ .../DefendantResponseService.java | 2 + .../RespondToPossessionDraftSavePageTest.java | 31 +++++++++++++ .../service/DefendantResponseServiceTest.java | 46 +++++++++++++++++++ 4 files changed, 85 insertions(+) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java index 2bd0201aa7..38f9354e04 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java @@ -74,6 +74,12 @@ public class DefendantResponses { @CCD private YesNoNotSure landlordRegistered; + @CCD + private uk.gov.hmcts.ccd.sdk.type.YesOrNo disputeClaim; + + @CCD + private String disputeClaimDetails; + @CCD(access = {CitizenAccess.class}) private ReasonableAdjustments reasonableAdjustments; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java index 1145876791..9b5190097b 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java @@ -129,6 +129,8 @@ private DefendantResponseEntity buildDefendantResponseEntity(ClaimEntity claimRe ) .noticeReceivedDate(responses.getNoticeReceivedDate()) .rentArrearsAmountConfirmation(responses.getRentArrearsAmountConfirmation()) + .disputeClaim(responses.getDisputeClaim()) + .disputeClaimDetails(responses.getDisputeClaimDetails()) .build(); //set bidirectional relationship with the pcs case diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionsclaim/RespondToPossessionDraftSavePageTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionsclaim/RespondToPossessionDraftSavePageTest.java index ff3f9e4f3a..4af68cf259 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionsclaim/RespondToPossessionDraftSavePageTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionsclaim/RespondToPossessionDraftSavePageTest.java @@ -344,6 +344,37 @@ void shouldSkipValidationWhenDefendantContactDetailsIsNull() { assertThat(savedDraft.getPossessionClaimResponse().getDefendantResponses()).isEqualTo(responses); } + @Test + void shouldSaveDisputeClaimAndDisputeClaimDetailsInDraft() { + //Given + String disputeDetails = "I dispute the rent arrears amount because the landlord has " + + "not provided accurate records"; + DefendantResponses responses = DefendantResponses.builder() + .disputeClaim(YesOrNo.YES) + .disputeClaimDetails(disputeDetails) + .freeLegalAdvice(YesNoPreferNotToSay.YES) + .build(); + + PCSCase caseData = buildCaseData(PossessionClaimResponse.builder() + .defendantResponses(responses) + .build()); + + //When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + //Then + assertThat(response.getErrors()).isNull(); + verifyNoInteractions(immutableFieldValidator); + verify(draftCaseDataService).patchUnsubmittedEventData( + eq(TEST_CASE_REFERENCE), pcsCaseCaptor.capture(), eq(respondPossessionClaim) + ); + PCSCase savedDraft = pcsCaseCaptor.getValue(); + DefendantResponses savedResponses = savedDraft.getPossessionClaimResponse().getDefendantResponses(); + assertThat(savedResponses.getDisputeClaim()).isEqualTo(YesOrNo.YES); + assertThat(savedResponses.getDisputeClaimDetails()).isEqualTo(disputeDetails); + assertThat(savedResponses.getFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.YES); + } + @Test void shouldReturnErrorWhenDraftSaveFails() { //Given diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index eca3ac009b..8b200c127c 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -588,4 +588,50 @@ private static Stream tenancyStartDateConfirmationScenarios() { ); } + + @ParameterizedTest(name = "disputeClaim={0}, disputeClaimDetails={1}") + @MethodSource("disputeClaimPersistenceScenarios") + void shouldPersistDisputeClaimAndDisputeClaimDetails( + YesOrNo disputeClaim, + String disputeClaimDetails + ) { + // Given + when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); + when(defendantResponseRepository.existsByClaimPcsCaseCaseReferenceAndPartyIdamId( + CASE_REFERENCE, USER_ID)).thenReturn(false); + + stubPartyLookup(); + stubClaimLookup(); + + DefendantResponses responses = DefendantResponses.builder() + .disputeClaim(disputeClaim) + .disputeClaimDetails(disputeClaimDetails) + .build(); + + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .build(); + + // When + underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse); + + // Then + verify(defendantResponseRepository).save(responseCaptor.capture()); + DefendantResponseEntity savedResponse = responseCaptor.getValue(); + + assertThat(savedResponse.getDisputeClaim()).isEqualTo(disputeClaim); + assertThat(savedResponse.getDisputeClaimDetails()).isEqualTo(disputeClaimDetails); + } + + private static Stream disputeClaimPersistenceScenarios() { + return Stream.of( + Arguments.of(YesOrNo.YES, + "I dispute the rent arrears amount because the landlord has not provided accurate records"), + Arguments.of(YesOrNo.NO, null), + Arguments.of(YesOrNo.YES, + "The property has significant disrepair issues that have not been addressed"), + Arguments.of(null, null), + Arguments.of(YesOrNo.YES, null) + ); + } } From 738d01ed529bbb5ecaa77bf9c7f9c72b17733b9a Mon Sep 17 00:00:00 2001 From: arun Date: Tue, 24 Mar 2026 19:31:03 +0000 Subject: [PATCH 11/11] =?UTF-8?q?HDPI-3495:=20Remove=20min/max=20validatio?= =?UTF-8?q?n=20from=20rentArrearsAmount=20to=20support=20up=20to=20=C2=A31?= =?UTF-8?q?=20billion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../respondpossessionclaim/DefendantResponses.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java index 38f9354e04..86692c5f44 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java @@ -15,9 +15,6 @@ import java.math.BigDecimal; import java.time.LocalDate; -import static uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase.MAX_MONETARY_AMOUNT; -import static uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase.MIN_MONETARY_AMOUNT; - @Builder @Data @NoArgsConstructor @@ -36,11 +33,7 @@ public class DefendantResponses { @CCD private YesNoNotSure rentArrearsAmountConfirmation; - @CCD( - typeOverride = FieldType.MoneyGBP, - min = MIN_MONETARY_AMOUNT, - max = MAX_MONETARY_AMOUNT - ) + @CCD(typeOverride = FieldType.MoneyGBP) @JacksonMoneyGBP private BigDecimal rentArrearsAmount;