diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/LegalRepDocument.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/LegalRepDocument.java new file mode 100644 index 0000000000..2737ce7446 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/LegalRepDocument.java @@ -0,0 +1,39 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload; + +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.FieldType; +import uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload.wales.LegalRepDocumentTypeWales; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LegalRepDocument { + + @CCD( + label = "Type of document", + typeOverride = FieldType.FixedList, + typeParameterOverride = "LegalRepDocumentType" + ) + private LegalRepDocumentType legalRepDocumentType; + + @CCD( + label = "Type of document", + typeOverride = FieldType.FixedList, + typeParameterOverride = "LegalRepDocumentTypeWales" + ) + private LegalRepDocumentTypeWales legalRepDocumentTypeWales; + + @CCD(label = "Document") + private Document document; + + @CCD(label = "Short description", + max = 60 + ) + private String description; +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/LegalRepDocumentType.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/LegalRepDocumentType.java new file mode 100644 index 0000000000..795e829ee2 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/LegalRepDocumentType.java @@ -0,0 +1,23 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import uk.gov.hmcts.ccd.sdk.api.HasLabel; + +@AllArgsConstructor +@Getter +public enum LegalRepDocumentType implements HasLabel { + + RENT_STATEMENT("Rent or payments"), + TENANCY_AGREEMENT("Tenancy agreement"), + CORRESPONDENCE_FROM_DEFENDANT("Correspondence from defendant"), + CORRESPONDENCE_FROM_CLAIMANT("Correspondence from claimant"), + PHOTOGRAPHIC_EVIDENCE("Photographic evidence"), + CERTIFICATE_OF_SUITABILITY_AS_LF("Certificate of suitability as litigation friend"), + LEGAL_AID_CERTIFICATE("Legal aid certificate"), + OTHER("Other document"), + WITNESS_STATEMENT("Witness statement"); + + private final String label; + +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/LegalRepDocumentUploadDetails.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/LegalRepDocumentUploadDetails.java index c41c2c84f2..9b15da0203 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/LegalRepDocumentUploadDetails.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/LegalRepDocumentUploadDetails.java @@ -7,9 +7,12 @@ import lombok.Data; import lombok.NoArgsConstructor; import uk.gov.hmcts.ccd.sdk.api.CCD; +import uk.gov.hmcts.ccd.sdk.type.ListValue; import uk.gov.hmcts.ccd.sdk.type.YesOrNo; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList; +import java.util.List; + import static uk.gov.hmcts.ccd.sdk.type.FieldType.DynamicRadioList; @Builder @@ -26,7 +29,17 @@ public class LegalRepDocumentUploadDetails { @JsonProperty("DocumentUploadCategories") private DynamicStringList validCategories; + + @CCD( + label = "Add document", + hint = "Upload a document to the system" + ) + private List> legalRepDocuments; + @CCD(searchable = false) private YesOrNo showExistingApplicationPage; + @CCD(searchable = false) + private YesOrNo isWales; + } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/wales/LegalRepDocumentTypeWales.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/wales/LegalRepDocumentTypeWales.java new file mode 100644 index 0000000000..b784d46ba7 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/domain/legalrepdocumentupload/wales/LegalRepDocumentTypeWales.java @@ -0,0 +1,23 @@ +package uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload.wales; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import uk.gov.hmcts.ccd.sdk.api.HasLabel; + +@AllArgsConstructor +@Getter +public enum LegalRepDocumentTypeWales implements HasLabel { + + RENT_STATEMENT("Rent or payments"), + OCCUPATION_LICENCE("Occupation licence"), + CORRESPONDENCE_FROM_DEFENDANT("Correspondence from defendant"), + CORRESPONDENCE_FROM_CLAIMANT("Correspondence from claimant"), + PHOTOGRAPHIC_EVIDENCE("Photographic evidence"), + CERTIFICATE_OF_SUITABILITY_AS_LF("Certificate of suitability as litigation friend"), + LEGAL_AID_CERTIFICATE("Legal aid certificate"), + OTHER("Other document"), + WITNESS_STATEMENT("Witness statement"); + + private final String label; + +} diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/legalrepdocumentupload/LegalRepDocumentUpload.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/legalrepdocumentupload/LegalRepDocumentUpload.java index 5d0cdbd9f8..27d9e51db5 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/legalrepdocumentupload/LegalRepDocumentUpload.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/event/legalrepdocumentupload/LegalRepDocumentUpload.java @@ -14,11 +14,13 @@ 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.domain.legalrepdocumentupload.LegalRepDocument; import uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload.LegalRepDocumentUploadDetails; import uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload.DocumentUploadCategory; import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity; import uk.gov.hmcts.reform.pcs.ccd.page.legalrepdocumentupload.LegalRepDocumentUploadConfigurer; import uk.gov.hmcts.reform.pcs.ccd.service.PcsCaseService; +import uk.gov.hmcts.reform.pcs.ccd.service.document.DocumentService; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringList; import uk.gov.hmcts.reform.pcs.ccd.type.DynamicStringListElement; @@ -31,6 +33,7 @@ import uk.gov.hmcts.reform.pcs.ccd.entity.GenAppEntity; import uk.gov.hmcts.reform.pcs.ccd.domain.genapp.GenAppType; +import uk.gov.hmcts.reform.pcs.postcodecourt.model.LegislativeCountry; import static uk.gov.hmcts.reform.pcs.ccd.event.EventId.legalRepDocumentUpload; @@ -40,6 +43,7 @@ public class LegalRepDocumentUpload implements CCDConfig configBuilder) { @@ -86,6 +90,10 @@ private PCSCase start(EventPayload eventPayload) { // By default, Main claim is always added caseData.getLegalRepDocumentUploadDetails().setShowExistingApplicationPage(validCategoryItems.size() >= 2 ? YesOrNo.YES : YesOrNo.NO); + + boolean isWalesClaim = pcsCaseEntity.getLegislativeCountry() == LegislativeCountry.WALES; + caseData.getLegalRepDocumentUploadDetails().setIsWales(isWalesClaim ? YesOrNo.YES : YesOrNo.NO); + return caseData; } @@ -131,7 +139,31 @@ GenAppType mapCategoryToGenAppType(DocumentUploadCategory category) { }; } - private SubmitResponse submit(EventPayload eventPayload) { - return SubmitResponse.defaultResponse(); + SubmitResponse submit(EventPayload eventPayload) { + Long caseReference = eventPayload.caseReference(); + PcsCaseEntity pcsCaseEntity = pcsCaseService.loadCase(caseReference); + PCSCase pcsCase = eventPayload.caseData(); + + List legalRepDocuments = documentService.createLegalRepDocuments(pcsCase); + + boolean isDocumentNull = legalRepDocuments.stream() + .anyMatch(doc -> doc == null || doc.getDocument() == null); + + if (isDocumentNull) { + return errorResponse("Your files were not submitted. Try again."); + } + + documentService.createDocumentEntitiesFromLegalRepDocuments(legalRepDocuments,pcsCaseEntity); + + return SubmitResponse.builder() + .build(); + } + + @SuppressWarnings("SameParameterValue") + private SubmitResponse errorResponse(String message) { + return SubmitResponse.builder() + .errors(List.of(message)) + .build(); } + } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/legalrepdocumentupload/LegalRepDocumentUploadConfigurer.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/legalrepdocumentupload/LegalRepDocumentUploadConfigurer.java index 543c995060..036c29ff63 100644 --- a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/legalrepdocumentupload/LegalRepDocumentUploadConfigurer.java +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/legalrepdocumentupload/LegalRepDocumentUploadConfigurer.java @@ -9,10 +9,13 @@ @AllArgsConstructor public class LegalRepDocumentUploadConfigurer implements PageConfigurer { + private final UploadAdditionalDocumentsPage uploadAdditionalDocumentsPage; + @Override public void configurePages(PageBuilder pageBuilder) { pageBuilder .add(new UploadAdditionalDocumentsInformationPage()) - .add(new ExistingApplicationPage()); + .add(new ExistingApplicationPage()) + .add(uploadAdditionalDocumentsPage); } } diff --git a/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/legalrepdocumentupload/UploadAdditionalDocumentsPage.java b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/legalrepdocumentupload/UploadAdditionalDocumentsPage.java new file mode 100644 index 0000000000..31d5ecd7d6 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/pcs/ccd/page/legalrepdocumentupload/UploadAdditionalDocumentsPage.java @@ -0,0 +1,71 @@ +package uk.gov.hmcts.reform.pcs.ccd.page.legalrepdocumentupload; + +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Component; +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.PCSCase; +import uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload.LegalRepDocument; +import uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload.LegalRepDocumentUploadDetails; +import uk.gov.hmcts.reform.pcs.ccd.page.CcdPage; +import uk.gov.hmcts.reform.pcs.ccd.service.TextAreaValidationService; + +import static uk.gov.hmcts.reform.pcs.ccd.ShowConditions.NEVER_SHOW; + +@Component +@AllArgsConstructor +public class UploadAdditionalDocumentsPage implements CcdPageConfiguration, CcdPage { + + private static final String DESCRIPTION_LABEL = "Short description"; + private final TextAreaValidationService textAreaValidationService; + public static final String DOCUMENT_DETAILS_CONTENT = """ +

+ You should only upload documents that are relevant to the claim. +

+ +

+ Before you upload the document, give it a name that tells the court what it is, + for example ‘witness statement’, or ‘tenancy agreement’. +

+ +

+ You can upload the following file types: DOC/DOCX (Word), XLS/XLSM + (Excel), PPT/PPTX (PowerPoint), PDF, RTF, TXT, CSV, JPG/JPEG, PNG, BMP, + TIF/TIFF. +

+ +

+ Before you upload your documents +

+ +

+ Give your document a name that explains what it is. +

+ + """; + + @Override + public void addTo(PageBuilder pageBuilder) { + String pageKey = getPageKey(); + pageBuilder + .page(pageKey) + .pageLabel("Upload additional documents") + .label(pageKey + "-line-separator", "---") + .label(pageKey + "-content", DOCUMENT_DETAILS_CONTENT) + .complex(PCSCase::getLegalRepDocumentUploadDetails) + .readonly(LegalRepDocumentUploadDetails::getIsWales, NEVER_SHOW) + .list(LegalRepDocumentUploadDetails::getLegalRepDocuments) + .mandatory(LegalRepDocument::getLegalRepDocumentType, "isWales = \"No\"") + .mandatory(LegalRepDocument::getLegalRepDocumentTypeWales, "isWales = \"Yes\"") + .mandatory(LegalRepDocument::getDocument) + .mandatory(LegalRepDocument::getDescription) + .done() + .build(); + } + + @Override + public String getPageKey() { + return CcdPage.derivePageKey(this.getClass()); + } + +} 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 0a023e0b77..14f38679b9 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 @@ -22,10 +22,13 @@ import uk.gov.hmcts.reform.pcs.ccd.domain.enforcetheorder.EnforcementOrder; import uk.gov.hmcts.reform.pcs.ccd.domain.enforcetheorder.warrantofrestitution.EvidenceDocumentType; import uk.gov.hmcts.reform.pcs.ccd.domain.enforcetheorder.warrantofrestitution.EvidenceOfDefendants; +import uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload.LegalRepDocumentType; +import uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload.wales.LegalRepDocumentTypeWales; +import uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload.LegalRepDocument; +import uk.gov.hmcts.reform.pcs.ccd.domain.legalrepdocumentupload.LegalRepDocumentUploadDetails; import uk.gov.hmcts.reform.pcs.ccd.domain.wales.OccupationLicenceDetailsWales; import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; import uk.gov.hmcts.reform.pcs.ccd.domain.wales.WalesDocuments; -import uk.gov.hmcts.reform.pcs.ccd.entity.ClaimEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.DocumentEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.GenAppEntity; import uk.gov.hmcts.reform.pcs.ccd.entity.PcsCaseEntity; @@ -414,6 +417,34 @@ private DocumentType mapEvidenceDocumentTypeToDocumentType(EvidenceDocumentType }; } + private DocumentType mapLegalRepDocumentTypeToDocumentType(LegalRepDocumentType legalRepDocumentType) { + return switch (legalRepDocumentType) { + case RENT_STATEMENT -> DocumentType.RENT_STATEMENT; + case TENANCY_AGREEMENT -> DocumentType.TENANCY_AGREEMENT; + case CORRESPONDENCE_FROM_CLAIMANT -> DocumentType.CORRESPONDENCE_FROM_CLAIMANT; + case CORRESPONDENCE_FROM_DEFENDANT -> DocumentType.CORRESPONDENCE_FROM_DEFENDANT; + case PHOTOGRAPHIC_EVIDENCE -> DocumentType.PHOTOGRAPHIC_EVIDENCE; + case CERTIFICATE_OF_SUITABILITY_AS_LF -> DocumentType.CERTIFICATE_OF_SUITABILITY_AS_LF; + case LEGAL_AID_CERTIFICATE -> DocumentType.LEGAL_AID_CERTIFICATE; + case OTHER -> DocumentType.OTHER; + case WITNESS_STATEMENT -> DocumentType.WITNESS_STATEMENT; + }; + } + + private DocumentType mapLegalRepDocumentTypeToDocumentType(LegalRepDocumentTypeWales legalRepDocumentTypeWales) { + return switch (legalRepDocumentTypeWales) { + case RENT_STATEMENT -> DocumentType.RENT_STATEMENT; + case OCCUPATION_LICENCE -> DocumentType.OCCUPATION_LICENCE; + case CORRESPONDENCE_FROM_CLAIMANT -> DocumentType.CORRESPONDENCE_FROM_CLAIMANT; + case CORRESPONDENCE_FROM_DEFENDANT -> DocumentType.CORRESPONDENCE_FROM_DEFENDANT; + case PHOTOGRAPHIC_EVIDENCE -> DocumentType.PHOTOGRAPHIC_EVIDENCE; + case CERTIFICATE_OF_SUITABILITY_AS_LF -> DocumentType.CERTIFICATE_OF_SUITABILITY_AS_LF; + case LEGAL_AID_CERTIFICATE -> DocumentType.LEGAL_AID_CERTIFICATE; + case OTHER -> DocumentType.OTHER; + case WITNESS_STATEMENT -> DocumentType.WITNESS_STATEMENT; + }; + } + @Builder @Data private static class DocumentHolder { @@ -421,4 +452,46 @@ private static class DocumentHolder { private DocumentType type; private String description; } + + public List createLegalRepDocuments(PCSCase pcsCase) { + LegalRepDocumentUploadDetails legalRepDocumentUploadDetails = pcsCase.getLegalRepDocumentUploadDetails(); + + return legalRepDocumentUploadDetails.getLegalRepDocuments().stream() + .map(ListValue::getValue).toList(); + } + + public DocumentType resolveDocumentType(LegalRepDocument legalRepDoc) { + if (legalRepDoc.getLegalRepDocumentTypeWales() != null) { + return mapLegalRepDocumentTypeToDocumentType(legalRepDoc.getLegalRepDocumentTypeWales()); + } + return mapLegalRepDocumentTypeToDocumentType(legalRepDoc.getLegalRepDocumentType()); + } + + public void createDocumentEntitiesFromLegalRepDocuments( + List legalRepDocuments, + PcsCaseEntity pcsCaseEntity + ) { + List documentEntities = legalRepDocuments.stream() + .map(legalRepDoc -> { + + DocumentType resolvedDocumentType = resolveDocumentType(legalRepDoc); + + String categoryId = mapDocumentTypeToCategory(resolvedDocumentType) + .map(CaseFileCategory::getId) + .orElse(null); + + return DocumentEntity.builder() + .pcsCase(pcsCaseEntity) + .url(legalRepDoc.getDocument().getUrl()) + .fileName(legalRepDoc.getDocument().getFilename()) + .binaryUrl(legalRepDoc.getDocument().getBinaryUrl()) + .description(legalRepDoc.getDescription()) + .type(resolvedDocumentType) + .categoryId(categoryId) + .build(); + }) + .toList(); + + pcsCaseEntity.addDocuments(documentEntities); + } } diff --git a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/legalrepdocumentupload/LegalRepDocumentUploadDetailsConfigurerTest.java b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/legalrepdocumentupload/LegalRepDocumentUploadDetailsConfigurerTest.java index 7fad68a269..bccd542b5b 100644 --- a/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/legalrepdocumentupload/LegalRepDocumentUploadDetailsConfigurerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/pcs/ccd/page/legalrepdocumentupload/LegalRepDocumentUploadDetailsConfigurerTest.java @@ -5,6 +5,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.reform.pcs.ccd.common.CcdPageConfiguration; @@ -28,6 +29,9 @@ class LegalRepDocumentUploadDetailsConfigurerTest extends BasePageTest { @InjectMocks private LegalRepDocumentUploadConfigurer underTest; + @Mock + private UploadAdditionalDocumentsPage uploadAdditionalDocumentsPage; + @Test @SuppressWarnings("squid:S5961") void shouldConfigurePagesInCorrectOrder() { @@ -46,6 +50,7 @@ void shouldConfigurePagesInCorrectOrder() { verifyAndCount(inOrder, pageBuilder, UploadAdditionalDocumentsInformationPage.class, verificationCount); verifyAndCount(inOrder, pageBuilder, ExistingApplicationPage.class, verificationCount); + verifyAndCount(inOrder, pageBuilder, uploadAdditionalDocumentsPage, verificationCount); int numberOfPages = pageCaptor.getAllValues().size(); assertThat(verificationCount.get()).isEqualTo(numberOfPages);