diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/PostNoticeOfDiscontinuanceLetterLiPDefendant1Handler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/PostNoticeOfDiscontinuanceLetterLiPDefendant1Handler.java new file mode 100644 index 00000000000..7986062f9a5 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/PostNoticeOfDiscontinuanceLetterLiPDefendant1Handler.java @@ -0,0 +1,61 @@ +package uk.gov.hmcts.reform.civil.handler.callback.camunda.docmosis; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; +import uk.gov.hmcts.reform.ccd.client.model.CallbackResponse; +import uk.gov.hmcts.reform.civil.callback.Callback; +import uk.gov.hmcts.reform.civil.callback.CallbackHandler; +import uk.gov.hmcts.reform.civil.callback.CallbackParams; +import uk.gov.hmcts.reform.civil.callback.CaseEvent; +import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.service.docmosis.settlediscontinue.NoticeOfDiscontinuanceLiPLetterGenerator; + +import java.util.List; +import java.util.Map; + +import static uk.gov.hmcts.reform.civil.callback.CallbackParams.Params.BEARER_TOKEN; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.callback.CaseEvent.SEND_DISCONTINUANCE_LETTER_LIP_DEFENDANT1; + +@Service +@RequiredArgsConstructor +public class PostNoticeOfDiscontinuanceLetterLiPDefendant1Handler extends CallbackHandler { + + private static final List EVENTS = List.of( + SEND_DISCONTINUANCE_LETTER_LIP_DEFENDANT1); + + public static final String TASK_ID = "PostNoticeOfDiscontinuanceDefendant1LIP"; + private final NoticeOfDiscontinuanceLiPLetterGenerator lipLetterGenerator; + + @Override + protected Map callbacks() { + return Map.of( + callbackKey(ABOUT_TO_SUBMIT), + this::sendNoticeOfDiscontinuanceLetterToLiPDefendant1 + ); + } + + @Override + public String camundaActivityId(CallbackParams callbackParams) { + return TASK_ID; + } + + @Override + public List handledEvents() { + return EVENTS; + } + + private CallbackResponse sendNoticeOfDiscontinuanceLetterToLiPDefendant1(CallbackParams callbackParams) { + CaseData caseData = callbackParams.getCaseData(); + if (caseData.isRespondent1LiP()) { + generateNoticeOfDiscontinuanceLiPDefendantLetter(callbackParams); + } + return AboutToStartOrSubmitCallbackResponse.builder().build(); + } + + private void generateNoticeOfDiscontinuanceLiPDefendantLetter(CallbackParams callbackParams) { + CaseData caseData = callbackParams.getCaseData(); + lipLetterGenerator.printNoticeOfDiscontinuanceLetter(caseData, callbackParams.getParams().get(BEARER_TOKEN).toString()); + } +} diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceLiPLetterGenerator.java b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceLiPLetterGenerator.java new file mode 100644 index 00000000000..dd42ef72208 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceLiPLetterGenerator.java @@ -0,0 +1,47 @@ +package uk.gov.hmcts.reform.civil.service.docmosis.settlediscontinue; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import uk.gov.hmcts.reform.civil.documentmanagement.DocumentDownloadException; +import uk.gov.hmcts.reform.civil.documentmanagement.model.CaseDocument; +import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.service.BulkPrintService; +import uk.gov.hmcts.reform.civil.service.documentmanagement.DocumentDownloadService; + +import java.io.IOException; +import java.util.List; + +import static java.util.Objects.nonNull; + +@Slf4j +@RequiredArgsConstructor +@Service +public class NoticeOfDiscontinuanceLiPLetterGenerator { + + private final DocumentDownloadService documentDownloadService; + private final BulkPrintService bulkPrintService; + private static final String NOTICE_OF_DISCONTINUANCE_LETTER = "notice-of-discontinuance"; + + public void printNoticeOfDiscontinuanceLetter(CaseData caseData, String authorisation) { + CaseDocument discontinuanceCaseDocument = caseData.getNoticeOfDiscontinueAllParitiesDoc(); + if (nonNull(discontinuanceCaseDocument)) { + String documentUrl = discontinuanceCaseDocument.getDocumentLink().getDocumentUrl(); + String documentId = documentUrl.substring(documentUrl.lastIndexOf("/") + 1); + byte[] letterContent; + try { + letterContent = documentDownloadService.downloadDocument(authorisation, documentId).file().getInputStream().readAllBytes(); + } catch (IOException e) { + log.error("Failed getting letter content for Notice of Discontinuance LiP Letter "); + throw new DocumentDownloadException(discontinuanceCaseDocument.getDocumentLink().getDocumentFileName(), e); + } + List recipients = getRecipientsList(caseData); + bulkPrintService.printLetter(letterContent, caseData.getLegacyCaseReference(), + caseData.getLegacyCaseReference(), NOTICE_OF_DISCONTINUANCE_LETTER, recipients); + } + } + + private List getRecipientsList(CaseData caseData) { + return List.of(caseData.getRespondent1().getPartyName()); + } +} diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/PostNoticeOfDiscontinuanceLetterLiPDefendant1HandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/PostNoticeOfDiscontinuanceLetterLiPDefendant1HandlerTest.java new file mode 100644 index 00000000000..7a7dd2e4f37 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/PostNoticeOfDiscontinuanceLetterLiPDefendant1HandlerTest.java @@ -0,0 +1,70 @@ +package uk.gov.hmcts.reform.civil.handler.callback.camunda.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 uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; +import uk.gov.hmcts.reform.ccd.client.model.CallbackRequest; +import uk.gov.hmcts.reform.civil.callback.CallbackParams; +import uk.gov.hmcts.reform.civil.documentmanagement.model.CaseDocument; +import uk.gov.hmcts.reform.civil.documentmanagement.model.DocumentType; +import uk.gov.hmcts.reform.civil.enums.YesOrNo; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; +import uk.gov.hmcts.reform.civil.handler.callback.BaseCallbackHandlerTest; +import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.sampledata.CallbackParamsBuilder; +import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; +import uk.gov.hmcts.reform.civil.sampledata.CaseDocumentBuilder; +import uk.gov.hmcts.reform.civil.service.docmosis.settlediscontinue.NoticeOfDiscontinuanceLiPLetterGenerator; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static uk.gov.hmcts.reform.civil.callback.CallbackParams.Params.BEARER_TOKEN; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.callback.CaseEvent.SEND_DISCONTINUANCE_LETTER_LIP_DEFENDANT1; + +@ExtendWith(MockitoExtension.class) +public class PostNoticeOfDiscontinuanceLetterLiPDefendant1HandlerTest extends BaseCallbackHandlerTest { + + @Mock + private NoticeOfDiscontinuanceLiPLetterGenerator letterGenerator; + @InjectMocks + private PostNoticeOfDiscontinuanceLetterLiPDefendant1Handler handler; + public static final String TASK_ID_DEFENDANT = "PostNoticeOfDiscontinuanceDefendant1LIP"; + private static final CaseDocument caseDocument = CaseDocumentBuilder.builder() + .documentName("document name") + .documentType(DocumentType.NOTICE_OF_DISCONTINUANCE) + .build(); + + @Test + void handleEventsReturnsTheExpectedCallbackEvent() { + assertThat(handler.handledEvents()).contains(SEND_DISCONTINUANCE_LETTER_LIP_DEFENDANT1); + } + + @Test + void shouldReturnCorrectCamundaActivityId_whenInvoked() { + assertThat(handler.camundaActivityId(CallbackParamsBuilder.builder().request(CallbackRequest.builder().eventId( + SEND_DISCONTINUANCE_LETTER_LIP_DEFENDANT1.name()).build()) + .build())).isEqualTo(TASK_ID_DEFENDANT); + } + + @Test + void shouldDownloadDocumentAndPrintLetterSuccessfully() { + CaseData caseData = CaseDataBuilder.builder().atStateNotificationAcknowledged().build().toBuilder() + .respondent1Represented(YesOrNo.NO) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO) + .noticeOfDiscontinueAllParitiesDoc(caseDocument).build(); + + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + params.getRequest().setEventId(SEND_DISCONTINUANCE_LETTER_LIP_DEFENDANT1.name()); + + var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + assertThat(response.getErrors()).isNull(); + verify(letterGenerator).printNoticeOfDiscontinuanceLetter( + caseData, + params.getParams().get(BEARER_TOKEN).toString()); + } +} diff --git a/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceLiPLetterGeneratorTest.java b/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceLiPLetterGeneratorTest.java new file mode 100644 index 00000000000..5527a2eba50 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceLiPLetterGeneratorTest.java @@ -0,0 +1,93 @@ +package uk.gov.hmcts.reform.civil.service.docmosis.settlediscontinue; + +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.core.io.ByteArrayResource; +import uk.gov.hmcts.reform.civil.documentmanagement.model.CaseDocument; +import uk.gov.hmcts.reform.civil.documentmanagement.model.DocumentType; +import uk.gov.hmcts.reform.civil.documentmanagement.model.DownloadedDocumentResponse; +import uk.gov.hmcts.reform.civil.enums.YesOrNo; +import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.model.Party; +import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; +import uk.gov.hmcts.reform.civil.sampledata.CaseDocumentBuilder; +import uk.gov.hmcts.reform.civil.sampledata.PartyBuilder; +import uk.gov.hmcts.reform.civil.service.BulkPrintService; +import uk.gov.hmcts.reform.civil.service.documentmanagement.DocumentDownloadService; + +import java.util.List; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.never; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; + +@ExtendWith(MockitoExtension.class) +class NoticeOfDiscontinuanceLiPLetterGeneratorTest { + + @Mock + private BulkPrintService bulkPrintService; + @Mock + private DocumentDownloadService documentDownloadService; + @InjectMocks + private NoticeOfDiscontinuanceLiPLetterGenerator liPLetterGenerator; + private static final String NOTICE_OF_DISCONTINUANCE_LETTER = "notice-of-discontinuance"; + private static final String BEARER_TOKEN = "Bearer Token"; + + static final byte[] LETTER_CONTENT = new byte[]{37, 80, 68, 70, 45, 49, 46, 53, 10, 37, -61, -92}; + + private static final CaseDocument caseDocument = CaseDocumentBuilder.builder() + .documentName("document name") + .documentType(DocumentType.NOTICE_OF_DISCONTINUANCE) + .build(); + + @Test + void shouldDownloadDocumentAndPrintLetterSuccessfully() { + Party applicant = PartyBuilder.builder().soleTrader().build(); + Party defendant = PartyBuilder.builder().soleTrader().build(); + CaseData caseData = CaseDataBuilder.builder().build().toBuilder() + .respondent1Represented(YesOrNo.NO) + .applicant1(applicant) + .respondent1(defendant) + .noticeOfDiscontinueAllParitiesDoc(caseDocument).build(); + + given(documentDownloadService.downloadDocument( + any(), + any() + )).willReturn(new DownloadedDocumentResponse(new ByteArrayResource(LETTER_CONTENT), "test", "test")); + + liPLetterGenerator.printNoticeOfDiscontinuanceLetter(caseData, BEARER_TOKEN); + + verify(bulkPrintService) + .printLetter( + LETTER_CONTENT, + caseData.getLegacyCaseReference(), + caseData.getLegacyCaseReference(), + NOTICE_OF_DISCONTINUANCE_LETTER, + List.of(caseData.getRespondent1().getPartyName())); + } + + @Test + void shouldNotDownloadDocumentAndPrintLetterSuccessfully() { + Party applicant = PartyBuilder.builder().soleTrader().build(); + Party defendant = PartyBuilder.builder().soleTrader().build(); + CaseData caseData = CaseDataBuilder.builder().build().toBuilder() + .respondent1Represented(YesOrNo.NO) + .applicant1(applicant) + .respondent1(defendant) + .noticeOfDiscontinueAllParitiesDoc(null).build(); + + liPLetterGenerator.printNoticeOfDiscontinuanceLetter(caseData, BEARER_TOKEN); + + verify(bulkPrintService, never()) + .printLetter( + LETTER_CONTENT, + caseData.getLegacyCaseReference(), + caseData.getLegacyCaseReference(), + NOTICE_OF_DISCONTINUANCE_LETTER, + List.of(caseData.getRespondent1().getPartyName())); + } +}