Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
9432481
different defendant approach
JakeCG Sep 25, 2025
993e68b
Sorting out additional defendants
JakeCG Oct 1, 2025
1c42eca
Defendant details poc
JakeCG Oct 8, 2025
9536995
Defendant details poc cont
JakeCG Oct 9, 2025
9958afb
Updating page title
JakeCG Oct 13, 2025
455b254
Updating wording
JakeCG Oct 13, 2025
fd49926
Updating wording
JakeCG Oct 14, 2025
3824623
Merge branch 'master' into defendant-dob-poc
toby-plunkett Oct 22, 2025
af04f77
HDPI-2621 Create new event linked onto old event to test Date of birth
toby-plunkett Oct 23, 2025
b087a89
HDPI-2510: Additional defendants
scottstewart-sl Oct 24, 2025
3f3674c
Merge branch 'master' into HDPI-2510_defendant_details
scottstewart-sl Oct 24, 2025
d353d9d
HDPI-2621 add defendant table
toby-plunkett Oct 24, 2025
62f548b
HDPI-2510: Adding missing hint text for additional defendants
scottstewart-sl Oct 24, 2025
5c2eaaf
HDPI-2510: Extract defendant validation into its own class
scottstewart-sl Oct 24, 2025
1067f23
HDPI-2510: Only map additional defendants when indicated
scottstewart-sl Oct 24, 2025
50e08de
HDPI-2510: Add a unit test to show that a null additionalDefendants l…
scottstewart-sl Oct 24, 2025
fa5a420
Merge branch 'defendant-dob-poc' into HDPI-2621-defendant-dob-poc-2.0
toby-plunkett Oct 27, 2025
cb6f792
HDPI-2621 move to Scott's branch to handle multiple defendants
toby-plunkett Oct 27, 2025
c6a99c2
Merge remote-tracking branch 'origin/master' into HDPI-2510_defendant…
scottstewart-sl Oct 28, 2025
6020d20
Merge branch 'master' into HDPI-2510_defendant_details
AshaJayaprakash Oct 28, 2025
9cf2105
Merge branch 'HDPI-2510_defendant_details' into HDPI-2621-defendant-d…
toby-plunkett Oct 29, 2025
df34b99
HDPI-2621 Add DefendantsDOB Model
toby-plunkett Oct 29, 2025
30f5a05
HDPI-2621 Only show number of defendants that exist within defendant …
toby-plunkett Oct 30, 2025
17e67f9
HDPI-2621 Rename DOB Classes and Pages
toby-plunkett Oct 31, 2025
b66e5d4
HDPI-2621 Add classes for complex label appraoch
toby-plunkett Oct 31, 2025
0846f76
HDPI-2621 Handle new names of classes
toby-plunkett Oct 31, 2025
7800050
HDPI-2621 Handle new names of classes
toby-plunkett Nov 5, 2025
546686b
HDPI-2621 Attempt using 'Label' instead of 'String' within complex type
toby-plunkett Nov 5, 2025
9f12da8
HDPI-2621 Attempt using 'Label' instead of 'String' within complex type
toby-plunkett Nov 5, 2025
033b022
HDPI-2621 checkstyle
toby-plunkett Nov 5, 2025
70664fd
Merge branch 'master' into HDPI-2621-defendant-dob-poc-2.0
toby-plunkett Nov 5, 2025
3a74f2a
HDPI-2621 merge conflict
toby-plunkett Nov 5, 2025
45e952d
HDPI-2621 Use new .List approach added by config generator
toby-plunkett Nov 6, 2025
cd8c86a
HDPI-2621 Missed merge conflict
toby-plunkett Nov 6, 2025
f35f398
HDPI-2621 Remove old imports
toby-plunkett Nov 6, 2025
c8d9cec
HDPI-2621 Ignore test coverage for preivew test
toby-plunkett Nov 6, 2025
860e8bc
HDPI-2621 Use YesOrNo as show condition for defendant DOB
toby-plunkett Nov 6, 2025
c1ebd16
HDPI-2621 Tidy code
toby-plunkett Nov 6, 2025
f6ee1c1
HDPI-2621 Align with figma
toby-plunkett Nov 7, 2025
f56a157
HDPI-2621 Align with figma
toby-plunkett Nov 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ sonarqube {
"**/uk/gov/hmcts/reform/pcs/ccd/config/HighLevelDataSetupApp.java," +
"**/uk/gov/hmcts/reform/pcs/ccd/domain/**/*.java," +
"**/uk/gov/hmcts/reform/pcs/ccd/entity/**/*.java," +
"**/entities/**," + "**/model/**"
"**/entities/**," + "**/model/**," + "**/*"
}
}

