From 5aa8850cd048888d40f27a83638c9c01c9dea4fd Mon Sep 17 00:00:00 2001
From: guygrewal77
Date: Tue, 19 May 2026 14:04:58 +0100
Subject: [PATCH 1/6] HDPI-5493 - Create Document Type list dynamically to
accommodate some differences between England and Wales.
---
.../ccd/domain/AdditionalDocumentType.java | 29 +++-
.../pcs/ccd/domain/AdditionalDocuments.java | 34 +++++
.../reform/pcs/ccd/domain/DocumentType.java | 5 +-
.../hmcts/reform/pcs/ccd/domain/PCSCase.java | 8 ++
.../pcs/ccd/event/ResumePossessionClaim.java | 3 +-
.../UploadAdditionalDocumentsDetails.java | 9 +-
.../WantToUploadDocuments.java | 55 ++++++-
.../ccd/service/document/DocumentService.java | 16 ++-
.../ccd/event/ResumePossessionClaimTest.java | 7 +-
.../UploadAdditionalDocumentsDetailsTest.java | 24 ++--
.../WantToUploadDocumentsTest.java | 135 ++++++++++++++++++
.../ccd/service/DraftCaseJsonMergerTest.java | 5 +-
.../service/document/DocumentServiceTest.java | 131 ++++++++++-------
13 files changed, 380 insertions(+), 81 deletions(-)
create mode 100644 src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocuments.java
create mode 100644 src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocumentsTest.java
diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocumentType.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocumentType.java
index f267bd93a3..3c760051d4 100644
--- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocumentType.java
+++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocumentType.java
@@ -4,13 +4,14 @@
import lombok.Getter;
import uk.gov.hmcts.ccd.sdk.api.HasLabel;
+import java.util.Arrays;
+
@AllArgsConstructor
@Getter
public enum AdditionalDocumentType implements HasLabel {
WITNESS_STATEMENT("Witness statement"),
RENT_STATEMENT("Rent statement"),
- TENANCY_AGREEMENT("Tenancy agreement"),
CERTIFICATE_OF_SERVICE("Certificate of service"),
CORRESPONDENCE_FROM_DEFENDANT("Correspondence from defendant"),
CORRESPONDENCE_FROM_CLAIMANT("Correspondence from claimant"),
@@ -20,8 +21,32 @@ public enum AdditionalDocumentType implements HasLabel {
INSPECTION_OR_REPORT("Inspection or report"),
CERTIFICATE_OF_SUITABILITY_AS_LF("Certificate of suitability as litigation friend"),
LEGAL_AID_CERTIFICATE("Legal aid certificate"),
- OTHER("Other document");
+ OTHER("Other document"),
+
+ // England specific types
+ TENANCY_AGREEMENT("Tenancy agreement"),
+
+ // Wales specific types
+ OCCUPATION_LICENCE("Occupation contract or licence"),
+ ENERGY_PERFORMANCE_CERTIFICATE("Energy performance certificate"),
+ GAS_SAFETY_CERTIFICATE("Gas safety certificate"),
+ EICR_REPORT("Electrical Installation Condition Report (EICR)");
+
+ public static boolean isEnglandSpecific(AdditionalDocumentType val) {
+ return val == TENANCY_AGREEMENT;
+ }
private final String label;
+ public static AdditionalDocumentType getValueFromLabel(String label) {
+ return Arrays.stream(values()).filter(v -> v.getLabel().equals(label)).findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("No AdditionalDocumentType with label: " + label));
+ }
+
+ public static boolean isWalesSpecific(AdditionalDocumentType val) {
+ return val == OCCUPATION_LICENCE
+ || val == ENERGY_PERFORMANCE_CERTIFICATE
+ || val == GAS_SAFETY_CERTIFICATE
+ || val == EICR_REPORT;
+ }
}
diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocuments.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocuments.java
new file mode 100644
index 0000000000..bc40baef9b
--- /dev/null
+++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocuments.java
@@ -0,0 +1,34 @@
+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.ccd.sdk.type.DynamicList;
+import uk.gov.hmcts.ccd.sdk.type.FieldType;
+import uk.gov.hmcts.reform.pcs.ccd.accesscontrol.CitizenAccess;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AdditionalDocuments {
+
+ @CCD(
+ label = "Type of document",
+ access = {CitizenAccess.class}
+ )
+ private DynamicList documentTypeList;
+
+ @CCD(label = "Document", access = {CitizenAccess.class})
+ private Document document;
+
+ @CCD(label = "Short description",
+ typeOverride = FieldType.TextArea,
+ access = {CitizenAccess.class}
+ )
+ private String description;
+}
diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/DocumentType.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/DocumentType.java
index 74cf314e5b..b79dd38e56 100644
--- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/DocumentType.java
+++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/DocumentType.java
@@ -9,7 +9,10 @@
public enum DocumentType implements HasLabel {
RENT_STATEMENT("Rent statement"),
- OCCUPATION_LICENCE("Occupation licence"),
+ OCCUPATION_LICENCE("Occupation contract or licence"),
+ ENERGY_PERFORMANCE_CERTIFICATE("Energy performance certificate"),
+ GAS_SAFETY_CERTIFICATE("Gas safety certificate"),
+ EICR_REPORT("Electrical Installation Condition Report (EICR)"),
TENANCY_LICENCE("Tenancy licence"),
NOTICE_SERVED("Notice served"),
WITNESS_STATEMENT("Witness statement"),
diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/PCSCase.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/PCSCase.java
index f4c2c96528..12c52bc11e 100644
--- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/PCSCase.java
+++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/PCSCase.java
@@ -428,12 +428,19 @@ public class PCSCase {
)
private VerticalYesNo wantToUploadDocuments;
+ @Deprecated(since = "05-19-2026", forRemoval = true)
@CCD(
label = "Add document",
hint = "Upload a document to the system"
)
private List> additionalDocuments;
+ @CCD(
+ label = "Add document",
+ hint = "Upload a document to the system"
+ )
+ private List> additionalDocs;
+
@CCD(
label = "Are you planning to make an application at the same time as your claim?",
hint = "After you’ve submitted your claim, there will be instructions on how to make an application"
@@ -542,6 +549,7 @@ public class PCSCase {
private ComponentLauncher caseFileView;
@CCD(searchable = false)
+
private String formattedDefendantNames;
private String formattedPropertyAddress;
diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/ResumePossessionClaim.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/ResumePossessionClaim.java
index 4c9acd3f47..0e0744b03e 100644
--- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/ResumePossessionClaim.java
+++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/ResumePossessionClaim.java
@@ -157,6 +157,7 @@ public class ResumePossessionClaim implements CCDConfig configBuilder) {
@@ -223,7 +224,7 @@ public void configureDecentralised(DecentralisedConfigBuilderGive your document a name that explains what it is.
"""
)
-
- .mandatory(PCSCase::getAdditionalDocuments)
+ .mandatory(PCSCase::getAdditionalDocs)
.label("uploadAdditionalDocuments-saveAndReturn", CommonPageContent.SAVE_AND_RETURN);
}
@@ -55,7 +54,7 @@ private AboutToStartOrSubmitResponse midEvent(CaseDetails detailsBefore) {
PCSCase caseData = details.getData();
- List errors = validateDocumentDescription(caseData.getAdditionalDocuments(), DESCRIPTION_LABEL);
+ List errors = validateDocumentDescription(caseData.getAdditionalDocs(), DESCRIPTION_LABEL);
return AboutToStartOrSubmitResponse.builder()
.errorMessageOverride(StringUtils.joinIfNotEmpty("\n", errors))
@@ -64,7 +63,7 @@ private AboutToStartOrSubmitResponse midEvent(CaseDetails validateDocumentDescription(
- List> additionalDocs,
+ List> additionalDocs,
String sectionLabel) {
List validationErrors = new ArrayList<>();
diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocuments.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocuments.java
index c74532d46e..10a911c7c6 100644
--- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocuments.java
+++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocuments.java
@@ -1,19 +1,72 @@
package uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim;
+import org.springframework.stereotype.Component;
+import uk.gov.hmcts.ccd.sdk.api.CaseDetails;
+import uk.gov.hmcts.ccd.sdk.api.callback.AboutToStartOrSubmitResponse;
+import uk.gov.hmcts.ccd.sdk.type.DynamicList;
+import uk.gov.hmcts.ccd.sdk.type.DynamicListElement;
+import uk.gov.hmcts.ccd.sdk.type.ListValue;
import uk.gov.hmcts.reform.pcs.ccd.common.CcdPageConfiguration;
import uk.gov.hmcts.reform.pcs.ccd.common.PageBuilder;
+import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocumentType;
+import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocuments;
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.CommonPageContent;
+import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry;
+import java.util.ArrayList;
+import java.util.UUID;
+
+@Component
public class WantToUploadDocuments implements CcdPageConfiguration {
@Override
public void addTo(PageBuilder pageBuilder) {
pageBuilder
- .page("wantToUploadDocuments")
+ .page("wantToUploadDocuments", this::midEvent)
.pageLabel("Upload additional documents")
.label("wantToUploadDocuments-separator", "---")
.mandatory(PCSCase::getWantToUploadDocuments)
.label("wantToUploadDocuments-saveAndReturn", CommonPageContent.SAVE_AND_RETURN);
}
+
+ private AboutToStartOrSubmitResponse midEvent(CaseDetails details,
+ CaseDetails detailsBefore) {
+ PCSCase caseData = details.getData();
+ AdditionalDocuments additionalDocuments = new AdditionalDocuments();
+ LegislativeCountry legislativeCountry = caseData.getLegislativeCountry();
+
+ additionalDocuments.setDocumentTypeList(createAdditionalDocumentList(legislativeCountry));
+ caseData.setAdditionalDocs(new ArrayList<>());
+ caseData.getAdditionalDocs().add(ListValue.builder()
+ .value(additionalDocuments)
+ .build());
+
+ return AboutToStartOrSubmitResponse.builder()
+ .data(caseData)
+ .build();
+ }
+
+ private DynamicList createAdditionalDocumentList(LegislativeCountry legislativeCountry) {
+
+ DynamicList documentTypeList = new DynamicList(null, new ArrayList<>());
+
+ for (AdditionalDocumentType dt : AdditionalDocumentType.values()) {
+ if (canAddDocumentType(dt, legislativeCountry)) {
+ DynamicListElement element = new DynamicListElement(UUID.randomUUID(), dt.getLabel());
+ documentTypeList.getListItems().add(element);
+ }
+ }
+
+ return documentTypeList;
+ }
+
+ private boolean canAddDocumentType(AdditionalDocumentType dt, LegislativeCountry country) {
+ if (country.equals(LegislativeCountry.ENGLAND)) {
+ return AdditionalDocumentType.isEnglandSpecific(dt) || !AdditionalDocumentType.isWalesSpecific(dt);
+ } else {
+ return AdditionalDocumentType.isWalesSpecific(dt) || !AdditionalDocumentType.isEnglandSpecific(dt);
+ }
+ }
}
diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentService.java
index 0cdf399950..5bd6b20145 100644
--- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentService.java
+++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentService.java
@@ -9,8 +9,8 @@
import org.springframework.util.CollectionUtils;
import uk.gov.hmcts.ccd.sdk.type.Document;
import uk.gov.hmcts.ccd.sdk.type.ListValue;
-import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocument;
import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocumentType;
+import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocuments;
import uk.gov.hmcts.reform.pcs.ccd.domain.CaseFileCategory;
import uk.gov.hmcts.reform.pcs.ccd.domain.DocumentType;
import uk.gov.hmcts.reform.pcs.ccd.domain.NoticeServedDetails;
@@ -59,7 +59,7 @@ public List createAllDocuments(EnforcementOrder enforcementOrder
private List getPcsCaseDocuments(PCSCase pcsCase) {
List allDocuments = new ArrayList<>();
- allDocuments.addAll(mapAdditionalDocumentsWithType(pcsCase.getAdditionalDocuments()));
+ allDocuments.addAll(mapAdditionalDocumentsWithType(pcsCase.getAdditionalDocs()));
allDocuments.addAll(mapDocumentsWithType(
Optional.ofNullable(pcsCase.getRentArrears())
@@ -109,7 +109,7 @@ private List mapDocumentsWithType(
}
private List mapAdditionalDocumentsWithType(
- List> documents) {
+ List> documents) {
if (CollectionUtils.isEmpty(documents)) {
return Collections.emptyList();
@@ -118,7 +118,8 @@ private List mapAdditionalDocumentsWithType(
return ListValueUtils.unwrapListItems(documents).stream()
.map(doc -> DocumentHolder.builder()
.document(doc.getDocument())
- .type(mapAdditionalDocumentTypeToDocumentType(doc.getDocumentType()))
+ .type(mapAdditionalDocumentTypeToDocumentType(
+ AdditionalDocumentType.getValueFromLabel(doc.getDocumentTypeList().getValueLabel())))
.description(doc.getDescription())
.build())
.toList();
@@ -166,6 +167,10 @@ private DocumentType mapAdditionalDocumentTypeToDocumentType(AdditionalDocumentT
return switch (additionalType) {
case WITNESS_STATEMENT -> DocumentType.WITNESS_STATEMENT;
case RENT_STATEMENT -> DocumentType.RENT_STATEMENT;
+ case OCCUPATION_LICENCE -> DocumentType.OCCUPATION_LICENCE;
+ case ENERGY_PERFORMANCE_CERTIFICATE -> DocumentType.ENERGY_PERFORMANCE_CERTIFICATE;
+ case GAS_SAFETY_CERTIFICATE -> DocumentType.GAS_SAFETY_CERTIFICATE;
+ case EICR_REPORT -> DocumentType.EICR_REPORT;
case TENANCY_AGREEMENT -> DocumentType.TENANCY_AGREEMENT;
case CERTIFICATE_OF_SERVICE -> DocumentType.CERTIFICATE_OF_SERVICE;
case CORRESPONDENCE_FROM_DEFENDANT -> DocumentType.CORRESPONDENCE_FROM_DEFENDANT;
@@ -222,6 +227,9 @@ private Optional mapDocumentTypeToCategory(DocumentType docume
TENANCY_AGREEMENT,
TENANCY_LICENCE,
OCCUPATION_LICENCE,
+ ENERGY_PERFORMANCE_CERTIFICATE,
+ GAS_SAFETY_CERTIFICATE,
+ EICR_REPORT,
POSSESSION_NOTICE ->
Optional.of(CaseFileCategory.PROPERTY_DOCUMENTS);
case WITNESS_STATEMENT,
diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/ResumePossessionClaimTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/ResumePossessionClaimTest.java
index e4fc409ad0..d59ab3b182 100644
--- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/ResumePossessionClaimTest.java
+++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/event/ResumePossessionClaimTest.java
@@ -58,6 +58,7 @@
import uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim.UnderlesseeOrMortgageeDetailsPage;
import uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim.UploadAdditionalDocumentsDetails;
import uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim.WalesCheckingNotice;
+import uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim.WantToUploadDocuments;
import uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim.wales.ASBQuestionsWales;
import uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim.wales.GroundsForPossessionWalesPage;
import uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim.wales.OccupationLicenceDetailsWalesPage;
@@ -202,6 +203,8 @@ class ResumePossessionClaimTest extends BaseEventTest {
private RentArrears rentArrears;
@Mock
private PreActionProtocol preActionProtocol;
+ @Mock
+ private WantToUploadDocuments wantToUploadDocuments;
@BeforeEach
void setUp() {
@@ -226,8 +229,8 @@ void setUp() {
groundsForPossessionWales, secureContractGroundsForPossessionWales, reasonsForPossessionWales,
addressFormatter, rentArrearsGroundsForPossessionPage, rentArrearsGroundForPossessionAdditionalGrounds,
noRentArrearsGroundsForPossessionOptions, checkingNotice, walesCheckingNotice, asbQuestionsWales,
- underlesseeOrMortgageePage, feeService, feeFormatter, rentDetailsPage, rentArrears, preActionProtocol
- );
+ underlesseeOrMortgageePage, feeService, feeFormatter, rentDetailsPage, rentArrears, preActionProtocol,
+ wantToUploadDocuments);
setEventUnderTest(underTest);
}
diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/UploadAdditionalDocumentsDetailsTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/UploadAdditionalDocumentsDetailsTest.java
index 68fa58ecd1..413d6f600a 100644
--- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/UploadAdditionalDocumentsDetailsTest.java
+++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/UploadAdditionalDocumentsDetailsTest.java
@@ -1,12 +1,12 @@
package uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim;
-import org.junit.Test;
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.api.callback.AboutToStartOrSubmitResponse;
import uk.gov.hmcts.ccd.sdk.type.ListValue;
-import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocument;
+import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocuments;
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.BasePageTest;
@@ -29,13 +29,13 @@ void setUp() {
@Test
void shouldNotReturnErrorsWhenDescriptionIsCorrectLength() {
// Given
- AdditionalDocument doc = AdditionalDocument.builder()
- .description("Valid description")
- .build();
+ AdditionalDocuments doc = AdditionalDocuments.builder()
+ .description("Valid description")
+ .build();
PCSCase caseData = PCSCase.builder()
- .additionalDocuments(List.of(ListValue.builder().value(doc).build()))
- .build();
+ .additionalDocs(List.of(ListValue.builder().value(doc).build()))
+ .build();
// When
AboutToStartOrSubmitResponse response = callMidEventHandler(caseData);
@@ -49,13 +49,13 @@ void shouldNotReturnErrorsWhenDescriptionIsCorrectLength() {
void shouldReturnValidationErrorsWhenDescriptionTooLong() {
// Given
String longDescription = "a".repeat(61);
- AdditionalDocument doc = AdditionalDocument.builder()
- .description(longDescription)
- .build();
+ AdditionalDocuments doc = AdditionalDocuments.builder()
+ .description(longDescription)
+ .build();
PCSCase caseData = PCSCase.builder()
- .additionalDocuments(List.of(ListValue.builder().value(doc).build()))
- .build();
+ .additionalDocs(List.of(ListValue.builder().value(doc).build()))
+ .build();
// When
AboutToStartOrSubmitResponse response = callMidEventHandler(caseData);
diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocumentsTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocumentsTest.java
new file mode 100644
index 0000000000..94d4fc9cc8
--- /dev/null
+++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocumentsTest.java
@@ -0,0 +1,135 @@
+package uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim;
+
+import org.junit.jupiter.api.BeforeEach;
+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.api.callback.AboutToStartOrSubmitResponse;
+import uk.gov.hmcts.ccd.sdk.type.DynamicList;
+import uk.gov.hmcts.ccd.sdk.type.DynamicListElement;
+import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocumentType;
+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.BasePageTest;
+import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.params.provider.Arguments.arguments;
+
+@ExtendWith(MockitoExtension.class)
+class WantToUploadDocumentsTest extends BasePageTest {
+
+ @BeforeEach
+ void setUp() {
+ setPageUnderTest(new WantToUploadDocuments());
+ }
+
+ @ParameterizedTest(name = "England: {0} should {1}")
+ @MethodSource("englandDocumentScenarios")
+ void shouldFilterDocumentsForEngland(AdditionalDocumentType docType, String expectation, boolean shouldInclude) {
+ // Given
+ PCSCase caseData = PCSCase.builder()
+ .legislativeCountry(LegislativeCountry.ENGLAND)
+ .build();
+
+ // When
+ AboutToStartOrSubmitResponse response = callMidEventHandler(caseData);
+
+ // Then
+ DynamicList documentTypeList =
+ response.getData().getAdditionalDocs().getFirst().getValue().getDocumentTypeList();
+ List labels = extractLabels(documentTypeList);
+
+ if (shouldInclude) {
+ assertThat(labels).contains(docType.getLabel());
+ } else {
+ assertThat(labels).doesNotContain(docType.getLabel());
+ }
+
+ assertThat(documentTypeList.getListItems()).hasSize(13);
+ }
+
+ @ParameterizedTest(name = "Wales: {0} should {1}")
+ @MethodSource("walesDocumentScenarios")
+ void shouldFilterDocumentsForWales(AdditionalDocumentType docType, String expectation, boolean shouldInclude) {
+ // Given
+ PCSCase caseData = PCSCase.builder()
+ .legislativeCountry(LegislativeCountry.WALES)
+ .build();
+
+ // When
+ AboutToStartOrSubmitResponse response = callMidEventHandler(caseData);
+
+ // Then
+ DynamicList documentTypeList =
+ response.getData().getAdditionalDocs().getFirst().getValue().getDocumentTypeList();
+ List labels = extractLabels(documentTypeList);
+
+ if (shouldInclude) {
+ assertThat(labels).contains(docType.getLabel());
+ } else {
+ assertThat(labels).doesNotContain(docType.getLabel());
+ }
+
+ assertThat(documentTypeList.getListItems()).hasSize(16);
+ }
+
+ private static Stream englandDocumentScenarios() {
+ return Stream.of(
+ // England-specific documents
+ arguments(AdditionalDocumentType.TENANCY_AGREEMENT, "be included", true),
+
+ // Wales-only documents should be excluded
+ arguments(AdditionalDocumentType.OCCUPATION_LICENCE, "be excluded", false),
+ arguments(AdditionalDocumentType.ENERGY_PERFORMANCE_CERTIFICATE, "be excluded", false),
+ arguments(AdditionalDocumentType.GAS_SAFETY_CERTIFICATE, "be excluded", false),
+ arguments(AdditionalDocumentType.EICR_REPORT, "be excluded", false),
+
+ // Common documents
+ arguments(AdditionalDocumentType.WITNESS_STATEMENT, "be included", true),
+ arguments(AdditionalDocumentType.RENT_STATEMENT, "be included", true),
+ arguments(AdditionalDocumentType.CERTIFICATE_OF_SERVICE, "be included", true),
+ arguments(AdditionalDocumentType.CORRESPONDENCE_FROM_DEFENDANT, "be included", true),
+ arguments(AdditionalDocumentType.CORRESPONDENCE_FROM_CLAIMANT, "be included", true),
+ arguments(AdditionalDocumentType.POSSESSION_NOTICE, "be included", true),
+ arguments(AdditionalDocumentType.LEGAL_AID_CERTIFICATE, "be included", true),
+ arguments(AdditionalDocumentType.OTHER, "be included", true)
+ );
+ }
+
+ private static Stream walesDocumentScenarios() {
+ return Stream.of(
+ // Wales-specific documents
+ arguments(AdditionalDocumentType.OCCUPATION_LICENCE, "be included", true),
+ arguments(AdditionalDocumentType.ENERGY_PERFORMANCE_CERTIFICATE, "be included", true),
+ arguments(AdditionalDocumentType.GAS_SAFETY_CERTIFICATE, "be included", true),
+ arguments(AdditionalDocumentType.EICR_REPORT, "be included", true),
+
+ // England-only documents should be excluded
+ arguments(AdditionalDocumentType.TENANCY_AGREEMENT, "be excluded", false),
+
+ // Common documents
+ arguments(AdditionalDocumentType.WITNESS_STATEMENT, "be included", true),
+ arguments(AdditionalDocumentType.RENT_STATEMENT, "be included", true),
+ arguments(AdditionalDocumentType.CERTIFICATE_OF_SERVICE, "be included", true),
+ arguments(AdditionalDocumentType.CORRESPONDENCE_FROM_DEFENDANT, "be included", true),
+ arguments(AdditionalDocumentType.CORRESPONDENCE_FROM_CLAIMANT, "be included", true),
+ arguments(AdditionalDocumentType.POSSESSION_NOTICE, "be included", true),
+ arguments(AdditionalDocumentType.LEGAL_AID_CERTIFICATE, "be included", true),
+ arguments(AdditionalDocumentType.OTHER, "be included", true)
+ );
+ }
+
+ // Helper method to extract labels from DynamicList
+ private List extractLabels(DynamicList documentTypeList) {
+ return documentTypeList.getListItems().stream()
+ .map(DynamicListElement::getLabel)
+ .collect(Collectors.toList());
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java
index 884a498aeb..8618c1c2cd 100644
--- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java
+++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java
@@ -76,6 +76,7 @@ void shouldKeepExistingFieldsWhenMerging() throws JsonProcessingException {
"noRentArrearsReasonForGrounds.holidayLet",
"waysToPay",
"caseLinks",
+ "additionalDocs",
"claimGroundSummaries",
"enforcementOrder.showChangeNameAddressPage",
"enforcementOrder.showPeopleWhoWillBeEvictedPage",
@@ -143,7 +144,7 @@ void shouldClearAddressFieldsWhenPatchContainsAddress() throws Exception {
}
}
}
- """;
+ """;
String patchJson = """
{
@@ -184,7 +185,7 @@ void shouldNotClearAddressIfPatchDoesNotContainAddress() throws Exception {
}
}
}
- """;
+ """;
String patchJson = """
{
diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java
index e653f04ca6..85324aa90f 100644
--- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java
+++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java
@@ -12,9 +12,11 @@
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import uk.gov.hmcts.ccd.sdk.type.Document;
+import uk.gov.hmcts.ccd.sdk.type.DynamicList;
+import uk.gov.hmcts.ccd.sdk.type.DynamicListElement;
import uk.gov.hmcts.ccd.sdk.type.ListValue;
-import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocument;
import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocumentType;
+import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocuments;
import uk.gov.hmcts.reform.pcs.ccd.domain.CaseFileCategory;
import uk.gov.hmcts.reform.pcs.ccd.domain.DocumentType;
import uk.gov.hmcts.reform.pcs.ccd.domain.NoticeServedDetails;
@@ -32,7 +34,6 @@
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.DocumentRepository;
-import uk.gov.hmcts.reform.pcs.ccd.service.document.DocumentService;
import java.util.ArrayList;
import java.util.Collections;
@@ -68,34 +69,44 @@ void shouldSaveTwoAdditionalDocumentTypes() {
// Given
PCSCase pcsCase = mock(PCSCase.class);
- AdditionalDocument additionalDocument1 = AdditionalDocument.builder()
- .document(Document.builder()
- .url("url-WITNESS_STATEMENT")
- .filename("file-WITNESS_STATEMENT")
- .binaryUrl("bin-WITNESS_STATEMENT")
- .categoryId("cat-WITNESS_STATEMENT")
- .build())
- .documentType(AdditionalDocumentType.WITNESS_STATEMENT)
- .build();
+ DynamicList documentTypeList1 = new DynamicList(
+ new DynamicListElement(UUID.randomUUID(), "Witness statement"),
+ new ArrayList<>()
+ );
- AdditionalDocument additionalDocument2 = AdditionalDocument.builder()
- .document(Document.builder()
- .url("url-RENT_STATEMENT")
- .filename("file-RENT_STATEMENT")
- .binaryUrl("bin-RENT_STATEMENT")
- .categoryId("cat-RENT_STATEMENT")
- .build())
- .documentType(AdditionalDocumentType.RENT_STATEMENT)
- .build();
+ AdditionalDocuments additionalDocument1 = AdditionalDocuments.builder()
+ .document(Document.builder()
+ .url("url-WITNESS_STATEMENT")
+ .filename("file-WITNESS_STATEMENT")
+ .binaryUrl("bin-WITNESS_STATEMENT")
+ .categoryId("cat-WITNESS_STATEMENT")
+ .build())
+ .documentTypeList(documentTypeList1)
+ .build();
- ListValue lv1 = ListValue.builder()
- .id("1").value(additionalDocument1).build();
- ListValue lv2 = ListValue.builder()
- .id("2").value(additionalDocument2).build();
+ DynamicList documentTypeList2 = new DynamicList(
+ new DynamicListElement(UUID.randomUUID(), "Rent statement"),
+ new ArrayList<>()
+ );
- List> additionalDocuments = List.of(lv1, lv2);
+ AdditionalDocuments additionalDocument2 = AdditionalDocuments.builder()
+ .document(Document.builder()
+ .url("url-RENT_STATEMENT")
+ .filename("file-RENT_STATEMENT")
+ .binaryUrl("bin-RENT_STATEMENT")
+ .categoryId("cat-RENT_STATEMENT")
+ .build())
+ .documentTypeList(documentTypeList2)
+ .build();
- when(pcsCase.getAdditionalDocuments()).thenReturn(additionalDocuments);
+ ListValue lv1 = ListValue.builder()
+ .id("1").value(additionalDocument1).build();
+ ListValue lv2 = ListValue.builder()
+ .id("2").value(additionalDocument2).build();
+
+ List> additionalDocuments = List.of(lv1, lv2);
+
+ when(pcsCase.getAdditionalDocs()).thenReturn(additionalDocuments);
// When
underTest.createAllDocuments(pcsCase);
@@ -121,16 +132,19 @@ void shouldMapAllAdditionalDocumentTypes(AdditionalDocumentType additionalDocume
// Given
PCSCase pcsCase = mock(PCSCase.class);
- AdditionalDocument additionalDocument1 = AdditionalDocument.builder()
- .document(Document.builder().build())
- .documentType(additionalDocumentType)
- .build();
-
- List> additionalDocuments = List.of(
- ListValue.builder().value(additionalDocument1).build()
+ DynamicList documentTypeList = new DynamicList(
+ new DynamicListElement(UUID.randomUUID(), additionalDocumentType.getLabel()),
+ new ArrayList<>()
);
- when(pcsCase.getAdditionalDocuments()).thenReturn(additionalDocuments);
+ AdditionalDocuments additionalDocument = AdditionalDocuments.builder()
+ .document(Document.builder().categoryId("uploaded-category").build())
+ .documentTypeList(documentTypeList)
+ .build();
+
+ when(pcsCase.getAdditionalDocs()).thenReturn(List.of(
+ ListValue.builder().value(additionalDocument).build()
+ ));
// When
underTest.createAllDocuments(pcsCase);
@@ -153,13 +167,18 @@ void shouldMapAdditionalDocumentsToCaseFileCategories(AdditionalDocumentType add
// Given
PCSCase pcsCase = mock(PCSCase.class);
- AdditionalDocument additionalDocument = AdditionalDocument.builder()
- .document(Document.builder().categoryId("uploaded-category").build())
- .documentType(additionalDocumentType)
- .build();
+ DynamicList documentTypeList = new DynamicList(
+ new DynamicListElement(UUID.randomUUID(), additionalDocumentType.getLabel()),
+ new ArrayList<>()
+ );
+
+ AdditionalDocuments additionalDocument = AdditionalDocuments.builder()
+ .document(Document.builder().categoryId("uploaded-category").build())
+ .documentTypeList(documentTypeList)
+ .build();
- when(pcsCase.getAdditionalDocuments()).thenReturn(List.of(
- ListValue.builder().value(additionalDocument).build()
+ when(pcsCase.getAdditionalDocs()).thenReturn(List.of(
+ ListValue.builder().value(additionalDocument).build()
));
// When
@@ -399,20 +418,25 @@ void shouldSaveDescriptionForAdditionalDocuments() {
// Given
PCSCase pcsCase = mock(PCSCase.class);
- AdditionalDocumentType additionalDocumentType = AdditionalDocumentType.WITNESS_STATEMENT;
+ AdditionalDocumentType additionalDocumentType = AdditionalDocumentType.WITNESS_STATEMENT;
String description = "A short description";
- AdditionalDocument additionalDocument1 = AdditionalDocument.builder()
+ DynamicList documentTypeList = new DynamicList(
+ new DynamicListElement(UUID.randomUUID(), additionalDocumentType.getLabel()),
+ new ArrayList<>()
+ );
+
+ AdditionalDocuments additionalDocument = AdditionalDocuments.builder()
.document(Document.builder().build())
- .documentType(additionalDocumentType)
+ .documentTypeList(documentTypeList)
.description(description)
.build();
- List> additionalDocuments = List.of(
- ListValue.builder().value(additionalDocument1).build()
+ List> additionalDocuments = List.of(
+ ListValue.builder().value(additionalDocument).build()
);
- when(pcsCase.getAdditionalDocuments()).thenReturn(additionalDocuments);
+ when(pcsCase.getAdditionalDocs()).thenReturn(additionalDocuments);
// When
underTest.createAllDocuments(pcsCase);
@@ -437,22 +461,27 @@ void shouldConvertEmptyDescriptionToNull() {
// Given
PCSCase pcsCase = mock(PCSCase.class);
- AdditionalDocument additionalDocument = AdditionalDocument.builder()
+ DynamicList documentTypeList = new DynamicList(
+ new DynamicListElement(UUID.randomUUID(), "Witness statement"),
+ new ArrayList<>()
+ );
+
+ AdditionalDocuments additionalDocument = AdditionalDocuments.builder()
.document(Document.builder()
.url("url1")
.filename("file1")
.binaryUrl("bin1")
.categoryId("cat1")
.build())
- .documentType(AdditionalDocumentType.WITNESS_STATEMENT)
+ .documentTypeList(documentTypeList)
.description("")
.build();
- List> additionalDocuments = List.of(
- ListValue.builder().value(additionalDocument).build()
+ List> additionalDocuments = List.of(
+ ListValue.builder().value(additionalDocument).build()
);
- when(pcsCase.getAdditionalDocuments()).thenReturn(additionalDocuments);
+ when(pcsCase.getAdditionalDocs()).thenReturn(additionalDocuments);
// When
underTest.createAllDocuments(pcsCase);
From 276026d2b4efde66d8e595757e3666ca8e4d02e3 Mon Sep 17 00:00:00 2001
From: guygrewal77
Date: Wed, 20 May 2026 09:02:04 +0100
Subject: [PATCH 2/6] HDPI-5493 - Keep same ordering of Document types as
before
---
.../ccd/domain/AdditionalDocumentType.java | 29 ++++++++++---------
1 file changed, 15 insertions(+), 14 deletions(-)
diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocumentType.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocumentType.java
index 3c760051d4..308c1fced9 100644
--- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocumentType.java
+++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/AdditionalDocumentType.java
@@ -12,16 +12,6 @@ public enum AdditionalDocumentType implements HasLabel {
WITNESS_STATEMENT("Witness statement"),
RENT_STATEMENT("Rent statement"),
- CERTIFICATE_OF_SERVICE("Certificate of service"),
- CORRESPONDENCE_FROM_DEFENDANT("Correspondence from defendant"),
- CORRESPONDENCE_FROM_CLAIMANT("Correspondence from claimant"),
- POSSESSION_NOTICE("Possession notice"),
- NOTICE_FOR_SERVICE_OUT_OF_JURISDICTION("Notice for service out of the jurisdiction"),
- PHOTOGRAPHIC_EVIDENCE("Photographic evidence"),
- INSPECTION_OR_REPORT("Inspection or report"),
- CERTIFICATE_OF_SUITABILITY_AS_LF("Certificate of suitability as litigation friend"),
- LEGAL_AID_CERTIFICATE("Legal aid certificate"),
- OTHER("Other document"),
// England specific types
TENANCY_AGREEMENT("Tenancy agreement"),
@@ -30,11 +20,18 @@ public enum AdditionalDocumentType implements HasLabel {
OCCUPATION_LICENCE("Occupation contract or licence"),
ENERGY_PERFORMANCE_CERTIFICATE("Energy performance certificate"),
GAS_SAFETY_CERTIFICATE("Gas safety certificate"),
- EICR_REPORT("Electrical Installation Condition Report (EICR)");
+ EICR_REPORT("Electrical Installation Condition Report (EICR)"),
- public static boolean isEnglandSpecific(AdditionalDocumentType val) {
- return val == TENANCY_AGREEMENT;
- }
+ CERTIFICATE_OF_SERVICE("Certificate of service"),
+ CORRESPONDENCE_FROM_DEFENDANT("Correspondence from defendant"),
+ CORRESPONDENCE_FROM_CLAIMANT("Correspondence from claimant"),
+ POSSESSION_NOTICE("Possession notice"),
+ NOTICE_FOR_SERVICE_OUT_OF_JURISDICTION("Notice for service out of the jurisdiction"),
+ PHOTOGRAPHIC_EVIDENCE("Photographic evidence"),
+ INSPECTION_OR_REPORT("Inspection or report"),
+ CERTIFICATE_OF_SUITABILITY_AS_LF("Certificate of suitability as litigation friend"),
+ LEGAL_AID_CERTIFICATE("Legal aid certificate"),
+ OTHER("Other document");
private final String label;
@@ -43,6 +40,10 @@ public static AdditionalDocumentType getValueFromLabel(String label) {
.orElseThrow(() -> new IllegalArgumentException("No AdditionalDocumentType with label: " + label));
}
+ public static boolean isEnglandSpecific(AdditionalDocumentType val) {
+ return val == TENANCY_AGREEMENT;
+ }
+
public static boolean isWalesSpecific(AdditionalDocumentType val) {
return val == OCCUPATION_LICENCE
|| val == ENERGY_PERFORMANCE_CERTIFICATE
From f5226ec55e8f0f0cc9fa9439f167dafaa6df1d97 Mon Sep 17 00:00:00 2001
From: guygrewal77
Date: Wed, 20 May 2026 11:13:12 +0100
Subject: [PATCH 3/6] HDPI-5493 - Change not needed
---
.../hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java
index 560805db87..479736bced 100644
--- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java
+++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/DraftCaseJsonMergerTest.java
@@ -77,7 +77,6 @@ void shouldKeepExistingFieldsWhenMerging() throws JsonProcessingException {
"rentArrearsGroundsReasons.otherGround",
"waysToPay",
"caseLinks",
- "additionalDocs",
"claimGroundSummaries",
"enforcementOrder.showChangeNameAddressPage",
"enforcementOrder.showPeopleWhoWillBeEvictedPage",
From 7c597f44a19bd2331216db22f7f7d4a89c8e6cb7 Mon Sep 17 00:00:00 2001
From: guygrewal77
Date: Thu, 21 May 2026 15:19:48 +0100
Subject: [PATCH 4/6] HDPI-5493 - Filename to include Claimant 1 plus other
minor changes
---
.../ccd/service/document/DocumentService.java | 19 +++++++--
.../service/document/DocumentServiceTest.java | 42 +++++++++++++------
2 files changed, 45 insertions(+), 16 deletions(-)
diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentService.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentService.java
index 5bd6b20145..f90b7c6f20 100644
--- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentService.java
+++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentService.java
@@ -42,6 +42,8 @@ public class DocumentService {
private final DocumentRepository documentRepository;
+ private static final String CLAIMANT_1 = "Claimant 1";
+
public List createAllDocuments(PCSCase pcsCase) {
List allDocuments = getPcsCaseDocuments(pcsCase);
@@ -69,7 +71,7 @@ private List getPcsCaseDocuments(PCSCase pcsCase) {
allDocuments.addAll(mapDocumentsWithType(
Optional.ofNullable(pcsCase.getTenancyLicenceDetails())
.map(TenancyLicenceDetails::getTenancyLicenceDocuments)
- .orElse(null), DocumentType.TENANCY_LICENCE));
+ .orElse(null), DocumentType.TENANCY_AGREEMENT));
allDocuments.addAll(mapDocumentsWithType(
Optional.ofNullable(pcsCase.getOccupationLicenceDetailsWales())
@@ -79,7 +81,7 @@ private List getPcsCaseDocuments(PCSCase pcsCase) {
allDocuments.addAll(mapDocumentsWithType(
Optional.ofNullable(pcsCase.getNoticeServedDetails())
.map(NoticeServedDetails::getNoticeDocuments)
- .orElse(null), DocumentType.NOTICE_FOR_SERVICE_OUT_OF_JURISDICTION));
+ .orElse(null), DocumentType.POSSESSION_NOTICE));
return allDocuments;
}
@@ -151,7 +153,7 @@ private List createDocumentEntities(
return documents.stream()
.map(holder -> DocumentEntity.builder()
.url(holder.getDocument().getUrl())
- .fileName(holder.getDocument().getFilename())
+ .fileName(getFilename(holder.getDocument().getFilename()))
.displayFileName(holder.getDocument().getFilename())
.binaryUrl(holder.getDocument().getBinaryUrl())
.categoryId(mapDocumentTypeToCategory(holder.getType())
@@ -163,6 +165,17 @@ private List createDocumentEntities(
.toList();
}
+ private String getFilename(String uploadedFilename) {
+ String fileExtension = "";
+ String fileName = uploadedFilename;
+ int lastDot = uploadedFilename.lastIndexOf('.');
+ if (lastDot >= 0 && lastDot < uploadedFilename.length() - 1) {
+ fileExtension = uploadedFilename.substring(lastDot + 1);
+ fileName = uploadedFilename.substring(0, lastDot);
+ }
+ return fileName + " - " + CLAIMANT_1 + fileExtension;
+ }
+
private DocumentType mapAdditionalDocumentTypeToDocumentType(AdditionalDocumentType additionalType) {
return switch (additionalType) {
case WITNESS_STATEMENT -> DocumentType.WITNESS_STATEMENT;
diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java
index 85324aa90f..09485bda9b 100644
--- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java
+++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java
@@ -35,6 +35,7 @@
import uk.gov.hmcts.reform.pcs.ccd.entity.respondpossessionclaim.DefendantResponseEntity;
import uk.gov.hmcts.reform.pcs.ccd.repository.DocumentRepository;
+import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -119,7 +120,7 @@ void shouldSaveTwoAdditionalDocumentTypes() {
assertThat(capturedEntities)
.extracting(DocumentEntity::getFileName)
- .containsExactlyInAnyOrder("file-WITNESS_STATEMENT", "file-RENT_STATEMENT");
+ .containsExactlyInAnyOrder("file-WITNESS_STATEMENT - Claimant 1", "file-RENT_STATEMENT - Claimant 1");
assertThat(capturedEntities)
.extracting(DocumentEntity::getType)
@@ -138,7 +139,12 @@ void shouldMapAllAdditionalDocumentTypes(AdditionalDocumentType additionalDocume
);
AdditionalDocuments additionalDocument = AdditionalDocuments.builder()
- .document(Document.builder().categoryId("uploaded-category").build())
+ .document(Document.builder()
+ .filename("userEnteredDetails.pdf")
+ .uploadTimestamp(LocalDateTime.now())
+ .url("someUrl")
+ .binaryUrl("someUrl")
+ .categoryId("uploaded-category").build())
.documentTypeList(documentTypeList)
.build();
@@ -173,7 +179,9 @@ void shouldMapAdditionalDocumentsToCaseFileCategories(AdditionalDocumentType add
);
AdditionalDocuments additionalDocument = AdditionalDocuments.builder()
- .document(Document.builder().categoryId("uploaded-category").build())
+ .document(Document.builder()
+ .filename("filename.txt")
+ .categoryId("uploaded-category").build())
.documentTypeList(documentTypeList)
.build();
@@ -219,7 +227,7 @@ void shouldSaveRentStatementDocuments() {
assertThat(entities).hasSize(1);
DocumentEntity entity = entities.getFirst();
assertThat(entity.getType()).isEqualTo(DocumentType.RENT_STATEMENT);
- assertThat(entity.getFileName()).isEqualTo("file1");
+ assertThat(entity.getFileName()).isEqualTo("file1 - Claimant 1");
assertThat(entity.getCategoryId()).isEqualTo(CaseFileCategory.PROPERTY_DOCUMENTS.getId());
}
@@ -249,7 +257,7 @@ void shouldSaveTenancyLicenceDocuments() {
assertThat(entities).hasSize(1);
DocumentEntity entity = entities.getFirst();
assertThat(entity.getType()).isEqualTo(DocumentType.TENANCY_LICENCE);
- assertThat(entity.getFileName()).isEqualTo("file2");
+ assertThat(entity.getFileName()).isEqualTo("file2 - Claimant 1");
assertThat(entity.getCategoryId()).isEqualTo(CaseFileCategory.PROPERTY_DOCUMENTS.getId());
}
@@ -280,7 +288,7 @@ void shouldSaveOccupationLicenceDocuments() {
assertThat(entities).hasSize(1);
DocumentEntity entity = entities.getFirst();
assertThat(entity.getType()).isEqualTo(DocumentType.OCCUPATION_LICENCE);
- assertThat(entity.getFileName()).isEqualTo("file3");
+ assertThat(entity.getFileName()).isEqualTo("file3 - Claimant 1");
assertThat(entity.getCategoryId()).isEqualTo(CaseFileCategory.PROPERTY_DOCUMENTS.getId());
}
@@ -310,9 +318,9 @@ void shouldSaveNoticeServedDocuments() {
List entities = documentEntityListCaptor.getValue();
assertThat(entities).hasSize(1);
DocumentEntity entity = entities.getFirst();
- assertThat(entity.getType()).isEqualTo(DocumentType.NOTICE_FOR_SERVICE_OUT_OF_JURISDICTION);
- assertThat(entity.getFileName()).isEqualTo("file4");
- assertThat(entity.getCategoryId()).isEqualTo(CaseFileCategory.STATEMENTS_OF_CASE.getId());
+ assertThat(entity.getType()).isEqualTo(DocumentType.POSSESSION_NOTICE);
+ assertThat(entity.getFileName()).isEqualTo("file4 - Claimant 1");
+ assertThat(entity.getCategoryId()).isEqualTo(CaseFileCategory.PROPERTY_DOCUMENTS.getId());
}
@Test
@@ -427,7 +435,13 @@ void shouldSaveDescriptionForAdditionalDocuments() {
);
AdditionalDocuments additionalDocument = AdditionalDocuments.builder()
- .document(Document.builder().build())
+ .document(Document.builder()
+ .filename("witness1.pdf")
+ .binaryUrl("someUrl")
+ .url("someUrl")
+ .categoryId("cat1")
+ .uploadTimestamp(LocalDateTime.now())
+ .build())
.documentTypeList(documentTypeList)
.description(description)
.build();
@@ -524,7 +538,7 @@ void shouldFilterOutNullValuesFromListValueDocuments() {
verify(documentRepository).saveAll(documentEntityListCaptor.capture());
List entities = documentEntityListCaptor.getValue();
assertThat(entities).hasSize(1);
- assertThat(entities.getFirst().getFileName()).isEqualTo("file1");
+ assertThat(entities.getFirst().getFileName()).isEqualTo("file1 - Claimant 1");
}
@Test
@@ -562,12 +576,13 @@ void shouldSaveMultipleDocumentTypesInSingleCall() {
.containsExactlyInAnyOrder(
DocumentType.RENT_STATEMENT,
DocumentType.TENANCY_LICENCE,
- DocumentType.NOTICE_FOR_SERVICE_OUT_OF_JURISDICTION
+ DocumentType.POSSESSION_NOTICE
);
assertThat(entities)
.extracting(DocumentEntity::getFileName)
- .containsExactlyInAnyOrder("file-rent", "file-tenancy", "file-notice");
+ .containsExactlyInAnyOrder("file-rent - Claimant 1", "file-tenancy - Claimant 1",
+ "file-notice - Claimant 1");
}
@Test
@@ -576,6 +591,7 @@ void shouldAllowNullDescriptionForDocumentsOtherThanAdditionalDocuments() {
PCSCase pcsCase = mock(PCSCase.class);
Document doc = Document.builder()
+ .filename("filename.txt")
.build();
NoticeServedDetails noticeServedDetails = NoticeServedDetails.builder()
From ad44ece14502eb1e4677789fd150253110bda30c Mon Sep 17 00:00:00 2001
From: guygrewal77
Date: Thu, 21 May 2026 15:29:27 +0100
Subject: [PATCH 5/6] HDPI-5493 - Unit test updated
---
.../reform/pcs/ccd/service/document/DocumentServiceTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java
index 09485bda9b..ad680047cc 100644
--- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java
+++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/service/document/DocumentServiceTest.java
@@ -256,7 +256,7 @@ void shouldSaveTenancyLicenceDocuments() {
List entities = documentEntityListCaptor.getValue();
assertThat(entities).hasSize(1);
DocumentEntity entity = entities.getFirst();
- assertThat(entity.getType()).isEqualTo(DocumentType.TENANCY_LICENCE);
+ assertThat(entity.getType()).isEqualTo(DocumentType.TENANCY_AGREEMENT);
assertThat(entity.getFileName()).isEqualTo("file2 - Claimant 1");
assertThat(entity.getCategoryId()).isEqualTo(CaseFileCategory.PROPERTY_DOCUMENTS.getId());
}
@@ -575,7 +575,7 @@ void shouldSaveMultipleDocumentTypesInSingleCall() {
.extracting(DocumentEntity::getType)
.containsExactlyInAnyOrder(
DocumentType.RENT_STATEMENT,
- DocumentType.TENANCY_LICENCE,
+ DocumentType.TENANCY_AGREEMENT,
DocumentType.POSSESSION_NOTICE
);
From 411c3913873acd6e3a20e96a1eb9cad45698101e Mon Sep 17 00:00:00 2001
From: guygrewal77
Date: Thu, 21 May 2026 16:32:15 +0100
Subject: [PATCH 6/6] HDPI-5493 - Only set AdditionalDocuments if user selects
Yes.
---
.../WantToUploadDocuments.java | 18 +++++++++++-------
.../WantToUploadDocumentsTest.java | 19 +++++++++++++++++++
2 files changed, 30 insertions(+), 7 deletions(-)
diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocuments.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocuments.java
index 10a911c7c6..246f2bf9cc 100644
--- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocuments.java
+++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocuments.java
@@ -12,6 +12,7 @@
import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocuments;
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.VerticalYesNo;
import uk.gov.hmcts.reform.pcs.ccd.page.CommonPageContent;
import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry;
@@ -34,14 +35,17 @@ public void addTo(PageBuilder pageBuilder) {
private AboutToStartOrSubmitResponse midEvent(CaseDetails details,
CaseDetails detailsBefore) {
PCSCase caseData = details.getData();
- AdditionalDocuments additionalDocuments = new AdditionalDocuments();
- LegislativeCountry legislativeCountry = caseData.getLegislativeCountry();
- additionalDocuments.setDocumentTypeList(createAdditionalDocumentList(legislativeCountry));
- caseData.setAdditionalDocs(new ArrayList<>());
- caseData.getAdditionalDocs().add(ListValue.builder()
- .value(additionalDocuments)
- .build());
+ if (caseData.getWantToUploadDocuments().equals(VerticalYesNo.YES)) {
+ AdditionalDocuments additionalDocuments = new AdditionalDocuments();
+ LegislativeCountry legislativeCountry = caseData.getLegislativeCountry();
+
+ additionalDocuments.setDocumentTypeList(createAdditionalDocumentList(legislativeCountry));
+ caseData.setAdditionalDocs(new ArrayList<>());
+ caseData.getAdditionalDocs().add(ListValue.builder()
+ .value(additionalDocuments)
+ .build());
+ }
return AboutToStartOrSubmitResponse.builder()
.data(caseData)
diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocumentsTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocumentsTest.java
index 94d4fc9cc8..800fe3a988 100644
--- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocumentsTest.java
+++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/resumepossessionclaim/WantToUploadDocumentsTest.java
@@ -1,6 +1,7 @@
package uk.gov.hmcts.reform.pcs.ccd.page.resumepossessionclaim;
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;
@@ -12,6 +13,7 @@
import uk.gov.hmcts.reform.pcs.ccd.domain.AdditionalDocumentType;
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.VerticalYesNo;
import uk.gov.hmcts.reform.pcs.ccd.page.BasePageTest;
import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry;
@@ -36,6 +38,7 @@ void shouldFilterDocumentsForEngland(AdditionalDocumentType docType, String expe
// Given
PCSCase caseData = PCSCase.builder()
.legislativeCountry(LegislativeCountry.ENGLAND)
+ .wantToUploadDocuments(VerticalYesNo.YES)
.build();
// When
@@ -61,6 +64,7 @@ void shouldFilterDocumentsForWales(AdditionalDocumentType docType, String expect
// Given
PCSCase caseData = PCSCase.builder()
.legislativeCountry(LegislativeCountry.WALES)
+ .wantToUploadDocuments(VerticalYesNo.YES)
.build();
// When
@@ -80,6 +84,21 @@ void shouldFilterDocumentsForWales(AdditionalDocumentType docType, String expect
assertThat(documentTypeList.getListItems()).hasSize(16);
}
+ @Test
+ void shouldNotSetAdditionalDocumentsIfUserSelectsNo() {
+ // Given
+ PCSCase caseData = PCSCase.builder()
+ .legislativeCountry(LegislativeCountry.WALES)
+ .wantToUploadDocuments(VerticalYesNo.NO)
+ .build();
+
+ // When
+ AboutToStartOrSubmitResponse response = callMidEventHandler(caseData);
+
+ // Then
+ assertThat(response.getData().getAdditionalDocs()).isNull();
+ }
+
private static Stream englandDocumentScenarios() {
return Stream.of(
// England-specific documents