From 27cb25cbbe87fb00bb1a66bb607d290bf35d9213 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Wed, 21 May 2025 09:31:44 +0100 Subject: [PATCH 01/23] git cover sheet --- .../config/rd/JudicialUsersConfiguration.java | 11 +- .../reform/fpl/enums/DocmosisTemplates.java | 1 + .../DocmosisApprovedOrderCoverSheet.java | 20 ++++ .../reform/fpl/service/JudicialService.java | 29 +++-- .../cmo/ApproveDraftOrdersService.java | 28 ++--- .../service/cmo/HearingOrderGenerator.java | 37 +++++- ...ocmosisApprovedOrderCoverSheetService.java | 110 ++++++++++++++++++ .../orders/generator/DocumentMerger.java | 7 ++ .../rd/JudicialUsersConfigurationTest.java | 5 +- .../fpl/service/JudicialServiceTest.java | 52 ++++++--- .../cmo/ApproveDraftOrdersServiceTest.java | 14 +-- .../cmo/HearingOrderGeneratorTest.java | 68 +++++++++-- ...sisApprovedOrderCoverSheetServiceTest.java | 105 +++++++++++++++++ 13 files changed, 411 insertions(+), 76 deletions(-) create mode 100644 service/src/main/java/uk/gov/hmcts/reform/fpl/model/docmosis/DocmosisApprovedOrderCoverSheet.java create mode 100644 service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java create mode 100644 service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfiguration.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfiguration.java index 6f60dee08b5..4d6d11d3422 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfiguration.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfiguration.java @@ -27,7 +27,7 @@ @Configuration public class JudicialUsersConfiguration { - private Map mapping; + private Map mapping; private final SystemUserService systemUserService; private final AuthTokenGenerator authTokenGenerator; @@ -61,11 +61,16 @@ public JudicialUsersConfiguration(@Autowired JudicialApi judicialApi, } public Optional getJudgeUUID(String email) { + return Optional.ofNullable(mapping.getOrDefault(email.toLowerCase(), null)) + .map(JudicialUserProfile::getSidamId); + } + + public Optional getJudicialUserProfile(String email) { return Optional.ofNullable(mapping.getOrDefault(email.toLowerCase(), null)); } @Retryable(value = FeignException.class, recover = "recoverFailedJudgeCall", maxAttempts = 5) - public Map getAllJudges() { + public Map getAllJudges() { String systemUserToken = systemUserService.getSysUserToken(); List users = judicialApi.findUsers(systemUserToken, authTokenGenerator.generate(), @@ -77,7 +82,7 @@ public Map getAllJudges() { return users.stream() .filter(jup -> !isEmpty(jup.getSidamId())) - .collect(Collectors.toMap(profile -> profile.getEmailId().toLowerCase(), JudicialUserProfile::getSidamId)); + .collect(Collectors.toMap(profile -> profile.getEmailId().toLowerCase(), profile -> profile)); } @Recover diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java index 2d33d846307..e26867dc4c8 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java @@ -26,6 +26,7 @@ public enum DocmosisTemplates { EPO("FL-PLW-GOR-ENG-00228.doc", null, "emergency_protection_order"), EPO_V2("FL-PLW-GOR-ENG-00744.doc", null, "emergency_protection_order"), COVER_DOCS("FL-PLW-LET-ENG-COVER-SHEET.doc", "FL-PLW-LET-WEL-COVER-SHEET.doc", "cover_documents"), + APPROVED_ORDER_COVER("FL-PLW-LET-ENG-APPROVED-ORDER-COVER-SHEET.docx", null, "approved-order-cover"), TRANSLATION_REQUEST("FL-PLW-LET-ENG-00748.doc", null, "translation_request"), A70("FL-PLW-GOR-ENG-00763V2.doc", null, "placement_order_a70"), A81("FL-PLW-GOR-ENG-00728.doc", null, "placement_order_a81"), diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/docmosis/DocmosisApprovedOrderCoverSheet.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/docmosis/DocmosisApprovedOrderCoverSheet.java new file mode 100644 index 00000000000..0f4344dbd71 --- /dev/null +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/docmosis/DocmosisApprovedOrderCoverSheet.java @@ -0,0 +1,20 @@ +package uk.gov.hmcts.reform.fpl.model.docmosis; + +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode() +@Builder +public class DocmosisApprovedOrderCoverSheet implements DocmosisData { + private final String familyManCaseNumber; + private final String courtName; + private final List children; + private final String judgeTitleAndName; + private final String dateOfApproval; + private final String orderByConsent; + private final String crest; +} diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java index b7cc816b6bd..1c657d78410 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java @@ -14,7 +14,6 @@ import uk.gov.hmcts.reform.fpl.config.rd.JudicialUsersConfiguration; import uk.gov.hmcts.reform.fpl.config.rd.LegalAdviserUsersConfiguration; import uk.gov.hmcts.reform.fpl.enums.JudgeOrMagistrateTitle; -import uk.gov.hmcts.reform.fpl.enums.YesNo; import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.HearingBooking; import uk.gov.hmcts.reform.fpl.model.Judge; @@ -22,7 +21,7 @@ import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.JudgeAndLegalAdvisor; import uk.gov.hmcts.reform.fpl.model.migration.HearingJudgeTime; -import uk.gov.hmcts.reform.fpl.utils.RoleAssignmentUtils; +import uk.gov.hmcts.reform.idam.client.models.UserDetails; import uk.gov.hmcts.reform.rd.client.JudicialApi; import uk.gov.hmcts.reform.rd.client.StaffApi; import uk.gov.hmcts.reform.rd.model.JudicialUserProfile; @@ -30,12 +29,7 @@ import java.time.LocalDateTime; import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static org.springframework.util.ObjectUtils.isEmpty; @@ -45,6 +39,7 @@ import static uk.gov.hmcts.reform.fpl.enums.LegalAdviserRole.ALLOCATED_LEGAL_ADVISER; import static uk.gov.hmcts.reform.fpl.enums.LegalAdviserRole.HEARING_LEGAL_ADVISER; import static uk.gov.hmcts.reform.fpl.enums.YesNo.NO; +import static uk.gov.hmcts.reform.fpl.utils.JudgeAndLegalAdvisorHelper.formatJudgeTitleAndName; import static uk.gov.hmcts.reform.fpl.utils.RoleAssignmentUtils.buildRoleAssignment; @Slf4j @@ -65,6 +60,7 @@ public class JudicialService { private final JudicialUsersConfiguration judicialUsersConfiguration; private final LegalAdviserUsersConfiguration legalAdviserUsersConfiguration; private final ElinksService elinksService; + private final UserService userService; /** * Delete a set of allocated-[users] on a specific case. @@ -329,7 +325,7 @@ public Set getHearingJudges(CaseData caseData) { // TODO - see if these can be combined/parameterised somehow public Optional validateAllocatedJudge(CaseData caseData) { Optional error; - if (caseData.getEnterManually().equals(YesNo.NO)) { + if (caseData.getEnterManually().equals(NO)) { // validate judge error = this.validateJudicialUserField(caseData.getJudicialUser()); } else { @@ -342,7 +338,7 @@ public Optional validateAllocatedJudge(CaseData caseData) { public Optional validateTempAllocatedJudge(CaseData caseData) { Optional error; - if (caseData.getEnterManually().equals(YesNo.NO)) { + if (caseData.getEnterManually().equals(NO)) { // validate judge error = this.validateJudicialUserField(caseData.getJudicialUser()); } else { @@ -356,7 +352,7 @@ public Optional validateTempAllocatedJudge(CaseData caseData) { public Optional validateHearingJudge(CaseData caseData) { Optional error; - if (caseData.getEnterManuallyHearingJudge().equals(YesNo.NO)) { + if (caseData.getEnterManuallyHearingJudge().equals(NO)) { // validate judge error = this.validateJudicialUserField(caseData.getJudicialUserHearingJudge()); } else { @@ -407,7 +403,7 @@ public List getHearingJudgeRolesForMigration(CaseData caseData) boolean isLegalAdviser = userRoleCategory.get().equals(RoleCategory.LEGAL_OPERATIONS); - return RoleAssignmentUtils.buildRoleAssignment( + return buildRoleAssignment( caseData.getId(), time.getJudgeId(), isLegalAdviser @@ -495,6 +491,15 @@ public List validateHearingJudgeEmail(CaseDetails caseDetails, CaseData return List.of(); } + public String getJudgeTitleAndNameOfCurrentUser() { + UserDetails userDetails = userService.getUserDetails(); + + return judicialUsersConfiguration.getJudicialUserProfile(userDetails.getEmail()) + .map(judicialUserProfile -> + formatJudgeTitleAndName(JudgeAndLegalAdvisor.fromJudicialUserProfile(judicialUserProfile))) + .orElse(userDetails.getFullName()); + } + private ZonedDateTime currentTimeUK() { return ZonedDateTime.now(LONDON_TIMEZONE); } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java index 5e13fb15593..c86c2ff4490 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java @@ -7,11 +7,7 @@ import uk.gov.hmcts.reform.fpl.enums.HearingType; import uk.gov.hmcts.reform.fpl.enums.State; import uk.gov.hmcts.reform.fpl.exceptions.CMONotFoundException; -import uk.gov.hmcts.reform.fpl.model.CaseData; -import uk.gov.hmcts.reform.fpl.model.ConfidentialOrderBundle; -import uk.gov.hmcts.reform.fpl.model.HearingBooking; -import uk.gov.hmcts.reform.fpl.model.Other; -import uk.gov.hmcts.reform.fpl.model.ReviewDecision; +import uk.gov.hmcts.reform.fpl.model.*; import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; @@ -21,12 +17,7 @@ import uk.gov.hmcts.reform.fpl.service.OthersService; import uk.gov.hmcts.reform.fpl.utils.ElementUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -34,9 +25,7 @@ import static java.util.stream.Collectors.toList; import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; import static org.apache.commons.lang3.ObjectUtils.isNotEmpty; -import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.JUDGE_REQUESTED_CHANGES; -import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.REVIEW_LATER; -import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.SEND_TO_ALL_PARTIES; +import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.*; import static uk.gov.hmcts.reform.fpl.enums.CMOStatus.SEND_TO_JUDGE; import static uk.gov.hmcts.reform.fpl.enums.YesNo.NO; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.asDynamicList; @@ -191,10 +180,8 @@ public Map reviewCMO(CaseData caseData, Element> sealedCMOs = caseData.getSealedCMOs(); sealedCMOs.add(reviewedOrder); @@ -265,9 +252,8 @@ public void reviewC21Orders(CaseData caseData, Map data, caseData.getOthersSelector(), NO.getValue()); reviewedOrder = hearingOrderGenerator.buildSealedHearingOrder( - reviewDecision, orderElement, selectedOthers, getOthersNotified(selectedOthers), - caseData.getSealType(), - caseData.getCourt()); + caseData, reviewDecision, orderElement, selectedOthers, getOthersNotified(selectedOthers), + true); Element generatedBlankOrder = blankOrderGenerator.buildBlankOrder(caseData, selectedOrdersBundle, reviewedOrder, selectedOthers, getOthersNotified(selectedOthers)); diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java index b433324696a..3ca16bf032d 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java @@ -1,37 +1,48 @@ package uk.gov.hmcts.reform.fpl.service.cmo; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import uk.gov.hmcts.reform.fpl.enums.CMOStatus; +import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.Court; import uk.gov.hmcts.reform.fpl.model.Other; import uk.gov.hmcts.reform.fpl.model.ReviewDecision; +import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.document.SealType; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.service.DocumentSealingService; +import uk.gov.hmcts.reform.fpl.service.UploadDocumentService; +import uk.gov.hmcts.reform.fpl.service.docmosis.DocmosisApprovedOrderCoverSheetService; +import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; import uk.gov.hmcts.reform.fpl.service.time.Time; import java.util.List; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.JUDGE_AMENDS_DRAFT; +import static uk.gov.hmcts.reform.fpl.model.common.DocumentReference.buildFromDocument; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; +@Slf4j @Component @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class HearingOrderGenerator { private final DocumentSealingService documentSealingService; private final Time time; + private final DocmosisApprovedOrderCoverSheetService docmosisApprovedOrderCoverSheetService; + private final DocumentMerger documentMerger; + private final UploadDocumentService uploadDocumentService; - public Element buildSealedHearingOrder(ReviewDecision reviewDecision, + public Element buildSealedHearingOrder(CaseData caseData, + ReviewDecision reviewDecision, Element hearingOrderElement, List> selectedOthers, String othersNotified, - SealType sealType, - Court court) { + boolean addCoverSheet) { DocumentReference order; boolean isConfidentialOrder = hearingOrderElement.getValue().isConfidentialOrder(); @@ -50,9 +61,25 @@ public Element buildSealedHearingOrder(ReviewDecision reviewDecisi .others(selectedOthers) .othersNotified(othersNotified); + DocumentReference sealedOrder = documentSealingService.sealDocument(order, caseData.getCourt(), + caseData.getSealType()); + + if (addCoverSheet) { + try { + DocmosisDocument orderWithCoverSheet = docmosisApprovedOrderCoverSheetService + .addCoverSheetToApprovedOrder(caseData, sealedOrder); + + sealedOrder = buildFromDocument(uploadDocumentService + .uploadPDF(orderWithCoverSheet.getBytes(), order.getFilename())); + } catch (Exception e) { + // TODO handle this better, maybe a notification to FPL service? + log.error("Error adding cover sheet to order", e); + } + } + builder = (isConfidentialOrder) - ? builder.orderConfidential(documentSealingService.sealDocument(order, court, sealType)) - : builder.order(documentSealingService.sealDocument(order, court, sealType)); + ? builder.orderConfidential(sealedOrder) + : builder.order(sealedOrder); return element(hearingOrderElement.getId(), builder.build()); } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java new file mode 100644 index 00000000000..82daf8d45e9 --- /dev/null +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java @@ -0,0 +1,110 @@ +package uk.gov.hmcts.reform.fpl.service.docmosis; + +import lombok.RequiredArgsConstructor; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import uk.gov.hmcts.reform.fpl.enums.docmosis.RenderFormat; +import uk.gov.hmcts.reform.fpl.model.CaseData; +import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; +import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; +import uk.gov.hmcts.reform.fpl.model.configuration.Language; +import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisApprovedOrderCoverSheet; +import uk.gov.hmcts.reform.fpl.service.CaseDataExtractionService; +import uk.gov.hmcts.reform.fpl.service.JudicialService; +import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; +import uk.gov.hmcts.reform.fpl.service.time.Time; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.List; +import java.util.Optional; + +import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; +import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; +import static uk.gov.hmcts.reform.fpl.service.docmosis.DocmosisTemplateDataGeneration.getHmctsLogoLarge; +import static uk.gov.hmcts.reform.fpl.service.docmosis.DocmosisTemplateDataGeneration.getHmctsLogoSmall; +import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE; +import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.formatLocalDateToString; + +@Service +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) +public class DocmosisApprovedOrderCoverSheetService { + private final DocmosisDocumentGeneratorService docmosisDocumentGeneratorService; + private final CaseDataExtractionService caseDataExtractionService; + private final DocumentMerger documentMerger; + private final JudicialService judicialService; + private final Time time; + + public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, DocumentReference order) throws IOException + { + // Create + DocmosisDocument coverSheet = createCoverSheet(caseData); + + // TODO could we use the byte array from the approved order instead of downloading it again? + // Add cover sheet to the order + DocmosisDocument orderWithCoverSheet = documentMerger.mergeDocuments(coverSheet, List.of(order)); + + // Add the ANNEX keyword to the second page top of the merged file + try (PDDocument document = PDDocument.load(orderWithCoverSheet.getBytes())) { + if (document.getNumberOfPages() < 2) { + throw new IllegalArgumentException("The order cover sheet must have at least 2 pages."); + } + + PDPage secondPage = document.getPage(1); // Index 1 is the second page + PDRectangle pageSize = secondPage.getMediaBox(); + try (PDPageContentStream contentStream = new PDPageContentStream(document, secondPage, PDPageContentStream.AppendMode.APPEND, true, true)) { + contentStream.beginText(); + contentStream.setFont(PDType1Font.TIMES_BOLD, 12); + + float textX = 50; + float textY = pageSize.getHeight() - 50; + contentStream.newLineAtOffset(textX, textY); // Adjust position + contentStream.showText("ANNEX A:"); + contentStream.endText(); + + // Calculate underline position and length + float textWidth = PDType1Font.TIMES_BOLD.getStringWidth("ANNEX A:") / 1000 * 12; // Font size is 12 + float underlineY = textY - 2; // Slightly below the text + + // Draw underline + contentStream.moveTo(textX, underlineY); + contentStream.lineTo(textX + textWidth, underlineY); + contentStream.setLineWidth(0.5f); // Adjust thickness + contentStream.stroke(); + } + + try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + document.save(outputStream); + return new DocmosisDocument(orderWithCoverSheet.getDocumentTitle(), outputStream.toByteArray()); + } + } + } + + public DocmosisDocument createCoverSheet(CaseData caseData) { + Language applicationLanguage = Optional.ofNullable(caseData.getC110A() + .getLanguageRequirementApplication()).orElse(Language.ENGLISH); + DocmosisApprovedOrderCoverSheet coverDocumentData = buildCoverDocumentsData(caseData); + return docmosisDocumentGeneratorService.generateDocmosisDocument(coverDocumentData, + APPROVED_ORDER_COVER, + RenderFormat.PDF, + applicationLanguage); + } + + public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData) { + Language applicationLanguage = Optional.ofNullable(caseData.getC110A() + .getLanguageRequirementApplication()).orElse(Language.ENGLISH); + return DocmosisApprovedOrderCoverSheet.builder() + .familyManCaseNumber(caseData.getFamilyManCaseNumber()) + .courtName(caseDataExtractionService.getCourtName(caseData)) + .children(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())) + .judgeTitleAndName(judicialService.getJudgeTitleAndNameOfCurrentUser()) + .dateOfApproval(formatLocalDateToString(time.now().toLocalDate(), DATE, applicationLanguage)) + .crest(CREST.getValue()) + .build(); + } +} diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/orders/generator/DocumentMerger.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/orders/generator/DocumentMerger.java index babeaf6b526..fa37b257a5a 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/orders/generator/DocumentMerger.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/orders/generator/DocumentMerger.java @@ -3,6 +3,11 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.pdfbox.multipdf.PDFMergerUtility; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.font.PDType1Font; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; @@ -68,4 +73,6 @@ private List getPdfFilesToMerge(DocmosisDocument originalDocument, return documents; } + + } diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfigurationTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfigurationTest.java index 3c2e369f33c..bbb9c1bcc9c 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfigurationTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfigurationTest.java @@ -66,8 +66,7 @@ void shouldGetAllJudges() { JudicialUsersConfiguration config = new JudicialUsersConfiguration(jrdApi, systemUserService, authTokenGenerator, elinksService, true); - Map judges = config.getAllJudges(); - assertThat(judges).isEqualTo(Map.of("email@test.com", "12345")); - + Map judges = config.getAllJudges(); + assertThat(judges.get("email@test.com").getSidamId()).isEqualTo("12345"); } } diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java index 1523503366d..ec7958076b5 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java @@ -4,11 +4,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockedStatic; +import org.mockito.*; import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; import uk.gov.hmcts.reform.am.model.RoleAssignment; @@ -24,6 +20,7 @@ import uk.gov.hmcts.reform.fpl.model.Judge; import uk.gov.hmcts.reform.fpl.model.JudicialUser; import uk.gov.hmcts.reform.fpl.model.common.JudgeAndLegalAdvisor; +import uk.gov.hmcts.reform.idam.client.models.UserDetails; import uk.gov.hmcts.reform.rd.client.JudicialApi; import uk.gov.hmcts.reform.rd.model.JudicialUserProfile; import uk.gov.hmcts.reform.rd.model.JudicialUserRequest; @@ -36,18 +33,12 @@ import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; import static org.mockito.quality.Strictness.LENIENT; import static uk.gov.hmcts.reform.fpl.config.TimeConfiguration.LONDON_TIMEZONE; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.wrapElements; +import static uk.gov.hmcts.reform.fpl.utils.JudgeAndLegalAdvisorHelper.formatJudgeTitleAndName; @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = LENIENT) @@ -80,6 +71,9 @@ class JudicialServiceTest { @Mock private ElinksService elinksService; + @Mock + private UserService userService; + @Captor private ArgumentCaptor> rolesCaptor; @@ -532,4 +526,34 @@ void shouldReturnEmptyOptionalWhenNoHearingJudge() { } } + @Nested + class GetJudgeTitleAndName { + private static final JudicialUserProfile JUDICIAL_USER_PROFILE = JudicialUserProfile.builder() + .title("Judge") + .fullName("John Smith") + .build(); + + @Test + void shouldReturnJudgeTitleAndNameFromJRD() { + when(userService.getUserDetails()).thenReturn(UserDetails.builder().email(EMAIL).build()); + when(judicialUsersConfiguration.getJudicialUserProfile(EMAIL)) + .thenReturn(Optional.of(JUDICIAL_USER_PROFILE)); + + assertThat(underTest.getJudgeTitleAndNameOfCurrentUser()) + .isEqualTo(formatJudgeTitleAndName(JudgeAndLegalAdvisor + .fromJudicialUserProfile(JUDICIAL_USER_PROFILE))); + } + + @Test + void shouldReturnIdamUserFullNameIfJRDNotFound() { + when(userService.getUserDetails()).thenReturn(UserDetails.builder() + .email(EMAIL) + .forename("John") + .surname("Smith") + .build()); + when(judicialUsersConfiguration.getJudicialUserProfile(EMAIL)).thenReturn(Optional.empty()); + + assertThat(underTest.getJudgeTitleAndNameOfCurrentUser()).isEqualTo("John Smith"); + } + } } diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java index ae074ae454b..8942329f850 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java @@ -433,8 +433,8 @@ void shouldReturnCMOToSealAndSetCaseStateWhenJudgeApprovesCMOAndServingOthersIsE .draftCmos(emptyList()) .build() ); - given(hearingOrderGenerator.buildSealedHearingOrder(reviewDecision, agreedCMO, others, othersNotified, - SealType.ENGLISH, caseData.getCourt())) + given(hearingOrderGenerator.buildSealedHearingOrder(caseData, reviewDecision, agreedCMO, others, + othersNotified)) .willReturn(element(agreedCMO.getId(), expectedCmo)); Map actualData = underTest.reviewCMO(caseData, ordersBundleElement); @@ -539,8 +539,7 @@ void shouldSealTheDraftOrderAndCreateBlankOrderWhenJudgeApproves() { Element expectedBlankOrder = element(UUID.randomUUID(), GeneratedOrder.builder().type(String.valueOf(C21)).build()); - given(hearingOrderGenerator.buildSealedHearingOrder(reviewDecision, draftOrder1, emptyList(), "", - SealType.ENGLISH, caseData.getCourt())) + given(hearingOrderGenerator.buildSealedHearingOrder(caseData, reviewDecision, draftOrder1, emptyList(), "")) .willReturn(expectedSealedOrder); given(blankOrderGenerator.buildBlankOrder( caseData, ordersBundleElement, expectedSealedOrder, emptyList(), "")) @@ -661,8 +660,8 @@ void shouldThrowAnExceptionWhenNoUpcomingHearingsAreAvailable() { .hearingDetails(emptyList()) .build(); - given(hearingOrderGenerator.buildSealedHearingOrder(any(), eq(agreedCMO), eq(emptyList()), eq(""), - eq(SealType.ENGLISH), eq(caseData.getCourt()))) + given(hearingOrderGenerator.buildSealedHearingOrder(eq(caseData), any(), eq(agreedCMO), eq(emptyList()), + eq(""))) .willReturn(element(agreedCMO.getId(), agreedCMO.getValue().toBuilder().status(APPROVED).build())); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, @@ -761,8 +760,7 @@ void shouldSealTheConfidentialDraftOrderAndCreateBlankOrderWhenJudgeApproves() { Element expectedBlankOrder = element(UUID.randomUUID(), GeneratedOrder.builder().type(String.valueOf(C21)).build()); - given(hearingOrderGenerator.buildSealedHearingOrder(reviewDecision, draftOrder1, emptyList(), "", - SealType.ENGLISH, caseData.getCourt())) + given(hearingOrderGenerator.buildSealedHearingOrder(caseData, reviewDecision, draftOrder1, emptyList(), "")) .willReturn(expectedSealedOrder); given(blankOrderGenerator.buildBlankOrder( caseData, ordersBundleElement, expectedSealedOrder, emptyList(), "")) diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java index 2d235c81edb..72e8a59acc2 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java @@ -6,15 +6,21 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import uk.gov.hmcts.reform.ccd.document.am.model.Document; import uk.gov.hmcts.reform.fpl.enums.CMOStatus; +import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.Court; import uk.gov.hmcts.reform.fpl.model.Other; import uk.gov.hmcts.reform.fpl.model.ReviewDecision; +import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.document.SealType; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.service.DocumentSealingService; +import uk.gov.hmcts.reform.fpl.service.UploadDocumentService; +import uk.gov.hmcts.reform.fpl.service.docmosis.DocmosisApprovedOrderCoverSheetService; +import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; import uk.gov.hmcts.reform.fpl.service.time.Time; import uk.gov.hmcts.reform.fpl.utils.FixedTimeConfiguration; @@ -22,10 +28,14 @@ import java.util.UUID; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.JUDGE_AMENDS_DRAFT; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.SEND_TO_ALL_PARTIES; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; +import static uk.gov.hmcts.reform.fpl.utils.TestDataHelper.testDocument; import static uk.gov.hmcts.reform.fpl.utils.TestDataHelper.testDocumentReference; @ExtendWith(MockitoExtension.class) @@ -33,6 +43,14 @@ class HearingOrderGeneratorTest { private static final DocumentReference order = testDocumentReference(); private static final DocumentReference sealedOrder = testDocumentReference(); + private static final DocmosisDocument DOCMOSIS_DOCUMENT_COVER_SHEET = DocmosisDocument.builder().build(); + private static final byte[] ORDER_WITH_COVER_SHEET_BYTES = new byte[]{1,2,3}; + private static final DocmosisDocument DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET = DocmosisDocument.builder() + .bytes(ORDER_WITH_COVER_SHEET_BYTES) + .build(); + private static final Document ORDER_WITH_COVER_SHEET_DOCUMENT = testDocument(); + private static final DocumentReference ORDER_WITH_COVER_SHEET = DocumentReference + .buildFromDocument(ORDER_WITH_COVER_SHEET_DOCUMENT); private static final DocumentReference amendedOrder = testDocumentReference(); private static final Time time = new FixedTimeConfiguration().stoppedTime(); @@ -41,13 +59,20 @@ class HearingOrderGeneratorTest { @Mock private DocumentSealingService documentSealingService; + @Mock + private DocmosisApprovedOrderCoverSheetService docmosisApprovedOrderCoverSheetService; + @Mock + private DocumentMerger documentMerger; + @Mock + private UploadDocumentService uploadDocumentService; @InjectMocks private HearingOrderGenerator underTest; @BeforeEach void setUp() { - underTest = new HearingOrderGenerator(documentSealingService, time); + underTest = new HearingOrderGenerator(documentSealingService, time, docmosisApprovedOrderCoverSheetService, + documentMerger, uploadDocumentService); } @Test @@ -56,21 +81,33 @@ void shouldBuildSealedHearingOrderWhenReviewDecisionIsApproved() { String othersNotified = "John Smith"; List> selectedOthers = List.of(element(Other.builder().name(othersNotified).build())); Court court = Court.builder().build(); + ReviewDecision reviewDecision = ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(); + + CaseData caseData = CaseData.builder() + .court(court) + .reviewCMODecision(reviewDecision) + .build(); + when(documentSealingService.sealDocument(order, court, SealType.ENGLISH)).thenReturn(sealedOrder); + when(docmosisApprovedOrderCoverSheetService.createCoverSheet(caseData)) + .thenReturn(DOCMOSIS_DOCUMENT_COVER_SHEET); + when(documentMerger.mergeDocuments(DOCMOSIS_DOCUMENT_COVER_SHEET, List.of(sealedOrder))) + .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); + when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) + .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); Element expectedOrder = element(ORDER_ID, hearingOrder.toBuilder() .dateIssued(time.now().toLocalDate()).status(CMOStatus.APPROVED) .othersNotified(othersNotified) .others(selectedOthers) - .order(sealedOrder).lastUploadedOrder(order).build()); + .order(ORDER_WITH_COVER_SHEET).lastUploadedOrder(order).build()); Element actual = underTest.buildSealedHearingOrder( - ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(), + caseData, + reviewDecision, element(ORDER_ID, hearingOrder), selectedOthers, - othersNotified, - SealType.ENGLISH, - court); + othersNotified); assertThat(actual).isEqualTo(expectedOrder); } @@ -79,19 +116,30 @@ void shouldBuildSealedHearingOrderWhenReviewDecisionIsApproved() { void shouldBuildSealedHearingOrderWhenJudgeAmendsTheDocument() { HearingOrder hearingOrder = HearingOrder.builder().hearing("hearing1").order(order).build(); Court court = Court.builder().build(); + ReviewDecision reviewDecision = ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(); + + CaseData caseData = CaseData.builder() + .court(court) + .reviewCMODecision(reviewDecision) + .build(); when(documentSealingService.sealDocument(amendedOrder, court, SealType.ENGLISH)).thenReturn(sealedOrder); + when(docmosisApprovedOrderCoverSheetService.createCoverSheet(caseData)) + .thenReturn(DOCMOSIS_DOCUMENT_COVER_SHEET); + when(documentMerger.mergeDocuments(DOCMOSIS_DOCUMENT_COVER_SHEET, List.of(sealedOrder))) + .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); + when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) + .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); Element expectedOrder = element(ORDER_ID, hearingOrder.toBuilder() .dateIssued(time.now().toLocalDate()).status(CMOStatus.APPROVED) .others(List.of()).othersNotified("") - .order(sealedOrder).lastUploadedOrder(amendedOrder).build()); + .order(ORDER_WITH_COVER_SHEET).lastUploadedOrder(amendedOrder).build()); Element actual = underTest.buildSealedHearingOrder( + caseData, ReviewDecision.builder().decision(JUDGE_AMENDS_DRAFT).judgeAmendedDocument(amendedOrder).build(), element(ORDER_ID, hearingOrder), - List.of(), "", - SealType.ENGLISH, - court); + List.of(), ""); assertThat(actual).isEqualTo(expectedOrder); } diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java new file mode 100644 index 00000000000..190b6b8f2fd --- /dev/null +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java @@ -0,0 +1,105 @@ +package uk.gov.hmcts.reform.fpl.service.docmosis; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; +import org.springframework.test.context.ContextConfiguration; +import uk.gov.hmcts.reform.fpl.enums.docmosis.RenderFormat; +import uk.gov.hmcts.reform.fpl.model.CaseData; +import uk.gov.hmcts.reform.fpl.model.Child; +import uk.gov.hmcts.reform.fpl.model.ChildParty; +import uk.gov.hmcts.reform.fpl.model.Court; +import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; +import uk.gov.hmcts.reform.fpl.model.common.Element; +import uk.gov.hmcts.reform.fpl.model.configuration.Language; +import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisApprovedOrderCoverSheet; +import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisChild; +import uk.gov.hmcts.reform.fpl.model.group.C110A; +import uk.gov.hmcts.reform.fpl.service.CaseDataExtractionService; +import uk.gov.hmcts.reform.fpl.service.JudicialService; +import uk.gov.hmcts.reform.fpl.service.time.Time; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; +import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; +import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; +import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE; +import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.formatLocalDateToString; +import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; + +@ExtendWith(MockitoExtension.class) +class DocmosisApprovedOrderCoverSheetServiceTest { + private static final LocalDateTime TEST_TIME = LocalDateTime.of(2025,3,26,8,0,0,0); + private static final String FAMILY_MAN_NUMBER = "FMN-001"; + private static final Long CASE_ID = 1L; + private static final Language LANGUAGE = Language.ENGLISH; + private static final Court COURT = Court.builder().code("999").build(); + private static final byte[] PDF_BYTES = {10, 20, 30, 40, 50}; + private static final String FILE_NAME = "approved-order-cover.pdf"; + private static final Element CHILD = element(Child.builder().party(ChildParty.builder() + .firstName("Test").lastName("Child").build()).build()); + private static final Element CONFIDENTIAL_CHILD = element(Child.builder().party(ChildParty.builder() + .firstName("Confidential").lastName("Child").build()).build()); + private static final List DOCMOSIS_CHILDREN = List.of( + DocmosisChild.builder().name("Test Child").build(), + DocmosisChild.builder().name("Confidential Child").build() + ); + + private static final DocmosisDocument COVER_SHEET = new DocmosisDocument(FILE_NAME, PDF_BYTES); + public static final String COURT_NAME = "Test Court"; + public static final String JUDGE_NAME = "Test Judge"; + + @Mock + private DocmosisDocumentGeneratorService docmosisDocumentGeneratorService; + @Mock + private CaseDataExtractionService caseDataExtractionService; + @Mock + private JudicialService judicialService; + @Mock + private Time time; + @InjectMocks + private DocmosisApprovedOrderCoverSheetService underTest; + + @Test + void shouldGenerateApprovedOrderCoverSheet() { + CaseData caseData = CaseData.builder() + .id(CASE_ID) + .familyManCaseNumber(FAMILY_MAN_NUMBER) + .court(COURT) + .c110A(C110A.builder() + .languageRequirementApplication(LANGUAGE) + .build()) + .children1(List.of(CHILD)) + .confidentialChildren(List.of(CONFIDENTIAL_CHILD)) + .build(); + + given(caseDataExtractionService.getCourtName(caseData)).willReturn(COURT_NAME); + given(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())).willReturn(DOCMOSIS_CHILDREN); + given(judicialService.getJudgeTitleAndNameOfCurrentUser()).willReturn(JUDGE_NAME); + given(time.now()).willReturn(TEST_TIME); + + DocmosisApprovedOrderCoverSheet expectedDocmosisData = DocmosisApprovedOrderCoverSheet.builder() + .familyManCaseNumber(FAMILY_MAN_NUMBER) + .courtName(COURT_NAME) + .children(DOCMOSIS_CHILDREN) + .judgeTitleAndName(JUDGE_NAME) + .dateOfApproval(formatLocalDateToString(TEST_TIME.toLocalDate(), DATE, Language.ENGLISH)) + .crest(CREST.getValue()) + .build(); + + + given(docmosisDocumentGeneratorService.generateDocmosisDocument(expectedDocmosisData, APPROVED_ORDER_COVER, + RenderFormat.PDF, LANGUAGE)) + .willReturn(COVER_SHEET); + + DocmosisDocument result = underTest.createCoverSheet(caseData); + + assertThat(result).isEqualTo(COVER_SHEET); + } +} From 3478ecff1310f9a0c4e1eecf545dc70ef4719f24 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Wed, 21 May 2025 13:23:03 +0100 Subject: [PATCH 02/23] changes to query by idam id --- .../config/rd/JudicialUsersConfiguration.java | 11 ++-- .../reform/fpl/service/JudicialService.java | 26 +++++----- .../reform/rd/model/JudicialUserRequest.java | 3 ++ .../rd/JudicialUsersConfigurationTest.java | 5 +- .../fpl/service/JudicialServiceTest.java | 14 ++--- .../cmo/ApproveDraftOrdersServiceTest.java | 10 ++-- .../cmo/HearingOrderGeneratorTest.java | 52 ++++++++++++++----- 7 files changed, 77 insertions(+), 44 deletions(-) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfiguration.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfiguration.java index 4d6d11d3422..6f60dee08b5 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfiguration.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfiguration.java @@ -27,7 +27,7 @@ @Configuration public class JudicialUsersConfiguration { - private Map mapping; + private Map mapping; private final SystemUserService systemUserService; private final AuthTokenGenerator authTokenGenerator; @@ -61,16 +61,11 @@ public JudicialUsersConfiguration(@Autowired JudicialApi judicialApi, } public Optional getJudgeUUID(String email) { - return Optional.ofNullable(mapping.getOrDefault(email.toLowerCase(), null)) - .map(JudicialUserProfile::getSidamId); - } - - public Optional getJudicialUserProfile(String email) { return Optional.ofNullable(mapping.getOrDefault(email.toLowerCase(), null)); } @Retryable(value = FeignException.class, recover = "recoverFailedJudgeCall", maxAttempts = 5) - public Map getAllJudges() { + public Map getAllJudges() { String systemUserToken = systemUserService.getSysUserToken(); List users = judicialApi.findUsers(systemUserToken, authTokenGenerator.generate(), @@ -82,7 +77,7 @@ public Map getAllJudges() { return users.stream() .filter(jup -> !isEmpty(jup.getSidamId())) - .collect(Collectors.toMap(profile -> profile.getEmailId().toLowerCase(), profile -> profile)); + .collect(Collectors.toMap(profile -> profile.getEmailId().toLowerCase(), JudicialUserProfile::getSidamId)); } @Recover diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java index 46a711b316d..b6e9b7fed1a 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java @@ -223,11 +223,7 @@ public boolean checkJudgeExists(String personalCode) { return false; } String systemUserToken = systemUserService.getSysUserToken(); - List judges = judicialApi.findUsers(systemUserToken, - authTokenGenerator.generate(), - JUDICIAL_PAGE_SIZE, - elinksService.getElinksAcceptHeader(), - JudicialUserRequest.fromPersonalCode(personalCode)); + List judges = getJudicialUserProfiles(JudicialUserRequest.fromPersonalCode(personalCode)); return !judges.isEmpty(); } @@ -262,11 +258,7 @@ public Optional getJudge(String personalCode) { return Optional.empty(); } String systemUserToken = systemUserService.getSysUserToken(); - List judges = judicialApi.findUsers(systemUserToken, - authTokenGenerator.generate(), - JUDICIAL_PAGE_SIZE, - elinksService.getElinksAcceptHeader(), - JudicialUserRequest.fromPersonalCode(personalCode)); + List judges = getJudicialUserProfiles(JudicialUserRequest.fromPersonalCode(personalCode)); if (judges.isEmpty()) { return Optional.empty(); @@ -529,12 +521,22 @@ public Map populateEventDataMapFromJudge(AbstractJudge judge) { return resultMap; } + public List getJudicialUserProfiles(JudicialUserRequest request) { + String systemUserToken = systemUserService.getSysUserToken(); + return judicialApi.findUsers(systemUserToken, + authTokenGenerator.generate(), + JUDICIAL_PAGE_SIZE, + elinksService.getElinksAcceptHeader(), + request); + } + public String getJudgeTitleAndNameOfCurrentUser() { UserDetails userDetails = userService.getUserDetails(); - return judicialUsersConfiguration.getJudicialUserProfile(userDetails.getEmail()) - .map(judicialUserProfile -> + return getJudicialUserProfiles(JudicialUserRequest.builder().idamId(List.of(userDetails.getId())).build()) + .stream().map(judicialUserProfile -> formatJudgeTitleAndName(JudgeAndLegalAdvisor.fromJudicialUserProfile(judicialUserProfile, null))) + .findFirst() .orElse(userDetails.getFullName()); } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserRequest.java b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserRequest.java index 466e84d8d0c..d7d6e63a364 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserRequest.java +++ b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserRequest.java @@ -22,6 +22,9 @@ public class JudicialUserRequest { @JsonProperty("ccdServiceName") private String ccdServiceName; + @JsonProperty("sidam_ids") + private List idamId; + public static JudicialUserRequest fromPersonalCode(String personalCode) { return JudicialUserRequest.builder() .personalCode(List.of(personalCode)) diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfigurationTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfigurationTest.java index bbb9c1bcc9c..3c2e369f33c 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfigurationTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/config/rd/JudicialUsersConfigurationTest.java @@ -66,7 +66,8 @@ void shouldGetAllJudges() { JudicialUsersConfiguration config = new JudicialUsersConfiguration(jrdApi, systemUserService, authTokenGenerator, elinksService, true); - Map judges = config.getAllJudges(); - assertThat(judges.get("email@test.com").getSidamId()).isEqualTo("12345"); + Map judges = config.getAllJudges(); + assertThat(judges).isEqualTo(Map.of("email@test.com", "12345")); + } } diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java index 4af7c2b0b12..398c4c6966b 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java @@ -683,23 +683,25 @@ class GetJudgeTitleAndName { @Test void shouldReturnJudgeTitleAndNameFromJRD() { - when(userService.getUserDetails()).thenReturn(UserDetails.builder().email(EMAIL).build()); - when(judicialUsersConfiguration.getJudicialUserProfile(EMAIL)) - .thenReturn(Optional.of(JUDICIAL_USER_PROFILE)); + when(userService.getUserDetails()).thenReturn(UserDetails.builder().id("testId").build()); + when(judicialApi + .findUsers(any(), any(), anyInt(), any(), + eq(JudicialUserRequest.builder().idamId(List.of("testId")).build()))) + .thenReturn(List.of(JUDICIAL_USER_PROFILE)); assertThat(underTest.getJudgeTitleAndNameOfCurrentUser()) .isEqualTo(formatJudgeTitleAndName(JudgeAndLegalAdvisor - .fromJudicialUserProfile(JUDICIAL_USER_PROFILE))); + .fromJudicialUserProfile(JUDICIAL_USER_PROFILE, null))); } @Test void shouldReturnIdamUserFullNameIfJRDNotFound() { when(userService.getUserDetails()).thenReturn(UserDetails.builder() - .email(EMAIL) + .id("testId") .forename("John") .surname("Smith") .build()); - when(judicialUsersConfiguration.getJudicialUserProfile(EMAIL)).thenReturn(Optional.empty()); + when(judicialApi.findUsers(any(), any(), anyInt(), any(), any())).thenReturn(List.of()); assertThat(underTest.getJudgeTitleAndNameOfCurrentUser()).isEqualTo("John Smith"); } diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java index 8942329f850..321c115c0cc 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java @@ -434,7 +434,7 @@ void shouldReturnCMOToSealAndSetCaseStateWhenJudgeApprovesCMOAndServingOthersIsE .build() ); given(hearingOrderGenerator.buildSealedHearingOrder(caseData, reviewDecision, agreedCMO, others, - othersNotified)) + othersNotified, false)) .willReturn(element(agreedCMO.getId(), expectedCmo)); Map actualData = underTest.reviewCMO(caseData, ordersBundleElement); @@ -539,7 +539,8 @@ void shouldSealTheDraftOrderAndCreateBlankOrderWhenJudgeApproves() { Element expectedBlankOrder = element(UUID.randomUUID(), GeneratedOrder.builder().type(String.valueOf(C21)).build()); - given(hearingOrderGenerator.buildSealedHearingOrder(caseData, reviewDecision, draftOrder1, emptyList(), "")) + given(hearingOrderGenerator.buildSealedHearingOrder(caseData, reviewDecision, draftOrder1, emptyList(), "", + true)) .willReturn(expectedSealedOrder); given(blankOrderGenerator.buildBlankOrder( caseData, ordersBundleElement, expectedSealedOrder, emptyList(), "")) @@ -661,7 +662,7 @@ void shouldThrowAnExceptionWhenNoUpcomingHearingsAreAvailable() { .build(); given(hearingOrderGenerator.buildSealedHearingOrder(eq(caseData), any(), eq(agreedCMO), eq(emptyList()), - eq(""))) + eq(""), eq(false))) .willReturn(element(agreedCMO.getId(), agreedCMO.getValue().toBuilder().status(APPROVED).build())); IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, @@ -760,7 +761,8 @@ void shouldSealTheConfidentialDraftOrderAndCreateBlankOrderWhenJudgeApproves() { Element expectedBlankOrder = element(UUID.randomUUID(), GeneratedOrder.builder().type(String.valueOf(C21)).build()); - given(hearingOrderGenerator.buildSealedHearingOrder(caseData, reviewDecision, draftOrder1, emptyList(), "")) + given(hearingOrderGenerator.buildSealedHearingOrder(caseData, reviewDecision, draftOrder1, emptyList(), + "", true)) .willReturn(expectedSealedOrder); given(blankOrderGenerator.buildBlankOrder( caseData, ordersBundleElement, expectedSealedOrder, emptyList(), "")) diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java index 72e8a59acc2..7717f43dde6 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java @@ -24,13 +24,13 @@ import uk.gov.hmcts.reform.fpl.service.time.Time; import uk.gov.hmcts.reform.fpl.utils.FixedTimeConfiguration; +import java.io.IOException; import java.util.List; import java.util.UUID; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.JUDGE_AMENDS_DRAFT; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.SEND_TO_ALL_PARTIES; @@ -43,7 +43,6 @@ class HearingOrderGeneratorTest { private static final DocumentReference order = testDocumentReference(); private static final DocumentReference sealedOrder = testDocumentReference(); - private static final DocmosisDocument DOCMOSIS_DOCUMENT_COVER_SHEET = DocmosisDocument.builder().build(); private static final byte[] ORDER_WITH_COVER_SHEET_BYTES = new byte[]{1,2,3}; private static final DocmosisDocument DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET = DocmosisDocument.builder() .bytes(ORDER_WITH_COVER_SHEET_BYTES) @@ -76,7 +75,7 @@ void setUp() { } @Test - void shouldBuildSealedHearingOrderWhenReviewDecisionIsApproved() { + void shouldBuildSealedHearingOrderWhenReviewDecisionIsApproved() throws IOException { HearingOrder hearingOrder = HearingOrder.builder().hearing("hearing1").order(order).build(); String othersNotified = "John Smith"; List> selectedOthers = List.of(element(Other.builder().name(othersNotified).build())); @@ -89,9 +88,7 @@ void shouldBuildSealedHearingOrderWhenReviewDecisionIsApproved() { .build(); when(documentSealingService.sealDocument(order, court, SealType.ENGLISH)).thenReturn(sealedOrder); - when(docmosisApprovedOrderCoverSheetService.createCoverSheet(caseData)) - .thenReturn(DOCMOSIS_DOCUMENT_COVER_SHEET); - when(documentMerger.mergeDocuments(DOCMOSIS_DOCUMENT_COVER_SHEET, List.of(sealedOrder))) + when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder)) .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); @@ -107,13 +104,14 @@ void shouldBuildSealedHearingOrderWhenReviewDecisionIsApproved() { reviewDecision, element(ORDER_ID, hearingOrder), selectedOthers, - othersNotified); + othersNotified, + true); assertThat(actual).isEqualTo(expectedOrder); } @Test - void shouldBuildSealedHearingOrderWhenJudgeAmendsTheDocument() { + void shouldBuildSealedHearingOrderWhenJudgeAmendsTheDocument() throws IOException { HearingOrder hearingOrder = HearingOrder.builder().hearing("hearing1").order(order).build(); Court court = Court.builder().build(); ReviewDecision reviewDecision = ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(); @@ -123,9 +121,7 @@ void shouldBuildSealedHearingOrderWhenJudgeAmendsTheDocument() { .reviewCMODecision(reviewDecision) .build(); when(documentSealingService.sealDocument(amendedOrder, court, SealType.ENGLISH)).thenReturn(sealedOrder); - when(docmosisApprovedOrderCoverSheetService.createCoverSheet(caseData)) - .thenReturn(DOCMOSIS_DOCUMENT_COVER_SHEET); - when(documentMerger.mergeDocuments(DOCMOSIS_DOCUMENT_COVER_SHEET, List.of(sealedOrder))) + when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder)) .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); @@ -139,7 +135,39 @@ void shouldBuildSealedHearingOrderWhenJudgeAmendsTheDocument() { caseData, ReviewDecision.builder().decision(JUDGE_AMENDS_DRAFT).judgeAmendedDocument(amendedOrder).build(), element(ORDER_ID, hearingOrder), - List.of(), ""); + List.of(), "", true); + + assertThat(actual).isEqualTo(expectedOrder); + } + + @Test + void shouldBuildSealedHearingOrderWithoutCoverSheetIfNotRequired() { + HearingOrder hearingOrder = HearingOrder.builder().hearing("hearing1").order(order).build(); + String othersNotified = "John Smith"; + List> selectedOthers = List.of(element(Other.builder().name(othersNotified).build())); + Court court = Court.builder().build(); + ReviewDecision reviewDecision = ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(); + + CaseData caseData = CaseData.builder() + .court(court) + .reviewCMODecision(reviewDecision) + .build(); + + when(documentSealingService.sealDocument(order, court, SealType.ENGLISH)).thenReturn(sealedOrder); + + Element expectedOrder = element(ORDER_ID, hearingOrder.toBuilder() + .dateIssued(time.now().toLocalDate()).status(CMOStatus.APPROVED) + .othersNotified(othersNotified) + .others(selectedOthers) + .order(sealedOrder).lastUploadedOrder(order).build()); + + Element actual = underTest.buildSealedHearingOrder( + caseData, + reviewDecision, + element(ORDER_ID, hearingOrder), + selectedOthers, + othersNotified, + false); assertThat(actual).isEqualTo(expectedOrder); } From 47e6a7f02e22d5d475194719caef1ddc8ef43916 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Wed, 21 May 2025 13:27:34 +0100 Subject: [PATCH 03/23] add retreyable --- .../java/uk/gov/hmcts/reform/fpl/service/JudicialService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java index b6e9b7fed1a..c1830040151 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java @@ -530,6 +530,7 @@ public List getJudicialUserProfiles(JudicialUserRequest req request); } + @Retryable(value = {FeignException.class}, label = "Search JRD for a judge by idam id") public String getJudgeTitleAndNameOfCurrentUser() { UserDetails userDetails = userService.getUserDetails(); From b23255c3402b13f0d1dc0ed6e72d23faf69c72a9 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Wed, 21 May 2025 13:30:42 +0100 Subject: [PATCH 04/23] code style --- .../service/cmo/ApproveDraftOrdersService.java | 17 ++++++++++++++--- .../orders/generator/DocumentMerger.java | 7 ------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java index c86c2ff4490..2e105f46b8a 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java @@ -7,7 +7,11 @@ import uk.gov.hmcts.reform.fpl.enums.HearingType; import uk.gov.hmcts.reform.fpl.enums.State; import uk.gov.hmcts.reform.fpl.exceptions.CMONotFoundException; -import uk.gov.hmcts.reform.fpl.model.*; +import uk.gov.hmcts.reform.fpl.model.CaseData; +import uk.gov.hmcts.reform.fpl.model.ConfidentialOrderBundle; +import uk.gov.hmcts.reform.fpl.model.HearingBooking; +import uk.gov.hmcts.reform.fpl.model.Other; +import uk.gov.hmcts.reform.fpl.model.ReviewDecision; import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; @@ -17,7 +21,12 @@ import uk.gov.hmcts.reform.fpl.service.OthersService; import uk.gov.hmcts.reform.fpl.utils.ElementUtils; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -25,7 +34,9 @@ import static java.util.stream.Collectors.toList; import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; import static org.apache.commons.lang3.ObjectUtils.isNotEmpty; -import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.*; +import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.JUDGE_REQUESTED_CHANGES; +import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.REVIEW_LATER; +import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.SEND_TO_ALL_PARTIES; import static uk.gov.hmcts.reform.fpl.enums.CMOStatus.SEND_TO_JUDGE; import static uk.gov.hmcts.reform.fpl.enums.YesNo.NO; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.asDynamicList; diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/orders/generator/DocumentMerger.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/orders/generator/DocumentMerger.java index fa37b257a5a..babeaf6b526 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/orders/generator/DocumentMerger.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/orders/generator/DocumentMerger.java @@ -3,11 +3,6 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.pdfbox.multipdf.PDFMergerUtility; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.PDPageContentStream; -import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.apache.pdfbox.pdmodel.font.PDType1Font; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; @@ -73,6 +68,4 @@ private List getPdfFilesToMerge(DocmosisDocument originalDocument, return documents; } - - } From 8f7d4fead34e2c1e17a3f7460ecd8cad878a9b73 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Wed, 21 May 2025 20:00:09 +0100 Subject: [PATCH 05/23] fine tune --- .../hmcts/reform/fpl/enums/DocmosisTemplates.java | 2 +- .../hmcts/reform/fpl/service/JudicialService.java | 15 +++++++++++---- .../DocmosisApprovedOrderCoverSheetService.java | 4 +--- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java index e26867dc4c8..c805f379b32 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java @@ -26,7 +26,7 @@ public enum DocmosisTemplates { EPO("FL-PLW-GOR-ENG-00228.doc", null, "emergency_protection_order"), EPO_V2("FL-PLW-GOR-ENG-00744.doc", null, "emergency_protection_order"), COVER_DOCS("FL-PLW-LET-ENG-COVER-SHEET.doc", "FL-PLW-LET-WEL-COVER-SHEET.doc", "cover_documents"), - APPROVED_ORDER_COVER("FL-PLW-LET-ENG-APPROVED-ORDER-COVER-SHEET.docx", null, "approved-order-cover"), + APPROVED_ORDER_COVER("FL-PLW-GOR-ENG-APPROVED-ORDER-COVER-SHEET.docx", null, "approved-order-cover"), TRANSLATION_REQUEST("FL-PLW-LET-ENG-00748.doc", null, "translation_request"), A70("FL-PLW-GOR-ENG-00763V2.doc", null, "placement_order_a70"), A81("FL-PLW-GOR-ENG-00728.doc", null, "placement_order_a81"), diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java index c1830040151..d3e07de6854 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java @@ -71,7 +71,7 @@ public class JudicialService { public static final List FEE_PAID_JUDGE_TITLES = List.of(DEPUTY_HIGH_COURT_JUDGE, RECORDER, DEPUTY_DISTRICT_JUDGE, DEPUTY_DISTRICT_JUDGE_MAGISTRATES_COURT); public static final List LEGAL_ADVISOR_TITLES = - List.of(JudgeOrMagistrateTitle.MAGISTRATES, JudgeOrMagistrateTitle.LEGAL_ADVISOR); + List.of(MAGISTRATES, JudgeOrMagistrateTitle.LEGAL_ADVISOR); private final SystemUserService systemUserService; private final AuthTokenGenerator authTokenGenerator; @@ -389,7 +389,7 @@ public List getHearingJudgeRolesForMigration(CaseData caseData) boolean isLegalAdviser = userRoleCategory.get().equals(RoleCategory.LEGAL_OPERATIONS); - return RoleAssignmentUtils.buildRoleAssignment( + return buildRoleAssignment( caseData.getId(), time.getJudgeId(), isLegalAdviser @@ -534,8 +534,15 @@ public List getJudicialUserProfiles(JudicialUserRequest req public String getJudgeTitleAndNameOfCurrentUser() { UserDetails userDetails = userService.getUserDetails(); - return getJudicialUserProfiles(JudicialUserRequest.builder().idamId(List.of(userDetails.getId())).build()) - .stream().map(judicialUserProfile -> + List judicialUserProfiles = List.of(); + try { + judicialUserProfiles = getJudicialUserProfiles(JudicialUserRequest.builder() + .idamId(List.of(userDetails.getId())).build()); + } catch (Exception e) { + log.warn("Error while fetching JudicialUserProfile", e); + } + + return judicialUserProfiles.stream().map(judicialUserProfile -> formatJudgeTitleAndName(JudgeAndLegalAdvisor.fromJudicialUserProfile(judicialUserProfile, null))) .findFirst() .orElse(userDetails.getFullName()); diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java index 82daf8d45e9..4eee1f59eb3 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java @@ -26,8 +26,6 @@ import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; -import static uk.gov.hmcts.reform.fpl.service.docmosis.DocmosisTemplateDataGeneration.getHmctsLogoLarge; -import static uk.gov.hmcts.reform.fpl.service.docmosis.DocmosisTemplateDataGeneration.getHmctsLogoSmall; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.formatLocalDateToString; @@ -62,7 +60,7 @@ public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, Document contentStream.setFont(PDType1Font.TIMES_BOLD, 12); float textX = 50; - float textY = pageSize.getHeight() - 50; + float textY = pageSize.getHeight() - 45; contentStream.newLineAtOffset(textX, textY); // Adjust position contentStream.showText("ANNEX A:"); contentStream.endText(); From a7e03f616106243c6b4cc18a991eee6fdf3e1604 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Thu, 22 May 2025 12:00:04 +0100 Subject: [PATCH 06/23] fix idam id --- .../CareSupervision/hearingOrders.json | 10 +++++++++ .../orders/ApproveDraftOrdersController.java | 5 +++++ .../model/event/ReviewDraftOrdersData.java | 4 +++- .../reform/fpl/service/JudicialService.java | 9 +++++--- .../service/cmo/HearingOrderGenerator.java | 2 -- ...ocmosisApprovedOrderCoverSheetService.java | 21 +++++++------------ .../cmo/ApproveDraftOrdersServiceTest.java | 1 - ...sisApprovedOrderCoverSheetServiceTest.java | 8 ++----- 8 files changed, 34 insertions(+), 26 deletions(-) diff --git a/ccd-definition/CaseField/CareSupervision/hearingOrders.json b/ccd-definition/CaseField/CareSupervision/hearingOrders.json index 464abf49c83..cfe0c59fcbc 100644 --- a/ccd-definition/CaseField/CareSupervision/hearingOrders.json +++ b/ccd-definition/CaseField/CareSupervision/hearingOrders.json @@ -1224,5 +1224,15 @@ "FieldType": "DraftOrderUrgencyOption", "SecurityClassification": "Public", "Searchable": "N" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "judgeTitleAndName", + "Label": "Title and name of the judge who approved the order", + "FieldType": "Text", + "SecurityClassification": "Public", + "FieldShownCondition": "judgeTitleAndName=\"DO_NOT_SHOW\"", + "Searchable": "N" } ] diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java index a727c75e726..0b6197f6e85 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java @@ -15,6 +15,7 @@ import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundle; +import uk.gov.hmcts.reform.fpl.service.JudicialService; import uk.gov.hmcts.reform.fpl.service.ccd.CoreCaseDataService; import uk.gov.hmcts.reform.fpl.service.cmo.ApproveDraftOrdersService; import uk.gov.hmcts.reform.fpl.service.cmo.DraftOrdersEventNotificationBuilder; @@ -35,6 +36,7 @@ public class ApproveDraftOrdersController extends CallbackController { private final ApproveDraftOrdersService approveDraftOrdersService; private final DraftOrdersEventNotificationBuilder draftOrdersEventNotificationBuilder; private final CoreCaseDataService coreCaseDataService; + private final JudicialService judicialService; private static final String DRAFT_ORDERS_APPROVED = "draftOrdersApproved"; @@ -91,6 +93,9 @@ public AboutToStartOrSubmitCallbackResponse validateReviewDecision(@RequestBody public AboutToStartOrSubmitCallbackResponse handleAboutToSubmit(@RequestBody CallbackRequest callbackRequest) { CaseDetails caseDetails = callbackRequest.getCaseDetails(); + // Capture the title and name of the Judge who approved the order + caseDetails.getData().put("judgeTitleAndName", judicialService.getJudgeTitleAndNameOfCurrentUser()); + // DFPL-1171 move all document processing step to post-about-to-submitted stage return respond(caseDetails); diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java index 4df75ff5946..38c0eb2d8f8 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java @@ -13,6 +13,8 @@ @Builder(toBuilder = true) @JsonInclude(JsonInclude.Include.NON_EMPTY) public class ReviewDraftOrdersData { + String judgeTitleAndName; + String draftCMOExists; String draftBlankOrdersCount; @@ -59,7 +61,7 @@ public static String[] transientFields() { "cmoDraftOrderDocument", "draftOrder1Document", "draftOrder2Document", "draftOrder3Document", "draftOrder4Document", "draftOrder5Document", "draftOrder6Document", "draftOrder7Document", "draftOrder8Document", "draftOrder9Document", "draftOrder10Document", "reviewDraftOrdersTitles", - "draftOrdersTitlesInBundle", "draftOrdersApproved" + "draftOrdersTitlesInBundle", "draftOrdersApproved", "judgeTitleAndName" }; } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java index d3e07de6854..7c0803bbb1f 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java @@ -24,7 +24,6 @@ import uk.gov.hmcts.reform.fpl.model.common.JudgeAndLegalAdvisor; import uk.gov.hmcts.reform.fpl.model.event.AllocateJudgeEventData; import uk.gov.hmcts.reform.fpl.model.migration.HearingJudgeTime; -import uk.gov.hmcts.reform.fpl.utils.RoleAssignmentUtils; import uk.gov.hmcts.reform.idam.client.models.UserDetails; import uk.gov.hmcts.reform.rd.client.JudicialApi; import uk.gov.hmcts.reform.rd.client.StaffApi; @@ -531,13 +530,17 @@ public List getJudicialUserProfiles(JudicialUserRequest req } @Retryable(value = {FeignException.class}, label = "Search JRD for a judge by idam id") + public List getJudicialUserProfilesByIdamId(String idamId) { + return getJudicialUserProfiles(JudicialUserRequest.builder() + .idamId(List.of(idamId)).build()); + } + public String getJudgeTitleAndNameOfCurrentUser() { UserDetails userDetails = userService.getUserDetails(); List judicialUserProfiles = List.of(); try { - judicialUserProfiles = getJudicialUserProfiles(JudicialUserRequest.builder() - .idamId(List.of(userDetails.getId())).build()); + judicialUserProfiles = getJudicialUserProfilesByIdamId(userDetails.getId()); } catch (Exception e) { log.warn("Error while fetching JudicialUserProfile", e); } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java index 3ca16bf032d..dd8d66fb58d 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java @@ -6,13 +6,11 @@ import org.springframework.stereotype.Component; import uk.gov.hmcts.reform.fpl.enums.CMOStatus; import uk.gov.hmcts.reform.fpl.model.CaseData; -import uk.gov.hmcts.reform.fpl.model.Court; import uk.gov.hmcts.reform.fpl.model.Other; import uk.gov.hmcts.reform.fpl.model.ReviewDecision; import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; import uk.gov.hmcts.reform.fpl.model.common.Element; -import uk.gov.hmcts.reform.fpl.model.document.SealType; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.service.DocumentSealingService; import uk.gov.hmcts.reform.fpl.service.UploadDocumentService; diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java index 4eee1f59eb3..1ccf723dab5 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java @@ -15,14 +15,12 @@ import uk.gov.hmcts.reform.fpl.model.configuration.Language; import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisApprovedOrderCoverSheet; import uk.gov.hmcts.reform.fpl.service.CaseDataExtractionService; -import uk.gov.hmcts.reform.fpl.service.JudicialService; import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; import uk.gov.hmcts.reform.fpl.service.time.Time; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; -import java.util.Optional; import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; @@ -35,11 +33,10 @@ public class DocmosisApprovedOrderCoverSheetService { private final DocmosisDocumentGeneratorService docmosisDocumentGeneratorService; private final CaseDataExtractionService caseDataExtractionService; private final DocumentMerger documentMerger; - private final JudicialService judicialService; private final Time time; - public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, DocumentReference order) throws IOException - { + public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, + DocumentReference order) throws IOException { // Create DocmosisDocument coverSheet = createCoverSheet(caseData); @@ -55,7 +52,9 @@ public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, Document PDPage secondPage = document.getPage(1); // Index 1 is the second page PDRectangle pageSize = secondPage.getMediaBox(); - try (PDPageContentStream contentStream = new PDPageContentStream(document, secondPage, PDPageContentStream.AppendMode.APPEND, true, true)) { + try (PDPageContentStream contentStream = new PDPageContentStream(document, secondPage, + PDPageContentStream.AppendMode.APPEND, true, true)) { + contentStream.beginText(); contentStream.setFont(PDType1Font.TIMES_BOLD, 12); @@ -84,24 +83,20 @@ public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, Document } public DocmosisDocument createCoverSheet(CaseData caseData) { - Language applicationLanguage = Optional.ofNullable(caseData.getC110A() - .getLanguageRequirementApplication()).orElse(Language.ENGLISH); DocmosisApprovedOrderCoverSheet coverDocumentData = buildCoverDocumentsData(caseData); return docmosisDocumentGeneratorService.generateDocmosisDocument(coverDocumentData, APPROVED_ORDER_COVER, RenderFormat.PDF, - applicationLanguage); + Language.ENGLISH); } public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData) { - Language applicationLanguage = Optional.ofNullable(caseData.getC110A() - .getLanguageRequirementApplication()).orElse(Language.ENGLISH); return DocmosisApprovedOrderCoverSheet.builder() .familyManCaseNumber(caseData.getFamilyManCaseNumber()) .courtName(caseDataExtractionService.getCourtName(caseData)) .children(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())) - .judgeTitleAndName(judicialService.getJudgeTitleAndNameOfCurrentUser()) - .dateOfApproval(formatLocalDateToString(time.now().toLocalDate(), DATE, applicationLanguage)) + .judgeTitleAndName(caseData.getReviewDraftOrdersData().getJudgeTitleAndName()) + .dateOfApproval(formatLocalDateToString(time.now().toLocalDate(), DATE, Language.ENGLISH)) .crest(CREST.getValue()) .build(); } diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java index 321c115c0cc..f69725a6af5 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java @@ -30,7 +30,6 @@ import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicListElement; -import uk.gov.hmcts.reform.fpl.model.document.SealType; import uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundle; diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java index 190b6b8f2fd..a9639b363fc 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java @@ -5,8 +5,6 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; -import org.springframework.test.context.ContextConfiguration; import uk.gov.hmcts.reform.fpl.enums.docmosis.RenderFormat; import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.Child; @@ -17,9 +15,9 @@ import uk.gov.hmcts.reform.fpl.model.configuration.Language; import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisApprovedOrderCoverSheet; import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisChild; +import uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData; import uk.gov.hmcts.reform.fpl.model.group.C110A; import uk.gov.hmcts.reform.fpl.service.CaseDataExtractionService; -import uk.gov.hmcts.reform.fpl.service.JudicialService; import uk.gov.hmcts.reform.fpl.service.time.Time; import java.time.LocalDateTime; @@ -60,8 +58,6 @@ class DocmosisApprovedOrderCoverSheetServiceTest { @Mock private CaseDataExtractionService caseDataExtractionService; @Mock - private JudicialService judicialService; - @Mock private Time time; @InjectMocks private DocmosisApprovedOrderCoverSheetService underTest; @@ -77,11 +73,11 @@ void shouldGenerateApprovedOrderCoverSheet() { .build()) .children1(List.of(CHILD)) .confidentialChildren(List.of(CONFIDENTIAL_CHILD)) + .reviewDraftOrdersData(ReviewDraftOrdersData.builder().judgeTitleAndName(JUDGE_NAME).build()) .build(); given(caseDataExtractionService.getCourtName(caseData)).willReturn(COURT_NAME); given(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())).willReturn(DOCMOSIS_CHILDREN); - given(judicialService.getJudgeTitleAndNameOfCurrentUser()).willReturn(JUDGE_NAME); given(time.now()).willReturn(TEST_TIME); DocmosisApprovedOrderCoverSheet expectedDocmosisData = DocmosisApprovedOrderCoverSheet.builder() From 9bea0fc6d969aad09b145366152b00169aac00d6 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Thu, 22 May 2025 15:25:08 +0100 Subject: [PATCH 07/23] Create ApproveDraftOrdersControllerAbooutToSubmitTest.java --- ...aftOrdersControllerAbooutToSubmitTest.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerAbooutToSubmitTest.java diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerAbooutToSubmitTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerAbooutToSubmitTest.java new file mode 100644 index 00000000000..0542d2aad61 --- /dev/null +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerAbooutToSubmitTest.java @@ -0,0 +1,33 @@ +package uk.gov.hmcts.reform.fpl.controllers; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import uk.gov.hmcts.reform.fpl.controllers.orders.ApproveDraftOrdersController; +import uk.gov.hmcts.reform.fpl.model.CaseData; +import uk.gov.hmcts.reform.fpl.service.JudicialService; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@WebMvcTest(ApproveDraftOrdersController.class) +@OverrideAutoConfiguration(enabled = true) +class ApproveDraftOrdersControllerAbooutToSubmitTest extends AbstractCallbackTest { + + @MockBean + private JudicialService judicialService; + + ApproveDraftOrdersControllerAbooutToSubmitTest() { + super("approve-draft-orders"); + } + + @Test + void shouldCaptureJudgeTitleAndName() { + when(judicialService.getJudgeTitleAndNameOfCurrentUser()).thenReturn("Judge Name"); + + CaseData returnedCaseData = extractCaseData(postAboutToSubmitEvent(CaseData.builder().build())); + assertThat(returnedCaseData.getReviewDraftOrdersData().getJudgeTitleAndName()) + .isEqualTo("Judge Name"); + } +} From e6ebf21259489af565c9c20a23100b7a2e52e7b2 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Thu, 22 May 2025 15:58:31 +0100 Subject: [PATCH 08/23] Update DocmosisApprovedOrderCoverSheetServiceTest.java --- ...sisApprovedOrderCoverSheetServiceTest.java | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java index a9639b363fc..555524f82de 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java @@ -5,6 +5,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import uk.gov.hmcts.reform.fpl.docmosis.DocmosisHelper; import uk.gov.hmcts.reform.fpl.enums.docmosis.RenderFormat; import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.Child; @@ -18,18 +19,23 @@ import uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData; import uk.gov.hmcts.reform.fpl.model.group.C110A; import uk.gov.hmcts.reform.fpl.service.CaseDataExtractionService; +import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; import uk.gov.hmcts.reform.fpl.service.time.Time; +import uk.gov.hmcts.reform.fpl.utils.ResourceReader; +import java.io.IOException; import java.time.LocalDateTime; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.formatLocalDateToString; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; +import static uk.gov.hmcts.reform.fpl.utils.TestDataHelper.testDocumentReference; @ExtendWith(MockitoExtension.class) class DocmosisApprovedOrderCoverSheetServiceTest { @@ -48,7 +54,6 @@ class DocmosisApprovedOrderCoverSheetServiceTest { DocmosisChild.builder().name("Test Child").build(), DocmosisChild.builder().name("Confidential Child").build() ); - private static final DocmosisDocument COVER_SHEET = new DocmosisDocument(FILE_NAME, PDF_BYTES); public static final String COURT_NAME = "Test Court"; public static final String JUDGE_NAME = "Test Judge"; @@ -58,6 +63,8 @@ class DocmosisApprovedOrderCoverSheetServiceTest { @Mock private CaseDataExtractionService caseDataExtractionService; @Mock + private DocumentMerger documentMerger; + @Mock private Time time; @InjectMocks private DocmosisApprovedOrderCoverSheetService underTest; @@ -98,4 +105,47 @@ void shouldGenerateApprovedOrderCoverSheet() { assertThat(result).isEqualTo(COVER_SHEET); } + + @Test + void shouldAddCoverSheetAndAddAnnexAWording() throws IOException { + CaseData caseData = CaseData.builder() + .id(CASE_ID) + .familyManCaseNumber(FAMILY_MAN_NUMBER) + .court(COURT) + .c110A(C110A.builder() + .languageRequirementApplication(LANGUAGE) + .build()) + .children1(List.of(CHILD)) + .confidentialChildren(List.of(CONFIDENTIAL_CHILD)) + .reviewDraftOrdersData(ReviewDraftOrdersData.builder().judgeTitleAndName(JUDGE_NAME).build()) + .build(); + + given(caseDataExtractionService.getCourtName(caseData)).willReturn(COURT_NAME); + given(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())).willReturn(DOCMOSIS_CHILDREN); + given(time.now()).willReturn(TEST_TIME); + + DocmosisApprovedOrderCoverSheet expectedDocmosisData = DocmosisApprovedOrderCoverSheet.builder() + .familyManCaseNumber(FAMILY_MAN_NUMBER) + .courtName(COURT_NAME) + .children(DOCMOSIS_CHILDREN) + .judgeTitleAndName(JUDGE_NAME) + .dateOfApproval(formatLocalDateToString(TEST_TIME.toLocalDate(), DATE, Language.ENGLISH)) + .crest(CREST.getValue()) + .build(); + + + given(docmosisDocumentGeneratorService.generateDocmosisDocument(expectedDocmosisData, APPROVED_ORDER_COVER, + RenderFormat.PDF, LANGUAGE)) + .willReturn(COVER_SHEET); + + byte[] mergedOrderBytes = ResourceReader.readBytes("documents/document.pdf"); + DocmosisDocument MERGED_ORDER = new DocmosisDocument("merged_order.pdf", mergedOrderBytes); + given(documentMerger.mergeDocuments(any(), any())).willReturn(MERGED_ORDER); + + DocmosisDocument result = underTest.addCoverSheetToApprovedOrder(caseData, testDocumentReference()); + + String resultText = (new DocmosisHelper()).extractPdfContent(result.getBytes()); + + assertThat(resultText).isEqualToNormalizingWhitespace("First page Second page ANNEX A: "); + } } From 11be215f380eca66e63a7226c05f6cce81fbe561 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Thu, 22 May 2025 16:27:12 +0100 Subject: [PATCH 09/23] fix check style --- .../docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java index 555524f82de..5a497b0a09d 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java @@ -139,8 +139,8 @@ void shouldAddCoverSheetAndAddAnnexAWording() throws IOException { .willReturn(COVER_SHEET); byte[] mergedOrderBytes = ResourceReader.readBytes("documents/document.pdf"); - DocmosisDocument MERGED_ORDER = new DocmosisDocument("merged_order.pdf", mergedOrderBytes); - given(documentMerger.mergeDocuments(any(), any())).willReturn(MERGED_ORDER); + DocmosisDocument mergedOrder = new DocmosisDocument("merged_order.pdf", mergedOrderBytes); + given(documentMerger.mergeDocuments(any(), any())).willReturn(mergedOrder); DocmosisDocument result = underTest.addCoverSheetToApprovedOrder(caseData, testDocumentReference()); From 514ed45b9ddceac4a0b4ce452d72450df619ce48 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Wed, 4 Jun 2025 12:31:25 +0100 Subject: [PATCH 10/23] git all the stuff so far --- .../CareSupervision/gatekeeper.json | 14 +++++ .../CareSupervision/judiciary.json | 14 +++++ .../CareSupervision/superuser.json | 14 +++++ .../review-CMO/previewApprovedOrder.json | 20 ++++++ .../CareSupervision/reviewCMO.json | 52 +++++++++++++++- .../CareSupervision/hearingOrders.json | 19 ++++++ ...aftOrdersControllerAbooutToSubmitTest.java | 2 +- .../orders/ApproveDraftOrdersController.java | 36 ++++++++++- .../model/event/AllocateJudgeEventData.java | 6 ++ .../model/event/ReviewDraftOrdersData.java | 35 ++++++++++- .../fpl/model/order/HearingOrdersBundle.java | 6 ++ .../reform/fpl/service/JudicialService.java | 56 ++++++++++++++--- .../cmo/ApproveDraftOrdersService.java | 47 ++++++++++++-- .../service/cmo/HearingOrderGenerator.java | 27 ++++---- .../rd/model/JudicialUserAppointment.java | 62 +++++++++++++++++++ .../rd/model/JudicialUserAuthorisations.java | 45 ++++++++++++++ .../reform/rd/model/JudicialUserProfile.java | 4 ++ .../fpl/service/JudicialServiceTest.java | 4 +- 18 files changed, 428 insertions(+), 35 deletions(-) create mode 100644 ccd-definition/CaseEventToComplexTypes/review-CMO/previewApprovedOrder.json create mode 100644 service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAppointment.java create mode 100644 service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAuthorisations.java diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json b/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json index c61caf0da0e..44e4911708d 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json @@ -4150,6 +4150,20 @@ "UserRole": "caseworker-publiclaw-gatekeeper", "CRUD": "CRU" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewOrderLabel", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrders", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json b/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json index d360dedd2a4..f1eb68643e3 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json @@ -4367,6 +4367,20 @@ "UserRole": "caseworker-publiclaw-judiciary", "CRUD": "CRU" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewOrderLabel", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrders", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json b/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json index df8b8c2b2a0..a9e93b71604 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json @@ -636,6 +636,20 @@ "UserRole": "caseworker-publiclaw-superuser", "CRUD": "CRU" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewOrderLabel", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrders", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", diff --git a/ccd-definition/CaseEventToComplexTypes/review-CMO/previewApprovedOrder.json b/ccd-definition/CaseEventToComplexTypes/review-CMO/previewApprovedOrder.json new file mode 100644 index 00000000000..77f528c5821 --- /dev/null +++ b/ccd-definition/CaseEventToComplexTypes/review-CMO/previewApprovedOrder.json @@ -0,0 +1,20 @@ +[ + { + "LiveFrom": "01/01/2017", + "ID": "PreviewApprovedOrders", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrders", + "ListElementCode": "title", + "FieldDisplayOrder": 1, + "DisplayContext": "READONLY" + }, + { + "LiveFrom": "01/01/2017", + "ID": "PreviewApprovedOrders", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrders", + "ListElementCode": "order", + "FieldDisplayOrder": 2, + "DisplayContext": "READONLY" + } +] diff --git a/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json b/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json index 0df33262674..32e9115f265 100644 --- a/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json +++ b/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json @@ -683,6 +683,56 @@ "PageColumnNumber": 1, "PageShowCondition": "numDraftCMOs=\"NONE\"" }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "judgeType", + "DisplayContext": "READONLY", + "PageID": "FeePaidJudge", + "PageDisplayOrder": 4, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 1, + "FieldShowCondition": "feePaidJudgeTitle=\"DO_NOT_SHOW\"", + "PageShowCondition": "judgeType=\"FEE_PAID_JUDGE\"", + "CallBackURLMidEvent": "${CCD_DEF_CASE_SERVICE_BASE_URL}/callback/approve-draft-orders/preview-orders/mid-event", + "Comment": "This page is only shown when a fee paid judge approving and cover sheet is required" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "feePaidJudgeTitle", + "CaseEventFieldLabel": "Please select your title", + "DisplayContext": "MANDATORY", + "PageID": "FeePaidJudge", + "PageDisplayOrder": 4, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 2 + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewOrderLabel", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 1, + "PageShowCondition": "previewApprovedOrders=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrders", + "DisplayContext": "COMPLEX", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 2 + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", @@ -691,7 +741,7 @@ "DisplayContext": "COMPLEX", "PageID": "UrgencyCheck", "PageFieldDisplayOrder": 1, - "PageDisplayOrder": 4, + "PageDisplayOrder": 6, "PageColumnNumber": 1, "ShowSummaryChangeOption": "Y", "PageShowCondition": "draftOrdersApproved=\"Yes\"" diff --git a/ccd-definition/CaseField/CareSupervision/hearingOrders.json b/ccd-definition/CaseField/CareSupervision/hearingOrders.json index cfe0c59fcbc..c349f88d491 100644 --- a/ccd-definition/CaseField/CareSupervision/hearingOrders.json +++ b/ccd-definition/CaseField/CareSupervision/hearingOrders.json @@ -1234,5 +1234,24 @@ "SecurityClassification": "Public", "FieldShownCondition": "judgeTitleAndName=\"DO_NOT_SHOW\"", "Searchable": "N" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewOrderLabel", + "Label": "Cover sheets will be automatically added to the following C21 orders. If the content is incorrect, please return to the previous step and upload a revised document.", + "FieldType": "Label", + "SecurityClassification": "Public", + "Searchable": "N" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrders", + "Label": " ", + "FieldType": "Collection", + "FieldTypeParameter": "UploadedCaseManagementOrder", + "SecurityClassification": "Public", + "Searchable": "N" } ] diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerAbooutToSubmitTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerAbooutToSubmitTest.java index 0542d2aad61..3894d36f657 100644 --- a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerAbooutToSubmitTest.java +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerAbooutToSubmitTest.java @@ -24,7 +24,7 @@ class ApproveDraftOrdersControllerAbooutToSubmitTest extends AbstractCallbackTes @Test void shouldCaptureJudgeTitleAndName() { - when(judicialService.getJudgeTitleAndNameOfCurrentUser()).thenReturn("Judge Name"); + when(judicialService.getJudgeTitleAndNameOfCurrentUser(null)).thenReturn("Judge Name"); CaseData returnedCaseData = extractCaseData(postAboutToSubmitEvent(CaseData.builder().build())); assertThat(returnedCaseData.getReviewDraftOrdersData().getJudgeTitleAndName()) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java index 0b6197f6e85..7d893a400df 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java @@ -26,6 +26,7 @@ import static org.apache.commons.lang3.ObjectUtils.isEmpty; import static org.apache.commons.lang3.ObjectUtils.isNotEmpty; +import static uk.gov.hmcts.reform.fpl.enums.JudgeType.FEE_PAID_JUDGE; import static uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData.reviewDecisionFields; import static uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData.transientFields; @@ -46,7 +47,8 @@ public AboutToStartOrSubmitCallbackResponse handleAboutToStart(@RequestBody Call CaseData caseData = getCaseData(caseDetails); CaseDetailsHelper.removeTemporaryFields(caseDetails, reviewDecisionFields()); - CaseDetailsHelper.removeTemporaryFields(caseDetails, "orderReviewUrgency", DRAFT_ORDERS_APPROVED); + CaseDetailsHelper.removeTemporaryFields(caseDetails, "orderReviewUrgency", DRAFT_ORDERS_APPROVED, + "feePaidJudgeTitle"); caseDetails.getData().putAll(approveDraftOrdersService.getPageDisplayControls(caseData)); @@ -86,15 +88,43 @@ public AboutToStartOrSubmitCallbackResponse validateReviewDecision(@RequestBody data.put(DRAFT_ORDERS_APPROVED, "No"); } + data.remove("judgeType"); + if ((caseData.getReviewDraftOrdersData() != null + && caseData.getReviewDraftOrdersData().hasADraftBeenApprovedWithoutChanges())) { + if (judicialService.isCurrentUserFeePaidJudge()) { + data.put("judgeType", FEE_PAID_JUDGE); + } else { + data.putAll(approveDraftOrdersService.previewOrderWithCoverSheet(caseData)); + } + } + return respond(caseDetails, errors); } + @PostMapping("/preview-orders/mid-event") + public AboutToStartOrSubmitCallbackResponse previewOrders(@RequestBody CallbackRequest callbackRequest) { + CaseDetails caseDetails = callbackRequest.getCaseDetails(); + CaseData caseData = getCaseData(caseDetails); + + caseData = caseData.toBuilder() + .reviewDraftOrdersData(caseData.getReviewDraftOrdersData().toBuilder() + .judgeTitleAndName(approveDraftOrdersService.getJudgeTitleAndNameOfCurrentUser(caseData)) + .build()) + .build(); + + // Generate the preview of the orders with cover sheet + caseDetails.getData().putAll(approveDraftOrdersService.previewOrderWithCoverSheet(caseData)); + + return respond(caseDetails); + } + @PostMapping("/about-to-submit") public AboutToStartOrSubmitCallbackResponse handleAboutToSubmit(@RequestBody CallbackRequest callbackRequest) { CaseDetails caseDetails = callbackRequest.getCaseDetails(); + CaseData caseData = getCaseData(caseDetails); - // Capture the title and name of the Judge who approved the order - caseDetails.getData().put("judgeTitleAndName", judicialService.getJudgeTitleAndNameOfCurrentUser()); + caseDetails.getData().put("judgeTitleAndName", + approveDraftOrdersService.getJudgeTitleAndNameOfCurrentUser(caseData)); // DFPL-1171 move all document processing step to post-about-to-submitted stage diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/AllocateJudgeEventData.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/AllocateJudgeEventData.java index 2de232c28a5..8a5f4458b93 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/AllocateJudgeEventData.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/AllocateJudgeEventData.java @@ -10,6 +10,8 @@ import uk.gov.hmcts.reform.fpl.model.JudicialUser; import uk.gov.hmcts.reform.fpl.model.Temp; +import static uk.gov.hmcts.reform.fpl.enums.JudgeType.FEE_PAID_JUDGE; + @Data @JsonInclude(JsonInclude.Include.NON_NULL) @AllArgsConstructor @@ -23,4 +25,8 @@ public class AllocateJudgeEventData { private final JudicialUser judicialUser; @Temp private final Judge manualJudgeDetails; + + public JudgeOrMagistrateTitle getFeePaidJudgeTitle() { + return (FEE_PAID_JUDGE.equals(judgeType)) ? feePaidJudgeTitle : null; + } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java index 38c0eb2d8f8..5f30c71c79d 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java @@ -5,14 +5,17 @@ import lombok.Builder; import lombok.Value; import uk.gov.hmcts.reform.fpl.model.ReviewDecision; +import uk.gov.hmcts.reform.fpl.model.Temp; import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; import static org.springframework.util.ObjectUtils.isEmpty; +import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.SEND_TO_ALL_PARTIES; @Value @Builder(toBuilder = true) @JsonInclude(JsonInclude.Include.NON_EMPTY) public class ReviewDraftOrdersData { + @Temp String judgeTitleAndName; String draftCMOExists; @@ -61,7 +64,8 @@ public static String[] transientFields() { "cmoDraftOrderDocument", "draftOrder1Document", "draftOrder2Document", "draftOrder3Document", "draftOrder4Document", "draftOrder5Document", "draftOrder6Document", "draftOrder7Document", "draftOrder8Document", "draftOrder9Document", "draftOrder10Document", "reviewDraftOrdersTitles", - "draftOrdersTitlesInBundle", "draftOrdersApproved", "judgeTitleAndName" + "draftOrdersTitlesInBundle", "draftOrdersApproved", "judgeTitleAndName", "feePaidJudgeTitle", "judgeType", + "previewApprovedOrders" }; } @@ -87,4 +91,33 @@ public boolean hasADraftBeenApproved() { || (!isEmpty(reviewDecision10) && reviewDecision10.hasBeenApproved()); } + @JsonIgnore + public boolean hasADraftBeenApprovedWithoutChanges() { + return (!isEmpty(reviewDecision1) && reviewDecision1.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision2) && reviewDecision2.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision3) && reviewDecision3.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision4) && reviewDecision4.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision5) && reviewDecision5.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision6) && reviewDecision6.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision7) && reviewDecision7.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision8) && reviewDecision8.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision9) && reviewDecision9.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)) + || (!isEmpty(reviewDecision10) && reviewDecision10.hasReviewOutcomeOf(SEND_TO_ALL_PARTIES)); + } + + public ReviewDecision getReviewDecision(int counter) { + return switch (counter) { + case 1 -> reviewDecision1; + case 2 -> reviewDecision2; + case 3 -> reviewDecision3; + case 4 -> reviewDecision4; + case 5 -> reviewDecision5; + case 6 -> reviewDecision6; + case 7 -> reviewDecision7; + case 8 -> reviewDecision8; + case 9 -> reviewDecision9; + case 10 -> reviewDecision10; + default -> null; + }; + } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/order/HearingOrdersBundle.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/order/HearingOrdersBundle.java index b4e6c714452..2e5132de4d4 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/order/HearingOrdersBundle.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/order/HearingOrdersBundle.java @@ -15,6 +15,7 @@ import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; +import java.util.stream.Stream; import static com.google.common.collect.Lists.newArrayList; import static java.util.Comparator.comparingInt; @@ -128,6 +129,11 @@ public List> getAllConfidentialOrdersByStatus(CMOStatus st .collect(Collectors.toList()); } + @JsonIgnore + public List> getAllOrdersAndConfidentialOrders() { + return Stream.of(getOrders(), getAllConfidentialOrders()).flatMap(List::stream).toList(); + } + @JsonIgnore public List> getCaseManagementOrders() { if (isNotEmpty(orders)) { diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java index fc93538f964..d0eb9cad2ee 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/JudicialService.java @@ -24,12 +24,15 @@ import uk.gov.hmcts.reform.fpl.model.common.JudgeAndLegalAdvisor; import uk.gov.hmcts.reform.fpl.model.event.AllocateJudgeEventData; import uk.gov.hmcts.reform.fpl.model.migration.HearingJudgeTime; +import uk.gov.hmcts.reform.fpl.service.time.Time; import uk.gov.hmcts.reform.fpl.utils.RoleAssignmentUtils; import uk.gov.hmcts.reform.idam.client.models.UserDetails; import uk.gov.hmcts.reform.rd.client.JudicialApi; +import uk.gov.hmcts.reform.rd.model.JudicialUserAppointment; import uk.gov.hmcts.reform.rd.model.JudicialUserProfile; import uk.gov.hmcts.reform.rd.model.JudicialUserRequest; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.util.ArrayList; @@ -42,8 +45,10 @@ import java.util.Set; import java.util.stream.Collectors; +import static org.apache.commons.lang3.ObjectUtils.isNotEmpty; import static org.springframework.util.ObjectUtils.isEmpty; import static uk.gov.hmcts.reform.fpl.config.TimeConfiguration.LONDON_TIMEZONE; +import static uk.gov.hmcts.reform.fpl.config.rd.LegalAdviserUsersConfiguration.SERVICE_CODE; import static uk.gov.hmcts.reform.fpl.enums.JudgeCaseRole.ALLOCATED_JUDGE; import static uk.gov.hmcts.reform.fpl.enums.JudgeCaseRole.HEARING_JUDGE; import static uk.gov.hmcts.reform.fpl.enums.JudgeOrMagistrateTitle.DEPUTY_DISTRICT_JUDGE; @@ -55,8 +60,10 @@ import static uk.gov.hmcts.reform.fpl.enums.JudgeType.LEGAL_ADVISOR; import static uk.gov.hmcts.reform.fpl.enums.LegalAdviserRole.ALLOCATED_LEGAL_ADVISER; import static uk.gov.hmcts.reform.fpl.enums.LegalAdviserRole.HEARING_LEGAL_ADVISER; +import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.nullSafeCollection; import static uk.gov.hmcts.reform.fpl.utils.JudgeAndLegalAdvisorHelper.formatJudgeTitleAndName; import static uk.gov.hmcts.reform.fpl.utils.RoleAssignmentUtils.buildRoleAssignment; +import static uk.gov.hmcts.reform.rd.model.JudicialUserAppointment.APPOINTMENT_TYPE_FEE_PAID; @Slf4j @Service @@ -89,6 +96,7 @@ public class JudicialService { private final LegalAdviserUsersConfiguration legalAdviserUsersConfiguration; private final ElinksService elinksService; private final UserService userService; + private final Time time; /** * Delete a set of allocated-[users] on a specific case. @@ -558,19 +566,49 @@ public List getJudicialUserProfilesByIdamId(String idamId) .idamId(List.of(idamId)).build()); } - public String getJudgeTitleAndNameOfCurrentUser() { + public String getJudgeTitleAndNameOfCurrentUser(JudgeOrMagistrateTitle judgeTitle) { UserDetails userDetails = userService.getUserDetails(); - - List judicialUserProfiles = List.of(); - try { - judicialUserProfiles = getJudicialUserProfilesByIdamId(userDetails.getId()); - } catch (Exception e) { - log.warn("Error while fetching JudicialUserProfile", e); - } + List judicialUserProfiles = getJudicialUserProfilesByIdamId(userDetails.getId()); return judicialUserProfiles.stream().map(judicialUserProfile -> - formatJudgeTitleAndName(JudgeAndLegalAdvisor.fromJudicialUserProfile(judicialUserProfile, null))) + formatJudgeTitleAndName(JudgeAndLegalAdvisor.fromJudicialUserProfile(judicialUserProfile, + judgeTitle))) .findFirst() .orElse(userDetails.getFullName()); } + + public boolean isCurrentUserFeePaidJudge() { + UserDetails userDetails = userService.getUserDetails(); + List judicialUserProfiles = getJudicialUserProfilesByIdamId(userDetails.getId()); + + return !judicialUserProfiles.isEmpty() && isFeePaidJudge(judicialUserProfiles.get(0)); + } + + private boolean isFeePaidJudge(JudicialUserProfile judicialUserProfile) { + LocalDate todayDate = time.now().toLocalDate(); + + List feePaidAppointments = + nullSafeCollection(judicialUserProfile.getAppointments()).stream() + .filter(appointment -> + APPOINTMENT_TYPE_FEE_PAID.equals(appointment.getAppointmentType()) + && isWithinDateRange(todayDate, appointment.getStartDate(), appointment.getEndDate())) + .map(JudicialUserAppointment::getAppointmentId) + .toList(); + + if (!feePaidAppointments.isEmpty()) { + return nullSafeCollection(judicialUserProfile.getAuthorisations()).stream() + .anyMatch(authorisation -> + nullSafeCollection(authorisation.getServiceCodes()).contains(SERVICE_CODE) + && isWithinDateRange(todayDate, authorisation.getStartDate(), authorisation.getEndDate()) + && feePaidAppointments.contains(authorisation.getAppointmentId()) + ); + } + + return false; + } + + private boolean isWithinDateRange(LocalDate todayDate, LocalDate startDate, LocalDate endDate) { + return isNotEmpty(startDate) && todayDate.isAfter(startDate) + && (isEmpty(endDate) || todayDate.isBefore(endDate)); + } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java index 2e105f46b8a..33c4dc44e22 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java @@ -4,6 +4,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome; import uk.gov.hmcts.reform.fpl.enums.HearingType; import uk.gov.hmcts.reform.fpl.enums.State; import uk.gov.hmcts.reform.fpl.exceptions.CMONotFoundException; @@ -14,10 +15,12 @@ import uk.gov.hmcts.reform.fpl.model.ReviewDecision; import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.common.dynamic.DynamicList; +import uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundle; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundles; import uk.gov.hmcts.reform.fpl.model.order.generated.GeneratedOrder; +import uk.gov.hmcts.reform.fpl.service.JudicialService; import uk.gov.hmcts.reform.fpl.service.OthersService; import uk.gov.hmcts.reform.fpl.utils.ElementUtils; @@ -28,7 +31,7 @@ import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; -import java.util.stream.Stream; +import java.util.stream.IntStream; import static com.google.common.collect.Lists.newArrayList; import static java.util.stream.Collectors.toList; @@ -38,8 +41,10 @@ import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.REVIEW_LATER; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.SEND_TO_ALL_PARTIES; import static uk.gov.hmcts.reform.fpl.enums.CMOStatus.SEND_TO_JUDGE; +import static uk.gov.hmcts.reform.fpl.enums.JudgeType.FEE_PAID_JUDGE; import static uk.gov.hmcts.reform.fpl.enums.YesNo.NO; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.asDynamicList; +import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.unwrapElements; @Service @@ -54,6 +59,7 @@ public class ApproveDraftOrdersService { private final BlankOrderGenerator blankOrderGenerator; private final HearingOrderGenerator hearingOrderGenerator; private final OthersService othersService; + private final JudicialService judicialService; private static final String ORDER_BUNDLES_DRAFT = "hearingOrdersBundlesDrafts"; private static final String REVIEW_DECISION = "reviewDecision"; @@ -240,9 +246,9 @@ public HearingOrder getLatestSealedCMO(CaseData caseData) { @SuppressWarnings("unchecked") public void reviewC21Orders(CaseData caseData, Map data, Element selectedOrdersBundle) { - List> draftOrders = Stream.of(selectedOrdersBundle.getValue().getOrders(), - selectedOrdersBundle.getValue().getAllConfidentialOrders()).flatMap(List::stream) - .filter(order -> !order.getValue().getType().isCmo()).collect(toList()); + List> draftOrders = selectedOrdersBundle.getValue() + .getAllOrdersAndConfidentialOrders().stream() + .filter(order -> !order.getValue().getType().isCmo()).toList(); List> ordersToBeSent = defaultIfNull(( List>) data.get(ORDERS_TO_BE_SENT), newArrayList()); @@ -251,8 +257,7 @@ public void reviewC21Orders(CaseData caseData, Map data, List> orderCollection = caseData.getOrderCollection(); for (Element orderElement : draftOrders) { - Map reviewDecisionMap = (Map) data.get(REVIEW_DECISION + counter); - ReviewDecision reviewDecision = mapper.convertValue(reviewDecisionMap, ReviewDecision.class); + ReviewDecision reviewDecision = caseData.getReviewDraftOrdersData().getReviewDecision(counter); if (reviewDecision != null && reviewDecision.getDecision() != null && !REVIEW_LATER.equals(reviewDecision.getDecision())) { @@ -395,4 +400,34 @@ private String getOthersNotified(List> selectedOthers) { .map(other -> other.getValue().getName()).collect(Collectors.joining(", ")) ).orElse(null); } + + public String getJudgeTitleAndNameOfCurrentUser(CaseData caseData) { + return judicialService.getJudgeTitleAndNameOfCurrentUser( + (FEE_PAID_JUDGE.equals(caseData.getAllocateJudgeEventData().getJudgeType())) + ? caseData.getAllocateJudgeEventData().getFeePaidJudgeTitle() : null); + } + + public Map previewOrderWithCoverSheet(CaseData caseData) { + final List> draftOrders = getSelectedHearingDraftOrdersBundle(caseData) + .getValue().getAllOrdersAndConfidentialOrders().stream() + .filter(order -> !order.getValue().getType().isCmo()) + .toList(); + + final ReviewDraftOrdersData reviewDraftOrdersData = caseData.getReviewDraftOrdersData(); + + // Filter out the orders that have been approved by Judge without amendments + return Map.of( + "previewApprovedOrders", IntStream.range(0, draftOrders.size()) + .filter(counter -> CMOReviewOutcome.SEND_TO_ALL_PARTIES + .equals(reviewDraftOrdersData.getReviewDecision(counter).getDecision())) + .mapToObj(counter -> { + Element approvedOrderElement = draftOrders.get(counter); + HearingOrder approvedOrder = approvedOrderElement.getValue(); + return element(approvedOrderElement.getId(), approvedOrder.toBuilder() + .order(hearingOrderGenerator.addCoverSheet(caseData, (approvedOrder.isConfidentialOrder() + ? approvedOrder.getOrderConfidential() : approvedOrder.getOrder()))) + .build()); + }) + .toList()); + } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java index dd8d66fb58d..21d544faace 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java @@ -15,7 +15,6 @@ import uk.gov.hmcts.reform.fpl.service.DocumentSealingService; import uk.gov.hmcts.reform.fpl.service.UploadDocumentService; import uk.gov.hmcts.reform.fpl.service.docmosis.DocmosisApprovedOrderCoverSheetService; -import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; import uk.gov.hmcts.reform.fpl.service.time.Time; import java.util.List; @@ -32,7 +31,6 @@ public class HearingOrderGenerator { private final DocumentSealingService documentSealingService; private final Time time; private final DocmosisApprovedOrderCoverSheetService docmosisApprovedOrderCoverSheetService; - private final DocumentMerger documentMerger; private final UploadDocumentService uploadDocumentService; public Element buildSealedHearingOrder(CaseData caseData, @@ -63,16 +61,7 @@ public Element buildSealedHearingOrder(CaseData caseData, caseData.getSealType()); if (addCoverSheet) { - try { - DocmosisDocument orderWithCoverSheet = docmosisApprovedOrderCoverSheetService - .addCoverSheetToApprovedOrder(caseData, sealedOrder); - - sealedOrder = buildFromDocument(uploadDocumentService - .uploadPDF(orderWithCoverSheet.getBytes(), order.getFilename())); - } catch (Exception e) { - // TODO handle this better, maybe a notification to FPL service? - log.error("Error adding cover sheet to order", e); - } + sealedOrder = addCoverSheet(caseData, sealedOrder); } builder = (isConfidentialOrder) @@ -89,4 +78,18 @@ public Element buildRejectedHearingOrder( .requestedChanges(changesRequested) .build()); } + + public DocumentReference addCoverSheet(CaseData caseData, DocumentReference order) { + try { + DocmosisDocument orderWithCoverSheet = docmosisApprovedOrderCoverSheetService + .addCoverSheetToApprovedOrder(caseData, order); + + return buildFromDocument(uploadDocumentService + .uploadPDF(orderWithCoverSheet.getBytes(), order.getFilename())); + } catch (Exception e) { + // TODO handle this better, maybe a notification to FPL service? + log.error("Error adding cover sheet to order", e); + return order; + } + } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAppointment.java b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAppointment.java new file mode 100644 index 00000000000..52b7dab5cb6 --- /dev/null +++ b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAppointment.java @@ -0,0 +1,62 @@ +package uk.gov.hmcts.reform.rd.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.jackson.Jacksonized; + +import java.time.LocalDate; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@Jacksonized +@AllArgsConstructor +public class JudicialUserAppointment { + @JsonIgnore + public static final String APPOINTMENT_TYPE_FEE_PAID = "Fee-paid"; + + private String appointment; + + @JsonProperty("appointment_id") + private String appointmentId; + + @JsonProperty("appointment_type") + private String appointmentType; + + @JsonProperty("base_location_id") + private String baseLocationId; + + @JsonProperty("cft_region") + private String cftRegion; + + @JsonProperty("cft_region_id") + private String cftRegionId; + + @JsonProperty("contract_type_id") + private String contractTypeId; + + @JsonProperty("start_date") + private LocalDate startDate; + + @JsonProperty("end_date") + private LocalDate endDate; + + @JsonProperty("epimms_id") + private String epimmsId; + + @JsonProperty("is_principal_appointment") + private String isPrincipalAppointment; + + @JsonProperty("role_name_id") + private String roleNameId; + + @JsonProperty("service_codes") + private List serviceCodes; + + private String type; +} diff --git a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAuthorisations.java b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAuthorisations.java new file mode 100644 index 00000000000..2881b07144c --- /dev/null +++ b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserAuthorisations.java @@ -0,0 +1,45 @@ +package uk.gov.hmcts.reform.rd.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.jackson.Jacksonized; + +import java.time.LocalDate; +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@Jacksonized +@AllArgsConstructor +public class JudicialUserAuthorisations { + + @JsonProperty("appointment_id") + private String appointmentId; + + @JsonProperty("authorisation_id") + private String authorisationId; + + @JsonProperty("end_date") + private LocalDate endDate; + + private String jurisdiction; + + @JsonProperty("jurisdiction_id") + private String jurisdictionId; + + @JsonProperty("service_codes") + private List serviceCodes; + + @JsonProperty("start_date") + private LocalDate startDate; + + @JsonProperty("ticket_code") + private String ticketCode; + + @JsonProperty("ticket_description") + private String ticketDescription; +} diff --git a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserProfile.java b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserProfile.java index bab02d16bd2..b5a4252614a 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserProfile.java +++ b/service/src/main/java/uk/gov/hmcts/reform/rd/model/JudicialUserProfile.java @@ -77,6 +77,10 @@ public class JudicialUserProfile { private String personalCode; + private List appointments; + + private List authorisations; + public String getTitle() { if (isEmpty(this.title) || this.title.equalsIgnoreCase("Unknown")) { // if no title from JRD - pattern match it from the known list of titles in JRD full name fields diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java index ff0833465bd..406383d0bfc 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java @@ -751,7 +751,7 @@ void shouldReturnJudgeTitleAndNameFromJRD() { eq(JudicialUserRequest.builder().idamId(List.of("testId")).build()))) .thenReturn(List.of(JUDICIAL_USER_PROFILE)); - assertThat(underTest.getJudgeTitleAndNameOfCurrentUser()) + assertThat(underTest.getJudgeTitleAndNameOfCurrentUser(null)) .isEqualTo(formatJudgeTitleAndName(JudgeAndLegalAdvisor .fromJudicialUserProfile(JUDICIAL_USER_PROFILE, null))); } @@ -765,7 +765,7 @@ void shouldReturnIdamUserFullNameIfJRDNotFound() { .build()); when(judicialApi.findUsers(any(), any(), anyInt(), any(), any())).thenReturn(List.of()); - assertThat(underTest.getJudgeTitleAndNameOfCurrentUser()).isEqualTo("John Smith"); + assertThat(underTest.getJudgeTitleAndNameOfCurrentUser(null)).isEqualTo("John Smith"); } } } From eaa66ccd52c972bffe3d4aa2539a980082a130b9 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Wed, 4 Jun 2025 18:33:51 +0100 Subject: [PATCH 11/23] fix renderiing --- .../CareSupervision/gatekeeper.json | 135 +++++++++- .../CareSupervision/judiciary.json | 135 +++++++++- .../CareSupervision/superuser.json | 135 +++++++++- .../review-CMO/previewApprovedOrder.json | 20 -- .../CareSupervision/reviewCMO.json | 233 +++++++++++++++++- .../CareSupervision/hearingOrders.json | 198 ++++++++++++++- .../cmo/ApproveDraftOrdersService.java | 31 +-- 7 files changed, 842 insertions(+), 45 deletions(-) delete mode 100644 ccd-definition/CaseEventToComplexTypes/review-CMO/previewApprovedOrder.json diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json b/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json index 44e4911708d..d614a6abc5f 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/gatekeeper.json @@ -4160,7 +4160,140 @@ { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", - "CaseFieldID": "previewApprovedOrders", + "CaseFieldID": "previewApprovedOrderTitle1", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle2", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle3", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle4", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle5", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle6", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle7", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle8", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle9", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle10", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder1", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder2", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder3", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder4", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder5", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder6", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder7", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder8", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder9", + "UserRole": "caseworker-publiclaw-gatekeeper", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder10", "UserRole": "caseworker-publiclaw-gatekeeper", "CRUD": "CRU" }, diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json b/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json index f1eb68643e3..33627a2dcd3 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/judiciary.json @@ -4377,7 +4377,140 @@ { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", - "CaseFieldID": "previewApprovedOrders", + "CaseFieldID": "previewApprovedOrderTitle1", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle2", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle3", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle4", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle5", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle6", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle7", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle8", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle9", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle10", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder1", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder2", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder3", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder4", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder5", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder6", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder7", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder8", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder9", + "UserRole": "caseworker-publiclaw-judiciary", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder10", "UserRole": "caseworker-publiclaw-judiciary", "CRUD": "CRU" }, diff --git a/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json b/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json index a9e93b71604..c380940d026 100644 --- a/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json +++ b/ccd-definition/AuthorisationCaseField/CareSupervision/superuser.json @@ -646,7 +646,140 @@ { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", - "CaseFieldID": "previewApprovedOrders", + "CaseFieldID": "previewApprovedOrderTitle1", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle2", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle3", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle4", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle5", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle6", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle7", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle8", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle9", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrderTitle10", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder1", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder2", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder3", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder4", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder5", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder6", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder7", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder8", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder9", + "UserRole": "caseworker-publiclaw-superuser", + "CRUD": "CRU" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseFieldID": "previewApprovedOrder10", "UserRole": "caseworker-publiclaw-superuser", "CRUD": "CRU" }, diff --git a/ccd-definition/CaseEventToComplexTypes/review-CMO/previewApprovedOrder.json b/ccd-definition/CaseEventToComplexTypes/review-CMO/previewApprovedOrder.json deleted file mode 100644 index 77f528c5821..00000000000 --- a/ccd-definition/CaseEventToComplexTypes/review-CMO/previewApprovedOrder.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - { - "LiveFrom": "01/01/2017", - "ID": "PreviewApprovedOrders", - "CaseEventID": "reviewCMO", - "CaseFieldID": "previewApprovedOrders", - "ListElementCode": "title", - "FieldDisplayOrder": 1, - "DisplayContext": "READONLY" - }, - { - "LiveFrom": "01/01/2017", - "ID": "PreviewApprovedOrders", - "CaseEventID": "reviewCMO", - "CaseFieldID": "previewApprovedOrders", - "ListElementCode": "order", - "FieldDisplayOrder": 2, - "DisplayContext": "READONLY" - } -] diff --git a/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json b/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json index 32e9115f265..246d8b940c3 100644 --- a/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json +++ b/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json @@ -720,19 +720,246 @@ "PageDisplayOrder": 5, "PageColumnNumber": 1, "PageFieldDisplayOrder": 1, - "PageShowCondition": "previewApprovedOrders=\"*\"" + "PageShowCondition": "previewApprovedOrder1=\"*\"" }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", "CaseEventID": "reviewCMO", - "CaseFieldID": "previewApprovedOrders", - "DisplayContext": "COMPLEX", + "CaseFieldID": "previewApprovedOrderTitle1", + "DisplayContext": "READONLY", "PageID": "PreviewApprovedOrders", "PageDisplayOrder": 5, "PageColumnNumber": 1, "PageFieldDisplayOrder": 2 }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder1", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 3 + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle2", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 4, + "FieldShowCondition": "previewApprovedOrder2=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder2", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 5, + "FieldShowCondition": "previewApprovedOrder2=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle3", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 3, + "FieldShowCondition": "previewApprovedOrder3=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder3", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 4, + "FieldShowCondition": "previewApprovedOrder3=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle4", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 5, + "FieldShowCondition": "previewApprovedOrder4=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder4", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 6, + "FieldShowCondition": "previewApprovedOrder4=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle5", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 7, + "FieldShowCondition": "previewApprovedOrder5=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder5", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 8, + "FieldShowCondition": "previewApprovedOrder5=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle6", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 9, + "FieldShowCondition": "previewApprovedOrder6=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder6", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 10, + "FieldShowCondition": "previewApprovedOrder6=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle7", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 11, + "FieldShowCondition": "previewApprovedOrder7=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder7", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 12, + "FieldShowCondition": "previewApprovedOrder7=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle8", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 13, + "FieldShowCondition": "previewApprovedOrder8=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder8", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 14, + "FieldShowCondition": "previewApprovedOrder8=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle9", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 15, + "FieldShowCondition": "previewApprovedOrder9=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder9", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 16, + "FieldShowCondition": "previewApprovedOrder9=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrderTitle10", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 17, + "FieldShowCondition": "previewApprovedOrder10=\"*\"" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "CaseEventID": "reviewCMO", + "CaseFieldID": "previewApprovedOrder10", + "DisplayContext": "READONLY", + "PageID": "PreviewApprovedOrders", + "PageDisplayOrder": 5, + "PageColumnNumber": 1, + "PageFieldDisplayOrder": 18, + "FieldShowCondition": "previewApprovedOrder10=\"*\"" + }, { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", diff --git a/ccd-definition/CaseField/CareSupervision/hearingOrders.json b/ccd-definition/CaseField/CareSupervision/hearingOrders.json index c349f88d491..149ae4e88d9 100644 --- a/ccd-definition/CaseField/CareSupervision/hearingOrders.json +++ b/ccd-definition/CaseField/CareSupervision/hearingOrders.json @@ -1247,11 +1247,201 @@ { "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", - "ID": "previewApprovedOrders", + "ID": "previewApprovedOrderTitle1", "Label": " ", - "FieldType": "Collection", - "FieldTypeParameter": "UploadedCaseManagementOrder", + "FieldType": "Text", "SecurityClassification": "Public", - "Searchable": "N" + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle2", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle3", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle4", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle5", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle6", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle7", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle8", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle9", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrderTitle10", + "Label": " ", + "FieldType": "Text", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder1", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder2", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder3", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder4", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder5", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder6", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder7", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder8", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder9", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" + }, + { + "LiveFrom": "01/01/2017", + "CaseTypeID": "CARE_SUPERVISION_EPO", + "ID": "previewApprovedOrder10", + "Label": " ", + "FieldType": "Document", + "SecurityClassification": "Public", + "Searchable": "N", + "Comment": "Temporary field for previewing the approved order" } ] diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java index 33c4dc44e22..927ca9658cb 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java @@ -31,7 +31,6 @@ import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; -import java.util.stream.IntStream; import static com.google.common.collect.Lists.newArrayList; import static java.util.stream.Collectors.toList; @@ -44,7 +43,6 @@ import static uk.gov.hmcts.reform.fpl.enums.JudgeType.FEE_PAID_JUDGE; import static uk.gov.hmcts.reform.fpl.enums.YesNo.NO; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.asDynamicList; -import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.unwrapElements; @Service @@ -415,19 +413,22 @@ public Map previewOrderWithCoverSheet(CaseData caseData) { final ReviewDraftOrdersData reviewDraftOrdersData = caseData.getReviewDraftOrdersData(); + Map data = new HashMap<>(); // Filter out the orders that have been approved by Judge without amendments - return Map.of( - "previewApprovedOrders", IntStream.range(0, draftOrders.size()) - .filter(counter -> CMOReviewOutcome.SEND_TO_ALL_PARTIES - .equals(reviewDraftOrdersData.getReviewDecision(counter).getDecision())) - .mapToObj(counter -> { - Element approvedOrderElement = draftOrders.get(counter); - HearingOrder approvedOrder = approvedOrderElement.getValue(); - return element(approvedOrderElement.getId(), approvedOrder.toBuilder() - .order(hearingOrderGenerator.addCoverSheet(caseData, (approvedOrder.isConfidentialOrder() - ? approvedOrder.getOrderConfidential() : approvedOrder.getOrder()))) - .build()); - }) - .toList()); + int labelCounter = 1; + for (int i = 0; i < draftOrders.size(); i++) { + if (CMOReviewOutcome.SEND_TO_ALL_PARTIES + .equals(reviewDraftOrdersData.getReviewDecision(i + 1).getDecision())) { + HearingOrder approvedOrder = draftOrders.get(i).getValue(); + + data.put("previewApprovedOrder" + labelCounter, + hearingOrderGenerator.addCoverSheet(caseData, (approvedOrder.isConfidentialOrder() + ? approvedOrder.getOrderConfidential() : approvedOrder.getOrder()))); + data.put("previewApprovedOrderTitle" + labelCounter, + String.format("Order %d %s", (i + 1), approvedOrder.getTitle())); + labelCounter++; + } + } + return data; } } From b95545641202f53712511f3926fb1ff40e645c9a Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Thu, 5 Jun 2025 10:47:18 +0100 Subject: [PATCH 12/23] update welsh --- .../reform/fpl/enums/DocmosisTemplates.java | 2 +- ...ocmosisApprovedOrderCoverSheetService.java | 21 +++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java index c805f379b32..1df9331c548 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java @@ -26,7 +26,7 @@ public enum DocmosisTemplates { EPO("FL-PLW-GOR-ENG-00228.doc", null, "emergency_protection_order"), EPO_V2("FL-PLW-GOR-ENG-00744.doc", null, "emergency_protection_order"), COVER_DOCS("FL-PLW-LET-ENG-COVER-SHEET.doc", "FL-PLW-LET-WEL-COVER-SHEET.doc", "cover_documents"), - APPROVED_ORDER_COVER("FL-PLW-GOR-ENG-APPROVED-ORDER-COVER-SHEET.docx", null, "approved-order-cover"), + APPROVED_ORDER_COVER("FL-PLW-GOR-ENG-APPROVED-ORDER-COVER-SHEET.docx", "FL-PLW-GOR-WEL-APPROVED-ORDER-COVER-SHEET.docx", "approved-order-cover"), TRANSLATION_REQUEST("FL-PLW-LET-ENG-00748.doc", null, "translation_request"), A70("FL-PLW-GOR-ENG-00763V2.doc", null, "placement_order_a70"), A81("FL-PLW-GOR-ENG-00728.doc", null, "placement_order_a81"), diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java index 1ccf723dab5..6aa8bb7d006 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java @@ -12,7 +12,6 @@ import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; -import uk.gov.hmcts.reform.fpl.model.configuration.Language; import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisApprovedOrderCoverSheet; import uk.gov.hmcts.reform.fpl.service.CaseDataExtractionService; import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; @@ -24,12 +23,16 @@ import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; +import static uk.gov.hmcts.reform.fpl.model.configuration.Language.WELSH; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.formatLocalDateToString; @Service @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class DocmosisApprovedOrderCoverSheetService { + private static final String ANNEX_A = "ANNEX A:"; + private static final String ANNEX_A_WEL = "Atodiad A:"; + private final DocmosisDocumentGeneratorService docmosisDocumentGeneratorService; private final CaseDataExtractionService caseDataExtractionService; private final DocumentMerger documentMerger; @@ -61,11 +64,11 @@ public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, float textX = 50; float textY = pageSize.getHeight() - 45; contentStream.newLineAtOffset(textX, textY); // Adjust position - contentStream.showText("ANNEX A:"); + contentStream.showText(getAnnexText(caseData)); contentStream.endText(); - // Calculate underline position and length - float textWidth = PDType1Font.TIMES_BOLD.getStringWidth("ANNEX A:") / 1000 * 12; // Font size is 12 + // Calculate underline position and length, font size is 12 + float textWidth = PDType1Font.TIMES_BOLD.getStringWidth(getAnnexText(caseData)) / 1000 * 12; float underlineY = textY - 2; // Slightly below the text // Draw underline @@ -87,7 +90,7 @@ public DocmosisDocument createCoverSheet(CaseData caseData) { return docmosisDocumentGeneratorService.generateDocmosisDocument(coverDocumentData, APPROVED_ORDER_COVER, RenderFormat.PDF, - Language.ENGLISH); + caseData.getC110A().getLanguageRequirementApplication()); } public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData) { @@ -96,8 +99,14 @@ public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData .courtName(caseDataExtractionService.getCourtName(caseData)) .children(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())) .judgeTitleAndName(caseData.getReviewDraftOrdersData().getJudgeTitleAndName()) - .dateOfApproval(formatLocalDateToString(time.now().toLocalDate(), DATE, Language.ENGLISH)) + .dateOfApproval(formatLocalDateToString(time.now().toLocalDate(), DATE, + caseData.getC110A().getLanguageRequirementApplication())) .crest(CREST.getValue()) .build(); } + + private String getAnnexText(CaseData caseData) { + return WELSH.equals(caseData.getC110A().getLanguageRequirementApplication()) + ? ANNEX_A_WEL : ANNEX_A; + } } From 8b1c2d7814b5096f14218e8a0390243318a10f05 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Thu, 12 Jun 2025 13:10:54 +0100 Subject: [PATCH 13/23] fix display --- .../CareSupervision/reviewCMO.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json b/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json index 246d8b940c3..e50848972dc 100644 --- a/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json +++ b/ccd-definition/CaseEventToFields/CareSupervision/reviewCMO.json @@ -766,7 +766,7 @@ "PageDisplayOrder": 5, "PageColumnNumber": 1, "PageFieldDisplayOrder": 5, - "FieldShowCondition": "previewApprovedOrder2=\"*\"" + "FieldShowCondition": "previewApprovedOrderTitle2=\"*\"" }, { "LiveFrom": "01/01/2017", @@ -790,7 +790,7 @@ "PageDisplayOrder": 5, "PageColumnNumber": 1, "PageFieldDisplayOrder": 4, - "FieldShowCondition": "previewApprovedOrder3=\"*\"" + "FieldShowCondition": "previewApprovedOrderTitle3=\"*\"" }, { "LiveFrom": "01/01/2017", @@ -814,7 +814,7 @@ "PageDisplayOrder": 5, "PageColumnNumber": 1, "PageFieldDisplayOrder": 6, - "FieldShowCondition": "previewApprovedOrder4=\"*\"" + "FieldShowCondition": "previewApprovedOrderTitle4=\"*\"" }, { "LiveFrom": "01/01/2017", @@ -838,7 +838,7 @@ "PageDisplayOrder": 5, "PageColumnNumber": 1, "PageFieldDisplayOrder": 8, - "FieldShowCondition": "previewApprovedOrder5=\"*\"" + "FieldShowCondition": "previewApprovedOrderTitle5=\"*\"" }, { "LiveFrom": "01/01/2017", @@ -862,7 +862,7 @@ "PageDisplayOrder": 5, "PageColumnNumber": 1, "PageFieldDisplayOrder": 10, - "FieldShowCondition": "previewApprovedOrder6=\"*\"" + "FieldShowCondition": "previewApprovedOrderTitle6=\"*\"" }, { "LiveFrom": "01/01/2017", @@ -886,7 +886,7 @@ "PageDisplayOrder": 5, "PageColumnNumber": 1, "PageFieldDisplayOrder": 12, - "FieldShowCondition": "previewApprovedOrder7=\"*\"" + "FieldShowCondition": "previewApprovedOrderTitle7=\"*\"" }, { "LiveFrom": "01/01/2017", @@ -910,7 +910,7 @@ "PageDisplayOrder": 5, "PageColumnNumber": 1, "PageFieldDisplayOrder": 14, - "FieldShowCondition": "previewApprovedOrder8=\"*\"" + "FieldShowCondition": "previewApprovedOrderTitle8=\"*\"" }, { "LiveFrom": "01/01/2017", @@ -934,7 +934,7 @@ "PageDisplayOrder": 5, "PageColumnNumber": 1, "PageFieldDisplayOrder": 16, - "FieldShowCondition": "previewApprovedOrder9=\"*\"" + "FieldShowCondition": "previewApprovedOrderTitle9=\"*\"" }, { "LiveFrom": "01/01/2017", @@ -958,7 +958,7 @@ "PageDisplayOrder": 5, "PageColumnNumber": 1, "PageFieldDisplayOrder": 18, - "FieldShowCondition": "previewApprovedOrder10=\"*\"" + "FieldShowCondition": "previewApprovedOrderTitle10=\"*\"" }, { "LiveFrom": "01/01/2017", From b120498e6f861edec7b2161d802419f48ff3f370 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Thu, 12 Jun 2025 16:46:44 +0100 Subject: [PATCH 14/23] order by conset --- ...ploadAdditionalApplicationsController.java | 5 +- .../orders/ApproveDraftOrdersController.java | 4 ++ .../model/event/ReviewDraftOrdersData.java | 18 ++++++- .../cmo/ApproveDraftOrdersService.java | 3 +- .../service/cmo/HearingOrderGenerator.java | 11 ++-- ...ocmosisApprovedOrderCoverSheetService.java | 53 +++++++++++++++---- 6 files changed, 72 insertions(+), 22 deletions(-) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/UploadAdditionalApplicationsController.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/UploadAdditionalApplicationsController.java index 226c482cf4b..4581f60abbb 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/UploadAdditionalApplicationsController.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/UploadAdditionalApplicationsController.java @@ -178,9 +178,8 @@ public AboutToStartOrSubmitCallbackResponse handleAboutToSubmit(@RequestBody Cal order.getValue().setUploaderType(manageDocumentService.getUploaderType(caseData)); }); List> newDrafts = draftOrders.stream() - .map(Element::getValue) - .map(HearingOrder::from) - .map(ElementUtils::element) + .map(draftOrderElement -> + element(draftOrderElement.getId(), HearingOrder.from(draftOrderElement.getValue()))) .collect(Collectors.toList()); HearingOrdersBundles hearingOrdersBundles = draftOrderService.migrateCmoDraftToOrdersBundles(caseData); diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java index 7d893a400df..dcfd4730b47 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java @@ -27,6 +27,7 @@ import static org.apache.commons.lang3.ObjectUtils.isEmpty; import static org.apache.commons.lang3.ObjectUtils.isNotEmpty; import static uk.gov.hmcts.reform.fpl.enums.JudgeType.FEE_PAID_JUDGE; +import static uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData.previewApprovedOrderFields; import static uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData.reviewDecisionFields; import static uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData.transientFields; @@ -89,6 +90,7 @@ public AboutToStartOrSubmitCallbackResponse validateReviewDecision(@RequestBody } data.remove("judgeType"); + CaseDetailsHelper.removeTemporaryFields(caseDetails, previewApprovedOrderFields()); if ((caseData.getReviewDraftOrdersData() != null && caseData.getReviewDraftOrdersData().hasADraftBeenApprovedWithoutChanges())) { if (judicialService.isCurrentUserFeePaidJudge()) { @@ -113,6 +115,7 @@ public AboutToStartOrSubmitCallbackResponse previewOrders(@RequestBody CallbackR .build(); // Generate the preview of the orders with cover sheet + CaseDetailsHelper.removeTemporaryFields(caseDetails, previewApprovedOrderFields()); caseDetails.getData().putAll(approveDraftOrdersService.previewOrderWithCoverSheet(caseData)); return respond(caseDetails); @@ -125,6 +128,7 @@ public AboutToStartOrSubmitCallbackResponse handleAboutToSubmit(@RequestBody Cal caseDetails.getData().put("judgeTitleAndName", approveDraftOrdersService.getJudgeTitleAndNameOfCurrentUser(caseData)); + CaseDetailsHelper.removeTemporaryFields(caseDetails, previewApprovedOrderFields()); // DFPL-1171 move all document processing step to post-about-to-submitted stage diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java index 5f30c71c79d..b24b361612c 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/event/ReviewDraftOrdersData.java @@ -64,8 +64,7 @@ public static String[] transientFields() { "cmoDraftOrderDocument", "draftOrder1Document", "draftOrder2Document", "draftOrder3Document", "draftOrder4Document", "draftOrder5Document", "draftOrder6Document", "draftOrder7Document", "draftOrder8Document", "draftOrder9Document", "draftOrder10Document", "reviewDraftOrdersTitles", - "draftOrdersTitlesInBundle", "draftOrdersApproved", "judgeTitleAndName", "feePaidJudgeTitle", "judgeType", - "previewApprovedOrders" + "draftOrdersTitlesInBundle", "draftOrdersApproved", "judgeTitleAndName", "feePaidJudgeTitle", "judgeType" }; } @@ -77,6 +76,21 @@ public static String[] reviewDecisionFields() { }; } + public static String[] previewApprovedOrderFields() { + return new String[]{ + "previewApprovedOrder1", "previewApprovedOrderTitle1", + "previewApprovedOrder2", "previewApprovedOrderTitle2", + "previewApprovedOrder3", "previewApprovedOrderTitle3", + "previewApprovedOrder4", "previewApprovedOrderTitle4", + "previewApprovedOrder5", "previewApprovedOrderTitle5", + "previewApprovedOrder6", "previewApprovedOrderTitle6", + "previewApprovedOrder7", "previewApprovedOrderTitle7", + "previewApprovedOrder8", "previewApprovedOrderTitle8", + "previewApprovedOrder9", "previewApprovedOrderTitle9", + "previewApprovedOrder10", "previewApprovedOrderTitle10" + }; + } + @JsonIgnore public boolean hasADraftBeenApproved() { return (!isEmpty(reviewDecision1) && reviewDecision1.hasBeenApproved()) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java index 927ca9658cb..052a2a64dd8 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java @@ -419,11 +419,12 @@ public Map previewOrderWithCoverSheet(CaseData caseData) { for (int i = 0; i < draftOrders.size(); i++) { if (CMOReviewOutcome.SEND_TO_ALL_PARTIES .equals(reviewDraftOrdersData.getReviewDecision(i + 1).getDecision())) { + Element orderElement = draftOrders.get(i); HearingOrder approvedOrder = draftOrders.get(i).getValue(); data.put("previewApprovedOrder" + labelCounter, hearingOrderGenerator.addCoverSheet(caseData, (approvedOrder.isConfidentialOrder() - ? approvedOrder.getOrderConfidential() : approvedOrder.getOrder()))); + ? approvedOrder.getOrderConfidential() : approvedOrder.getOrder()), orderElement)); data.put("previewApprovedOrderTitle" + labelCounter, String.format("Order %d %s", (i + 1), approvedOrder.getTitle())); labelCounter++; diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java index 21d544faace..a1b41f4c14b 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java @@ -61,7 +61,7 @@ public Element buildSealedHearingOrder(CaseData caseData, caseData.getSealType()); if (addCoverSheet) { - sealedOrder = addCoverSheet(caseData, sealedOrder); + sealedOrder = addCoverSheet(caseData, sealedOrder, hearingOrderElement); } builder = (isConfidentialOrder) @@ -79,17 +79,18 @@ public Element buildRejectedHearingOrder( .build()); } - public DocumentReference addCoverSheet(CaseData caseData, DocumentReference order) { + public DocumentReference addCoverSheet(CaseData caseData, DocumentReference orderDoc, + Element hearingOrderElement) { try { DocmosisDocument orderWithCoverSheet = docmosisApprovedOrderCoverSheetService - .addCoverSheetToApprovedOrder(caseData, order); + .addCoverSheetToApprovedOrder(caseData, orderDoc, hearingOrderElement); return buildFromDocument(uploadDocumentService - .uploadPDF(orderWithCoverSheet.getBytes(), order.getFilename())); + .uploadPDF(orderWithCoverSheet.getBytes(), orderDoc.getFilename())); } catch (Exception e) { // TODO handle this better, maybe a notification to FPL service? log.error("Error adding cover sheet to order", e); - return order; + return orderDoc; } } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java index 6aa8bb7d006..fdb14b2ad3f 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java @@ -10,9 +10,13 @@ import org.springframework.stereotype.Service; import uk.gov.hmcts.reform.fpl.enums.docmosis.RenderFormat; import uk.gov.hmcts.reform.fpl.model.CaseData; +import uk.gov.hmcts.reform.fpl.model.common.C2DocumentBundle; import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; +import uk.gov.hmcts.reform.fpl.model.common.Element; +import uk.gov.hmcts.reform.fpl.model.configuration.Language; import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisApprovedOrderCoverSheet; +import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.service.CaseDataExtractionService; import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; import uk.gov.hmcts.reform.fpl.service.time.Time; @@ -20,12 +24,19 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; +import static uk.gov.hmcts.reform.fpl.enums.C2ApplicationType.WITHOUT_NOTICE; import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; +import static uk.gov.hmcts.reform.fpl.enums.YesNo.YES; import static uk.gov.hmcts.reform.fpl.model.configuration.Language.WELSH; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.formatLocalDateToString; +import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.unwrapElements; @Service @RequiredArgsConstructor(onConstructor = @__(@Autowired)) @@ -38,10 +49,10 @@ public class DocmosisApprovedOrderCoverSheetService { private final DocumentMerger documentMerger; private final Time time; - public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, - DocumentReference order) throws IOException { + public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, DocumentReference order, + Element hearingOrderElement) throws IOException { // Create - DocmosisDocument coverSheet = createCoverSheet(caseData); + DocmosisDocument coverSheet = createCoverSheet(caseData, hearingOrderElement); // TODO could we use the byte array from the approved order instead of downloading it again? // Add cover sheet to the order @@ -85,28 +96,48 @@ public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, } } - public DocmosisDocument createCoverSheet(CaseData caseData) { - DocmosisApprovedOrderCoverSheet coverDocumentData = buildCoverDocumentsData(caseData); + public DocmosisDocument createCoverSheet(CaseData caseData, Element hearingOrder) { + DocmosisApprovedOrderCoverSheet coverDocumentData = buildCoverDocumentsData(caseData, hearingOrder); return docmosisDocumentGeneratorService.generateDocmosisDocument(coverDocumentData, APPROVED_ORDER_COVER, RenderFormat.PDF, - caseData.getC110A().getLanguageRequirementApplication()); + getCaseLanguage(caseData)); } - public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData) { + public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData, Element hearingOrder) { + return DocmosisApprovedOrderCoverSheet.builder() .familyManCaseNumber(caseData.getFamilyManCaseNumber()) .courtName(caseDataExtractionService.getCourtName(caseData)) .children(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())) .judgeTitleAndName(caseData.getReviewDraftOrdersData().getJudgeTitleAndName()) - .dateOfApproval(formatLocalDateToString(time.now().toLocalDate(), DATE, - caseData.getC110A().getLanguageRequirementApplication())) + .dateOfApproval(formatLocalDateToString(time.now().toLocalDate(), DATE, getCaseLanguage(caseData))) .crest(CREST.getValue()) + .orderByConsent(isC2OrderByConsent(caseData, hearingOrder.getId()) ? YES.getValue() : null) .build(); } private String getAnnexText(CaseData caseData) { - return WELSH.equals(caseData.getC110A().getLanguageRequirementApplication()) - ? ANNEX_A_WEL : ANNEX_A; + return WELSH.equals(getCaseLanguage(caseData)) ? ANNEX_A_WEL : ANNEX_A; + } + + private Language getCaseLanguage(CaseData caseData) { + return Optional.ofNullable(caseData.getC110A().getLanguageRequirementApplication()).orElse(Language.ENGLISH); + } + + private boolean isC2OrderByConsent(CaseData caseData, UUID hearingOrderId) { + // 1. filter out all additional applications bundles by consent + // 2. check if the hearing order id is present in any of the bundle + return unwrapElements(caseData.getAdditionalApplicationsBundle()).stream() + .anyMatch(additionalApplicationsBundle -> + Stream.of(additionalApplicationsBundle.getC2DocumentBundle(), + additionalApplicationsBundle.getC2DocumentBundleConfidential()) + .filter(Objects::nonNull) + .filter(documentBundle -> WITHOUT_NOTICE.equals(documentBundle.getType())) + .map(C2DocumentBundle::getDraftOrdersBundle) + .filter(Objects::nonNull) + .flatMap(List::stream) + .anyMatch(draftOrderElement -> draftOrderElement.getId().equals(hearingOrderId)) + ); } } From 6a4905155f40279dbfe70f2152b2b8ab83ab9f24 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Fri, 13 Jun 2025 11:20:33 +0100 Subject: [PATCH 15/23] Update DocmosisApprovedOrderCoverSheetServiceTest.java --- ...sisApprovedOrderCoverSheetServiceTest.java | 78 ++++++++++++++++++- 1 file changed, 74 insertions(+), 4 deletions(-) diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java index 5a497b0a09d..2d1046e8395 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java @@ -6,11 +6,14 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import uk.gov.hmcts.reform.fpl.docmosis.DocmosisHelper; +import uk.gov.hmcts.reform.fpl.enums.C2ApplicationType; import uk.gov.hmcts.reform.fpl.enums.docmosis.RenderFormat; import uk.gov.hmcts.reform.fpl.model.CaseData; import uk.gov.hmcts.reform.fpl.model.Child; import uk.gov.hmcts.reform.fpl.model.ChildParty; import uk.gov.hmcts.reform.fpl.model.Court; +import uk.gov.hmcts.reform.fpl.model.common.AdditionalApplicationsBundle; +import uk.gov.hmcts.reform.fpl.model.common.C2DocumentBundle; import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.configuration.Language; @@ -18,6 +21,8 @@ import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisChild; import uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData; import uk.gov.hmcts.reform.fpl.model.group.C110A; +import uk.gov.hmcts.reform.fpl.model.order.DraftOrder; +import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.service.CaseDataExtractionService; import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; import uk.gov.hmcts.reform.fpl.service.time.Time; @@ -32,6 +37,7 @@ import static org.mockito.BDDMockito.given; import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; +import static uk.gov.hmcts.reform.fpl.enums.YesNo.YES; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.formatLocalDateToString; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; @@ -55,8 +61,31 @@ class DocmosisApprovedOrderCoverSheetServiceTest { DocmosisChild.builder().name("Confidential Child").build() ); private static final DocmosisDocument COVER_SHEET = new DocmosisDocument(FILE_NAME, PDF_BYTES); - public static final String COURT_NAME = "Test Court"; - public static final String JUDGE_NAME = "Test Judge"; + private static final String COURT_NAME = "Test Court"; + private static final String JUDGE_NAME = "Test Judge"; + + private static final Element DRAFT_ORDER = + element(DraftOrder.builder().document(testDocumentReference()).build()); + private static final Element C2_BUNDLE = + element(AdditionalApplicationsBundle.builder() + .c2DocumentBundle(C2DocumentBundle.builder() + .type(C2ApplicationType.WITH_NOTICE) + .draftOrdersBundle(List.of(DRAFT_ORDER)).build()) + .build()); + private static final Element HEARING_ORDER = + element(DRAFT_ORDER.getId(), HearingOrder.from(DRAFT_ORDER.getValue())); + + private static final Element DRAFT_ORDER_WITH_CONSENT = + element(DraftOrder.builder().document(testDocumentReference()).build()); + private static final Element C2_BUNDLE_WITH_CONSENT = + element(AdditionalApplicationsBundle.builder() + .c2DocumentBundle(C2DocumentBundle.builder() + .type(C2ApplicationType.WITHOUT_NOTICE) + .draftOrdersBundle(List.of(DRAFT_ORDER_WITH_CONSENT)).build()) + .build()); + private static final Element HEARING_ORDER_WITH_CONSENT = + element(DRAFT_ORDER_WITH_CONSENT.getId(), HearingOrder.from(DRAFT_ORDER_WITH_CONSENT.getValue())); + @Mock private DocmosisDocumentGeneratorService docmosisDocumentGeneratorService; @@ -81,6 +110,7 @@ void shouldGenerateApprovedOrderCoverSheet() { .children1(List.of(CHILD)) .confidentialChildren(List.of(CONFIDENTIAL_CHILD)) .reviewDraftOrdersData(ReviewDraftOrdersData.builder().judgeTitleAndName(JUDGE_NAME).build()) + .additionalApplicationsBundle(List.of(C2_BUNDLE)) .build(); given(caseDataExtractionService.getCourtName(caseData)).willReturn(COURT_NAME); @@ -101,7 +131,7 @@ void shouldGenerateApprovedOrderCoverSheet() { RenderFormat.PDF, LANGUAGE)) .willReturn(COVER_SHEET); - DocmosisDocument result = underTest.createCoverSheet(caseData); + DocmosisDocument result = underTest.createCoverSheet(caseData, HEARING_ORDER); assertThat(result).isEqualTo(COVER_SHEET); } @@ -142,10 +172,50 @@ void shouldAddCoverSheetAndAddAnnexAWording() throws IOException { DocmosisDocument mergedOrder = new DocmosisDocument("merged_order.pdf", mergedOrderBytes); given(documentMerger.mergeDocuments(any(), any())).willReturn(mergedOrder); - DocmosisDocument result = underTest.addCoverSheetToApprovedOrder(caseData, testDocumentReference()); + DocmosisDocument result = underTest.addCoverSheetToApprovedOrder(caseData, testDocumentReference(), + HEARING_ORDER); String resultText = (new DocmosisHelper()).extractPdfContent(result.getBytes()); assertThat(resultText).isEqualToNormalizingWhitespace("First page Second page ANNEX A: "); } + + @Test + void shouldAddCoverSheetWithConsentWording() { + CaseData caseData = CaseData.builder() + .id(CASE_ID) + .familyManCaseNumber(FAMILY_MAN_NUMBER) + .court(COURT) + .c110A(C110A.builder() + .languageRequirementApplication(LANGUAGE) + .build()) + .children1(List.of(CHILD)) + .confidentialChildren(List.of(CONFIDENTIAL_CHILD)) + .reviewDraftOrdersData(ReviewDraftOrdersData.builder().judgeTitleAndName(JUDGE_NAME).build()) + .additionalApplicationsBundle(List.of(C2_BUNDLE_WITH_CONSENT)) + .build(); + + given(caseDataExtractionService.getCourtName(caseData)).willReturn(COURT_NAME); + given(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())).willReturn(DOCMOSIS_CHILDREN); + given(time.now()).willReturn(TEST_TIME); + + DocmosisApprovedOrderCoverSheet expectedDocmosisData = DocmosisApprovedOrderCoverSheet.builder() + .familyManCaseNumber(FAMILY_MAN_NUMBER) + .courtName(COURT_NAME) + .children(DOCMOSIS_CHILDREN) + .judgeTitleAndName(JUDGE_NAME) + .dateOfApproval(formatLocalDateToString(TEST_TIME.toLocalDate(), DATE, Language.ENGLISH)) + .crest(CREST.getValue()) + .orderByConsent(YES.getValue()) + .build(); + + + given(docmosisDocumentGeneratorService.generateDocmosisDocument(expectedDocmosisData, APPROVED_ORDER_COVER, + RenderFormat.PDF, LANGUAGE)) + .willReturn(COVER_SHEET); + + DocmosisDocument result = underTest.createCoverSheet(caseData, HEARING_ORDER_WITH_CONSENT); + + assertThat(result).isEqualTo(COVER_SHEET); + } } From 2de20e872fb2f9cbe8d3072ba137efbe1680bf5c Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Fri, 13 Jun 2025 12:48:12 +0100 Subject: [PATCH 16/23] unit test and code style --- ...lerValidateReviewDecisionMidEventTest.java | 49 ++++++++++++++++++- .../orders/ApproveDraftOrdersController.java | 18 ++++--- .../reform/fpl/enums/DocmosisTemplates.java | 3 +- .../cmo/ApproveDraftOrdersService.java | 4 +- ...ocmosisApprovedOrderCoverSheetService.java | 3 +- .../cmo/ApproveDraftOrdersServiceTest.java | 22 +++------ .../cmo/HearingOrderGeneratorTest.java | 11 ++--- 7 files changed, 77 insertions(+), 33 deletions(-) diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java index 6377e94a1ab..73ba0dedcc2 100644 --- a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.OverrideAutoConfiguration; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; import uk.gov.hmcts.reform.fpl.controllers.orders.ApproveDraftOrdersController; import uk.gov.hmcts.reform.fpl.enums.CMOStatus; @@ -16,12 +17,16 @@ import uk.gov.hmcts.reform.fpl.model.event.ReviewDraftOrdersData; import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundle; +import uk.gov.hmcts.reform.fpl.service.JudicialService; +import uk.gov.hmcts.reform.fpl.service.cmo.HearingOrderGenerator; import java.util.List; import java.util.UUID; import static com.google.common.collect.Lists.newArrayList; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.JUDGE_AMENDS_DRAFT; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.JUDGE_REQUESTED_CHANGES; import static uk.gov.hmcts.reform.fpl.enums.CMOReviewOutcome.SEND_TO_ALL_PARTIES; @@ -40,11 +45,18 @@ class ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest extends Abs private final String validateDecisionEventPath = "validate-review-decision"; private final String hearing = "Test hearing 21st August 2020"; private final DocumentReference order = testDocumentReference(); + private final DocumentReference orderWithCoverSheet = testDocumentReference(); private final Element agreedCMO = element(buildDraftOrder(AGREED_CMO)); private final Element draftOrder1 = element(buildDraftOrder(C21)); private final Element draftOrder2 = element(buildDraftOrder(C21)); + @MockBean + private JudicialService judicialService; + + @MockBean + private HearingOrderGenerator hearingOrderGenerator; + ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest() { super("approve-draft-orders"); } @@ -90,6 +102,7 @@ void shouldReturnErrorsWhenReviewDecisionIsJudgeRequestsChangesAndRequestedChang .cmoToReviewList(hearingOrdersBundleId.toString()) .reviewDraftOrdersData(reviewDraftOrdersData).build(); + given(judicialService.isCurrentUserFeePaidJudge()).willReturn(Boolean.FALSE); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, validateDecisionEventPath); assertThat(callbackResponse.getErrors()).containsOnly("Add what the LA needs to change on the draft order 2"); @@ -114,6 +127,7 @@ void shouldReturnErrorsForAllReviewedOrdersWhenJudgeReviewIsInvalidForMoreThanOn .cmoToReviewList(hearingOrdersBundleId.toString()) .reviewDraftOrdersData(reviewDraftOrdersData).build(); + given(judicialService.isCurrentUserFeePaidJudge()).willReturn(Boolean.FALSE); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, validateDecisionEventPath); assertThat(callbackResponse.getErrors()) @@ -128,7 +142,7 @@ void shouldNotReturnErrorsWhenJudgeDoesNotReviewOneOfTheDraftOrdersInTheBundle() hearingOrdersBundleId, newArrayList(draftOrder1, draftOrder2)); ReviewDraftOrdersData reviewDraftOrdersData = ReviewDraftOrdersData.builder() - .reviewDecision2(ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build()) + .reviewDecision1(ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build()) .build(); CaseData caseData = CaseData.builder() @@ -141,9 +155,13 @@ void shouldNotReturnErrorsWhenJudgeDoesNotReviewOneOfTheDraftOrdersInTheBundle() .cmoToReviewList(hearingOrdersBundleId.toString()) .reviewDraftOrdersData(reviewDraftOrdersData).build(); + when(judicialService.isCurrentUserFeePaidJudge()).thenReturn(Boolean.FALSE); + when(hearingOrderGenerator.addCoverSheet(caseData, order, draftOrder1)).thenReturn(orderWithCoverSheet); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, validateDecisionEventPath); assertThat(callbackResponse.getErrors()).isEmpty(); + assertThat(callbackResponse.getData().get("previewApprovedOrder1")).isNotNull(); + assertThat(callbackResponse.getData().get("previewApprovedOrderTitle1")).isNotNull(); } @Test @@ -159,9 +177,38 @@ void shouldNotReturnErrorsWhenReviewDecisionForTheDraftOrdersIsValid() { .cmoToReviewList(hearingOrdersBundleId.toString()) .reviewCMODecision(ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build()).build(); + given(judicialService.isCurrentUserFeePaidJudge()).willReturn(Boolean.FALSE); + AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, validateDecisionEventPath); + + assertThat(callbackResponse.getErrors()).isEmpty(); + } + + @Test + void shouldSetFeePaidJudgeTypeIfFeePaidJudgeApproving() { + UUID hearingOrdersBundleId = UUID.randomUUID(); + + Element hearingOrdersBundle = buildHearingOrdersBundle( + hearingOrdersBundleId, newArrayList(draftOrder1, draftOrder2)); + + ReviewDraftOrdersData reviewDraftOrdersData = ReviewDraftOrdersData.builder() + .reviewDecision1(ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build()) + .build(); + + CaseData caseData = CaseData.builder() + .others(Others.builder() + .firstOther(Other.builder().name("test1").build()) + .additionalOthers(wrapElements(Other.builder().name("test2").build())) + .build()) + .draftUploadedCMOs(newArrayList(agreedCMO)) + .hearingOrdersBundlesDrafts(List.of(hearingOrdersBundle)) + .cmoToReviewList(hearingOrdersBundleId.toString()) + .reviewDraftOrdersData(reviewDraftOrdersData).build(); + + when(judicialService.isCurrentUserFeePaidJudge()).thenReturn(Boolean.TRUE); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, validateDecisionEventPath); assertThat(callbackResponse.getErrors()).isEmpty(); + assertThat(callbackResponse.getData().get("judgeType")).isEqualTo("FEE_PAID_JUDGE"); } private Element buildHearingOrdersBundle( diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java index dcfd4730b47..bc48f338f01 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java @@ -89,14 +89,16 @@ public AboutToStartOrSubmitCallbackResponse validateReviewDecision(@RequestBody data.put(DRAFT_ORDERS_APPROVED, "No"); } - data.remove("judgeType"); - CaseDetailsHelper.removeTemporaryFields(caseDetails, previewApprovedOrderFields()); - if ((caseData.getReviewDraftOrdersData() != null - && caseData.getReviewDraftOrdersData().hasADraftBeenApprovedWithoutChanges())) { - if (judicialService.isCurrentUserFeePaidJudge()) { - data.put("judgeType", FEE_PAID_JUDGE); - } else { - data.putAll(approveDraftOrdersService.previewOrderWithCoverSheet(caseData)); + if (errors.isEmpty()) { + data.remove("judgeType"); + CaseDetailsHelper.removeTemporaryFields(caseDetails, previewApprovedOrderFields()); + if ((caseData.getReviewDraftOrdersData() != null + && caseData.getReviewDraftOrdersData().hasADraftBeenApprovedWithoutChanges())) { + if (judicialService.isCurrentUserFeePaidJudge()) { + data.put("judgeType", FEE_PAID_JUDGE); + } else { + data.putAll(approveDraftOrdersService.previewOrderWithCoverSheet(caseData)); + } } } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java index 1df9331c548..75df6d64872 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/enums/DocmosisTemplates.java @@ -26,7 +26,8 @@ public enum DocmosisTemplates { EPO("FL-PLW-GOR-ENG-00228.doc", null, "emergency_protection_order"), EPO_V2("FL-PLW-GOR-ENG-00744.doc", null, "emergency_protection_order"), COVER_DOCS("FL-PLW-LET-ENG-COVER-SHEET.doc", "FL-PLW-LET-WEL-COVER-SHEET.doc", "cover_documents"), - APPROVED_ORDER_COVER("FL-PLW-GOR-ENG-APPROVED-ORDER-COVER-SHEET.docx", "FL-PLW-GOR-WEL-APPROVED-ORDER-COVER-SHEET.docx", "approved-order-cover"), + APPROVED_ORDER_COVER("FL-PLW-GOR-ENG-APPROVED-ORDER-COVER-SHEET.docx", + "FL-PLW-GOR-WEL-APPROVED-ORDER-COVER-SHEET.docx", "approved-order-cover"), TRANSLATION_REQUEST("FL-PLW-LET-ENG-00748.doc", null, "translation_request"), A70("FL-PLW-GOR-ENG-00763V2.doc", null, "placement_order_a70"), A81("FL-PLW-GOR-ENG-00728.doc", null, "placement_order_a81"), diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java index 052a2a64dd8..3cce66d7118 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java @@ -417,8 +417,8 @@ public Map previewOrderWithCoverSheet(CaseData caseData) { // Filter out the orders that have been approved by Judge without amendments int labelCounter = 1; for (int i = 0; i < draftOrders.size(); i++) { - if (CMOReviewOutcome.SEND_TO_ALL_PARTIES - .equals(reviewDraftOrdersData.getReviewDecision(i + 1).getDecision())) { + ReviewDecision reviewDecision = reviewDraftOrdersData.getReviewDecision(i + 1); + if (reviewDecision != null && CMOReviewOutcome.SEND_TO_ALL_PARTIES.equals(reviewDecision.getDecision())) { Element orderElement = draftOrders.get(i); HearingOrder approvedOrder = draftOrders.get(i).getValue(); diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java index fdb14b2ad3f..24e8e0da8ae 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java @@ -104,7 +104,8 @@ public DocmosisDocument createCoverSheet(CaseData caseData, Element hearingOrder) { + public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData, + Element hearingOrder) { return DocmosisApprovedOrderCoverSheet.builder() .familyManCaseNumber(caseData.getFamilyManCaseNumber()) diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java index f69725a6af5..8052380c8ef 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersServiceTest.java @@ -35,6 +35,7 @@ import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundle; import uk.gov.hmcts.reform.fpl.model.order.HearingOrdersBundles; import uk.gov.hmcts.reform.fpl.model.order.generated.GeneratedOrder; +import uk.gov.hmcts.reform.fpl.service.JudicialService; import uk.gov.hmcts.reform.fpl.service.OthersService; import uk.gov.hmcts.reform.fpl.service.time.Time; import uk.gov.hmcts.reform.fpl.utils.ElementUtils; @@ -123,6 +124,9 @@ class ApproveDraftOrdersServiceTest { @Mock private OthersService othersService; + @Mock + private JudicialService judicialService; + @InjectMocks private ApproveDraftOrdersService underTest; @@ -136,7 +140,8 @@ void setUp() { draftOrdersBundleHearingSelector, blankOrderGenerator, hearingOrderGenerator, - othersService + othersService, + judicialService ); } @@ -517,7 +522,6 @@ void shouldSealTheDraftOrderAndCreateBlankOrderWhenJudgeApproves() { ReviewDecision reviewDecision = ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(); Map data = new HashMap<>(); - data.put("reviewDecision1", Map.of("decision", reviewDecision)); CaseData caseData = CaseData.builder() .court(Court.builder() @@ -528,10 +532,9 @@ void shouldSealTheDraftOrderAndCreateBlankOrderWhenJudgeApproves() { .hearingOrdersBundlesDrafts(newArrayList(ordersBundleElement)) .reviewCMODecision(reviewDecision) .orderCollection(newArrayList()) + .reviewDraftOrdersData(ReviewDraftOrdersData.builder().reviewDecision1(reviewDecision).build()) .build(); - given(mapper.convertValue(anyMap(), eq(ReviewDecision.class))).willReturn(reviewDecision); - Element expectedSealedOrder = element( draftOrder1.getId(), draftOrder1.getValue().toBuilder().status(APPROVED).build()); @@ -566,7 +569,6 @@ void shouldNotCreateBlankOrderWhenJudgeRequestsChanges() { .changesRequestedByJudge("some change").build(); Map data = new HashMap<>(); - data.put("reviewDecision1", Map.of("decision", JUDGE_REQUESTED_CHANGES)); CaseData caseData = CaseData.builder() .state(State.CASE_MANAGEMENT) @@ -576,8 +578,6 @@ void shouldNotCreateBlankOrderWhenJudgeRequestsChanges() { .orderCollection(newArrayList()) .build(); - given(mapper.convertValue(anyMap(), eq(ReviewDecision.class))).willReturn(reviewDecision); - Element rejectedOrderToReturn = element(draftOrder1.getId(), draftOrder1.getValue().toBuilder().status(RETURNED).requestedChanges("some change").build()); @@ -739,7 +739,6 @@ void shouldSealTheConfidentialDraftOrderAndCreateBlankOrderWhenJudgeApproves() { ReviewDecision reviewDecision = ReviewDecision.builder().decision(SEND_TO_ALL_PARTIES).build(); Map data = new HashMap<>(); - data.put("reviewDecision1", Map.of("decision", reviewDecision)); CaseData caseData = CaseData.builder() .court(Court.builder() @@ -748,12 +747,10 @@ void shouldSealTheConfidentialDraftOrderAndCreateBlankOrderWhenJudgeApproves() { .state(State.CASE_MANAGEMENT) .draftUploadedCMOs(newArrayList(draftOrder1)) .hearingOrdersBundlesDrafts(newArrayList(ordersBundleElement)) - .reviewCMODecision(reviewDecision) + .reviewDraftOrdersData(ReviewDraftOrdersData.builder().reviewDecision1(reviewDecision).build()) .orderCollection(newArrayList()) .build(); - given(mapper.convertValue(anyMap(), eq(ReviewDecision.class))).willReturn(reviewDecision); - Element expectedSealedOrder = element( draftOrder1.getId(), draftOrder1.getValue().toBuilder().status(APPROVED).build()); @@ -789,7 +786,6 @@ void shouldNotCreateBlankOrderWhenJudgeRequestsChangesOnConfidentialOrder() { .changesRequestedByJudge("some change").build(); Map data = new HashMap<>(); - data.put("reviewDecision1", Map.of("decision", JUDGE_REQUESTED_CHANGES)); CaseData caseData = CaseData.builder() .state(State.CASE_MANAGEMENT) @@ -799,8 +795,6 @@ void shouldNotCreateBlankOrderWhenJudgeRequestsChangesOnConfidentialOrder() { .orderCollection(newArrayList()) .build(); - given(mapper.convertValue(anyMap(), eq(ReviewDecision.class))).willReturn(reviewDecision); - Element rejectedOrderToReturn = element(draftOrder1.getId(), draftOrder1.getValue().toBuilder().status(RETURNED).requestedChanges("some change").build()); diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java index 7717f43dde6..5055cfa3cf5 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java @@ -20,7 +20,6 @@ import uk.gov.hmcts.reform.fpl.service.DocumentSealingService; import uk.gov.hmcts.reform.fpl.service.UploadDocumentService; import uk.gov.hmcts.reform.fpl.service.docmosis.DocmosisApprovedOrderCoverSheetService; -import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; import uk.gov.hmcts.reform.fpl.service.time.Time; import uk.gov.hmcts.reform.fpl.utils.FixedTimeConfiguration; @@ -61,8 +60,6 @@ class HearingOrderGeneratorTest { @Mock private DocmosisApprovedOrderCoverSheetService docmosisApprovedOrderCoverSheetService; @Mock - private DocumentMerger documentMerger; - @Mock private UploadDocumentService uploadDocumentService; @InjectMocks @@ -71,7 +68,7 @@ class HearingOrderGeneratorTest { @BeforeEach void setUp() { underTest = new HearingOrderGenerator(documentSealingService, time, docmosisApprovedOrderCoverSheetService, - documentMerger, uploadDocumentService); + uploadDocumentService); } @Test @@ -88,7 +85,8 @@ void shouldBuildSealedHearingOrderWhenReviewDecisionIsApproved() throws IOExcept .build(); when(documentSealingService.sealDocument(order, court, SealType.ENGLISH)).thenReturn(sealedOrder); - when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder)) + when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder, + element(ORDER_ID, hearingOrder))) .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); @@ -121,7 +119,8 @@ void shouldBuildSealedHearingOrderWhenJudgeAmendsTheDocument() throws IOExceptio .reviewCMODecision(reviewDecision) .build(); when(documentSealingService.sealDocument(amendedOrder, court, SealType.ENGLISH)).thenReturn(sealedOrder); - when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder)) + when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder, + element(ORDER_ID, hearingOrder))) .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); From 6a3fe9421550e6207a1a860bf4a0f2e9c8bbd33b Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Fri, 13 Jun 2025 14:17:03 +0100 Subject: [PATCH 17/23] add unit test to FeePaidJudge checking --- .../service/cmo/HearingOrderGenerator.java | 1 - ...ocmosisApprovedOrderCoverSheetService.java | 1 - .../fpl/service/JudicialServiceTest.java | 234 ++++++++++++++++++ 3 files changed, 234 insertions(+), 2 deletions(-) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java index a1b41f4c14b..267da517f81 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java @@ -88,7 +88,6 @@ public DocumentReference addCoverSheet(CaseData caseData, DocumentReference orde return buildFromDocument(uploadDocumentService .uploadPDF(orderWithCoverSheet.getBytes(), orderDoc.getFilename())); } catch (Exception e) { - // TODO handle this better, maybe a notification to FPL service? log.error("Error adding cover sheet to order", e); return orderDoc; } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java index 24e8e0da8ae..51034875ef3 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java @@ -54,7 +54,6 @@ public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, Document // Create DocmosisDocument coverSheet = createCoverSheet(caseData, hearingOrderElement); - // TODO could we use the byte array from the approved order instead of downloading it again? // Add cover sheet to the order DocmosisDocument orderWithCoverSheet = documentMerger.mergeDocuments(coverSheet, List.of(order)); diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java index 406383d0bfc..283e240c0ee 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java @@ -25,11 +25,15 @@ import uk.gov.hmcts.reform.fpl.model.Judge; import uk.gov.hmcts.reform.fpl.model.JudicialUser; import uk.gov.hmcts.reform.fpl.model.common.JudgeAndLegalAdvisor; +import uk.gov.hmcts.reform.fpl.service.time.Time; import uk.gov.hmcts.reform.idam.client.models.UserDetails; import uk.gov.hmcts.reform.rd.client.JudicialApi; +import uk.gov.hmcts.reform.rd.model.JudicialUserAppointment; +import uk.gov.hmcts.reform.rd.model.JudicialUserAuthorisations; import uk.gov.hmcts.reform.rd.model.JudicialUserProfile; import uk.gov.hmcts.reform.rd.model.JudicialUserRequest; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.util.List; @@ -51,9 +55,13 @@ import static org.mockito.Mockito.when; import static org.mockito.quality.Strictness.LENIENT; import static uk.gov.hmcts.reform.fpl.config.TimeConfiguration.LONDON_TIMEZONE; +import static uk.gov.hmcts.reform.fpl.config.rd.LegalAdviserUsersConfiguration.SERVICE_CODE; +import static uk.gov.hmcts.reform.fpl.enums.JudgeCaseRole.ALLOCATED_JUDGE; import static uk.gov.hmcts.reform.fpl.enums.JudgeType.LEGAL_ADVISOR; +import static uk.gov.hmcts.reform.fpl.enums.LegalAdviserRole.ALLOCATED_LEGAL_ADVISER; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.wrapElements; import static uk.gov.hmcts.reform.fpl.utils.JudgeAndLegalAdvisorHelper.formatJudgeTitleAndName; +import static uk.gov.hmcts.reform.rd.model.JudicialUserAppointment.APPOINTMENT_TYPE_FEE_PAID; @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = LENIENT) @@ -89,6 +97,9 @@ class JudicialServiceTest { @Mock private UserService userService; + @Mock + private Time time; + @Captor private ArgumentCaptor> rolesCaptor; @@ -292,6 +303,93 @@ void shouldRemoveAndRecreateExistingHearingJudges() { verifyNoMoreInteractions(roleAssignmentService); } + + @Test + void shouldAssignAllocatedJudgeIfLegalAdvisor() { + List existing = Stream.of("12345", "67890") + .map(id -> RoleAssignment.builder() + .actorId(id) + .id(id) + .roleName("allocated-judge") + .roleCategory(RoleCategory.JUDICIAL) + .build()) + .toList(); + + when(roleAssignmentService.getCaseRolesAtTime(any(), any(), any())) + .thenReturn(existing); + + underTest.assignAllocatedJudge(12345L, "mock-userId", true); + + verify(roleAssignmentService).getCaseRolesAtTime(any(), any(), any()); + verify(roleAssignmentService, times(2)).deleteRoleAssignment(roleAssignmentCaptor.capture()); + + assertThat(roleAssignmentCaptor.getAllValues()) + .extracting("id") + .containsExactlyInAnyOrder("12345", "67890"); + + verify(roleAssignmentService) + .assignLegalAdvisersRole(eq(12345L), eq(List.of("mock-userId")), eq(ALLOCATED_LEGAL_ADVISER), + any(), eq(null)); + + verifyNoMoreInteractions(roleAssignmentService); + } + + @Test + void shouldAssignAllocatedJudgeIfNotLegalAdvisor() { + List existing = Stream.of("12345", "67890") + .map(id -> RoleAssignment.builder() + .actorId(id) + .id(id) + .roleName("allocated-judge") + .roleCategory(RoleCategory.JUDICIAL) + .build()) + .toList(); + + when(roleAssignmentService.getCaseRolesAtTime(any(), any(), any())) + .thenReturn(existing); + + underTest.assignAllocatedJudge(12345L, "mock-userId", false); + + verify(roleAssignmentService).getCaseRolesAtTime(any(), any(), any()); + verify(roleAssignmentService, times(2)).deleteRoleAssignment(roleAssignmentCaptor.capture()); + + assertThat(roleAssignmentCaptor.getAllValues()) + .extracting("id") + .containsExactlyInAnyOrder("12345", "67890"); + + verify(roleAssignmentService) + .assignJudgesRole(eq(12345L), eq(List.of("mock-userId")), eq(ALLOCATED_JUDGE), + any(), eq(null)); + + verifyNoMoreInteractions(roleAssignmentService); + } + } + + @Nested + class GetJudge { + @Test + void shouldGetJudicialUserProfilesByPersonalCode() { + final String personalCode = "12345"; + JudicialUserProfile jup = mock(JudicialUserProfile.class); + when(judicialApi.findUsers(any(), any(), anyInt(), any(), + eq(JudicialUserRequest.fromPersonalCode(personalCode)))) + .thenReturn(List.of(jup)); + + assertThat(underTest.getJudge(personalCode)).isEqualTo(Optional.of(jup)); + } + + @Test + void shouldReturnEmptyIfJudicialUserProfileNotFound() { + final String personalCode = "12345"; + when(judicialApi.findUsers(any(), any(), anyInt(), any(), any())).thenReturn(List.of()); + assertThat(underTest.getJudge(personalCode)).isEqualTo(Optional.empty()); + } + + @Test + void shouldReturnEmptyIfPersonalCodeIsEmpty() { + assertThat(underTest.getJudge(null)).isEqualTo(Optional.empty()); + assertThat(underTest.getJudge("")).isEqualTo(Optional.empty()); + } } @Test @@ -374,6 +472,12 @@ void shouldCheckJudgeDoesntExistWhenNotPresentInJrd() { assertThat(exists).isFalse(); } + @Test + void shouldReturnFalseIfPersonalCodeIsEmpty() { + assertThat( underTest.checkJudgeExists("")).isFalse(); + assertThat( underTest.checkJudgeExists(null)).isFalse(); + } + @Test void shouldGetAllocatedJudgeDetailsOffCase() { CaseData caseData = CaseData.builder() @@ -768,4 +872,134 @@ void shouldReturnIdamUserFullNameIfJRDNotFound() { assertThat(underTest.getJudgeTitleAndNameOfCurrentUser(null)).isEqualTo("John Smith"); } } + + @Nested + class IsFeePaidJudge { + @Test + void returnsTrueWhenCurrentUserHasActiveFeePaidAppointment() { + final LocalDateTime today = LocalDateTime.now(); + when(time.now()).thenReturn(today); + + final LocalDate starDate = today.toLocalDate().minusDays(1); + final LocalDate endDate = today.toLocalDate().plusDays(1); + + UserDetails userDetails = UserDetails.builder().id("idamId").build(); + when(userService.getUserDetails()).thenReturn(userDetails); + + JudicialUserProfile profile = JudicialUserProfile.builder() + .appointments(List.of( + JudicialUserAppointment.builder() + .appointmentId("feePaidAppointmentId") + .appointmentType(APPOINTMENT_TYPE_FEE_PAID) + .startDate(starDate) + .endDate(endDate) + .build(), + JudicialUserAppointment.builder() + .appointmentId("otherAppointmentId") + .appointmentType("Other Appointment Type") + .startDate(starDate) + .endDate(endDate) + .build())) + .authorisations(List.of( + JudicialUserAuthorisations.builder() + .appointmentId("feePaidAppointmentId") + .serviceCodes(List.of(SERVICE_CODE)) + .startDate(starDate) + .endDate(endDate) + .build() + )) + .build(); + when(underTest.getJudicialUserProfilesByIdamId("idamId")).thenReturn(List.of(profile)); + + assertThat(underTest.isCurrentUserFeePaidJudge()).isTrue(); + } + + @Test + void returnsFalseWhenNoFeePaidAppointment() { + final LocalDateTime today = LocalDateTime.now(); + when(time.now()).thenReturn(today); + + final LocalDate starDate = today.toLocalDate().minusDays(1); + final LocalDate endDate = today.toLocalDate().plusDays(1); + + UserDetails userDetails = UserDetails.builder().id("idamId").build(); + when(userService.getUserDetails()).thenReturn(userDetails); + + JudicialUserProfile profile = JudicialUserProfile.builder() + .appointments(List.of( + JudicialUserAppointment.builder() + .appointmentId("otherAppointmentId") + .appointmentType("Other Appointment Type") + .startDate(starDate) + .endDate(endDate) + .build())) + .authorisations(List.of( + JudicialUserAuthorisations.builder() + .appointmentId("otherAppointmentId") + .serviceCodes(List.of(SERVICE_CODE)) + .startDate(starDate) + .endDate(endDate) + .build() + )) + .build(); + when(underTest.getJudicialUserProfilesByIdamId("idamId")).thenReturn(List.of(profile)); + + assertThat(underTest.isCurrentUserFeePaidJudge()).isFalse(); + } + + @Test + void returnsFalseWhenFeePaidAppointmentExpiredOrNotAppointedToFPL() { + final LocalDateTime today = LocalDateTime.now(); + when(time.now()).thenReturn(today); + + final LocalDate starDate = today.toLocalDate().minusDays(1); + final LocalDate endDate = today.toLocalDate().plusDays(1); + + UserDetails userDetails = UserDetails.builder().id("idamId").build(); + when(userService.getUserDetails()).thenReturn(userDetails); + + JudicialUserProfile profile = JudicialUserProfile.builder() + .appointments(List.of( + JudicialUserAppointment.builder() + .appointmentId("feePaidAppointmentId_expired") + .appointmentType(APPOINTMENT_TYPE_FEE_PAID) + .startDate(starDate.minusDays(10)) + .endDate(endDate.minusDays(10)) + .build(), + JudicialUserAppointment.builder() + .appointmentId("feePaidAppointmentId_otherService") + .appointmentType(APPOINTMENT_TYPE_FEE_PAID) + .startDate(starDate) + .endDate(endDate) + .build())) + .authorisations(List.of( + JudicialUserAuthorisations.builder() + .appointmentId("feePaidAppointmentId_expired") + .serviceCodes(List.of(SERVICE_CODE)) + .startDate(starDate) + .endDate(endDate) + .build(), + JudicialUserAuthorisations.builder() + .appointmentId("feePaidAppointmentId_otherService") + .serviceCodes(List.of("Other_service")) + .startDate(starDate) + .endDate(endDate) + .build() + )) + .build(); + when(underTest.getJudicialUserProfilesByIdamId("idamId")).thenReturn(List.of(profile)); + + assertThat(underTest.isCurrentUserFeePaidJudge()).isFalse(); + } + + @Test + void returnsFalseWhenNoJudicialUserProfilesFound() { + UserDetails userDetails = UserDetails.builder().id("idamId").build(); + + when(userService.getUserDetails()).thenReturn(userDetails); + when(underTest.getJudicialUserProfilesByIdamId("idamId")).thenReturn(List.of()); + + assertThat(underTest.isCurrentUserFeePaidJudge()).isFalse(); + } + } } From 1f9c65f4bc308d8caa0772d0afd3cd39248e05fa Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Fri, 13 Jun 2025 14:38:11 +0100 Subject: [PATCH 18/23] Update JudicialServiceTest.java --- .../uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java index 283e240c0ee..d823bd317e3 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/JudicialServiceTest.java @@ -474,8 +474,8 @@ void shouldCheckJudgeDoesntExistWhenNotPresentInJrd() { @Test void shouldReturnFalseIfPersonalCodeIsEmpty() { - assertThat( underTest.checkJudgeExists("")).isFalse(); - assertThat( underTest.checkJudgeExists(null)).isFalse(); + assertThat(underTest.checkJudgeExists("")).isFalse(); + assertThat(underTest.checkJudgeExists(null)).isFalse(); } @Test From 59dde1aa118dacc2fd61f5aa2cde1e7a192dc61d Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Mon, 16 Jun 2025 17:25:27 +0100 Subject: [PATCH 19/23] fix consent checking --- .../UploadAdditionalApplicationsController.java | 5 +++-- .../docmosis/DocmosisApprovedOrderCoverSheetService.java | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/UploadAdditionalApplicationsController.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/UploadAdditionalApplicationsController.java index 4581f60abbb..226c482cf4b 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/UploadAdditionalApplicationsController.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/UploadAdditionalApplicationsController.java @@ -178,8 +178,9 @@ public AboutToStartOrSubmitCallbackResponse handleAboutToSubmit(@RequestBody Cal order.getValue().setUploaderType(manageDocumentService.getUploaderType(caseData)); }); List> newDrafts = draftOrders.stream() - .map(draftOrderElement -> - element(draftOrderElement.getId(), HearingOrder.from(draftOrderElement.getValue()))) + .map(Element::getValue) + .map(HearingOrder::from) + .map(ElementUtils::element) .collect(Collectors.toList()); HearingOrdersBundles hearingOrdersBundles = draftOrderService.migrateCmoDraftToOrdersBundles(caseData); diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java index 51034875ef3..d7e4a45befb 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.Objects; import java.util.Optional; -import java.util.UUID; import java.util.stream.Stream; import static uk.gov.hmcts.reform.fpl.enums.C2ApplicationType.WITHOUT_NOTICE; @@ -113,7 +112,7 @@ public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData .judgeTitleAndName(caseData.getReviewDraftOrdersData().getJudgeTitleAndName()) .dateOfApproval(formatLocalDateToString(time.now().toLocalDate(), DATE, getCaseLanguage(caseData))) .crest(CREST.getValue()) - .orderByConsent(isC2OrderByConsent(caseData, hearingOrder.getId()) ? YES.getValue() : null) + .orderByConsent(isC2OrderByConsent(caseData, hearingOrder) ? YES.getValue() : null) .build(); } @@ -125,7 +124,7 @@ private Language getCaseLanguage(CaseData caseData) { return Optional.ofNullable(caseData.getC110A().getLanguageRequirementApplication()).orElse(Language.ENGLISH); } - private boolean isC2OrderByConsent(CaseData caseData, UUID hearingOrderId) { + private boolean isC2OrderByConsent(CaseData caseData, Element hearingOrder) { // 1. filter out all additional applications bundles by consent // 2. check if the hearing order id is present in any of the bundle return unwrapElements(caseData.getAdditionalApplicationsBundle()).stream() @@ -137,7 +136,9 @@ private boolean isC2OrderByConsent(CaseData caseData, UUID hearingOrderId) { .map(C2DocumentBundle::getDraftOrdersBundle) .filter(Objects::nonNull) .flatMap(List::stream) - .anyMatch(draftOrderElement -> draftOrderElement.getId().equals(hearingOrderId)) + .anyMatch(draftOrderElement -> + draftOrderElement.getValue().getDocument().getUrl() + .equals(hearingOrder.getValue().getOrderOrOrderConfidential().getUrl())) ); } } From 3839dfe37b914fc2410718be8d3bfe9771e34705 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Tue, 17 Jun 2025 11:32:50 +0100 Subject: [PATCH 20/23] update to seal the coversheet as well --- .../reform/fpl/service/cmo/HearingOrderGenerator.java | 4 +++- .../fpl/service/cmo/HearingOrderGeneratorTest.java | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java index 267da517f81..3f20e555d27 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java @@ -61,7 +61,9 @@ public Element buildSealedHearingOrder(CaseData caseData, caseData.getSealType()); if (addCoverSheet) { - sealedOrder = addCoverSheet(caseData, sealedOrder, hearingOrderElement); + // add a sealed cover sheet to the order + sealedOrder = documentSealingService.sealDocument(addCoverSheet(caseData, sealedOrder, hearingOrderElement), + caseData.getCourt(), caseData.getSealType()); } builder = (isConfidentialOrder) diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java index 5055cfa3cf5..55666e70907 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java @@ -49,6 +49,7 @@ class HearingOrderGeneratorTest { private static final Document ORDER_WITH_COVER_SHEET_DOCUMENT = testDocument(); private static final DocumentReference ORDER_WITH_COVER_SHEET = DocumentReference .buildFromDocument(ORDER_WITH_COVER_SHEET_DOCUMENT); + private static final DocumentReference ORDER_WITH_SEALED_COVERSHEET = testDocumentReference(); private static final DocumentReference amendedOrder = testDocumentReference(); private static final Time time = new FixedTimeConfiguration().stoppedTime(); @@ -90,12 +91,14 @@ void shouldBuildSealedHearingOrderWhenReviewDecisionIsApproved() throws IOExcept .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); + when(documentSealingService.sealDocument(ORDER_WITH_COVER_SHEET, court, SealType.ENGLISH)) + .thenReturn(ORDER_WITH_SEALED_COVERSHEET); Element expectedOrder = element(ORDER_ID, hearingOrder.toBuilder() .dateIssued(time.now().toLocalDate()).status(CMOStatus.APPROVED) .othersNotified(othersNotified) .others(selectedOthers) - .order(ORDER_WITH_COVER_SHEET).lastUploadedOrder(order).build()); + .order(ORDER_WITH_SEALED_COVERSHEET).lastUploadedOrder(order).build()); Element actual = underTest.buildSealedHearingOrder( caseData, @@ -124,11 +127,13 @@ void shouldBuildSealedHearingOrderWhenJudgeAmendsTheDocument() throws IOExceptio .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); + when(documentSealingService.sealDocument(ORDER_WITH_COVER_SHEET, court, SealType.ENGLISH)) + .thenReturn(ORDER_WITH_SEALED_COVERSHEET); Element expectedOrder = element(ORDER_ID, hearingOrder.toBuilder() .dateIssued(time.now().toLocalDate()).status(CMOStatus.APPROVED) .others(List.of()).othersNotified("") - .order(ORDER_WITH_COVER_SHEET).lastUploadedOrder(amendedOrder).build()); + .order(ORDER_WITH_SEALED_COVERSHEET).lastUploadedOrder(amendedOrder).build()); Element actual = underTest.buildSealedHearingOrder( caseData, From 69d035ea46405bc35c8d34f50d82c48bef28df3f Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Wed, 18 Jun 2025 15:49:01 +0100 Subject: [PATCH 21/23] fix test --- .../ApproveDraftOrdersControllerPostAboutToSubmitTest.java | 4 ++++ .../reform/fpl/service/cmo/ApproveDraftOrdersService.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerPostAboutToSubmitTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerPostAboutToSubmitTest.java index ecd15f6b79e..c6bfa75b1ee 100644 --- a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerPostAboutToSubmitTest.java +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerPostAboutToSubmitTest.java @@ -80,6 +80,8 @@ class ApproveDraftOrdersControllerPostAboutToSubmitTest extends AbstractCallback private final String hearing = "Test hearing 21st August 2020"; private final DocumentReference convertedDocument = DocumentReference.builder().filename("converted").build(); private final DocumentReference sealedDocument = DocumentReference.builder().filename("sealed").build(); + private final DocumentReference sealedDocumentWithCoverSheet = + DocumentReference.builder().filename("sealed").build(); ApproveDraftOrdersControllerPostAboutToSubmitTest() { super("approve-draft-orders/post-submit-callback"); @@ -240,6 +242,8 @@ void shouldSealPDFAndCreateBlankOrderWhenJudgeApprovesBlankOrders(CMOReviewOutco if (SEND_TO_ALL_PARTIES.equals(reviewOutcome)) { given(documentSealingService.sealDocument(order, court, SealType.ENGLISH)) .willReturn(sealedDocument); + given(documentSealingService.sealDocument(sealedDocument, court, SealType.ENGLISH)) + .willReturn(sealedDocumentWithCoverSheet); } else { given(documentSealingService.sealDocument(convertedDocument, court, SealType.ENGLISH)) .willReturn(sealedDocument); diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java index 3cce66d7118..5e4cb1b8290 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java @@ -267,7 +267,7 @@ public void reviewC21Orders(CaseData caseData, Map data, reviewedOrder = hearingOrderGenerator.buildSealedHearingOrder( caseData, reviewDecision, orderElement, selectedOthers, getOthersNotified(selectedOthers), - true); + SEND_TO_ALL_PARTIES.equals(reviewDecision.getDecision())); Element generatedBlankOrder = blankOrderGenerator.buildBlankOrder(caseData, selectedOrdersBundle, reviewedOrder, selectedOthers, getOthersNotified(selectedOthers)); From a5365952bc14d648323aa8c0477bd7df7f84871c Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Fri, 20 Jun 2025 14:45:32 +0100 Subject: [PATCH 22/23] fix tile is not pulled to the preview if non fee paid judge --- .../controllers/orders/ApproveDraftOrdersController.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java index bc48f338f01..16d3b59b10a 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/controllers/orders/ApproveDraftOrdersController.java @@ -97,7 +97,11 @@ public AboutToStartOrSubmitCallbackResponse validateReviewDecision(@RequestBody if (judicialService.isCurrentUserFeePaidJudge()) { data.put("judgeType", FEE_PAID_JUDGE); } else { - data.putAll(approveDraftOrdersService.previewOrderWithCoverSheet(caseData)); + data.putAll(approveDraftOrdersService.previewOrderWithCoverSheet(caseData.toBuilder() + .reviewDraftOrdersData(caseData.getReviewDraftOrdersData().toBuilder() + .judgeTitleAndName(approveDraftOrdersService.getJudgeTitleAndNameOfCurrentUser(caseData)) + .build()) + .build())); } } } From b07c46c9d607abfd7920dfb10a6d7f34e0bc3755 Mon Sep 17 00:00:00 2001 From: Chak Shing Lo <95437003+chak-shing-lo-justice@users.noreply.github.com> Date: Thu, 31 Jul 2025 15:25:41 +0100 Subject: [PATCH 23/23] update wording and remove consent part --- .../CareSupervision/hearingOrders.json | 2 +- ...lerValidateReviewDecisionMidEventTest.java | 2 +- .../DocmosisApprovedOrderCoverSheet.java | 1 - .../cmo/ApproveDraftOrdersService.java | 2 +- .../service/cmo/HearingOrderGenerator.java | 7 ++- ...ocmosisApprovedOrderCoverSheetService.java | 41 +++-------------- .../cmo/HearingOrderGeneratorTest.java | 6 +-- ...sisApprovedOrderCoverSheetServiceTest.java | 45 +------------------ 8 files changed, 16 insertions(+), 90 deletions(-) diff --git a/ccd-definition/CaseField/CareSupervision/hearingOrders.json b/ccd-definition/CaseField/CareSupervision/hearingOrders.json index 149ae4e88d9..a754bb3590c 100644 --- a/ccd-definition/CaseField/CareSupervision/hearingOrders.json +++ b/ccd-definition/CaseField/CareSupervision/hearingOrders.json @@ -1239,7 +1239,7 @@ "LiveFrom": "01/01/2017", "CaseTypeID": "CARE_SUPERVISION_EPO", "ID": "previewOrderLabel", - "Label": "Cover sheets will be automatically added to the following C21 orders. If the content is incorrect, please return to the previous step and upload a revised document.", + "Label": "If you click 'Continue', the draft order will be approved without any changes. A coversheet will be added showing your name and the date of approval, and a court seal will also be applied to the final version.

Please note that the preview shown below will not display the court seal, but it reflects the content that will be issued.

If you wish to make any amendments, please return to the previous screen and select either 'No, I need to make changes' or 'No, the applicant needs to make changes'.", "FieldType": "Label", "SecurityClassification": "Public", "Searchable": "N" diff --git a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java index 73ba0dedcc2..8b24a10d983 100644 --- a/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java +++ b/service/src/integrationTest/java/uk/gov/hmcts/reform/fpl/controllers/ApproveDraftOrdersControllerValidateReviewDecisionMidEventTest.java @@ -156,7 +156,7 @@ void shouldNotReturnErrorsWhenJudgeDoesNotReviewOneOfTheDraftOrdersInTheBundle() .reviewDraftOrdersData(reviewDraftOrdersData).build(); when(judicialService.isCurrentUserFeePaidJudge()).thenReturn(Boolean.FALSE); - when(hearingOrderGenerator.addCoverSheet(caseData, order, draftOrder1)).thenReturn(orderWithCoverSheet); + when(hearingOrderGenerator.addCoverSheet(caseData, order)).thenReturn(orderWithCoverSheet); AboutToStartOrSubmitCallbackResponse callbackResponse = postMidEvent(caseData, validateDecisionEventPath); assertThat(callbackResponse.getErrors()).isEmpty(); diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/docmosis/DocmosisApprovedOrderCoverSheet.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/docmosis/DocmosisApprovedOrderCoverSheet.java index 0f4344dbd71..485130821c5 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/model/docmosis/DocmosisApprovedOrderCoverSheet.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/model/docmosis/DocmosisApprovedOrderCoverSheet.java @@ -15,6 +15,5 @@ public class DocmosisApprovedOrderCoverSheet implements DocmosisData { private final List children; private final String judgeTitleAndName; private final String dateOfApproval; - private final String orderByConsent; private final String crest; } diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java index 5e4cb1b8290..e92f9620b36 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/ApproveDraftOrdersService.java @@ -424,7 +424,7 @@ public Map previewOrderWithCoverSheet(CaseData caseData) { data.put("previewApprovedOrder" + labelCounter, hearingOrderGenerator.addCoverSheet(caseData, (approvedOrder.isConfidentialOrder() - ? approvedOrder.getOrderConfidential() : approvedOrder.getOrder()), orderElement)); + ? approvedOrder.getOrderConfidential() : approvedOrder.getOrder()))); data.put("previewApprovedOrderTitle" + labelCounter, String.format("Order %d %s", (i + 1), approvedOrder.getTitle())); labelCounter++; diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java index 3f20e555d27..ac79e2e4e07 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGenerator.java @@ -62,7 +62,7 @@ public Element buildSealedHearingOrder(CaseData caseData, if (addCoverSheet) { // add a sealed cover sheet to the order - sealedOrder = documentSealingService.sealDocument(addCoverSheet(caseData, sealedOrder, hearingOrderElement), + sealedOrder = documentSealingService.sealDocument(addCoverSheet(caseData, sealedOrder), caseData.getCourt(), caseData.getSealType()); } @@ -81,11 +81,10 @@ public Element buildRejectedHearingOrder( .build()); } - public DocumentReference addCoverSheet(CaseData caseData, DocumentReference orderDoc, - Element hearingOrderElement) { + public DocumentReference addCoverSheet(CaseData caseData, DocumentReference orderDoc) { try { DocmosisDocument orderWithCoverSheet = docmosisApprovedOrderCoverSheetService - .addCoverSheetToApprovedOrder(caseData, orderDoc, hearingOrderElement); + .addCoverSheetToApprovedOrder(caseData, orderDoc); return buildFromDocument(uploadDocumentService .uploadPDF(orderWithCoverSheet.getBytes(), orderDoc.getFilename())); diff --git a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java index d7e4a45befb..5db5ebecd64 100644 --- a/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java +++ b/service/src/main/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetService.java @@ -10,13 +10,10 @@ import org.springframework.stereotype.Service; import uk.gov.hmcts.reform.fpl.enums.docmosis.RenderFormat; import uk.gov.hmcts.reform.fpl.model.CaseData; -import uk.gov.hmcts.reform.fpl.model.common.C2DocumentBundle; import uk.gov.hmcts.reform.fpl.model.common.DocmosisDocument; import uk.gov.hmcts.reform.fpl.model.common.DocumentReference; -import uk.gov.hmcts.reform.fpl.model.common.Element; import uk.gov.hmcts.reform.fpl.model.configuration.Language; import uk.gov.hmcts.reform.fpl.model.docmosis.DocmosisApprovedOrderCoverSheet; -import uk.gov.hmcts.reform.fpl.model.order.HearingOrder; import uk.gov.hmcts.reform.fpl.service.CaseDataExtractionService; import uk.gov.hmcts.reform.fpl.service.orders.generator.DocumentMerger; import uk.gov.hmcts.reform.fpl.service.time.Time; @@ -24,18 +21,13 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; -import java.util.Objects; import java.util.Optional; -import java.util.stream.Stream; -import static uk.gov.hmcts.reform.fpl.enums.C2ApplicationType.WITHOUT_NOTICE; import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; -import static uk.gov.hmcts.reform.fpl.enums.YesNo.YES; import static uk.gov.hmcts.reform.fpl.model.configuration.Language.WELSH; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.formatLocalDateToString; -import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.unwrapElements; @Service @RequiredArgsConstructor(onConstructor = @__(@Autowired)) @@ -48,10 +40,10 @@ public class DocmosisApprovedOrderCoverSheetService { private final DocumentMerger documentMerger; private final Time time; - public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, DocumentReference order, - Element hearingOrderElement) throws IOException { + public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, + DocumentReference order) throws IOException { // Create - DocmosisDocument coverSheet = createCoverSheet(caseData, hearingOrderElement); + DocmosisDocument coverSheet = createCoverSheet(caseData); // Add cover sheet to the order DocmosisDocument orderWithCoverSheet = documentMerger.mergeDocuments(coverSheet, List.of(order)); @@ -94,17 +86,15 @@ public DocmosisDocument addCoverSheetToApprovedOrder(CaseData caseData, Document } } - public DocmosisDocument createCoverSheet(CaseData caseData, Element hearingOrder) { - DocmosisApprovedOrderCoverSheet coverDocumentData = buildCoverDocumentsData(caseData, hearingOrder); + public DocmosisDocument createCoverSheet(CaseData caseData) { + DocmosisApprovedOrderCoverSheet coverDocumentData = buildCoverDocumentsData(caseData); return docmosisDocumentGeneratorService.generateDocmosisDocument(coverDocumentData, APPROVED_ORDER_COVER, RenderFormat.PDF, getCaseLanguage(caseData)); } - public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData, - Element hearingOrder) { - + public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData) { return DocmosisApprovedOrderCoverSheet.builder() .familyManCaseNumber(caseData.getFamilyManCaseNumber()) .courtName(caseDataExtractionService.getCourtName(caseData)) @@ -112,7 +102,6 @@ public DocmosisApprovedOrderCoverSheet buildCoverDocumentsData(CaseData caseData .judgeTitleAndName(caseData.getReviewDraftOrdersData().getJudgeTitleAndName()) .dateOfApproval(formatLocalDateToString(time.now().toLocalDate(), DATE, getCaseLanguage(caseData))) .crest(CREST.getValue()) - .orderByConsent(isC2OrderByConsent(caseData, hearingOrder) ? YES.getValue() : null) .build(); } @@ -123,22 +112,4 @@ private String getAnnexText(CaseData caseData) { private Language getCaseLanguage(CaseData caseData) { return Optional.ofNullable(caseData.getC110A().getLanguageRequirementApplication()).orElse(Language.ENGLISH); } - - private boolean isC2OrderByConsent(CaseData caseData, Element hearingOrder) { - // 1. filter out all additional applications bundles by consent - // 2. check if the hearing order id is present in any of the bundle - return unwrapElements(caseData.getAdditionalApplicationsBundle()).stream() - .anyMatch(additionalApplicationsBundle -> - Stream.of(additionalApplicationsBundle.getC2DocumentBundle(), - additionalApplicationsBundle.getC2DocumentBundleConfidential()) - .filter(Objects::nonNull) - .filter(documentBundle -> WITHOUT_NOTICE.equals(documentBundle.getType())) - .map(C2DocumentBundle::getDraftOrdersBundle) - .filter(Objects::nonNull) - .flatMap(List::stream) - .anyMatch(draftOrderElement -> - draftOrderElement.getValue().getDocument().getUrl() - .equals(hearingOrder.getValue().getOrderOrOrderConfidential().getUrl())) - ); - } } diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java index 55666e70907..2174392dfe0 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/cmo/HearingOrderGeneratorTest.java @@ -86,8 +86,7 @@ void shouldBuildSealedHearingOrderWhenReviewDecisionIsApproved() throws IOExcept .build(); when(documentSealingService.sealDocument(order, court, SealType.ENGLISH)).thenReturn(sealedOrder); - when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder, - element(ORDER_ID, hearingOrder))) + when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder)) .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); @@ -122,8 +121,7 @@ void shouldBuildSealedHearingOrderWhenJudgeAmendsTheDocument() throws IOExceptio .reviewCMODecision(reviewDecision) .build(); when(documentSealingService.sealDocument(amendedOrder, court, SealType.ENGLISH)).thenReturn(sealedOrder); - when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder, - element(ORDER_ID, hearingOrder))) + when(docmosisApprovedOrderCoverSheetService.addCoverSheetToApprovedOrder(caseData, sealedOrder)) .thenReturn(DOCMOSIS_DOCUMENT_ORDER_WITH_COVER_SHEET); when(uploadDocumentService.uploadPDF(eq(ORDER_WITH_COVER_SHEET_BYTES), any())) .thenReturn(ORDER_WITH_COVER_SHEET_DOCUMENT); diff --git a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java index 2d1046e8395..07e32859e7a 100644 --- a/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java +++ b/service/src/test/java/uk/gov/hmcts/reform/fpl/service/docmosis/DocmosisApprovedOrderCoverSheetServiceTest.java @@ -37,7 +37,6 @@ import static org.mockito.BDDMockito.given; import static uk.gov.hmcts.reform.fpl.enums.DocmosisImages.CREST; import static uk.gov.hmcts.reform.fpl.enums.DocmosisTemplates.APPROVED_ORDER_COVER; -import static uk.gov.hmcts.reform.fpl.enums.YesNo.YES; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.DATE; import static uk.gov.hmcts.reform.fpl.utils.DateFormatterHelper.formatLocalDateToString; import static uk.gov.hmcts.reform.fpl.utils.ElementUtils.element; @@ -131,7 +130,7 @@ void shouldGenerateApprovedOrderCoverSheet() { RenderFormat.PDF, LANGUAGE)) .willReturn(COVER_SHEET); - DocmosisDocument result = underTest.createCoverSheet(caseData, HEARING_ORDER); + DocmosisDocument result = underTest.createCoverSheet(caseData); assertThat(result).isEqualTo(COVER_SHEET); } @@ -172,50 +171,10 @@ void shouldAddCoverSheetAndAddAnnexAWording() throws IOException { DocmosisDocument mergedOrder = new DocmosisDocument("merged_order.pdf", mergedOrderBytes); given(documentMerger.mergeDocuments(any(), any())).willReturn(mergedOrder); - DocmosisDocument result = underTest.addCoverSheetToApprovedOrder(caseData, testDocumentReference(), - HEARING_ORDER); + DocmosisDocument result = underTest.addCoverSheetToApprovedOrder(caseData, testDocumentReference()); String resultText = (new DocmosisHelper()).extractPdfContent(result.getBytes()); assertThat(resultText).isEqualToNormalizingWhitespace("First page Second page ANNEX A: "); } - - @Test - void shouldAddCoverSheetWithConsentWording() { - CaseData caseData = CaseData.builder() - .id(CASE_ID) - .familyManCaseNumber(FAMILY_MAN_NUMBER) - .court(COURT) - .c110A(C110A.builder() - .languageRequirementApplication(LANGUAGE) - .build()) - .children1(List.of(CHILD)) - .confidentialChildren(List.of(CONFIDENTIAL_CHILD)) - .reviewDraftOrdersData(ReviewDraftOrdersData.builder().judgeTitleAndName(JUDGE_NAME).build()) - .additionalApplicationsBundle(List.of(C2_BUNDLE_WITH_CONSENT)) - .build(); - - given(caseDataExtractionService.getCourtName(caseData)).willReturn(COURT_NAME); - given(caseDataExtractionService.getChildrenDetails(caseData.getAllChildren())).willReturn(DOCMOSIS_CHILDREN); - given(time.now()).willReturn(TEST_TIME); - - DocmosisApprovedOrderCoverSheet expectedDocmosisData = DocmosisApprovedOrderCoverSheet.builder() - .familyManCaseNumber(FAMILY_MAN_NUMBER) - .courtName(COURT_NAME) - .children(DOCMOSIS_CHILDREN) - .judgeTitleAndName(JUDGE_NAME) - .dateOfApproval(formatLocalDateToString(TEST_TIME.toLocalDate(), DATE, Language.ENGLISH)) - .crest(CREST.getValue()) - .orderByConsent(YES.getValue()) - .build(); - - - given(docmosisDocumentGeneratorService.generateDocmosisDocument(expectedDocmosisData, APPROVED_ORDER_COVER, - RenderFormat.PDF, LANGUAGE)) - .willReturn(COVER_SHEET); - - DocmosisDocument result = underTest.createCoverSheet(caseData, HEARING_ORDER_WITH_CONSENT); - - assertThat(result).isEqualTo(COVER_SHEET); - } }