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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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/22] 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())); } } }