diff --git a/src/main/java/uk/gov/hmcts/reform/civil/helpers/bundle/BundleFileNameHelper.java b/src/main/java/uk/gov/hmcts/reform/civil/helpers/bundle/BundleFileNameHelper.java index ba2df6dcec8..db69a33859b 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/helpers/bundle/BundleFileNameHelper.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/helpers/bundle/BundleFileNameHelper.java @@ -18,36 +18,27 @@ private BundleFileNameHelper() { public static List> getWitnessDocsByPartyAndDocType(PartyType partyType, EvidenceUploadType evidenceUploadFiles, CaseData caseData) { return switch (evidenceUploadFiles) { - case WITNESS_STATEMENT -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentWitnessStatement() != null - ? caseData.getDocumentWitnessStatement() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentWitnessStatementApp2() != null - ? caseData.getDocumentWitnessStatementApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentWitnessStatementRes() != null - ? caseData.getDocumentWitnessStatementRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentWitnessStatementRes2() != null - ? caseData.getDocumentWitnessStatementRes2() : Collections.emptyList(); - }; - case WITNESS_SUMMARY -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentWitnessSummary() != null - ? caseData.getDocumentWitnessSummary() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentWitnessSummaryApp2() != null - ? caseData.getDocumentWitnessSummaryApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentWitnessSummaryRes() != null - ? caseData.getDocumentWitnessSummaryRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentWitnessSummaryRes2() != null - ? caseData.getDocumentWitnessSummaryRes2() : Collections.emptyList(); - }; - case NOTICE_OF_INTENTION -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentHearsayNotice() != null - ? caseData.getDocumentHearsayNotice() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentHearsayNoticeApp2() != null - ? caseData.getDocumentHearsayNoticeApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentHearsayNoticeRes() != null - ? caseData.getDocumentHearsayNoticeRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentHearsayNoticeRes2() != null - ? caseData.getDocumentHearsayNoticeRes2() : Collections.emptyList(); - }; + case WITNESS_STATEMENT -> getDocsByParty( + partyType, + caseData.getDocumentWitnessStatement(), + caseData.getDocumentWitnessStatementApp2(), + caseData.getDocumentWitnessStatementRes(), + caseData.getDocumentWitnessStatementRes2() + ); + case WITNESS_SUMMARY -> getDocsByParty( + partyType, + caseData.getDocumentWitnessSummary(), + caseData.getDocumentWitnessSummaryApp2(), + caseData.getDocumentWitnessSummaryRes(), + caseData.getDocumentWitnessSummaryRes2() + ); + case NOTICE_OF_INTENTION -> getDocsByParty( + partyType, + caseData.getDocumentHearsayNotice(), + caseData.getDocumentHearsayNoticeApp2(), + caseData.getDocumentHearsayNoticeRes(), + caseData.getDocumentHearsayNoticeRes2() + ); default -> null; }; } @@ -56,46 +47,34 @@ public static List> getExpertDocsByPartyAndDocType PartyType partyType, EvidenceUploadType evidenceUploadFiles, CaseData caseData) { return switch (evidenceUploadFiles) { - case EXPERT_REPORT -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentExpertReport() != null - ? caseData.getDocumentExpertReport() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentExpertReportApp2() != null - ? caseData.getDocumentExpertReportApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentExpertReportRes() != null - ? caseData.getDocumentExpertReportRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentExpertReportRes2() != null - ? caseData.getDocumentExpertReportRes2() : Collections.emptyList(); - }; - case QUESTIONS_FOR_EXPERTS -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentQuestions() != null - ? caseData.getDocumentQuestions() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentQuestionsApp2() != null - ? caseData.getDocumentQuestionsApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentQuestionsRes() != null - ? caseData.getDocumentQuestionsRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentQuestionsRes2() != null - ? caseData.getDocumentQuestionsRes2() : Collections.emptyList(); - }; - case ANSWERS_FOR_EXPERTS -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentAnswers() != null - ? caseData.getDocumentAnswers() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentAnswersApp2() != null - ? caseData.getDocumentAnswersApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentAnswersRes() != null - ? caseData.getDocumentAnswersRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentAnswersRes2() != null - ? caseData.getDocumentAnswersRes2() : Collections.emptyList(); - }; - case JOINT_STATEMENT -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentJointStatement() != null - ? caseData.getDocumentJointStatement() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentJointStatementApp2() != null - ? caseData.getDocumentJointStatementApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentJointStatementRes() != null - ? caseData.getDocumentJointStatementRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentJointStatementRes2() != null - ? caseData.getDocumentJointStatementRes2() : Collections.emptyList(); - }; + case EXPERT_REPORT -> getDocsByParty( + partyType, + caseData.getDocumentExpertReport(), + caseData.getDocumentExpertReportApp2(), + caseData.getDocumentExpertReportRes(), + caseData.getDocumentExpertReportRes2() + ); + case QUESTIONS_FOR_EXPERTS -> getDocsByParty( + partyType, + caseData.getDocumentQuestions(), + caseData.getDocumentQuestionsApp2(), + caseData.getDocumentQuestionsRes(), + caseData.getDocumentQuestionsRes2() + ); + case ANSWERS_FOR_EXPERTS -> getDocsByParty( + partyType, + caseData.getDocumentAnswers(), + caseData.getDocumentAnswersApp2(), + caseData.getDocumentAnswersRes(), + caseData.getDocumentAnswersRes2() + ); + case JOINT_STATEMENT -> getDocsByParty( + partyType, + caseData.getDocumentJointStatement(), + caseData.getDocumentJointStatementApp2(), + caseData.getDocumentJointStatementRes(), + caseData.getDocumentJointStatementRes2() + ); default -> null; }; } @@ -104,77 +83,73 @@ public static List> getEvidenceUploadDocsByP PartyType partyType, EvidenceUploadType evidenceUploadFiles, CaseData caseData) { return switch (evidenceUploadFiles) { - case DOCUMENTS_FOR_DISCLOSURE -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentForDisclosure() != null - ? caseData.getDocumentForDisclosure() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentForDisclosureApp2() != null - ? caseData.getDocumentForDisclosureApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentForDisclosureRes() != null - ? caseData.getDocumentForDisclosureRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentForDisclosureRes2() != null - ? caseData.getDocumentForDisclosureRes2() : Collections.emptyList(); - }; - case DISCLOSURE_LIST -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentDisclosureList() != null - ? caseData.getDocumentDisclosureList() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentDisclosureListApp2() != null - ? caseData.getDocumentDisclosureListApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentDisclosureListRes() != null - ? caseData.getDocumentDisclosureListRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentDisclosureListRes2() != null - ? caseData.getDocumentDisclosureListRes2() : Collections.emptyList(); - }; - case DOCUMENTS_REFERRED -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentReferredInStatement() != null - ? caseData.getDocumentReferredInStatement() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentReferredInStatementApp2() != null - ? caseData.getDocumentReferredInStatementApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentReferredInStatementRes() != null - ? caseData.getDocumentReferredInStatementRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentReferredInStatementRes2() != null - ? caseData.getDocumentReferredInStatementRes2() : Collections.emptyList(); - }; - case DOCUMENTARY -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentEvidenceForTrial() != null - ? caseData.getDocumentEvidenceForTrial() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentEvidenceForTrialApp2() != null - ? caseData.getDocumentEvidenceForTrialApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentEvidenceForTrialRes() != null - ? caseData.getDocumentEvidenceForTrialRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentEvidenceForTrialRes2() != null - ? caseData.getDocumentEvidenceForTrialRes2() : Collections.emptyList(); - }; - case CASE_SUMMARY -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentCaseSummary() != null - ? caseData.getDocumentCaseSummary() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentCaseSummaryApp2() != null - ? caseData.getDocumentCaseSummaryApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentCaseSummaryRes() != null - ? caseData.getDocumentCaseSummaryRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentCaseSummaryRes2() != null - ? caseData.getDocumentCaseSummaryRes2() : Collections.emptyList(); - }; - case COSTS -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentCosts() != null - ? caseData.getDocumentCosts() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentCostsApp2() != null - ? caseData.getDocumentCostsApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentCostsRes() != null - ? caseData.getDocumentCostsRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentCostsRes2() != null - ? caseData.getDocumentCostsRes2() : Collections.emptyList(); - }; - case SKELETON_ARGUMENT -> switch (partyType) { - case CLAIMANT1 -> caseData.getDocumentSkeletonArgument() != null - ? caseData.getDocumentSkeletonArgument() : Collections.emptyList(); - case CLAIMANT2 -> caseData.getDocumentSkeletonArgumentApp2() != null - ? caseData.getDocumentSkeletonArgumentApp2() : Collections.emptyList(); - case DEFENDANT1 -> caseData.getDocumentSkeletonArgumentRes() != null - ? caseData.getDocumentSkeletonArgumentRes() : Collections.emptyList(); - case DEFENDANT2 -> caseData.getDocumentSkeletonArgumentRes2() != null - ? caseData.getDocumentSkeletonArgumentRes2() : Collections.emptyList(); - }; + case DOCUMENTS_FOR_DISCLOSURE -> getDocsByParty( + partyType, + caseData.getDocumentForDisclosure(), + caseData.getDocumentForDisclosureApp2(), + caseData.getDocumentForDisclosureRes(), + caseData.getDocumentForDisclosureRes2() + ); + case DISCLOSURE_LIST -> getDocsByParty( + partyType, + caseData.getDocumentDisclosureList(), + caseData.getDocumentDisclosureListApp2(), + caseData.getDocumentDisclosureListRes(), + caseData.getDocumentDisclosureListRes2() + ); + case DOCUMENTS_REFERRED -> getDocsByParty( + partyType, + caseData.getDocumentReferredInStatement(), + caseData.getDocumentReferredInStatementApp2(), + caseData.getDocumentReferredInStatementRes(), + caseData.getDocumentReferredInStatementRes2() + ); + case DOCUMENTARY -> getDocsByParty( + partyType, + caseData.getDocumentEvidenceForTrial(), + caseData.getDocumentEvidenceForTrialApp2(), + caseData.getDocumentEvidenceForTrialRes(), + caseData.getDocumentEvidenceForTrialRes2() + ); + case CASE_SUMMARY -> getDocsByParty( + partyType, + caseData.getDocumentCaseSummary(), + caseData.getDocumentCaseSummaryApp2(), + caseData.getDocumentCaseSummaryRes(), + caseData.getDocumentCaseSummaryRes2() + ); + case COSTS -> getDocsByParty( + partyType, + caseData.getDocumentCosts(), + caseData.getDocumentCostsApp2(), + caseData.getDocumentCostsRes(), + caseData.getDocumentCostsRes2() + ); + case SKELETON_ARGUMENT -> getDocsByParty( + partyType, + caseData.getDocumentSkeletonArgument(), + caseData.getDocumentSkeletonArgumentApp2(), + caseData.getDocumentSkeletonArgumentRes(), + caseData.getDocumentSkeletonArgumentRes2() + ); default -> null; }; } + + private static List> getDocsByParty(PartyType partyType, + List> claimant1Docs, + List> claimant2Docs, + List> defendant1Docs, + List> defendant2Docs) { + return emptyIfNull(switch (partyType) { + case CLAIMANT1 -> claimant1Docs; + case CLAIMANT2 -> claimant2Docs; + case DEFENDANT1 -> defendant1Docs; + case DEFENDANT2 -> defendant2Docs; + }); + } + + private static List> emptyIfNull(List> documents) { + return documents != null ? documents : Collections.emptyList(); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/helpers/bundle/ConversionToBundleRequestDocs.java b/src/main/java/uk/gov/hmcts/reform/civil/helpers/bundle/ConversionToBundleRequestDocs.java index 888492dc43b..8b2780ccc93 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/helpers/bundle/ConversionToBundleRequestDocs.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/helpers/bundle/ConversionToBundleRequestDocs.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import uk.gov.hmcts.reform.civil.documentmanagement.model.Document; import uk.gov.hmcts.reform.civil.enums.caseprogression.BundleFileNameList; import uk.gov.hmcts.reform.civil.enums.caseprogression.EvidenceUploadType; import uk.gov.hmcts.reform.civil.model.Party; @@ -18,6 +19,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.function.Function; import static uk.gov.hmcts.reform.civil.helpers.bundle.BundleUtils.buildBundlingRequestDoc; import static uk.gov.hmcts.reform.civil.helpers.bundle.BundleUtils.generateDocName; @@ -40,49 +42,15 @@ public List covertOtherWitnessEvidenceToBundleRequestDo Party party) { log.debug("Converting other witness evidence to bundle request docs for party {}", party); List bundlingRequestDocuments = new ArrayList<>(); - if (party != null) { - if (party.getPartyName() != null) { - witnessStatmentsMap.remove(party.getPartyName().trim().toLowerCase()); - } - if (party.isIndividual() && party.getIndividualFirstName() != null) { - witnessStatmentsMap.remove(party.getIndividualFirstName().trim().toLowerCase()); - } - } - if (featureToggleService.isAmendBundleEnabled()) { - witnessStatmentsMap.forEach((witnessName, witnessEvidence) -> - witnessEvidence.stream().filter(caseDocumentElement -> caseDocumentElement.getValue().getWitnessOptionDocument().getCategoryID() != null - && !caseDocumentElement.getValue().getWitnessOptionDocument().getCategoryID().equals( - UNBUNDLED_FOLDER)).toList().forEach(uploadEvidenceWitnessElement -> { - String docName = generateDocName( - displayName, - uploadEvidenceWitnessElement.getValue().getWitnessOptionName(), - String.valueOf(witnessEvidence.indexOf(uploadEvidenceWitnessElement) + 1), - uploadEvidenceWitnessElement.getValue().getWitnessOptionUploadDate() - ); - bundlingRequestDocuments.add(buildBundlingRequestDoc( - docName, - uploadEvidenceWitnessElement.getValue().getWitnessOptionDocument(), - documentType - )); - }) - ); - } else { - witnessStatmentsMap.forEach((witnessName, witnessEvidence) -> - witnessEvidence.forEach(uploadEvidenceWitnessElement -> { - String docName = generateDocName( - displayName, - uploadEvidenceWitnessElement.getValue().getWitnessOptionName(), - String.valueOf(witnessEvidence.indexOf(uploadEvidenceWitnessElement) + 1), - uploadEvidenceWitnessElement.getValue().getWitnessOptionUploadDate() - ); - bundlingRequestDocuments.add(buildBundlingRequestDoc( - docName, - uploadEvidenceWitnessElement.getValue().getWitnessOptionDocument(), - documentType - )); - }) - ); - } + removePartyEntries(witnessStatmentsMap, party); + witnessStatmentsMap.forEach((witnessName, witnessEvidence) -> + addOtherWitnessEvidenceDocuments( + bundlingRequestDocuments, + filterDocumentsForBundle(witnessEvidence, UploadEvidenceWitness::getWitnessOptionDocument), + displayName, + documentType + ) + ); return bundlingRequestDocuments; } @@ -94,12 +62,7 @@ public List covertWitnessEvidenceToBundleRequestDocs(Li log.debug("Converting witness evidence to bundle request docs for file name prefix: {} and party: {}", fileNamePrefix, party); List bundlingRequestDocuments = new ArrayList<>(); if (witnessEvidence != null) { - if (featureToggleService.isAmendBundleEnabled()) { - witnessEvidence = new ArrayList<>(witnessEvidence.stream() - .filter(caseDocumentElement -> caseDocumentElement.getValue().getWitnessOptionDocument().getCategoryID() != null - && !caseDocumentElement.getValue().getWitnessOptionDocument().getCategoryID().equals( - UNBUNDLED_FOLDER)).toList()); - } + witnessEvidence = filterDocumentsForBundle(witnessEvidence, UploadEvidenceWitness::getWitnessOptionDocument); bundleRequestDocsOrganizer.sortWitnessListByDate( witnessEvidence, !documentType.equals(EvidenceUploadType.WITNESS_STATEMENT.name()) @@ -128,12 +91,7 @@ public List covertEvidenceUploadTypeToBundleRequestDocs log.debug("Converting evidence upload type to bundle request docs for file name prefix: {} and party: {}", fileNamePrefix, party); List bundlingRequestDocuments = new ArrayList<>(); if (evidenceUploadDocList != null) { - if (featureToggleService.isAmendBundleEnabled()) { - evidenceUploadDocList = new ArrayList<>(evidenceUploadDocList.stream() - .filter(caseDocumentElement -> caseDocumentElement.getValue().getDocumentUpload().getCategoryID() != null - && !caseDocumentElement.getValue().getDocumentUpload().getCategoryID().equals( - UNBUNDLED_FOLDER)).toList()); - } + evidenceUploadDocList = filterDocumentsForBundle(evidenceUploadDocList, UploadEvidenceDocumentType::getDocumentUpload); bundleRequestDocsOrganizer.sortEvidenceUploadByDate( evidenceUploadDocList, documentType.equals(EvidenceUploadType.CASE_SUMMARY.name()) @@ -165,20 +123,10 @@ public List covertExpertEvidenceTypeToBundleRequestDocs List bundlingRequestDocuments = new ArrayList<>(); if (evidenceUploadExpert != null) { - if (featureToggleService.isAmendBundleEnabled()) { - evidenceUploadExpert = new ArrayList<>(evidenceUploadExpert.stream() - .filter(caseDocumentElement -> caseDocumentElement.getValue().getExpertDocument().getCategoryID() != null - && !caseDocumentElement.getValue().getExpertDocument().getCategoryID().equals( - UNBUNDLED_FOLDER)).toList()); - } + evidenceUploadExpert = filterDocumentsForBundle(evidenceUploadExpert, UploadEvidenceExpert::getExpertDocument); bundleRequestDocsOrganizer.sortExpertListByDate(evidenceUploadExpert); evidenceUploadExpert.forEach(expertElement -> { - String expertise = null; - if (documentType.equals(EvidenceUploadType.EXPERT_REPORT.name())) { - expertise = expertElement.getValue().getExpertOptionExpertise(); - } else if (documentType.equals(EvidenceUploadType.JOINT_STATEMENT.name())) { - expertise = expertElement.getValue().getExpertOptionExpertises(); - } + String expertise = getExpertise(documentType, expertElement.getValue()); String docName = generateDocName( fileNamePrefix, expertElement.getValue().getExpertOptionName(), @@ -198,38 +146,26 @@ public List covertExpertEvidenceTypeToBundleRequestDocs private String getFileNameBaseOnType(String fileNamePrefix, Element uploadEvidence, String documentType, PartyType party) { - if (fileNamePrefix.equals(DOC_FILE_NAME)) { - return uploadEvidence.getValue().getDocumentUpload().getDocumentFileName() - .substring(0, uploadEvidence.getValue().getDocumentUpload().getDocumentFileName().lastIndexOf(".")); - } else if (fileNamePrefix.equals(DOC_FILE_NAME_WITH_DATE)) { - return generateDocName(uploadEvidence.getValue().getDocumentUpload().getDocumentFileName() - .substring( - 0, - uploadEvidence.getValue().getDocumentUpload().getDocumentFileName().lastIndexOf( - ".") - ) + " %s", null, + if (DOC_FILE_NAME.equals(fileNamePrefix)) { + return getDocumentFileNameWithoutExtension(uploadEvidence.getValue().getDocumentUpload()); + } + if (DOC_FILE_NAME_WITH_DATE.equals(fileNamePrefix)) { + return generateDocName( + getDocumentFileNameWithoutExtension(uploadEvidence.getValue().getDocumentUpload()) + " %s", + null, null, - documentType.equals(EvidenceUploadType.COSTS.name()) - ? uploadEvidence.getValue().getCreatedDatetime().toLocalDate() : - uploadEvidence.getValue().getDocumentIssuedDate() + getDateForOriginalFileName(documentType, uploadEvidence.getValue()) ); - } else { - String partyName = party.getDisplayName(); - if (fileNamePrefix.equals(BundleFileNameList.SCHEDULE_OF_LOSS_FILE_DISPLAY_NAME.getDisplayName()) - && (party.equals(PartyType.DEFENDANT1) || party.equals(PartyType.DEFENDANT2))) { - partyName = partyName.concat(" counter"); - } - if (documentType.equals(EvidenceUploadType.DOCUMENTS_REFERRED.name())) { - return getEvidenceUploadTypeWithNameFileName(fileNamePrefix, uploadEvidence.getValue()); - } else { - return generateDocName(fileNamePrefix, partyName, null, - documentType.equals(EvidenceUploadType.CASE_SUMMARY.name()) || documentType.equals( - EvidenceUploadType.SKELETON_ARGUMENT.name()) - ? uploadEvidence.getValue().getCreatedDatetime().toLocalDate() : - uploadEvidence.getValue().getDocumentIssuedDate() - ); - } } + if (documentType.equals(EvidenceUploadType.DOCUMENTS_REFERRED.name())) { + return getEvidenceUploadTypeWithNameFileName(fileNamePrefix, uploadEvidence.getValue()); + } + return generateDocName( + fileNamePrefix, + getPartyName(fileNamePrefix, party), + null, + getDateForGeneratedFileName(documentType, uploadEvidence.getValue()) + ); } private String getEvidenceUploadTypeWithNameFileName(String body, UploadEvidenceDocumentType uploadEvidence) { @@ -239,4 +175,86 @@ private String getEvidenceUploadTypeWithNameFileName(String body, UploadEvidence .format(DateTimeFormatter.ofPattern(DATE_FORMAT, Locale.UK)) ); } + + private void removePartyEntries(Map>> witnessStatementsMap, Party party) { + if (party == null) { + return; + } + if (party.getPartyName() != null) { + witnessStatementsMap.remove(party.getPartyName().trim().toLowerCase()); + } + if (party.isIndividual() && party.getIndividualFirstName() != null) { + witnessStatementsMap.remove(party.getIndividualFirstName().trim().toLowerCase()); + } + } + + private void addOtherWitnessEvidenceDocuments(List bundlingRequestDocuments, + List> witnessEvidence, + String displayName, + String documentType) { + for (int index = 0; index < witnessEvidence.size(); index++) { + UploadEvidenceWitness uploadEvidenceWitness = witnessEvidence.get(index).getValue(); + String docName = generateDocName( + displayName, + uploadEvidenceWitness.getWitnessOptionName(), + String.valueOf(index + 1), + uploadEvidenceWitness.getWitnessOptionUploadDate() + ); + bundlingRequestDocuments.add(buildBundlingRequestDoc( + docName, + uploadEvidenceWitness.getWitnessOptionDocument(), + documentType + )); + } + } + + private List> filterDocumentsForBundle(List> documents, Function documentExtractor) { + if (!featureToggleService.isAmendBundleEnabled()) { + return documents; + } + return new ArrayList<>(documents.stream() + .filter(element -> isBundledDocument(documentExtractor.apply(element.getValue()))) + .toList()); + } + + private boolean isBundledDocument(Document document) { + return document.getCategoryID() != null && !UNBUNDLED_FOLDER.equals(document.getCategoryID()); + } + + private String getExpertise(String documentType, UploadEvidenceExpert uploadEvidenceExpert) { + if (documentType.equals(EvidenceUploadType.EXPERT_REPORT.name())) { + return uploadEvidenceExpert.getExpertOptionExpertise(); + } + if (documentType.equals(EvidenceUploadType.JOINT_STATEMENT.name())) { + return uploadEvidenceExpert.getExpertOptionExpertises(); + } + return null; + } + + private String getDocumentFileNameWithoutExtension(Document document) { + String documentFileName = document.getDocumentFileName(); + return documentFileName.substring(0, documentFileName.lastIndexOf(".")); + } + + private String getPartyName(String fileNamePrefix, PartyType party) { + String partyName = party.getDisplayName(); + if (fileNamePrefix.equals(BundleFileNameList.SCHEDULE_OF_LOSS_FILE_DISPLAY_NAME.getDisplayName()) + && (party.equals(PartyType.DEFENDANT1) || party.equals(PartyType.DEFENDANT2))) { + return partyName.concat(" counter"); + } + return partyName; + } + + private java.time.LocalDate getDateForOriginalFileName(String documentType, UploadEvidenceDocumentType uploadEvidence) { + return documentType.equals(EvidenceUploadType.COSTS.name()) + ? uploadEvidence.getCreatedDatetime().toLocalDate() + : uploadEvidence.getDocumentIssuedDate(); + } + + private java.time.LocalDate getDateForGeneratedFileName(String documentType, UploadEvidenceDocumentType uploadEvidence) { + return documentType.equals(EvidenceUploadType.CASE_SUMMARY.name()) + || documentType.equals(EvidenceUploadType.SKELETON_ARGUMENT.name()) + ? uploadEvidence.getCreatedDatetime().toLocalDate() + : uploadEvidence.getDocumentIssuedDate(); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingDetailsMapper.java b/src/main/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingDetailsMapper.java index 8c47b330874..03c004dcb7c 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingDetailsMapper.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingDetailsMapper.java @@ -2,6 +2,9 @@ import uk.gov.hmcts.reform.civil.enums.dq.Language; import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.model.caseflags.FlagDetail; +import uk.gov.hmcts.reform.civil.model.common.DynamicList; +import uk.gov.hmcts.reform.civil.model.common.Element; import uk.gov.hmcts.reform.civil.model.hearingvalues.HearingLocationModel; import uk.gov.hmcts.reform.civil.model.hearingvalues.HearingWindowModel; import uk.gov.hmcts.reform.civil.model.hearingvalues.JudiciaryModel; @@ -13,6 +16,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; @@ -111,18 +115,32 @@ public static List getFacilitiesRequired(CaseData caseData) { public static String getListingComments(CaseData caseData) { String comments = getAllActiveFlags(caseData).stream() .flatMap(flags -> flags.getDetails().stream()) - .filter(flag -> flag.getValue() != null && flag.getValue().getFlagCode().equals(AUDIO_VIDEO_EVIDENCE_FLAG)) - .map(flag -> String.format(flag.getValue().getFlagComment() == null ? "%s, " : "%s: %s, ", flag.getValue().getName(), flag.getValue().getFlagComment())) + .filter(HearingDetailsMapper::isAudioVideoEvidenceFlag) + .map(HearingDetailsMapper::formatListingComment) .reduce("", String::concat) - .replaceAll("\n", " ") + .replace("\n", " ") .replaceAll("\\s+", " "); - if (comments != null && !comments.isEmpty()) { - String refactoredComment = comments.substring(0, comments.length() - 2); - return refactoredComment.length() > 200 ? refactoredComment.substring(0, 200) : refactoredComment; + return normaliseListingComments(comments); + } + + private static boolean isAudioVideoEvidenceFlag(Element flag) { + return flag.getValue() != null && AUDIO_VIDEO_EVIDENCE_FLAG.equals(flag.getValue().getFlagCode()); + } + + private static String formatListingComment(Element flag) { + return String.format(flag.getValue().getFlagComment() == null ? "%s, " : "%s: %s, ", + flag.getValue().getName(), + flag.getValue().getFlagComment()); + } + + private static String normaliseListingComments(String comments) { + if (comments.isEmpty()) { + return null; } - return null; + String refactoredComment = comments.substring(0, comments.length() - 2); + return refactoredComment.length() > 200 ? refactoredComment.substring(0, 200) : refactoredComment; } public static String getHearingRequester() { @@ -155,23 +173,39 @@ public static List getHearingChannels(String authToken, String hmctsServ log.info("Hearing method codes are not available for hmctsServiceId {} caseId {}", hmctsServiceId, caseData.getCcdCaseReference()); return null; } - if (caseData.getSdoR2SmallClaimsHearing() != null && caseData.getSdoR2SmallClaimsHearing().getMethodOfHearing() != null) { - return List.of(hearingMethodCode.get(getDynamicListValue(caseData.getSdoR2SmallClaimsHearing().getMethodOfHearing()))); - } else if (caseData.getSdoR2Trial() != null && caseData.getSdoR2Trial().getMethodOfHearing() != null) { - return List.of(hearingMethodCode.get(getDynamicListValue(caseData.getSdoR2Trial().getMethodOfHearing()))); - } else if (caseData.getHearingMethodValuesFastTrack() != null) { - return List.of(hearingMethodCode.get(getDynamicListValue(caseData.getHearingMethodValuesFastTrack()))); - } else if (caseData.getHearingMethodValuesDisposalHearing() != null) { - return List.of(hearingMethodCode.get(getDynamicListValue(caseData.getHearingMethodValuesDisposalHearing()))); - } else if (caseData.getHearingMethodValuesDisposalHearingDJ() != null) { - return List.of(hearingMethodCode.get(getDynamicListValue(caseData.getHearingMethodValuesDisposalHearingDJ()))); - } else if (caseData.getHearingMethodValuesTrialHearingDJ() != null) { - return List.of(hearingMethodCode.get(getDynamicListValue(caseData.getHearingMethodValuesTrialHearingDJ()))); - } else if (caseData.getHearingMethodValuesSmallClaims() != null) { - return List.of(hearingMethodCode.get(getDynamicListValue(caseData.getHearingMethodValuesSmallClaims()))); - } else { - return null; - } + String hearingMethod = resolveHearingMethod(caseData); + return hearingMethod != null ? List.of(hearingMethodCode.get(hearingMethod)) : null; + } + + private static String resolveHearingMethod(CaseData caseData) { + return Stream.of( + getSdoR2SmallClaimsHearingMethod(caseData), + getSdoR2TrialHearingMethod(caseData), + getDynamicListValueIfPresent(caseData.getHearingMethodValuesFastTrack()), + getDynamicListValueIfPresent(caseData.getHearingMethodValuesDisposalHearing()), + getDynamicListValueIfPresent(caseData.getHearingMethodValuesDisposalHearingDJ()), + getDynamicListValueIfPresent(caseData.getHearingMethodValuesTrialHearingDJ()), + getDynamicListValueIfPresent(caseData.getHearingMethodValuesSmallClaims()) + ) + .filter(Objects::nonNull) + .findFirst() + .orElse(null); + } + + private static String getSdoR2SmallClaimsHearingMethod(CaseData caseData) { + return caseData.getSdoR2SmallClaimsHearing() != null + ? getDynamicListValueIfPresent(caseData.getSdoR2SmallClaimsHearing().getMethodOfHearing()) + : null; + } + + private static String getSdoR2TrialHearingMethod(CaseData caseData) { + return caseData.getSdoR2Trial() != null + ? getDynamicListValueIfPresent(caseData.getSdoR2Trial().getMethodOfHearing()) + : null; + } + + private static String getDynamicListValueIfPresent(DynamicList dynamicList) { + return dynamicList != null ? getDynamicListValue(dynamicList) : null; } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingsPartyMapper.java b/src/main/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingsPartyMapper.java index 063141cdeba..4796a7e2752 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingsPartyMapper.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingsPartyMapper.java @@ -95,159 +95,46 @@ private static void addSolicitorOrgIndividuals(CaseData caseData, List parties) { + if (!YES.equals(caseData.getAddRespondent2())) { + return; + } - if (YES.equals(caseData.getAddRespondent2())) { - - // respondent 2 - parties.add(getDetailsForPartyObject(caseData.getRespondent2(), DEFENDANT_ROLE.getPartyRoleValue())); - - // respondent 2 org individuals for COMPANY/ORG PartyType - if (caseData.getRespondent2().isCompanyOROrganisation() && caseData.getRespondent2OrgIndividuals() != null) { - parties.addAll(getDetailsFor(DEFENDANT_ROLE, caseData.getRespondent2OrgIndividuals())); - } - - // respondent 2 solicitor - if (ONE_V_TWO_TWO_LEGAL_REP.equals(getMultiPartyScenario(caseData)) - && caseData.getRespondent2OrganisationPolicy().getOrganisation() != null) { - parties.add(getDetailsForSolicitorOrganisation( - caseData.getRespondent2OrganisationPolicy(), - organisationService - )); - } - - // 1v2 Same sol and defs file different response - // or 1v2 diff sol - // only def 2 files full defence - if (((ONE_V_TWO_ONE_LEGAL_REP.equals(getMultiPartyScenario(caseData)) - && NO.equals(caseData.getDefendantSingleResponseToBothClaimants())) - || ONE_V_TWO_TWO_LEGAL_REP.equals(getMultiPartyScenario(caseData))) - && (SPEC_CLAIM.equals(caseData.getCaseAccessCategory()) - ? caseData.getRespondent2ClaimResponseTypeForSpec() == RespondentResponseTypeSpec.FULL_DEFENCE - : FULL_DEFENCE.equals(caseData.getRespondent2ClaimResponseType()))) { - - // respondent 2 expert - if (caseData.getRespondent2Experts() != null - && !caseData.getRespondent2Experts().isEmpty()) { - parties.addAll(getDetailsFor(EXPERT_ROLE, caseData.getRespondent2Experts())); - } - - // respondent 2 witness - if (caseData.getRespondent2Witnesses() != null - && !caseData.getRespondent2Witnesses().isEmpty()) { - parties.addAll(getDetailsFor(WITNESS_ROLE, caseData.getRespondent2Witnesses())); - } - } - - // respondent 2 lit friend - if (caseData.getRespondent2LitigationFriend() != null) { - parties.add(getDetailsForLitigationFriendObject(caseData.getRespondent2LitigationFriend())); - } + parties.add(getDetailsForPartyObject(caseData.getRespondent2(), DEFENDANT_ROLE.getPartyRoleValue())); + addOrganisationIndividuals(parties, DEFENDANT_ROLE, caseData.getRespondent2(), caseData.getRespondent2OrgIndividuals()); + addRespondent2Solicitor(caseData, organisationService, parties); + if (shouldAddRespondent2ExpertsAndWitnesses(caseData)) { + addExpertsAndWitnesses(parties, caseData.getRespondent2Experts(), caseData.getRespondent2Witnesses()); } + addLitigationFriend(parties, caseData.getRespondent2LitigationFriend()); } private static void addRespondent1Objects(CaseData caseData, OrganisationService organisationService, List parties) { - // respondent 1 parties.add(getDetailsForPartyObject(caseData.getRespondent1(), DEFENDANT_ROLE.getPartyRoleValue())); - - // respondent 1 org individuals for COMPANY/ORG PartyType - if (caseData.getRespondent1().isCompanyOROrganisation() && caseData.getRespondent1OrgIndividuals() != null) { - parties.addAll(getDetailsFor(DEFENDANT_ROLE, caseData.getRespondent1OrgIndividuals())); - } - - // respondent 1 solicitor - if (caseData.getRespondent1OrganisationPolicy().getOrganisation() != null) { - parties.add(getDetailsForSolicitorOrganisation( - caseData.getRespondent1OrganisationPolicy(), - organisationService - )); - } - - // respondent 1 expert - if (caseData.getRespondent1Experts() != null - && !caseData.getRespondent1Experts().isEmpty()) { - parties.addAll(getDetailsFor(EXPERT_ROLE, caseData.getRespondent1Experts())); - } - - // respondent 1 witness - if (caseData.getRespondent1Witnesses() != null - && !caseData.getRespondent1Witnesses().isEmpty()) { - parties.addAll(getDetailsFor(WITNESS_ROLE, caseData.getRespondent1Witnesses())); - } - - // respondent 1 lit friend - if (caseData.getRespondent1LitigationFriend() != null) { - parties.add(getDetailsForLitigationFriendObject(caseData.getRespondent1LitigationFriend())); - } + addOrganisationIndividuals(parties, DEFENDANT_ROLE, caseData.getRespondent1(), caseData.getRespondent1OrgIndividuals()); + addSolicitorOrganisation(parties, caseData.getRespondent1OrganisationPolicy(), organisationService); + addExpertsAndWitnesses(parties, caseData.getRespondent1Experts(), caseData.getRespondent1Witnesses()); + addLitigationFriend(parties, caseData.getRespondent1LitigationFriend()); } private static void addApplicant2Objects(CaseData caseData, List parties) { if (TWO_V_ONE.equals(getMultiPartyScenario(caseData))) { - - // applicant 2 parties.add(getDetailsForPartyObject(caseData.getApplicant2(), CLAIMANT_ROLE.getPartyRoleValue())); - - // applicant 2 org individuals for COMPANY/ORG PartyType - if (caseData.getApplicant2().isCompanyOROrganisation() && caseData.getApplicant2OrgIndividuals() != null) { - parties.addAll(getDetailsFor(CLAIMANT_ROLE, caseData.getApplicant2OrgIndividuals())); - } - - // 2v1 claimant response - if different response and app 2 proceeds - if (YES.equals(caseData.getApplicant2ProceedWithClaimMultiParty2v1()) - && NO.equals(caseData.getApplicant1ProceedWithClaimMultiParty2v1()) && caseData.getApplicant2DQ() != null) { - // applicant 2 expert - if (caseData.getApplicantExperts() != null - && !caseData.getApplicantExperts().isEmpty()) { - parties.addAll(getDetailsFor(EXPERT_ROLE, caseData.getApplicantExperts())); - } - // applicant 2 witness - if (caseData.getApplicantWitnesses() != null - && !caseData.getApplicantWitnesses().isEmpty()) { - parties.addAll(getDetailsFor(WITNESS_ROLE, caseData.getApplicantWitnesses())); - } - } - - // applicant 2 lit friend - if (caseData.getApplicant2LitigationFriend() != null) { - parties.add(getDetailsForLitigationFriendObject(caseData.getApplicant2LitigationFriend())); + addOrganisationIndividuals(parties, CLAIMANT_ROLE, caseData.getApplicant2(), caseData.getApplicant2OrgIndividuals()); + if (shouldAddApplicant2ExpertsAndWitnesses(caseData)) { + addExpertsAndWitnesses(parties, caseData.getApplicantExperts(), caseData.getApplicantWitnesses()); } + addLitigationFriend(parties, caseData.getApplicant2LitigationFriend()); } } private static void addApplicant1Objects(CaseData caseData, OrganisationService organisationService, List parties) { - // applicant 1 parties.add(getDetailsForPartyObject(caseData.getApplicant1(), CLAIMANT_ROLE.getPartyRoleValue())); - - // applicant 1 org individuals for COMPANY/ORG PartyType - if (caseData.getApplicant1().isCompanyOROrganisation() && caseData.getApplicant1OrgIndividuals() != null) { - parties.addAll(getDetailsFor(CLAIMANT_ROLE, caseData.getApplicant1OrgIndividuals())); - } - - // applicant 1 solicitor - if (caseData.getApplicant1OrganisationPolicy().getOrganisation() != null) { - parties.add(getDetailsForSolicitorOrganisation( - caseData.getApplicant1OrganisationPolicy(), - organisationService - )); - } - + addOrganisationIndividuals(parties, CLAIMANT_ROLE, caseData.getApplicant1(), caseData.getApplicant1OrgIndividuals()); + addSolicitorOrganisation(parties, caseData.getApplicant1OrganisationPolicy(), organisationService); if (caseData.getApplicant1DQ() != null) { - // applicant 1 expert - if (caseData.getApplicantExperts() != null - && !caseData.getApplicantExperts().isEmpty()) { - parties.addAll(getDetailsFor(EXPERT_ROLE, caseData.getApplicantExperts())); - } - - // applicant 1 witness - if (caseData.getApplicantWitnesses() != null - && !caseData.getApplicantWitnesses().isEmpty()) { - parties.addAll(getDetailsFor(WITNESS_ROLE, caseData.getApplicantWitnesses())); - } - } - - // applicant 1 lit friend - if (caseData.getApplicant1LitigationFriend() != null) { - parties.add(getDetailsForLitigationFriendObject(caseData.getApplicant1LitigationFriend())); + addExpertsAndWitnesses(parties, caseData.getApplicantExperts(), caseData.getApplicantWitnesses()); } + addLitigationFriend(parties, caseData.getApplicant1LitigationFriend()); } private static PartyDetailsModel getDetailsForPartyObject(Party party, String partyRole) { @@ -323,6 +210,70 @@ private static PartyDetailsModel getDetailsForSolicitorOrganisation(Organisation null); } + private static void addOrganisationIndividuals(List parties, + PartyRole partyRole, + Party party, + List> hearingIndividuals) { + if (party.isCompanyOROrganisation() && hearingIndividuals != null) { + parties.addAll(getDetailsFor(partyRole, hearingIndividuals)); + } + } + + private static void addSolicitorOrganisation(List parties, + OrganisationPolicy organisationPolicy, + OrganisationService organisationService) { + if (organisationPolicy != null && organisationPolicy.getOrganisation() != null) { + parties.add(getDetailsForSolicitorOrganisation(organisationPolicy, organisationService)); + } + } + + private static void addExpertsAndWitnesses(List parties, + List> experts, + List> witnesses) { + if (experts != null && !experts.isEmpty()) { + parties.addAll(getDetailsFor(EXPERT_ROLE, experts)); + } + if (witnesses != null && !witnesses.isEmpty()) { + parties.addAll(getDetailsFor(WITNESS_ROLE, witnesses)); + } + } + + private static void addLitigationFriend(List parties, LitigationFriend litigationFriend) { + if (litigationFriend != null) { + parties.add(getDetailsForLitigationFriendObject(litigationFriend)); + } + } + + private static boolean shouldAddApplicant2ExpertsAndWitnesses(CaseData caseData) { + return YES.equals(caseData.getApplicant2ProceedWithClaimMultiParty2v1()) + && NO.equals(caseData.getApplicant1ProceedWithClaimMultiParty2v1()) + && caseData.getApplicant2DQ() != null; + } + + private static void addRespondent2Solicitor(CaseData caseData, + OrganisationService organisationService, + List parties) { + if (ONE_V_TWO_TWO_LEGAL_REP.equals(getMultiPartyScenario(caseData))) { + addSolicitorOrganisation(parties, caseData.getRespondent2OrganisationPolicy(), organisationService); + } + } + + private static boolean shouldAddRespondent2ExpertsAndWitnesses(CaseData caseData) { + return isRespondent2RepresentationEligible(caseData) && isRespondent2FullDefence(caseData); + } + + private static boolean isRespondent2RepresentationEligible(CaseData caseData) { + return (ONE_V_TWO_ONE_LEGAL_REP.equals(getMultiPartyScenario(caseData)) + && NO.equals(caseData.getDefendantSingleResponseToBothClaimants())) + || ONE_V_TWO_TWO_LEGAL_REP.equals(getMultiPartyScenario(caseData)); + } + + private static boolean isRespondent2FullDefence(CaseData caseData) { + return SPEC_CLAIM.equals(caseData.getCaseAccessCategory()) + ? caseData.getRespondent2ClaimResponseTypeForSpec() == RespondentResponseTypeSpec.FULL_DEFENCE + : FULL_DEFENCE.equals(caseData.getRespondent2ClaimResponseType()); + } + @SuppressWarnings("java:S107") public static PartyDetailsModel buildIndividualPartyObject(String partyId, String firstName, String lastName, String partyName, String partyRole, @@ -346,20 +297,14 @@ public static PartyDetailsModel buildIndividualPartyObject(String partyId, Strin individualDetails.setCustodyStatus(getCustodyStatus(flagDetails)); individualDetails.setOtherReasonableAdjustmentDetails(getOtherReasonableAdjustmentDetails(flagDetails)); - List unavailabilityRanges = null; - if (unavailableDates != null) { - unavailabilityRanges = unwrapElements(unavailableDates).stream() - .map(date -> mapUnAvailableDateToRange(date)) - .toList(); - } - - PartyDetailsModel partyDetails = new PartyDetailsModel(); - partyDetails.setPartyID(partyId); - partyDetails.setPartyType(IND); - partyDetails.setPartyName(partyName); - partyDetails.setPartyRole(partyRole); + PartyDetailsModel partyDetails = buildBasePartyDetails( + partyId, + IND, + partyName, + partyRole, + unavailableDates + ); partyDetails.setIndividualDetails(individualDetails); - partyDetails.setUnavailabilityRanges(unavailabilityRanges); return partyDetails; } @@ -373,25 +318,42 @@ public static PartyDetailsModel buildOrganisationPartyObject(String partyId, Str organisationDetails.setOrganisationType(ORG.getLabel()); organisationDetails.setCftOrganisationID(cftOrganisationID); - List unavailabilityRanges = null; - if (unavailableDates != null) { - unavailabilityRanges = unwrapElements(unavailableDates).stream() - .map(date -> mapUnAvailableDateToRange(date)) - .toList(); - } + PartyDetailsModel partyDetails = buildBasePartyDetails( + partyId, + ORG, + name, + partyRole, + unavailableDates + ); + partyDetails.setOrganisationDetails(organisationDetails); + + return partyDetails; + } + static final String DATE_STRING = "yyyy-MM-dd"; + + private static PartyDetailsModel buildBasePartyDetails(String partyId, + uk.gov.hmcts.reform.civil.enums.hearing.PartyType partyType, + String partyName, + String partyRole, + List> unavailableDates) { PartyDetailsModel partyDetails = new PartyDetailsModel(); partyDetails.setPartyID(partyId); - partyDetails.setPartyType(ORG); - partyDetails.setPartyName(name); + partyDetails.setPartyType(partyType); + partyDetails.setPartyName(partyName); partyDetails.setPartyRole(partyRole); - partyDetails.setOrganisationDetails(organisationDetails); - partyDetails.setUnavailabilityRanges(unavailabilityRanges); - + partyDetails.setUnavailabilityRanges(getUnavailabilityRanges(unavailableDates)); return partyDetails; } - static final String DATE_STRING = "yyyy-MM-dd"; + private static List getUnavailabilityRanges(List> unavailableDates) { + if (unavailableDates == null) { + return emptyList(); + } + return unwrapElements(unavailableDates).stream() + .map(HearingsPartyMapper::mapUnAvailableDateToRange) + .toList(); + } private static UnavailabilityRangeModel mapUnAvailableDateToRange(UnavailableDate date) { String unavailableFrom = SINGLE_DATE.equals(date.getUnavailableDateType()) ? date.getDate() diff --git a/src/main/java/uk/gov/hmcts/reform/civil/validation/UnavailableDateValidator.java b/src/main/java/uk/gov/hmcts/reform/civil/validation/UnavailableDateValidator.java index 8e08156c49d..387fc0f2db6 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/validation/UnavailableDateValidator.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/validation/UnavailableDateValidator.java @@ -1,6 +1,5 @@ package uk.gov.hmcts.reform.civil.validation; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import uk.gov.hmcts.reform.civil.enums.dq.UnavailableDateType; import uk.gov.hmcts.reform.civil.model.UnavailableDate; @@ -14,19 +13,20 @@ import java.util.List; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; -import jakarta.validation.Validator; import static java.util.Collections.emptyList; import static java.util.Optional.ofNullable; import static uk.gov.hmcts.reform.civil.enums.YesOrNo.YES; @Component -@RequiredArgsConstructor public class UnavailableDateValidator implements ConstraintValidator { private static final String DETAILS_OF_UNAVAILABLE_DATE_REQUIRED = "Details of unavailable date required"; - private final Validator validator; + private static final String DATES_MUST_BE_WITHIN_NEXT_12_MONTHS = "Dates must be within the next 12 months."; + private static final String UNAVAILABLE_DATE_CANNOT_BE_PAST = "Unavailable Date cannot be past date"; + private static final String FROM_DATE_SHOULD_BE_LESS_THAN_TO_DATE = "From Date should be less than To Date"; + private static final String FIRST_PAYMENT_DATE_ERROR = "Date of first payment must be today or within the next 12 months"; @Override public boolean isValid(UnavailableDate value, ConstraintValidatorContext context) { @@ -115,44 +115,68 @@ private boolean isSmallClaimHearingNullOrEmpty(SmallClaimHearing smallClaimHeari private List dateValidation(List> unavailableDate) { List errors = new ArrayList<>(); - unavailableDate.forEach(element -> { - UnavailableDate unavailableDateElement = element.getValue(); - if (UnavailableDateType.SINGLE_DATE == unavailableDateElement.getUnavailableDateType() - && unavailableDateElement.getDate() == null) { - errors.add(DETAILS_OF_UNAVAILABLE_DATE_REQUIRED); - } - if (UnavailableDateType.DATE_RANGE == unavailableDateElement.getUnavailableDateType()) { - if (unavailableDateElement.getFromDate() == null - || unavailableDateElement.getToDate() == null) { - errors.add(DETAILS_OF_UNAVAILABLE_DATE_REQUIRED); - } - } - if (checkOneYearValidation(unavailableDateElement.getDate()) - || checkOneYearValidation(unavailableDateElement.getFromDate()) - || checkOneYearValidation(unavailableDateElement.getToDate()) - ) { - errors.add("Dates must be within the next 12 months."); - } else if (checkPastDateValidation(unavailableDateElement.getDate()) - || - checkPastDateValidation(unavailableDateElement.getToDate()) - || - checkPastDateValidation(unavailableDateElement.getFromDate())) { - errors.add("Unavailable Date cannot be past date"); - } else if (unavailableDateElement.getFromDate() != null - && unavailableDateElement.getToDate() != null - && unavailableDateElement.getFromDate() - .isAfter(unavailableDateElement.getToDate())) { - errors.add("From Date should be less than To Date"); - } - }); + unavailableDate.forEach(element -> validateUnavailableDate(errors, element.getValue())); return errors; } + private void validateUnavailableDate(List errors, UnavailableDate unavailableDate) { + addMissingDateError(errors, unavailableDate); + addDateRangeErrors(errors, unavailableDate); + } + + private void addMissingDateError(List errors, UnavailableDate unavailableDate) { + if (hasMissingDate(unavailableDate)) { + errors.add(DETAILS_OF_UNAVAILABLE_DATE_REQUIRED); + } + } + + private void addDateRangeErrors(List errors, UnavailableDate unavailableDate) { + if (hasDateBeyondOneYear(unavailableDate)) { + errors.add(DATES_MUST_BE_WITHIN_NEXT_12_MONTHS); + } else if (hasPastDate(unavailableDate)) { + errors.add(UNAVAILABLE_DATE_CANNOT_BE_PAST); + } else if (hasInvalidDateRangeOrder(unavailableDate)) { + errors.add(FROM_DATE_SHOULD_BE_LESS_THAN_TO_DATE); + } + } + + private boolean hasMissingDate(UnavailableDate unavailableDate) { + return hasMissingSingleDate(unavailableDate) || hasMissingDateRange(unavailableDate); + } + + private boolean hasMissingSingleDate(UnavailableDate unavailableDate) { + return UnavailableDateType.SINGLE_DATE == unavailableDate.getUnavailableDateType() + && unavailableDate.getDate() == null; + } + + private boolean hasMissingDateRange(UnavailableDate unavailableDate) { + return UnavailableDateType.DATE_RANGE == unavailableDate.getUnavailableDateType() + && (unavailableDate.getFromDate() == null || unavailableDate.getToDate() == null); + } + + private boolean hasDateBeyondOneYear(UnavailableDate unavailableDate) { + return checkOneYearValidation(unavailableDate.getDate()) + || checkOneYearValidation(unavailableDate.getFromDate()) + || checkOneYearValidation(unavailableDate.getToDate()); + } + + private boolean hasPastDate(UnavailableDate unavailableDate) { + return checkPastDateValidation(unavailableDate.getDate()) + || checkPastDateValidation(unavailableDate.getToDate()) + || checkPastDateValidation(unavailableDate.getFromDate()); + } + + private boolean hasInvalidDateRangeOrder(UnavailableDate unavailableDate) { + return unavailableDate.getFromDate() != null + && unavailableDate.getToDate() != null + && unavailableDate.getFromDate().isAfter(unavailableDate.getToDate()); + } + public List validateFuturePaymentDate(LocalDate paymentDate) { List errors = new ArrayList<>(); if (checkOneYearValidation(paymentDate) || checkPastDateValidation(paymentDate)) { - errors.add("Date of first payment must be today or within the next 12 months"); + errors.add(FIRST_PAYMENT_DATE_ERROR); } return errors; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/validation/ValidateEmailService.java b/src/main/java/uk/gov/hmcts/reform/civil/validation/ValidateEmailService.java index 5d53c118f82..6c8026d695d 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/validation/ValidateEmailService.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/validation/ValidateEmailService.java @@ -45,74 +45,110 @@ public List validate(String email) { see https://github.com/alphagov/notifications-utils/blob/master/notifications_utils/recipients.py#L494-L534 */ private boolean isValid(String email) { - if (isEmpty(email)) { log.warn("Email is null or empty"); return false; } final String emailAddress = StringUtils.trim(email); + final String username = emailAddress.split("@")[0]; + Matcher emailMatcher = getValidEmailMatcher(emailAddress, username); + return emailMatcher != null && hasValidHostname(emailMatcher.group(1)); + } - if (emailAddress.startsWith(".")) { - log.warn("Email begins with ."); + private Matcher getValidEmailMatcher(String emailAddress, String username) { + if (hasInvalidEmailAddress(emailAddress, username)) { + return null; + } + + Matcher emailMatcher = EMAIL_PATTERN.matcher(emailAddress); + return matchesEmailPattern(emailMatcher) ? emailMatcher : null; + } + + private boolean hasInvalidEmailAddress(String emailAddress, String username) { + return hasInvalidUsernameFormat(emailAddress, username) + || exceedsLengthLimits(username, emailAddress) + || containsInvalidSequences(emailAddress); + } + + private boolean hasValidHostname(String hostname) { + String asciiHostname = toAsciiHostname(hostname); + if (asciiHostname == null) { return false; } - final String username = emailAddress.split("@")[0]; + String[] hostParts = split(asciiHostname, "."); + return !hasInvalidHostname(asciiHostname, hostParts) + && hasValidHostParts(hostParts) + && hasValidTopLevelDomain(hostParts[hostParts.length - 1]); + } + private boolean hasInvalidUsernameFormat(String emailAddress, String username) { + if (emailAddress.startsWith(".")) { + log.warn("Email begins with ."); + return true; + } if (username.endsWith(".")) { log.warn("Username ends with ."); - return false; + return true; } + return false; + } + private boolean exceedsLengthLimits(String username, String emailAddress) { if (username.length() > USERNAME_MAX_LENGTH) { log.warn("Email username is longer than {} characters", USERNAME_MAX_LENGTH); - return false; + return true; } - if (emailAddress.length() > EMAIL_MAX_LENGTH) { log.warn("Email is longer than {} characters", EMAIL_MAX_LENGTH); - return false; + return true; } + return false; + } + private boolean containsInvalidSequences(String emailAddress) { if (emailAddress.contains("..")) { log.warn("Email contains .."); - return false; + return true; } - if (emailAddress.contains("'")) { log.warn("Email contains apostrophe"); - return false; + return true; } + return false; + } - final Matcher emailMatcher = EMAIL_PATTERN.matcher(emailAddress); - + private boolean matchesEmailPattern(Matcher emailMatcher) { if (!emailMatcher.matches()) { log.warn("Email does not match pattern"); return false; } + return true; + } - String hostname = emailMatcher.group(1); - + private String toAsciiHostname(String hostname) { try { - hostname = toASCII(toUnicode(hostname)); + return toASCII(toUnicode(hostname)); } catch (Exception e) { log.warn("Email hostname can not be converted to ascii"); - return false; + return null; } + } - final String[] hostParts = split(hostname, "."); - + private boolean hasInvalidHostname(String hostname, String[] hostParts) { if (hostname.length() > HOST_MAX_LENGTH) { log.warn("Email hostname is longer than {} characters", HOST_MAX_LENGTH); - return false; + return true; } - if (hostParts.length < 2) { log.warn("Email hostname parts is {}", hostParts.length); - return false; + return true; } + return false; + } + private boolean hasValidHostParts(String[] hostParts) { for (String hostPart : hostParts) { if (hostPart.length() > HOST_PART_MAX_LENGTH) { log.warn("Email hostname part is longer than {}", HOST_PART_MAX_LENGTH); @@ -124,12 +160,14 @@ private boolean isValid(String email) { return false; } } + return true; + } - if (!TLD_PATTERN.matcher(hostParts[hostParts.length - 1]).matches()) { + private boolean hasValidTopLevelDomain(String topLevelDomain) { + if (!TLD_PATTERN.matcher(topLevelDomain).matches()) { log.warn("Email top level domain does not match pattern"); return false; } - return true; } } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/helpers/bundle/BundleFileNameHelperTest.java b/src/test/java/uk/gov/hmcts/reform/civil/helpers/bundle/BundleFileNameHelperTest.java index 3965bc8d117..135aee87224 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/helpers/bundle/BundleFileNameHelperTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/helpers/bundle/BundleFileNameHelperTest.java @@ -20,7 +20,7 @@ public class BundleFileNameHelperTest { - private CaseData caseData = CaseData.builder().ccdCaseReference(1L) + private final CaseData caseData = CaseData.builder().ccdCaseReference(1L) .documentWitnessStatement(getWitnessDocs()) .documentWitnessSummary(getWitnessDocs()) .documentHearsayNotice(getWitnessDocs()) @@ -132,7 +132,7 @@ private List> getOtherDocs() { otherEvidenceDocs.add(ElementUtils.element(new UploadEvidenceDocumentType() .setDocumentUpload(new Document().setDocumentBinaryUrl("Test") .setDocumentFileName("Test")) - .setTypeOfDocument(TypeOfDocDocumentaryEvidenceOfTrial.CHRONOLOGY.getDisplayNames().get(0)) + .setTypeOfDocument(TypeOfDocDocumentaryEvidenceOfTrial.CHRONOLOGY.getDisplayNames().getFirst()) .setDocumentIssuedDate(LocalDate.of(2023, 1, 12)))); return otherEvidenceDocs; } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/helpers/bundle/ConversionToBundleRequestDocsTest.java b/src/test/java/uk/gov/hmcts/reform/civil/helpers/bundle/ConversionToBundleRequestDocsTest.java index 6c5e463a71a..e4a5371f7b2 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/helpers/bundle/ConversionToBundleRequestDocsTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/helpers/bundle/ConversionToBundleRequestDocsTest.java @@ -15,6 +15,7 @@ import uk.gov.hmcts.reform.civil.service.FeatureToggleService; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -43,8 +44,8 @@ void shouldConvertOtherWitnessEvidenceToBundleRequestDocs() { .setType(Party.Type.INDIVIDUAL); Document witnessDocument = new Document() - .setDocumentUrl("http://example.com/document.pdf") - .setDocumentBinaryUrl("http://example.com/documentBinary.pdf") + .setDocumentUrl("https://example.com/document.pdf") + .setDocumentBinaryUrl("https://example.com/documentBinary.pdf") .setDocumentFileName("document.pdf") .setCategoryID("SomeCategoryID"); @@ -73,8 +74,8 @@ void shouldConvertWitnessEvidenceToBundleRequestDocs() { PartyType partyType = PartyType.CLAIMANT1; Document witnessDocument = new Document() - .setDocumentUrl("http://example.com/document.pdf") - .setDocumentBinaryUrl("http://example.com/documentBinary.pdf") + .setDocumentUrl("https://example.com/document.pdf") + .setDocumentBinaryUrl("https://example.com/documentBinary.pdf") .setDocumentFileName("document.pdf") .setCategoryID("SomeCategoryID"); @@ -100,8 +101,8 @@ void shouldConvertEvidenceUploadToBundleRequestDocs() { PartyType partyType = PartyType.CLAIMANT1; Document document = new Document() - .setDocumentUrl("http://example.com/document.pdf") - .setDocumentBinaryUrl("http://example.com/documentBinary.pdf") + .setDocumentUrl("https://example.com/document.pdf") + .setDocumentBinaryUrl("https://example.com/documentBinary.pdf") .setDocumentFileName("document.pdf") .setCategoryID("SomeCategoryID"); @@ -127,5 +128,57 @@ void shouldConvertEvidenceUploadToBundleRequestDocs() { assertNotNull(result); assertEquals(2, result.size()); } -} + @Test + void shouldUseOriginalDocumentFileNameWhenRequested() { + String fileNamePrefix = "DOC_FILE_NAME"; + String documentType = EvidenceUploadType.COSTS.name(); + PartyType partyType = PartyType.CLAIMANT1; + + Document document = new Document() + .setDocumentUrl("https://example.com/document.pdf") + .setDocumentBinaryUrl("https://example.com/documentBinary.pdf") + .setDocumentFileName("document.pdf") + .setCategoryID("SomeCategoryID"); + + UploadEvidenceDocumentType uploadEvidenceDocumentType = new UploadEvidenceDocumentType() + .setDocumentIssuedDate(LocalDate.of(2023, 4, 24)) + .setDocumentUpload(document); + + List> listOfUploadDocumentType = + List.of(new Element().setValue(uploadEvidenceDocumentType)); + + List result = conversionToBundleRequestDocs.covertEvidenceUploadTypeToBundleRequestDocs( + listOfUploadDocumentType, fileNamePrefix, documentType, partyType); + + assertNotNull(result); + assertEquals("document", result.getFirst().getDocumentFileName()); + } + + @Test + void shouldUseOriginalDocumentFileNameWithDateWhenRequested() { + String fileNamePrefix = "DOC_FILE_NAME %s"; + String documentType = EvidenceUploadType.COSTS.name(); + PartyType partyType = PartyType.CLAIMANT1; + + Document document = new Document() + .setDocumentUrl("https://example.com/document.pdf") + .setDocumentBinaryUrl("https://example.com/documentBinary.pdf") + .setDocumentFileName("document.pdf") + .setCategoryID("SomeCategoryID"); + + UploadEvidenceDocumentType uploadEvidenceDocumentType = new UploadEvidenceDocumentType() + .setDocumentIssuedDate(LocalDate.of(2023, 4, 24)) + .setCreatedDatetime(LocalDateTime.of(2023, 4, 30, 10, 0)) + .setDocumentUpload(document); + + List> listOfUploadDocumentType = + List.of(new Element().setValue(uploadEvidenceDocumentType)); + + List result = conversionToBundleRequestDocs.covertEvidenceUploadTypeToBundleRequestDocs( + listOfUploadDocumentType, fileNamePrefix, documentType, partyType); + + assertNotNull(result); + assertEquals("document 30/04/2023", result.getFirst().getDocumentFileName()); + } +} diff --git a/src/test/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingsPartyMapperTest.java b/src/test/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingsPartyMapperTest.java index a8829daf19a..e15e906b6f4 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingsPartyMapperTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/helpers/hearingsmappings/HearingsPartyMapperTest.java @@ -22,8 +22,8 @@ import java.util.List; import java.util.Optional; +import static java.util.Collections.emptyList; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.util.Lists.emptyList; import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.civil.enums.MultiPartyScenario.ONE_V_TWO_TWO_LEGAL_REP; import static uk.gov.hmcts.reform.civil.enums.hearing.PartyType.IND; @@ -90,14 +90,12 @@ private UnavailabilityRangeModel buildUnavailabilityDateRange(LocalDate from, Lo return unavailabilityRangeModel; } - private CaseData rollUpUnavailableDateRespondent(CaseData caseData) { + private void rollUpUnavailableDateRespondent(CaseData caseData) { UnavailabilityDatesUtils.rollUpUnavailabilityDatesForRespondent(caseData); - return caseData; } - private CaseData rollUpUnavailableDateApplicant(CaseData caseData) { + private void rollUpUnavailableDateApplicant(CaseData caseData) { UnavailabilityDatesUtils.rollUpUnavailabilityDatesForApplicant(caseData); - return caseData; } @Test @@ -106,7 +104,7 @@ void shouldBuildIndividualDetails_whenClaimantIsIndividualRespondentSoleTrader() .atStateApplicantRespondToDefenceAndProceed() .applicant1DQWithUnavailableDate() .build(); - caseData = rollUpUnavailableDateApplicant(caseData); + rollUpUnavailableDateApplicant(caseData); PartyDetailsModel applicantPartyDetails = buildExpectedIndividualPartyDetails( "app-1-party-id", @@ -122,8 +120,7 @@ void shouldBuildIndividualDetails_whenClaimantIsIndividualRespondentSoleTrader() PartyDetailsModel applicantSolicitorParty = buildExpectedOrganisationPartyObject( APPLICANT_LR_ORG_NAME, - LEGAL_REP_ROLE, - APPLICANT_ORG_ID + APPLICANT_ORG_ID ); PartyDetailsModel respondentPartyDetails = buildExpectedIndividualPartyDetails( @@ -138,8 +135,7 @@ void shouldBuildIndividualDetails_whenClaimantIsIndividualRespondentSoleTrader() PartyDetailsModel respondentSolicitorParty = buildExpectedOrganisationPartyObject( RESPONDENT_ONE_LR_ORG_NAME, - LEGAL_REP_ROLE, - RESPONDENT_ONE_ORG_ID + RESPONDENT_ONE_ORG_ID ); List expected = new ArrayList<>(); @@ -162,7 +158,7 @@ void shouldBuildIndividualDetails_withClaimantLRIndividuals() { .applicant1DQWithUnavailableDate() .addApplicantLRIndividual("claimant", "individual") .build(); - caseData = rollUpUnavailableDateApplicant(caseData); + rollUpUnavailableDateApplicant(caseData); PartyDetailsModel applicantPartyDetails = buildExpectedIndividualPartyDetails( "app-1-party-id", @@ -188,7 +184,6 @@ void shouldBuildIndividualDetails_withClaimantLRIndividuals() { PartyDetailsModel applicantSolicitorParty = buildExpectedOrganisationPartyObject( APPLICANT_LR_ORG_NAME, - LEGAL_REP_ROLE, APPLICANT_ORG_ID ); @@ -204,7 +199,6 @@ void shouldBuildIndividualDetails_withClaimantLRIndividuals() { PartyDetailsModel respondentSolicitorParty = buildExpectedOrganisationPartyObject( RESPONDENT_ONE_LR_ORG_NAME, - LEGAL_REP_ROLE, RESPONDENT_ONE_ORG_ID ); @@ -230,7 +224,7 @@ void shouldBuildIndividualDetails_withRespondentsLRIndividuals() { .addRespondent1LRIndividual("respondent1", "individual") .addRespondent2LRIndividual("respondent2", "individual") .build(); - caseData = rollUpUnavailableDateApplicant(caseData); + rollUpUnavailableDateApplicant(caseData); PartyDetailsModel applicantPartyDetails = buildExpectedIndividualPartyDetails( "app-1-party-id", @@ -246,7 +240,6 @@ void shouldBuildIndividualDetails_withRespondentsLRIndividuals() { PartyDetailsModel applicantSolicitorParty = buildExpectedOrganisationPartyObject( APPLICANT_LR_ORG_NAME, - LEGAL_REP_ROLE, APPLICANT_ORG_ID ); @@ -282,7 +275,6 @@ void shouldBuildIndividualDetails_withRespondentsLRIndividuals() { PartyDetailsModel respondentSolicitorParty = buildExpectedOrganisationPartyObject( RESPONDENT_ONE_LR_ORG_NAME, - LEGAL_REP_ROLE, RESPONDENT_ONE_ORG_ID ); @@ -320,7 +312,7 @@ void shouldBuildDetails_whenClaimantIsCompanyAndRespondentIsOrganisationWithIndi .setType(ORGANISATION)) .build(); - caseData = rollUpUnavailableDateRespondent(caseData); + rollUpUnavailableDateRespondent(caseData); PartyDetailsModel applicantPartyDetails = buildExpectedOrganisationPartyObject( APPLICANT_PARTY_ID, @@ -331,8 +323,7 @@ void shouldBuildDetails_whenClaimantIsCompanyAndRespondentIsOrganisationWithIndi PartyDetailsModel applicantSolicitorParty = buildExpectedOrganisationPartyObject( APPLICANT_LR_ORG_NAME, - LEGAL_REP_ROLE, - APPLICANT_ORG_ID + APPLICANT_ORG_ID ); PartyDetailsModel respondentPartyDetails = buildExpectedOrganisationPartyObject( @@ -345,8 +336,7 @@ void shouldBuildDetails_whenClaimantIsCompanyAndRespondentIsOrganisationWithIndi PartyDetailsModel respondentSolicitorParty = buildExpectedOrganisationPartyObject( RESPONDENT_ONE_LR_ORG_NAME, - LEGAL_REP_ROLE, - RESPONDENT_ONE_ORG_ID + RESPONDENT_ONE_ORG_ID ); PartyDetailsModel applicant1HearingAttendees = buildExpectedIndividualPartyDetails( @@ -406,8 +396,7 @@ void shouldBuildPartyDetails_whenClaimantResponds1v1() { PartyDetailsModel applicantSolicitorParty = buildExpectedOrganisationPartyObject( APPLICANT_LR_ORG_NAME, - LEGAL_REP_ROLE, - APPLICANT_ORG_ID + APPLICANT_ORG_ID ); PartyDetailsModel applicantExpert = buildExpectedIndividualPartyDetails( @@ -452,8 +441,7 @@ void shouldBuildPartyDetails_whenClaimantResponds1v1() { PartyDetailsModel respondentSolicitorParty = buildExpectedOrganisationPartyObject( RESPONDENT_ONE_LR_ORG_NAME, - LEGAL_REP_ROLE, - RESPONDENT_ONE_ORG_ID + RESPONDENT_ONE_ORG_ID ); PartyDetailsModel respondent1Expert = buildExpectedIndividualPartyDetails( @@ -534,8 +522,7 @@ void shouldBuildPartyDetails_whenClaimantResponds2v1App1NotProceedApp2Proceeds() PartyDetailsModel applicantSolicitorParty = buildExpectedOrganisationPartyObject( APPLICANT_LR_ORG_NAME, - LEGAL_REP_ROLE, - APPLICANT_ORG_ID + APPLICANT_ORG_ID ); PartyDetailsModel applicant2PartyDetails = buildExpectedOrganisationPartyObject( @@ -607,8 +594,7 @@ void shouldBuildPartyDetails_whenClaimantResponds2v1App1NotProceedApp2Proceeds() PartyDetailsModel respondentSolicitorParty = buildExpectedOrganisationPartyObject( RESPONDENT_ONE_LR_ORG_NAME, - LEGAL_REP_ROLE, - RESPONDENT_ONE_ORG_ID + RESPONDENT_ONE_ORG_ID ); PartyDetailsModel respondent1Expert = buildExpectedIndividualPartyDetails( @@ -693,8 +679,7 @@ void shouldBuildPartyDetails_whenClaimantResponds1v2DS() { PartyDetailsModel applicantSolicitorParty = buildExpectedOrganisationPartyObject( APPLICANT_LR_ORG_NAME, - LEGAL_REP_ROLE, - APPLICANT_ORG_ID + APPLICANT_ORG_ID ); PartyDetailsModel applicantExpert = buildExpectedIndividualPartyDetails( @@ -739,8 +724,7 @@ void shouldBuildPartyDetails_whenClaimantResponds1v2DS() { PartyDetailsModel respondentSolicitorParty = buildExpectedOrganisationPartyObject( RESPONDENT_ONE_LR_ORG_NAME, - LEGAL_REP_ROLE, - RESPONDENT_ONE_ORG_ID + RESPONDENT_ONE_ORG_ID ); PartyDetailsModel respondent1Expert = buildExpectedIndividualPartyDetails( @@ -782,8 +766,7 @@ void shouldBuildPartyDetails_whenClaimantResponds1v2DS() { PartyDetailsModel respondent2SolicitorParty = buildExpectedOrganisationPartyObject( RESPONDENT_TWO_LR_ORG_NAME, - LEGAL_REP_ROLE, - RESPONDENT_TWO_ORG_ID + RESPONDENT_TWO_ORG_ID ); PartyDetailsModel respondent2Expert = buildExpectedIndividualPartyDetails( @@ -874,8 +857,7 @@ void shouldBuildPartyDetails_whenClaimantResponds1v2SS() { PartyDetailsModel applicantSolicitorParty = buildExpectedOrganisationPartyObject( APPLICANT_LR_ORG_NAME, - LEGAL_REP_ROLE, - APPLICANT_ORG_ID + APPLICANT_ORG_ID ); PartyDetailsModel applicantLitFriend = buildExpectedIndividualPartyDetails( @@ -900,8 +882,7 @@ void shouldBuildPartyDetails_whenClaimantResponds1v2SS() { PartyDetailsModel respondentSolicitorParty = buildExpectedOrganisationPartyObject( RESPONDENT_ONE_LR_ORG_NAME, - LEGAL_REP_ROLE, - RESPONDENT_ONE_ORG_ID + RESPONDENT_ONE_ORG_ID ); PartyDetailsModel respondent1LitFriend = buildExpectedIndividualPartyDetails( @@ -1036,8 +1017,7 @@ void shouldBuildPartyDetails_whenClaimantResponds1v1_nullOrg() { PartyDetailsModel respondentSolicitorParty = buildExpectedOrganisationPartyObject( RESPONDENT_ONE_LR_ORG_NAME, - LEGAL_REP_ROLE, - RESPONDENT_ONE_ORG_ID + RESPONDENT_ONE_ORG_ID ); PartyDetailsModel respondent1Expert = buildExpectedIndividualPartyDetails( @@ -1113,7 +1093,7 @@ private PartyDetailsModel buildExpectedIndividualPartyDetails(String partyId, St partyDetails.setIndividualDetails(individualDetails); partyDetails.setOrganisationDetails(null); partyDetails.setUnavailabilityDOW(null); - partyDetails.setUnavailabilityRanges(null); + partyDetails.setUnavailabilityRanges(emptyList()); partyDetails.setHearingSubChannel(null); return partyDetails; } @@ -1135,14 +1115,13 @@ private PartyDetailsModel buildExpectedOrganisationPartyObject(String partyId, partyDetails.setIndividualDetails(null); partyDetails.setOrganisationDetails(organisationDetails); partyDetails.setUnavailabilityDOW(null); - partyDetails.setUnavailabilityRanges(null); + partyDetails.setUnavailabilityRanges(emptyList()); partyDetails.setHearingSubChannel(null); return partyDetails; } private PartyDetailsModel buildExpectedOrganisationPartyObject(String name, - String partyRole, String cftOrganisationID) { - return buildExpectedOrganisationPartyObject(cftOrganisationID, name, partyRole, cftOrganisationID); + return buildExpectedOrganisationPartyObject(cftOrganisationID, name, HearingsPartyMapperTest.LEGAL_REP_ROLE, cftOrganisationID); } } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/service/hearings/HearingValuesServiceTest.java b/src/test/java/uk/gov/hmcts/reform/civil/service/hearings/HearingValuesServiceTest.java index 3fa62e7968a..5543d3d154b 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/service/hearings/HearingValuesServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/service/hearings/HearingValuesServiceTest.java @@ -1,5 +1,6 @@ package uk.gov.hmcts.reform.civil.service.hearings; +import static java.util.Collections.emptyList; import static org.assertj.core.api.Assertions.assertThat; import com.fasterxml.jackson.databind.ObjectMapper; @@ -62,7 +63,6 @@ import java.util.List; import java.util.Optional; -import static org.assertj.core.util.Lists.emptyList; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; @@ -234,7 +234,7 @@ void shouldReturnExpectedHearingValuesWhenCaseDataIsReturned() throws Exception @SneakyThrows @Test - void shouldTriggerEventIfPartyIdMissingFromApplicant1() throws Exception { + void shouldTriggerEventIfPartyIdMissingFromApplicant1() { Long caseId = 1L; CaseData caseData = CaseDataBuilder.builder() .atStateClaimIssued() @@ -274,7 +274,7 @@ void shouldTriggerEventIfPartyIdMissingFromApplicant1() throws Exception { @SneakyThrows @Test - void shouldTriggerEventIfCaseFlagsMissingFromApplicant1() throws Exception { + void shouldTriggerEventIfCaseFlagsMissingFromApplicant1() { Long caseId = 1L; CaseData caseData = CaseDataBuilder.builder() .atStateClaimIssued() @@ -310,7 +310,7 @@ void shouldTriggerEventIfCaseFlagsMissingFromApplicant1() throws Exception { @SneakyThrows @Test - void shouldTriggerEventIfUnavailableDatesMissingFromApplicant1() throws Exception { + void shouldTriggerEventIfUnavailableDatesMissingFromApplicant1() { Long caseId = 1L; CaseData caseData = CaseDataBuilder.builder() .atStateClaimIssued() @@ -346,7 +346,7 @@ void shouldTriggerEventIfUnavailableDatesMissingFromApplicant1() throws Exceptio } @Test - void shouldNotTriggerEventIfPartyIdCaseFlagsUnavailableDatesExistsForApplicant1() throws Exception { + void shouldNotTriggerEventIfPartyIdCaseFlagsUnavailableDatesExistsForApplicant1() { WelshLanguageRequirements applicant1WelshLang = new WelshLanguageRequirements(); applicant1WelshLang.setCourt(Language.ENGLISH); UnavailableDate unavailableDate1 = new UnavailableDate(); @@ -433,9 +433,7 @@ void shouldThrowFeinExceptionIfCaseDataServiceThrowsException() { doThrow(FeignException.GatewayTimeout.class) .when(caseDataService).triggerEvent(any(), any(), any()); - assertThrows(FeignException.GatewayTimeout.class, () -> { - hearingValuesService.getValues(caseId, "auth"); - }); + assertThrows(FeignException.GatewayTimeout.class, () -> hearingValuesService.getValues(caseId, "auth")); } @NotNull @@ -533,9 +531,7 @@ void shouldThrowErrorIfLocationIsNotWhiteListed() { when(caseDetailsConverter.toCaseData(caseDetails.getData())).thenReturn(caseData); when(earlyAdoptersService.isPartOfHmcLipEarlyAdoptersRollout(any(CaseData.class))).thenReturn(false); - assertThrows(NotEarlyAdopterCourtException.class, () -> { - hearingValuesService.getValues(caseId, "auth"); - }); + assertThrows(NotEarlyAdopterCourtException.class, () -> hearingValuesService.getValues(caseId, "auth")); } @Test @@ -775,6 +771,20 @@ private List getExpectedPartyModel() { private PartyDetailsModel buildExpectedIndividualPartyDetails(String partyId, String firstName, String lastName, String partyName, String partyRole, String email) { + PartyDetailsModel partyDetails = new PartyDetailsModel(); + partyDetails.setPartyID(partyId); + partyDetails.setPartyType(IND); + partyDetails.setPartyName(partyName); + partyDetails.setPartyRole(partyRole); + partyDetails.setIndividualDetails(buildExpectedIndividualDetails(firstName, lastName, email)); + partyDetails.setOrganisationDetails(null); + partyDetails.setUnavailabilityDOW(null); + partyDetails.setUnavailabilityRanges(emptyList()); + partyDetails.setHearingSubChannel(null); + return partyDetails; + } + + private IndividualDetailsModel buildExpectedIndividualDetails(String firstName, String lastName, String email) { List hearingChannelEmail = email == null ? emptyList() : List.of(email); IndividualDetailsModel individualDetails = new IndividualDetailsModel(); individualDetails.setFirstName(firstName); @@ -787,18 +797,7 @@ private PartyDetailsModel buildExpectedIndividualPartyDetails(String partyId, St individualDetails.setHearingChannelPhone(List.of("0123456789")); individualDetails.setRelatedParties(emptyList()); individualDetails.setCustodyStatus(null); - - PartyDetailsModel partyDetails = new PartyDetailsModel(); - partyDetails.setPartyID(partyId); - partyDetails.setPartyType(IND); - partyDetails.setPartyName(partyName); - partyDetails.setPartyRole(partyRole); - partyDetails.setIndividualDetails(individualDetails); - partyDetails.setOrganisationDetails(null); - partyDetails.setUnavailabilityDOW(null); - partyDetails.setUnavailabilityRanges(null); - partyDetails.setHearingSubChannel(null); - return partyDetails; + return individualDetails; } private PartyDetailsModel buildExpectedOrganisationPartyObject(String name, @@ -816,7 +815,7 @@ private PartyDetailsModel buildExpectedOrganisationPartyObject(String name, partyDetails.setIndividualDetails(null); partyDetails.setOrganisationDetails(organisationDetails); partyDetails.setUnavailabilityDOW(null); - partyDetails.setUnavailabilityRanges(null); + partyDetails.setUnavailabilityRanges(emptyList()); partyDetails.setHearingSubChannel(null); return partyDetails; }