Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dfr 3543 ct judiciary upload multiple attachments function #2109

Open
wants to merge 40 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
b9f0934
Add additionalDocuments property to DraftDirectionOrder
hamzahtahirhmcts Jan 24, 2025
28c152d
Add collection for additional documents
hamzahtahirhmcts Jan 24, 2025
a0e3dc0
convert controller point to AboutToSubmit Handler for the judge order…
hamzahtahirhmcts Jan 24, 2025
d40a618
Categorise additional documents into POST_HEARING_DRAFT_ORDER
hamzahtahirhmcts Jan 24, 2025
3a453ca
Method to conver additional docs to PDF
hamzahtahirhmcts Jan 27, 2025
f2c1217
Check that the additional docs collection is not empty
hamzahtahirhmcts Jan 27, 2025
12f885e
Check that the additional docs are not empty
hamzahtahirhmcts Jan 27, 2025
641c06d
Add unit tests for new JudgeDraftOrderAboutToSubmitHandler
hamzahtahirhmcts Jan 27, 2025
2ce3f9b
Improve unit tests
hamzahtahirhmcts Jan 27, 2025
8182671
checkstyle fix
hamzahtahirhmcts Jan 27, 2025
b699ad0
checkstyle fix
hamzahtahirhmcts Jan 27, 2025
853cb50
Merge branch 'master' into DFR-3543-CT-Judiciary---Upload-Multiple-At…
so99y Jan 28, 2025
619aa8d
Ensure we use the same data through mapper
hamzahtahirhmcts Jan 28, 2025
fd5dcc6
improve tests and mocks
hamzahtahirhmcts Jan 28, 2025
31101b8
Merge remote-tracking branch 'origin/DFR-3543-CT-Judiciary---Upload-M…
hamzahtahirhmcts Jan 28, 2025
aca3a62
Use DocumentCollection instead
hamzahtahirhmcts Jan 28, 2025
14e1507
Merge branch 'master' into DFR-3543-CT-Judiciary---Upload-Multiple-At…
hamzahtahirhmcts Jan 28, 2025
43c776d
Add unit tests for UploadedDraftOrderCategoriser
hamzahtahirhmcts Jan 28, 2025
4aa9275
Merge branch 'master' into DFR-3543-CT-Judiciary---Upload-Multiple-At…
hamzahtahirhmcts Jan 28, 2025
fbfa587
Add additionalDocuments to DirectionOrder
hamzahtahirhmcts Jan 29, 2025
f199cea
Merge remote-tracking branch 'origin/DFR-3543-CT-Judiciary---Upload-M…
hamzahtahirhmcts Jan 29, 2025
dd4fa07
Store additional documents in uploadHearingOrder
hamzahtahirhmcts Jan 29, 2025
9613211
Store additional documents in finalOrderCollection
hamzahtahirhmcts Jan 29, 2025
d184776
Merge branch 'master' into DFR-3543-CT-Judiciary---Upload-Multiple-At…
hamzahtahirhmcts Jan 29, 2025
ddd87cc
Convert additional documents to PDF first.
hamzahtahirhmcts Jan 30, 2025
8eed7de
Merge branch 'master' into DFR-3543-CT-Judiciary---Upload-Multiple-At…
hamzahtahirhmcts Jan 30, 2025
44d9c44
remove redundant call to moveCollection
hamzahtahirhmcts Jan 30, 2025
a1dee5f
make a variable for judgeApprovedHearingOrder
hamzahtahirhmcts Jan 30, 2025
cce9d1d
remove assert for no additional documents
hamzahtahirhmcts Jan 30, 2025
5eeb2b1
validate draftDirectionOrderCollection is not empty
hamzahtahirhmcts Jan 30, 2025
ddb10ed
Merge branch 'master' into DFR-3543-CT-Judiciary---Upload-Multiple-At…
hamzahtahirhmcts Jan 30, 2025
4a9de4b
capitalise variable
hamzahtahirhmcts Jan 30, 2025
dc9eb9c
use CollectionUtils instead
hamzahtahirhmcts Jan 30, 2025
d095cc7
Remove Injectmocks annotation
hamzahtahirhmcts Jan 30, 2025
005b717
remove eq()
hamzahtahirhmcts Jan 30, 2025
78c8329
remove redundant api call to HearingOrderController.storeHearingOrder
hamzahtahirhmcts Jan 30, 2025
0bf3d72
Merge branch 'master' into DFR-3543-CT-Judiciary---Upload-Multiple-At…
jthmcts Jan 31, 2025
bcfd339
Merge branch 'master' into DFR-3543-CT-Judiciary---Upload-Multiple-At…
hamzahtahirhmcts Feb 3, 2025
9eb689c
Merge branch 'master' into DFR-3543-CT-Judiciary---Upload-Multiple-At…
so99y Feb 4, 2025
501783f
Merge branch 'master' into DFR-3543-CT-Judiciary---Upload-Multiple-At…
hamzahtahirhmcts Feb 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package uk.gov.hmcts.reform.finrem.caseorchestration.handler;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import uk.gov.hmcts.reform.ccd.client.model.CaseDetails;
import uk.gov.hmcts.reform.finrem.caseorchestration.ccd.callback.CallbackType;
import uk.gov.hmcts.reform.finrem.caseorchestration.controllers.GenericAboutToStartOrSubmitCallbackResponse;
import uk.gov.hmcts.reform.finrem.caseorchestration.mapper.FinremCaseDetailsMapper;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.EventType;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.CaseDocument;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.CaseType;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.DraftDirectionOrderCollection;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.FinremCaseData;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.FinremCaseDetails;
import uk.gov.hmcts.reform.finrem.caseorchestration.service.CaseDataService;
import uk.gov.hmcts.reform.finrem.caseorchestration.service.ContestedOrderApprovedLetterService;
import uk.gov.hmcts.reform.finrem.caseorchestration.service.GenericDocumentService;
import uk.gov.hmcts.reform.finrem.caseorchestration.service.HearingOrderService;
import uk.gov.hmcts.reform.finrem.caseorchestration.service.documentcatergory.UploadedDraftOrderCategoriser;

