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..bfe61a2c07 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 @@ -17,4 +17,31 @@ public class HouseholdCircumstances { @CCD private YesOrNo dependantChildren; + @CCD + private IncomeExpenseDetails householdBills; + + @CCD + private IncomeExpenseDetails loanPayments; + + @CCD + private IncomeExpenseDetails childSpousalMaintenance; + + @CCD + private IncomeExpenseDetails mobilePhone; + + @CCD + private IncomeExpenseDetails groceryShopping; + + @CCD + private IncomeExpenseDetails fuelParkingTransport; + + @CCD + private IncomeExpenseDetails schoolCosts; + + @CCD + private IncomeExpenseDetails clothing; + + @CCD + private IncomeExpenseDetails otherExpenses; + } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/IncomeExpenseDetails.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/IncomeExpenseDetails.java new file mode 100644 index 0000000000..4d75c71591 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/IncomeExpenseDetails.java @@ -0,0 +1,29 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim; + +import lombok.AllArgsConstructor; +import lombok.Builder; +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; + +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class IncomeExpenseDetails { + + @CCD + private YesOrNo applies; + + @CCD(typeOverride = FieldType.MoneyGBP) + @JacksonMoneyGBP + private BigDecimal amount; + + @CCD + private RecurrenceFrequency frequency; +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/RecurrenceFrequency.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/RecurrenceFrequency.java new file mode 100644 index 0000000000..1c9c716755 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/RecurrenceFrequency.java @@ -0,0 +1,18 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import uk.gov.hmcts.ccd.sdk.api.HasLabel; + +/** + * Enum representing the recurrence frequency of income, benefits, and expenses. + */ +@AllArgsConstructor +@Getter +public enum RecurrenceFrequency implements HasLabel { + WEEKLY("Weekly"), + MONTHLY("Monthly"); + + private final String label; + +} 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..abd6c85b67 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 @@ -20,6 +20,7 @@ import org.hibernate.type.SqlTypes; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.RecurrenceFrequency; import java.math.BigDecimal; import java.time.LocalDate; @@ -101,9 +102,84 @@ public class HouseholdCircumstancesEntity { private String debtContributionFrequency; - private String regularExpenses; + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo householdBills; + + private BigDecimal householdBillsAmount; + + @Enumerated(EnumType.STRING) + private RecurrenceFrequency householdBillsFrequency; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo loanPayments; + + private BigDecimal loanPaymentsAmount; + + @Enumerated(EnumType.STRING) + private RecurrenceFrequency loanPaymentsFrequency; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo childSpousalMaintenance; + + private BigDecimal childSpousalMaintenanceAmount; + + @Enumerated(EnumType.STRING) + private RecurrenceFrequency childSpousalMaintenanceFrequency; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo mobilePhone; + + private BigDecimal mobilePhoneAmount; + + @Enumerated(EnumType.STRING) + private RecurrenceFrequency mobilePhoneFrequency; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo groceryShopping; - private BigDecimal expenseAmount; + private BigDecimal groceryShoppingAmount; - private String expenseFrequency; + @Enumerated(EnumType.STRING) + private RecurrenceFrequency groceryShoppingFrequency; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo fuelParkingTransport; + + private BigDecimal fuelParkingTransportAmount; + + @Enumerated(EnumType.STRING) + private RecurrenceFrequency fuelParkingTransportFrequency; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo schoolCosts; + + private BigDecimal schoolCostsAmount; + + @Enumerated(EnumType.STRING) + private RecurrenceFrequency schoolCostsFrequency; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo clothing; + + private BigDecimal clothingAmount; + + @Enumerated(EnumType.STRING) + private RecurrenceFrequency clothingFrequency; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo otherExpenses; + + private BigDecimal otherExpensesAmount; + + @Enumerated(EnumType.STRING) + private RecurrenceFrequency otherExpensesFrequency; } 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..a76d3bbda7 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 @@ -1,22 +1,63 @@ package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; import org.springframework.stereotype.Service; +import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.HouseholdCircumstances; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.IncomeExpenseDetails; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.RecurrenceFrequency; import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.HouseholdCircumstancesEntity; +import java.math.BigDecimal; + @Service public class HouseholdCircumstancesService { - public HouseholdCircumstancesEntity createHouseholdCircumstancesEntity(HouseholdCircumstances circumstances) { + public HouseholdCircumstancesEntity createHouseholdCircumstancesEntity(HouseholdCircumstances hc) { - if (circumstances == null) { + if (hc == null) { return null; } - - HouseholdCircumstancesEntity householdCircumstancesEntity = HouseholdCircumstancesEntity.builder() - .dependantChildren(circumstances.getDependantChildren()) + return HouseholdCircumstancesEntity.builder() + .dependantChildren(hc.getDependantChildren()) + .householdBills(getApplies(hc.getHouseholdBills())) + .householdBillsAmount(getAmountIfYes(hc.getHouseholdBills())) + .householdBillsFrequency(getFrequencyIfYes(hc.getHouseholdBills())) + .loanPayments(getApplies(hc.getLoanPayments())) + .loanPaymentsAmount(getAmountIfYes(hc.getLoanPayments())) + .loanPaymentsFrequency(getFrequencyIfYes(hc.getLoanPayments())) + .childSpousalMaintenance(getApplies(hc.getChildSpousalMaintenance())) + .childSpousalMaintenanceAmount(getAmountIfYes(hc.getChildSpousalMaintenance())) + .childSpousalMaintenanceFrequency(getFrequencyIfYes(hc.getChildSpousalMaintenance())) + .mobilePhone(getApplies(hc.getMobilePhone())) + .mobilePhoneAmount(getAmountIfYes(hc.getMobilePhone())) + .mobilePhoneFrequency(getFrequencyIfYes(hc.getMobilePhone())) + .groceryShopping(getApplies(hc.getGroceryShopping())) + .groceryShoppingAmount(getAmountIfYes(hc.getGroceryShopping())) + .groceryShoppingFrequency(getFrequencyIfYes(hc.getGroceryShopping())) + .fuelParkingTransport(getApplies(hc.getFuelParkingTransport())) + .fuelParkingTransportAmount(getAmountIfYes(hc.getFuelParkingTransport())) + .fuelParkingTransportFrequency(getFrequencyIfYes(hc.getFuelParkingTransport())) + .schoolCosts(getApplies(hc.getSchoolCosts())) + .schoolCostsAmount(getAmountIfYes(hc.getSchoolCosts())) + .schoolCostsFrequency(getFrequencyIfYes(hc.getSchoolCosts())) + .clothing(getApplies(hc.getClothing())) + .clothingAmount(getAmountIfYes(hc.getClothing())) + .clothingFrequency(getFrequencyIfYes(hc.getClothing())) + .otherExpenses(getApplies(hc.getOtherExpenses())) + .otherExpensesAmount(getAmountIfYes(hc.getOtherExpenses())) + .otherExpensesFrequency(getFrequencyIfYes(hc.getOtherExpenses())) .build(); + } + + private YesOrNo getApplies(IncomeExpenseDetails details) { + return details != null ? details.getApplies() : null; + } + + private BigDecimal getAmountIfYes(IncomeExpenseDetails details) { + return details != null && YesOrNo.YES.equals(details.getApplies()) ? details.getAmount() : null; + } - return householdCircumstancesEntity; + private RecurrenceFrequency getFrequencyIfYes(IncomeExpenseDetails details) { + return details != null && YesOrNo.YES.equals(details.getApplies()) ? details.getFrequency() : null; } } diff --git a/src/main/resources/db/migration/V073__alter_statement_of_truth_field_sizes.sql b/src/main/resources/db/migration/V075__alter_statement_of_truth_field_sizes.sql similarity index 100% rename from src/main/resources/db/migration/V073__alter_statement_of_truth_field_sizes.sql rename to src/main/resources/db/migration/V075__alter_statement_of_truth_field_sizes.sql diff --git a/src/main/resources/db/migration/V076__add_regular_expenses_columns.sql b/src/main/resources/db/migration/V076__add_regular_expenses_columns.sql new file mode 100644 index 0000000000..9f9100ac5a --- /dev/null +++ b/src/main/resources/db/migration/V076__add_regular_expenses_columns.sql @@ -0,0 +1,41 @@ +ALTER TABLE household_circumstances + ADD COLUMN household_bills YES_NO, + ADD COLUMN household_bills_amount DECIMAL(18,2), + ADD COLUMN household_bills_frequency VARCHAR(10), + + ADD COLUMN loan_payments YES_NO, + ADD COLUMN loan_payments_amount DECIMAL(18,2), + ADD COLUMN loan_payments_frequency VARCHAR(10), + + ADD COLUMN child_spousal_maintenance YES_NO, + ADD COLUMN child_spousal_maintenance_amount DECIMAL(18,2), + ADD COLUMN child_spousal_maintenance_frequency VARCHAR(10), + + ADD COLUMN mobile_phone YES_NO, + ADD COLUMN mobile_phone_amount DECIMAL(18,2), + ADD COLUMN mobile_phone_frequency VARCHAR(10), + + ADD COLUMN grocery_shopping YES_NO, + ADD COLUMN grocery_shopping_amount DECIMAL(18,2), + ADD COLUMN grocery_shopping_frequency VARCHAR(10), + + ADD COLUMN fuel_parking_transport YES_NO, + ADD COLUMN fuel_parking_transport_amount DECIMAL(18,2), + ADD COLUMN fuel_parking_transport_frequency VARCHAR(10), + + ADD COLUMN school_costs YES_NO, + ADD COLUMN school_costs_amount DECIMAL(18,2), + ADD COLUMN school_costs_frequency VARCHAR(10), + + ADD COLUMN clothing YES_NO, + ADD COLUMN clothing_amount DECIMAL(18,2), + ADD COLUMN clothing_frequency VARCHAR(10), + + ADD COLUMN other_expenses YES_NO, + ADD COLUMN other_expenses_amount DECIMAL(18,2), + ADD COLUMN other_expenses_frequency VARCHAR(10), + + DROP COLUMN regular_expenses, + DROP COLUMN expense_amount, + DROP COLUMN expense_frequency; + diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesServiceTest.java index 3fc4c62e6f..b916c120f4 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesServiceTest.java @@ -5,12 +5,17 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullSource; import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.HouseholdCircumstances; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.IncomeExpenseDetails; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.RecurrenceFrequency; import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.HouseholdCircumstancesEntity; +import java.math.BigDecimal; import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; @@ -58,5 +63,82 @@ void shouldReturnNullWhenHouseholdCircumstancesIsNull() { assertThat(entity).isNull(); } + @Test + void shouldMapExpenseAmountsAndFrequenciesWhenAnswerIsYes() { + HouseholdCircumstances householdCircumstances = buildExpenseFields(YesOrNo.YES); + + HouseholdCircumstancesEntity entity = + underTest.createHouseholdCircumstancesEntity(householdCircumstances); + + assertThat(entity.getHouseholdBillsAmount()).isEqualByComparingTo(new BigDecimal("100.00")); + assertThat(entity.getHouseholdBillsFrequency()).isEqualTo(RecurrenceFrequency.MONTHLY); + assertThat(entity.getLoanPaymentsAmount()).isEqualByComparingTo(new BigDecimal("200.00")); + assertThat(entity.getLoanPaymentsFrequency()).isEqualTo(RecurrenceFrequency.WEEKLY); + assertThat(entity.getChildSpousalMaintenanceAmount()).isEqualByComparingTo(new BigDecimal("300.00")); + assertThat(entity.getChildSpousalMaintenanceFrequency()).isEqualTo(RecurrenceFrequency.MONTHLY); + assertThat(entity.getMobilePhoneAmount()).isEqualByComparingTo(new BigDecimal("400.00")); + assertThat(entity.getMobilePhoneFrequency()).isEqualTo(RecurrenceFrequency.WEEKLY); + assertThat(entity.getGroceryShoppingAmount()).isEqualByComparingTo(new BigDecimal("500.00")); + assertThat(entity.getGroceryShoppingFrequency()).isEqualTo(RecurrenceFrequency.MONTHLY); + assertThat(entity.getFuelParkingTransportAmount()).isEqualByComparingTo(new BigDecimal("600.00")); + assertThat(entity.getFuelParkingTransportFrequency()).isEqualTo(RecurrenceFrequency.WEEKLY); + assertThat(entity.getSchoolCostsAmount()).isEqualByComparingTo(new BigDecimal("700.00")); + assertThat(entity.getSchoolCostsFrequency()).isEqualTo(RecurrenceFrequency.MONTHLY); + assertThat(entity.getClothingAmount()).isEqualByComparingTo(new BigDecimal("800.00")); + assertThat(entity.getClothingFrequency()).isEqualTo(RecurrenceFrequency.WEEKLY); + assertThat(entity.getOtherExpensesAmount()).isEqualByComparingTo(new BigDecimal("900.00")); + assertThat(entity.getOtherExpensesFrequency()).isEqualTo(RecurrenceFrequency.MONTHLY); + } + + @ParameterizedTest + @NullSource + @EnumSource(value = YesOrNo.class, names = "NO") + void shouldNotMapExpenseAmountsAndFrequenciesWhenAnswerIsNotYes(YesOrNo answer) { + HouseholdCircumstances householdCircumstances = buildExpenseFields(answer); + + HouseholdCircumstancesEntity entity = + underTest.createHouseholdCircumstancesEntity(householdCircumstances); + + assertThat(entity.getHouseholdBillsAmount()).isNull(); + assertThat(entity.getHouseholdBillsFrequency()).isNull(); + assertThat(entity.getLoanPaymentsAmount()).isNull(); + assertThat(entity.getLoanPaymentsFrequency()).isNull(); + assertThat(entity.getChildSpousalMaintenanceAmount()).isNull(); + assertThat(entity.getChildSpousalMaintenanceFrequency()).isNull(); + assertThat(entity.getMobilePhoneAmount()).isNull(); + assertThat(entity.getMobilePhoneFrequency()).isNull(); + assertThat(entity.getGroceryShoppingAmount()).isNull(); + assertThat(entity.getGroceryShoppingFrequency()).isNull(); + assertThat(entity.getFuelParkingTransportAmount()).isNull(); + assertThat(entity.getFuelParkingTransportFrequency()).isNull(); + assertThat(entity.getSchoolCostsAmount()).isNull(); + assertThat(entity.getSchoolCostsFrequency()).isNull(); + assertThat(entity.getClothingAmount()).isNull(); + assertThat(entity.getClothingFrequency()).isNull(); + assertThat(entity.getOtherExpensesAmount()).isNull(); + assertThat(entity.getOtherExpensesFrequency()).isNull(); + } + + private static HouseholdCircumstances buildExpenseFields(YesOrNo answer) { + return HouseholdCircumstances.builder() + .householdBills(buildExpense(answer, "100.00", RecurrenceFrequency.MONTHLY)) + .loanPayments(buildExpense(answer, "200.00", RecurrenceFrequency.WEEKLY)) + .childSpousalMaintenance(buildExpense(answer, "300.00", RecurrenceFrequency.MONTHLY)) + .mobilePhone(buildExpense(answer, "400.00", RecurrenceFrequency.WEEKLY)) + .groceryShopping(buildExpense(answer, "500.00", RecurrenceFrequency.MONTHLY)) + .fuelParkingTransport(buildExpense(answer, "600.00", RecurrenceFrequency.WEEKLY)) + .schoolCosts(buildExpense(answer, "700.00", RecurrenceFrequency.MONTHLY)) + .clothing(buildExpense(answer, "800.00", RecurrenceFrequency.WEEKLY)) + .otherExpenses(buildExpense(answer, "900.00", RecurrenceFrequency.MONTHLY)) + .build(); + } + + private static IncomeExpenseDetails buildExpense(YesOrNo applies, String amount, RecurrenceFrequency frequency) { + return IncomeExpenseDetails.builder() + .applies(applies) + .amount(new BigDecimal(amount)) + .frequency(frequency) + .build(); + } }