From da327c631afea17a087c0e0bf32cf1a3fb8dbc83 Mon Sep 17 00:00:00 2001 From: arun Date: Sat, 21 Mar 2026 21:23:52 +0000 Subject: [PATCH 01/15] HDPI-3764: Add regular income fields to household circumstances for draft save and final submit --- .../HouseholdCircumstances.java | 39 ++++++++++ .../HouseholdCircumstancesEntity.java | 36 +++++++++ .../V070__add_regular_income_fields.sql | 73 +++++++++++++++++++ .../SubmitEventHandlerTest.java | 65 +++++++++++++++++ .../RespondToPossessionDraftSavePageTest.java | 60 +++++++++++++++ 5 files changed, 273 insertions(+) create mode 100644 src/main/resources/db/migration/V070__add_regular_income_fields.sql diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java index 63b5b90d92..0678697b95 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java @@ -8,6 +8,8 @@ import uk.gov.hmcts.ccd.sdk.api.CCD; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; +import java.math.BigDecimal; + @Builder @Data @NoArgsConstructor @@ -17,4 +19,41 @@ public class HouseholdCircumstances { @CCD private YesOrNo dependantChildren; + // Regular Income Fields (HDPI-3764) + @CCD + private YesOrNo incomeFromJobs; + + @CCD + private BigDecimal incomeFromJobsAmount; + + @CCD + private String incomeFromJobsFrequency; + + @CCD + private YesOrNo pension; + + @CCD + private BigDecimal pensionAmount; + + @CCD + private String pensionFrequency; + + @CCD + private YesOrNo universalCreditIncome; + + @CCD + private YesOrNo otherBenefits; + + @CCD + private BigDecimal otherBenefitsAmount; + + @CCD + private String otherBenefitsFrequency; + + @CCD + private YesOrNo moneyFromElsewhere; + + @CCD + private String moneyFromElsewhereDetails; + } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java index 59d01f0769..b717ad5ff1 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java @@ -91,6 +91,42 @@ public class HouseholdCircumstancesEntity { private LocalDate ucApplicationDate; + // Regular Income Fields (HDPI-3764) + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo incomeFromJobs; + + private BigDecimal incomeFromJobsAmount; + + private String incomeFromJobsFrequency; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo pension; + + private BigDecimal pensionAmount; + + private String pensionFrequency; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo universalCreditIncome; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo otherBenefits; + + private BigDecimal otherBenefitsAmount; + + private String otherBenefitsFrequency; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo moneyFromElsewhere; + + private String moneyFromElsewhereDetails; + + // Priority Debts and Expenses @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo priorityDebts; diff --git a/src/main/resources/db/migration/V070__add_regular_income_fields.sql b/src/main/resources/db/migration/V070__add_regular_income_fields.sql new file mode 100644 index 0000000000..28e7397d2a --- /dev/null +++ b/src/main/resources/db/migration/V070__add_regular_income_fields.sql @@ -0,0 +1,73 @@ +-- HDPI-3764: Add missing columns for regular income step +-- Following existing pattern: YES_NO for checkboxes, DECIMAL(18,2) for amounts (stored in pence), VARCHAR(60) for frequency +-- Stateless architecture: Every UI field must have corresponding database column for exact state reconstruction + +-- Income from all jobs you do +ALTER TABLE household_circumstances +ADD COLUMN income_from_jobs YES_NO; + +ALTER TABLE household_circumstances +ADD COLUMN income_from_jobs_amount DECIMAL(18,2); + +ALTER TABLE household_circumstances +ADD COLUMN income_from_jobs_frequency VARCHAR(60); + +-- Pension - state and private +ALTER TABLE household_circumstances +ADD COLUMN pension YES_NO; + +ALTER TABLE household_circumstances +ADD COLUMN pension_amount DECIMAL(18,2); + +ALTER TABLE household_circumstances +ADD COLUMN pension_frequency VARCHAR(60); + +-- Universal Credit (income received - distinct from application question) +-- Note: Separate from existing 'universal_credit' YES_NO which tracks application status +-- Note: Amount and frequency excluded pending BA clarification - checkbox used for routing only +ALTER TABLE household_circumstances +ADD COLUMN universal_credit_income YES_NO; + +-- Other benefits and credits +ALTER TABLE household_circumstances +ADD COLUMN other_benefits YES_NO; + +ALTER TABLE household_circumstances +ADD COLUMN other_benefits_amount DECIMAL(18,2); + +ALTER TABLE household_circumstances +ADD COLUMN other_benefits_frequency VARCHAR(60); + +-- Money from somewhere else +ALTER TABLE household_circumstances +ADD COLUMN money_from_elsewhere YES_NO; + +ALTER TABLE household_circumstances +ADD COLUMN money_from_elsewhere_details VARCHAR(500); + +-- Add comments for documentation +COMMENT ON COLUMN household_circumstances.income_from_jobs IS 'Checkbox: Does defendant receive income from jobs?'; +COMMENT ON COLUMN household_circumstances.income_from_jobs_amount IS 'Total amount received from all jobs - stored in pence'; +COMMENT ON COLUMN household_circumstances.income_from_jobs_frequency IS 'Payment frequency: WEEK or MONTH'; + +COMMENT ON COLUMN household_circumstances.pension IS 'Checkbox: Does defendant receive pension income?'; +COMMENT ON COLUMN household_circumstances.pension_amount IS 'Total pension amount (state and private) - stored in pence'; +COMMENT ON COLUMN household_circumstances.pension_frequency IS 'Payment frequency: WEEK or MONTH'; + +COMMENT ON COLUMN household_circumstances.universal_credit_income IS 'Checkbox: Does defendant receive Universal Credit? (routing only - amount/frequency excluded pending BA clarification)'; + +COMMENT ON COLUMN household_circumstances.other_benefits IS 'Checkbox: Does defendant receive other benefits/credits?'; +COMMENT ON COLUMN household_circumstances.other_benefits_amount IS 'Total other benefits and credits amount - stored in pence'; +COMMENT ON COLUMN household_circumstances.other_benefits_frequency IS 'Payment frequency: WEEK or MONTH'; + +COMMENT ON COLUMN household_circumstances.money_from_elsewhere IS 'Checkbox: Does defendant receive money from other sources?'; +COMMENT ON COLUMN household_circumstances.money_from_elsewhere_details IS 'Description of other income sources and amounts (e.g., child maintenance)'; + +-- Note: The existing 'regular_income VARCHAR(60)' column can remain for backward compatibility +-- or be used as a denormalized cache, but these 12 new columns are the source of truth +-- +-- Total columns added: 12 +-- - 5 YES_NO checkboxes (income_from_jobs, pension, universal_credit_income, other_benefits, money_from_elsewhere) +-- - 3 DECIMAL amounts (income_from_jobs_amount, pension_amount, other_benefits_amount) +-- - 3 VARCHAR(60) frequencies (income_from_jobs_frequency, pension_frequency, other_benefits_frequency) +-- - 1 VARCHAR(500) details (money_from_elsewhere_details) 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 45e3da0444..354307f3cb 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 @@ -16,6 +16,7 @@ import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantContactDetails; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.HouseholdCircumstances; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PossessionClaimResponse; import uk.gov.hmcts.reform.pcs.ccd.service.DraftCaseDataService; import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.ClaimResponseService; @@ -275,6 +276,70 @@ void shouldHandleExceptionFromContactPreferencesService() { verify(claimResponseService).saveDraftData(response, CASE_REFERENCE); } + @Test + void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { + // Given - HDPI-3764: Regular income fields for final submit + HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() + .incomeFromJobs(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .incomeFromJobsAmount(new java.math.BigDecimal("200000")) // £2000.00 in pence + .incomeFromJobsFrequency("MONTH") + .pension(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO) + .universalCreditIncome(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .otherBenefits(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO) + .moneyFromElsewhere(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .moneyFromElsewhereDetails("Receive child support payments") + .build(); + + DefendantResponses defendantResponses = DefendantResponses.builder() + .householdCircumstances(householdCircumstances) + .contactByEmail(VerticalYesNo.YES) + .build(); + + PossessionClaimResponse response = PossessionClaimResponse.builder() + .defendantResponses(defendantResponses) + .build(); + + PCSCase caseData = PCSCase.builder() + .possessionClaimResponse(response) + .build(); + + stubDraft(caseData); + + EventPayload eventPayload = createEventPayload(caseData); + + // When + SubmitResponse result = underTest.submit(eventPayload); + + // Then + assertThat(result).isNotNull(); + assertThat(result.getErrors()).isNullOrEmpty(); + + // Verify the response object with household circumstances is passed to the service + ArgumentCaptor responseCaptor = + ArgumentCaptor.forClass(PossessionClaimResponse.class); + verify(claimResponseService).saveDraftData(responseCaptor.capture(), eq(CASE_REFERENCE)); + + PossessionClaimResponse capturedResponse = responseCaptor.getValue(); + HouseholdCircumstances capturedHousehold = capturedResponse.getDefendantResponses() + .getHouseholdCircumstances(); + + // Assert all regular income fields are submitted correctly + assertThat(capturedHousehold.getIncomeFromJobs()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(capturedHousehold.getIncomeFromJobsAmount()).isEqualByComparingTo("200000"); + assertThat(capturedHousehold.getIncomeFromJobsFrequency()).isEqualTo("MONTH"); + + assertThat(capturedHousehold.getPension()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO); + assertThat(capturedHousehold.getUniversalCreditIncome()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(capturedHousehold.getOtherBenefits()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO); + + assertThat(capturedHousehold.getMoneyFromElsewhere()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(capturedHousehold.getMoneyFromElsewhereDetails()) + .isEqualTo("Receive child support payments"); + + verify(defendantResponseService).saveDefendantResponse(CASE_REFERENCE, capturedResponse); + verify(draftCaseDataService).deleteUnsubmittedCaseData(CASE_REFERENCE, respondPossessionClaim); + } + @Test void shouldCallContactPreferencesServiceBeforeReturningSuccess() { // Given 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..74e026c3d5 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,66 @@ void shouldSkipValidationWhenDefendantContactDetailsIsNull() { assertThat(savedDraft.getPossessionClaimResponse().getDefendantResponses()).isEqualTo(responses); } + @Test + void shouldSaveRegularIncomeFieldsInDraft() { + // Given - HDPI-3764: Regular income fields + HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() + .incomeFromJobs(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .incomeFromJobsAmount(new java.math.BigDecimal("150000")) // £1500.00 in pence + .incomeFromJobsFrequency("MONTH") + .pension(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .pensionAmount(new java.math.BigDecimal("50000")) // £500.00 in pence + .pensionFrequency("MONTH") + .universalCreditIncome(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO) + .otherBenefits(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .otherBenefitsAmount(new java.math.BigDecimal("20000")) // £200.00 in pence + .otherBenefitsFrequency("WEEK") + .moneyFromElsewhere(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .moneyFromElsewhereDetails("Child maintenance payments of £100 per week") + .build(); + + DefendantResponses responses = DefendantResponses.builder() + .householdCircumstances(householdCircumstances) + .build(); + + PCSCase caseData = buildCaseData(PossessionClaimResponse.builder() + .defendantResponses(responses) + .build()); + + // When + AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); + + // Then + assertThat(response.getErrors()).isNull(); + verify(draftCaseDataService).patchUnsubmittedEventData( + eq(TEST_CASE_REFERENCE), pcsCaseCaptor.capture(), eq(respondPossessionClaim) + ); + + PCSCase savedDraft = pcsCaseCaptor.getValue(); + HouseholdCircumstances savedHousehold = savedDraft.getPossessionClaimResponse() + .getDefendantResponses() + .getHouseholdCircumstances(); + + // Assert all regular income fields are saved correctly + assertThat(savedHousehold.getIncomeFromJobs()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(savedHousehold.getIncomeFromJobsAmount()).isEqualByComparingTo("150000"); + assertThat(savedHousehold.getIncomeFromJobsFrequency()).isEqualTo("MONTH"); + + assertThat(savedHousehold.getPension()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(savedHousehold.getPensionAmount()).isEqualByComparingTo("50000"); + assertThat(savedHousehold.getPensionFrequency()).isEqualTo("MONTH"); + + assertThat(savedHousehold.getUniversalCreditIncome()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO); + + assertThat(savedHousehold.getOtherBenefits()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(savedHousehold.getOtherBenefitsAmount()).isEqualByComparingTo("20000"); + assertThat(savedHousehold.getOtherBenefitsFrequency()).isEqualTo("WEEK"); + + assertThat(savedHousehold.getMoneyFromElsewhere()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(savedHousehold.getMoneyFromElsewhereDetails()) + .isEqualTo("Child maintenance payments of £100 per week"); + } + @Test void shouldReturnErrorWhenDraftSaveFails() { //Given From 629c35a3f40d99adefd20c255d2ea0ec215d7958 Mon Sep 17 00:00:00 2001 From: arun Date: Sat, 21 Mar 2026 21:49:43 +0000 Subject: [PATCH 02/15] HDPI-3764: Add shareIncomeExpenseDetails field to household circumstances with draft save and final submit tests --- .../HouseholdCircumstances.java | 4 ++++ .../SubmitEventHandlerTest.java | 24 +++++++++++-------- .../RespondToPossessionDraftSavePageTest.java | 23 ++++++++++-------- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java index 0678697b95..b02f47614c 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java @@ -19,6 +19,10 @@ public class HouseholdCircumstances { @CCD private YesOrNo dependantChildren; + // Income & Expense Control Field (HDPI-3764) + @CCD + private YesOrNo shareIncomeExpenseDetails; + // Regular Income Fields (HDPI-3764) @CCD private YesOrNo incomeFromJobs; 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 354307f3cb..0bab6e448a 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 @@ -9,6 +9,7 @@ import uk.gov.hmcts.ccd.sdk.api.EventPayload; import uk.gov.hmcts.ccd.sdk.api.callback.SubmitResponse; import uk.gov.hmcts.ccd.sdk.type.AddressUK; +import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; import uk.gov.hmcts.reform.pcs.ccd.domain.Party; import uk.gov.hmcts.reform.pcs.ccd.domain.State; @@ -280,13 +281,14 @@ void shouldHandleExceptionFromContactPreferencesService() { void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { // Given - HDPI-3764: Regular income fields for final submit HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() - .incomeFromJobs(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .shareIncomeExpenseDetails(YesOrNo.YES) + .incomeFromJobs(YesOrNo.YES) .incomeFromJobsAmount(new java.math.BigDecimal("200000")) // £2000.00 in pence .incomeFromJobsFrequency("MONTH") - .pension(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO) - .universalCreditIncome(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) - .otherBenefits(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO) - .moneyFromElsewhere(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .pension(YesOrNo.NO) + .universalCreditIncome(YesOrNo.YES) + .otherBenefits(YesOrNo.NO) + .moneyFromElsewhere(YesOrNo.YES) .moneyFromElsewhereDetails("Receive child support payments") .build(); @@ -324,15 +326,17 @@ void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { .getHouseholdCircumstances(); // Assert all regular income fields are submitted correctly - assertThat(capturedHousehold.getIncomeFromJobs()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(capturedHousehold.getShareIncomeExpenseDetails()).isEqualTo(YesOrNo.YES); + + assertThat(capturedHousehold.getIncomeFromJobs()).isEqualTo(YesOrNo.YES); assertThat(capturedHousehold.getIncomeFromJobsAmount()).isEqualByComparingTo("200000"); assertThat(capturedHousehold.getIncomeFromJobsFrequency()).isEqualTo("MONTH"); - assertThat(capturedHousehold.getPension()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO); - assertThat(capturedHousehold.getUniversalCreditIncome()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); - assertThat(capturedHousehold.getOtherBenefits()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO); + assertThat(capturedHousehold.getPension()).isEqualTo(YesOrNo.NO); + assertThat(capturedHousehold.getUniversalCreditIncome()).isEqualTo(YesOrNo.YES); + assertThat(capturedHousehold.getOtherBenefits()).isEqualTo(YesOrNo.NO); - assertThat(capturedHousehold.getMoneyFromElsewhere()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(capturedHousehold.getMoneyFromElsewhere()).isEqualTo(YesOrNo.YES); assertThat(capturedHousehold.getMoneyFromElsewhereDetails()) .isEqualTo("Receive child support payments"); 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 74e026c3d5..12683ca74e 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 @@ -348,17 +348,18 @@ void shouldSkipValidationWhenDefendantContactDetailsIsNull() { void shouldSaveRegularIncomeFieldsInDraft() { // Given - HDPI-3764: Regular income fields HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() - .incomeFromJobs(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .shareIncomeExpenseDetails(YesOrNo.YES) + .incomeFromJobs(YesOrNo.YES) .incomeFromJobsAmount(new java.math.BigDecimal("150000")) // £1500.00 in pence .incomeFromJobsFrequency("MONTH") - .pension(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .pension(YesOrNo.YES) .pensionAmount(new java.math.BigDecimal("50000")) // £500.00 in pence .pensionFrequency("MONTH") - .universalCreditIncome(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO) - .otherBenefits(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .universalCreditIncome(YesOrNo.NO) + .otherBenefits(YesOrNo.YES) .otherBenefitsAmount(new java.math.BigDecimal("20000")) // £200.00 in pence .otherBenefitsFrequency("WEEK") - .moneyFromElsewhere(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .moneyFromElsewhere(YesOrNo.YES) .moneyFromElsewhereDetails("Child maintenance payments of £100 per week") .build(); @@ -385,21 +386,23 @@ void shouldSaveRegularIncomeFieldsInDraft() { .getHouseholdCircumstances(); // Assert all regular income fields are saved correctly - assertThat(savedHousehold.getIncomeFromJobs()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(savedHousehold.getShareIncomeExpenseDetails()).isEqualTo(YesOrNo.YES); + + assertThat(savedHousehold.getIncomeFromJobs()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getIncomeFromJobsAmount()).isEqualByComparingTo("150000"); assertThat(savedHousehold.getIncomeFromJobsFrequency()).isEqualTo("MONTH"); - assertThat(savedHousehold.getPension()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(savedHousehold.getPension()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getPensionAmount()).isEqualByComparingTo("50000"); assertThat(savedHousehold.getPensionFrequency()).isEqualTo("MONTH"); - assertThat(savedHousehold.getUniversalCreditIncome()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.NO); + assertThat(savedHousehold.getUniversalCreditIncome()).isEqualTo(YesOrNo.NO); - assertThat(savedHousehold.getOtherBenefits()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(savedHousehold.getOtherBenefits()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getOtherBenefitsAmount()).isEqualByComparingTo("20000"); assertThat(savedHousehold.getOtherBenefitsFrequency()).isEqualTo("WEEK"); - assertThat(savedHousehold.getMoneyFromElsewhere()).isEqualTo(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES); + assertThat(savedHousehold.getMoneyFromElsewhere()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getMoneyFromElsewhereDetails()) .isEqualTo("Child maintenance payments of £100 per week"); } From 1d274b1e2c8cef9787baa3ec68ff7dab8c9ab820 Mon Sep 17 00:00:00 2001 From: arun Date: Sat, 21 Mar 2026 22:04:32 +0000 Subject: [PATCH 03/15] HDPI-3764: Add universalCredit and ucApplicationDate fields to domain model and tests --- .../respondpossessionclaim/HouseholdCircumstances.java | 7 +++++++ .../respondpossessionclaim/SubmitEventHandlerTest.java | 4 ++++ .../RespondToPossessionDraftSavePageTest.java | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java index b02f47614c..b0e56c8475 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java @@ -9,6 +9,7 @@ import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import java.math.BigDecimal; +import java.time.LocalDate; @Builder @Data @@ -45,6 +46,12 @@ public class HouseholdCircumstances { @CCD private YesOrNo universalCreditIncome; + @CCD + private YesOrNo universalCredit; + + @CCD + private LocalDate ucApplicationDate; + @CCD private YesOrNo otherBenefits; 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 0bab6e448a..59ea18ecb8 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 @@ -287,6 +287,8 @@ void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { .incomeFromJobsFrequency("MONTH") .pension(YesOrNo.NO) .universalCreditIncome(YesOrNo.YES) + .universalCredit(YesOrNo.YES) + .ucApplicationDate(java.time.LocalDate.of(2024, 2, 10)) .otherBenefits(YesOrNo.NO) .moneyFromElsewhere(YesOrNo.YES) .moneyFromElsewhereDetails("Receive child support payments") @@ -334,6 +336,8 @@ void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { assertThat(capturedHousehold.getPension()).isEqualTo(YesOrNo.NO); assertThat(capturedHousehold.getUniversalCreditIncome()).isEqualTo(YesOrNo.YES); + assertThat(capturedHousehold.getUniversalCredit()).isEqualTo(YesOrNo.YES); + assertThat(capturedHousehold.getUcApplicationDate()).isEqualTo(java.time.LocalDate.of(2024, 2, 10)); assertThat(capturedHousehold.getOtherBenefits()).isEqualTo(YesOrNo.NO); assertThat(capturedHousehold.getMoneyFromElsewhere()).isEqualTo(YesOrNo.YES); 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 12683ca74e..f8596823a8 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 @@ -356,6 +356,8 @@ void shouldSaveRegularIncomeFieldsInDraft() { .pensionAmount(new java.math.BigDecimal("50000")) // £500.00 in pence .pensionFrequency("MONTH") .universalCreditIncome(YesOrNo.NO) + .universalCredit(YesOrNo.YES) + .ucApplicationDate(java.time.LocalDate.of(2024, 1, 15)) .otherBenefits(YesOrNo.YES) .otherBenefitsAmount(new java.math.BigDecimal("20000")) // £200.00 in pence .otherBenefitsFrequency("WEEK") @@ -397,6 +399,8 @@ void shouldSaveRegularIncomeFieldsInDraft() { assertThat(savedHousehold.getPensionFrequency()).isEqualTo("MONTH"); assertThat(savedHousehold.getUniversalCreditIncome()).isEqualTo(YesOrNo.NO); + assertThat(savedHousehold.getUniversalCredit()).isEqualTo(YesOrNo.YES); + assertThat(savedHousehold.getUcApplicationDate()).isEqualTo(java.time.LocalDate.of(2024, 1, 15)); assertThat(savedHousehold.getOtherBenefits()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getOtherBenefitsAmount()).isEqualByComparingTo("20000"); From c4fe9d610e80d77d2d6a400331401ca801fd44ad Mon Sep 17 00:00:00 2001 From: arun Date: Mon, 23 Mar 2026 14:42:46 +0000 Subject: [PATCH 04/15] HDPI-3764: Add universal credit amount and frequency columns to income migration --- .../V070__add_regular_income_fields.sql | 42 ++++--------------- 1 file changed, 7 insertions(+), 35 deletions(-) diff --git a/src/main/resources/db/migration/V070__add_regular_income_fields.sql b/src/main/resources/db/migration/V070__add_regular_income_fields.sql index 28e7397d2a..378246332e 100644 --- a/src/main/resources/db/migration/V070__add_regular_income_fields.sql +++ b/src/main/resources/db/migration/V070__add_regular_income_fields.sql @@ -1,8 +1,4 @@ --- HDPI-3764: Add missing columns for regular income step --- Following existing pattern: YES_NO for checkboxes, DECIMAL(18,2) for amounts (stored in pence), VARCHAR(60) for frequency --- Stateless architecture: Every UI field must have corresponding database column for exact state reconstruction --- Income from all jobs you do ALTER TABLE household_circumstances ADD COLUMN income_from_jobs YES_NO; @@ -12,7 +8,6 @@ ADD COLUMN income_from_jobs_amount DECIMAL(18,2); ALTER TABLE household_circumstances ADD COLUMN income_from_jobs_frequency VARCHAR(60); --- Pension - state and private ALTER TABLE household_circumstances ADD COLUMN pension YES_NO; @@ -22,13 +17,16 @@ ADD COLUMN pension_amount DECIMAL(18,2); ALTER TABLE household_circumstances ADD COLUMN pension_frequency VARCHAR(60); --- Universal Credit (income received - distinct from application question) --- Note: Separate from existing 'universal_credit' YES_NO which tracks application status --- Note: Amount and frequency excluded pending BA clarification - checkbox used for routing only + ALTER TABLE household_circumstances ADD COLUMN universal_credit_income YES_NO; --- Other benefits and credits +ALTER TABLE household_circumstances +ADD COLUMN universal_credit_income_amount DECIMAL(18,2); + +ALTER TABLE household_circumstances +ADD COLUMN universal_credit_income_frequency VARCHAR(60); + ALTER TABLE household_circumstances ADD COLUMN other_benefits YES_NO; @@ -38,36 +36,10 @@ ADD COLUMN other_benefits_amount DECIMAL(18,2); ALTER TABLE household_circumstances ADD COLUMN other_benefits_frequency VARCHAR(60); --- Money from somewhere else ALTER TABLE household_circumstances ADD COLUMN money_from_elsewhere YES_NO; ALTER TABLE household_circumstances ADD COLUMN money_from_elsewhere_details VARCHAR(500); --- Add comments for documentation -COMMENT ON COLUMN household_circumstances.income_from_jobs IS 'Checkbox: Does defendant receive income from jobs?'; -COMMENT ON COLUMN household_circumstances.income_from_jobs_amount IS 'Total amount received from all jobs - stored in pence'; -COMMENT ON COLUMN household_circumstances.income_from_jobs_frequency IS 'Payment frequency: WEEK or MONTH'; - -COMMENT ON COLUMN household_circumstances.pension IS 'Checkbox: Does defendant receive pension income?'; -COMMENT ON COLUMN household_circumstances.pension_amount IS 'Total pension amount (state and private) - stored in pence'; -COMMENT ON COLUMN household_circumstances.pension_frequency IS 'Payment frequency: WEEK or MONTH'; - -COMMENT ON COLUMN household_circumstances.universal_credit_income IS 'Checkbox: Does defendant receive Universal Credit? (routing only - amount/frequency excluded pending BA clarification)'; - -COMMENT ON COLUMN household_circumstances.other_benefits IS 'Checkbox: Does defendant receive other benefits/credits?'; -COMMENT ON COLUMN household_circumstances.other_benefits_amount IS 'Total other benefits and credits amount - stored in pence'; -COMMENT ON COLUMN household_circumstances.other_benefits_frequency IS 'Payment frequency: WEEK or MONTH'; - -COMMENT ON COLUMN household_circumstances.money_from_elsewhere IS 'Checkbox: Does defendant receive money from other sources?'; -COMMENT ON COLUMN household_circumstances.money_from_elsewhere_details IS 'Description of other income sources and amounts (e.g., child maintenance)'; --- Note: The existing 'regular_income VARCHAR(60)' column can remain for backward compatibility --- or be used as a denormalized cache, but these 12 new columns are the source of truth --- --- Total columns added: 12 --- - 5 YES_NO checkboxes (income_from_jobs, pension, universal_credit_income, other_benefits, money_from_elsewhere) --- - 3 DECIMAL amounts (income_from_jobs_amount, pension_amount, other_benefits_amount) --- - 3 VARCHAR(60) frequencies (income_from_jobs_frequency, pension_frequency, other_benefits_frequency) --- - 1 VARCHAR(500) details (money_from_elsewhere_details) From 98f54f6c556a19d8c819d48f0e334f3912fe5558 Mon Sep 17 00:00:00 2001 From: arun Date: Tue, 24 Mar 2026 13:51:38 +0000 Subject: [PATCH 05/15] HDPI-3764: Rename universal credit income fields to universal credit amount and frequency --- .../HouseholdCircumstances.java | 21 +++++++++++++------ .../HouseholdCircumstancesEntity.java | 6 +++--- .../V070__add_regular_income_fields.sql | 13 ++++++------ .../SubmitEventHandlerTest.java | 16 +++++++++----- .../RespondToPossessionDraftSavePageTest.java | 18 +++++++++------- 5 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java index b0e56c8475..3b4236c3b7 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java @@ -6,7 +6,9 @@ import lombok.Data; import lombok.NoArgsConstructor; import uk.gov.hmcts.ccd.sdk.api.CCD; +import uk.gov.hmcts.ccd.sdk.type.FieldType; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; +import uk.gov.hmcts.reform.pcs.ccd.annotation.JacksonMoneyGBP; import java.math.BigDecimal; import java.time.LocalDate; @@ -28,7 +30,8 @@ public class HouseholdCircumstances { @CCD private YesOrNo incomeFromJobs; - @CCD + @CCD(typeOverride = FieldType.MoneyGBP) + @JacksonMoneyGBP private BigDecimal incomeFromJobsAmount; @CCD @@ -37,25 +40,31 @@ public class HouseholdCircumstances { @CCD private YesOrNo pension; - @CCD + @CCD(typeOverride = FieldType.MoneyGBP) + @JacksonMoneyGBP private BigDecimal pensionAmount; @CCD private String pensionFrequency; - @CCD - private YesOrNo universalCreditIncome; - @CCD private YesOrNo universalCredit; @CCD private LocalDate ucApplicationDate; + @CCD(typeOverride = FieldType.MoneyGBP) + @JacksonMoneyGBP + private BigDecimal universalCreditAmount; + @CCD - private YesOrNo otherBenefits; + private String universalCreditFrequency; @CCD + private YesOrNo otherBenefits; + + @CCD(typeOverride = FieldType.MoneyGBP) + @JacksonMoneyGBP private BigDecimal otherBenefitsAmount; @CCD diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java index b717ad5ff1..9887ebaef1 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java @@ -108,9 +108,9 @@ public class HouseholdCircumstancesEntity { private String pensionFrequency; - @Enumerated(EnumType.STRING) - @JdbcTypeCode(SqlTypes.NAMED_ENUM) - private YesOrNo universalCreditIncome; + private BigDecimal universalCreditAmount; + + private String universalCreditFrequency; @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) diff --git a/src/main/resources/db/migration/V070__add_regular_income_fields.sql b/src/main/resources/db/migration/V070__add_regular_income_fields.sql index 378246332e..47f99ba48c 100644 --- a/src/main/resources/db/migration/V070__add_regular_income_fields.sql +++ b/src/main/resources/db/migration/V070__add_regular_income_fields.sql @@ -1,4 +1,3 @@ - ALTER TABLE household_circumstances ADD COLUMN income_from_jobs YES_NO; @@ -17,15 +16,18 @@ ADD COLUMN pension_amount DECIMAL(18,2); ALTER TABLE household_circumstances ADD COLUMN pension_frequency VARCHAR(60); +-- Note: universal_credit YES_NO field already exists in V068 +-- Adding amount and frequency fields to complement existing universal_credit field ALTER TABLE household_circumstances -ADD COLUMN universal_credit_income YES_NO; +ADD COLUMN universal_credit_amount DECIMAL(18,2); -ALTER TABLE household_circumstances -ADD COLUMN universal_credit_income_amount DECIMAL(18,2); +COMMENT ON COLUMN household_circumstances.universal_credit_amount IS 'Universal Credit income amount received - stored in pence'; ALTER TABLE household_circumstances -ADD COLUMN universal_credit_income_frequency VARCHAR(60); +ADD COLUMN universal_credit_frequency VARCHAR(60); + +COMMENT ON COLUMN household_circumstances.universal_credit_frequency IS 'Payment frequency: WEEK or MONTH'; ALTER TABLE household_circumstances ADD COLUMN other_benefits YES_NO; @@ -42,4 +44,3 @@ ADD COLUMN money_from_elsewhere YES_NO; ALTER TABLE household_circumstances ADD COLUMN money_from_elsewhere_details VARCHAR(500); - 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 59ea18ecb8..782d74cb7d 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 @@ -23,6 +23,8 @@ import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.ClaimResponseService; import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.DefendantResponseService; +import java.math.BigDecimal; +import java.time.LocalDate; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; @@ -283,12 +285,13 @@ void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() .shareIncomeExpenseDetails(YesOrNo.YES) .incomeFromJobs(YesOrNo.YES) - .incomeFromJobsAmount(new java.math.BigDecimal("200000")) // £2000.00 in pence + .incomeFromJobsAmount(new BigDecimal("200000")) // £2000.00 in pence .incomeFromJobsFrequency("MONTH") .pension(YesOrNo.NO) - .universalCreditIncome(YesOrNo.YES) .universalCredit(YesOrNo.YES) - .ucApplicationDate(java.time.LocalDate.of(2024, 2, 10)) + .ucApplicationDate(LocalDate.of(2024, 2, 10)) + .universalCreditAmount(new BigDecimal("100000")) // £1000.00 in pence + .universalCreditFrequency("MONTH") .otherBenefits(YesOrNo.NO) .moneyFromElsewhere(YesOrNo.YES) .moneyFromElsewhereDetails("Receive child support payments") @@ -335,9 +338,12 @@ void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { assertThat(capturedHousehold.getIncomeFromJobsFrequency()).isEqualTo("MONTH"); assertThat(capturedHousehold.getPension()).isEqualTo(YesOrNo.NO); - assertThat(capturedHousehold.getUniversalCreditIncome()).isEqualTo(YesOrNo.YES); + assertThat(capturedHousehold.getUniversalCredit()).isEqualTo(YesOrNo.YES); - assertThat(capturedHousehold.getUcApplicationDate()).isEqualTo(java.time.LocalDate.of(2024, 2, 10)); + assertThat(capturedHousehold.getUcApplicationDate()).isEqualTo(LocalDate.of(2024, 2, 10)); + assertThat(capturedHousehold.getUniversalCreditAmount()).isEqualByComparingTo("100000"); + assertThat(capturedHousehold.getUniversalCreditFrequency()).isEqualTo("MONTH"); + assertThat(capturedHousehold.getOtherBenefits()).isEqualTo(YesOrNo.NO); assertThat(capturedHousehold.getMoneyFromElsewhere()).isEqualTo(YesOrNo.YES); 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 f8596823a8..1543710edc 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 @@ -27,6 +27,8 @@ import uk.gov.hmcts.reform.pcs.ccd.service.DraftCaseDataService; import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.ImmutablePartyFieldValidator; +import java.math.BigDecimal; +import java.time.LocalDate; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -350,16 +352,17 @@ void shouldSaveRegularIncomeFieldsInDraft() { HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() .shareIncomeExpenseDetails(YesOrNo.YES) .incomeFromJobs(YesOrNo.YES) - .incomeFromJobsAmount(new java.math.BigDecimal("150000")) // £1500.00 in pence + .incomeFromJobsAmount(new BigDecimal("150000")) // £1500.00 in pence .incomeFromJobsFrequency("MONTH") .pension(YesOrNo.YES) - .pensionAmount(new java.math.BigDecimal("50000")) // £500.00 in pence + .pensionAmount(new BigDecimal("50000")) // £500.00 in pence .pensionFrequency("MONTH") - .universalCreditIncome(YesOrNo.NO) .universalCredit(YesOrNo.YES) - .ucApplicationDate(java.time.LocalDate.of(2024, 1, 15)) + .ucApplicationDate(LocalDate.of(2024, 1, 15)) + .universalCreditAmount(new BigDecimal("80000")) // £800.00 in pence + .universalCreditFrequency("MONTH") .otherBenefits(YesOrNo.YES) - .otherBenefitsAmount(new java.math.BigDecimal("20000")) // £200.00 in pence + .otherBenefitsAmount(new BigDecimal("20000")) // £200.00 in pence .otherBenefitsFrequency("WEEK") .moneyFromElsewhere(YesOrNo.YES) .moneyFromElsewhereDetails("Child maintenance payments of £100 per week") @@ -398,9 +401,10 @@ void shouldSaveRegularIncomeFieldsInDraft() { assertThat(savedHousehold.getPensionAmount()).isEqualByComparingTo("50000"); assertThat(savedHousehold.getPensionFrequency()).isEqualTo("MONTH"); - assertThat(savedHousehold.getUniversalCreditIncome()).isEqualTo(YesOrNo.NO); assertThat(savedHousehold.getUniversalCredit()).isEqualTo(YesOrNo.YES); - assertThat(savedHousehold.getUcApplicationDate()).isEqualTo(java.time.LocalDate.of(2024, 1, 15)); + assertThat(savedHousehold.getUcApplicationDate()).isEqualTo(LocalDate.of(2024, 1, 15)); + assertThat(savedHousehold.getUniversalCreditAmount()).isEqualByComparingTo("80000"); + assertThat(savedHousehold.getUniversalCreditFrequency()).isEqualTo("MONTH"); assertThat(savedHousehold.getOtherBenefits()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getOtherBenefitsAmount()).isEqualByComparingTo("20000"); From bf5d8699a3199309ec08dc207d35e13a04956578 Mon Sep 17 00:00:00 2001 From: arun Date: Tue, 24 Mar 2026 14:02:36 +0000 Subject: [PATCH 06/15] HDPI-3764: Rename migration from V070 to V071 to resolve conflict with master --- ...ular_income_fields.sql => V071__add_regular_income_fields.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V070__add_regular_income_fields.sql => V071__add_regular_income_fields.sql} (100%) diff --git a/src/main/resources/db/migration/V070__add_regular_income_fields.sql b/src/main/resources/db/migration/V071__add_regular_income_fields.sql similarity index 100% rename from src/main/resources/db/migration/V070__add_regular_income_fields.sql rename to src/main/resources/db/migration/V071__add_regular_income_fields.sql From c361ead1a294fd42c4bf5e3e21e4426dd5050631 Mon Sep 17 00:00:00 2001 From: arun Date: Tue, 24 Mar 2026 14:26:35 +0000 Subject: [PATCH 07/15] HDPI-3764: Remove unnecessary comments from code --- .../respondpossessionclaim/HouseholdCircumstances.java | 2 -- .../HouseholdCircumstancesEntity.java | 2 -- .../db/migration/V071__add_regular_income_fields.sql | 7 ------- .../respondpossessionclaim/SubmitEventHandlerTest.java | 5 ----- .../RespondToPossessionDraftSavePageTest.java | 1 - 5 files changed, 17 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java index 3b4236c3b7..50fc717c82 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java @@ -22,11 +22,9 @@ public class HouseholdCircumstances { @CCD private YesOrNo dependantChildren; - // Income & Expense Control Field (HDPI-3764) @CCD private YesOrNo shareIncomeExpenseDetails; - // Regular Income Fields (HDPI-3764) @CCD private YesOrNo incomeFromJobs; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java index 9887ebaef1..7a6aa9c009 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java @@ -91,7 +91,6 @@ public class HouseholdCircumstancesEntity { private LocalDate ucApplicationDate; - // Regular Income Fields (HDPI-3764) @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo incomeFromJobs; @@ -126,7 +125,6 @@ public class HouseholdCircumstancesEntity { private String moneyFromElsewhereDetails; - // Priority Debts and Expenses @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo priorityDebts; diff --git a/src/main/resources/db/migration/V071__add_regular_income_fields.sql b/src/main/resources/db/migration/V071__add_regular_income_fields.sql index 47f99ba48c..4551c29b6d 100644 --- a/src/main/resources/db/migration/V071__add_regular_income_fields.sql +++ b/src/main/resources/db/migration/V071__add_regular_income_fields.sql @@ -16,19 +16,12 @@ ADD COLUMN pension_amount DECIMAL(18,2); ALTER TABLE household_circumstances ADD COLUMN pension_frequency VARCHAR(60); --- Note: universal_credit YES_NO field already exists in V068 --- Adding amount and frequency fields to complement existing universal_credit field - ALTER TABLE household_circumstances ADD COLUMN universal_credit_amount DECIMAL(18,2); -COMMENT ON COLUMN household_circumstances.universal_credit_amount IS 'Universal Credit income amount received - stored in pence'; - ALTER TABLE household_circumstances ADD COLUMN universal_credit_frequency VARCHAR(60); -COMMENT ON COLUMN household_circumstances.universal_credit_frequency IS 'Payment frequency: WEEK or MONTH'; - ALTER TABLE household_circumstances ADD COLUMN other_benefits YES_NO; 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 782d74cb7d..a3b0a8e08a 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 @@ -58,8 +58,6 @@ void setUp() { underTest = new SubmitEventHandler(draftCaseDataService, claimResponseService, defendantResponseService); } - // ========== VALIDATION ERROR CASES ========== - @Test void shouldReturnErrorWhenPossessionClaimResponseIsNull() { // Given @@ -117,8 +115,6 @@ void shouldReturnErrorWhenDefendantResponsesIsNull() { verify(draftCaseDataService, never()).deleteUnsubmittedCaseData(anyLong(), eq(respondPossessionClaim)); } - // ========== INDEPENDENT FIELD SUBMISSION TESTS ========== - @Test void shouldAllowSubmitWithOnlyDefendantResponses() { DefendantResponses responses = DefendantResponses.builder() @@ -281,7 +277,6 @@ void shouldHandleExceptionFromContactPreferencesService() { @Test void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { - // Given - HDPI-3764: Regular income fields for final submit HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() .shareIncomeExpenseDetails(YesOrNo.YES) .incomeFromJobs(YesOrNo.YES) 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 1543710edc..da5ab71ef9 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 @@ -348,7 +348,6 @@ void shouldSkipValidationWhenDefendantContactDetailsIsNull() { @Test void shouldSaveRegularIncomeFieldsInDraft() { - // Given - HDPI-3764: Regular income fields HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() .shareIncomeExpenseDetails(YesOrNo.YES) .incomeFromJobs(YesOrNo.YES) From 92482695f24c993b0140fe3bf893847b093e0df9 Mon Sep 17 00:00:00 2001 From: arun Date: Tue, 24 Mar 2026 21:48:49 +0000 Subject: [PATCH 08/15] HDPI-3764: Add mapping for all income fields in HouseholdCircumstancesService --- .../HouseholdCircumstancesService.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesService.java index 2c4ec07507..601dd087a0 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesService.java @@ -15,6 +15,22 @@ public HouseholdCircumstancesEntity createHouseholdCircumstancesEntity(Household HouseholdCircumstancesEntity householdCircumstancesEntity = HouseholdCircumstancesEntity.builder() .dependantChildren(circumstances.getDependantChildren()) + .shareIncomeExpenseDetails(circumstances.getShareIncomeExpenseDetails()) + .incomeFromJobs(circumstances.getIncomeFromJobs()) + .incomeFromJobsAmount(circumstances.getIncomeFromJobsAmount()) + .incomeFromJobsFrequency(circumstances.getIncomeFromJobsFrequency()) + .pension(circumstances.getPension()) + .pensionAmount(circumstances.getPensionAmount()) + .pensionFrequency(circumstances.getPensionFrequency()) + .universalCredit(circumstances.getUniversalCredit()) + .ucApplicationDate(circumstances.getUcApplicationDate()) + .universalCreditAmount(circumstances.getUniversalCreditAmount()) + .universalCreditFrequency(circumstances.getUniversalCreditFrequency()) + .otherBenefits(circumstances.getOtherBenefits()) + .otherBenefitsAmount(circumstances.getOtherBenefitsAmount()) + .otherBenefitsFrequency(circumstances.getOtherBenefitsFrequency()) + .moneyFromElsewhere(circumstances.getMoneyFromElsewhere()) + .moneyFromElsewhereDetails(circumstances.getMoneyFromElsewhereDetails()) .build(); return householdCircumstancesEntity; From fec7781ed028b2b64f71610315a12a359c50fcee Mon Sep 17 00:00:00 2001 From: arun Date: Thu, 26 Mar 2026 11:43:30 +0000 Subject: [PATCH 09/15] HDPI-3764: Renumber income migration from V071 to V072 due to master merge conflict --- ...ular_income_fields.sql => V072__add_regular_income_fields.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V071__add_regular_income_fields.sql => V072__add_regular_income_fields.sql} (100%) diff --git a/src/main/resources/db/migration/V071__add_regular_income_fields.sql b/src/main/resources/db/migration/V072__add_regular_income_fields.sql similarity index 100% rename from src/main/resources/db/migration/V071__add_regular_income_fields.sql rename to src/main/resources/db/migration/V072__add_regular_income_fields.sql From 1c41ee773538c53731356ef9cf70328beb8a2fac Mon Sep 17 00:00:00 2001 From: arun Date: Thu, 26 Mar 2026 12:11:14 +0000 Subject: [PATCH 10/15] HDPI-3764: Address peer review comments - add validation, consolidate migration SQL, and reduce VARCHAR sizes --- .../HouseholdCircumstances.java | 2 + .../V072__add_regular_income_fields.sql | 51 +++++-------------- 2 files changed, 15 insertions(+), 38 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java index 50fc717c82..7930dd1f9c 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import jakarta.validation.constraints.Size; import uk.gov.hmcts.ccd.sdk.api.CCD; import uk.gov.hmcts.ccd.sdk.type.FieldType; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; @@ -72,6 +73,7 @@ public class HouseholdCircumstances { private YesOrNo moneyFromElsewhere; @CCD + @Size(max = 500) private String moneyFromElsewhereDetails; } diff --git a/src/main/resources/db/migration/V072__add_regular_income_fields.sql b/src/main/resources/db/migration/V072__add_regular_income_fields.sql index 4551c29b6d..118e427262 100644 --- a/src/main/resources/db/migration/V072__add_regular_income_fields.sql +++ b/src/main/resources/db/migration/V072__add_regular_income_fields.sql @@ -1,39 +1,14 @@ ALTER TABLE household_circumstances -ADD COLUMN income_from_jobs YES_NO; - -ALTER TABLE household_circumstances -ADD COLUMN income_from_jobs_amount DECIMAL(18,2); - -ALTER TABLE household_circumstances -ADD COLUMN income_from_jobs_frequency VARCHAR(60); - -ALTER TABLE household_circumstances -ADD COLUMN pension YES_NO; - -ALTER TABLE household_circumstances -ADD COLUMN pension_amount DECIMAL(18,2); - -ALTER TABLE household_circumstances -ADD COLUMN pension_frequency VARCHAR(60); - -ALTER TABLE household_circumstances -ADD COLUMN universal_credit_amount DECIMAL(18,2); - -ALTER TABLE household_circumstances -ADD COLUMN universal_credit_frequency VARCHAR(60); - -ALTER TABLE household_circumstances -ADD COLUMN other_benefits YES_NO; - -ALTER TABLE household_circumstances -ADD COLUMN other_benefits_amount DECIMAL(18,2); - -ALTER TABLE household_circumstances -ADD COLUMN other_benefits_frequency VARCHAR(60); - -ALTER TABLE household_circumstances -ADD COLUMN money_from_elsewhere YES_NO; - -ALTER TABLE household_circumstances -ADD COLUMN money_from_elsewhere_details VARCHAR(500); - + ADD COLUMN income_from_jobs YES_NO, + ADD COLUMN income_from_jobs_amount DECIMAL(18,2), + ADD COLUMN income_from_jobs_frequency VARCHAR(10), + ADD COLUMN pension YES_NO, + ADD COLUMN pension_amount DECIMAL(18,2), + ADD COLUMN pension_frequency VARCHAR(10), + ADD COLUMN universal_credit_amount DECIMAL(18,2), + ADD COLUMN universal_credit_frequency VARCHAR(10), + ADD COLUMN other_benefits YES_NO, + ADD COLUMN other_benefits_amount DECIMAL(18,2), + ADD COLUMN other_benefits_frequency VARCHAR(10), + ADD COLUMN money_from_elsewhere YES_NO, + ADD COLUMN money_from_elsewhere_details VARCHAR(500); From 06e33a20ae471a87cf335d019050e60d68bd0ff9 Mon Sep 17 00:00:00 2001 From: arun Date: Thu, 26 Mar 2026 12:30:35 +0000 Subject: [PATCH 11/15] HDPI-3764: Convert income frequency fields from String to enum --- .../pcs/ccd/domain/IncomeFrequency.java | 22 +++++++++++++++++++ .../HouseholdCircumstances.java | 9 ++++---- .../HouseholdCircumstancesEntity.java | 17 ++++++++++---- .../SubmitEventHandlerTest.java | 9 ++++---- .../RespondToPossessionDraftSavePageTest.java | 17 +++++++------- 5 files changed, 54 insertions(+), 20 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/IncomeFrequency.java diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/IncomeFrequency.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/IncomeFrequency.java new file mode 100644 index 0000000000..94140c6832 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/IncomeFrequency.java @@ -0,0 +1,22 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain; + +import uk.gov.hmcts.ccd.sdk.api.HasLabel; + +/** + * Enum representing the frequency of income and benefit payments. + */ +public enum IncomeFrequency implements HasLabel { + WEEK("Weekly"), + MONTH("Monthly"); + + private final String label; + + IncomeFrequency(String label) { + this.label = label; + } + + @Override + public String getLabel() { + return label; + } +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java index 7930dd1f9c..834d41c965 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java @@ -10,6 +10,7 @@ import uk.gov.hmcts.ccd.sdk.type.FieldType; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.annotation.JacksonMoneyGBP; +import uk.gov.hmcts.reform.pcs.ccd.domain.IncomeFrequency; import java.math.BigDecimal; import java.time.LocalDate; @@ -34,7 +35,7 @@ public class HouseholdCircumstances { private BigDecimal incomeFromJobsAmount; @CCD - private String incomeFromJobsFrequency; + private IncomeFrequency incomeFromJobsFrequency; @CCD private YesOrNo pension; @@ -44,7 +45,7 @@ public class HouseholdCircumstances { private BigDecimal pensionAmount; @CCD - private String pensionFrequency; + private IncomeFrequency pensionFrequency; @CCD private YesOrNo universalCredit; @@ -57,7 +58,7 @@ public class HouseholdCircumstances { private BigDecimal universalCreditAmount; @CCD - private String universalCreditFrequency; + private IncomeFrequency universalCreditFrequency; @CCD private YesOrNo otherBenefits; @@ -67,7 +68,7 @@ public class HouseholdCircumstances { private BigDecimal otherBenefitsAmount; @CCD - private String otherBenefitsFrequency; + private IncomeFrequency otherBenefitsFrequency; @CCD private YesOrNo moneyFromElsewhere; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java index 7a6aa9c009..f528f75e94 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java @@ -19,6 +19,7 @@ import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; +import uk.gov.hmcts.reform.pcs.ccd.domain.IncomeFrequency; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; import java.math.BigDecimal; @@ -97,7 +98,9 @@ public class HouseholdCircumstancesEntity { private BigDecimal incomeFromJobsAmount; - private String incomeFromJobsFrequency; + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.VARCHAR) + private IncomeFrequency incomeFromJobsFrequency; @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) @@ -105,11 +108,15 @@ public class HouseholdCircumstancesEntity { private BigDecimal pensionAmount; - private String pensionFrequency; + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.VARCHAR) + private IncomeFrequency pensionFrequency; private BigDecimal universalCreditAmount; - private String universalCreditFrequency; + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.VARCHAR) + private IncomeFrequency universalCreditFrequency; @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) @@ -117,7 +124,9 @@ public class HouseholdCircumstancesEntity { private BigDecimal otherBenefitsAmount; - private String otherBenefitsFrequency; + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.VARCHAR) + private IncomeFrequency otherBenefitsFrequency; @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) 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 a3b0a8e08a..3ee371131e 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 @@ -10,6 +10,7 @@ import uk.gov.hmcts.ccd.sdk.api.callback.SubmitResponse; import uk.gov.hmcts.ccd.sdk.type.AddressUK; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; +import uk.gov.hmcts.reform.pcs.ccd.domain.IncomeFrequency; import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; import uk.gov.hmcts.reform.pcs.ccd.domain.Party; import uk.gov.hmcts.reform.pcs.ccd.domain.State; @@ -281,12 +282,12 @@ void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { .shareIncomeExpenseDetails(YesOrNo.YES) .incomeFromJobs(YesOrNo.YES) .incomeFromJobsAmount(new BigDecimal("200000")) // £2000.00 in pence - .incomeFromJobsFrequency("MONTH") + .incomeFromJobsFrequency(IncomeFrequency.MONTH) .pension(YesOrNo.NO) .universalCredit(YesOrNo.YES) .ucApplicationDate(LocalDate.of(2024, 2, 10)) .universalCreditAmount(new BigDecimal("100000")) // £1000.00 in pence - .universalCreditFrequency("MONTH") + .universalCreditFrequency(IncomeFrequency.MONTH) .otherBenefits(YesOrNo.NO) .moneyFromElsewhere(YesOrNo.YES) .moneyFromElsewhereDetails("Receive child support payments") @@ -330,14 +331,14 @@ void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { assertThat(capturedHousehold.getIncomeFromJobs()).isEqualTo(YesOrNo.YES); assertThat(capturedHousehold.getIncomeFromJobsAmount()).isEqualByComparingTo("200000"); - assertThat(capturedHousehold.getIncomeFromJobsFrequency()).isEqualTo("MONTH"); + assertThat(capturedHousehold.getIncomeFromJobsFrequency()).isEqualTo(IncomeFrequency.MONTH); assertThat(capturedHousehold.getPension()).isEqualTo(YesOrNo.NO); assertThat(capturedHousehold.getUniversalCredit()).isEqualTo(YesOrNo.YES); assertThat(capturedHousehold.getUcApplicationDate()).isEqualTo(LocalDate.of(2024, 2, 10)); assertThat(capturedHousehold.getUniversalCreditAmount()).isEqualByComparingTo("100000"); - assertThat(capturedHousehold.getUniversalCreditFrequency()).isEqualTo("MONTH"); + assertThat(capturedHousehold.getUniversalCreditFrequency()).isEqualTo(IncomeFrequency.MONTH); assertThat(capturedHousehold.getOtherBenefits()).isEqualTo(YesOrNo.NO); 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 da5ab71ef9..9ad47f1bdf 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 @@ -10,6 +10,7 @@ import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse; import uk.gov.hmcts.ccd.sdk.type.AddressUK; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; +import uk.gov.hmcts.reform.pcs.ccd.domain.IncomeFrequency; import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; import uk.gov.hmcts.reform.pcs.ccd.domain.Party; import uk.gov.hmcts.reform.pcs.ccd.domain.State; @@ -352,17 +353,17 @@ void shouldSaveRegularIncomeFieldsInDraft() { .shareIncomeExpenseDetails(YesOrNo.YES) .incomeFromJobs(YesOrNo.YES) .incomeFromJobsAmount(new BigDecimal("150000")) // £1500.00 in pence - .incomeFromJobsFrequency("MONTH") + .incomeFromJobsFrequency(IncomeFrequency.MONTH) .pension(YesOrNo.YES) .pensionAmount(new BigDecimal("50000")) // £500.00 in pence - .pensionFrequency("MONTH") + .pensionFrequency(IncomeFrequency.MONTH) .universalCredit(YesOrNo.YES) .ucApplicationDate(LocalDate.of(2024, 1, 15)) .universalCreditAmount(new BigDecimal("80000")) // £800.00 in pence - .universalCreditFrequency("MONTH") + .universalCreditFrequency(IncomeFrequency.MONTH) .otherBenefits(YesOrNo.YES) .otherBenefitsAmount(new BigDecimal("20000")) // £200.00 in pence - .otherBenefitsFrequency("WEEK") + .otherBenefitsFrequency(IncomeFrequency.WEEK) .moneyFromElsewhere(YesOrNo.YES) .moneyFromElsewhereDetails("Child maintenance payments of £100 per week") .build(); @@ -394,20 +395,20 @@ void shouldSaveRegularIncomeFieldsInDraft() { assertThat(savedHousehold.getIncomeFromJobs()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getIncomeFromJobsAmount()).isEqualByComparingTo("150000"); - assertThat(savedHousehold.getIncomeFromJobsFrequency()).isEqualTo("MONTH"); + assertThat(savedHousehold.getIncomeFromJobsFrequency()).isEqualTo(IncomeFrequency.MONTH); assertThat(savedHousehold.getPension()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getPensionAmount()).isEqualByComparingTo("50000"); - assertThat(savedHousehold.getPensionFrequency()).isEqualTo("MONTH"); + assertThat(savedHousehold.getPensionFrequency()).isEqualTo(IncomeFrequency.MONTH); assertThat(savedHousehold.getUniversalCredit()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getUcApplicationDate()).isEqualTo(LocalDate.of(2024, 1, 15)); assertThat(savedHousehold.getUniversalCreditAmount()).isEqualByComparingTo("80000"); - assertThat(savedHousehold.getUniversalCreditFrequency()).isEqualTo("MONTH"); + assertThat(savedHousehold.getUniversalCreditFrequency()).isEqualTo(IncomeFrequency.MONTH); assertThat(savedHousehold.getOtherBenefits()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getOtherBenefitsAmount()).isEqualByComparingTo("20000"); - assertThat(savedHousehold.getOtherBenefitsFrequency()).isEqualTo("WEEK"); + assertThat(savedHousehold.getOtherBenefitsFrequency()).isEqualTo(IncomeFrequency.WEEK); assertThat(savedHousehold.getMoneyFromElsewhere()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getMoneyFromElsewhereDetails()) From 05b19162f7e5deecd5b4af29502e746cc5f800a6 Mon Sep 17 00:00:00 2001 From: arun Date: Thu, 26 Mar 2026 13:00:59 +0000 Subject: [PATCH 12/15] HDPI-3764: Further reduce VARCHAR size from 10 to 5 for frequency columns --- .../db/migration/V072__add_regular_income_fields.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/db/migration/V072__add_regular_income_fields.sql b/src/main/resources/db/migration/V072__add_regular_income_fields.sql index 118e427262..16fbf94aae 100644 --- a/src/main/resources/db/migration/V072__add_regular_income_fields.sql +++ b/src/main/resources/db/migration/V072__add_regular_income_fields.sql @@ -1,14 +1,14 @@ ALTER TABLE household_circumstances ADD COLUMN income_from_jobs YES_NO, ADD COLUMN income_from_jobs_amount DECIMAL(18,2), - ADD COLUMN income_from_jobs_frequency VARCHAR(10), + ADD COLUMN income_from_jobs_frequency VARCHAR(5), ADD COLUMN pension YES_NO, ADD COLUMN pension_amount DECIMAL(18,2), - ADD COLUMN pension_frequency VARCHAR(10), + ADD COLUMN pension_frequency VARCHAR(5), ADD COLUMN universal_credit_amount DECIMAL(18,2), - ADD COLUMN universal_credit_frequency VARCHAR(10), + ADD COLUMN universal_credit_frequency VARCHAR(5), ADD COLUMN other_benefits YES_NO, ADD COLUMN other_benefits_amount DECIMAL(18,2), - ADD COLUMN other_benefits_frequency VARCHAR(10), + ADD COLUMN other_benefits_frequency VARCHAR(5), ADD COLUMN money_from_elsewhere YES_NO, ADD COLUMN money_from_elsewhere_details VARCHAR(500); From 9be81e191f6a4943a1e9a6be0014be070508ffd7 Mon Sep 17 00:00:00 2001 From: arun Date: Thu, 26 Mar 2026 13:25:11 +0000 Subject: [PATCH 13/15] HDPI-3764: Revert VARCHAR size to 10 for frequency columns --- .../db/migration/V072__add_regular_income_fields.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/db/migration/V072__add_regular_income_fields.sql b/src/main/resources/db/migration/V072__add_regular_income_fields.sql index 16fbf94aae..118e427262 100644 --- a/src/main/resources/db/migration/V072__add_regular_income_fields.sql +++ b/src/main/resources/db/migration/V072__add_regular_income_fields.sql @@ -1,14 +1,14 @@ ALTER TABLE household_circumstances ADD COLUMN income_from_jobs YES_NO, ADD COLUMN income_from_jobs_amount DECIMAL(18,2), - ADD COLUMN income_from_jobs_frequency VARCHAR(5), + ADD COLUMN income_from_jobs_frequency VARCHAR(10), ADD COLUMN pension YES_NO, ADD COLUMN pension_amount DECIMAL(18,2), - ADD COLUMN pension_frequency VARCHAR(5), + ADD COLUMN pension_frequency VARCHAR(10), ADD COLUMN universal_credit_amount DECIMAL(18,2), - ADD COLUMN universal_credit_frequency VARCHAR(5), + ADD COLUMN universal_credit_frequency VARCHAR(10), ADD COLUMN other_benefits YES_NO, ADD COLUMN other_benefits_amount DECIMAL(18,2), - ADD COLUMN other_benefits_frequency VARCHAR(5), + ADD COLUMN other_benefits_frequency VARCHAR(10), ADD COLUMN money_from_elsewhere YES_NO, ADD COLUMN money_from_elsewhere_details VARCHAR(500); From cc99802a81756639bf353d08703557fe1bb52799 Mon Sep 17 00:00:00 2001 From: arun Date: Thu, 26 Mar 2026 15:25:57 +0000 Subject: [PATCH 14/15] HDPI-3764: Change enum values from WEEK/MONTH to WEEKLY/MONTHLY --- .../reform/pcs/ccd/domain/IncomeFrequency.java | 4 ++-- .../SubmitEventHandlerTest.java | 8 ++++---- .../RespondToPossessionDraftSavePageTest.java | 16 ++++++++-------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/IncomeFrequency.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/IncomeFrequency.java index 94140c6832..31edfd2090 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/IncomeFrequency.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/IncomeFrequency.java @@ -6,8 +6,8 @@ * Enum representing the frequency of income and benefit payments. */ public enum IncomeFrequency implements HasLabel { - WEEK("Weekly"), - MONTH("Monthly"); + WEEKLY("Weekly"), + MONTHLY("Monthly"); private final String label; 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 3ee371131e..756bcc2be2 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 @@ -282,12 +282,12 @@ void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { .shareIncomeExpenseDetails(YesOrNo.YES) .incomeFromJobs(YesOrNo.YES) .incomeFromJobsAmount(new BigDecimal("200000")) // £2000.00 in pence - .incomeFromJobsFrequency(IncomeFrequency.MONTH) + .incomeFromJobsFrequency(IncomeFrequency.MONTHLY) .pension(YesOrNo.NO) .universalCredit(YesOrNo.YES) .ucApplicationDate(LocalDate.of(2024, 2, 10)) .universalCreditAmount(new BigDecimal("100000")) // £1000.00 in pence - .universalCreditFrequency(IncomeFrequency.MONTH) + .universalCreditFrequency(IncomeFrequency.MONTHLY) .otherBenefits(YesOrNo.NO) .moneyFromElsewhere(YesOrNo.YES) .moneyFromElsewhereDetails("Receive child support payments") @@ -331,14 +331,14 @@ void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() { assertThat(capturedHousehold.getIncomeFromJobs()).isEqualTo(YesOrNo.YES); assertThat(capturedHousehold.getIncomeFromJobsAmount()).isEqualByComparingTo("200000"); - assertThat(capturedHousehold.getIncomeFromJobsFrequency()).isEqualTo(IncomeFrequency.MONTH); + assertThat(capturedHousehold.getIncomeFromJobsFrequency()).isEqualTo(IncomeFrequency.MONTHLY); assertThat(capturedHousehold.getPension()).isEqualTo(YesOrNo.NO); assertThat(capturedHousehold.getUniversalCredit()).isEqualTo(YesOrNo.YES); assertThat(capturedHousehold.getUcApplicationDate()).isEqualTo(LocalDate.of(2024, 2, 10)); assertThat(capturedHousehold.getUniversalCreditAmount()).isEqualByComparingTo("100000"); - assertThat(capturedHousehold.getUniversalCreditFrequency()).isEqualTo(IncomeFrequency.MONTH); + assertThat(capturedHousehold.getUniversalCreditFrequency()).isEqualTo(IncomeFrequency.MONTHLY); assertThat(capturedHousehold.getOtherBenefits()).isEqualTo(YesOrNo.NO); 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 9ad47f1bdf..8709d7a70d 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 @@ -353,17 +353,17 @@ void shouldSaveRegularIncomeFieldsInDraft() { .shareIncomeExpenseDetails(YesOrNo.YES) .incomeFromJobs(YesOrNo.YES) .incomeFromJobsAmount(new BigDecimal("150000")) // £1500.00 in pence - .incomeFromJobsFrequency(IncomeFrequency.MONTH) + .incomeFromJobsFrequency(IncomeFrequency.MONTHLY) .pension(YesOrNo.YES) .pensionAmount(new BigDecimal("50000")) // £500.00 in pence - .pensionFrequency(IncomeFrequency.MONTH) + .pensionFrequency(IncomeFrequency.MONTHLY) .universalCredit(YesOrNo.YES) .ucApplicationDate(LocalDate.of(2024, 1, 15)) .universalCreditAmount(new BigDecimal("80000")) // £800.00 in pence - .universalCreditFrequency(IncomeFrequency.MONTH) + .universalCreditFrequency(IncomeFrequency.MONTHLY) .otherBenefits(YesOrNo.YES) .otherBenefitsAmount(new BigDecimal("20000")) // £200.00 in pence - .otherBenefitsFrequency(IncomeFrequency.WEEK) + .otherBenefitsFrequency(IncomeFrequency.WEEKLY) .moneyFromElsewhere(YesOrNo.YES) .moneyFromElsewhereDetails("Child maintenance payments of £100 per week") .build(); @@ -395,20 +395,20 @@ void shouldSaveRegularIncomeFieldsInDraft() { assertThat(savedHousehold.getIncomeFromJobs()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getIncomeFromJobsAmount()).isEqualByComparingTo("150000"); - assertThat(savedHousehold.getIncomeFromJobsFrequency()).isEqualTo(IncomeFrequency.MONTH); + assertThat(savedHousehold.getIncomeFromJobsFrequency()).isEqualTo(IncomeFrequency.MONTHLY); assertThat(savedHousehold.getPension()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getPensionAmount()).isEqualByComparingTo("50000"); - assertThat(savedHousehold.getPensionFrequency()).isEqualTo(IncomeFrequency.MONTH); + assertThat(savedHousehold.getPensionFrequency()).isEqualTo(IncomeFrequency.MONTHLY); assertThat(savedHousehold.getUniversalCredit()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getUcApplicationDate()).isEqualTo(LocalDate.of(2024, 1, 15)); assertThat(savedHousehold.getUniversalCreditAmount()).isEqualByComparingTo("80000"); - assertThat(savedHousehold.getUniversalCreditFrequency()).isEqualTo(IncomeFrequency.MONTH); + assertThat(savedHousehold.getUniversalCreditFrequency()).isEqualTo(IncomeFrequency.MONTHLY); assertThat(savedHousehold.getOtherBenefits()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getOtherBenefitsAmount()).isEqualByComparingTo("20000"); - assertThat(savedHousehold.getOtherBenefitsFrequency()).isEqualTo(IncomeFrequency.WEEK); + assertThat(savedHousehold.getOtherBenefitsFrequency()).isEqualTo(IncomeFrequency.WEEKLY); assertThat(savedHousehold.getMoneyFromElsewhere()).isEqualTo(YesOrNo.YES); assertThat(savedHousehold.getMoneyFromElsewhereDetails()) From c61c08c2d388d9fa62352812eb775daa96842202 Mon Sep 17 00:00:00 2001 From: arun Date: Fri, 27 Mar 2026 17:16:10 +0000 Subject: [PATCH 15/15] HDPI-3764: Renumber migration V072 to V073 to resolve conflict after master merge --- ...ular_income_fields.sql => V073__add_regular_income_fields.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V072__add_regular_income_fields.sql => V073__add_regular_income_fields.sql} (100%) diff --git a/src/main/resources/db/migration/V072__add_regular_income_fields.sql b/src/main/resources/db/migration/V073__add_regular_income_fields.sql similarity index 100% rename from src/main/resources/db/migration/V072__add_regular_income_fields.sql rename to src/main/resources/db/migration/V073__add_regular_income_fields.sql