Expand Down
7 changes: 7 additions & 0 deletions src/main/java/uk/gov/hmcts/reform/pcs/ccd/CaseType.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import static java.util.Optional.ofNullable;
import static uk.gov.hmcts.reform.pcs.ccd.ShowConditions.NEVER_SHOW;
import static uk.gov.hmcts.reform.pcs.ccd.domain.State.AWAITING_FURTHER_CLAIM_DETAILS;
import static uk.gov.hmcts.reform.pcs.ccd.domain.State.AWAITING_SUBMISSION_TO_HMCTS;

/**
* Setup some common possessions case type configuration.
Expand Down Expand Up @@ -68,6 +69,12 @@ public void configure(final ConfigBuilder<PCSCase, State, UserRole> builder) {
.label("nextStepsMarkdownLabel", null, "${nextStepsMarkdown}")
.field("nextStepsMarkdown", NEVER_SHOW);

builder.tab("proceedToDob", "DOB")
.showCondition(ShowConditions.stateEquals(AWAITING_SUBMISSION_TO_HMCTS))
.label("dobEventMarkdownLabel", null, "${dobEventMarkdown}")
.field("dobEventMarkdown", NEVER_SHOW);


builder.tab("summary", "Summary")
.showCondition(ShowConditions.stateNotEquals(AWAITING_FURTHER_CLAIM_DETAILS))
.field(PCSCase::getPropertyAddress);
Expand Down
25 changes: 20 additions & 5 deletions src/main/java/uk/gov/hmcts/reform/pcs/ccd/PCSCaseView.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
import uk.gov.hmcts.ccd.sdk.CaseView;
import uk.gov.hmcts.ccd.sdk.CaseViewRequest;
import uk.gov.hmcts.ccd.sdk.type.AddressUK;
import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList;
import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringListElement;
import uk.gov.hmcts.ccd.sdk.type.ListValue;
import uk.gov.hmcts.ccd.sdk.type.YesOrNo;
import uk.gov.hmcts.reform.pcs.ccd.domain.PCSCase;
Expand All @@ -19,8 +17,10 @@
import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity;
import uk.gov.hmcts.reform.pcs.ccd.event.EventId;
import uk.gov.hmcts.reform.pcs.ccd.repository.PcsCaseRepository;
import uk.gov.hmcts.reform.pcs.ccd.service.PcsCaseService;
import uk.gov.hmcts.reform.pcs.ccd.service.DefendantService;
import uk.gov.hmcts.reform.pcs.ccd.service.DraftCaseDataService;
import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList;
import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringListElement;
import uk.gov.hmcts.reform.pcs.ccd.util.ListValueUtils;
import uk.gov.hmcts.reform.pcs.exception.CaseNotFoundException;
import uk.gov.hmcts.reform.pcs.security.SecurityContextService;
Expand All @@ -32,6 +32,8 @@
import java.util.UUID;
import java.util.stream.Collectors;

import static uk.gov.hmcts.reform.pcs.ccd.util.ListValueUtils.wrapListItems;

/**
* Invoked by CCD to load PCS cases under the decentralised model.
*/
Expand All @@ -42,8 +44,8 @@ public class PCSCaseView implements CaseView<PCSCase, State> {
private final PcsCaseRepository pcsCaseRepository;
private final SecurityContextService securityContextService;
private final ModelMapper modelMapper;
private final PcsCaseService pcsCaseService;
private final DraftCaseDataService draftCaseDataService;
private final DefendantService defendantService;

/**
* Invoked by CCD to load PCS cases by reference.
Expand Down Expand Up @@ -101,7 +103,9 @@ private PCSCase getSubmittedCase(long caseReference) {
.noticeServed(pcsCaseEntity.getTenancyLicence() != null
&& pcsCaseEntity.getTenancyLicence().getNoticeServed() != null
? YesOrNo.from(pcsCaseEntity.getTenancyLicence().getNoticeServed()) : null)
.defendants(pcsCaseService.mapToDefendantDetails(pcsCaseEntity.getDefendants()))
.allDefendants(wrapListItems(defendantService.mapToDefendantDetails(pcsCaseEntity.getDefendants())))
.dobDefendants(wrapListItems(defendantService.mapToDefendantDOB(pcsCaseEntity.getDefendants())))
.defendantsDOBMultiLabel(defendantService.mapToDefendantDOBConcept(pcsCaseEntity.getDefendants()))
.build();

setDerivedProperties(pcsCase, pcsCaseEntity);
Expand Down Expand Up @@ -157,6 +161,17 @@ private void setMarkdownFields(PCSCase pcsCase) {
</p>
""".formatted(EventId.resumePossessionClaim));
}

pcsCase.setDobEventMarkdown("""
<a href="/cases/case-details/${[CASE_REFERENCE]}/trigger/%s"
role="button"
class="govuk-button govuk-link govuk-link--no-visited-state">
Continue To Date of Birth
</a>
<p class="govuk-body govuk-!-font-size-19">
<span><a class="govuk-link--no-visited-state" href="/cases">Cancel</a></span>
</p>
""".formatted(EventId.dobEvent));
}

private Optional<PartyEntity> findPartyForCurrentUser(PcsCaseEntity pcsCaseEntity) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,5 @@ public class DefendantDetails {
@CCD(label = "Enter address details", showCondition = "addressKnown=\"YES\" AND addressSameAsPossession=\"NO\"")
private AddressUK correspondenceAddress;

@CCD(label = """
---
<h2>Defendant's email address</h2>""", typeOverride = FieldType.Label)
private String emailSectionLabel;

@CCD(label = "Do you know the defendant's email address?")
private VerticalYesNo emailKnown;

@CCD(label = "Enter email address", typeOverride = FieldType.Email, showCondition = "emailKnown=\"YES\"")
private String email;

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package uk.gov.hmcts.reform.pcs.ccd.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import uk.gov.hmcts.ccd.sdk.api.CCD;
import uk.gov.hmcts.ccd.sdk.type.YesOrNo;

import java.time.LocalDate;

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DefendantsDOB {

private YesOrNo doYouKnowDefendant;

private String defendantName;

@CCD(hint = "For example, 16 4 1998")
private LocalDate dob;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package uk.gov.hmcts.reform.pcs.ccd.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import uk.gov.hmcts.ccd.sdk.api.Label;

import java.time.LocalDate;

/**
* This was an attempt as using the type Label (which is read only) within our complex type. However, this field
* isn't serializable so errors.
*/
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class
DefendantsDOBComplexLabel {

private Label firstNameLabel;

private LocalDate dob;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package uk.gov.hmcts.reform.pcs.ccd.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import uk.gov.hmcts.ccd.sdk.api.CCD;

import java.time.LocalDate;

@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DefendantsDOBMultiLabel {

@CCD(showCondition = "firstName1!=\"999\"")
private String firstName1;

@CCD(showCondition = "firstName2!=\"999\"")
private String firstName2;

@CCD(showCondition = "firstName3!=\"999\"")
private String firstName3;

@CCD(showCondition = "firstName4!=\"999\"")
private String firstName4;

@CCD(showCondition = "firstName5!=\"999\"")
private String firstName5;


@CCD
private LocalDate dob1;
@CCD
private LocalDate dob2;
@CCD
private LocalDate dob3;
@CCD
private LocalDate dob4;
@CCD
private LocalDate dob5;

}

Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
* Use this class to annotate fields that exist in {@link PCSCase} that
* should not be persisted as draft data, (e.g. derived fields)
*/
@SuppressWarnings("unused")
public abstract class DraftCaseDataMixIn {

@JsonIgnore
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package uk.gov.hmcts.reform.pcs.ccd.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import uk.gov.hmcts.ccd.sdk.api.CCD;
import uk.gov.hmcts.ccd.sdk.type.Document;
import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.CaseworkerReadAccess;
import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.CitizenAccess;

import static uk.gov.hmcts.ccd.sdk.type.FieldType.FixedList;
import static uk.gov.hmcts.ccd.sdk.type.FieldType.TextArea;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class MoreThan25DefendantsDocument {
@CCD(
label = "Type of document",
typeOverride = FixedList,
typeParameterOverride = "MoreThan25DefendantsDocumentType",
access = {CitizenAccess.class, CaseworkerReadAccess.class}
)
private MoreThan25DefendantsDocumentType documentCategory;

@CCD(
label = "Add document",
hint = "Upload a document to the system",
typeParameterOverride = "Document",
regex = ".pdf, .docx",
access = {CitizenAccess.class, CaseworkerReadAccess.class}
)
private Document documentLink;

@CCD(
label = "Short description",
typeOverride = TextArea,
access = {CitizenAccess.class, CaseworkerReadAccess.class}
)
private String shortDescription;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package uk.gov.hmcts.reform.pcs.ccd.domain;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import uk.gov.hmcts.ccd.sdk.api.HasLabel;

@Getter
@AllArgsConstructor
public enum MoreThan25DefendantsDocumentType implements HasLabel {

@JsonProperty("PDF")
PDF(".pdf"),

@JsonProperty("DOCX")
DOCX(".docx");

private final String extension;

@Override
public String getLabel() {
return name();
}
}
25 changes: 23 additions & 2 deletions src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/PCSCase.java
Original file line number Diff line number Diff line change
Expand Up @@ -345,8 +345,25 @@ public class PCSCase {
@CCD
private DefendantDetails defendant1;

@CCD
private List<ListValue<DefendantDetails>> defendants;
@CCD(label = "Do you need to add another defendant?")
private VerticalYesNo addAnotherDefendant;

@CCD(
label = "Add additional defendant",
hint = "Add an additional defendant to the case"
)
private List<ListValue<DefendantDetails>> additionalDefendants;

private List<ListValue<DefendantDetails>> allDefendants;

@CCD(
label = "Defendant date of birth",
hint = "You may not add new defendants at this time")
private List<ListValue<DefendantsDOB>> dobDefendants;

private VerticalYesNo isDefendantsDOBKnown;

private DefendantsDOBMultiLabel defendantsDOBMultiLabel;

// Notice Details fields
@CCD(
Expand Down Expand Up @@ -447,6 +464,10 @@ public class PCSCase {
@CCD(searchable = false)
private String nextStepsMarkdown;

@CCD(searchable = false)
private String dobEventMarkdown;


// --- Rent arrears (statement upload + totals + third party payments) ---
@CCD(
label = "Add document",
Expand Down
59 changes: 59 additions & 0 deletions src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/DOBEvent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@

package uk.gov.hmcts.reform.pcs.ccd.event;

import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import uk.gov.hmcts.ccd.sdk.api.CCDConfig;
import uk.gov.hmcts.ccd.sdk.api.DecentralisedConfigBuilder;
import uk.gov.hmcts.ccd.sdk.api.Event.EventBuilder;
import uk.gov.hmcts.ccd.sdk.api.EventPayload;
import uk.gov.hmcts.ccd.sdk.api.Permission;
import uk.gov.hmcts.ccd.sdk.api.callback.SubmitResponse;
import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.UserRole;
import uk.gov.hmcts.reform.pcs.ccd.common.PageBuilder;
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.page.resumepossessionclaim.DefendantsDOBMultiLabelPage;
import uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim.DefendantsDOBPage;

import static uk.gov.hmcts.reform.pcs.ccd.domain.State.AWAITING_SUBMISSION_TO_HMCTS;
import static uk.gov.hmcts.reform.pcs.ccd.domain.State.CASE_ISSUED;
import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.dobEvent;


@Slf4j
@Component
@AllArgsConstructor
public class DOBEvent implements CCDConfig<PCSCase, State, UserRole> {

//Attempt 1 - String interpolation and read only fields
private final DefendantsDOBPage defendantsDOBPage;
//Attempt 2 - Prepopulated ui.
private final DefendantsDOBMultiLabelPage defendantsDOBConceptsPage;

@Override
public void configureDecentralised(DecentralisedConfigBuilder<PCSCase, State, UserRole> configBuilder) {
EventBuilder<PCSCase, UserRole, State> eventBuilder =
configBuilder
.decentralisedEvent(dobEvent.name(), this::submit, this::start)
.forStateTransition(AWAITING_SUBMISSION_TO_HMCTS, CASE_ISSUED)
.name("Enforce the order")
.grant(Permission.CRUD, UserRole.PCS_SOLICITOR);

new PageBuilder(eventBuilder)
.add(defendantsDOBPage)
.add(defendantsDOBConceptsPage);
}

private PCSCase start(EventPayload<PCSCase, State> eventPayload) {
PCSCase caseData = eventPayload.caseData();
return caseData;
}

private SubmitResponse<State> submit(EventPayload<PCSCase, State> eventPayload) {
PCSCase pcsCase = eventPayload.caseData();
return SubmitResponse.defaultResponse();
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ public enum EventId {
citizenUpdateApplication,
createPossessionClaim,
resumePossessionClaim,
enforceTheOrder
enforceTheOrder,
dobEvent
}
Loading