Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
da327c6
HDPI-3764: Add regular income fields to household circumstances for d…
arun-hmcts Mar 21, 2026
629c35a
HDPI-3764: Add shareIncomeExpenseDetails field to household circumsta…
arun-hmcts Mar 21, 2026
1d274b1
HDPI-3764: Add universalCredit and ucApplicationDate fields to domain…
arun-hmcts Mar 21, 2026
c4fe9d6
HDPI-3764: Add universal credit amount and frequency columns to incom…
arun-hmcts Mar 23, 2026
98f54f6
HDPI-3764: Rename universal credit income fields to universal credit …
arun-hmcts Mar 24, 2026
44f7e66
Merge branch 'master' into HDPI-3764-income-expenditure-backend
arun-hmcts Mar 24, 2026
bf5d869
HDPI-3764: Rename migration from V070 to V071 to resolve conflict wit…
arun-hmcts Mar 24, 2026
0fe6d06
HDPI-3764: Merge master into income-expenditure-backend branch
arun-hmcts Mar 24, 2026
c361ead
HDPI-3764: Remove unnecessary comments from code
arun-hmcts Mar 24, 2026
0ea2c58
HDPI-3764: Merge master into income-expenditure-backend branch
arun-hmcts Mar 24, 2026
9248269
HDPI-3764: Add mapping for all income fields in HouseholdCircumstance…
arun-hmcts Mar 24, 2026
b07d3b7
HDPI-3764: Merge master into income-expenditure-backend branch
arun-hmcts Mar 26, 2026
45b8178
HDPI-3764: Merge master into income-expenditure-backend branch
arun-hmcts Mar 26, 2026
fec7781
HDPI-3764: Renumber income migration from V071 to V072 due to master …
arun-hmcts Mar 26, 2026
1c41ee7
HDPI-3764: Address peer review comments - add validation, consolidate…
arun-hmcts Mar 26, 2026
06e33a2
HDPI-3764: Convert income frequency fields from String to enum
arun-hmcts Mar 26, 2026
05b1916
HDPI-3764: Further reduce VARCHAR size from 10 to 5 for frequency col…
arun-hmcts Mar 26, 2026
9be81e1
HDPI-3764: Revert VARCHAR size to 10 for frequency columns
arun-hmcts Mar 26, 2026
cc99802
HDPI-3764: Change enum values from WEEK/MONTH to WEEKLY/MONTHLY
arun-hmcts Mar 26, 2026
97e22b7
HDPI-3764: Merge master into income-expenditure-backend branch
arun-hmcts Mar 27, 2026
c61c08c
HDPI-3764: Renumber migration V072 to V073 to resolve conflict after …
arun-hmcts Mar 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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 {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe rename the enum to just 'Frequency' or something more generic? so this enum can be used for both the regular income and regular expenses.

WEEKLY("Weekly"),
MONTHLY("Monthly");

private final String label;

IncomeFrequency(String label) {
this.label = label;
}

@Override
public String getLabel() {
return label;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,15 @@
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;
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;

@Builder
@Data
Expand All @@ -17,4 +24,57 @@ public class HouseholdCircumstances {
@CCD
private YesOrNo dependantChildren;

@CCD
private YesOrNo shareIncomeExpenseDetails;

@CCD
private YesOrNo incomeFromJobs;

@CCD(typeOverride = FieldType.MoneyGBP)
@JacksonMoneyGBP
private BigDecimal incomeFromJobsAmount;

@CCD
private IncomeFrequency incomeFromJobsFrequency;

@CCD
private YesOrNo pension;

@CCD(typeOverride = FieldType.MoneyGBP)
@JacksonMoneyGBP
private BigDecimal pensionAmount;

@CCD
private IncomeFrequency pensionFrequency;

@CCD
private YesOrNo universalCredit;

@CCD
private LocalDate ucApplicationDate;

@CCD(typeOverride = FieldType.MoneyGBP)
@JacksonMoneyGBP
private BigDecimal universalCreditAmount;

@CCD
private IncomeFrequency universalCreditFrequency;

@CCD
private YesOrNo otherBenefits;

@CCD(typeOverride = FieldType.MoneyGBP)
@JacksonMoneyGBP
private BigDecimal otherBenefitsAmount;

@CCD
private IncomeFrequency otherBenefitsFrequency;

@CCD
private YesOrNo moneyFromElsewhere;

@CCD
@Size(max = 500)
private String moneyFromElsewhereDetails;

}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -91,6 +92,48 @@ public class HouseholdCircumstancesEntity {

private LocalDate ucApplicationDate;

@Enumerated(EnumType.STRING)
@JdbcTypeCode(SqlTypes.NAMED_ENUM)
private YesOrNo incomeFromJobs;

private BigDecimal incomeFromJobsAmount;

@Enumerated(EnumType.STRING)
@JdbcTypeCode(SqlTypes.VARCHAR)
private IncomeFrequency incomeFromJobsFrequency;

@Enumerated(EnumType.STRING)
@JdbcTypeCode(SqlTypes.NAMED_ENUM)
private YesOrNo pension;

private BigDecimal pensionAmount;

@Enumerated(EnumType.STRING)
@JdbcTypeCode(SqlTypes.VARCHAR)
private IncomeFrequency pensionFrequency;

private BigDecimal universalCreditAmount;

@Enumerated(EnumType.STRING)
@JdbcTypeCode(SqlTypes.VARCHAR)
private IncomeFrequency universalCreditFrequency;

@Enumerated(EnumType.STRING)
@JdbcTypeCode(SqlTypes.NAMED_ENUM)
private YesOrNo otherBenefits;

private BigDecimal otherBenefitsAmount;

@Enumerated(EnumType.STRING)
@JdbcTypeCode(SqlTypes.VARCHAR)
private IncomeFrequency otherBenefitsFrequency;

@Enumerated(EnumType.STRING)
@JdbcTypeCode(SqlTypes.NAMED_ENUM)
private YesOrNo moneyFromElsewhere;

private String moneyFromElsewhereDetails;

@Enumerated(EnumType.STRING)
@JdbcTypeCode(SqlTypes.NAMED_ENUM)
private YesOrNo priorityDebts;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +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 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);
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,23 @@
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.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;
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.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;
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;
Expand Down Expand Up @@ -54,8 +59,6 @@ void setUp() {
underTest = new SubmitEventHandler(draftCaseDataService, claimResponseService, defendantResponseService);
}

// ========== VALIDATION ERROR CASES ==========

@Test
void shouldReturnErrorWhenPossessionClaimResponseIsNull() {
// Given
Expand Down Expand Up @@ -113,8 +116,6 @@ void shouldReturnErrorWhenDefendantResponsesIsNull() {
verify(draftCaseDataService, never()).deleteUnsubmittedCaseData(anyLong(), eq(respondPossessionClaim));
}

// ========== INDEPENDENT FIELD SUBMISSION TESTS ==========

@Test
void shouldAllowSubmitWithOnlyDefendantResponses() {
DefendantResponses responses = DefendantResponses.builder()
Expand Down Expand Up @@ -275,6 +276,80 @@ void shouldHandleExceptionFromContactPreferencesService() {
verify(claimResponseService).saveDraftData(response, CASE_REFERENCE);
}

@Test
void shouldSubmitRegularIncomeFieldsWhenFinalSubmit() {
HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder()
.shareIncomeExpenseDetails(YesOrNo.YES)
.incomeFromJobs(YesOrNo.YES)
.incomeFromJobsAmount(new BigDecimal("200000")) // £2000.00 in pence
.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.MONTHLY)
.otherBenefits(YesOrNo.NO)
.moneyFromElsewhere(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<PCSCase, State> eventPayload = createEventPayload(caseData);

// When
SubmitResponse<State> 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<PossessionClaimResponse> 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.getShareIncomeExpenseDetails()).isEqualTo(YesOrNo.YES);

assertThat(capturedHousehold.getIncomeFromJobs()).isEqualTo(YesOrNo.YES);
assertThat(capturedHousehold.getIncomeFromJobsAmount()).isEqualByComparingTo("200000");
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.MONTHLY);

assertThat(capturedHousehold.getOtherBenefits()).isEqualTo(YesOrNo.NO);

assertThat(capturedHousehold.getMoneyFromElsewhere()).isEqualTo(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
Expand Down
Loading
Loading