From 076dd1707aa91ba8c2efaddf3b36d2c483aecebb Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Mon, 9 Mar 2026 11:26:28 +0000 Subject: [PATCH 01/26] HDPI-5191:Created migration scripts --- .../V063__update_defendant_response_table.sql | 18 ++++++ .../V064__create_respond_to_claim_tables.sql | 60 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/main/resources/db/migration/V063__update_defendant_response_table.sql create mode 100644 src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql diff --git a/src/main/resources/db/migration/V063__update_defendant_response_table.sql b/src/main/resources/db/migration/V063__update_defendant_response_table.sql new file mode 100644 index 0000000000..ef597081ca --- /dev/null +++ b/src/main/resources/db/migration/V063__update_defendant_response_table.sql @@ -0,0 +1,18 @@ +ALTER TABLE defendant_response + ADD COLUMN sot_id UUID NOT NULL REFERENCES statement_of_truth(id), --found in claim, has 1-to-1 mapping + ADD COLUMN pcs_case_id UUID NOT NULL REFERENCES pcs_case(id),--found in claim + ADD COLUMN correspondence_address_confirmation YES_NO NOT NULL, + ADD COLUMN possession_notice_received YES_NO, + ADD COLUMN notice_received_date DATE, + ADD COLUMN rent_arrears_amount_confirmation YES_NO, + ADD COLUMN dispute_claim YES_NO NOT NULL, + ADD COLUMN landlord_registered YES_NO NOT NULL, + ADD COLUMN make_counter_claim YES_NO NOT NULL, + ADD COLUMN version INT, + ADD COLUMN status VARCHAR(60), + ADD COLUMN response_submitted_date TIMESTAMP, + ADD COLUMN response_deleted_date TIMESTAMP, + ADD COLUMN response_received_date TIMESTAMP, + ADD COLUMN language_used TEXT NOT NULL, + ADD COLUMN channel VARCHAR(60), + ADD COLUMN ingestion_source VARCHAR(60); diff --git a/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql b/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql new file mode 100644 index 0000000000..2915cbe65d --- /dev/null +++ b/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql @@ -0,0 +1,60 @@ +-- reasonable_adjustments +CREATE TABLE reasonable_adjustments ( + id UUID PRIMARY KEY, + defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), + reasonable_adjustments_required VARCHAR(250) NOT NULL, + reasonable_adjustment_description VARCHAR(500), + hearing_enhancement_description VARCHAR(250), + sign_language_support_description VARCHAR(250), + travel_support_description VARCHAR(250), + welsh_language_requirements VARCHAR(250) NOT NULL, + language_interpreter YES_NO NOT NULL, + language_support_description VARCHAR(250), + considered_vulnerable YES_NO NOT NULL, + vulnerable_characteristic_description VARCHAR(250) +); + + +-- household_circumstances +CREATE TABLE household_circumstances ( + id UUID PRIMARY KEY, + defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), + dependant_children YES_NO NOT NULL, + dependant_children_details VARCHAR(500), + other_dependants YES_NO NOT NULL, + other_dependant_details VARCHAR(500) NOT NULL, + other_tenants YES_NO, + other_tenants_details VARCHAR(500) NOT NULL, + alternative_accommodation YES_NO_NOT_SURE, + alternative_accommodation_transfer_date DATE, + share_additional_circumstances YES_NO NOT NULL, + additional_circumstances_details VARCHAR(500), + exceptional_hardship YES_NO NOT NULL, + exceptional_hardship_details VARCHAR(500), + share_income_expense_details YES_NO NOT NULL, + regular_income VARCHAR(60) NOT NULL, + universal_credit YES_NO NOT NULL, + uc_application_date DATE, + priority_debts YES_NO NOT NULL, + debt_total DECIMAL(18,2), + debt_contribution VARCHAR(60), + debt_contribution_frequency VARCHAR(60), + regular_expenses VARCHAR(500) NOT NULL, + expense_amount DECIMAL(18,2), + expense_frequency VARCHAR(60) +); + + +-- payment_agreement +CREATE TABLE payment_agreement ( + id UUID PRIMARY KEY, + defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), + any_payments_made YES_NO NOT NULL, + payment_details VARCHAR(500), + paid_money_to_housing_org YES_NO, + repayment_plan_agreed YES_NO, + repayment_agreed_details VARCHAR(500), + repay_arrears_instalments YES_NO NOT NULL, + additional_rent_contribution DECIMAL(18,2), + additional_contribution_frequency VARCHAR(50) +); From b7d3ab20384173873a0d9055b5392ef03760e388 Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Mon, 9 Mar 2026 11:28:51 +0000 Subject: [PATCH 02/26] HDPI-5191:WIP --- .../HouseholdCircumstances.java | 16 ++++ .../PaymentAgreement.java | 13 +++ .../PossessionClaimResponse.java | 9 ++ .../ReasonableAdjustments.java | 13 +++ .../DefendantResponseEntity.java | 19 +++- .../HouseholdCircumstancesEntity.java | 86 +++++++++++++++++++ .../PaymentAgreementEntity.java | 49 +++++++++++ .../ReasonableAdjustmentEntity.java | 51 +++++++++++ .../SubmitEventHandler.java | 4 +- .../DefendantResponseRepository.java | 2 +- .../ClaimResponseService.java | 4 +- .../DefendantResponseService.java | 4 +- .../ccd/event/RespondPossessionClaimTest.java | 4 +- .../SubmitEventHandlerTest.java | 4 +- .../ccd/service/ClaimResponseServiceTest.java | 1 + .../service/DefendantResponseServiceTest.java | 3 +- 16 files changed, 269 insertions(+), 13 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java rename src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/{ => respondpossessionclaim}/DefendantResponseEntity.java (66%) create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java rename src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/{ => respondpossessionclaim}/ClaimResponseService.java (98%) rename src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/{ => respondpossessionclaim}/DefendantResponseService.java (96%) 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 new file mode 100644 index 0000000000..c61aff2abc --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/HouseholdCircumstances.java @@ -0,0 +1,16 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class HouseholdCircumstances { + + +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java new file mode 100644 index 0000000000..d9ef02f565 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java @@ -0,0 +1,13 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class PaymentAgreement { +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PossessionClaimResponse.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PossessionClaimResponse.java index 41700ac935..c317fd2850 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PossessionClaimResponse.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PossessionClaimResponse.java @@ -39,5 +39,14 @@ public class PossessionClaimResponse { @CCD(access = {CitizenAccess.class}) private DefendantResponses defendantResponses; + + @CCD(access = {CitizenAccess.class}) + private ReasonableAdjustments reasonableAdjustments; + + @CCD(access = {CitizenAccess.class}) + private HouseholdCircumstances householdCircumstances; + + @CCD(access = {CitizenAccess.class}) + private PaymentAgreement paymentAgreement; } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java new file mode 100644 index 0000000000..3fa7cf5da9 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java @@ -0,0 +1,13 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Builder +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ReasonableAdjustments { +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java similarity index 66% rename from src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java rename to src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java index 1fe409bb6b..2231b817f9 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/DefendantResponseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java @@ -1,5 +1,6 @@ -package uk.gov.hmcts.reform.pcs.ccd.entity; +package uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim; +import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -10,6 +11,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import lombok.AllArgsConstructor; import lombok.Builder; @@ -19,10 +21,13 @@ import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoPreferNotToSay; +import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; import java.util.UUID; +import static jakarta.persistence.CascadeType.ALL; + @Entity @Table(name = "defendant_response") @Getter @@ -44,6 +49,18 @@ public class DefendantResponseEntity { @JoinColumn(name = "party_id", nullable = false) private PartyEntity party; + @OneToOne(cascade = ALL, mappedBy = "defendantResponse", orphanRemoval = true) + @JsonManagedReference + private HouseholdCircumstancesEntity householdCircumstances; + + @OneToOne(cascade = ALL, mappedBy = "defendantResponse", orphanRemoval = true) + @JsonManagedReference + private PaymentAgreementEntity paymentAgreement; + + @OneToOne(cascade = ALL, mappedBy = "defendantResponse", orphanRemoval = true) + @JsonManagedReference + private ReasonableAdjustmentEntity reasonableAdjustment; + @Column(name = "possession_order_type", length = 30) private String possessionOrderType; 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 new file mode 100644 index 0000000000..2fbbe74ec9 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/HouseholdCircumstancesEntity.java @@ -0,0 +1,86 @@ +package uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import uk.gov.hmcts.ccd.sdk.type.YesOrNo; +import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.UUID; + +@Entity +@Table(name = "household_circumstances") +public class HouseholdCircumstancesEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + @OneToOne(fetch = FetchType.LAZY) + @JsonBackReference + private DefendantResponseEntity defendantResponse; + + @Enumerated(EnumType.STRING) + private YesOrNo dependantChildren; + + private String dependantChildrenDetails; + + @Enumerated(EnumType.STRING) + private YesOrNo otherDependants; + + private String otherDependantDetails; + + @Enumerated(EnumType.STRING) + private YesOrNo otherTenants; + + private String otherTenantsDetails; + + @Enumerated(EnumType.STRING) + private YesNoNotSure alternativeAccommodation; + + private LocalDate alternativeAccommodationTransferDate; + + @Enumerated(EnumType.STRING) + private YesOrNo shareAdditionalCircumstances; + + private String additionalCircumstancesDetails; + + @Enumerated(EnumType.STRING) + private YesOrNo exceptionalHardship; + + private String exceptionalHardshipDetails; + + @Enumerated(EnumType.STRING) + private YesOrNo shareIncomeExpenseDetails; + + private String regularIncome; + + @Enumerated(EnumType.STRING) + private YesOrNo universalCredit; + + private LocalDate ucApplicationDate; + + @Enumerated(EnumType.STRING) + private YesOrNo priorityDebts; + + private BigDecimal debtTotal; + + private String debtContribution; + + private String debtContributionFrequency; + + private String regularExpenses; + + private BigDecimal expenseAmount; + + private String expenseFrequency; +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java new file mode 100644 index 0000000000..2d29671752 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java @@ -0,0 +1,49 @@ +package uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import uk.gov.hmcts.ccd.sdk.type.YesOrNo; + +import java.math.BigDecimal; +import java.util.UUID; + +@Entity +@Table(name = "payment_agreement") +public class PaymentAgreementEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + @OneToOne(fetch = FetchType.LAZY) + @JsonBackReference + private DefendantResponseEntity defendantResponse; + + @Enumerated(EnumType.STRING) + private YesOrNo anyPaymentsMade; + + private String paymentDetails; + + @Enumerated(EnumType.STRING) + private YesOrNo paidMoneyToHousingOrg; + + @Enumerated(EnumType.STRING) + private YesOrNo repaymentPlanAgreed; + + private String repaymentAgreedDetails; + + @Enumerated(EnumType.STRING) + private YesOrNo repayArrearsInstalments; + + private BigDecimal additionalRentContribution; + + private String additionalContributionFrequency; +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java new file mode 100644 index 0000000000..66152efb73 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java @@ -0,0 +1,51 @@ +package uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim; + + +import com.fasterxml.jackson.annotation.JsonBackReference; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import uk.gov.hmcts.ccd.sdk.type.YesOrNo; + +import java.util.UUID; + +@Entity +@Table(name = "reasonable_adjustments") +public class ReasonableAdjustmentEntity { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + @OneToOne(fetch = FetchType.LAZY) + @JsonBackReference + private DefendantResponseEntity defendantResponse; + + private String reasonableAdjustmentsRequired; + + private String reasonableAdjustmentDescription; + + private String hearingEnhancementDescription; + + private String signLanguageSupportDescription; + + private String travelSupportDescription; + + private String welshLanguageRequirements; + + @Enumerated(EnumType.STRING) + private YesOrNo languageInterpreter; + + private String languageSupportDescription; + + @Enumerated(EnumType.STRING) + private YesOrNo consideredVulnerable; + + private String vulnerableCharacteristicDescription; +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java index b3ba36d711..8a9ffa8963 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java @@ -9,9 +9,9 @@ import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; import uk.gov.hmcts.reform.pcs.ccd.domain.State; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PossessionClaimResponse; -import uk.gov.hmcts.reform.pcs.ccd.service.ClaimResponseService; -import uk.gov.hmcts.reform.pcs.ccd.service.DefendantResponseService; 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 uk.gov.hmcts.reform.pcs.exception.DraftNotFoundException; import java.util.List; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/repository/DefendantResponseRepository.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/repository/DefendantResponseRepository.java index f2e050f50d..9ddb3a6972 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/repository/DefendantResponseRepository.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/repository/DefendantResponseRepository.java @@ -2,7 +2,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import uk.gov.hmcts.reform.pcs.ccd.entity.DefendantResponseEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.DefendantResponseEntity; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/ClaimResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ClaimResponseService.java similarity index 98% rename from src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/ClaimResponseService.java rename to src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ClaimResponseService.java index 9f55e0154e..965bcf38e5 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/ClaimResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ClaimResponseService.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.reform.pcs.ccd.service; +package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -6,10 +6,10 @@ import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; import uk.gov.hmcts.ccd.sdk.type.AddressUK; +import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; 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.PossessionClaimResponse; -import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; import uk.gov.hmcts.reform.pcs.ccd.entity.AddressEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.party.ContactPreferencesEntity; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java similarity index 96% rename from src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java rename to src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java index 2e1e0dfe3e..f7cc759594 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.reform.pcs.ccd.service; +package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -6,9 +6,9 @@ import org.springframework.transaction.annotation.Transactional; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; -import uk.gov.hmcts.reform.pcs.ccd.entity.DefendantResponseEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.DefendantResponseEntity; import uk.gov.hmcts.reform.pcs.ccd.repository.ClaimRepository; import uk.gov.hmcts.reform.pcs.ccd.repository.DefendantResponseRepository; import uk.gov.hmcts.reform.pcs.ccd.repository.PartyRepository; diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java index 936a0bbed5..6d69c87db0 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java @@ -21,11 +21,11 @@ import uk.gov.hmcts.reform.pcs.ccd.event.respondpossessionclaim.StartEventHandler; import uk.gov.hmcts.reform.pcs.ccd.event.respondpossessionclaim.SubmitEventHandler; import uk.gov.hmcts.reform.pcs.ccd.page.respondpossessionclaim.page.RespondToPossessionDraftSavePage; -import uk.gov.hmcts.reform.pcs.ccd.service.ClaimResponseService; -import uk.gov.hmcts.reform.pcs.ccd.service.DefendantResponseService; import uk.gov.hmcts.reform.pcs.ccd.service.DraftCaseDataService; import uk.gov.hmcts.reform.pcs.ccd.service.PcsCaseService; import uk.gov.hmcts.reform.pcs.ccd.service.party.DefendantAccessValidator; +import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.ClaimResponseService; +import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.DefendantResponseService; import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.PossessionClaimResponseMapper; import uk.gov.hmcts.reform.pcs.exception.CaseAccessException; import uk.gov.hmcts.reform.pcs.security.SecurityContextService; diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandlerTest.java index 4dfacefada..6beee0932d 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 @@ -17,9 +17,9 @@ 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.PossessionClaimResponse; -import uk.gov.hmcts.reform.pcs.ccd.service.ClaimResponseService; -import uk.gov.hmcts.reform.pcs.ccd.service.DefendantResponseService; 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.util.Optional; diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/ClaimResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/ClaimResponseServiceTest.java index 656ffe8044..c318974570 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/ClaimResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/ClaimResponseServiceTest.java @@ -21,6 +21,7 @@ import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; import uk.gov.hmcts.reform.pcs.ccd.repository.PartyRepository; import uk.gov.hmcts.reform.pcs.ccd.repository.PcsCaseRepository; +import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.ClaimResponseService; import uk.gov.hmcts.reform.pcs.security.SecurityContextService; import java.util.Optional; diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index bc12d34483..872c98e5e8 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -10,13 +10,14 @@ import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoPreferNotToSay; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; -import uk.gov.hmcts.reform.pcs.ccd.entity.DefendantResponseEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.DefendantResponseEntity; import uk.gov.hmcts.reform.pcs.ccd.repository.ClaimRepository; import uk.gov.hmcts.reform.pcs.ccd.repository.DefendantResponseRepository; import uk.gov.hmcts.reform.pcs.ccd.repository.PartyRepository; import uk.gov.hmcts.reform.pcs.ccd.repository.PcsCaseRepository; +import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.DefendantResponseService; import uk.gov.hmcts.reform.pcs.security.SecurityContextService; import java.util.Optional; From 9ed80fc298c7cccf64753fff6b819d30d12e67a0 Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Mon, 9 Mar 2026 21:06:35 +0000 Subject: [PATCH 03/26] HDPI-5191:Added relevant services,updated entities & tests --- .../HouseholdCircumstances.java | 4 + .../PaymentAgreement.java | 6 + .../ReasonableAdjustments.java | 4 + .../reform/pcs/ccd/entity/PcsCaseEntity.java | 11 ++ .../entity/claim/StatementOfTruthEntity.java | 6 + .../DefendantResponseEntity.java | 104 ++++++++++++++++++ .../HouseholdCircumstancesEntity.java | 21 ++++ .../PaymentAgreementEntity.java | 16 +++ .../ReasonableAdjustmentEntity.java | 14 +++ .../SubmitEventHandler.java | 2 +- .../DefendantResponseService.java | 52 +++++++-- .../HouseholdCircumstancesService.java | 18 +++ .../PaymentAgreementService.java | 18 +++ .../ReasonableAdjustmentsService.java | 19 ++++ .../SubmitEventHandlerTest.java | 2 +- .../service/DefendantResponseServiceTest.java | 79 +++++++++++-- 16 files changed, 354 insertions(+), 22 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesService.java create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementService.java create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsService.java 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 c61aff2abc..63b5b90d92 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,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import uk.gov.hmcts.ccd.sdk.api.CCD; +import uk.gov.hmcts.ccd.sdk.type.YesOrNo; @Builder @Data @@ -12,5 +14,7 @@ @AllArgsConstructor public class HouseholdCircumstances { + @CCD + private YesOrNo dependantChildren; } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java index d9ef02f565..ae7184bd17 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java @@ -4,10 +4,16 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import uk.gov.hmcts.ccd.sdk.api.CCD; +import uk.gov.hmcts.ccd.sdk.type.YesOrNo; @Builder @Data @NoArgsConstructor @AllArgsConstructor public class PaymentAgreement { + + @CCD + private YesOrNo anyPaymentsMade; + } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java index 3fa7cf5da9..276ec8b212 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java @@ -4,10 +4,14 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import uk.gov.hmcts.ccd.sdk.api.CCD; @Builder @Data @NoArgsConstructor @AllArgsConstructor public class ReasonableAdjustments { + + @CCD + private String reasonableAdjustmentRequired; } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/PcsCaseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/PcsCaseEntity.java index 01e9816540..7bb52e8974 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/PcsCaseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/PcsCaseEntity.java @@ -18,6 +18,7 @@ import lombok.Setter; import uk.gov.hmcts.reform.pcs.ccd.domain.ClaimantType; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.DefendantResponseEntity; import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; import java.util.ArrayList; @@ -72,6 +73,11 @@ public class PcsCaseEntity { @JsonManagedReference private List claims = new ArrayList<>(); + @OneToMany(mappedBy = "pcsCase", fetch = LAZY, cascade = ALL) + @Builder.Default + @JsonManagedReference + private List defendantResponses = new ArrayList<>(); + @OneToMany(mappedBy = "pcsCase", fetch = LAZY, cascade = ALL, orphanRemoval = true) @Builder.Default @JsonManagedReference @@ -105,4 +111,9 @@ public void addDocuments(List documents) { this.documents.add(document); } } + + public void addDefendantResponse(DefendantResponseEntity defendantResponse) { + defendantResponses.add(defendantResponse); + defendantResponse.setPcsCase(this); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/claim/StatementOfTruthEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/claim/StatementOfTruthEntity.java index 7d0d1ebca6..bc849b97f1 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/claim/StatementOfTruthEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/claim/StatementOfTruthEntity.java @@ -4,6 +4,7 @@ import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @@ -19,6 +20,7 @@ import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.domain.statementoftruth.StatementOfTruthCompletedBy; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.DefendantResponseEntity; import java.util.UUID; @@ -39,6 +41,10 @@ public class StatementOfTruthEntity { @JsonBackReference private ClaimEntity claim; + @OneToOne(mappedBy = "statementOfTruth", fetch = FetchType.LAZY) + @JsonBackReference + private DefendantResponseEntity defendantResponse; + @Enumerated(EnumType.STRING) private StatementOfTruthCompletedBy completedBy; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java index 2231b817f9..c2149dc6c1 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java @@ -20,10 +20,15 @@ import lombok.Setter; 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.YesNoPreferNotToSay; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.claim.StatementOfTruthEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.UUID; import static jakarta.persistence.CascadeType.ALL; @@ -49,6 +54,15 @@ public class DefendantResponseEntity { @JoinColumn(name = "party_id", nullable = false) private PartyEntity party; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "pcs_case_id", nullable = false) + private PcsCaseEntity pcsCase; + + @OneToOne(cascade = ALL, orphanRemoval = true) + @JoinColumn(name = "sot_id", nullable = false) + @JsonManagedReference + private StatementOfTruthEntity statementOfTruth; + @OneToOne(cascade = ALL, mappedBy = "defendantResponse", orphanRemoval = true) @JsonManagedReference private HouseholdCircumstancesEntity householdCircumstances; @@ -68,4 +82,94 @@ public class DefendantResponseEntity { @JdbcTypeCode(SqlTypes.NAMED_ENUM) @Column(name = "received_free_legal_advice") private YesNoPreferNotToSay receivedFreeLegalAdvice; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo correspondenceAddressConfirmation; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo possessionNoticeReceived; + + private LocalDate noticeReceivedDate; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo rentArrearsAmountConfirmation; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo disputeClaim; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo landlordRegistered; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo makeCounterClaim; + + private Integer version; + + private String status; + + private LocalDateTime responseSubmittedDate; + + private LocalDateTime responseDeletedDate; + + private LocalDateTime responseReceivedDate; + + private String languageUsed; + + private String channel; + + private String ingestionSource; + + public void setHouseholdCircumstances(HouseholdCircumstancesEntity housingActWales) { + if (this.householdCircumstances != null) { + this.householdCircumstances.setDefendantResponse(null); + } + + this.householdCircumstances = housingActWales; + + if (this.householdCircumstances != null) { + this.householdCircumstances.setDefendantResponse(this); + } + } + + public void setReasonableAdjustment(ReasonableAdjustmentEntity reasonableAdjustment) { + if (this.reasonableAdjustment != null) { + this.reasonableAdjustment.setDefendantResponse(null); + } + + this.reasonableAdjustment = reasonableAdjustment; + + if (this.reasonableAdjustment != null) { + this.reasonableAdjustment.setDefendantResponse(this); + } + } + + public void setPaymentAgreement(PaymentAgreementEntity paymentAgreement) { + if (this.paymentAgreement != null) { + this.paymentAgreement.setDefendantResponse(null); + } + + this.paymentAgreement = paymentAgreement; + + if (this.paymentAgreement != null) { + this.paymentAgreement.setDefendantResponse(this); + } + } + + public void setStatementOfTruth(StatementOfTruthEntity statementOfTruth) { + if (this.statementOfTruth != null) { + this.statementOfTruth.setDefendantResponse(null); + } + + this.statementOfTruth = statementOfTruth; + + if (this.statementOfTruth != null) { + this.statementOfTruth.setDefendantResponse(this); + } + } } 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 2fbbe74ec9..0338e5a129 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 @@ -10,6 +10,13 @@ import jakarta.persistence.Id; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +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.YesNoNotSure; @@ -19,6 +26,11 @@ @Entity @Table(name = "household_circumstances") +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor public class HouseholdCircumstancesEntity { @Id @@ -30,46 +42,55 @@ public class HouseholdCircumstancesEntity { private DefendantResponseEntity defendantResponse; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo dependantChildren; private String dependantChildrenDetails; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo otherDependants; private String otherDependantDetails; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo otherTenants; private String otherTenantsDetails; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesNoNotSure alternativeAccommodation; private LocalDate alternativeAccommodationTransferDate; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo shareAdditionalCircumstances; private String additionalCircumstancesDetails; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo exceptionalHardship; private String exceptionalHardshipDetails; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo shareIncomeExpenseDetails; private String regularIncome; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo universalCredit; private LocalDate ucApplicationDate; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo priorityDebts; private BigDecimal debtTotal; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java index 2d29671752..1f1b1384cc 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java @@ -10,6 +10,13 @@ import jakarta.persistence.Id; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import java.math.BigDecimal; @@ -17,6 +24,11 @@ @Entity @Table(name = "payment_agreement") +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor public class PaymentAgreementEntity { @Id @@ -28,19 +40,23 @@ public class PaymentAgreementEntity { private DefendantResponseEntity defendantResponse; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo anyPaymentsMade; private String paymentDetails; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo paidMoneyToHousingOrg; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo repaymentPlanAgreed; private String repaymentAgreedDetails; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo repayArrearsInstalments; private BigDecimal additionalRentContribution; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java index 66152efb73..59530aea9a 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java @@ -11,12 +11,24 @@ import jakarta.persistence.Id; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import java.util.UUID; @Entity @Table(name = "reasonable_adjustments") +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor public class ReasonableAdjustmentEntity { @Id @@ -40,11 +52,13 @@ public class ReasonableAdjustmentEntity { private String welshLanguageRequirements; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo languageInterpreter; private String languageSupportDescription; @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo consideredVulnerable; private String vulnerableCharacteristicDescription; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java index 8a9ffa8963..cd2c474980 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java @@ -66,7 +66,7 @@ private SubmitResponse processFinalSubmit(long caseReference) { .saveDraftData(responseDraftData, caseReference); defendantResponseService.saveDefendantResponse(caseReference, - responseDraftData.getDefendantResponses()); + responseDraftData); //delete draft as it's no longer needed draftCaseDataService.deleteUnsubmittedCaseData(caseReference, respondPossessionClaim); diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java index 7a33e1802f..acf62a3b10 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java @@ -5,7 +5,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PossessionClaimResponse; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.claim.StatementOfTruthEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.DefendantResponseEntity; import uk.gov.hmcts.reform.pcs.ccd.repository.ClaimRepository; @@ -39,6 +41,9 @@ public class DefendantResponseService { private final ClaimRepository claimRepository; private final DefendantResponseRepository defendantResponseRepository; private final SecurityContextService securityContextService; + private final ReasonableAdjustmentsService reasonableAdjustmentsService; + private final HouseholdCircumstancesService householdCircumstancesService; + private final PaymentAgreementService paymentAgreementService; /** * Saves defendant's responses to the defendant_response table. @@ -55,13 +60,19 @@ public class DefendantResponseService { * without blocking each other or other case operations. * * @param caseReference The case reference number - * @param responses Defendant's responses from draft data + * @param possessionClaimResponse responses from draft data * @throws IllegalStateException if user ID is null, response already exists, * party not found, or claim not found */ - public void saveDefendantResponse(long caseReference, DefendantResponses responses) { + public void saveDefendantResponse(long caseReference, PossessionClaimResponse possessionClaimResponse) { UUID userId = securityContextService.getCurrentUserId(); + // Early return if no responses to save + if (possessionClaimResponse == null) { + log.debug("No defendant responses to save for case {}", caseReference); + return; + } + if (userId == null) { log.error("Cannot save defendant response: current user IDAM ID is null"); throw new IllegalStateException("Current user IDAM ID is null"); @@ -74,12 +85,6 @@ public void saveDefendantResponse(long caseReference, DefendantResponses respons throw new IllegalStateException("A response has already been submitted for this case."); } - // Early return if no responses to save - if (responses == null) { - log.debug("No defendant responses to save for case {}", caseReference); - return; - } - UUID partyId = partyService.getPartyEntityByIdamId(userId, caseReference).getId(); UUID claimId = claimRepository.findIdByCaseReference(caseReference) @@ -92,14 +97,45 @@ public void saveDefendantResponse(long caseReference, DefendantResponses respons PartyEntity partyRef = partyRepository.getReferenceById(partyId); ClaimEntity claimRef = claimRepository.getReferenceById(claimId); + DefendantResponses responses = possessionClaimResponse.getDefendantResponses(); DefendantResponseEntity defendantResponse = DefendantResponseEntity.builder() .claim(claimRef) .party(partyRef) .receivedFreeLegalAdvice(responses.getReceivedFreeLegalAdvice()) .build(); + //set bidirectional relationship with the pcs case + claimRef.getPcsCase().addDefendantResponse(defendantResponse); + //empty for now to satisfy not null constraint + defendantResponse.setStatementOfTruth(new StatementOfTruthEntity()); + buildAndLinkChildEntities(defendantResponse, possessionClaimResponse); + defendantResponseRepository.save(defendantResponse); log.info("Successfully saved defendant response for case {} user {}", caseReference, userId); } + + + public void buildAndLinkChildEntities( + DefendantResponseEntity defendantResponseEntity, + PossessionClaimResponse response) { + + defendantResponseEntity.setReasonableAdjustment( + reasonableAdjustmentsService.createReasonableAdjustmentEntity( + response.getReasonableAdjustments() + ) + ); + + defendantResponseEntity.setHouseholdCircumstances( + householdCircumstancesService.createHouseholdCircumstancesEntity( + response.getHouseholdCircumstances() + ) + ); + + defendantResponseEntity.setPaymentAgreement( + paymentAgreementService.createPaymentAgreementEntity( + response.getPaymentAgreement() + ) + ); + } } 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 new file mode 100644 index 0000000000..9047e8198f --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesService.java @@ -0,0 +1,18 @@ +package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; + +import org.springframework.stereotype.Service; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.HouseholdCircumstances; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.HouseholdCircumstancesEntity; + +@Service +public class HouseholdCircumstancesService { + + public HouseholdCircumstancesEntity createHouseholdCircumstancesEntity(HouseholdCircumstances circumstances) { + + HouseholdCircumstancesEntity householdCircumstancesEntity = HouseholdCircumstancesEntity.builder() + .dependantChildren(circumstances.getDependantChildren()) + .build(); + + return householdCircumstancesEntity; + } +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementService.java new file mode 100644 index 0000000000..e45ae1c672 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementService.java @@ -0,0 +1,18 @@ +package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; + +import org.springframework.stereotype.Service; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PaymentAgreement; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.PaymentAgreementEntity; + +@Service +public class PaymentAgreementService { + + public PaymentAgreementEntity createPaymentAgreementEntity(PaymentAgreement paymentAgreement) { + + PaymentAgreementEntity paymentAgreementEntity = PaymentAgreementEntity.builder() + .anyPaymentsMade(paymentAgreement.getAnyPaymentsMade()) + .build(); + + return paymentAgreementEntity; + } +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsService.java new file mode 100644 index 0000000000..988f1fec2d --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsService.java @@ -0,0 +1,19 @@ +package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; + +import org.springframework.stereotype.Service; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.ReasonableAdjustments; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.ReasonableAdjustmentEntity; + +@Service +public class ReasonableAdjustmentsService { + + public ReasonableAdjustmentEntity createReasonableAdjustmentEntity(ReasonableAdjustments reasonableAdjustments) { + + ReasonableAdjustmentEntity reasonableAdjustmentEntity = ReasonableAdjustmentEntity.builder() + .reasonableAdjustmentsRequired(reasonableAdjustments.getReasonableAdjustmentRequired()) + .build(); + + return reasonableAdjustmentEntity; + } + +} 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 6beee0932d..0fc491632d 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 @@ -97,7 +97,7 @@ void shouldAllowSubmitWithOnlyDefendantResponses() { assertThat(result.getErrors()).isNullOrEmpty(); verify(claimResponseService).saveDraftData(caseData.getPossessionClaimResponse(), CASE_REFERENCE); - verify(defendantResponseService).saveDefendantResponse(CASE_REFERENCE, responses); + verify(defendantResponseService).saveDefendantResponse(CASE_REFERENCE, caseData.getPossessionClaimResponse()); verify(draftCaseDataService).deleteUnsubmittedCaseData(CASE_REFERENCE, respondPossessionClaim); } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index 68eef1548e..f919f2c36e 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -9,6 +9,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoPreferNotToSay; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PossessionClaimResponse; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.DefendantResponseEntity; @@ -17,6 +18,9 @@ import uk.gov.hmcts.reform.pcs.ccd.repository.PartyRepository; import uk.gov.hmcts.reform.pcs.ccd.service.party.PartyService; import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.DefendantResponseService; +import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.HouseholdCircumstancesService; +import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.PaymentAgreementService; +import uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim.ReasonableAdjustmentsService; import uk.gov.hmcts.reform.pcs.exception.PartyNotFoundException; import uk.gov.hmcts.reform.pcs.security.SecurityContextService; @@ -50,6 +54,12 @@ class DefendantResponseServiceTest { @Mock private SecurityContextService securityContextService; @Mock + private ReasonableAdjustmentsService reasonableAdjustmentsService; + @Mock + private HouseholdCircumstancesService householdCircumstancesService; + @Mock + private PaymentAgreementService paymentAgreementService; + @Mock private PartyEntity partyEntity; @Mock private ClaimEntity claimEntity; @@ -66,7 +76,10 @@ void setUp() { partyRepository, claimRepository, defendantResponseRepository, - securityContextService + securityContextService, + reasonableAdjustmentsService, + householdCircumstancesService, + paymentAgreementService ); } @@ -86,8 +99,12 @@ void shouldSaveDefendantResponseWithJpaProxies() { .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) .build(); + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .build(); + // When - underTest.saveDefendantResponse(CASE_REFERENCE, responses); + underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse); // Then verify(defendantResponseRepository).save(responseCaptor.capture()); @@ -114,8 +131,12 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsNo() { .receivedFreeLegalAdvice(YesNoPreferNotToSay.NO) .build(); + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .build(); + // When - underTest.saveDefendantResponse(CASE_REFERENCE, responses); + underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse); // Then verify(defendantResponseRepository).save(responseCaptor.capture()); @@ -140,8 +161,12 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsPreferNotToSay() { .receivedFreeLegalAdvice(YesNoPreferNotToSay.PREFER_NOT_TO_SAY) .build(); + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .build(); + // When - underTest.saveDefendantResponse(CASE_REFERENCE, responses); + underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse); // Then verify(defendantResponseRepository).save(responseCaptor.capture()); @@ -166,8 +191,12 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsNull() { .receivedFreeLegalAdvice(null) .build(); + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .build(); + // When - underTest.saveDefendantResponse(CASE_REFERENCE, responses); + underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse); // Then verify(defendantResponseRepository).save(responseCaptor.capture()); @@ -186,7 +215,11 @@ void shouldThrowExceptionWhenCurrentUserIdIsNull() { when(securityContextService.getCurrentUserId()).thenReturn(null); // When / Then - assertThatThrownBy(() -> underTest.saveDefendantResponse(CASE_REFERENCE, responses)) + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .build(); + + assertThatThrownBy(() -> underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse)) .isInstanceOf(IllegalStateException.class) .hasMessage("Current user IDAM ID is null"); @@ -205,7 +238,11 @@ void shouldThrowExceptionWhenDuplicateResponseExists() { CASE_REFERENCE, USER_ID)).thenReturn(true); // When / Then - assertThatThrownBy(() -> underTest.saveDefendantResponse(CASE_REFERENCE, responses)) + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .build(); + + assertThatThrownBy(() -> underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse)) .isInstanceOf(IllegalStateException.class) .hasMessage("A response has already been submitted for this case."); @@ -221,7 +258,9 @@ void shouldReturnEarlyWhenResponsesIsNull() { CASE_REFERENCE, USER_ID)).thenReturn(false); // When - underTest.saveDefendantResponse(CASE_REFERENCE, null); + underTest.saveDefendantResponse(CASE_REFERENCE, PossessionClaimResponse.builder() + .defendantResponses(null) + .build()); // Then verify(claimRepository, never()).findIdByCaseReference(anyLong()); @@ -242,7 +281,11 @@ void shouldPropagateExceptionWhenPartyNotFound() { .build(); // When / Then - assertThatThrownBy(() -> underTest.saveDefendantResponse(CASE_REFERENCE, responses)) + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .build(); + + assertThatThrownBy(() -> underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse)) .isSameAs(expectedException); verify(claimRepository, never()).findIdByCaseReference(anyLong()); @@ -264,7 +307,11 @@ void shouldThrowExceptionWhenClaimNotFound() { .build(); // When / Then - assertThatThrownBy(() -> underTest.saveDefendantResponse(CASE_REFERENCE, responses)) + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .build(); + + assertThatThrownBy(() -> underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse)) .isInstanceOf(IllegalStateException.class) .hasMessage(String.format("No claim found for case: %d", CASE_REFERENCE)); @@ -288,7 +335,11 @@ void shouldUseGetReferenceByIdForOptimalPerformance() { .build(); // When - underTest.saveDefendantResponse(CASE_REFERENCE, responses); + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .build(); + + underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse); // Then - Verify JPA proxy pattern used verify(partyRepository).getReferenceById(PARTY_ID); @@ -319,7 +370,11 @@ void shouldFollowOptimalExecutionOrder() { .build(); // When - underTest.saveDefendantResponse(CASE_REFERENCE, responses); + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .build(); + + underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse); // Then - Verify execution order matches optimal pattern: // 1. Get current user ID From 80c070ed9535927f171ff8055593fb726fee0e23 Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Tue, 10 Mar 2026 08:33:04 +0000 Subject: [PATCH 04/26] HDPI-5191:Adding tests for new services --- .../service/DefendantResponseServiceTest.java | 91 +++++++++++++++++-- .../HouseholdCircumstancesServiceTest.java | 26 ++++++ .../PaymentAgreementServiceTest.java | 26 ++++++ .../ReasonableAdjustmentsServiceTest.java | 25 +++++ 4 files changed, 160 insertions(+), 8 deletions(-) create mode 100644 src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesServiceTest.java create mode 100644 src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java create mode 100644 src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index f919f2c36e..eff0daccfc 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -7,12 +7,20 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoPreferNotToSay; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.HouseholdCircumstances; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PaymentAgreement; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PossessionClaimResponse; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.ReasonableAdjustments; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.DefendantResponseEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.HouseholdCircumstancesEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.PaymentAgreementEntity; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.ReasonableAdjustmentEntity; import uk.gov.hmcts.reform.pcs.ccd.repository.ClaimRepository; import uk.gov.hmcts.reform.pcs.ccd.repository.DefendantResponseRepository; import uk.gov.hmcts.reform.pcs.ccd.repository.PartyRepository; @@ -63,6 +71,8 @@ class DefendantResponseServiceTest { private PartyEntity partyEntity; @Mock private ClaimEntity claimEntity; + @Mock + private PcsCaseEntity pcsCaseEntity; @Captor private ArgumentCaptor responseCaptor; @@ -94,6 +104,7 @@ void shouldSaveDefendantResponseWithJpaProxies() { when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + when(claimEntity.getPcsCase()).thenReturn(pcsCaseEntity); DefendantResponses responses = DefendantResponses.builder() .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) @@ -113,6 +124,7 @@ void shouldSaveDefendantResponseWithJpaProxies() { assertThat(savedResponse.getParty()).isEqualTo(partyEntity); assertThat(savedResponse.getClaim()).isEqualTo(claimEntity); assertThat(savedResponse.getReceivedFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.YES); + assertThat(savedResponse.getStatementOfTruth()).isNotNull(); } @Test @@ -126,6 +138,7 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsNo() { when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + when(claimEntity.getPcsCase()).thenReturn(pcsCaseEntity); DefendantResponses responses = DefendantResponses.builder() .receivedFreeLegalAdvice(YesNoPreferNotToSay.NO) @@ -156,6 +169,7 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsPreferNotToSay() { when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + when(claimEntity.getPcsCase()).thenReturn(pcsCaseEntity); DefendantResponses responses = DefendantResponses.builder() .receivedFreeLegalAdvice(YesNoPreferNotToSay.PREFER_NOT_TO_SAY) @@ -186,6 +200,7 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsNull() { when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + when(claimEntity.getPcsCase()).thenReturn(pcsCaseEntity); DefendantResponses responses = DefendantResponses.builder() .receivedFreeLegalAdvice(null) @@ -251,18 +266,14 @@ void shouldThrowExceptionWhenDuplicateResponseExists() { } @Test - void shouldReturnEarlyWhenResponsesIsNull() { - // Given + void shouldReturnEarlyWhenPossessionClaimResponseIsNull() { + // Given - no stubbing needed; service returns before any repository calls when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); - when(defendantResponseRepository.existsByClaimPcsCaseCaseReferenceAndPartyIdamId( - CASE_REFERENCE, USER_ID)).thenReturn(false); // When - underTest.saveDefendantResponse(CASE_REFERENCE, PossessionClaimResponse.builder() - .defendantResponses(null) - .build()); + underTest.saveDefendantResponse(CASE_REFERENCE, null); - // Then + // Then - duplicate check and save are never invoked verify(claimRepository, never()).findIdByCaseReference(anyLong()); verify(defendantResponseRepository, never()).save(any()); } @@ -329,6 +340,7 @@ void shouldUseGetReferenceByIdForOptimalPerformance() { when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + when(claimEntity.getPcsCase()).thenReturn(pcsCaseEntity); DefendantResponses responses = DefendantResponses.builder() .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) @@ -364,6 +376,7 @@ void shouldFollowOptimalExecutionOrder() { when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + when(claimEntity.getPcsCase()).thenReturn(pcsCaseEntity); DefendantResponses responses = DefendantResponses.builder() .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) @@ -394,4 +407,66 @@ void shouldFollowOptimalExecutionOrder() { // 5. Save (only locks new row) verify(defendantResponseRepository).save(any(DefendantResponseEntity.class)); } + + @Test + void shouldBuildAndLinkChildEntitiesWhenSavingDefendantResponse() { + when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); + when(defendantResponseRepository.existsByClaimPcsCaseCaseReferenceAndPartyIdamId( + CASE_REFERENCE, USER_ID)).thenReturn(false); + when(partyService.getPartyEntityByIdamId(USER_ID, CASE_REFERENCE)).thenReturn(partyEntity); + when(partyEntity.getId()).thenReturn(PARTY_ID); + when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); + when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); + when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + when(claimEntity.getPcsCase()).thenReturn(pcsCaseEntity); + + ReasonableAdjustments reasonableAdjustments = ReasonableAdjustments.builder() + .reasonableAdjustmentRequired("Wheelchair access") + .build(); + HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() + .dependantChildren(YesOrNo.YES) + .build(); + PaymentAgreement paymentAgreement = PaymentAgreement.builder() + .anyPaymentsMade(YesOrNo.NO) + .build(); + + ReasonableAdjustmentEntity reasonableAdjustmentEntity = ReasonableAdjustmentEntity.builder() + .reasonableAdjustmentsRequired("Wheelchair access") + .build(); + HouseholdCircumstancesEntity householdCircumstancesEntity = HouseholdCircumstancesEntity.builder() + .dependantChildren(YesOrNo.YES) + .build(); + PaymentAgreementEntity paymentAgreementEntity = PaymentAgreementEntity.builder() + .anyPaymentsMade(YesOrNo.NO) + .build(); + + when(reasonableAdjustmentsService.createReasonableAdjustmentEntity(any(ReasonableAdjustments.class))) + .thenReturn(reasonableAdjustmentEntity); + when(householdCircumstancesService.createHouseholdCircumstancesEntity(any(HouseholdCircumstances.class))) + .thenReturn(householdCircumstancesEntity); + when(paymentAgreementService.createPaymentAgreementEntity(any(PaymentAgreement.class))) + .thenReturn(paymentAgreementEntity); + + DefendantResponses responses = DefendantResponses.builder() + .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .build(); + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(responses) + .reasonableAdjustments(reasonableAdjustments) + .householdCircumstances(householdCircumstances) + .paymentAgreement(paymentAgreement) + .build(); + + underTest.saveDefendantResponse(CASE_REFERENCE, possessionClaimResponse); + + verify(reasonableAdjustmentsService).createReasonableAdjustmentEntity(any(ReasonableAdjustments.class)); + verify(householdCircumstancesService).createHouseholdCircumstancesEntity(any(HouseholdCircumstances.class)); + verify(paymentAgreementService).createPaymentAgreementEntity(any(PaymentAgreement.class)); + + verify(defendantResponseRepository).save(responseCaptor.capture()); + DefendantResponseEntity saved = responseCaptor.getValue(); + assertThat(saved.getReasonableAdjustment()).isSameAs(reasonableAdjustmentEntity); + assertThat(saved.getHouseholdCircumstances()).isSameAs(householdCircumstancesEntity); + assertThat(saved.getPaymentAgreement()).isSameAs(paymentAgreementEntity); + } } 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 new file mode 100644 index 0000000000..ccf1a1832c --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/HouseholdCircumstancesServiceTest.java @@ -0,0 +1,26 @@ +package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; + +import org.junit.jupiter.api.Test; +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.entity.respondpossessionclaim.HouseholdCircumstancesEntity; + +import static org.assertj.core.api.Assertions.assertThat; + +class HouseholdCircumstancesServiceTest { + + private final HouseholdCircumstancesService service = new HouseholdCircumstancesService(); + + @Test + void shouldMapDependantChildrenField() { + HouseholdCircumstances model = HouseholdCircumstances.builder() + .dependantChildren(YesOrNo.YES) + .build(); + + HouseholdCircumstancesEntity entity = service.createHouseholdCircumstancesEntity(model); + + assertThat(entity.getDependantChildren()).isEqualTo(YesOrNo.YES); + } + +} + diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java new file mode 100644 index 0000000000..37ab0946f8 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java @@ -0,0 +1,26 @@ +package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; + +import org.junit.jupiter.api.Test; +import uk.gov.hmcts.ccd.sdk.type.YesOrNo; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PaymentAgreement; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.PaymentAgreementEntity; + +import static org.assertj.core.api.Assertions.assertThat; + +class PaymentAgreementServiceTest { + + private final PaymentAgreementService service = new PaymentAgreementService(); + + @Test + void shouldMapAnyPaymentsMadeField() { + PaymentAgreement model = PaymentAgreement.builder() + .anyPaymentsMade(YesOrNo.YES) + .build(); + + PaymentAgreementEntity entity = service.createPaymentAgreementEntity(model); + + assertThat(entity.getAnyPaymentsMade()).isEqualTo(YesOrNo.YES); + } + +} + diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java new file mode 100644 index 0000000000..54656fec41 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java @@ -0,0 +1,25 @@ +package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; + +import org.junit.jupiter.api.Test; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.ReasonableAdjustments; +import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.ReasonableAdjustmentEntity; + +import static org.assertj.core.api.Assertions.assertThat; + +class ReasonableAdjustmentsServiceTest { + + private final ReasonableAdjustmentsService service = new ReasonableAdjustmentsService(); + + @Test + void shouldMapReasonableAdjustmentsRequiredField() { + ReasonableAdjustments model = ReasonableAdjustments.builder() + .reasonableAdjustmentRequired("Wheelchair access") + .build(); + + ReasonableAdjustmentEntity entity = service.createReasonableAdjustmentEntity(model); + + assertThat(entity.getReasonableAdjustmentsRequired()).isEqualTo("Wheelchair access"); + } + +} + From 005607be711d6b6efc876773ab0e20f71925b242 Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Tue, 10 Mar 2026 09:21:27 +0000 Subject: [PATCH 05/26] HDPI-5191:Removing not null constraint on new columns --- .../DefendantResponseEntity.java | 4 +-- .../V063__update_defendant_response_table.sql | 14 ++++---- .../V064__create_respond_to_claim_tables.sql | 34 +++++++++---------- .../HouseholdCircumstancesServiceTest.java | 16 +++++++-- .../PaymentAgreementServiceTest.java | 16 +++++++-- .../ReasonableAdjustmentsServiceTest.java | 16 +++++++-- 6 files changed, 68 insertions(+), 32 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java index c2149dc6c1..95c540c0ba 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java @@ -125,12 +125,12 @@ public class DefendantResponseEntity { private String ingestionSource; - public void setHouseholdCircumstances(HouseholdCircumstancesEntity housingActWales) { + public void setHouseholdCircumstances(HouseholdCircumstancesEntity householdCircumstances) { if (this.householdCircumstances != null) { this.householdCircumstances.setDefendantResponse(null); } - this.householdCircumstances = housingActWales; + this.householdCircumstances = householdCircumstances; if (this.householdCircumstances != null) { this.householdCircumstances.setDefendantResponse(this); diff --git a/src/main/resources/db/migration/V063__update_defendant_response_table.sql b/src/main/resources/db/migration/V063__update_defendant_response_table.sql index ef597081ca..97f8a668f0 100644 --- a/src/main/resources/db/migration/V063__update_defendant_response_table.sql +++ b/src/main/resources/db/migration/V063__update_defendant_response_table.sql @@ -1,18 +1,18 @@ ALTER TABLE defendant_response - ADD COLUMN sot_id UUID NOT NULL REFERENCES statement_of_truth(id), --found in claim, has 1-to-1 mapping - ADD COLUMN pcs_case_id UUID NOT NULL REFERENCES pcs_case(id),--found in claim - ADD COLUMN correspondence_address_confirmation YES_NO NOT NULL, + ADD COLUMN sot_id UUID NOT NULL REFERENCES statement_of_truth(id), + ADD COLUMN pcs_case_id UUID NOT NULL REFERENCES pcs_case(id), + ADD COLUMN correspondence_address_confirmation YES_NO, --not null ADD COLUMN possession_notice_received YES_NO, ADD COLUMN notice_received_date DATE, ADD COLUMN rent_arrears_amount_confirmation YES_NO, - ADD COLUMN dispute_claim YES_NO NOT NULL, - ADD COLUMN landlord_registered YES_NO NOT NULL, - ADD COLUMN make_counter_claim YES_NO NOT NULL, + ADD COLUMN dispute_claim YES_NO, --not null + ADD COLUMN landlord_registered YES_NO, --not null + ADD COLUMN make_counter_claim YES_NO, --not null ADD COLUMN version INT, ADD COLUMN status VARCHAR(60), ADD COLUMN response_submitted_date TIMESTAMP, ADD COLUMN response_deleted_date TIMESTAMP, ADD COLUMN response_received_date TIMESTAMP, - ADD COLUMN language_used TEXT NOT NULL, + ADD COLUMN language_used TEXT, --not null ADD COLUMN channel VARCHAR(60), ADD COLUMN ingestion_source VARCHAR(60); diff --git a/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql b/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql index 2915cbe65d..d251b5c97c 100644 --- a/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql +++ b/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql @@ -2,15 +2,15 @@ CREATE TABLE reasonable_adjustments ( id UUID PRIMARY KEY, defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), - reasonable_adjustments_required VARCHAR(250) NOT NULL, + reasonable_adjustments_required VARCHAR(250), --not null reasonable_adjustment_description VARCHAR(500), hearing_enhancement_description VARCHAR(250), sign_language_support_description VARCHAR(250), travel_support_description VARCHAR(250), - welsh_language_requirements VARCHAR(250) NOT NULL, - language_interpreter YES_NO NOT NULL, + welsh_language_requirements VARCHAR(250), --not null + language_interpreter YES_NO, --not null language_support_description VARCHAR(250), - considered_vulnerable YES_NO NOT NULL, + considered_vulnerable YES_NO, --not null vulnerable_characteristic_description VARCHAR(250) ); @@ -19,27 +19,27 @@ CREATE TABLE reasonable_adjustments ( CREATE TABLE household_circumstances ( id UUID PRIMARY KEY, defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), - dependant_children YES_NO NOT NULL, + dependant_children YES_NO, --not null dependant_children_details VARCHAR(500), - other_dependants YES_NO NOT NULL, - other_dependant_details VARCHAR(500) NOT NULL, + other_dependants YES_NO, --not null + other_dependant_details VARCHAR(500), --not null other_tenants YES_NO, - other_tenants_details VARCHAR(500) NOT NULL, + other_tenants_details VARCHAR(500), --not null alternative_accommodation YES_NO_NOT_SURE, alternative_accommodation_transfer_date DATE, - share_additional_circumstances YES_NO NOT NULL, + share_additional_circumstances YES_NO, --not null additional_circumstances_details VARCHAR(500), - exceptional_hardship YES_NO NOT NULL, + exceptional_hardship YES_NO, --not null exceptional_hardship_details VARCHAR(500), - share_income_expense_details YES_NO NOT NULL, - regular_income VARCHAR(60) NOT NULL, - universal_credit YES_NO NOT NULL, + share_income_expense_details YES_NO, --not null + regular_income VARCHAR(60), --not null + universal_credit YES_NO, --not null uc_application_date DATE, - priority_debts YES_NO NOT NULL, + priority_debts YES_NO, --not null debt_total DECIMAL(18,2), debt_contribution VARCHAR(60), debt_contribution_frequency VARCHAR(60), - regular_expenses VARCHAR(500) NOT NULL, + regular_expenses VARCHAR(500), --not null expense_amount DECIMAL(18,2), expense_frequency VARCHAR(60) ); @@ -49,12 +49,12 @@ CREATE TABLE household_circumstances ( CREATE TABLE payment_agreement ( id UUID PRIMARY KEY, defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), - any_payments_made YES_NO NOT NULL, + any_payments_made YES_NO, --not null payment_details VARCHAR(500), paid_money_to_housing_org YES_NO, repayment_plan_agreed YES_NO, repayment_agreed_details VARCHAR(500), - repay_arrears_instalments YES_NO NOT NULL, + repay_arrears_instalments YES_NO, --not null additional_rent_contribution DECIMAL(18,2), additional_contribution_frequency VARCHAR(50) ); 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 ccf1a1832c..05c6474785 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 @@ -1,24 +1,36 @@ package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +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.entity.respondpossessionclaim.HouseholdCircumstancesEntity; import static org.assertj.core.api.Assertions.assertThat; +@ExtendWith(MockitoExtension.class) class HouseholdCircumstancesServiceTest { - private final HouseholdCircumstancesService service = new HouseholdCircumstancesService(); + private HouseholdCircumstancesService underTest; + + @BeforeEach + void setUp() { + underTest = new HouseholdCircumstancesService(); + } @Test void shouldMapDependantChildrenField() { + //Given HouseholdCircumstances model = HouseholdCircumstances.builder() .dependantChildren(YesOrNo.YES) .build(); - HouseholdCircumstancesEntity entity = service.createHouseholdCircumstancesEntity(model); + //When + HouseholdCircumstancesEntity entity = underTest.createHouseholdCircumstancesEntity(model); + //Then assertThat(entity.getDependantChildren()).isEqualTo(YesOrNo.YES); } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java index 37ab0946f8..ff2bf63bee 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java @@ -1,24 +1,36 @@ package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PaymentAgreement; import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.PaymentAgreementEntity; import static org.assertj.core.api.Assertions.assertThat; +@ExtendWith(MockitoExtension.class) class PaymentAgreementServiceTest { - private final PaymentAgreementService service = new PaymentAgreementService(); + private PaymentAgreementService underTest; + + @BeforeEach + void setUp() { + underTest = new PaymentAgreementService(); + } @Test void shouldMapAnyPaymentsMadeField() { + //Given PaymentAgreement model = PaymentAgreement.builder() .anyPaymentsMade(YesOrNo.YES) .build(); - PaymentAgreementEntity entity = service.createPaymentAgreementEntity(model); + //When + PaymentAgreementEntity entity = underTest.createPaymentAgreementEntity(model); + //Then assertThat(entity.getAnyPaymentsMade()).isEqualTo(YesOrNo.YES); } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java index 54656fec41..d258b488f3 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java @@ -1,23 +1,35 @@ package uk.gov.hmcts.reform.pcs.ccd.service.respondpossessionclaim; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.ReasonableAdjustments; import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.ReasonableAdjustmentEntity; import static org.assertj.core.api.Assertions.assertThat; +@ExtendWith(MockitoExtension.class) class ReasonableAdjustmentsServiceTest { - private final ReasonableAdjustmentsService service = new ReasonableAdjustmentsService(); + private ReasonableAdjustmentsService underTest; + + @BeforeEach + void setUp() { + underTest = new ReasonableAdjustmentsService(); + } @Test void shouldMapReasonableAdjustmentsRequiredField() { + //Given ReasonableAdjustments model = ReasonableAdjustments.builder() .reasonableAdjustmentRequired("Wheelchair access") .build(); - ReasonableAdjustmentEntity entity = service.createReasonableAdjustmentEntity(model); + //When + ReasonableAdjustmentEntity entity = underTest.createReasonableAdjustmentEntity(model); + //Then assertThat(entity.getReasonableAdjustmentsRequired()).isEqualTo("Wheelchair access"); } From 657663e788b3adc536ac1625605f5630b0bd56e1 Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Tue, 10 Mar 2026 11:33:34 +0000 Subject: [PATCH 06/26] HDPI-5191:Updating draft save logic & updating tests --- .../RespondToPossessionDraftSavePage.java | 3 ++ .../HouseholdCircumstancesService.java | 4 ++ .../PaymentAgreementService.java | 4 ++ .../ReasonableAdjustmentsService.java | 4 ++ .../RespondToPossessionDraftSavePageTest.java | 54 +++++++++++++++---- .../HouseholdCircumstancesServiceTest.java | 9 ++++ .../PaymentAgreementServiceTest.java | 9 ++++ .../ReasonableAdjustmentsServiceTest.java | 9 ++++ 8 files changed, 85 insertions(+), 11 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionclaim/page/RespondToPossessionDraftSavePage.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionclaim/page/RespondToPossessionDraftSavePage.java index 28740e2ddc..fde08e0fed 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionclaim/page/RespondToPossessionDraftSavePage.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionclaim/page/RespondToPossessionDraftSavePage.java @@ -42,6 +42,9 @@ private AboutToStartOrSubmitResponse midEvent(CaseDetails response = callMidEventHandler(caseData); @@ -158,7 +162,7 @@ void shouldSaveCompletePartyData() { .build()) .build(); - PCSCase caseData = buildCaseData(contactDetails, null); + PCSCase caseData = buildCaseData(contactDetails, null,null,null,null); when(immutableFieldValidator.findImmutableFieldViolations(any(), anyLong())) .thenReturn(List.of()); @@ -193,7 +197,7 @@ void shouldSaveDefendantResponsesData() { .contactByPhone(VerticalYesNo.NO) .build(); - PCSCase caseData = buildCaseData(null, responses); + PCSCase caseData = buildCaseData(null, responses,null,null,null); //When AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); @@ -214,7 +218,7 @@ void shouldSaveDefendantResponsesData() { } @Test - void shouldSaveMixedContactDetailsAndResponses() { + void shouldSaveAllDefendantSectionsInPartialUpdate() { //Given AddressUK address = AddressUK.builder() .addressLine1("456 Another Road") @@ -234,7 +238,23 @@ void shouldSaveMixedContactDetailsAndResponses() { .contactByText(VerticalYesNo.NO) .build(); - PCSCase caseData = buildCaseData(contactDetails, responses); + ReasonableAdjustments reasonableAdjustments = ReasonableAdjustments.builder() + .reasonableAdjustmentRequired("Wheelchair access") + .build(); + + HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() + .dependantChildren(YesOrNo.YES) + .build(); + + PaymentAgreement paymentAgreement = PaymentAgreement.builder() + .anyPaymentsMade(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) + .build(); + + PCSCase caseData = buildCaseData(contactDetails, + responses, + reasonableAdjustments, + householdCircumstances, + paymentAgreement); when(immutableFieldValidator.findImmutableFieldViolations(any(), anyLong())) .thenReturn(List.of()); @@ -257,6 +277,11 @@ void shouldSaveMixedContactDetailsAndResponses() { assertThat(savedResponses.getContactByEmail()).isEqualTo(VerticalYesNo.YES); assertThat(savedResponses.getContactByText()).isEqualTo(VerticalYesNo.NO); + + PossessionClaimResponse savedResponse = savedDraft.getPossessionClaimResponse(); + assertThat(savedResponse.getReasonableAdjustments()).isEqualTo(reasonableAdjustments); + assertThat(savedResponse.getHouseholdCircumstances()).isEqualTo(householdCircumstances); + assertThat(savedResponse.getPaymentAgreement()).isEqualTo(paymentAgreement); } @Test @@ -264,7 +289,7 @@ void shouldAllowNullPartyInPartialUpdate() { //Given PCSCase caseData = buildCaseData( DefendantContactDetails.builder().party(null).build(), - null + null,null,null,null ); //When @@ -289,7 +314,7 @@ void shouldSkipValidationWhenDefendantContactDetailsIsNull() { .contactByPost(VerticalYesNo.YES) .build(); - PCSCase caseData = buildCaseData(null, responses); + PCSCase caseData = buildCaseData(null, responses, null,null,null); //When AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); @@ -312,7 +337,7 @@ void shouldReturnErrorWhenDraftSaveFails() { .party(Party.builder().firstName("Jack").lastName("Smith").build()) .build(); - PCSCase caseData = buildCaseData(contactDetails, null); + PCSCase caseData = buildCaseData(contactDetails, null,null,null,null); when(immutableFieldValidator.findImmutableFieldViolations(any(), anyLong())) .thenReturn(List.of()); @@ -331,11 +356,18 @@ void shouldReturnErrorWhenDraftSaveFails() { assertThat(response.getData()).isNull(); } - private PCSCase buildCaseData(DefendantContactDetails contactDetails, DefendantResponses responses) { + private PCSCase buildCaseData(DefendantContactDetails contactDetails, + DefendantResponses responses, + ReasonableAdjustments reasonableAdjustments, + HouseholdCircumstances householdCircumstances, + PaymentAgreement paymentAgreement) { return PCSCase.builder() .possessionClaimResponse(PossessionClaimResponse.builder() .defendantContactDetails(contactDetails) .defendantResponses(responses) + .reasonableAdjustments(reasonableAdjustments) + .householdCircumstances(householdCircumstances) + .paymentAgreement(paymentAgreement) .build()) .build(); } 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 05c6474785..03b5d29987 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 @@ -34,5 +34,14 @@ void shouldMapDependantChildrenField() { assertThat(entity.getDependantChildren()).isEqualTo(YesOrNo.YES); } + @Test + void shouldReturnNullWhenHouseholdCircumstancesIsNull() { + // When + HouseholdCircumstancesEntity entity = underTest.createHouseholdCircumstancesEntity(null); + + // Then + assertThat(entity).isNull(); + } + } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java index ff2bf63bee..f0bbde6114 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java @@ -34,5 +34,14 @@ void shouldMapAnyPaymentsMadeField() { assertThat(entity.getAnyPaymentsMade()).isEqualTo(YesOrNo.YES); } + @Test + void shouldReturnNullWhenPaymentAgreementIsNull() { + // When + PaymentAgreementEntity entity = underTest.createPaymentAgreementEntity(null); + + // Then + assertThat(entity).isNull(); + } + } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java index d258b488f3..7c19276afb 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java @@ -33,5 +33,14 @@ void shouldMapReasonableAdjustmentsRequiredField() { assertThat(entity.getReasonableAdjustmentsRequired()).isEqualTo("Wheelchair access"); } + @Test + void shouldReturnNullWhenPaymentAgreementIsNull() { + // When + ReasonableAdjustmentEntity entity = underTest.createReasonableAdjustmentEntity(null); + + // Then + assertThat(entity).isNull(); + } + } From 09682e333b4fc5fb0c9bfb5216b1f97aced14e0b Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Tue, 10 Mar 2026 12:08:40 +0000 Subject: [PATCH 07/26] HDPI-5191:Hardcoding statement of truth entity values for testing --- .../respondpossessionclaim/DefendantResponseService.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java index acf62a3b10..6ddb0c9b65 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java @@ -4,8 +4,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PossessionClaimResponse; +import uk.gov.hmcts.reform.pcs.ccd.domain.statementoftruth.StatementOfTruthCompletedBy; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.claim.StatementOfTruthEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; @@ -107,7 +109,12 @@ public void saveDefendantResponse(long caseReference, PossessionClaimResponse po //set bidirectional relationship with the pcs case claimRef.getPcsCase().addDefendantResponse(defendantResponse); //empty for now to satisfy not null constraint - defendantResponse.setStatementOfTruth(new StatementOfTruthEntity()); + defendantResponse.setStatementOfTruth(StatementOfTruthEntity.builder() + .completedBy(StatementOfTruthCompletedBy.LEGAL_REPRESENTATIVE) + .accepted(YesOrNo.YES) + .fullName("John test") + .build()); + buildAndLinkChildEntities(defendantResponse, possessionClaimResponse); defendantResponseRepository.save(defendantResponse); From 9a5d9568944f9d8b3d9aef19b70f305d3b1dce14 Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Tue, 10 Mar 2026 15:48:16 +0000 Subject: [PATCH 08/26] HDPI-5191:Removing not null constraints --- .../DefendantResponseEntity.java | 2 +- .../DefendantResponseService.java | 9 ----- .../V063__update_defendant_response_table.sql | 12 +++---- .../V064__create_respond_to_claim_tables.sql | 34 +++++++++---------- .../service/DefendantResponseServiceTest.java | 5 ++- 5 files changed, 26 insertions(+), 36 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java index 95c540c0ba..5745d616c5 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java @@ -59,7 +59,7 @@ public class DefendantResponseEntity { private PcsCaseEntity pcsCase; @OneToOne(cascade = ALL, orphanRemoval = true) - @JoinColumn(name = "sot_id", nullable = false) + @JoinColumn(name = "sot_id") @JsonManagedReference private StatementOfTruthEntity statementOfTruth; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java index 6ddb0c9b65..6367a84eba 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java @@ -4,12 +4,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PossessionClaimResponse; -import uk.gov.hmcts.reform.pcs.ccd.domain.statementoftruth.StatementOfTruthCompletedBy; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; -import uk.gov.hmcts.reform.pcs.ccd.entity.claim.StatementOfTruthEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.DefendantResponseEntity; import uk.gov.hmcts.reform.pcs.ccd.repository.ClaimRepository; @@ -108,12 +105,6 @@ public void saveDefendantResponse(long caseReference, PossessionClaimResponse po //set bidirectional relationship with the pcs case claimRef.getPcsCase().addDefendantResponse(defendantResponse); - //empty for now to satisfy not null constraint - defendantResponse.setStatementOfTruth(StatementOfTruthEntity.builder() - .completedBy(StatementOfTruthCompletedBy.LEGAL_REPRESENTATIVE) - .accepted(YesOrNo.YES) - .fullName("John test") - .build()); buildAndLinkChildEntities(defendantResponse, possessionClaimResponse); diff --git a/src/main/resources/db/migration/V063__update_defendant_response_table.sql b/src/main/resources/db/migration/V063__update_defendant_response_table.sql index 97f8a668f0..0bb35430a7 100644 --- a/src/main/resources/db/migration/V063__update_defendant_response_table.sql +++ b/src/main/resources/db/migration/V063__update_defendant_response_table.sql @@ -1,18 +1,18 @@ ALTER TABLE defendant_response - ADD COLUMN sot_id UUID NOT NULL REFERENCES statement_of_truth(id), + ADD COLUMN sot_id UUID REFERENCES statement_of_truth(id), ADD COLUMN pcs_case_id UUID NOT NULL REFERENCES pcs_case(id), - ADD COLUMN correspondence_address_confirmation YES_NO, --not null + ADD COLUMN correspondence_address_confirmation YES_NO, ADD COLUMN possession_notice_received YES_NO, ADD COLUMN notice_received_date DATE, ADD COLUMN rent_arrears_amount_confirmation YES_NO, - ADD COLUMN dispute_claim YES_NO, --not null - ADD COLUMN landlord_registered YES_NO, --not null - ADD COLUMN make_counter_claim YES_NO, --not null + ADD COLUMN dispute_claim YES_NO, + ADD COLUMN landlord_registered YES_NO, + ADD COLUMN make_counter_claim YES_NO, ADD COLUMN version INT, ADD COLUMN status VARCHAR(60), ADD COLUMN response_submitted_date TIMESTAMP, ADD COLUMN response_deleted_date TIMESTAMP, ADD COLUMN response_received_date TIMESTAMP, - ADD COLUMN language_used TEXT, --not null + ADD COLUMN language_used TEXT, ADD COLUMN channel VARCHAR(60), ADD COLUMN ingestion_source VARCHAR(60); diff --git a/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql b/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql index d251b5c97c..eaf4224232 100644 --- a/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql +++ b/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql @@ -2,15 +2,15 @@ CREATE TABLE reasonable_adjustments ( id UUID PRIMARY KEY, defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), - reasonable_adjustments_required VARCHAR(250), --not null + reasonable_adjustments_required VARCHAR(250), reasonable_adjustment_description VARCHAR(500), hearing_enhancement_description VARCHAR(250), sign_language_support_description VARCHAR(250), travel_support_description VARCHAR(250), - welsh_language_requirements VARCHAR(250), --not null - language_interpreter YES_NO, --not null + welsh_language_requirements VARCHAR(250), + language_interpreter YES_NO, language_support_description VARCHAR(250), - considered_vulnerable YES_NO, --not null + considered_vulnerable YES_NO, vulnerable_characteristic_description VARCHAR(250) ); @@ -19,27 +19,27 @@ CREATE TABLE reasonable_adjustments ( CREATE TABLE household_circumstances ( id UUID PRIMARY KEY, defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), - dependant_children YES_NO, --not null + dependant_children YES_NO, dependant_children_details VARCHAR(500), - other_dependants YES_NO, --not null - other_dependant_details VARCHAR(500), --not null + other_dependants YES_NO, + other_dependant_details VARCHAR(500), other_tenants YES_NO, - other_tenants_details VARCHAR(500), --not null + other_tenants_details VARCHAR(500), alternative_accommodation YES_NO_NOT_SURE, alternative_accommodation_transfer_date DATE, - share_additional_circumstances YES_NO, --not null + share_additional_circumstances YES_NO, additional_circumstances_details VARCHAR(500), - exceptional_hardship YES_NO, --not null + exceptional_hardship YES_NO, exceptional_hardship_details VARCHAR(500), - share_income_expense_details YES_NO, --not null - regular_income VARCHAR(60), --not null - universal_credit YES_NO, --not null + share_income_expense_details YES_NO, + regular_income VARCHAR(60), + universal_credit YES_NO, uc_application_date DATE, - priority_debts YES_NO, --not null + priority_debts YES_NO, debt_total DECIMAL(18,2), debt_contribution VARCHAR(60), debt_contribution_frequency VARCHAR(60), - regular_expenses VARCHAR(500), --not null + regular_expenses VARCHAR(500), expense_amount DECIMAL(18,2), expense_frequency VARCHAR(60) ); @@ -49,12 +49,12 @@ CREATE TABLE household_circumstances ( CREATE TABLE payment_agreement ( id UUID PRIMARY KEY, defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), - any_payments_made YES_NO, --not null + any_payments_made YES_NO, payment_details VARCHAR(500), paid_money_to_housing_org YES_NO, repayment_plan_agreed YES_NO, repayment_agreed_details VARCHAR(500), - repay_arrears_instalments YES_NO, --not null + repay_arrears_instalments YES_NO, additional_rent_contribution DECIMAL(18,2), additional_contribution_frequency VARCHAR(50) ); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index eff0daccfc..590b27b6fb 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -124,7 +124,6 @@ void shouldSaveDefendantResponseWithJpaProxies() { assertThat(savedResponse.getParty()).isEqualTo(partyEntity); assertThat(savedResponse.getClaim()).isEqualTo(claimEntity); assertThat(savedResponse.getReceivedFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.YES); - assertThat(savedResponse.getStatementOfTruth()).isNotNull(); } @Test @@ -267,13 +266,13 @@ void shouldThrowExceptionWhenDuplicateResponseExists() { @Test void shouldReturnEarlyWhenPossessionClaimResponseIsNull() { - // Given - no stubbing needed; service returns before any repository calls + // Given when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); // When underTest.saveDefendantResponse(CASE_REFERENCE, null); - // Then - duplicate check and save are never invoked + // Then verify(claimRepository, never()).findIdByCaseReference(anyLong()); verify(defendantResponseRepository, never()).save(any()); } From 9bc64a7194b734d938726e6f4e83244881f2da0b Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Wed, 11 Mar 2026 13:28:15 +0000 Subject: [PATCH 09/26] Adding extra columns to defendant response table as per data model --- .../db/migration/V063__update_defendant_response_table.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/resources/db/migration/V063__update_defendant_response_table.sql b/src/main/resources/db/migration/V063__update_defendant_response_table.sql index 0bb35430a7..e9105e5665 100644 --- a/src/main/resources/db/migration/V063__update_defendant_response_table.sql +++ b/src/main/resources/db/migration/V063__update_defendant_response_table.sql @@ -1,11 +1,13 @@ ALTER TABLE defendant_response ADD COLUMN sot_id UUID REFERENCES statement_of_truth(id), ADD COLUMN pcs_case_id UUID NOT NULL REFERENCES pcs_case(id), + ADD COLUMN defendant_name_confirmation YES_NO, ADD COLUMN correspondence_address_confirmation YES_NO, ADD COLUMN possession_notice_received YES_NO, ADD COLUMN notice_received_date DATE, ADD COLUMN rent_arrears_amount_confirmation YES_NO, ADD COLUMN dispute_claim YES_NO, + ADD COLUMN dispute_claim_details VARCHAR(6800) ADD COLUMN landlord_registered YES_NO, ADD COLUMN make_counter_claim YES_NO, ADD COLUMN version INT, From d693e812ec4e84b85114ef458b1f4c06a51d4c1b Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Wed, 11 Mar 2026 13:40:04 +0000 Subject: [PATCH 10/26] HDPI-5191:Fixing migration script --- .../db/migration/V063__update_defendant_response_table.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/db/migration/V063__update_defendant_response_table.sql b/src/main/resources/db/migration/V063__update_defendant_response_table.sql index e9105e5665..500e1cc6f7 100644 --- a/src/main/resources/db/migration/V063__update_defendant_response_table.sql +++ b/src/main/resources/db/migration/V063__update_defendant_response_table.sql @@ -7,7 +7,7 @@ ALTER TABLE defendant_response ADD COLUMN notice_received_date DATE, ADD COLUMN rent_arrears_amount_confirmation YES_NO, ADD COLUMN dispute_claim YES_NO, - ADD COLUMN dispute_claim_details VARCHAR(6800) + ADD COLUMN dispute_claim_details VARCHAR(6800), ADD COLUMN landlord_registered YES_NO, ADD COLUMN make_counter_claim YES_NO, ADD COLUMN version INT, From ccb3ae9a4d39eb2966bd60f635d2db0907bfb7fe Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Thu, 12 Mar 2026 08:38:57 +0000 Subject: [PATCH 11/26] HDPI-5191:minor refactoring & Added party attribute assertation table --- .../DefendantResponses.java | 2 +- .../PartyAttributeAssertedBy.java | 12 ++++++ .../PartyAttributeAssertionStatus.java | 11 +++++ .../DefendantResponseEntity.java | 7 ++-- .../SubmitEventHandler.java | 4 ++ .../DefendantResponseService.java | 40 +++++++++++-------- .../V063__update_defendant_response_table.sql | 10 +++-- ...reate_respond_to_claim_related_tables.sql} | 7 ++-- ...5__add_party_attribute_assertion_table.sql | 29 ++++++++++++++ .../SubmitEventHandlerTest.java | 30 +++++++++++++- .../RespondToPossessionDraftSavePageTest.java | 6 +-- .../service/DefendantResponseServiceTest.java | 23 +++++------ 12 files changed, 137 insertions(+), 44 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertedBy.java create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertionStatus.java rename src/main/resources/db/migration/{V064__create_respond_to_claim_tables.sql => V064__create_respond_to_claim_related_tables.sql} (88%) create mode 100644 src/main/resources/db/migration/V065__add_party_attribute_assertion_table.sql diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java index 35a2aaf755..d2d511c344 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java @@ -27,7 +27,7 @@ public class DefendantResponses { private YesNoNotSure tenancyStartDateCorrect; @CCD - private YesNoNotSure oweRentArrears; + private YesNoNotSure rentArrearsAmountConfirmation; @CCD(typeOverride = FieldType.MoneyGBP) @JacksonMoneyGBP diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertedBy.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertedBy.java new file mode 100644 index 0000000000..5c0d6840e1 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertedBy.java @@ -0,0 +1,12 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim; + +/** + * Who asserted a correction to a party attribute. + */ +public enum PartyAttributeAssertedBy { + CLAIMANT, + DEFENDANT, + JUDGE, + COURT_STAFF, + CASE_WORKER +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertionStatus.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertionStatus.java new file mode 100644 index 0000000000..ab5d53f798 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertionStatus.java @@ -0,0 +1,11 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim; + +/** + * Status of a party attribute assertion. + */ +public enum PartyAttributeAssertionStatus { + SUBMITTED, + UNDER_REVIEW, + ACCEPTED, + REJECTED +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java index 5745d616c5..6caed0e643 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java @@ -21,6 +21,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.YesNoNotSure; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoPreferNotToSay; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity; @@ -89,13 +90,13 @@ public class DefendantResponseEntity { @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) - private YesOrNo possessionNoticeReceived; + private YesNoNotSure possessionNoticeReceived; private LocalDate noticeReceivedDate; @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) - private YesOrNo rentArrearsAmountConfirmation; + private YesNoNotSure rentArrearsAmountConfirmation; @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) @@ -103,7 +104,7 @@ public class DefendantResponseEntity { @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) - private YesOrNo landlordRegistered; + private YesNoNotSure landlordRegistered; @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java index cd2c474980..8bff761597 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java @@ -48,6 +48,10 @@ private SubmitResponse validate(PossessionClaimResponse possessionClaimRe return error("Invalid submission: missing response data"); } + if (possessionClaimResponse.getDefendantResponses() == null) { + log.error("Submit failed for case {}: defendantResponses is null", caseReference); + return error("Invalid submission: missing defendant response data"); + } return null; } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java index 6367a84eba..2ecbc17a92 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java @@ -45,32 +45,30 @@ public class DefendantResponseService { private final PaymentAgreementService paymentAgreementService; /** - * Saves defendant's responses to the defendant_response table. + * Saves a defendant's response to the defendant_response table + * and its related details to the linked child tables. * *

Uses optimized approach with minimal locking: *

    *
  1. Check duplicate first (fail fast)
  2. *
  3. Get IDs only (minimal lock time)
  4. *
  5. Use getReferenceById() for proxies (no query)
  6. - *
  7. Save - only locks new row being inserted
  8. + *
  9. Build the DefendantResponseEntity and link it to the owning PcsCaseEntity
  10. + *
  11. Attach one-to-one child entities (household circumstances, payment agreement, reasonable adjustments)
  12. + *
  13. Persist the entities in a single save, only locks new row being inserted
  14. *
* *

This approach ensures concurrent defendants can submit simultaneously * without blocking each other or other case operations. * * @param caseReference The case reference number - * @param possessionClaimResponse responses from draft data + * @param possessionClaimResponse the possession claim response from draft data * @throws IllegalStateException if user ID is null, response already exists, * party not found, or claim not found */ public void saveDefendantResponse(long caseReference, PossessionClaimResponse possessionClaimResponse) { UUID userId = securityContextService.getCurrentUserId(); - - // Early return if no responses to save - if (possessionClaimResponse == null) { - log.debug("No defendant responses to save for case {}", caseReference); - return; - } + DefendantResponses defendantResponses = possessionClaimResponse.getDefendantResponses(); if (userId == null) { log.error("Cannot save defendant response: current user IDAM ID is null"); @@ -96,24 +94,34 @@ public void saveDefendantResponse(long caseReference, PossessionClaimResponse po PartyEntity partyRef = partyRepository.getReferenceById(partyId); ClaimEntity claimRef = claimRepository.getReferenceById(claimId); - DefendantResponses responses = possessionClaimResponse.getDefendantResponses(); + DefendantResponseEntity responseEntity = buildDefendantResponseEntity(claimRef, partyRef, defendantResponses); + + buildAndLinkChildEntities(responseEntity, possessionClaimResponse); + + defendantResponseRepository.save(responseEntity); + + log.info("Successfully saved defendant response for case {} user {}", caseReference, userId); + } + + public DefendantResponseEntity buildDefendantResponseEntity(ClaimEntity claimRef, + PartyEntity partyRef, + DefendantResponses responses) { + DefendantResponseEntity defendantResponse = DefendantResponseEntity.builder() .claim(claimRef) .party(partyRef) .receivedFreeLegalAdvice(responses.getReceivedFreeLegalAdvice()) + .possessionNoticeReceived(responses.getNoticeReceived()) + .noticeReceivedDate(responses.getNoticeReceivedDate()) + .rentArrearsAmountConfirmation(responses.getRentArrearsAmountConfirmation()) .build(); //set bidirectional relationship with the pcs case claimRef.getPcsCase().addDefendantResponse(defendantResponse); - buildAndLinkChildEntities(defendantResponse, possessionClaimResponse); - - defendantResponseRepository.save(defendantResponse); - - log.info("Successfully saved defendant response for case {} user {}", caseReference, userId); + return defendantResponse; } - public void buildAndLinkChildEntities( DefendantResponseEntity defendantResponseEntity, PossessionClaimResponse response) { diff --git a/src/main/resources/db/migration/V063__update_defendant_response_table.sql b/src/main/resources/db/migration/V063__update_defendant_response_table.sql index 500e1cc6f7..15c254cb27 100644 --- a/src/main/resources/db/migration/V063__update_defendant_response_table.sql +++ b/src/main/resources/db/migration/V063__update_defendant_response_table.sql @@ -1,14 +1,14 @@ ALTER TABLE defendant_response - ADD COLUMN sot_id UUID REFERENCES statement_of_truth(id), + ADD COLUMN sot_id UUID UNIQUE REFERENCES statement_of_truth(id), ADD COLUMN pcs_case_id UUID NOT NULL REFERENCES pcs_case(id), ADD COLUMN defendant_name_confirmation YES_NO, ADD COLUMN correspondence_address_confirmation YES_NO, - ADD COLUMN possession_notice_received YES_NO, + ADD COLUMN possession_notice_received YES_NO_NOT_SURE, ADD COLUMN notice_received_date DATE, - ADD COLUMN rent_arrears_amount_confirmation YES_NO, + ADD COLUMN rent_arrears_amount_confirmation YES_NO_NOT_SURE, ADD COLUMN dispute_claim YES_NO, ADD COLUMN dispute_claim_details VARCHAR(6800), - ADD COLUMN landlord_registered YES_NO, + ADD COLUMN landlord_registered YES_NO_NOT_SURE, ADD COLUMN make_counter_claim YES_NO, ADD COLUMN version INT, ADD COLUMN status VARCHAR(60), @@ -18,3 +18,5 @@ ALTER TABLE defendant_response ADD COLUMN language_used TEXT, ADD COLUMN channel VARCHAR(60), ADD COLUMN ingestion_source VARCHAR(60); + +CREATE INDEX defendant_response_pcs_case_idx ON defendant_response (pcs_case_id); diff --git a/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql b/src/main/resources/db/migration/V064__create_respond_to_claim_related_tables.sql similarity index 88% rename from src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql rename to src/main/resources/db/migration/V064__create_respond_to_claim_related_tables.sql index eaf4224232..966c3309d0 100644 --- a/src/main/resources/db/migration/V064__create_respond_to_claim_tables.sql +++ b/src/main/resources/db/migration/V064__create_respond_to_claim_related_tables.sql @@ -1,7 +1,8 @@ + -- reasonable_adjustments CREATE TABLE reasonable_adjustments ( id UUID PRIMARY KEY, - defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), + defendant_response_id UUID NOT NULL UNIQUE REFERENCES defendant_response(id), reasonable_adjustments_required VARCHAR(250), reasonable_adjustment_description VARCHAR(500), hearing_enhancement_description VARCHAR(250), @@ -18,7 +19,7 @@ CREATE TABLE reasonable_adjustments ( -- household_circumstances CREATE TABLE household_circumstances ( id UUID PRIMARY KEY, - defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), + defendant_response_id UUID NOT NULL UNIQUE REFERENCES defendant_response(id), dependant_children YES_NO, dependant_children_details VARCHAR(500), other_dependants YES_NO, @@ -48,7 +49,7 @@ CREATE TABLE household_circumstances ( -- payment_agreement CREATE TABLE payment_agreement ( id UUID PRIMARY KEY, - defendant_response_id UUID NOT NULL REFERENCES defendant_response(id), + defendant_response_id UUID NOT NULL UNIQUE REFERENCES defendant_response(id), any_payments_made YES_NO, payment_details VARCHAR(500), paid_money_to_housing_org YES_NO, diff --git a/src/main/resources/db/migration/V065__add_party_attribute_assertion_table.sql b/src/main/resources/db/migration/V065__add_party_attribute_assertion_table.sql new file mode 100644 index 0000000000..e3d5c60e3d --- /dev/null +++ b/src/main/resources/db/migration/V065__add_party_attribute_assertion_table.sql @@ -0,0 +1,29 @@ +CREATE TYPE party_attribute_assertion_submitted_by AS ENUM ( + 'CLAIMANT', + 'DEFENDANT', + 'JUDGE', + 'COURT_STAFF', + 'CASE_WORKER' +); + +CREATE TYPE party_attribute_assertion_status AS ENUM ( + 'SUBMITTED', + 'UNDER_REVIEW', + 'ACCEPTED', + 'REJECTED' +); + +CREATE TABLE party_attribute_assertion ( + id UUID PRIMARY KEY, + party_id UUID NOT NULL REFERENCES party(id), + evidence_document_id UUID NOT NULL REFERENCES document(id), + attributes_name VARCHAR(255) NOT NULL, + asserted_value TEXT NOT NULL, + asserted_by party_attribute_assertion_submitted_by NOT NULL, + status party_attribute_assertion_status NOT NULL, + created_at TIMESTAMP NOT NULL, + decided_at TIMESTAMP +); + +CREATE INDEX idx_party_attribute_assertion_party_id ON party_attribute_assertion (party_id); + 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 0fc491632d..eb1560302f 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 @@ -79,13 +79,41 @@ void shouldReturnErrorWhenPossessionClaimResponseIsNull() { ); } + @Test + void shouldReturnErrorWhenDefendantResponsesIsNull() { + // Given + PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() + .defendantResponses(null) + .build(); + + PCSCase caseData = PCSCase.builder() + .possessionClaimResponse(possessionClaimResponse) + .build(); + + EventPayload payload = createEventPayload(caseData); + + // When + SubmitResponse result = underTest.submit(payload); + + // Then + assertThat(result).isNotNull(); + assertThat(result.getErrors()).isNotNull(); + assertThat(result.getErrors()).hasSize(1); + assertThat(result.getErrors().getFirst()) + .isEqualTo("Invalid submission: missing defendant response data"); + + verify(draftCaseDataService, never()).getUnsubmittedCaseData(anyLong(), eq(respondPossessionClaim)); + verify(claimResponseService, never()).saveDraftData(any(), anyLong()); + verify(defendantResponseService, never()).saveDefendantResponse(anyLong(), any()); + } + // ========== INDEPENDENT FIELD SUBMISSION TESTS ========== @Test void shouldAllowSubmitWithOnlyDefendantResponses() { DefendantResponses responses = DefendantResponses.builder() .tenancyTypeCorrect(YesNoNotSure.YES) - .oweRentArrears(YesNoNotSure.NO) + .rentArrearsAmountConfirmation(YesNoNotSure.NO) .build(); PCSCase caseData = createDraftSaveCaseData(null, responses); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionsclaim/RespondToPossessionDraftSavePageTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionsclaim/RespondToPossessionDraftSavePageTest.java index 2d2713d590..9288d51bd1 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 @@ -124,7 +124,7 @@ void shouldSkipValidationWhenPartyIsNull() { DefendantResponses responses = DefendantResponses.builder() .tenancyTypeCorrect(YesNoNotSure.YES) - .oweRentArrears(YesNoNotSure.NO) + .rentArrearsAmountConfirmation(YesNoNotSure.NO) .build(); PCSCase caseData = buildCaseData(contactDetails, responses,null,null,null); @@ -191,7 +191,7 @@ void shouldSaveDefendantResponsesData() { //Given DefendantResponses responses = DefendantResponses.builder() .tenancyTypeCorrect(YesNoNotSure.YES) - .oweRentArrears(YesNoNotSure.NO) + .rentArrearsAmountConfirmation(YesNoNotSure.NO) .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) .contactByEmail(VerticalYesNo.YES) .contactByPhone(VerticalYesNo.NO) @@ -211,7 +211,7 @@ void shouldSaveDefendantResponsesData() { PCSCase savedDraft = pcsCaseCaptor.getValue(); DefendantResponses savedResponses = savedDraft.getPossessionClaimResponse().getDefendantResponses(); assertThat(savedResponses.getTenancyTypeCorrect()).isEqualTo(YesNoNotSure.YES); - assertThat(savedResponses.getOweRentArrears()).isEqualTo(YesNoNotSure.NO); + assertThat(savedResponses.getRentArrearsAmountConfirmation()).isEqualTo(YesNoNotSure.NO); assertThat(savedResponses.getReceivedFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.YES); assertThat(savedResponses.getContactByEmail()).isEqualTo(VerticalYesNo.YES); assertThat(savedResponses.getContactByPhone()).isEqualTo(VerticalYesNo.NO); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index 590b27b6fb..2c3660b33f 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -8,6 +8,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; 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.YesNoPreferNotToSay; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponses; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.HouseholdCircumstances; @@ -32,6 +33,7 @@ import uk.gov.hmcts.reform.pcs.exception.PartyNotFoundException; import uk.gov.hmcts.reform.pcs.security.SecurityContextService; +import java.time.LocalDate; import java.util.Optional; import java.util.UUID; @@ -108,6 +110,9 @@ void shouldSaveDefendantResponseWithJpaProxies() { DefendantResponses responses = DefendantResponses.builder() .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .noticeReceived(YesNoNotSure.YES) + .noticeReceivedDate(LocalDate.of(2024, 1, 15)) + .rentArrearsAmountConfirmation(YesNoNotSure.NO) .build(); PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() @@ -124,6 +129,11 @@ void shouldSaveDefendantResponseWithJpaProxies() { assertThat(savedResponse.getParty()).isEqualTo(partyEntity); assertThat(savedResponse.getClaim()).isEqualTo(claimEntity); assertThat(savedResponse.getReceivedFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.YES); + assertThat(savedResponse.getPossessionNoticeReceived()).isEqualTo(YesNoNotSure.YES); + assertThat(savedResponse.getNoticeReceivedDate()).isEqualTo(LocalDate.of(2024, 1, 15)); + assertThat(savedResponse.getRentArrearsAmountConfirmation()).isEqualTo(YesNoNotSure.NO); + + verify(pcsCaseEntity).addDefendantResponse(savedResponse); } @Test @@ -264,19 +274,6 @@ void shouldThrowExceptionWhenDuplicateResponseExists() { verify(defendantResponseRepository, never()).save(any()); } - @Test - void shouldReturnEarlyWhenPossessionClaimResponseIsNull() { - // Given - when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); - - // When - underTest.saveDefendantResponse(CASE_REFERENCE, null); - - // Then - verify(claimRepository, never()).findIdByCaseReference(anyLong()); - verify(defendantResponseRepository, never()).save(any()); - } - @Test void shouldPropagateExceptionWhenPartyNotFound() { // Given From 1f3c929ba693822fab8bfe49d026a785e79fb0f0 Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Thu, 12 Mar 2026 11:07:29 +0000 Subject: [PATCH 12/26] HDPI-5191:Refactored submit event handler validation --- .../SubmitEventHandler.java | 46 ++++++++-------- .../ccd/event/RespondPossessionClaimTest.java | 3 ++ .../SubmitEventHandlerTest.java | 52 +++++++------------ 3 files changed, 44 insertions(+), 57 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java index 8bff761597..f7adbd18f5 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java @@ -30,31 +30,10 @@ public class SubmitEventHandler implements Submit { @Override public SubmitResponse submit(EventPayload eventPayload) { long caseReference = eventPayload.caseReference(); - //extract data from event - PossessionClaimResponse defendantResponse = eventPayload.caseData().getPossessionClaimResponse(); - log.info("RespondPossessionClaim submit callback invoked for Case Reference: {}", caseReference); - - SubmitResponse validationError = validate(defendantResponse, caseReference); - if (validationError != null) { - return validationError; - } return processFinalSubmit(caseReference); } - private SubmitResponse validate(PossessionClaimResponse possessionClaimResponse, long caseReference) { - if (possessionClaimResponse == null) { - log.error("Submit failed for case {}: possessionClaimResponse is null", caseReference); - return error("Invalid submission: missing response data"); - } - - if (possessionClaimResponse.getDefendantResponses() == null) { - log.error("Submit failed for case {}: defendantResponses is null", caseReference); - return error("Invalid submission: missing defendant response data"); - } - return null; - } - private SubmitResponse processFinalSubmit(long caseReference) { log.info("Processing final submission for case {}", caseReference); @@ -65,12 +44,16 @@ private SubmitResponse processFinalSubmit(long caseReference) { //get only possession response from draft PossessionClaimResponse responseDraftData = draftData.getPossessionClaimResponse(); + //validate draft data + SubmitResponse validationError = validate(responseDraftData, caseReference); + if (validationError != null) { + return validationError; + } + //call services to save to relevant tables - claimResponseService - .saveDraftData(responseDraftData, caseReference); + claimResponseService.saveDraftData(responseDraftData, caseReference); - defendantResponseService.saveDefendantResponse(caseReference, - responseDraftData); + defendantResponseService.saveDefendantResponse(caseReference, responseDraftData); //delete draft as it's no longer needed draftCaseDataService.deleteUnsubmittedCaseData(caseReference, respondPossessionClaim); @@ -79,6 +62,19 @@ private SubmitResponse processFinalSubmit(long caseReference) { return success(); } + private SubmitResponse validate(PossessionClaimResponse possessionClaimResponse, long caseReference) { + if (possessionClaimResponse == null) { + log.error("Submit failed for case {}: possession claim response is null", caseReference); + return error("Invalid submission: missing response data"); + } + + if (possessionClaimResponse.getDefendantResponses() == null) { + log.error("Submit failed for case {}: defendant responses is null", caseReference); + return error("Invalid submission: missing defendant response data"); + } + return null; + } + private SubmitResponse success() { return SubmitResponse.defaultResponse(); } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java index 6d69c87db0..04d583dd3c 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java @@ -506,6 +506,9 @@ void shouldReturnErrorWhenPossessionClaimResponseIsNull() { .possessionClaimResponse(null) .build(); + when(draftCaseDataService.getUnsubmittedCaseData(TEST_CASE_REFERENCE, EventId.respondPossessionClaim)) + .thenReturn(Optional.of(caseData)); + var response = callSubmitHandler(caseData); assertThat(response.getErrors()).isNotNull(); 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 eb1560302f..45e3da0444 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 @@ -63,6 +63,8 @@ void shouldReturnErrorWhenPossessionClaimResponseIsNull() { .possessionClaimResponse(null) .build(); + stubDraft(caseData); + EventPayload payload = createEventPayload(caseData); // When @@ -74,9 +76,10 @@ void shouldReturnErrorWhenPossessionClaimResponseIsNull() { assertThat(result.getErrors()).hasSize(1); assertThat(result.getErrors().getFirst()).isEqualTo("Invalid submission: missing response data"); - verify(draftCaseDataService, never()).patchUnsubmittedEventData( - eq(CASE_REFERENCE), any(PCSCase.class), eq(respondPossessionClaim) - ); + verify(draftCaseDataService).getUnsubmittedCaseData(CASE_REFERENCE, respondPossessionClaim); + verify(claimResponseService, never()).saveDraftData(any(), anyLong()); + verify(defendantResponseService, never()).saveDefendantResponse(anyLong(), any()); + verify(draftCaseDataService, never()).deleteUnsubmittedCaseData(anyLong(), eq(respondPossessionClaim)); } @Test @@ -90,6 +93,8 @@ void shouldReturnErrorWhenDefendantResponsesIsNull() { .possessionClaimResponse(possessionClaimResponse) .build(); + stubDraft(caseData); + EventPayload payload = createEventPayload(caseData); // When @@ -102,9 +107,10 @@ void shouldReturnErrorWhenDefendantResponsesIsNull() { assertThat(result.getErrors().getFirst()) .isEqualTo("Invalid submission: missing defendant response data"); - verify(draftCaseDataService, never()).getUnsubmittedCaseData(anyLong(), eq(respondPossessionClaim)); + verify(draftCaseDataService).getUnsubmittedCaseData(CASE_REFERENCE, respondPossessionClaim); verify(claimResponseService, never()).saveDraftData(any(), anyLong()); verify(defendantResponseService, never()).saveDefendantResponse(anyLong(), any()); + verify(draftCaseDataService, never()).deleteUnsubmittedCaseData(anyLong(), eq(respondPossessionClaim)); } // ========== INDEPENDENT FIELD SUBMISSION TESTS ========== @@ -118,8 +124,7 @@ void shouldAllowSubmitWithOnlyDefendantResponses() { PCSCase caseData = createDraftSaveCaseData(null, responses); - when(draftCaseDataService.getUnsubmittedCaseData(CASE_REFERENCE, respondPossessionClaim)) - .thenReturn(Optional.of(caseData)); + stubDraft(caseData); SubmitResponse result = underTest.submit(createEventPayload(caseData)); @@ -164,11 +169,11 @@ void shouldSaveAllContactPreferenceFieldsWhenFinalSubmit() { .possessionClaimResponse(response) .build(); + stubDraft(caseData); + EventPayload eventPayload = createEventPayload(caseData); // When - when(draftCaseDataService.getUnsubmittedCaseData(CASE_REFERENCE, respondPossessionClaim)) - .thenReturn(Optional.of(caseData)); SubmitResponse result = underTest.submit(eventPayload); // Then @@ -212,13 +217,11 @@ void shouldHandleContactPreferencesWithNullValues() { PCSCase caseData = PCSCase.builder() .possessionClaimResponse(response) .build(); + stubDraft(caseData); EventPayload eventPayload = createEventPayload(caseData); // When - when(draftCaseDataService.getUnsubmittedCaseData(CASE_REFERENCE, respondPossessionClaim)) - .thenReturn(Optional.of(caseData)); - SubmitResponse result = underTest.submit(eventPayload); // Then @@ -252,12 +255,11 @@ void shouldHandleExceptionFromContactPreferencesService() { PCSCase caseData = PCSCase.builder() .possessionClaimResponse(response) .build(); + stubDraft(caseData); EventPayload eventPayload = createEventPayload(caseData); //when - when(draftCaseDataService.getUnsubmittedCaseData(CASE_REFERENCE, respondPossessionClaim)) - .thenReturn(Optional.of(caseData)); // Mock service to throw exception doThrow(new IllegalStateException("No party found for IDAM ID")) @@ -297,10 +299,9 @@ void shouldCallContactPreferencesServiceBeforeReturningSuccess() { .possessionClaimResponse(response) .build(); - EventPayload eventPayload = createEventPayload(caseData); + stubDraft(caseData); - when(draftCaseDataService.getUnsubmittedCaseData(CASE_REFERENCE, respondPossessionClaim)) - .thenReturn(Optional.of(caseData)); + EventPayload eventPayload = createEventPayload(caseData); // When SubmitResponse result = underTest.submit(eventPayload); @@ -312,26 +313,13 @@ void shouldCallContactPreferencesServiceBeforeReturningSuccess() { assertThat(result.getState()).isNull(); // Default response has null state } - @Test - void shouldNotCallContactPreferencesServiceWhenValidationFails() { - // Given - Missing possessionClaimResponse - PCSCase caseData = PCSCase.builder() - .possessionClaimResponse(null) // Will fail validation - .build(); - - EventPayload eventPayload = createEventPayload(caseData); - - // When - SubmitResponse result = underTest.submit(eventPayload); - - // Then - Service should NOT be called due to validation failure - verify(claimResponseService, never()).saveDraftData(any(), anyLong()); - assertThat(result.getErrors()).isNotEmpty(); + private void stubDraft(PCSCase draft) { + when(draftCaseDataService.getUnsubmittedCaseData(CASE_REFERENCE, respondPossessionClaim)) + .thenReturn(Optional.of(draft)); } private EventPayload createEventPayload(PCSCase caseData) { when(eventPayload.caseReference()).thenReturn(CASE_REFERENCE); - when(eventPayload.caseData()).thenReturn(caseData); return eventPayload; } From 920697a53b7ef2c0288a4dfd5078942fd27bddbc Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Thu, 12 Mar 2026 11:09:26 +0000 Subject: [PATCH 13/26] HDPI-5191:Renamed migration script --- ...table.sql => V065__create_party_attribute_assertion_table.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V065__add_party_attribute_assertion_table.sql => V065__create_party_attribute_assertion_table.sql} (100%) diff --git a/src/main/resources/db/migration/V065__add_party_attribute_assertion_table.sql b/src/main/resources/db/migration/V065__create_party_attribute_assertion_table.sql similarity index 100% rename from src/main/resources/db/migration/V065__add_party_attribute_assertion_table.sql rename to src/main/resources/db/migration/V065__create_party_attribute_assertion_table.sql From b5c4c4d9c4d00bde43e93c088d2b7b6860c82c6c Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Thu, 12 Mar 2026 11:44:44 +0000 Subject: [PATCH 14/26] HDPI-5191:Updated party attribute enums --- .../PartyAttributeAssertedBy.java | 20 +++++++++++++------ .../PartyAttributeAssertionStatus.java | 18 ++++++++++++----- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertedBy.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertedBy.java index 5c0d6840e1..d4f18d4823 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertedBy.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertedBy.java @@ -1,12 +1,20 @@ package uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim; +import lombok.AllArgsConstructor; +import lombok.Getter; +import uk.gov.hmcts.ccd.sdk.api.HasLabel; + /** * Who asserted a correction to a party attribute. */ -public enum PartyAttributeAssertedBy { - CLAIMANT, - DEFENDANT, - JUDGE, - COURT_STAFF, - CASE_WORKER +@AllArgsConstructor +@Getter +public enum PartyAttributeAssertedBy implements HasLabel { + CLAIMANT("Claimant"), + DEFENDANT("Defendant"), + JUDGE("Judge"), + COURT_STAFF("Court staff"), + CASE_WORKER("Case worker"); + + private final String label; } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertionStatus.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertionStatus.java index ab5d53f798..a2bbca1ead 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertionStatus.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PartyAttributeAssertionStatus.java @@ -1,11 +1,19 @@ package uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim; +import lombok.AllArgsConstructor; +import lombok.Getter; +import uk.gov.hmcts.ccd.sdk.api.HasLabel; + /** * Status of a party attribute assertion. */ -public enum PartyAttributeAssertionStatus { - SUBMITTED, - UNDER_REVIEW, - ACCEPTED, - REJECTED +@AllArgsConstructor +@Getter +public enum PartyAttributeAssertionStatus implements HasLabel { + SUBMITTED("Submitted"), + UNDER_REVIEW("Under review"), + ACCEPTED("Accepted"), + REJECTED("Rejected"); + + private final String label; } From 7711c3ed9e7f9a95bf90bd884b6072be47812c19 Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Thu, 12 Mar 2026 13:24:54 +0000 Subject: [PATCH 15/26] HDPI-5191:Updating migration as per data model --- .../respondpossessionclaim/PaymentAgreementEntity.java | 3 ++- .../ccd/event/respondpossessionclaim/StartEventHandler.java | 5 ++--- .../V064__create_respond_to_claim_related_tables.sql | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java index 1f1b1384cc..0bde19f971 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java @@ -18,6 +18,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.YesNoNotSure; import java.math.BigDecimal; import java.util.UUID; @@ -51,7 +52,7 @@ public class PaymentAgreementEntity { @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) - private YesOrNo repaymentPlanAgreed; + private YesNoNotSure repaymentPlanAgreed; private String repaymentAgreedDetails; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/StartEventHandler.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/StartEventHandler.java index ae1f0a3b9a..31f892114b 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/StartEventHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/StartEventHandler.java @@ -7,10 +7,10 @@ import uk.gov.hmcts.ccd.sdk.api.callback.Start; import uk.gov.hmcts.ccd.sdk.type.ListValue; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; -import uk.gov.hmcts.reform.pcs.ccd.domain.Party; import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase; -import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PossessionClaimResponse; +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.respondpossessionclaim.PossessionClaimResponse; import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; import uk.gov.hmcts.reform.pcs.ccd.service.DraftCaseDataService; @@ -158,7 +158,6 @@ private void createInitialDraft(long caseReference, PossessionClaimResponse resp // Filter to ONLY defendant's editable fields (exclude claimantOrganisations) PossessionClaimResponse defendantFieldsOnly = PossessionClaimResponse.builder() .defendantContactDetails(response.getDefendantContactDetails()) - .defendantResponses(response.getDefendantResponses()) .build(); // claimantOrganisations intentionally excluded - view data only PCSCase draftWithOnlyResponseData = PCSCase.builder() diff --git a/src/main/resources/db/migration/V064__create_respond_to_claim_related_tables.sql b/src/main/resources/db/migration/V064__create_respond_to_claim_related_tables.sql index 966c3309d0..51fc3edec7 100644 --- a/src/main/resources/db/migration/V064__create_respond_to_claim_related_tables.sql +++ b/src/main/resources/db/migration/V064__create_respond_to_claim_related_tables.sql @@ -53,7 +53,7 @@ CREATE TABLE payment_agreement ( any_payments_made YES_NO, payment_details VARCHAR(500), paid_money_to_housing_org YES_NO, - repayment_plan_agreed YES_NO, + repayment_plan_agreed YES_NO_NOT_SURE, repayment_agreed_details VARCHAR(500), repay_arrears_instalments YES_NO, additional_rent_contribution DECIMAL(18,2), From c3fa1d259af68707d6bd840b42dca466f3553dcf Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Thu, 12 Mar 2026 16:00:40 +0000 Subject: [PATCH 16/26] HDPI-5191:Updating tests post merge --- .../PossessionClaimResponseMapper.java | 3 --- .../service/DefendantResponseServiceTest.java | 14 +++++++++++++- .../PossessionClaimResponseMapperTest.java | 19 ------------------- 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PossessionClaimResponseMapper.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PossessionClaimResponseMapper.java index 6919159868..85a7fffdf5 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PossessionClaimResponseMapper.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PossessionClaimResponseMapper.java @@ -9,7 +9,6 @@ import uk.gov.hmcts.reform.pcs.ccd.domain.Party; import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; 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.PossessionClaimResponse; import uk.gov.hmcts.reform.pcs.ccd.entity.party.PartyEntity; import uk.gov.hmcts.reform.pcs.ccd.util.AddressMapper; @@ -39,7 +38,6 @@ public class PossessionClaimResponseMapper { */ public PossessionClaimResponse mapFrom(PCSCase pcsCase, PartyEntity matchedDefendant) { DefendantContactDetails contactDetails = buildContactDetails(pcsCase, matchedDefendant); - DefendantResponses responses = DefendantResponses.builder().build(); // Extract org names from CLAIMANT-role parties (pre-filtered by PCSCaseView.getPartyMap) List> claimantOrgs = extractClaimantOrganisations(pcsCase); @@ -47,7 +45,6 @@ public PossessionClaimResponse mapFrom(PCSCase pcsCase, PartyEntity matchedDefen return PossessionClaimResponse.builder() .claimantOrganisations(claimantOrgs) .defendantContactDetails(contactDetails) - .defendantResponses(responses) .build(); } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index 02fab5520b..f8d971a430 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -407,6 +407,7 @@ void shouldFollowOptimalExecutionOrder() { // 5. Save (only locks new row) verify(defendantResponseRepository).save(any(DefendantResponseEntity.class)); } + @Test void shouldNotSaveDefendantResponseWhenTenancyDateIsEmpty() { //Given @@ -418,6 +419,7 @@ void shouldNotSaveDefendantResponseWhenTenancyDateIsEmpty() { when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + when(claimEntity.getPcsCase()).thenReturn(pcsCaseEntity); DefendantResponses responses = DefendantResponses.builder() .tenancyStartDate(null) .build(); @@ -445,6 +447,7 @@ void shouldSaveDefendantResponseWhenTenancyDateIsPresent() { when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + when(claimEntity.getPcsCase()).thenReturn(pcsCaseEntity); LocalDate date = LocalDate.of(2023, 7, 1); @@ -486,6 +489,7 @@ void shouldSaveDefendantResponseWithTenancyStartDateConfirmation( when(partyRepository.getReferenceById(PARTY_ID)) .thenReturn(partyEntity); when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + when(claimEntity.getPcsCase()).thenReturn(pcsCaseEntity); DefendantResponses responses = DefendantResponses.builder() .tenancyStartDateConfirmation(tenancyStartDateConfirmation) @@ -509,7 +513,15 @@ void shouldSaveDefendantResponseWithTenancyStartDateConfirmation( @Test void shouldBuildAndLinkChildEntitiesWhenSavingDefendantResponse() { - //Given + // Given + when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); + when(defendantResponseRepository.existsByClaimPcsCaseCaseReferenceAndPartyIdamId( + CASE_REFERENCE, USER_ID)).thenReturn(false); + when(partyService.getPartyEntityByIdamId(USER_ID, CASE_REFERENCE)).thenReturn(partyEntity); + when(partyEntity.getId()).thenReturn(PARTY_ID); + when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); + when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); + when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); ReasonableAdjustments reasonableAdjustments = ReasonableAdjustments.builder() .reasonableAdjustmentRequired("Wheelchair access") .build(); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PossessionClaimResponseMapperTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PossessionClaimResponseMapperTest.java index e5c9970dd5..cc521727fe 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PossessionClaimResponseMapperTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PossessionClaimResponseMapperTest.java @@ -190,25 +190,6 @@ void shouldHandleNullAddressWhenAddressSameAsPropertyIsNull() { verify(addressMapper, never()).toAddressUK(any()); } - @Test - void shouldInitializeDefendantResponsesAsEmpty() { - // Given - PartyEntity matchedDefendant = PartyEntity.builder() - .firstName("Test") - .lastName("User") - .build(); - - PCSCase pcsCase = PCSCase.builder() - .propertyAddress(AddressUK.builder().build()) - .build(); - - // When - PossessionClaimResponse result = underTest.mapFrom(pcsCase, matchedDefendant); - - // Then - assertThat(result.getDefendantResponses()).isNotNull(); - } - @Test void shouldMapAllDefendantFields() { // Given From 65f37adc5832d77c14e19f3660caf0b95ba0f9cd Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Fri, 13 Mar 2026 11:49:01 +0000 Subject: [PATCH 17/26] HDPI-5191:Actioning review comments --- .../DefendantResponseStatus.java | 15 +++++ .../ReasonableAdjustments.java | 2 +- .../DefendantResponseEntity.java | 12 +++- .../HouseholdCircumstancesEntity.java | 2 + .../PaymentAgreementEntity.java | 2 + .../ReasonableAdjustmentEntity.java | 2 + .../DefendantResponseService.java | 12 ++-- .../ReasonableAdjustmentsService.java | 2 +- .../RespondToPossessionDraftSavePageTest.java | 66 +++++++++++-------- .../service/DefendantResponseServiceTest.java | 2 +- .../HouseholdCircumstancesServiceTest.java | 4 +- .../PaymentAgreementServiceTest.java | 4 +- .../ReasonableAdjustmentsServiceTest.java | 8 +-- 13 files changed, 86 insertions(+), 47 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponseStatus.java diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponseStatus.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponseStatus.java new file mode 100644 index 0000000000..31c045add4 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponseStatus.java @@ -0,0 +1,15 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import uk.gov.hmcts.ccd.sdk.api.HasLabel; + +@AllArgsConstructor +@Getter +public enum DefendantResponseStatus implements HasLabel { + + CREATED("Created"), + SUBMITTED("Submitted"); + + private final String label; +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java index 276ec8b212..43079d64df 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/ReasonableAdjustments.java @@ -13,5 +13,5 @@ public class ReasonableAdjustments { @CCD - private String reasonableAdjustmentRequired; + private String reasonableAdjustmentsRequired; } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java index 5c0165f87d..c768bcaca4 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java @@ -23,6 +23,7 @@ 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.YesNoPreferNotToSay; +import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.DefendantResponseStatus; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.claim.StatementOfTruthEntity; @@ -92,6 +93,10 @@ public class DefendantResponseEntity { @Column(name = "tenancy_start_date") private LocalDate tenancyStartDate; + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private YesOrNo defendantNameConfirmation; + @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo correspondenceAddressConfirmation; @@ -110,6 +115,8 @@ public class DefendantResponseEntity { @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo disputeClaim; + private String disputeClaimDetails; + @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesNoNotSure landlordRegistered; @@ -118,9 +125,8 @@ public class DefendantResponseEntity { @JdbcTypeCode(SqlTypes.NAMED_ENUM) private YesOrNo makeCounterClaim; - private Integer version; - - private String status; + @Enumerated(EnumType.STRING) + private DefendantResponseStatus status; private LocalDateTime responseSubmittedDate; 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 0338e5a129..4ae921ee0d 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 @@ -8,6 +8,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import lombok.AllArgsConstructor; @@ -38,6 +39,7 @@ public class HouseholdCircumstancesEntity { private UUID id; @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "defendant_response_id") @JsonBackReference private DefendantResponseEntity defendantResponse; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java index 0bde19f971..898332e859 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/PaymentAgreementEntity.java @@ -8,6 +8,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import lombok.AllArgsConstructor; @@ -37,6 +38,7 @@ public class PaymentAgreementEntity { private UUID id; @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "defendant_response_id") @JsonBackReference private DefendantResponseEntity defendantResponse; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java index 59530aea9a..d5d69e65aa 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/ReasonableAdjustmentEntity.java @@ -9,6 +9,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import lombok.AllArgsConstructor; @@ -36,6 +37,7 @@ public class ReasonableAdjustmentEntity { private UUID id; @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "defendant_response_id") @JsonBackReference private DefendantResponseEntity defendantResponse; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java index 859aa153ad..c6978fbb50 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java @@ -69,7 +69,6 @@ public class DefendantResponseService { */ public void saveDefendantResponse(long caseReference, PossessionClaimResponse possessionClaimResponse) { UUID userId = securityContextService.getCurrentUserId(); - DefendantResponses defendantResponses = possessionClaimResponse.getDefendantResponses(); if (userId == null) { log.error("Cannot save defendant response: current user IDAM ID is null"); @@ -95,7 +94,12 @@ public void saveDefendantResponse(long caseReference, PossessionClaimResponse po PartyEntity partyRef = partyRepository.getReferenceById(partyId); ClaimEntity claimRef = claimRepository.getReferenceById(claimId); - DefendantResponseEntity responseEntity = buildDefendantResponseEntity(claimRef, partyRef, defendantResponses); + DefendantResponseEntity responseEntity = + buildDefendantResponseEntity( + claimRef, + partyRef, + possessionClaimResponse.getDefendantResponses() + ); buildAndLinkChildEntities(responseEntity, possessionClaimResponse); @@ -104,7 +108,7 @@ public void saveDefendantResponse(long caseReference, PossessionClaimResponse po log.info("Successfully saved defendant response for case {} user {}", caseReference, userId); } - public DefendantResponseEntity buildDefendantResponseEntity(ClaimEntity claimRef, + private DefendantResponseEntity buildDefendantResponseEntity(ClaimEntity claimRef, PartyEntity partyRef, DefendantResponses responses) { @@ -130,7 +134,7 @@ public DefendantResponseEntity buildDefendantResponseEntity(ClaimEntity claimRef return defendantResponse; } - public void buildAndLinkChildEntities( + private void buildAndLinkChildEntities( DefendantResponseEntity defendantResponseEntity, PossessionClaimResponse response) { diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsService.java index b94e4d5a1e..c6a2130134 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsService.java @@ -14,7 +14,7 @@ public ReasonableAdjustmentEntity createReasonableAdjustmentEntity(ReasonableAdj } ReasonableAdjustmentEntity reasonableAdjustmentEntity = ReasonableAdjustmentEntity.builder() - .reasonableAdjustmentsRequired(reasonableAdjustments.getReasonableAdjustmentRequired()) + .reasonableAdjustmentsRequired(reasonableAdjustments.getReasonableAdjustmentsRequired()) .build(); return reasonableAdjustmentEntity; 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 9288d51bd1..97e6728447 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 @@ -66,7 +66,10 @@ void shouldReturnPartialUpdate() { .noticeReceived(YesNoNotSure.NO) .build(); - PCSCase caseData = buildCaseData(contactDetails, responses,null,null,null); + PCSCase caseData = buildCaseData(PossessionClaimResponse.builder() + .defendantContactDetails(contactDetails) + .defendantResponses(responses) + .build()); when(immutableFieldValidator.findImmutableFieldViolations(any(), anyLong())) .thenReturn(List.of()); @@ -98,7 +101,9 @@ void shouldReturnErrorsWhenImmutableFieldViolationsFound() { .build()) .build(); - PCSCase caseData = buildCaseData(contactDetails, null,null,null,null); + PCSCase caseData = buildCaseData(PossessionClaimResponse.builder() + .defendantContactDetails(contactDetails) + .build()); when(immutableFieldValidator.findImmutableFieldViolations(any(), anyLong())) .thenReturn(List.of("nameKnown", "addressKnown", "addressSameAsProperty")); @@ -127,7 +132,10 @@ void shouldSkipValidationWhenPartyIsNull() { .rentArrearsAmountConfirmation(YesNoNotSure.NO) .build(); - PCSCase caseData = buildCaseData(contactDetails, responses,null,null,null); + PCSCase caseData = buildCaseData(PossessionClaimResponse.builder() + .defendantContactDetails(contactDetails) + .defendantResponses(responses) + .build()); //When AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); @@ -162,7 +170,9 @@ void shouldSaveCompletePartyData() { .build()) .build(); - PCSCase caseData = buildCaseData(contactDetails, null,null,null,null); + PCSCase caseData = buildCaseData(PossessionClaimResponse.builder() + .defendantContactDetails(contactDetails) + .build()); when(immutableFieldValidator.findImmutableFieldViolations(any(), anyLong())) .thenReturn(List.of()); @@ -197,7 +207,7 @@ void shouldSaveDefendantResponsesData() { .contactByPhone(VerticalYesNo.NO) .build(); - PCSCase caseData = buildCaseData(null, responses,null,null,null); + PCSCase caseData = buildCaseData(PossessionClaimResponse.builder().defendantResponses(responses).build()); //When AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); @@ -239,7 +249,7 @@ void shouldSaveAllDefendantSectionsInPartialUpdate() { .build(); ReasonableAdjustments reasonableAdjustments = ReasonableAdjustments.builder() - .reasonableAdjustmentRequired("Wheelchair access") + .reasonableAdjustmentsRequired("Wheelchair access") .build(); HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() @@ -250,11 +260,13 @@ void shouldSaveAllDefendantSectionsInPartialUpdate() { .anyPaymentsMade(uk.gov.hmcts.ccd.sdk.type.YesOrNo.YES) .build(); - PCSCase caseData = buildCaseData(contactDetails, - responses, - reasonableAdjustments, - householdCircumstances, - paymentAgreement); + PCSCase caseData = buildCaseData(PossessionClaimResponse.builder() + .defendantContactDetails(contactDetails) + .defendantResponses(responses) + .reasonableAdjustments(reasonableAdjustments) + .paymentAgreement(paymentAgreement) + .householdCircumstances(householdCircumstances) + .build()); when(immutableFieldValidator.findImmutableFieldViolations(any(), anyLong())) .thenReturn(List.of()); @@ -287,10 +299,12 @@ void shouldSaveAllDefendantSectionsInPartialUpdate() { @Test void shouldAllowNullPartyInPartialUpdate() { //Given - PCSCase caseData = buildCaseData( - DefendantContactDetails.builder().party(null).build(), - null,null,null,null - ); + PCSCase caseData = buildCaseData(PossessionClaimResponse.builder() + .defendantContactDetails( + DefendantContactDetails.builder() + .party(null) + .build()) + .build()); //When AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); @@ -314,7 +328,7 @@ void shouldSkipValidationWhenDefendantContactDetailsIsNull() { .contactByPost(VerticalYesNo.YES) .build(); - PCSCase caseData = buildCaseData(null, responses, null,null,null); + PCSCase caseData = buildCaseData(PossessionClaimResponse.builder().defendantResponses(responses).build()); //When AboutToStartOrSubmitResponse response = callMidEventHandler(caseData); @@ -337,7 +351,10 @@ void shouldReturnErrorWhenDraftSaveFails() { .party(Party.builder().firstName("Jack").lastName("Smith").build()) .build(); - PCSCase caseData = buildCaseData(contactDetails, null,null,null,null); + + PCSCase caseData = buildCaseData(PossessionClaimResponse.builder() + .defendantContactDetails(contactDetails) + .build()); when(immutableFieldValidator.findImmutableFieldViolations(any(), anyLong())) .thenReturn(List.of()); @@ -356,20 +373,11 @@ void shouldReturnErrorWhenDraftSaveFails() { assertThat(response.getData()).isNull(); } - private PCSCase buildCaseData(DefendantContactDetails contactDetails, - DefendantResponses responses, - ReasonableAdjustments reasonableAdjustments, - HouseholdCircumstances householdCircumstances, - PaymentAgreement paymentAgreement) { + private PCSCase buildCaseData(PossessionClaimResponse possessionClaimResponse) { return PCSCase.builder() - .possessionClaimResponse(PossessionClaimResponse.builder() - .defendantContactDetails(contactDetails) - .defendantResponses(responses) - .reasonableAdjustments(reasonableAdjustments) - .householdCircumstances(householdCircumstances) - .paymentAgreement(paymentAgreement) - .build()) + .possessionClaimResponse(possessionClaimResponse) .build(); + } } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index f8d971a430..28a7723009 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -523,7 +523,7 @@ void shouldBuildAndLinkChildEntitiesWhenSavingDefendantResponse() { when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); ReasonableAdjustments reasonableAdjustments = ReasonableAdjustments.builder() - .reasonableAdjustmentRequired("Wheelchair access") + .reasonableAdjustmentsRequired("Wheelchair access") .build(); HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() .dependantChildren(YesOrNo.YES) 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 03b5d29987..94c4b655fc 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 @@ -23,12 +23,12 @@ void setUp() { @Test void shouldMapDependantChildrenField() { //Given - HouseholdCircumstances model = HouseholdCircumstances.builder() + HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() .dependantChildren(YesOrNo.YES) .build(); //When - HouseholdCircumstancesEntity entity = underTest.createHouseholdCircumstancesEntity(model); + HouseholdCircumstancesEntity entity = underTest.createHouseholdCircumstancesEntity(householdCircumstances); //Then assertThat(entity.getDependantChildren()).isEqualTo(YesOrNo.YES); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java index f0bbde6114..0d33b1a9f3 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java @@ -23,12 +23,12 @@ void setUp() { @Test void shouldMapAnyPaymentsMadeField() { //Given - PaymentAgreement model = PaymentAgreement.builder() + PaymentAgreement paymentAgreement = PaymentAgreement.builder() .anyPaymentsMade(YesOrNo.YES) .build(); //When - PaymentAgreementEntity entity = underTest.createPaymentAgreementEntity(model); + PaymentAgreementEntity entity = underTest.createPaymentAgreementEntity(paymentAgreement); //Then assertThat(entity.getAnyPaymentsMade()).isEqualTo(YesOrNo.YES); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java index 7c19276afb..72eab0d8cf 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/ReasonableAdjustmentsServiceTest.java @@ -22,19 +22,19 @@ void setUp() { @Test void shouldMapReasonableAdjustmentsRequiredField() { //Given - ReasonableAdjustments model = ReasonableAdjustments.builder() - .reasonableAdjustmentRequired("Wheelchair access") + ReasonableAdjustments reasonableAdjustments = ReasonableAdjustments.builder() + .reasonableAdjustmentsRequired("Wheelchair access") .build(); //When - ReasonableAdjustmentEntity entity = underTest.createReasonableAdjustmentEntity(model); + ReasonableAdjustmentEntity entity = underTest.createReasonableAdjustmentEntity(reasonableAdjustments); //Then assertThat(entity.getReasonableAdjustmentsRequired()).isEqualTo("Wheelchair access"); } @Test - void shouldReturnNullWhenPaymentAgreementIsNull() { + void shouldReturnNullWhenReasonableAdjustmentIsNull() { // When ReasonableAdjustmentEntity entity = underTest.createReasonableAdjustmentEntity(null); From a02ee825cbfe54c320a6bd34bfed383304ea824a Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Fri, 13 Mar 2026 16:48:01 +0000 Subject: [PATCH 18/26] HDPI-5191:Actioning more review comments --- .../pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java index f7adbd18f5..944095a838 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/respondpossessionclaim/SubmitEventHandler.java @@ -68,6 +68,7 @@ private SubmitResponse validate(PossessionClaimResponse possessionClaimRe return error("Invalid submission: missing response data"); } + // Only persist the defendant response and its related entities if there is actual defendant response draft data if (possessionClaimResponse.getDefendantResponses() == null) { log.error("Submit failed for case {}: defendant responses is null", caseReference); return error("Invalid submission: missing defendant response data"); From 01c8be5b0eed56b40ee366c96b234dba24ae607f Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Mon, 16 Mar 2026 10:13:53 +0000 Subject: [PATCH 19/26] HDPI-5191:Moved draft domain classes inside defendant response domain --- .../DefendantResponses.java | 10 ++++++++++ .../PossessionClaimResponse.java | 8 -------- .../page/RespondToPossessionDraftSavePage.java | 3 --- .../DefendantResponseService.java | 4 ++-- .../RespondToPossessionDraftSavePageTest.java | 18 +++++++++--------- .../service/DefendantResponseServiceTest.java | 7 ++++--- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java index db39c9ad05..105524139a 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java @@ -6,6 +6,7 @@ import lombok.NoArgsConstructor; import uk.gov.hmcts.ccd.sdk.api.CCD; import uk.gov.hmcts.ccd.sdk.type.FieldType; +import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.CitizenAccess; import uk.gov.hmcts.reform.pcs.ccd.annotation.JacksonMoneyGBP; import uk.gov.hmcts.reform.pcs.ccd.domain.VerticalYesNo; import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; @@ -56,4 +57,13 @@ public class DefendantResponses { @CCD private YesNoPreferNotToSay receivedFreeLegalAdvice; + + @CCD(access = {CitizenAccess.class}) + private ReasonableAdjustments reasonableAdjustments; + + @CCD(access = {CitizenAccess.class}) + private HouseholdCircumstances householdCircumstances; + + @CCD(access = {CitizenAccess.class}) + private PaymentAgreement paymentAgreement; } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PossessionClaimResponse.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PossessionClaimResponse.java index c317fd2850..f4c08f6728 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PossessionClaimResponse.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PossessionClaimResponse.java @@ -40,13 +40,5 @@ public class PossessionClaimResponse { @CCD(access = {CitizenAccess.class}) private DefendantResponses defendantResponses; - @CCD(access = {CitizenAccess.class}) - private ReasonableAdjustments reasonableAdjustments; - - @CCD(access = {CitizenAccess.class}) - private HouseholdCircumstances householdCircumstances; - - @CCD(access = {CitizenAccess.class}) - private PaymentAgreement paymentAgreement; } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionclaim/page/RespondToPossessionDraftSavePage.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionclaim/page/RespondToPossessionDraftSavePage.java index fde08e0fed..28740e2ddc 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionclaim/page/RespondToPossessionDraftSavePage.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/respondpossessionclaim/page/RespondToPossessionDraftSavePage.java @@ -42,9 +42,6 @@ private AboutToStartOrSubmitResponse midEvent(CaseDetails Date: Mon, 16 Mar 2026 15:24:51 +0000 Subject: [PATCH 20/26] HDPI-5191:Fixing build post merge --- .../pcs/ccd/service/DefendantResponseServiceTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index e4f2ff69ca..f687c8f93d 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -108,6 +108,7 @@ private void stubPartyLookup() { private void stubClaimLookup() { when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + when(claimEntity.getPcsCase()).thenReturn(pcsCaseEntity); } @Test @@ -480,11 +481,10 @@ void shouldBuildAndLinkChildEntitiesWhenSavingDefendantResponse() { when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); when(defendantResponseRepository.existsByClaimPcsCaseCaseReferenceAndPartyIdamId( CASE_REFERENCE, USER_ID)).thenReturn(false); - when(partyService.getPartyEntityByIdamId(USER_ID, CASE_REFERENCE)).thenReturn(partyEntity); - when(partyEntity.getId()).thenReturn(PARTY_ID); - when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.of(CLAIM_ID)); - when(partyRepository.getReferenceById(PARTY_ID)).thenReturn(partyEntity); - when(claimRepository.getReferenceById(CLAIM_ID)).thenReturn(claimEntity); + + stubPartyLookup(); + stubClaimLookup(); + ReasonableAdjustments reasonableAdjustments = ReasonableAdjustments.builder() .reasonableAdjustmentsRequired("Wheelchair access") .build(); From 78e7472bf239521db3a5555c25ba898ab35c43ed Mon Sep 17 00:00:00 2001 From: Andrew Ajube Date: Wed, 18 Mar 2026 10:27:41 +0000 Subject: [PATCH 21/26] feat: enhance PaymentAgreement class with additional payment-related fields --- .../PaymentAgreement.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java index ae7184bd17..cb54ce178b 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java @@ -6,6 +6,9 @@ import lombok.NoArgsConstructor; import uk.gov.hmcts.ccd.sdk.api.CCD; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; +import uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; + +import java.math.BigDecimal; @Builder @Data @@ -16,4 +19,25 @@ public class PaymentAgreement { @CCD private YesOrNo anyPaymentsMade; + @CCD + private String paymentDetails; + + @CCD + private YesOrNo paidMoneyToHousingOrg; + + @CCD + private YesNoNotSure repaymentPlanAgreed; + + @CCD + private String repaymentAgreedDetails; + + @CCD + private YesOrNo repayArrearsInstalments; + + @CCD + private BigDecimal additionalRentContribution; + + @CCD + private String additionalContributionFrequency; + } From 27a41d00a65422bb41e32bae563bf48fd8f450fc Mon Sep 17 00:00:00 2001 From: Andrew Ajube Date: Wed, 18 Mar 2026 11:52:19 +0000 Subject: [PATCH 22/26] refactor: streamline PaymentAgreementEntity creation by directly returning the builder with additional fields --- .../PaymentAgreementService.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementService.java index f1658f0215..f73111902e 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementService.java @@ -13,10 +13,15 @@ public PaymentAgreementEntity createPaymentAgreementEntity(PaymentAgreement paym return null; } - PaymentAgreementEntity paymentAgreementEntity = PaymentAgreementEntity.builder() + return PaymentAgreementEntity.builder() .anyPaymentsMade(paymentAgreement.getAnyPaymentsMade()) + .paymentDetails(paymentAgreement.getPaymentDetails()) + .paidMoneyToHousingOrg(paymentAgreement.getPaidMoneyToHousingOrg()) + .repaymentPlanAgreed(paymentAgreement.getRepaymentPlanAgreed()) + .repaymentAgreedDetails(paymentAgreement.getRepaymentAgreedDetails()) + .repayArrearsInstalments(paymentAgreement.getRepayArrearsInstalments()) + .additionalRentContribution(paymentAgreement.getAdditionalRentContribution()) + .additionalContributionFrequency(paymentAgreement.getAdditionalContributionFrequency()) .build(); - - return paymentAgreementEntity; } } From 46b1275a39b9e590a707f078659fcd41cb8dd5ee Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Wed, 18 Mar 2026 13:01:28 +0000 Subject: [PATCH 23/26] HDPI-5191:Actioning minor review comments --- .../pcs/ccd/entity/claim/StatementOfTruthEntity.java | 3 +-- .../DefendantResponseEntity.java | 2 ++ .../pcs/ccd/event/RespondPossessionClaimTest.java | 11 +++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/claim/StatementOfTruthEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/claim/StatementOfTruthEntity.java index bc849b97f1..ad74aeef74 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/claim/StatementOfTruthEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/claim/StatementOfTruthEntity.java @@ -4,7 +4,6 @@ import jakarta.persistence.Entity; import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; -import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @@ -41,7 +40,7 @@ public class StatementOfTruthEntity { @JsonBackReference private ClaimEntity claim; - @OneToOne(mappedBy = "statementOfTruth", fetch = FetchType.LAZY) + @OneToOne(mappedBy = "statementOfTruth") @JsonBackReference private DefendantResponseEntity defendantResponse; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java index 6ba89075f4..418a372a15 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java @@ -1,5 +1,6 @@ package uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim; +import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -59,6 +60,7 @@ public class DefendantResponseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "pcs_case_id", nullable = false) + @JsonBackReference private PcsCaseEntity pcsCase; @OneToOne(cascade = ALL, orphanRemoval = true) diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java index 899b93f257..32f0ae551e 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/RespondPossessionClaimTest.java @@ -179,6 +179,8 @@ void shouldPopulatePossessionClaimResponseWhenUserIsMatchingDefendant() { assertThat(contactDetails.getParty().getLastName()).isEqualTo("Doe"); assertThat(contactDetails.getParty().getAddress()).isEqualTo(expectedAddress); + verify(draftCaseDataService).hasUnsubmittedCaseData(TEST_CASE_REFERENCE, EventId.respondPossessionClaim); + verify(draftCaseDataService).patchUnsubmittedEventData( eq(TEST_CASE_REFERENCE), any(PCSCase.class), @@ -349,6 +351,8 @@ void shouldUsePropertyAddressWhenAddressSameAsPropertyIsYes() { assertThat(contactDetails.getParty().getFirstName()).isEqualTo("Jane"); assertThat(contactDetails.getParty().getLastName()).isEqualTo("Smith"); assertThat(contactDetails.getParty().getAddress()).isEqualTo(propertyAddress); + + verify(draftCaseDataService).hasUnsubmittedCaseData(TEST_CASE_REFERENCE, EventId.respondPossessionClaim); } @Test @@ -413,6 +417,8 @@ void shouldCreatePartyObjectEvenWhenDefendantHasNoData() { assertThat(contactDetails.getParty().getLastName()).isNull(); assertThat(contactDetails.getParty().getAddress()).isEqualTo(emptyAddress); + verify(draftCaseDataService).hasUnsubmittedCaseData(TEST_CASE_REFERENCE, EventId.respondPossessionClaim); + verify(draftCaseDataService).patchUnsubmittedEventData( eq(TEST_CASE_REFERENCE), any(PCSCase.class), @@ -486,6 +492,9 @@ void shouldNotOverwriteDraftWhenDraftAlreadyExists() { assertThat(contactDetails.getParty().getLastName()).isEqualTo("SavedLastName"); assertThat(contactDetails.getParty().getEmailAddress()).isEqualTo("saved@example.com"); + verify(draftCaseDataService).hasUnsubmittedCaseData(TEST_CASE_REFERENCE, EventId.respondPossessionClaim); + verify(draftCaseDataService).getUnsubmittedCaseData(TEST_CASE_REFERENCE, EventId.respondPossessionClaim); + // Should NOT call patchUnsubmittedEventData when draft already exists verify(draftCaseDataService, never()).patchUnsubmittedEventData( eq(TEST_CASE_REFERENCE), @@ -509,6 +518,8 @@ void shouldReturnErrorWhenPossessionClaimResponseIsNull() { assertThat(response.getErrors()).hasSize(1); assertThat(response.getErrors().getFirst()).isEqualTo("Invalid submission: missing response data"); + verify(draftCaseDataService).getUnsubmittedCaseData(TEST_CASE_REFERENCE, EventId.respondPossessionClaim); + verify(draftCaseDataService, never()).patchUnsubmittedEventData( eq(TEST_CASE_REFERENCE), any(), From f9a3f90408dcb564e2921a18ffc65f2551376c1e Mon Sep 17 00:00:00 2001 From: Andrew Ajube Date: Wed, 18 Mar 2026 13:36:08 +0000 Subject: [PATCH 24/26] test: update PaymentAgreementServiceTest to include additional fields and assertions for payment agreement mapping --- .../PaymentAgreementServiceTest.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java index 0d33b1a9f3..ed3b2df9f1 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; 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.PaymentAgreement; import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.PaymentAgreementEntity; @@ -21,10 +22,17 @@ void setUp() { } @Test - void shouldMapAnyPaymentsMadeField() { + void shouldMapAllFields() { //Given PaymentAgreement paymentAgreement = PaymentAgreement.builder() .anyPaymentsMade(YesOrNo.YES) + .paymentDetails("Some details") + .paidMoneyToHousingOrg(YesOrNo.NO) + .repaymentPlanAgreed(YesNoNotSure.YES) + .repaymentAgreedDetails("Agreed to pay weekly") + .repayArrearsInstalments(YesOrNo.YES) + .additionalRentContribution(new java.math.BigDecimal("123.45")) + .additionalContributionFrequency("WEEKLY") .build(); //When @@ -32,6 +40,13 @@ void shouldMapAnyPaymentsMadeField() { //Then assertThat(entity.getAnyPaymentsMade()).isEqualTo(YesOrNo.YES); + assertThat(entity.getPaymentDetails()).isEqualTo("Some details"); + assertThat(entity.getPaidMoneyToHousingOrg()).isEqualTo(YesOrNo.NO); + assertThat(entity.getRepaymentPlanAgreed()).isEqualTo(YesNoNotSure.YES); + assertThat(entity.getRepaymentAgreedDetails()).isEqualTo("Agreed to pay weekly"); + assertThat(entity.getRepayArrearsInstalments()).isEqualTo(YesOrNo.YES); + assertThat(entity.getAdditionalRentContribution()).isEqualByComparingTo("123.45"); + assertThat(entity.getAdditionalContributionFrequency()).isEqualTo("WEEKLY"); } @Test From e9ef55c6a0c05eda48f5160a9ce4a7bedbc7d5ac Mon Sep 17 00:00:00 2001 From: Liban Abdirahman Date: Wed, 18 Mar 2026 15:56:03 +0000 Subject: [PATCH 25/26] HDPI-5191:Renaming & dropping columns as per data model --- .../DefendantResponses.java | 2 +- .../DefendantResponseEntity.java | 7 ++-- .../HouseholdCircumstancesEntity.java | 2 +- .../DefendantResponseService.java | 2 +- .../V067__update_defendant_response_table.sql | 7 +++- ...create_respond_to_claim_related_tables.sql | 2 +- .../RespondToPossessionDraftSavePageTest.java | 6 ++-- .../service/DefendantResponseServiceTest.java | 32 +++++++++---------- .../HouseholdCircumstancesServiceTest.java | 23 ++++++++++--- .../PaymentAgreementServiceTest.java | 23 ++++++++++--- 10 files changed, 69 insertions(+), 37 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java index 82351d3d7c..954608ef91 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/DefendantResponses.java @@ -56,7 +56,7 @@ public class DefendantResponses { private VerticalYesNo contactByPhone; @CCD - private YesNoPreferNotToSay receivedFreeLegalAdvice; + private YesNoPreferNotToSay freeLegalAdvice; @CCD private LocalDate dateOfBirth; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java index 418a372a15..576a6e9278 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/entity/respondpossessionclaim/DefendantResponseEntity.java @@ -80,13 +80,10 @@ public class DefendantResponseEntity { @JsonManagedReference private ReasonableAdjustmentEntity reasonableAdjustment; - @Column(name = "possession_order_type", length = 30) - private String possessionOrderType; - @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) - @Column(name = "received_free_legal_advice") - private YesNoPreferNotToSay receivedFreeLegalAdvice; + @Column(name = "free_legal_advice") + private YesNoPreferNotToSay freeLegalAdvice; @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.NAMED_ENUM) 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 4ae921ee0d..59d01f0769 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 @@ -97,7 +97,7 @@ public class HouseholdCircumstancesEntity { private BigDecimal debtTotal; - private String debtContribution; + private BigDecimal debtContribution; private String debtContributionFrequency; diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java index 42df29f4a9..07506d3c89 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/DefendantResponseService.java @@ -116,7 +116,7 @@ private DefendantResponseEntity buildDefendantResponseEntity(ClaimEntity claimRe DefendantResponseEntity defendantResponse = DefendantResponseEntity.builder() .claim(claimRef) .party(partyRef) - .receivedFreeLegalAdvice(responses.getReceivedFreeLegalAdvice()) + .freeLegalAdvice(responses.getFreeLegalAdvice()) .possessionNoticeReceived(responses.getNoticeReceived()) .defendantNameConfirmation(responses.getDefendantNameConfirmation()) .landlordRegistered(responses.getLandlordRegistered()) diff --git a/src/main/resources/db/migration/V067__update_defendant_response_table.sql b/src/main/resources/db/migration/V067__update_defendant_response_table.sql index a96ad00bd1..90d251bfe0 100644 --- a/src/main/resources/db/migration/V067__update_defendant_response_table.sql +++ b/src/main/resources/db/migration/V067__update_defendant_response_table.sql @@ -15,6 +15,11 @@ ALTER TABLE defendant_response ADD COLUMN response_received_date TIMESTAMP, ADD COLUMN language_used TEXT, ADD COLUMN channel VARCHAR(60), - ADD COLUMN ingestion_source VARCHAR(60); + ADD COLUMN ingestion_source VARCHAR(60), + DROP COLUMN possession_order_type; + +-- Rename column must be separate alter statement +ALTER TABLE defendant_response + RENAME COLUMN "received_free_legal_advice" TO free_legal_advice; CREATE INDEX defendant_response_pcs_case_idx ON defendant_response (pcs_case_id); diff --git a/src/main/resources/db/migration/V068__create_respond_to_claim_related_tables.sql b/src/main/resources/db/migration/V068__create_respond_to_claim_related_tables.sql index 51fc3edec7..82810563f3 100644 --- a/src/main/resources/db/migration/V068__create_respond_to_claim_related_tables.sql +++ b/src/main/resources/db/migration/V068__create_respond_to_claim_related_tables.sql @@ -38,7 +38,7 @@ CREATE TABLE household_circumstances ( uc_application_date DATE, priority_debts YES_NO, debt_total DECIMAL(18,2), - debt_contribution VARCHAR(60), + debt_contribution DECIMAL(18,2), debt_contribution_frequency VARCHAR(60), regular_expenses VARCHAR(500), expense_amount DECIMAL(18,2), 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 fee413940b..ff3f9e4f3a 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 @@ -202,7 +202,7 @@ void shouldSaveDefendantResponsesData() { DefendantResponses responses = DefendantResponses.builder() .tenancyTypeCorrect(YesNoNotSure.YES) .rentArrearsAmountConfirmation(YesNoNotSure.NO) - .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .freeLegalAdvice(YesNoPreferNotToSay.YES) .contactByEmail(VerticalYesNo.YES) .contactByPhone(VerticalYesNo.NO) .build(); @@ -222,7 +222,7 @@ void shouldSaveDefendantResponsesData() { DefendantResponses savedResponses = savedDraft.getPossessionClaimResponse().getDefendantResponses(); assertThat(savedResponses.getTenancyTypeCorrect()).isEqualTo(YesNoNotSure.YES); assertThat(savedResponses.getRentArrearsAmountConfirmation()).isEqualTo(YesNoNotSure.NO); - assertThat(savedResponses.getReceivedFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.YES); + assertThat(savedResponses.getFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.YES); assertThat(savedResponses.getContactByEmail()).isEqualTo(VerticalYesNo.YES); assertThat(savedResponses.getContactByPhone()).isEqualTo(VerticalYesNo.NO); } @@ -324,7 +324,7 @@ void shouldAllowNullPartyInPartialUpdate() { void shouldSkipValidationWhenDefendantContactDetailsIsNull() { //Given DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.NO) + .freeLegalAdvice(YesNoPreferNotToSay.NO) .contactByPost(VerticalYesNo.YES) .build(); diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java index 724c4ff21b..eca3ac009b 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DefendantResponseServiceTest.java @@ -122,7 +122,7 @@ void shouldSaveDefendantResponseWithJpaProxies() { stubClaimLookup(); DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .freeLegalAdvice(YesNoPreferNotToSay.YES) .noticeReceived(YesNoNotSure.YES) .noticeReceivedDate(LocalDate.of(2024, 1, 15)) .rentArrearsAmountConfirmation(YesNoNotSure.NO) @@ -142,7 +142,7 @@ void shouldSaveDefendantResponseWithJpaProxies() { assertThat(savedResponse.getParty()).isEqualTo(partyEntity); assertThat(savedResponse.getClaim()).isEqualTo(claimEntity); - assertThat(savedResponse.getReceivedFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.YES); + assertThat(savedResponse.getFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.YES); assertThat(savedResponse.getPossessionNoticeReceived()).isEqualTo(YesNoNotSure.YES); assertThat(savedResponse.getNoticeReceivedDate()).isEqualTo(LocalDate.of(2024, 1, 15)); assertThat(savedResponse.getRentArrearsAmountConfirmation()).isEqualTo(YesNoNotSure.NO); @@ -162,7 +162,7 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsNo() { stubClaimLookup(); DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.NO) + .freeLegalAdvice(YesNoPreferNotToSay.NO) .build(); PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() @@ -176,7 +176,7 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsNo() { verify(defendantResponseRepository).save(responseCaptor.capture()); DefendantResponseEntity savedResponse = responseCaptor.getValue(); - assertThat(savedResponse.getReceivedFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.NO); + assertThat(savedResponse.getFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.NO); } @Test @@ -190,7 +190,7 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsPreferNotToSay() { stubClaimLookup(); DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.PREFER_NOT_TO_SAY) + .freeLegalAdvice(YesNoPreferNotToSay.PREFER_NOT_TO_SAY) .build(); PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() @@ -204,7 +204,7 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsPreferNotToSay() { verify(defendantResponseRepository).save(responseCaptor.capture()); DefendantResponseEntity savedResponse = responseCaptor.getValue(); - assertThat(savedResponse.getReceivedFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.PREFER_NOT_TO_SAY); + assertThat(savedResponse.getFreeLegalAdvice()).isEqualTo(YesNoPreferNotToSay.PREFER_NOT_TO_SAY); } @Test @@ -218,7 +218,7 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsNull() { stubClaimLookup(); DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(null) + .freeLegalAdvice(null) .build(); PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() @@ -232,7 +232,7 @@ void shouldSaveDefendantResponseWhenReceivedFreeLegalAdviceIsNull() { verify(defendantResponseRepository).save(responseCaptor.capture()); DefendantResponseEntity savedResponse = responseCaptor.getValue(); - assertThat(savedResponse.getReceivedFreeLegalAdvice()).isNull(); + assertThat(savedResponse.getFreeLegalAdvice()).isNull(); } @ParameterizedTest(name = "landlordRegistered={0}") @@ -276,7 +276,7 @@ private static Stream landlordRegisteredPersistenceScenarios() { void shouldThrowExceptionWhenCurrentUserIdIsNull() { // Given DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .freeLegalAdvice(YesNoPreferNotToSay.YES) .build(); when(securityContextService.getCurrentUserId()).thenReturn(null); @@ -297,7 +297,7 @@ void shouldThrowExceptionWhenCurrentUserIdIsNull() { void shouldThrowExceptionWhenDuplicateResponseExists() { // Given DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .freeLegalAdvice(YesNoPreferNotToSay.YES) .build(); when(securityContextService.getCurrentUserId()).thenReturn(USER_ID); @@ -327,7 +327,7 @@ void shouldPropagateExceptionWhenPartyNotFound() { when(partyService.getPartyEntityByIdamId(USER_ID, CASE_REFERENCE)).thenThrow(expectedException); DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .freeLegalAdvice(YesNoPreferNotToSay.YES) .build(); // When / Then @@ -353,7 +353,7 @@ void shouldThrowExceptionWhenClaimNotFound() { when(claimRepository.findIdByCaseReference(CASE_REFERENCE)).thenReturn(Optional.empty()); DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .freeLegalAdvice(YesNoPreferNotToSay.YES) .build(); // When / Then @@ -379,7 +379,7 @@ void shouldUseGetReferenceByIdForOptimalPerformance() { stubClaimLookup(); DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .freeLegalAdvice(YesNoPreferNotToSay.YES) .build(); // When @@ -412,7 +412,7 @@ void shouldFollowOptimalExecutionOrder() { stubClaimLookup(); DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .freeLegalAdvice(YesNoPreferNotToSay.YES) .build(); PossessionClaimResponse possessionClaimResponse = PossessionClaimResponse.builder() @@ -453,7 +453,7 @@ void shouldPersistTenancyStartDate(LocalDate tenancyStartDate) { stubClaimLookup(); DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .freeLegalAdvice(YesNoPreferNotToSay.YES) .tenancyStartDate(tenancyStartDate) .build(); @@ -553,7 +553,7 @@ void shouldBuildAndLinkChildEntitiesWhenSavingDefendantResponse() { .thenReturn(paymentAgreementEntity); DefendantResponses responses = DefendantResponses.builder() - .receivedFreeLegalAdvice(YesNoPreferNotToSay.YES) + .freeLegalAdvice(YesNoPreferNotToSay.YES) .reasonableAdjustments(reasonableAdjustments) .householdCircumstances(householdCircumstances) .paymentAgreement(paymentAgreement) 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 94c4b655fc..3fc4c62e6f 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 @@ -3,11 +3,16 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; 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.MethodSource; 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.entity.respondpossessionclaim.HouseholdCircumstancesEntity; +import java.util.stream.Stream; + import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(MockitoExtension.class) @@ -20,18 +25,28 @@ void setUp() { underTest = new HouseholdCircumstancesService(); } - @Test - void shouldMapDependantChildrenField() { + @ParameterizedTest + @MethodSource("dependantChildrenScenarios") + void shouldMapDependantChildrenField(YesOrNo expected) { //Given HouseholdCircumstances householdCircumstances = HouseholdCircumstances.builder() - .dependantChildren(YesOrNo.YES) + .dependantChildren(expected) .build(); //When HouseholdCircumstancesEntity entity = underTest.createHouseholdCircumstancesEntity(householdCircumstances); //Then - assertThat(entity.getDependantChildren()).isEqualTo(YesOrNo.YES); + assertThat(entity).isNotNull(); + assertThat(entity.getDependantChildren()).isEqualTo(expected); + } + + private static Stream dependantChildrenScenarios() { + return Stream.of( + Arguments.of(YesOrNo.YES), + Arguments.of(YesOrNo.NO), + Arguments.of((YesOrNo) null) + ); } @Test diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java index 0d33b1a9f3..0156b909ee 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/respondpossessionclaim/PaymentAgreementServiceTest.java @@ -3,11 +3,16 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; 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.MethodSource; import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.domain.respondpossessionclaim.PaymentAgreement; import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.PaymentAgreementEntity; +import java.util.stream.Stream; + import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(MockitoExtension.class) @@ -20,18 +25,28 @@ void setUp() { underTest = new PaymentAgreementService(); } - @Test - void shouldMapAnyPaymentsMadeField() { + @ParameterizedTest + @MethodSource("paymentsMadeScenarios") + void shouldMapAnyPaymentsMadeField(YesOrNo expected) { //Given PaymentAgreement paymentAgreement = PaymentAgreement.builder() - .anyPaymentsMade(YesOrNo.YES) + .anyPaymentsMade(expected) .build(); //When PaymentAgreementEntity entity = underTest.createPaymentAgreementEntity(paymentAgreement); //Then - assertThat(entity.getAnyPaymentsMade()).isEqualTo(YesOrNo.YES); + assertThat(entity).isNotNull(); + assertThat(entity.getAnyPaymentsMade()).isEqualTo(expected); + } + + private static Stream paymentsMadeScenarios() { + return Stream.of( + Arguments.of(YesOrNo.YES), + Arguments.of(YesOrNo.NO), + Arguments.of((YesOrNo) null) + ); } @Test From eb4aaa84d0521d63ff0f512b3689e9d3ec569ef1 Mon Sep 17 00:00:00 2001 From: Andrew Ajube Date: Wed, 18 Mar 2026 18:43:18 +0000 Subject: [PATCH 26/26] fix: build failure --- .../ccd/domain/respondpossessionclaim/PaymentAgreement.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java index cb54ce178b..6c0dfa9013 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/respondpossessionclaim/PaymentAgreement.java @@ -5,7 +5,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 uk.gov.hmcts.reform.pcs.ccd.domain.YesNoNotSure; import java.math.BigDecimal; @@ -34,7 +36,8 @@ public class PaymentAgreement { @CCD private YesOrNo repayArrearsInstalments; - @CCD + @CCD(typeOverride = FieldType.MoneyGBP) + @JacksonMoneyGBP private BigDecimal additionalRentContribution; @CCD