diff --git a/.gitignore b/.gitignore index 1da3c126d12..aaa9fe7b428 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,11 @@ src/main/resources/application.yaml /.aat-env /bin/ccd-config-PRL-local.xlsx /.mirrord/mirrord.json +/node_modules/.yarn-integrity +/node_modules/.yarn-state.yml +/.yarnrc.yml +/gradle-8.7-bin.zip +/.yarn/install-state.gz +/package.json +/yarn.lock +/.yarn/releases/yarn-4.12.0.cjs diff --git a/build.gradle b/build.gradle index 07d5b376370..24651db9ea2 100644 --- a/build.gradle +++ b/build.gradle @@ -193,7 +193,13 @@ apply plugin: 'net.serenity-bdd.aggregator' group = 'uk.gov.hmcts.reform.prl' version = '0.0.1' -mainClassName = 'uk.gov.hmcts.reform.prl.Application' +if (GradleVersion.current() >= GradleVersion.version('9.0')) { + springBoot { + mainClass.set('uk.gov.hmcts.reform.prl.Application') + } +} else { + mainClassName = 'uk.gov.hmcts.reform.prl.Application' +} bootJar { getArchiveFileName().set(provider { @@ -467,7 +473,6 @@ dependencies { integrationTestImplementation(sourceSets.test.output) } - processContractTestResources { duplicatesStrategy = DuplicatesStrategy.INCLUDE } diff --git a/src/functionalTest/java/uk/gov/hmcts/reform/prl/controllers/cafcass/CafcassUploadDocumentFunctionalTest.java b/src/functionalTest/java/uk/gov/hmcts/reform/prl/controllers/cafcass/CafcassUploadDocumentFunctionalTest.java index d626d47ec27..4074a725c33 100644 --- a/src/functionalTest/java/uk/gov/hmcts/reform/prl/controllers/cafcass/CafcassUploadDocumentFunctionalTest.java +++ b/src/functionalTest/java/uk/gov/hmcts/reform/prl/controllers/cafcass/CafcassUploadDocumentFunctionalTest.java @@ -91,4 +91,38 @@ public void givenValidDocumentData_then200Response() throws IOException { .body("message", equalTo("Document has been uploaded successfully: Dummy_pdf_file.pdf")); } + + @Test + @Order(3) + public void givenCirTransferDocument_then200Response() throws IOException { + final File fileToUpload = readFile(CAFCASS_DUMMY_UPLOAD_FILE); + + request + .header("Authorization", idamTokenGenerator.generateIdamTokenForCafcass()) + .header("ServiceAuthorization", serviceAuthenticationGenerator.generateTokenForCcd()) + .multiPart("file", fileToUpload) + .param("typeOfDocument", "cirTransferRequest") + .pathParam("caseId", caseDetails.getId()) + .contentType(MediaType.MULTIPART_FORM_DATA_VALUE) + .post("/{caseId}/document") + .then().assertThat().statusCode(200) + .body("message", equalTo("Document has been uploaded successfully: Dummy_pdf_file.pdf")); + } + + @Test + @Order(4) + public void givenCirExtensionDocument_then200Response() throws IOException { + final File fileToUpload = readFile(CAFCASS_DUMMY_UPLOAD_FILE); + + request + .header("Authorization", idamTokenGenerator.generateIdamTokenForCafcass()) + .header("ServiceAuthorization", serviceAuthenticationGenerator.generateTokenForCcd()) + .multiPart("file", fileToUpload) + .param("typeOfDocument", "cirExtensionRequest") + .pathParam("caseId", caseDetails.getId()) + .contentType(MediaType.MULTIPART_FORM_DATA_VALUE) + .post("/{caseId}/document") + .then().assertThat().statusCode(200) + .body("message", equalTo("Document has been uploaded successfully: Dummy_pdf_file.pdf")); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/prl/enums/managedocuments/CafcassReportAndGuardianEnum.java b/src/main/java/uk/gov/hmcts/reform/prl/enums/managedocuments/CafcassReportAndGuardianEnum.java index 605070a78c9..7c130eda031 100644 --- a/src/main/java/uk/gov/hmcts/reform/prl/enums/managedocuments/CafcassReportAndGuardianEnum.java +++ b/src/main/java/uk/gov/hmcts/reform/prl/enums/managedocuments/CafcassReportAndGuardianEnum.java @@ -18,6 +18,10 @@ public enum CafcassReportAndGuardianEnum { riskAssessment("16aRiskAssessment", "16a risk assessment"), + cirTransferRequest("cirTransferRequest", "CIR Transfer Request"), + + cirExtensionRequest("cirExtensionRequest", "CIR Extension Request"), + guardianReport("guardianReport", "Guardian report"), specialGuardianshipReport("specialGuardianshipReport", "Special guardianship report"), diff --git a/src/main/java/uk/gov/hmcts/reform/prl/mapper/bundle/BundleCreateRequestMapper.java b/src/main/java/uk/gov/hmcts/reform/prl/mapper/bundle/BundleCreateRequestMapper.java index 2460e569c52..a981ca9e293 100644 --- a/src/main/java/uk/gov/hmcts/reform/prl/mapper/bundle/BundleCreateRequestMapper.java +++ b/src/main/java/uk/gov/hmcts/reform/prl/mapper/bundle/BundleCreateRequestMapper.java @@ -70,7 +70,6 @@ import static uk.gov.hmcts.reform.prl.constants.ManageDocumentsCategoryConstants.SEC37_REPORT; import static uk.gov.hmcts.reform.prl.constants.ManageDocumentsCategoryConstants.SECTION7_REPORT; import static uk.gov.hmcts.reform.prl.constants.ManageDocumentsCategoryConstants.SECTION_37_REPORT; -import static uk.gov.hmcts.reform.prl.constants.ManageDocumentsCategoryConstants.SIXTEEN_A_RISK_ASSESSMENT; import static uk.gov.hmcts.reform.prl.constants.ManageDocumentsCategoryConstants.SPECIAL_GUARDIANSHIP_REPORT; import static uk.gov.hmcts.reform.prl.constants.ManageDocumentsCategoryConstants.TRANSCRIPTS_OF_JUDGEMENTS; import static uk.gov.hmcts.reform.prl.constants.PrlAppsConstants.BLANK_STRING; @@ -605,13 +604,6 @@ private static void mapCafcassLaReports(QuarantineLegalDoc doc, HashMap ALLOWED_FILE_TYPES = List.of("pdf", "docx"); + + static final String DOC_TYPE_CIR_TRANSFER = "cirTransferRequest"; + static final String DOC_TYPE_CIR_EXTENSION = "cirExtensionRequest"; + static final String DOC_TYPE_S16A_RISK_ASSESSMENT = "16aRiskAssessment"; + + public static final List URGENT_CAFCASS_DOC_TYPES = List.of( + DOC_TYPE_CIR_TRANSFER, DOC_TYPE_CIR_EXTENSION, DOC_TYPE_S16A_RISK_ASSESSMENT + ); + public static final String MANAGE_DOC_UPLOADED_CATEGORY = "manageDocUploadedCategory"; + public static final List ALLOWED_TYPE_OF_DOCS = List.of( - "16_4_Report", "CR_1", "CR_2", "CIR_Part1", "CIR_Part2", "CIR_Review", "CMO_report", + "16_4_Report", "CR_1", "CR_2", "CIR_Part1", "CIR_Part2", "CIR_Review", + DOC_TYPE_CIR_TRANSFER, DOC_TYPE_CIR_EXTENSION, + "CMO_report", "Contact_Centre_Recordings", "Correspondence", "Direct_work", "Enforcement_report", "FAO_Report", "FAO_Workplan", "Letter_from_Child", "Other_Non_Section_7_Report", "Position_Statement", "Positive_Parenting_Programme_Report", "Re_W_Report", - "S_11H_Monitoring", "S_16A_Risk_Assessment", "Safeguarding_Letter", + "S_11H_Monitoring", DOC_TYPE_S16A_RISK_ASSESSMENT, "Safeguarding_Letter", "Safeguarding_Letter_Returner", "Safeguarding_Letter_Shorter_Template", "Safeguarding_Letter_Update", "Second_Gatekeeping_Safeguarding_Letter", "Section7_Addendum_Report", "Section7_Report_Child_Impact_Analysis", "Suitability_report" @@ -107,6 +119,10 @@ private void updateCcdAfterUploadingDocument(MultipartFile document, String type caseDataUpdated.putIfAbsent(MANAGE_DOCUMENTS_TRIGGERED_BY, null); + if (URGENT_CAFCASS_DOC_TYPES.contains(typeOfDocument)) { + caseDataUpdated.put(MANAGE_DOC_UPLOADED_CATEGORY, typeOfDocument); + } + manageDocumentsService.moveDocumentsToQuarantineTab( quarantineLegalDoc, startAllTabsUpdateDataContent.caseData(), @@ -190,6 +206,8 @@ private static Map createDocumentTypeMap() map.put("CIR_Part1", CafcassReportAndGuardianEnum.section7Report); map.put("CIR_Part2", CafcassReportAndGuardianEnum.section7Report); map.put("CIR_Review", CafcassReportAndGuardianEnum.section7Report); + map.put(DOC_TYPE_CIR_TRANSFER, CafcassReportAndGuardianEnum.cirTransferRequest); + map.put(DOC_TYPE_CIR_EXTENSION, CafcassReportAndGuardianEnum.cirExtensionRequest); map.put("CMO_report", CafcassReportAndGuardianEnum.otherDocs); map.put("Contact_Centre_Recordings", CafcassReportAndGuardianEnum.otherDocs); map.put("Correspondence", CafcassReportAndGuardianEnum.otherDocs); @@ -203,7 +221,7 @@ private static Map createDocumentTypeMap() map.put("Positive_Parenting_Programme_Report", CafcassReportAndGuardianEnum.otherDocs); map.put("Re_W_Report", CafcassReportAndGuardianEnum.otherDocs); map.put("S_11H_Monitoring", CafcassReportAndGuardianEnum.otherDocs); - map.put("S_16A_Risk_Assessment", CafcassReportAndGuardianEnum.riskAssessment); + map.put(DOC_TYPE_S16A_RISK_ASSESSMENT, CafcassReportAndGuardianEnum.riskAssessment); map.put("Safeguarding_Letter", CafcassReportAndGuardianEnum.safeguardingLetter); map.put("Safeguarding_Letter_Returner", CafcassReportAndGuardianEnum.safeguardingLetter); map.put("Safeguarding_Letter_Shorter_Template", CafcassReportAndGuardianEnum.safeguardingLetter); diff --git a/src/test/java/uk/gov/hmcts/reform/prl/mapper/bundle/BundleCreateRequestMapperTest.java b/src/test/java/uk/gov/hmcts/reform/prl/mapper/bundle/BundleCreateRequestMapperTest.java index d1c3e47a1e2..cc0dda329fe 100644 --- a/src/test/java/uk/gov/hmcts/reform/prl/mapper/bundle/BundleCreateRequestMapperTest.java +++ b/src/test/java/uk/gov/hmcts/reform/prl/mapper/bundle/BundleCreateRequestMapperTest.java @@ -553,16 +553,26 @@ public void testBundleCreateRequestMapper() { .documentParty("Cafcass Cymru").categoryName(SAFEGUARDING_LETTER).categoryId("safeguardingLetter").build(); cafcassDoc.add(element(safeGuardingLetter)); + QuarantineLegalDoc sixteenARiskAssessment = QuarantineLegalDoc.builder() + .sixteenARiskAssessmentDocument(Document.builder().documentFileName("16ARiskAssessment").build()) + .documentParty("Cafcass").categoryName(SIXTEENA_RISK_ASSESSMENT).categoryId("16aRiskAssessment").build(); + cafcassDoc.add(element(sixteenARiskAssessment)); + + QuarantineLegalDoc cirTransferRequest = QuarantineLegalDoc.builder() + .cirTransferRequestDocument(Document.builder().documentFileName("cirTransferRequest").build()) + .documentParty("Cafcass").categoryId("cirTransferRequest").build(); + cafcassDoc.add(element(cirTransferRequest)); + + QuarantineLegalDoc cirExtensionRequest = QuarantineLegalDoc.builder() + .cirExtensionRequestDocument(Document.builder().documentFileName("cirExtensionRequest").build()) + .documentParty("Cafcass").categoryId("cirExtensionRequest").build(); + cafcassDoc.add(element(cirExtensionRequest)); + QuarantineLegalDoc section7Report = QuarantineLegalDoc.builder() .section7ReportDocument(Document.builder().documentFileName("section7Report").build()) .documentParty("Cafcass Cymru").categoryName(SECTION_7_REPORT).categoryId("section7Report").build(); courtStaffDoc.add(element(section7Report)); - QuarantineLegalDoc sixteenARiskAssessment = QuarantineLegalDoc.builder() - .sixteenARiskAssessmentDocument(Document.builder().documentFileName("16ARiskAssessment").build()) - .documentParty("Cafcass Cymru").categoryName(SIXTEENA_RISK_ASSESSMENT).categoryId("16aRiskAssessment").build(); - courtStaffDoc.add(element(sixteenARiskAssessment)); - QuarantineLegalDoc guardianReport = QuarantineLegalDoc.builder() .guardianReportDocument(Document.builder().documentFileName("guardianReport").build()) .documentParty("Cafcass Cymru").categoryName(GUARDIAN_REPORT).categoryId("guardianReport").build(); @@ -678,11 +688,13 @@ public void testBundleCreateRequestMapper() { BundleCreateRequest bundleCreateRequest = bundleCreateRequestMapper.mapCaseDataToBundleCreateRequest(c100CaseData,"eventI", Hearings.hearingsWith().build(),"sample.yaml"); assertNotNull(bundleCreateRequest); - // Should not contain police disclosures or medical records + // Should not contain police disclosures, medical records, anyOtherDocuments, 16A risk assessments, + // CIR Transfer Requests, or CIR Extension Requests (AC6) assertThat(bundleCreateRequest.getCaseDetails().getCaseData().getData().getAllOtherDocuments().stream() .map(Element::getValue) .map(BundlingRequestDocument::getDocumentFileName) - .filter(fileName -> List.of("policeDisclosures", "medicalRecords", "anyOtherDocuments") + .filter(fileName -> List.of("policeDisclosures", "medicalRecords", "anyOtherDocuments", + "16ARiskAssessment", "cirTransferRequest", "cirExtensionRequest") .contains(fileName)).toList()) .asInstanceOf(LIST).isEmpty(); } diff --git a/src/test/java/uk/gov/hmcts/reform/prl/services/cafcass/CafcassUploadDocServiceTest.java b/src/test/java/uk/gov/hmcts/reform/prl/services/cafcass/CafcassUploadDocServiceTest.java index d63baad1fab..7c20bf3c453 100644 --- a/src/test/java/uk/gov/hmcts/reform/prl/services/cafcass/CafcassUploadDocServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/prl/services/cafcass/CafcassUploadDocServiceTest.java @@ -27,6 +27,7 @@ import uk.gov.hmcts.reform.prl.services.tab.alltabs.AllTabServiceImpl; import java.util.List; +import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; @@ -36,6 +37,10 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static uk.gov.hmcts.reform.prl.services.cafcass.CafcassUploadDocService.DOC_TYPE_CIR_EXTENSION; +import static uk.gov.hmcts.reform.prl.services.cafcass.CafcassUploadDocService.DOC_TYPE_CIR_TRANSFER; +import static uk.gov.hmcts.reform.prl.services.cafcass.CafcassUploadDocService.DOC_TYPE_S16A_RISK_ASSESSMENT; +import static uk.gov.hmcts.reform.prl.services.cafcass.CafcassUploadDocService.MANAGE_DOC_UPLOADED_CATEGORY; import static uk.gov.hmcts.reform.prl.utils.TestConstants.TEST_CASE_ID; @ExtendWith(MockitoExtension.class) @@ -172,6 +177,138 @@ void shouldThrowExceptionWhenFilenameIsNull() { ); } + @Test + void shouldAcceptCirTransferDocumentType() { + when(authTokenGenerator.generate()).thenReturn(s2sToken); + Document document = testDocument(); + UploadResponse uploadResponse = new UploadResponse(List.of(document)); + CaseDetails caseDetails = CaseDetails.builder().id(Long.parseLong(TEST_CASE_ID)).build(); + StartAllTabsUpdateDataContent updateData = new StartAllTabsUpdateDataContent( + authToken, + EventRequestData.builder().build(), + StartEventResponse.builder().build(), + caseData.toMap(new ObjectMapper()), + caseData, + null + ); + + when(coreCaseDataApi.getCase(authToken, s2sToken, TEST_CASE_ID)).thenReturn(caseDetails); + when(caseDocumentClient.uploadDocuments(any(), any(), any(), any(), any())).thenReturn(uploadResponse); + when(allTabService.getStartUpdateForSpecificEvent(anyString(), anyString())).thenReturn(updateData); + + cafcassUploadDocService.uploadDocument(authToken, file, DOC_TYPE_CIR_TRANSFER, TEST_CASE_ID); + + verify(allTabService, times(1)).submitAllTabsUpdate(any(), any(), any(), any(), any()); + } + + @Test + void shouldAcceptCirExtensionDocumentType() { + when(authTokenGenerator.generate()).thenReturn(s2sToken); + Document document = testDocument(); + UploadResponse uploadResponse = new UploadResponse(List.of(document)); + CaseDetails caseDetails = CaseDetails.builder().id(Long.parseLong(TEST_CASE_ID)).build(); + StartAllTabsUpdateDataContent updateData = new StartAllTabsUpdateDataContent( + authToken, + EventRequestData.builder().build(), + StartEventResponse.builder().build(), + caseData.toMap(new ObjectMapper()), + caseData, + null + ); + + when(coreCaseDataApi.getCase(authToken, s2sToken, TEST_CASE_ID)).thenReturn(caseDetails); + when(caseDocumentClient.uploadDocuments(any(), any(), any(), any(), any())).thenReturn(uploadResponse); + when(allTabService.getStartUpdateForSpecificEvent(anyString(), anyString())).thenReturn(updateData); + + cafcassUploadDocService.uploadDocument(authToken, file, DOC_TYPE_CIR_EXTENSION, TEST_CASE_ID); + + verify(allTabService, times(1)).submitAllTabsUpdate(any(), any(), any(), any(), any()); + } + + @Test + @SuppressWarnings("unchecked") + void shouldSetUrgentDocTypeForCirTransfer() { + when(authTokenGenerator.generate()).thenReturn(s2sToken); + UploadResponse uploadResponse = new UploadResponse(List.of(testDocument())); + CaseDetails caseDetails = CaseDetails.builder().id(Long.parseLong(TEST_CASE_ID)).build(); + Map caseDataMap = caseData.toMap(new ObjectMapper()); + StartAllTabsUpdateDataContent updateData = new StartAllTabsUpdateDataContent( + authToken, EventRequestData.builder().build(), StartEventResponse.builder().build(), + caseDataMap, caseData, null + ); + + when(coreCaseDataApi.getCase(authToken, s2sToken, TEST_CASE_ID)).thenReturn(caseDetails); + when(caseDocumentClient.uploadDocuments(any(), any(), any(), any(), any())).thenReturn(uploadResponse); + when(allTabService.getStartUpdateForSpecificEvent(anyString(), anyString())).thenReturn(updateData); + + cafcassUploadDocService.uploadDocument(authToken, file, DOC_TYPE_CIR_TRANSFER, TEST_CASE_ID); + + assertEquals(DOC_TYPE_CIR_TRANSFER, caseDataMap.get(MANAGE_DOC_UPLOADED_CATEGORY)); + } + + @Test + @SuppressWarnings("unchecked") + void shouldSetUrgentDocTypeForCirExtension() { + when(authTokenGenerator.generate()).thenReturn(s2sToken); + UploadResponse uploadResponse = new UploadResponse(List.of(testDocument())); + CaseDetails caseDetails = CaseDetails.builder().id(Long.parseLong(TEST_CASE_ID)).build(); + Map caseDataMap = caseData.toMap(new ObjectMapper()); + StartAllTabsUpdateDataContent updateData = new StartAllTabsUpdateDataContent( + authToken, EventRequestData.builder().build(), StartEventResponse.builder().build(), + caseDataMap, caseData, null + ); + + when(coreCaseDataApi.getCase(authToken, s2sToken, TEST_CASE_ID)).thenReturn(caseDetails); + when(caseDocumentClient.uploadDocuments(any(), any(), any(), any(), any())).thenReturn(uploadResponse); + when(allTabService.getStartUpdateForSpecificEvent(anyString(), anyString())).thenReturn(updateData); + + cafcassUploadDocService.uploadDocument(authToken, file, DOC_TYPE_CIR_EXTENSION, TEST_CASE_ID); + + assertEquals(DOC_TYPE_CIR_EXTENSION, caseDataMap.get(MANAGE_DOC_UPLOADED_CATEGORY)); + } + + @Test + @SuppressWarnings("unchecked") + void shouldSetUrgentDocTypeFor16aRiskAssessment() { + when(authTokenGenerator.generate()).thenReturn(s2sToken); + UploadResponse uploadResponse = new UploadResponse(List.of(testDocument())); + CaseDetails caseDetails = CaseDetails.builder().id(Long.parseLong(TEST_CASE_ID)).build(); + Map caseDataMap = caseData.toMap(new ObjectMapper()); + StartAllTabsUpdateDataContent updateData = new StartAllTabsUpdateDataContent( + authToken, EventRequestData.builder().build(), StartEventResponse.builder().build(), + caseDataMap, caseData, null + ); + + when(coreCaseDataApi.getCase(authToken, s2sToken, TEST_CASE_ID)).thenReturn(caseDetails); + when(caseDocumentClient.uploadDocuments(any(), any(), any(), any(), any())).thenReturn(uploadResponse); + when(allTabService.getStartUpdateForSpecificEvent(anyString(), anyString())).thenReturn(updateData); + + cafcassUploadDocService.uploadDocument(authToken, file, DOC_TYPE_S16A_RISK_ASSESSMENT, TEST_CASE_ID); + + assertEquals(DOC_TYPE_S16A_RISK_ASSESSMENT, caseDataMap.get(MANAGE_DOC_UPLOADED_CATEGORY)); + } + + @Test + @SuppressWarnings("unchecked") + void shouldSetUrgentDocTypeToNullForNonUrgentDocumentType() { + when(authTokenGenerator.generate()).thenReturn(s2sToken); + UploadResponse uploadResponse = new UploadResponse(List.of(testDocument())); + CaseDetails caseDetails = CaseDetails.builder().id(Long.parseLong(TEST_CASE_ID)).build(); + Map caseDataMap = caseData.toMap(new ObjectMapper()); + StartAllTabsUpdateDataContent updateData = new StartAllTabsUpdateDataContent( + authToken, EventRequestData.builder().build(), StartEventResponse.builder().build(), + caseDataMap, caseData, null + ); + + when(coreCaseDataApi.getCase(authToken, s2sToken, TEST_CASE_ID)).thenReturn(caseDetails); + when(caseDocumentClient.uploadDocuments(any(), any(), any(), any(), any())).thenReturn(uploadResponse); + when(allTabService.getStartUpdateForSpecificEvent(anyString(), anyString())).thenReturn(updateData); + + cafcassUploadDocService.uploadDocument(authToken, file, "16_4_Report", TEST_CASE_ID); + + assertNull(caseDataMap.get(MANAGE_DOC_UPLOADED_CATEGORY)); + } + @Test void shouldReturnNullIfCasePresentThrowsException() { when(authTokenGenerator.generate()).thenReturn(s2sToken);