import java.util.List;
import java.util.Map;

import static uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.CCDConfigConstant.DRAFT_DIRECTION_DETAILS_COLLECTION;
import static uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.CCDConfigConstant.DRAFT_DIRECTION_DETAILS_COLLECTION_RO;

@Slf4j
@Service
public class JudgeDraftOrderAboutToSubmitHandler extends FinremCallbackHandler {

private final HearingOrderService hearingOrderService;
private final GenericDocumentService genericDocumentService;
private final ContestedOrderApprovedLetterService contestedOrderApprovedLetterService;
private final CaseDataService caseDataService;
private final UploadedDraftOrderCategoriser uploadedDraftOrderCategoriser;

public JudgeDraftOrderAboutToSubmitHandler(FinremCaseDetailsMapper finremCaseDetailsMapper, HearingOrderService hearingOrderService,
GenericDocumentService genericDocumentService,
ContestedOrderApprovedLetterService contestedOrderApprovedLetterService,
CaseDataService caseDataService,
UploadedDraftOrderCategoriser uploadedDraftOrderCategoriser) {
super(finremCaseDetailsMapper);
this.hearingOrderService = hearingOrderService;
this.genericDocumentService = genericDocumentService;
this.contestedOrderApprovedLetterService = contestedOrderApprovedLetterService;
this.caseDataService = caseDataService;
this.uploadedDraftOrderCategoriser = uploadedDraftOrderCategoriser;
}

@Override
public boolean canHandle(CallbackType callbackType, CaseType caseType, EventType eventType) {
return CallbackType.ABOUT_TO_SUBMIT.equals(callbackType)
&& CaseType.CONTESTED.equals(caseType)
&& (EventType.JUDGE_DRAFT_ORDER.equals(eventType));
hamzahtahirhmcts marked this conversation as resolved.
Show resolved Hide resolved
}

@Override
public GenericAboutToStartOrSubmitCallbackResponse<FinremCaseData> handle(FinremCallbackRequest callbackRequest,
String userAuthorisation) {

FinremCaseDetails finremCaseDetails = callbackRequest.getCaseDetails();
String caseId = String.valueOf(finremCaseDetails.getId());
log.info("Invoking contested event {} mid callback for Case ID: {}",
EventType.JUDGE_DRAFT_ORDER, caseId);
hamzahtahirhmcts marked this conversation as resolved.
Show resolved Hide resolved
validateCaseData(callbackRequest);

CaseDetails caseDetails = finremCaseDetailsMapper.mapToCaseDetails(finremCaseDetails);

hearingOrderService.convertToPdfAndStampAndStoreLatestDraftHearingOrder(caseDetails, userAuthorisation);
convertAdditionalDocumentsToPdf(finremCaseDetails, userAuthorisation);
hamzahtahirhmcts marked this conversation as resolved.
Show resolved Hide resolved
contestedOrderApprovedLetterService.generateAndStoreContestedOrderApprovedLetter(caseDetails, userAuthorisation);

Map<String, Object> caseData = caseDetails.getData();
caseDataService.moveCollection(caseData, DRAFT_DIRECTION_DETAILS_COLLECTION, DRAFT_DIRECTION_DETAILS_COLLECTION_RO);

uploadedDraftOrderCategoriser.categorise(finremCaseDetails.getData());

return GenericAboutToStartOrSubmitCallbackResponse.<FinremCaseData>builder()
.data(finremCaseDetails.getData()).build();
}

private void convertAdditionalDocumentsToPdf(FinremCaseDetails caseDetails, String authorisation) {
FinremCaseData caseData = caseDetails.getData();
List<DraftDirectionOrderCollection> directionOrderCollection = caseData.getDraftDirectionWrapper().getDraftDirectionOrderCollection();

directionOrderCollection.stream().map(order -> order.getValue().getJudgeApprovedOrderAdditionalDocumentsCollection())
.filter(CollectionUtils::isNotEmpty).forEach(additionalDocs -> additionalDocs.forEach(additionalDoc -> {
CaseDocument documentPdf = genericDocumentService.convertDocumentIfNotPdfAlready(
additionalDoc.getValue(), authorisation,
String.valueOf(caseDetails.getId()));

additionalDoc.setValue(documentPdf);
}));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
@Data
@Builder
Expand All @@ -21,4 +23,7 @@ public class DraftDirectionOrder implements HasCaseDocument {

@JsonProperty("uploadDraftDocument")
CaseDocument uploadDraftDocument;

@JsonProperty("additionalDocuments")
private List<JudgeApprovedOrderAdditionalDocumentsCollection> judgeApprovedOrderAdditionalDocumentsCollection;
hamzahtahirhmcts marked this conversation as resolved.
Show resolved Hide resolved
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@JsonIgnoreProperties(ignoreUnknown = true)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class JudgeApprovedOrderAdditionalDocumentsCollection {
hamzahtahirhmcts marked this conversation as resolved.
Show resolved Hide resolved
private CaseDocument value;
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,11 @@ private void categoriseOrders(List<DraftDirectionOrderCollection> orderCollectio
private void setCategoryIfAbsent(DraftDirectionOrder order, DocumentCategory category) {
if (order != null && order.getUploadDraftDocument() != null && order.getUploadDraftDocument().getCategoryId() == null) {
order.getUploadDraftDocument().setCategoryId(category.getDocumentCategoryId());

Optional.ofNullable(order.getJudgeApprovedOrderAdditionalDocumentsCollection())
.ifPresent(additionalDocuments -> additionalDocuments.forEach(document ->
document.getValue().setCategoryId(category.getDocumentCategoryId())
));
hamzahtahirhmcts marked this conversation as resolved.
Show resolved Hide resolved
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
package uk.gov.hmcts.reform.finrem.caseorchestration.handler;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import uk.gov.hmcts.reform.ccd.client.model.CaseDetails;
import uk.gov.hmcts.reform.finrem.caseorchestration.ccd.callback.CallbackType;
import uk.gov.hmcts.reform.finrem.caseorchestration.controllers.GenericAboutToStartOrSubmitCallbackResponse;
import uk.gov.hmcts.reform.finrem.caseorchestration.mapper.FinremCaseDetailsMapper;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.EventType;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.CaseDocument;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.CaseType;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.DraftDirectionOrder;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.DraftDirectionOrderCollection;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.FinremCaseData;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.FinremCaseDetails;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.JudgeApprovedOrderAdditionalDocumentsCollection;
import uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.wrapper.DraftDirectionWrapper;
import uk.gov.hmcts.reform.finrem.caseorchestration.service.CaseDataService;
import uk.gov.hmcts.reform.finrem.caseorchestration.service.ContestedOrderApprovedLetterService;
import uk.gov.hmcts.reform.finrem.caseorchestration.service.GenericDocumentService;
import uk.gov.hmcts.reform.finrem.caseorchestration.service.HearingOrderService;
import uk.gov.hmcts.reform.finrem.caseorchestration.service.documentcatergory.UploadedDraftOrderCategoriser;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
import static uk.gov.hmcts.reform.finrem.caseorchestration.TestConstants.AUTH_TOKEN;
import static uk.gov.hmcts.reform.finrem.caseorchestration.TestSetUpUtils.caseDocument;
import static uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.CCDConfigConstant.DRAFT_DIRECTION_DETAILS_COLLECTION;
import static uk.gov.hmcts.reform.finrem.caseorchestration.model.ccd.CCDConfigConstant.DRAFT_DIRECTION_DETAILS_COLLECTION_RO;
import static uk.gov.hmcts.reform.finrem.caseorchestration.test.Assertions.assertCanHandle;

@ExtendWith(MockitoExtension.class)
class JudgeDraftOrderAboutToSubmitHandlerTest extends BaseHandlerTestSetup {
hamzahtahirhmcts marked this conversation as resolved.
Show resolved Hide resolved

private static final String FILE_URL = "http://dm:80/documents/kbjh87y8y9JHVKKKJVJ";
private static final String FILE_BINARY_URL = "http://dm:80/documents/kbjh87y8y9JHVKKKJVJ/binary";
private static final String FILE_NAME = "abc.pdf";

@Mock
private JudgeDraftOrderAboutToSubmitHandler handler;
hamzahtahirhmcts marked this conversation as resolved.
Show resolved Hide resolved
@Mock
private HearingOrderService hearingOrderService;
@Mock
private GenericDocumentService genericDocumentService;
@Mock
private ContestedOrderApprovedLetterService contestedOrderApprovedLetterService;
@Mock
private CaseDataService caseDataService;
@Mock
private UploadedDraftOrderCategoriser uploadedDraftOrderCategoriser;
@Mock
private FinremCaseDetailsMapper finremCaseDetailsMapper;
hamzahtahirhmcts marked this conversation as resolved.
Show resolved Hide resolved

@BeforeEach
void setUp() {
handler = new JudgeDraftOrderAboutToSubmitHandler(
jthmcts marked this conversation as resolved.
Show resolved Hide resolved
jthmcts marked this conversation as resolved.
Show resolved Hide resolved
finremCaseDetailsMapper,
hearingOrderService,
genericDocumentService,
contestedOrderApprovedLetterService,
caseDataService,
uploadedDraftOrderCategoriser
);
}

@Test
void canHandle() {
assertCanHandle(handler, CallbackType.ABOUT_TO_SUBMIT, CaseType.CONTESTED, EventType.JUDGE_DRAFT_ORDER);
}

@Test
void givenNoAdditionalDocuments_whenHandle_thenAllInvocationsAreExecuted() {
CaseDetails caseDetails = CaseDetails.builder().build();
//No additional Documents
FinremCallbackRequest callbackRequest = setupTestData(Collections.emptyList());
jthmcts marked this conversation as resolved.
Show resolved Hide resolved
jthmcts marked this conversation as resolved.
Show resolved Hide resolved

when(finremCaseDetailsMapper.mapToCaseDetails(any())).thenReturn(caseDetails);

handler.handle(callbackRequest, AUTH_TOKEN);

verify(hearingOrderService).convertToPdfAndStampAndStoreLatestDraftHearingOrder(caseDetails, AUTH_TOKEN);
verify(caseDataService).moveCollection(caseDetails.getData(), DRAFT_DIRECTION_DETAILS_COLLECTION, DRAFT_DIRECTION_DETAILS_COLLECTION_RO);
verify(uploadedDraftOrderCategoriser).categorise(callbackRequest.getCaseDetails().getData());
verify(contestedOrderApprovedLetterService).generateAndStoreContestedOrderApprovedLetter(caseDetails, AUTH_TOKEN);
verifyNoInteractions(genericDocumentService); // Ensure no unnecessary document conversions
}

@Test
void givenMultipleAdditionalDocuments_whenHandle_thenAllAdditionalDocumentsAreConvertedToPdf() {
CaseDetails caseDetails = CaseDetails.builder().build();
CaseDocument document1 = CaseDocument.builder().documentFilename("additional doc 1.docx").build();
CaseDocument document2 = CaseDocument.builder().documentFilename("additional doc 2.docx").build();
CaseDocument pdfConverted1 = caseDocument(FILE_URL, "additional doc 1.pdf", FILE_BINARY_URL);
CaseDocument pdfConverted2 = caseDocument(FILE_URL, "additional doc 2.pdf", FILE_BINARY_URL);

when(genericDocumentService.convertDocumentIfNotPdfAlready(eq(document1), eq(AUTH_TOKEN), any(String.class))).thenReturn(pdfConverted1);
when(genericDocumentService.convertDocumentIfNotPdfAlready(eq(document2), eq(AUTH_TOKEN), any(String.class))).thenReturn(pdfConverted2);
hamzahtahirhmcts marked this conversation as resolved.
Show resolved Hide resolved
when(finremCaseDetailsMapper.mapToCaseDetails(any())).thenReturn(caseDetails);

JudgeApprovedOrderAdditionalDocumentsCollection additionalDocument1 = JudgeApprovedOrderAdditionalDocumentsCollection.builder()
.value(document1)
.build();
JudgeApprovedOrderAdditionalDocumentsCollection additionalDocument2 = JudgeApprovedOrderAdditionalDocumentsCollection.builder()
.value(document2)
.build();

FinremCallbackRequest callbackRequest = setupTestData(List.of(additionalDocument1, additionalDocument2));

GenericAboutToStartOrSubmitCallbackResponse<FinremCaseData> response = handler.handle(callbackRequest, AUTH_TOKEN);

DraftDirectionOrder draftOrderResult = response.getData().getDraftDirectionWrapper().getDraftDirectionOrderCollection().get(0).getValue();
assertThat(draftOrderResult.getJudgeApprovedOrderAdditionalDocumentsCollection())
.extracting(JudgeApprovedOrderAdditionalDocumentsCollection::getValue)
.containsExactlyInAnyOrder(pdfConverted1, pdfConverted2)
.hasSize(2);
hamzahtahirhmcts marked this conversation as resolved.
Show resolved Hide resolved

verify(genericDocumentService, times(2)).convertDocumentIfNotPdfAlready(any(CaseDocument.class),
any(String.class), any(String.class));
verify(hearingOrderService).convertToPdfAndStampAndStoreLatestDraftHearingOrder(caseDetails, AUTH_TOKEN);
verify(caseDataService).moveCollection(caseDetails.getData(), DRAFT_DIRECTION_DETAILS_COLLECTION, DRAFT_DIRECTION_DETAILS_COLLECTION_RO);
verify(uploadedDraftOrderCategoriser).categorise(callbackRequest.getCaseDetails().getData());
verify(contestedOrderApprovedLetterService).generateAndStoreContestedOrderApprovedLetter(caseDetails, AUTH_TOKEN);
}

private FinremCallbackRequest setupTestData(List<JudgeApprovedOrderAdditionalDocumentsCollection> additionalDocuments) {
CaseDocument caseDocument = caseDocument(FILE_URL, FILE_NAME, FILE_BINARY_URL);

//Create direction order with additional documents (if any)
DraftDirectionOrder directionOrder =
DraftDirectionOrder.builder()
.purposeOfDocument("test")
.uploadDraftDocument(caseDocument)
.judgeApprovedOrderAdditionalDocumentsCollection(additionalDocuments)
.build();

DraftDirectionOrderCollection directionOrderCollection = DraftDirectionOrderCollection.builder().value(directionOrder).build();

//Set up draft direction order collection list
List<DraftDirectionOrderCollection> draftDirectionOrderCollection = new ArrayList<>();
draftDirectionOrderCollection.add(directionOrderCollection);

FinremCaseData caseData = FinremCaseData.builder().build();
DraftDirectionWrapper draftDirectionWrapper = caseData.getDraftDirectionWrapper();
draftDirectionWrapper.setDraftDirectionOrderCollection(draftDirectionOrderCollection);

FinremCaseDetails finremCaseDetails = FinremCaseDetails.builder().id(123L).data(caseData).build();

return FinremCallbackRequest.builder()
.eventType(EventType.JUDGE_DRAFT_ORDER)
.caseDetails(finremCaseDetails)
.build();
}
}