From 30446bc816e557088eded8e845e203d2bcca4cba Mon Sep 17 00:00:00 2001 From: JamiS Date: Mon, 1 Jul 2024 02:21:45 +0100 Subject: [PATCH 01/59] CIV-14146: Added midEvent and validations --- ...scontinueClaimClaimantCallbackHandler.java | 32 ++++++++++++++++++- .../hmcts/reform/civil/model/CaseData.java | 2 ++ .../reform/civil/model/PermissionGranted.java | 17 ++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/model/PermissionGranted.java diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java index 986943c7fc0..3e098bee0c2 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java @@ -10,9 +10,11 @@ import uk.gov.hmcts.reform.civil.callback.CallbackParams; import uk.gov.hmcts.reform.civil.callback.CaseEvent; import uk.gov.hmcts.reform.civil.enums.MultiPartyScenario; +import uk.gov.hmcts.reform.civil.enums.YesOrNo; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.common.DynamicList; +import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -27,6 +29,8 @@ public class DiscontinueClaimClaimantCallbackHandler extends CallbackHandler { private static final List EVENTS = List.of(DISCONTINUE_CLAIM_CLAIMANT); private static final String BOTH = "Both"; + private static final String ERROR_MESSAGE_DATE_ORDER_MUST_BE_IN_PAST = "Date must be in the past"; + private static final String ERROR_MESSAGE_UNABLE_TO_DISCONTINUE = "Unable to discontinue this claim"; private final ObjectMapper objectMapper; @@ -34,10 +38,31 @@ public class DiscontinueClaimClaimantCallbackHandler extends CallbackHandler { protected Map callbacks() { return Map.of( callbackKey(ABOUT_TO_START), this::populateData, - callbackKey(MID, "showClaimantConsent"), this::updateSelectedClaimant + callbackKey(MID, "showClaimantConsent"), this::updateSelectedClaimant, + callbackKey(MID, "checkPermissionGranted"), this::checkPermissionGrantedFields ); } + private CallbackResponse checkPermissionGrantedFields(CallbackParams callbackParams) { + var caseData = callbackParams.getCaseData(); + CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); + List errors = new ArrayList<>(); + + if (null != caseData.getPermissionGrantedComplex() + && validateIfFutureDate(caseData.getPermissionGrantedComplex().getPermissionGrantedDate())) { + errors.add(ERROR_MESSAGE_DATE_ORDER_MUST_BE_IN_PAST); + } + + if(caseData.getIsPermissionGranted().equals(YesOrNo.NO)) { + errors.add(ERROR_MESSAGE_UNABLE_TO_DISCONTINUE); + } + + return AboutToStartOrSubmitCallbackResponse.builder() + .data(caseDataBuilder.build().toMap(objectMapper)) + .errors(errors) + .build(); + } + private CallbackResponse updateSelectedClaimant(CallbackParams callbackParams) { var caseData = callbackParams.getCaseData(); CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); @@ -70,6 +95,11 @@ private CallbackResponse populateData(CallbackParams callbackParams) { .build(); } + public static boolean validateIfFutureDate(LocalDate date) { + LocalDate today = LocalDate.now(); + return date.isAfter(today); + } + @Override public List handledEvents() { return EVENTS; diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java index 2bfba0fa45b..812f7848376 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java @@ -673,6 +673,8 @@ public boolean hasNoOngoingBusinessProcess() { private String selectedClaimantForDiscontinuance; private YesOrNo courtPermissionNeeded; private YesOrNo courtPermissionNeededChecked; + private YesOrNo isPermissionGranted; + private PermissionGranted permissionGrantedComplex; @JsonUnwrapped private FeePaymentOutcomeDetails feePaymentOutcomeDetails; diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/PermissionGranted.java b/src/main/java/uk/gov/hmcts/reform/civil/model/PermissionGranted.java new file mode 100644 index 00000000000..deef3038675 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/PermissionGranted.java @@ -0,0 +1,17 @@ +package uk.gov.hmcts.reform.civil.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Data +@Builder(toBuilder = true) +@NoArgsConstructor +@AllArgsConstructor +public class PermissionGranted { + private String permissionGrantedJudge; + private LocalDate permissionGrantedDate; +} From 70922fea5cec8eae910edce3a3425b192d650d2d Mon Sep 17 00:00:00 2001 From: JamiS Date: Mon, 1 Jul 2024 17:24:27 +0100 Subject: [PATCH 02/59] CIV-14128:Updated midEvent and caseData fields --- .../SettleDiscontinueYesOrNoList.java | 13 +++++++++++++ ...iscontinueClaimClaimantCallbackHandler.java | 18 ++++++++++++------ .../gov/hmcts/reform/civil/model/CaseData.java | 7 ++++--- 3 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/SettleDiscontinueYesOrNoList.java diff --git a/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/SettleDiscontinueYesOrNoList.java b/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/SettleDiscontinueYesOrNoList.java new file mode 100644 index 00000000000..34efed68c2d --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/SettleDiscontinueYesOrNoList.java @@ -0,0 +1,13 @@ +package uk.gov.hmcts.reform.civil.enums.settlediscontinue; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum SettleDiscontinueYesOrNoList { + YES("Yes"), + NO("No"); + + private final String displayedValue; +} diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java index 3e098bee0c2..65384136732 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java @@ -1,6 +1,7 @@ package uk.gov.hmcts.reform.civil.handler.callback.user; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.ImmutableMap; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; @@ -11,6 +12,7 @@ import uk.gov.hmcts.reform.civil.callback.CaseEvent; import uk.gov.hmcts.reform.civil.enums.MultiPartyScenario; import uk.gov.hmcts.reform.civil.enums.YesOrNo; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.common.DynamicList; @@ -20,7 +22,9 @@ import java.util.Map; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_START; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; import static uk.gov.hmcts.reform.civil.callback.CallbackType.MID; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.SUBMITTED; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.DISCONTINUE_CLAIM_CLAIMANT; @Service @@ -36,11 +40,13 @@ public class DiscontinueClaimClaimantCallbackHandler extends CallbackHandler { @Override protected Map callbacks() { - return Map.of( - callbackKey(ABOUT_TO_START), this::populateData, - callbackKey(MID, "showClaimantConsent"), this::updateSelectedClaimant, - callbackKey(MID, "checkPermissionGranted"), this::checkPermissionGrantedFields - ); + return new ImmutableMap.Builder() + .put(callbackKey(ABOUT_TO_START), this::populateData) + .put(callbackKey(MID, "showClaimantConsent"), this::updateSelectedClaimant) + .put(callbackKey(MID, "checkPermissionGranted"), this::checkPermissionGrantedFields) + .put(callbackKey(ABOUT_TO_SUBMIT), this::emptyCallbackResponse) + .put(callbackKey(SUBMITTED), this::emptySubmittedCallbackResponse) + .build(); } private CallbackResponse checkPermissionGrantedFields(CallbackParams callbackParams) { @@ -53,7 +59,7 @@ && validateIfFutureDate(caseData.getPermissionGrantedComplex().getPermissionGran errors.add(ERROR_MESSAGE_DATE_ORDER_MUST_BE_IN_PAST); } - if(caseData.getIsPermissionGranted().equals(YesOrNo.NO)) { + if(SettleDiscontinueYesOrNoList.NO.equals(caseData.getIsPermissionGranted())) { errors.add(ERROR_MESSAGE_UNABLE_TO_DISCONTINUE); } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java index 812f7848376..e6364d593e7 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java @@ -37,6 +37,7 @@ import uk.gov.hmcts.reform.civil.enums.SuperClaimType; import uk.gov.hmcts.reform.civil.enums.TimelineUploadTypeSpec; 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.user.spec.show.ResponseOneVOneShowTag; import uk.gov.hmcts.reform.civil.model.breathing.BreathingSpaceInfo; import uk.gov.hmcts.reform.civil.model.citizenui.CaseDataLiP; @@ -671,9 +672,9 @@ public boolean hasNoOngoingBusinessProcess() { private DynamicList claimantWhoIsSettling; private DynamicList claimantWhoIsDiscontinuing; private String selectedClaimantForDiscontinuance; - private YesOrNo courtPermissionNeeded; - private YesOrNo courtPermissionNeededChecked; - private YesOrNo isPermissionGranted; + private SettleDiscontinueYesOrNoList courtPermissionNeeded; + //private YesOrNo courtPermissionNeededChecked; + private SettleDiscontinueYesOrNoList isPermissionGranted; private PermissionGranted permissionGrantedComplex; @JsonUnwrapped From c78c588f4f11c8e47eca6de7a72a80c6616a95a9 Mon Sep 17 00:00:00 2001 From: JamiS Date: Tue, 2 Jul 2024 08:01:56 +0100 Subject: [PATCH 03/59] CIV-14128: Added more unit tests --- ...tinueClaimClaimantCallbackHandlerTest.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java index 23c11658291..87b3594e962 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java @@ -8,13 +8,17 @@ import org.springframework.boot.test.context.SpringBootTest; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; import uk.gov.hmcts.reform.civil.callback.CallbackParams; +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.model.PermissionGranted; import uk.gov.hmcts.reform.civil.model.common.DynamicList; import uk.gov.hmcts.reform.civil.model.common.DynamicListElement; import uk.gov.hmcts.reform.civil.sampledata.CallbackParamsBuilder; import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; +import java.time.LocalDate; + import static org.assertj.core.api.Assertions.assertThat; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_START; import static uk.gov.hmcts.reform.civil.callback.CallbackType.MID; @@ -89,4 +93,67 @@ void shouldNotPopulateSelectedClaimant_whenClaimNot2v1() { assertThat(response.getData().get("selectedClaimantForDiscontinuance")).isNull(); } } + + @Nested + class MidEventCheckPermissionGrantedCallback { + + private static final String PAGE_ID = "checkPermissionGranted"; + + @Test + void shouldHaveNoErrors_when2v1AndPermissionGrantedDataValid() { + DynamicList claimantWhoIsDiscontinuingList = DynamicList.builder() + .value(DynamicListElement.builder() + .label("Both") + .build()) + .build(); + + CaseData caseData = CaseDataBuilder.builder().atStateClaimSubmitted2v1RespondentRegistered().build(); + caseData.setClaimantWhoIsDiscontinuing(claimantWhoIsDiscontinuingList); + + CallbackParams params = callbackParamsOf(caseData, MID, PAGE_ID); + var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + assertThat(response.getErrors()).isEmpty(); + } + + @Test + void shouldHaveNoErrors_when2v1AndPermissionDateInFuture() { + DynamicList claimantWhoIsDiscontinuingList = DynamicList.builder() + .value(DynamicListElement.builder() + .label("Both") + .build()) + .build(); + + CaseData caseData = CaseDataBuilder.builder().atStateClaimSubmitted2v1RespondentRegistered().build(); + caseData.setClaimantWhoIsDiscontinuing(claimantWhoIsDiscontinuingList); + caseData.setIsPermissionGranted(SettleDiscontinueYesOrNoList.YES); + caseData.setPermissionGrantedComplex(PermissionGranted.builder() + .permissionGrantedJudge("Test") + .permissionGrantedDate(LocalDate.of(2070, 12,12)) + .build()); + + CallbackParams params = callbackParamsOf(caseData, MID, PAGE_ID); + var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + assertThat(response.getErrors().size()).isEqualTo(1); + } + + @Test + void shouldHaveNoErrors_when2v1AndPermissionNotGranted() { + DynamicList claimantWhoIsDiscontinuingList = DynamicList.builder() + .value(DynamicListElement.builder() + .label("Both") + .build()) + .build(); + + CaseData caseData = CaseDataBuilder.builder().atStateClaimSubmitted2v1RespondentRegistered().build(); + caseData.setClaimantWhoIsDiscontinuing(claimantWhoIsDiscontinuingList); + caseData.setIsPermissionGranted(SettleDiscontinueYesOrNoList.NO); + + CallbackParams params = callbackParamsOf(caseData, MID, PAGE_ID); + var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + assertThat(response.getErrors().size()).isEqualTo(1); + } + } } From a1bda003e312b647a42d6de6aeac7b30470799ff Mon Sep 17 00:00:00 2001 From: JamiS Date: Tue, 2 Jul 2024 08:21:37 +0100 Subject: [PATCH 04/59] CIV-14128: Fix checkstyle errors --- .../callback/user/DiscontinueClaimClaimantCallbackHandler.java | 3 +-- .../uk/gov/hmcts/reform/civil/model/PermissionGranted.java | 2 ++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java index be24c499636..7416ecb55d3 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java @@ -11,7 +11,6 @@ import uk.gov.hmcts.reform.civil.callback.CallbackParams; import uk.gov.hmcts.reform.civil.callback.CaseEvent; import uk.gov.hmcts.reform.civil.enums.MultiPartyScenario; -import uk.gov.hmcts.reform.civil.enums.YesOrNo; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.common.DynamicList; @@ -60,7 +59,7 @@ && validateIfFutureDate(caseData.getPermissionGrantedComplex().getPermissionGran errors.add(ERROR_MESSAGE_DATE_ORDER_MUST_BE_IN_PAST); } - if(SettleDiscontinueYesOrNoList.NO.equals(caseData.getIsPermissionGranted())) { + if (SettleDiscontinueYesOrNoList.NO.equals(caseData.getIsPermissionGranted())) { errors.add(ERROR_MESSAGE_UNABLE_TO_DISCONTINUE); } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/PermissionGranted.java b/src/main/java/uk/gov/hmcts/reform/civil/model/PermissionGranted.java index deef3038675..5b42c23d8bb 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/PermissionGranted.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/PermissionGranted.java @@ -12,6 +12,8 @@ @NoArgsConstructor @AllArgsConstructor public class PermissionGranted { + private String permissionGrantedJudge; private LocalDate permissionGrantedDate; + } From cad29fa6b373133ef68deed21493ef0c1a508141 Mon Sep 17 00:00:00 2001 From: JamiS Date: Tue, 2 Jul 2024 08:31:36 +0100 Subject: [PATCH 05/59] CIV-14146: Fix checkstyle errors --- .../user/DiscontinueClaimClaimantCallbackHandlerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java index 65fc2495198..9e7d027f17c 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java @@ -155,7 +155,7 @@ void shouldHaveNoErrors_when2v1AndPermissionDateInFuture() { caseData.setIsPermissionGranted(SettleDiscontinueYesOrNoList.YES); caseData.setPermissionGrantedComplex(PermissionGranted.builder() .permissionGrantedJudge("Test") - .permissionGrantedDate(LocalDate.of(2070, 12,12)) + .permissionGrantedDate(LocalDate.of(2070, 12, 12)) .build()); CallbackParams params = callbackParamsOf(caseData, MID, PAGE_ID); From 3b28b377f6cb9df0d7a1acb984c63cff9c7f3500 Mon Sep 17 00:00:00 2001 From: JamiS Date: Tue, 2 Jul 2024 09:54:39 +0100 Subject: [PATCH 06/59] CIV-14146: Remove this field as this is not needed for now --- src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java index 39ff90f5ead..54b71f680b4 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java @@ -674,7 +674,6 @@ public boolean hasNoOngoingBusinessProcess() { private DynamicList discontinuingAgainstOneDefendant; private String selectedClaimantForDiscontinuance; private SettleDiscontinueYesOrNoList courtPermissionNeeded; - //private YesOrNo courtPermissionNeededChecked; private SettleDiscontinueYesOrNoList isPermissionGranted; private PermissionGranted permissionGrantedComplex; From 6a78d3a051f8860f7fdc9656f6ffddf55414e17c Mon Sep 17 00:00:00 2001 From: JamiS Date: Tue, 2 Jul 2024 09:56:34 +0100 Subject: [PATCH 07/59] CIV-14146: Organized imports --- .../user/DiscontinueClaimClaimantCallbackHandlerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java index 9e7d027f17c..604ce45b1ec 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java @@ -11,10 +11,10 @@ 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.model.Party; import uk.gov.hmcts.reform.civil.model.PermissionGranted; import uk.gov.hmcts.reform.civil.model.common.DynamicList; import uk.gov.hmcts.reform.civil.model.common.DynamicListElement; -import uk.gov.hmcts.reform.civil.model.Party; import uk.gov.hmcts.reform.civil.sampledata.CallbackParamsBuilder; import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; From ec45a4e22a0c612de6e754959b8a11b99c10d390 Mon Sep 17 00:00:00 2001 From: JamiS Date: Tue, 2 Jul 2024 11:03:06 +0100 Subject: [PATCH 08/59] CIV-14146: Updated tests --- .../user/DiscontinueClaimClaimantCallbackHandlerTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java index 604ce45b1ec..557fe8b1979 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java @@ -143,7 +143,7 @@ void shouldHaveNoErrors_when2v1AndPermissionGrantedDataValid() { } @Test - void shouldHaveNoErrors_when2v1AndPermissionDateInFuture() { + void shouldHaveErrors_when2v1AndPermissionDateInFuture() { DynamicList claimantWhoIsDiscontinuingList = DynamicList.builder() .value(DynamicListElement.builder() .label("Both") @@ -155,17 +155,18 @@ void shouldHaveNoErrors_when2v1AndPermissionDateInFuture() { caseData.setIsPermissionGranted(SettleDiscontinueYesOrNoList.YES); caseData.setPermissionGrantedComplex(PermissionGranted.builder() .permissionGrantedJudge("Test") - .permissionGrantedDate(LocalDate.of(2070, 12, 12)) + .permissionGrantedDate(LocalDate.now().plusDays(1)) .build()); CallbackParams params = callbackParamsOf(caseData, MID, PAGE_ID); var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); assertThat(response.getErrors().size()).isEqualTo(1); + assertThat(response.getErrors()).containsOnly("Date must be in the past"); } @Test - void shouldHaveNoErrors_when2v1AndPermissionNotGranted() { + void shouldHaveErrors_when2v1AndPermissionNotGranted() { DynamicList claimantWhoIsDiscontinuingList = DynamicList.builder() .value(DynamicListElement.builder() .label("Both") @@ -180,6 +181,7 @@ void shouldHaveNoErrors_when2v1AndPermissionNotGranted() { var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); assertThat(response.getErrors().size()).isEqualTo(1); + assertThat(response.getErrors()).containsOnly("Unable to discontinue this claim"); } } } From f4ae47d6d5285259b46de54d20ce699c7f3ab06c Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Thu, 4 Jul 2024 18:19:18 +0100 Subject: [PATCH 09/59] CIV-14194 initial commit --- .../hmcts/reform/civil/enums/CaseState.java | 1 + .../DiscontinuanceTypeList.java | 13 +++ ...scontinueClaimClaimantCallbackHandler.java | 104 +++++++++++++++++- .../hmcts/reform/civil/model/CaseData.java | 3 + 4 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/DiscontinuanceTypeList.java diff --git a/src/main/java/uk/gov/hmcts/reform/civil/enums/CaseState.java b/src/main/java/uk/gov/hmcts/reform/civil/enums/CaseState.java index f5655b94b38..067fd4378dc 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/enums/CaseState.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/enums/CaseState.java @@ -5,6 +5,7 @@ public enum CaseState { CASE_ISSUED, AWAITING_CASE_DETAILS_NOTIFICATION, AWAITING_RESPONDENT_ACKNOWLEDGEMENT, + CASE_DISCONTINUED, CASE_DISMISSED, AWAITING_APPLICANT_INTENTION, PROCEEDS_IN_HERITAGE_SYSTEM, diff --git a/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/DiscontinuanceTypeList.java b/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/DiscontinuanceTypeList.java new file mode 100644 index 00000000000..e3472a08cfb --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/DiscontinuanceTypeList.java @@ -0,0 +1,13 @@ +package uk.gov.hmcts.reform.civil.enums.settlediscontinue; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum DiscontinuanceTypeList { + FULL_DISCONTINUANCE("Full discontinuance"), + PART_DISCONTINUANCE("Part discontinuance"); + + private final String type; +} diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java index 7416ecb55d3..009d6a2e8fe 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java @@ -6,25 +6,30 @@ 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.ccd.client.model.SubmittedCallbackResponse; 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.enums.MultiPartyScenario; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.common.DynamicList; import java.time.LocalDate; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; +import static java.lang.String.format; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_START; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; import static uk.gov.hmcts.reform.civil.callback.CallbackType.MID; import static uk.gov.hmcts.reform.civil.callback.CallbackType.SUBMITTED; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.DISCONTINUE_CLAIM_CLAIMANT; +import static uk.gov.hmcts.reform.civil.enums.CaseState.CASE_DISCONTINUED; import static uk.gov.hmcts.reform.civil.helpers.DiscontinueClaimHelper.is1v2LrVLrCase; @Service @@ -35,6 +40,21 @@ public class DiscontinueClaimClaimantCallbackHandler extends CallbackHandler { private static final String BOTH = "Both"; private static final String ERROR_MESSAGE_DATE_ORDER_MUST_BE_IN_PAST = "Date must be in the past"; private static final String ERROR_MESSAGE_UNABLE_TO_DISCONTINUE = "Unable to discontinue this claim"; + public static final String PERMISSION_GRANTED_BY_COURT = "# Your request is being reviewed"; + public static final String CASE_DISCONTINUED_FULL_DISCONTINUE = "# Your claim has been discontinued"; + public static final String NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE = "# Your claim will be fully discontinued against the specified defendants"; + public static final String NO_COURT_PERMISSION_PART_DISCONTINUE = "# We have noted your claim has been partly discontinued and your claim has been updated"; + public static final String PERMISSION_GRANTED_BY_COURT_BODY = "### Next steps \n " + + "You will be notified of the outcome.\n\n" + + "You may be contacted by the court to provide more information if necessary."; + public static final String CASE_DISCONTINUED_FULL_DISCONTINUE_BODY = "### Next step \n " + + "Any hearing listed will be vacated and all other parties will be notified."; + public static final String NO_COURT_PERMISSION_PART_DISCONTINUE_BODY = "### Next step \n " + + "Any listed hearings will still proceed as normal.\n\n" + + "All other parties will be notified.\n"; + public static final String NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE_BODY = "### Next step \n " + + "This will now be reviewed and the claim will proceed offline and your online account will not " + + "be updated for this claim.Any updates will be sent by post."; private final ObjectMapper objectMapper; @@ -44,8 +64,8 @@ protected Map callbacks() { .put(callbackKey(ABOUT_TO_START), this::populateData) .put(callbackKey(MID, "showClaimantConsent"), this::updateSelectedClaimant) .put(callbackKey(MID, "checkPermissionGranted"), this::checkPermissionGrantedFields) - .put(callbackKey(ABOUT_TO_SUBMIT), this::emptyCallbackResponse) - .put(callbackKey(SUBMITTED), this::emptySubmittedCallbackResponse) + .put(callbackKey(ABOUT_TO_SUBMIT), this::aboutToSubmit) + .put(callbackKey(SUBMITTED), this::buildConfirmation) .build(); } @@ -109,6 +129,86 @@ private CallbackResponse populateData(CallbackParams callbackParams) { .build(); } + private SubmittedCallbackResponse buildConfirmation(CallbackParams callbackParams) { + var caseData = callbackParams.getCaseData(); + Map confirmationContent = getConfirmationContent(caseData); + if(!confirmationContent.isEmpty()) + { + return SubmittedCallbackResponse.builder() + .confirmationHeader(confirmationContent.get("header")) + .confirmationBody(confirmationContent.get("body")) + .build(); + } + return SubmittedCallbackResponse.builder().build(); + } + + private Map getConfirmationContent(CaseData caseData) { + boolean isNoCourtPermission = SettleDiscontinueYesOrNoList.NO.equals(caseData.getCourtPermissionNeeded()); + + if (!isNoCourtPermission && SettleDiscontinueYesOrNoList.YES.equals(caseData.getIsPermissionGranted())) { + return addConfirmationContent(format(PERMISSION_GRANTED_BY_COURT), + format(PERMISSION_GRANTED_BY_COURT_BODY)); + } + + if (DiscontinuanceTypeList.FULL_DISCONTINUANCE.equals(caseData.getTypeOfDiscontinuance())) { + if (isNoCourtPermission && isCaseDiscontinued(caseData)) { + return addConfirmationContent(format(CASE_DISCONTINUED_FULL_DISCONTINUE), + format(CASE_DISCONTINUED_FULL_DISCONTINUE_BODY)); + } + if (isNoCourtPermission && isFullyDiscontinuedAgainst(caseData)) { + return addConfirmationContent(format(NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE), + format(NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE_BODY)); + } + } else { + if (isNoCourtPermission) { + return addConfirmationContent(format(NO_COURT_PERMISSION_PART_DISCONTINUE), + format(NO_COURT_PERMISSION_PART_DISCONTINUE_BODY)); + } + } + return new HashMap<>(); + } + + private Map addConfirmationContent(String headerContent, String bodyContent) { + Map confirmationContent = new HashMap<>(); + confirmationContent.put("header",headerContent); + confirmationContent.put("body", bodyContent); + return confirmationContent; + } + + private boolean isCaseDiscontinued(CaseData caseData) { + boolean isBothClaimantsSelected = caseData.getClaimantWhoIsDiscontinuing() != null + && caseData.getClaimantWhoIsDiscontinuing().getValue().getLabel().equals(BOTH); + boolean isAgainstBothDefendants = SettleDiscontinueYesOrNoList.YES.equals(caseData.getIsDiscontinuingAgainstBothDefendants()); + + return (isBothClaimantsSelected || isAgainstBothDefendants || MultiPartyScenario.isOneVOne(caseData)); + } + + private boolean isFullyDiscontinuedAgainst(CaseData caseData) { + boolean isNotAgainstBothDefendants = SettleDiscontinueYesOrNoList.NO.equals(caseData.getIsDiscontinuingAgainstBothDefendants()); + boolean isNotBothClaimantsSelected = caseData.getClaimantWhoIsDiscontinuing() != null + && !caseData.getClaimantWhoIsDiscontinuing().getValue().getLabel().equals(BOTH); + + return (isNotBothClaimantsSelected || isNotAgainstBothDefendants); + } + + private CallbackResponse aboutToSubmit(CallbackParams callbackParams) { + CaseData caseData = callbackParams.getCaseData(); + return AboutToStartOrSubmitCallbackResponse.builder() + .state(updateCaseState(caseData)) + .build(); + } + + private String updateCaseState(CaseData caseData) { + if(DiscontinuanceTypeList.FULL_DISCONTINUANCE.equals(caseData.getTypeOfDiscontinuance())) + { + boolean isNoCourtPermission = SettleDiscontinueYesOrNoList.NO.equals(caseData.getCourtPermissionNeeded()); + if(isNoCourtPermission && isCaseDiscontinued(caseData)) { + return CASE_DISCONTINUED.name(); + } + } + return caseData.getCcdState().name(); + } + public static boolean validateIfFutureDate(LocalDate date) { LocalDate today = LocalDate.now(); return date.isAfter(today); diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java index 54b71f680b4..e2c885a3fc8 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java @@ -37,6 +37,7 @@ import uk.gov.hmcts.reform.civil.enums.SuperClaimType; import uk.gov.hmcts.reform.civil.enums.TimelineUploadTypeSpec; import uk.gov.hmcts.reform.civil.enums.YesOrNo; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.handler.callback.user.spec.show.ResponseOneVOneShowTag; import uk.gov.hmcts.reform.civil.model.breathing.BreathingSpaceInfo; @@ -676,6 +677,8 @@ public boolean hasNoOngoingBusinessProcess() { private SettleDiscontinueYesOrNoList courtPermissionNeeded; private SettleDiscontinueYesOrNoList isPermissionGranted; private PermissionGranted permissionGrantedComplex; + private SettleDiscontinueYesOrNoList isDiscontinuingAgainstBothDefendants; + private DiscontinuanceTypeList typeOfDiscontinuance; @JsonUnwrapped private FeePaymentOutcomeDetails feePaymentOutcomeDetails; From 728d4c7b10e8cb89b3fbadcbd1a6ad65401bfc34 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Fri, 5 Jul 2024 09:23:40 +0100 Subject: [PATCH 10/59] CIV-14244 Discontinue Claim notification --- ...nerateDiscontinueClaimCallbackHandler.java | 42 +++++++ ...tClaimDiscontinuedNotificationHandler.java | 86 ++++++++++++++ ...tClaimDiscontinuedNotificationHandler.java | 107 ++++++++++++++++++ .../civil/notify/NotificationsProperties.java | 3 + .../civil/service/flowstate/FlowFlag.java | 3 +- .../civil/service/flowstate/FlowState.java | 3 +- .../civil/utils/SettleDiscontinueUtil.java | 10 ++ 7 files changed, 252 insertions(+), 2 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandler.java create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java new file mode 100644 index 00000000000..13e6aa24299 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -0,0 +1,42 @@ +package uk.gov.hmcts.reform.civil.handler.callback.camunda.docmosis; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +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 java.util.List; +import java.util.Map; + +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.callback.CaseEvent.GEN_NOTICE_OF_DISCONTINUANCE; + +@Service +@RequiredArgsConstructor +@SuppressWarnings("unchecked") +public class GenerateDiscontinueClaimCallbackHandler extends CallbackHandler { + + private static final List EVENTS = List.of( + GEN_NOTICE_OF_DISCONTINUANCE + ); + private static final String TASK_ID = "GenerateNoticeOfDiscontinueClaim"; + + @Override + protected Map callbacks() { + return Map.of(callbackKey(ABOUT_TO_SUBMIT), this::emptySubmittedCallbackResponse); + } + + @Override + public List handledEvents() { + return EVENTS; + } + + @Override + public String camundaActivityId(CallbackParams callbackParams) { + + return TASK_ID; + } + +} diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandler.java new file mode 100644 index 00000000000..194e6d06b57 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandler.java @@ -0,0 +1,86 @@ +package uk.gov.hmcts.reform.civil.handler.callback.camunda.notification; + +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.notify.NotificationService; +import uk.gov.hmcts.reform.civil.notify.NotificationsProperties; +import uk.gov.hmcts.reform.civil.service.OrganisationService; + +import java.util.List; +import java.util.Map; + +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.callback.CaseEvent.NOTIFY_DISCONTINUANCE_CLAIMANT1; +import static uk.gov.hmcts.reform.civil.utils.NotificationUtils.getApplicantLegalOrganizationName; + +@Service +@RequiredArgsConstructor +public class NotifyClaimantClaimDiscontinuedNotificationHandler extends CallbackHandler + implements NotificationData { + + private static final List EVENTS = List.of(NOTIFY_DISCONTINUANCE_CLAIMANT1); + public static final String TASK_ID = "NotifyClaimantClaimDiscontinued"; + private static final String REFERENCE_TEMPLATE = + "claimant-claim-discontinued-%s"; + + private final NotificationService notificationService; + private final NotificationsProperties notificationsProperties; + private final OrganisationService organisationService; + + @Override + protected Map callbacks() { + return Map.of( + callbackKey(ABOUT_TO_SUBMIT), + this::notifyClaimantClaimDiscontinued + ); + } + + @Override + public String camundaActivityId(CallbackParams callbackParams) { + return TASK_ID; + } + + @Override + public List handledEvents() { + return EVENTS; + } + + private CallbackResponse notifyClaimantClaimDiscontinued(CallbackParams callbackParams) { + CaseData caseData = callbackParams.getCaseData(); + + if (!caseData.isApplicantLiP()) { + notificationService.sendMail( + caseData.getApplicantSolicitor1UserDetails().getEmail(), + getTemplate(), + addProperties(caseData), + getReferenceTemplate(caseData) + ); + } + + return AboutToStartOrSubmitCallbackResponse.builder().build(); + } + + @Override + public Map addProperties(CaseData caseData) { + return Map.of( + CLAIM_REFERENCE_NUMBER, caseData.getLegacyCaseReference(), + LEGAL_ORG_NAME, getApplicantLegalOrganizationName(caseData, organisationService) + ); + } + + private String getTemplate() { + return notificationsProperties.getNotifyClaimDiscontinuedLRTemplate(); + } + + private String getReferenceTemplate(CaseData caseData) { + return String.format(REFERENCE_TEMPLATE, caseData.getLegacyCaseReference()); + } + +} diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java new file mode 100644 index 00000000000..b59b481d2c9 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java @@ -0,0 +1,107 @@ +package uk.gov.hmcts.reform.civil.handler.callback.camunda.notification; + +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.notify.NotificationService; +import uk.gov.hmcts.reform.civil.notify.NotificationsProperties; +import uk.gov.hmcts.reform.civil.service.OrganisationService; + +import java.util.List; +import java.util.Map; + +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.callback.CaseEvent.NOTIFY_DEFENDANT_JUDGMENT_BY_ADMISSION; +import static uk.gov.hmcts.reform.civil.callback.CaseEvent.NOTIFY_DISCONTINUANCE_DEFENDANT1; +import static uk.gov.hmcts.reform.civil.utils.NotificationUtils.getApplicantLegalOrganizationName; +import static uk.gov.hmcts.reform.civil.utils.NotificationUtils.getRespondentLegalOrganizationName; +import static uk.gov.hmcts.reform.civil.utils.PartyUtils.getAllPartyNames; + +@Service +@RequiredArgsConstructor +public class NotifyDefendantClaimDiscontinuedNotificationHandler extends CallbackHandler + implements NotificationData { + + private static final List EVENTS = List.of(NOTIFY_DISCONTINUANCE_DEFENDANT1); + public static final String TASK_ID = "NotifyDefendantClaimDiscontinued"; + private static final String REFERENCE_TEMPLATE = + "defendant-claim-discontinued-%s"; + + private final NotificationService notificationService; + private final NotificationsProperties notificationsProperties; + private final OrganisationService organisationService; + + @Override + protected Map callbacks() { + return Map.of( + callbackKey(ABOUT_TO_SUBMIT), + this::notifyDefendantJudgmentByAdmission + ); + } + + @Override + public String camundaActivityId(CallbackParams callbackParams) { + return TASK_ID; + } + + @Override + public List handledEvents() { + return EVENTS; + } + + private CallbackResponse notifyDefendantJudgmentByAdmission(CallbackParams callbackParams) { + CaseData caseData = callbackParams.getCaseData(); + + if (!caseData.isRespondent1LiP()) { + notificationService.sendMail( + caseData.getRespondentSolicitor1EmailAddress(), + getLRTemplate(), + addPropertiesLR(caseData), + getReferenceTemplate(caseData) + ); + }else{ + notificationService.sendMail( + caseData.getRespondent1().getPartyEmail(), + getLIPTemplate(), + addProperties(caseData), + getReferenceTemplate(caseData) + ); + } + + return AboutToStartOrSubmitCallbackResponse.builder().build(); + } + + private String getLRTemplate() { + return notificationsProperties.getNotifyClaimDiscontinuedLRTemplate(); + } + + private String getLIPTemplate() { + return notificationsProperties.getNotifyClaimDiscontinuedLRTemplate(); + } + + private String getReferenceTemplate(CaseData caseData) { + return String.format(REFERENCE_TEMPLATE, caseData.getLegacyCaseReference()); + } + + + public Map addPropertiesLR(CaseData caseData) { + return Map.of( + CLAIM_REFERENCE_NUMBER, caseData.getLegacyCaseReference(), + LEGAL_ORG_NAME, getRespondentLegalOrganizationName(caseData.getRespondent1OrganisationPolicy(), organisationService) + ); + } + @Override + public Map addProperties(CaseData caseData) { + return Map.of( + CLAIMANT_V_DEFENDANT, getAllPartyNames(caseData), + CLAIM_REFERENCE_NUMBER, caseData.getLegacyCaseReference(), + PARTY_NAME, caseData.getRespondent1().getPartyName() + ); + } +} diff --git a/src/main/java/uk/gov/hmcts/reform/civil/notify/NotificationsProperties.java b/src/main/java/uk/gov/hmcts/reform/civil/notify/NotificationsProperties.java index 989c550b6f0..ae285d882e2 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/notify/NotificationsProperties.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/notify/NotificationsProperties.java @@ -613,4 +613,7 @@ public class NotificationsProperties { @NotEmpty private String orderBeingTranslatedTemplateWelsh; + @NotEmpty + private String notifyClaimDiscontinuedLRTemplate; + } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java index 23ab93e9f18..afcf1a23027 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java @@ -21,5 +21,6 @@ public enum FlowFlag { CLAIM_ISSUE_HWF, LIP_JUDGMENT_ADMISSION, SETTLE_THE_CLAIM, - MINTI_ENABLED; + MINTI_ENABLED, + DISCONTINUE_PERMISSION_GRANTED; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java index 183c6768ddb..ca717951119 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java @@ -87,7 +87,8 @@ enum Main implements FlowState { All_FINAL_ORDERS_ISSUED, PREPARE_FOR_HEARING_CONDUCT_HEARING, SIGN_SETTLEMENT_AGREEMENT, - TAKEN_OFFLINE_SPEC_DEFENDANT_NOC; + TAKEN_OFFLINE_SPEC_DEFENDANT_NOC, + CASE_DISCONTINUED; public static final String FLOW_NAME = "MAIN"; diff --git a/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java b/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java new file mode 100644 index 00000000000..60c4a8c1656 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java @@ -0,0 +1,10 @@ +package uk.gov.hmcts.reform.civil.utils; + +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; +import uk.gov.hmcts.reform.civil.model.CaseData; + +public class SettleDiscontinueUtil { + private static boolean hasCourtPermissionGranted(CaseData caseData) { + return caseData.getIsPermissionGranted().equals(SettleDiscontinueYesOrNoList.YES); + } +} From 9914458cd4124e63408dd01c224bf15a1d665163 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Fri, 5 Jul 2024 09:24:21 +0100 Subject: [PATCH 11/59] CIV-14244 Discontinue Claim notification --- .../gov/hmcts/reform/civil/callback/CaseEvent.java | 7 ++++++- .../DiscontinueClaimClaimantCallbackHandler.java | 14 +++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/callback/CaseEvent.java b/src/main/java/uk/gov/hmcts/reform/civil/callback/CaseEvent.java index 52671331307..6798c39fd32 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/callback/CaseEvent.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/callback/CaseEvent.java @@ -472,7 +472,12 @@ public enum CaseEvent { NOTIFY_DEFENDANT_JUDGMENT_BY_ADMISSION(CAMUNDA), NOTIFY_CLAIMANT_JUDGMENT_BY_ADMISSION(CAMUNDA), CREATE_DASHBOARD_NOTIFICATION_DECISION_RECONSIDERATION_CLAIMANT1(CAMUNDA), - CREATE_DASHBOARD_NOTIFICATION_DECISION_RECONSIDERATION_DEFENDANT1(CAMUNDA); + CREATE_DASHBOARD_NOTIFICATION_DECISION_RECONSIDERATION_DEFENDANT1(CAMUNDA), + GEN_NOTICE_OF_DISCONTINUANCE(CAMUNDA), + NOTIFY_DISCONTINUANCE_DEFENDANT1(CAMUNDA), + NOTIFY_DISCONTINUANCE_CLAIMANT1(CAMUNDA), + SEND_DISCONTINUANCE_LETTER_LIP_DEFENDANT1(CAMUNDA), + NOTIFY_DISCONTINUANCE_DEFENDANT2(CAMUNDA); private final UserType userType; diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java index 7416ecb55d3..2da7345ab13 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java @@ -12,6 +12,7 @@ import uk.gov.hmcts.reform.civil.callback.CaseEvent; import uk.gov.hmcts.reform.civil.enums.MultiPartyScenario; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; +import uk.gov.hmcts.reform.civil.model.BusinessProcess; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.common.DynamicList; @@ -24,6 +25,7 @@ import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; import static uk.gov.hmcts.reform.civil.callback.CallbackType.MID; import static uk.gov.hmcts.reform.civil.callback.CallbackType.SUBMITTED; +import static uk.gov.hmcts.reform.civil.callback.CaseEvent.DEFENDANT_SIGN_SETTLEMENT_AGREEMENT; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.DISCONTINUE_CLAIM_CLAIMANT; import static uk.gov.hmcts.reform.civil.helpers.DiscontinueClaimHelper.is1v2LrVLrCase; @@ -44,7 +46,7 @@ protected Map callbacks() { .put(callbackKey(ABOUT_TO_START), this::populateData) .put(callbackKey(MID, "showClaimantConsent"), this::updateSelectedClaimant) .put(callbackKey(MID, "checkPermissionGranted"), this::checkPermissionGrantedFields) - .put(callbackKey(ABOUT_TO_SUBMIT), this::emptyCallbackResponse) + .put(callbackKey(ABOUT_TO_SUBMIT), this::aboutToSubmit) .put(callbackKey(SUBMITTED), this::emptySubmittedCallbackResponse) .build(); } @@ -118,4 +120,14 @@ public static boolean validateIfFutureDate(LocalDate date) { public List handledEvents() { return EVENTS; } + + private CallbackResponse aboutToSubmit(CallbackParams callbackParams) { + CaseData caseDataUpdated = callbackParams.getCaseData().toBuilder() + .businessProcess(BusinessProcess.ready(DISCONTINUE_CLAIM_CLAIMANT)) + .build(); + + return AboutToStartOrSubmitCallbackResponse.builder() + .data(caseDataUpdated.toMap(objectMapper)) + .build(); + } } From 6d3ff3e670c95c7fd8d61b1d0de35cdada8c3c4f Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Fri, 5 Jul 2024 10:00:08 +0100 Subject: [PATCH 12/59] CIV-14194 test cases added --- ...scontinueClaimClaimantCallbackHandler.java | 12 +- ...tinueClaimClaimantCallbackHandlerTest.java | 241 +++++++++++++++++- 2 files changed, 245 insertions(+), 8 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java index c025f736007..c7d6a613312 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java @@ -131,8 +131,7 @@ private CallbackResponse populateData(CallbackParams callbackParams) { private SubmittedCallbackResponse buildConfirmation(CallbackParams callbackParams) { var caseData = callbackParams.getCaseData(); Map confirmationContent = getConfirmationContent(caseData); - if(!confirmationContent.isEmpty()) - { + if (!confirmationContent.isEmpty()) { return SubmittedCallbackResponse.builder() .confirmationHeader(confirmationContent.get("header")) .confirmationBody(confirmationContent.get("body")) @@ -167,9 +166,9 @@ private Map getConfirmationContent(CaseData caseData) { return new HashMap<>(); } - private Map addConfirmationContent(String headerContent, String bodyContent) { + private Map addConfirmationContent(String headerContent, String bodyContent) { Map confirmationContent = new HashMap<>(); - confirmationContent.put("header",headerContent); + confirmationContent.put("header", headerContent); confirmationContent.put("body", bodyContent); return confirmationContent; } @@ -198,10 +197,9 @@ private CallbackResponse aboutToSubmit(CallbackParams callbackParams) { } private String updateCaseState(CaseData caseData) { - if(DiscontinuanceTypeList.FULL_DISCONTINUANCE.equals(caseData.getTypeOfDiscontinuance())) - { + if (DiscontinuanceTypeList.FULL_DISCONTINUANCE.equals(caseData.getTypeOfDiscontinuance())) { boolean isNoCourtPermission = SettleDiscontinueYesOrNoList.NO.equals(caseData.getCourtPermissionNeeded()); - if(isNoCourtPermission && isCaseDiscontinued(caseData)) { + if (isNoCourtPermission && isCaseDiscontinued(caseData)) { return CASE_DISCONTINUED.name(); } } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java index 557fe8b1979..dbd7d2c015b 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java @@ -1,13 +1,17 @@ package uk.gov.hmcts.reform.civil.handler.callback.user; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; +import uk.gov.hmcts.reform.ccd.client.model.SubmittedCallbackResponse; import uk.gov.hmcts.reform.civil.callback.CallbackParams; +import uk.gov.hmcts.reform.civil.enums.CaseState; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; 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; @@ -23,6 +27,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_START; import static uk.gov.hmcts.reform.civil.callback.CallbackType.MID; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.SUBMITTED; @SpringBootTest(classes = { DiscontinueClaimClaimantCallbackHandler.class, @@ -32,9 +38,23 @@ class DiscontinueClaimClaimantCallbackHandlerTest extends BaseCallbackHandlerTes @Autowired private DiscontinueClaimClaimantCallbackHandler handler; - @Autowired private ObjectMapper objectMapper; + public static final String PERMISSION_GRANTED_BY_COURT = "# Your request is being reviewed"; + public static final String CASE_DISCONTINUED_FULL_DISCONTINUE = "# Your claim has been discontinued"; + public static final String NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE = "# Your claim will be fully discontinued against the specified defendants"; + public static final String NO_COURT_PERMISSION_PART_DISCONTINUE = "# We have noted your claim has been partly discontinued and your claim has been updated"; + public static final String PERMISSION_GRANTED_BY_COURT_BODY = "### Next steps \n " + + "You will be notified of the outcome.\n\n" + + "You may be contacted by the court to provide more information if necessary."; + public static final String CASE_DISCONTINUED_FULL_DISCONTINUE_BODY = "### Next step \n " + + "Any hearing listed will be vacated and all other parties will be notified."; + public static final String NO_COURT_PERMISSION_PART_DISCONTINUE_BODY = "### Next step \n " + + "Any listed hearings will still proceed as normal.\n\n" + + "All other parties will be notified.\n"; + public static final String NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE_BODY = "### Next step \n " + + "This will now be reviewed and the claim will proceed offline and your online account will not " + + "be updated for this claim.Any updates will be sent by post."; @Nested class AboutToStartCallback { @@ -184,4 +204,223 @@ void shouldHaveErrors_when2v1AndPermissionNotGranted() { assertThat(response.getErrors()).containsOnly("Unable to discontinue this claim"); } } + + @Nested + class AboutToSubmitCallback { + + @Test + void shouldUpdateCaseState_WhenNoCourtPermissionAndFullDiscontinue_2v1() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimSubmitted2v1RespondentUnrepresented().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) + .claimantWhoIsDiscontinuing(DynamicList.builder() + .value(DynamicListElement.builder() + .label("Both") + .build()).build()) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + assertThat(response.getState()).isEqualTo(CaseState.CASE_DISCONTINUED.name()); + } + + @Test + void shouldUpdateCaseState_WhenNoCourtPermissionAndFullDiscontinue_1v2() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimSubmitted1v2AndOnlyFirstRespondentIsRepresented().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) + .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.YES) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + assertThat(response.getState()).isEqualTo(CaseState.CASE_DISCONTINUED.name()); + } + + @Test + void shouldUpdateCaseState_WhenNoCourtPermissionAndFullDiscontinue_1v1() { + CaseData caseData = CaseDataBuilder.builder().atStateClaimIssued().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) + .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.YES) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + assertThat(response.getState()).isEqualTo(CaseState.CASE_DISCONTINUED.name()); + } + + @Test + void shouldNotUpdateCaseState_WhenNotFullDiscontinue() { + CaseData caseData = CaseDataBuilder.builder().atStateClaimIssued().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + assertThat(response.getState()).isEqualTo(caseData.getCcdState().name()); + } + } + + @Nested + class SubmittedCallback { + @Test + void shouldShowPermissionGrantedByCourtHeader_WhenCourtPermissionGranted() { + CaseData caseData = CaseDataBuilder.builder().atStateClaimIssued().build().toBuilder() + .isPermissionGranted(SettleDiscontinueYesOrNoList.YES) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.YES).build(); + CallbackParams params = callbackParamsOf(caseData, SUBMITTED); + + SubmittedCallbackResponse response = + (SubmittedCallbackResponse) handler.handle(params); + + Assertions.assertTrue(response.getConfirmationHeader().contains(PERMISSION_GRANTED_BY_COURT)); + Assertions.assertTrue(response.getConfirmationBody().contains(PERMISSION_GRANTED_BY_COURT_BODY)); + } + + @Test + void shouldShowCaseDiscontinuedFDHeader_WhenNoCourtPermissionAndClaimantsBothSelected2v1() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimSubmitted2v1RespondentUnrepresented().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) + .claimantWhoIsDiscontinuing(DynamicList.builder() + .value(DynamicListElement.builder() + .label("Both") + .build()).build()) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + + CallbackParams params = callbackParamsOf(caseData, SUBMITTED); + + SubmittedCallbackResponse response = + (SubmittedCallbackResponse) handler.handle(params); + + Assertions.assertTrue(response.getConfirmationHeader().contains(CASE_DISCONTINUED_FULL_DISCONTINUE)); + Assertions.assertTrue(response.getConfirmationBody().contains(CASE_DISCONTINUED_FULL_DISCONTINUE_BODY)); + } + + @Test + void shouldShowCaseDiscontinuedFDHeader_WhenNoCourtPermissionAndAgainstBothDefendants1v2() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimSubmitted1v2AndOnlyFirstRespondentIsRepresented().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) + .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.YES) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + + CallbackParams params = callbackParamsOf(caseData, SUBMITTED); + + SubmittedCallbackResponse response = + (SubmittedCallbackResponse) handler.handle(params); + + Assertions.assertTrue(response.getConfirmationHeader().contains(CASE_DISCONTINUED_FULL_DISCONTINUE)); + Assertions.assertTrue(response.getConfirmationBody().contains(CASE_DISCONTINUED_FULL_DISCONTINUE_BODY)); + } + + @Test + void shouldShowCaseDiscontinuedFDHeader_WhenNoCourtPermission1v1() { + CaseData caseData = CaseDataBuilder.builder().atStateClaimIssued().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) + .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.YES) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + + CallbackParams params = callbackParamsOf(caseData, SUBMITTED); + + SubmittedCallbackResponse response = + (SubmittedCallbackResponse) handler.handle(params); + + Assertions.assertTrue(response.getConfirmationHeader().contains(CASE_DISCONTINUED_FULL_DISCONTINUE)); + Assertions.assertTrue(response.getConfirmationBody().contains(CASE_DISCONTINUED_FULL_DISCONTINUE_BODY)); + } + + @Test + void shouldShowNoCourtPermissionFDAnyoneHeader_WhenNoCourtPermissionAndNotAgainstBothDefendants1v2() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimSubmitted1v2AndOnlyFirstRespondentIsRepresented().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) + .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.NO) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + + CallbackParams params = callbackParamsOf(caseData, SUBMITTED); + + SubmittedCallbackResponse response = + (SubmittedCallbackResponse) handler.handle(params); + + Assertions.assertTrue(response.getConfirmationHeader().contains(NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE)); + Assertions.assertTrue(response.getConfirmationBody().contains(NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE_BODY)); + } + + @Test + void shouldShowNoCourtPermissionFDAnyoneHeader_WhenNoCourtPermissionAndNotBothClaimantsSelected2v1() { + CaseData caseData = CaseDataBuilder.builder().atStateClaimSubmitted2v1RespondentUnrepresented().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) + .claimantWhoIsDiscontinuing(DynamicList.builder() + .value(DynamicListElement.builder() + .label("claimant 1") + .build()).build()) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + + CallbackParams params = callbackParamsOf(caseData, SUBMITTED); + + SubmittedCallbackResponse response = + (SubmittedCallbackResponse) handler.handle(params); + + Assertions.assertTrue(response.getConfirmationHeader().contains(NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE)); + Assertions.assertTrue(response.getConfirmationBody().contains(NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE_BODY)); + } + + @Test + void shouldShowNoCourtPermissionPDHeader_WhenNoCourtPermissionAndPartDiscountinue2v1() { + CaseData caseData = CaseDataBuilder.builder().atStateClaimSubmitted2v1RespondentUnrepresented().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) + .claimantWhoIsDiscontinuing(DynamicList.builder() + .value(DynamicListElement.builder() + .label("claimant 1") + .build()).build()) + .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.NO) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + + CallbackParams params = callbackParamsOf(caseData, SUBMITTED); + + SubmittedCallbackResponse response = + (SubmittedCallbackResponse) handler.handle(params); + + Assertions.assertTrue(response.getConfirmationHeader().contains(NO_COURT_PERMISSION_PART_DISCONTINUE)); + Assertions.assertTrue(response.getConfirmationBody().contains(NO_COURT_PERMISSION_PART_DISCONTINUE_BODY)); + } + + @Test + void shouldShowNoCourtPermissionPDHeader_When1v2NoCourtPermissionAndPartDiscountinue() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimSubmitted1v2AndOnlyFirstRespondentIsRepresented().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) + .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.YES) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + + CallbackParams params = callbackParamsOf(caseData, SUBMITTED); + + SubmittedCallbackResponse response = + (SubmittedCallbackResponse) handler.handle(params); + + Assertions.assertTrue(response.getConfirmationHeader().contains(NO_COURT_PERMISSION_PART_DISCONTINUE)); + Assertions.assertTrue(response.getConfirmationBody().contains(NO_COURT_PERMISSION_PART_DISCONTINUE_BODY)); + } + + @Test + void shouldShowNoCourtPermissionPDHeader_WhenNoCourtPermissionAnd1v1PartDiscountinue() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimIssued().build().toBuilder() + .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + + CallbackParams params = callbackParamsOf(caseData, SUBMITTED); + + SubmittedCallbackResponse response = + (SubmittedCallbackResponse) handler.handle(params); + + Assertions.assertTrue(response.getConfirmationHeader().contains(NO_COURT_PERMISSION_PART_DISCONTINUE)); + Assertions.assertTrue(response.getConfirmationBody().contains(NO_COURT_PERMISSION_PART_DISCONTINUE_BODY)); + } + } } From 851320f4991883557c04ad2d05d5784902b293c3 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Mon, 8 Jul 2024 09:43:02 +0100 Subject: [PATCH 13/59] CIV-14194 removed extra space --- .../callback/user/DiscontinueClaimClaimantCallbackHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java index c7d6a613312..004d505f0c1 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java @@ -51,7 +51,7 @@ public class DiscontinueClaimClaimantCallbackHandler extends CallbackHandler { + "Any hearing listed will be vacated and all other parties will be notified."; public static final String NO_COURT_PERMISSION_PART_DISCONTINUE_BODY = "### Next step \n " + "Any listed hearings will still proceed as normal.\n\n" - + "All other parties will be notified.\n"; + + "All other parties will be notified."; public static final String NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE_BODY = "### Next step \n " + "This will now be reviewed and the claim will proceed offline and your online account will not " + "be updated for this claim.Any updates will be sent by post."; From 8177964b0a7ee84d08cbbfc689aa3d3de45268cb Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Mon, 8 Jul 2024 10:00:52 +0100 Subject: [PATCH 14/59] CIV-14194 testcase updated --- .../user/DiscontinueClaimClaimantCallbackHandlerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java index dbd7d2c015b..f1c01fdcaf4 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java @@ -51,7 +51,7 @@ class DiscontinueClaimClaimantCallbackHandlerTest extends BaseCallbackHandlerTes + "Any hearing listed will be vacated and all other parties will be notified."; public static final String NO_COURT_PERMISSION_PART_DISCONTINUE_BODY = "### Next step \n " + "Any listed hearings will still proceed as normal.\n\n" - + "All other parties will be notified.\n"; + + "All other parties will be notified."; public static final String NO_COURT_PERMISSION_FULL_DISCONTINUE_ANYONE_BODY = "### Next step \n " + "This will now be reviewed and the claim will proceed offline and your online account will not " + "be updated for this claim.Any updates will be sent by post."; From 4c0fa382a24a87b87c498ac5c24fb9773097b78a Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Mon, 8 Jul 2024 11:55:03 +0100 Subject: [PATCH 15/59] CIV-14244 Discontinue Claim notification --- ...imDiscontinuedNotificationHandlerTest.java | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java new file mode 100644 index 00000000000..c2a6a1a5d2a --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java @@ -0,0 +1,99 @@ +package uk.gov.hmcts.reform.civil.handler.callback.camunda.notification; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import uk.gov.hmcts.reform.ccd.client.model.CallbackRequest; +import uk.gov.hmcts.reform.civil.callback.CallbackParams; +import uk.gov.hmcts.reform.civil.callback.CaseEvent; +import uk.gov.hmcts.reform.civil.handler.callback.BaseCallbackHandlerTest; +import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.notify.NotificationService; +import uk.gov.hmcts.reform.civil.notify.NotificationsProperties; +import uk.gov.hmcts.reform.civil.prd.model.Organisation; +import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; +import uk.gov.hmcts.reform.civil.service.OrganisationService; + +import java.util.Map; +import java.util.Optional; + +import static org.mockito.Mockito.*; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.handler.callback.camunda.notification.NotificationData.*; + +@SpringBootTest(classes = { + NotifyClaimantClaimDiscontinuedNotificationHandler.class, + NotificationsProperties.class, + JacksonAutoConfiguration.class +}) +class NotifyClaimantClaimDiscontinuedNotificationHandlerTest extends BaseCallbackHandlerTest { + + public static final String TEMPLATE_ID = "template-id"; + + private static final String REFERENCE_NUMBER = "8372942374"; + + @MockBean + private NotificationService notificationService; + + @MockBean + private NotificationsProperties notificationsProperties; + + @MockBean + private OrganisationService organisationService; + + @Autowired + private NotifyClaimantClaimDiscontinuedNotificationHandler handler; + + @Nested + class AboutToSubmitCallback { + + @BeforeEach + void setup() { + when(notificationsProperties.getNotifyClaimDiscontinuedLRTemplate()).thenReturn( + TEMPLATE_ID); + } + + @Test + void shouldNotifyClaimantJudgmentByAdmission_whenInvoked() { + + CaseData caseData = CaseDataBuilder.builder() + .legacyCaseReference(REFERENCE_NUMBER) + .atStateClaimDraft().build(); + + CallbackParams params = CallbackParams.builder() + .caseData(caseData) + .type(ABOUT_TO_SUBMIT) + .request(CallbackRequest.builder() + .eventId(CaseEvent.NOTIFY_DISCONTINUANCE_CLAIMANT1.name()) + .build()) + .build(); + + handler.handle(params); + + verify(notificationService, times(1)).sendMail( + "applicantsolicitor@example.com", + TEMPLATE_ID, + getNotificationDataMap(caseData), + "claimant-claim-discontinued-8372942374" + ); + } + } + + public Map getNotificationDataMap(CaseData caseData) { + return Map.of( + CLAIM_REFERENCE_NUMBER, caseData.getLegacyCaseReference(), + LEGAL_ORG_NAME, getApplicantLegalOrganizationName(caseData) + ); + } + + public String getApplicantLegalOrganizationName(CaseData caseData) { + String id = caseData.getApplicant1OrganisationPolicy().getOrganisation().getOrganisationID(); + Optional organisation = organisationService.findOrganisationById(id); + return organisation.isPresent() ? organisation.get().getName() : + caseData.getApplicantSolicitor1ClaimStatementOfTruth().getName(); + } +} From 52cb287c3a379e145fc663b2db51e0b77e010c28 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Mon, 8 Jul 2024 11:58:10 +0100 Subject: [PATCH 16/59] CIV-14244 Discontinue Claim notification --- ...nerateDiscontinueClaimCallbackHandler.java | 7 +- .../service/flowstate/FlowPredicate.java | 3 + .../service/flowstate/StateFlowEngine.java | 172 ++---------------- .../civil/utils/SettleDiscontinueUtil.java | 6 +- 4 files changed, 24 insertions(+), 164 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 13e6aa24299..add1597e756 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -1,5 +1,6 @@ package uk.gov.hmcts.reform.civil.handler.callback.camunda.docmosis; +import com.google.common.collect.ImmutableMap; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import uk.gov.hmcts.reform.civil.callback.Callback; @@ -10,7 +11,7 @@ import java.util.List; import java.util.Map; -import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.*; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.GEN_NOTICE_OF_DISCONTINUANCE; @Service @@ -24,8 +25,10 @@ public class GenerateDiscontinueClaimCallbackHandler extends CallbackHandler { private static final String TASK_ID = "GenerateNoticeOfDiscontinueClaim"; @Override + + protected Map callbacks() { - return Map.of(callbackKey(ABOUT_TO_SUBMIT), this::emptySubmittedCallbackResponse); + return Map.of(callbackKey(ABOUT_TO_SUBMIT), this::emptyCallbackResponse); } @Override diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java index 290815c8f31..147fa454973 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java @@ -1043,4 +1043,7 @@ private static boolean getPredicateForMultipartyCase(CaseData caseData) { caseData.getTakenOfflineByStaffDate() != null && (Objects.isNull(caseData.getMediation().getUnsuccessfulMediationReason()) && Objects.isNull(caseData.getMediation().getMediationUnsuccessfulReasonsMultiSelect())); + + public static final Predicate hasCourtPermissionGranted = caseData -> + caseData.getIsPermissionGranted() != null; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java index 777dc3fa417..bcbe23dd7d6 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java @@ -11,6 +11,7 @@ import uk.gov.hmcts.reform.civil.stateflow.model.State; import uk.gov.hmcts.reform.civil.utils.JudgmentAdmissionUtils; import uk.gov.hmcts.reform.civil.utils.JudicialReferralUtils; +import uk.gov.hmcts.reform.civil.utils.SettleDiscontinueUtil; import java.util.Map; @@ -33,167 +34,8 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPApplicant; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPDefendant; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.partAdmitPayImmediately; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.acceptRepaymentPlan; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.agreePartAdmitSettle; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.allAgreedToLrMediationSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.allResponsesReceived; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.applicantOutOfTime; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.applicantOutOfTimeProcessedByCamunda; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesFullDefenceReceived; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesFullDefenceReceivedSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesNonFullDefenceReceived; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesNonFullDefenceReceivedSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.bothDefSameLegalRep; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterClaimAcknowledged; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterClaimAcknowledgedExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterDetailNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterDetailNotifiedExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedPastHearingFeeDue; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.casemanMarksMediationUnsuccessful; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.certificateOfServiceEnabled; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDetailsNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDismissalOutOfTime; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDismissedByCamunda; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssueBilingual; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssueHwF; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssued; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmitted1v1RespondentOneUnregistered; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedBothUnregisteredSolicitors; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedOneRespondentRepresentative; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedOneUnrepresentedDefendantOnly; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedRespondent1Unrepresented; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedRespondent2Unrepresented; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedTwoRegisteredRespondentRepresentatives; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedTwoRespondentRepresentativesOneUnregistered; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.contactDetailsChange; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaim; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaimSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.demageMultiClaim; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOffline; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOfflineSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOffline; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOfflineSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmission; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmissionSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmitPayImmediately; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefence; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceNotProceed; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceProceed; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isCarmApplicableLipCase; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isClaimantNotSettlePartAdmitClaim; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isInHearingReadiness; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isPayImmediately; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isRespondentResponseLangIsBilingual; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.lipFullDefenceProceed; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.multipartyCase; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.notificationAcknowledged; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.oneVsOneCase; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmission; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmissionSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pastClaimDetailsNotificationDeadline; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pastClaimNotificationDeadline; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.paymentFailed; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.paymentSuccessful; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pendingClaimIssued; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pinInPostEnabledAndLiP; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.reasonNotSuitableForSdo; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.rejectRepaymentPlan; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent1NotRepresented; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent1OrgNotRegistered; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent2NotRepresented; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent2OrgNotRegistered; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondentTimeExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specClaim; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specSmallClaimCarm; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterClaimDetailsNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterClaimNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterNotSuitableForSdo; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterSDO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaff; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimDetailsNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimDetailsNotifiedExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimIssue; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimantResponseBeforeSDO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterDefendantResponse; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterNotificationAcknowledged; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterNotificationAcknowledgedTimeExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterSDO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffBeforeClaimIssued; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffBeforeMediationUnsuccessful; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineBySystem; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawn; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterClaimDetailsNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterClaimDetailsNotifiedExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledged; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledgedTimeExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.ALL_RESPONSES_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED_TIME_EXTENSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_HEARING_FEE_DUE_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DISMISSED_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_NOTIFICATION_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_FAILED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_SUCCESSFUL; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_SUBMITTED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CONTACT_DETAILS_CHANGE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.COUNTER_CLAIM; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GO_OFFLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DRAFT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FLOW_NAME; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMISSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_AGREE_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_JUDGMENT_ADMISSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_NOT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PAY_IMMEDIATELY; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_REJECT_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_NOT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_HEARING_READINESS; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_MEDIATION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.MEDIATION_UNSUCCESSFUL_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED_TIME_EXTENSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMISSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_SETTLE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_SETTLED_NO_MEDIATION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PAY_IMMEDIATELY; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_REJECT_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_APPLICANT_RESPONSE_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DISMISSED_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREGISTERED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT_ONE_V_ONE_SPEC; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_UNREGISTERED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SIGN_SETTLEMENT_AGREEMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SPEC_DRAFT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_DETAILS_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_SDO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_BY_STAFF; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_PAST_APPLICANT_RESPONSE_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SDO_NOT_DRAWN; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SPEC_DEFENDANT_NOC; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREGISTERED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.*; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.*; @Component @RequiredArgsConstructor @@ -585,6 +427,10 @@ public StateFlow build(FlowState.Main initialState) { .transitionTo(TAKEN_OFFLINE_BY_STAFF).onlyIf(takenOfflineByStaff) .transitionTo(PAST_APPLICANT_RESPONSE_DEADLINE_AWAITING_CAMUNDA) .onlyIf(applicantOutOfTime) + .transitionTo(CASE_DISCONTINUED).onlyIf(hasCourtPermissionGranted) + .set((c, flags) -> + flags.put(FlowFlag.DISCONTINUE_PERMISSION_GRANTED.name(), SettleDiscontinueUtil.hasCourtPermissionGranted(c)) + ) .state(PART_ADMISSION) .transitionTo(IN_MEDIATION).onlyIf(agreedToMediation.and(not(takenOfflineByStaff))) .transitionTo(PART_ADMIT_NOT_SETTLED_NO_MEDIATION) @@ -607,6 +453,10 @@ public StateFlow build(FlowState.Main initialState) { .transitionTo(TAKEN_OFFLINE_BY_STAFF).onlyIf(takenOfflineByStaff) .transitionTo(PAST_APPLICANT_RESPONSE_DEADLINE_AWAITING_CAMUNDA) .onlyIf(applicantOutOfTime) + .transitionTo(CASE_DISCONTINUED).onlyIf(hasCourtPermissionGranted) + .set((c, flags) -> + flags.put(FlowFlag.DISCONTINUE_PERMISSION_GRANTED.name(), SettleDiscontinueUtil.hasCourtPermissionGranted(c)) + ) .state(DIVERGENT_RESPOND_GO_OFFLINE) .state(DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE) .state(ALL_RESPONSES_RECEIVED) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java b/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java index 60c4a8c1656..304b4340cd7 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java @@ -4,7 +4,11 @@ import uk.gov.hmcts.reform.civil.model.CaseData; public class SettleDiscontinueUtil { - private static boolean hasCourtPermissionGranted(CaseData caseData) { + + private SettleDiscontinueUtil() { + //NO-OP + } + public static boolean hasCourtPermissionGranted(CaseData caseData) { return caseData.getIsPermissionGranted().equals(SettleDiscontinueYesOrNoList.YES); } } From 332c318ac931c8147664ceb7875fb1101974d605 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Wed, 10 Jul 2024 07:51:58 +0100 Subject: [PATCH 17/59] CIV-14244 Discontinue Claim notification --- .../CourtPermissionNeeded.java | 13 ++ ...nerateDiscontinueClaimCallbackHandler.java | 21 +- ...tClaimDiscontinuedNotificationHandler.java | 6 +- ...scontinueClaimClaimantCallbackHandler.java | 17 +- .../hmcts/reform/civil/model/CaseData.java | 8 +- .../civil/service/flowstate/FlowFlag.java | 2 +- .../service/flowstate/FlowPredicate.java | 3 +- .../service/flowstate/StateFlowEngine.java | 191 +++++++++++++++++- .../civil/utils/SettleDiscontinueUtil.java | 5 +- ...imDiscontinuedNotificationHandlerTest.java | 7 +- ...imDiscontinuedNotificationHandlerTest.java | 99 +++++++++ ...tinueClaimClaimantCallbackHandlerTest.java | 27 +-- 12 files changed, 351 insertions(+), 48 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/CourtPermissionNeeded.java create mode 100644 src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandlerTest.java diff --git a/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/CourtPermissionNeeded.java b/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/CourtPermissionNeeded.java new file mode 100644 index 00000000000..236d2bc42a9 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/CourtPermissionNeeded.java @@ -0,0 +1,13 @@ +package uk.gov.hmcts.reform.civil.enums.settlediscontinue; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum CourtPermissionNeeded { + YES("Yes"), + NO("No"); + + private final String displayedValue; +} diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index add1597e756..1094b98e68c 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -1,17 +1,22 @@ package uk.gov.hmcts.reform.civil.handler.callback.camunda.docmosis; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableMap; 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.flowstate.IStateFlowEngine; import java.util.List; import java.util.Map; -import static uk.gov.hmcts.reform.civil.callback.CallbackType.*; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.GEN_NOTICE_OF_DISCONTINUANCE; @Service @@ -23,12 +28,12 @@ public class GenerateDiscontinueClaimCallbackHandler extends CallbackHandler { GEN_NOTICE_OF_DISCONTINUANCE ); private static final String TASK_ID = "GenerateNoticeOfDiscontinueClaim"; - + private final ObjectMapper objectMapper; + private final IStateFlowEngine stateFlowEngine; @Override - protected Map callbacks() { - return Map.of(callbackKey(ABOUT_TO_SUBMIT), this::emptyCallbackResponse); + return Map.of(callbackKey(ABOUT_TO_SUBMIT), this::aboutToSubmit); } @Override @@ -42,4 +47,12 @@ public String camundaActivityId(CallbackParams callbackParams) { return TASK_ID; } + private CallbackResponse aboutToSubmit(CallbackParams callbackParams) { + CaseData caseData = callbackParams.getCaseData(); + CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); + + return AboutToStartOrSubmitCallbackResponse.builder() + .data(caseDataBuilder.build().toMap(objectMapper)) + .build(); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java index b59b481d2c9..1a92b60e03a 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java @@ -17,9 +17,7 @@ import java.util.Map; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; -import static uk.gov.hmcts.reform.civil.callback.CaseEvent.NOTIFY_DEFENDANT_JUDGMENT_BY_ADMISSION; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.NOTIFY_DISCONTINUANCE_DEFENDANT1; -import static uk.gov.hmcts.reform.civil.utils.NotificationUtils.getApplicantLegalOrganizationName; import static uk.gov.hmcts.reform.civil.utils.NotificationUtils.getRespondentLegalOrganizationName; import static uk.gov.hmcts.reform.civil.utils.PartyUtils.getAllPartyNames; @@ -65,7 +63,7 @@ private CallbackResponse notifyDefendantJudgmentByAdmission(CallbackParams callb addPropertiesLR(caseData), getReferenceTemplate(caseData) ); - }else{ + } else { notificationService.sendMail( caseData.getRespondent1().getPartyEmail(), getLIPTemplate(), @@ -89,13 +87,13 @@ private String getReferenceTemplate(CaseData caseData) { return String.format(REFERENCE_TEMPLATE, caseData.getLegacyCaseReference()); } - public Map addPropertiesLR(CaseData caseData) { return Map.of( CLAIM_REFERENCE_NUMBER, caseData.getLegacyCaseReference(), LEGAL_ORG_NAME, getRespondentLegalOrganizationName(caseData.getRespondent1OrganisationPolicy(), organisationService) ); } + @Override public Map addProperties(CaseData caseData) { return Map.of( diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java index 03f42601b63..ab004c45eac 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java @@ -12,6 +12,7 @@ import uk.gov.hmcts.reform.civil.callback.CallbackParams; import uk.gov.hmcts.reform.civil.callback.CaseEvent; import uk.gov.hmcts.reform.civil.enums.MultiPartyScenario; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; import uk.gov.hmcts.reform.civil.helpers.DiscontinueClaimHelper; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.model.BusinessProcess; @@ -194,13 +195,6 @@ private boolean isFullyDiscontinuedAgainst(CaseData caseData) { return (isNotBothClaimantsSelected || isNotAgainstBothDefendants); } - private CallbackResponse aboutToSubmit(CallbackParams callbackParams) { - CaseData caseData = callbackParams.getCaseData(); - return AboutToStartOrSubmitCallbackResponse.builder() - .state(updateCaseState(caseData)) - .build(); - } - private String updateCaseState(CaseData caseData) { if (DiscontinuanceTypeList.FULL_DISCONTINUANCE.equals(caseData.getTypeOfDiscontinuance())) { boolean isNoCourtPermission = SettleDiscontinueYesOrNoList.NO.equals(caseData.getCourtPermissionNeeded()); @@ -222,12 +216,13 @@ public List handledEvents() { } private CallbackResponse aboutToSubmit(CallbackParams callbackParams) { - CaseData caseDataUpdated = callbackParams.getCaseData().toBuilder() - .businessProcess(BusinessProcess.ready(DISCONTINUE_CLAIM_CLAIMANT)) - .build(); + CaseData caseData = callbackParams.getCaseData(); + CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); + caseDataBuilder.businessProcess(BusinessProcess.ready(DISCONTINUE_CLAIM_CLAIMANT)); return AboutToStartOrSubmitCallbackResponse.builder() - .data(caseDataUpdated.toMap(objectMapper)) + .state(updateCaseState(caseData)) + .data(caseDataBuilder.build().toMap(objectMapper)) .build(); } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java index 301fc106355..9391d4e0bd2 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java @@ -37,6 +37,7 @@ import uk.gov.hmcts.reform.civil.enums.SuperClaimType; import uk.gov.hmcts.reform.civil.enums.TimelineUploadTypeSpec; import uk.gov.hmcts.reform.civil.enums.YesOrNo; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.CourtPermissionNeeded; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.handler.callback.user.spec.show.ResponseOneVOneShowTag; @@ -673,7 +674,7 @@ public boolean hasNoOngoingBusinessProcess() { private DynamicList claimantWhoIsDiscontinuing; private DynamicList discontinuingAgainstOneDefendant; private String selectedClaimantForDiscontinuance; - private SettleDiscontinueYesOrNoList courtPermissionNeeded; + private CourtPermissionNeeded courtPermissionNeeded; private SettleDiscontinueYesOrNoList isPermissionGranted; private PermissionGranted permissionGrantedComplex; private SettleDiscontinueYesOrNoList isDiscontinuingAgainstBothDefendants; @@ -1520,4 +1521,9 @@ public boolean isCourtDecisionInClaimantFavourImmediateRePayment() { public boolean nocApplyForLiPDefendant() { return isLipvLROneVOne() && getChangeOfRepresentation() != null && this.getCcdState() == CaseState.PROCEEDS_IN_HERITAGE_SYSTEM; } + + @JsonIgnore + public boolean isJudgeOrderVerificationRequired() { + return (this.getCourtPermissionNeeded() != null && this.getCourtPermissionNeeded().equals(SettleDiscontinueYesOrNoList.YES)); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java index afcf1a23027..06700945e63 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java @@ -22,5 +22,5 @@ public enum FlowFlag { LIP_JUDGMENT_ADMISSION, SETTLE_THE_CLAIM, MINTI_ENABLED, - DISCONTINUE_PERMISSION_GRANTED; + JUDGE_ORDER_VERIFICATION_REQUIRED; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java index 7889a75e258..cd75eb3298b 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java @@ -1065,6 +1065,5 @@ private static boolean getPredicateForMultipartyCase(CaseData caseData) { && (Objects.isNull(caseData.getMediation().getUnsuccessfulMediationReason()) && Objects.isNull(caseData.getMediation().getMediationUnsuccessfulReasonsMultiSelect())); - public static final Predicate hasCourtPermissionGranted = caseData -> - caseData.getIsPermissionGranted() != null; + public static final Predicate isCourtPermissionNeeded = CaseData::isJudgeOrderVerificationRequired; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java index 186a9ea4fae..c6ef0ff6f77 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java @@ -22,6 +22,7 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.CASE_PROGRESSION_ENABLED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.DASHBOARD_SERVICE_ENABLED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.GENERAL_APPLICATION_ENABLED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.JUDGE_ORDER_VERIFICATION_REQUIRED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.agreedToMediation; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.ccjRequestJudgmentByAdmission; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.declinedMediation; @@ -35,8 +36,169 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPApplicant; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPDefendant; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.partAdmitPayImmediately; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.*; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.*; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.acceptRepaymentPlan; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.agreePartAdmitSettle; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.allAgreedToLrMediationSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.allResponsesReceived; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.applicantOutOfTime; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.applicantOutOfTimeProcessedByCamunda; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesFullDefenceReceived; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesFullDefenceReceivedSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesNonFullDefenceReceived; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesNonFullDefenceReceivedSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.bothDefSameLegalRep; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterClaimAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterClaimAcknowledgedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterDetailNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterDetailNotifiedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedPastHearingFeeDue; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.casemanMarksMediationUnsuccessful; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.certificateOfServiceEnabled; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDismissalOutOfTime; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDismissedByCamunda; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssueBilingual; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssueHwF; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssued; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmitted1v1RespondentOneUnregistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedBothUnregisteredSolicitors; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedOneRespondentRepresentative; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedOneUnrepresentedDefendantOnly; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedRespondent1Unrepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedRespondent2Unrepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedTwoRegisteredRespondentRepresentatives; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedTwoRespondentRepresentativesOneUnregistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.contactDetailsChange; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaimSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.demageMultiClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOffline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOfflineSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOffline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOfflineSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmission; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmissionSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmitPayImmediately; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefence; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceNotProceed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceProceed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isCarmApplicableLipCase; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isClaimantNotSettlePartAdmitClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isCourtPermissionNeeded; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isInHearingReadiness; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isPayImmediately; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isRespondentResponseLangIsBilingual; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.lipFullDefenceProceed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.multipartyCase; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.notificationAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.oneVsOneCase; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmission; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmissionSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pastClaimDetailsNotificationDeadline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pastClaimNotificationDeadline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.paymentFailed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.paymentSuccessful; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pendingClaimIssued; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pinInPostEnabledAndLiP; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.reasonNotSuitableForSdo; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.rejectRepaymentPlan; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent1NotRepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent1OrgNotRegistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent2NotRepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent2OrgNotRegistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondentTimeExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specSmallClaimCarm; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterClaimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterClaimNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterNotSuitableForSdo; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterSDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaff; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimDetailsNotifiedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimIssue; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimantResponseBeforeSDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterDefendantResponse; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterNotificationAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterNotificationAcknowledgedTimeExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterSDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffBeforeClaimIssued; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffBeforeMediationUnsuccessful; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineBySystem; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawn; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterClaimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterClaimDetailsNotifiedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledgedTimeExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.ALL_RESPONSES_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CASE_DISCONTINUED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED_TIME_EXTENSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_HEARING_FEE_DUE_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DISMISSED_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_NOTIFICATION_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_FAILED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_SUCCESSFUL; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_SUBMITTED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CONTACT_DETAILS_CHANGE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.COUNTER_CLAIM; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GO_OFFLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DRAFT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FLOW_NAME; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_AGREE_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_JUDGMENT_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_NOT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PAY_IMMEDIATELY; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_REJECT_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_NOT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_HEARING_READINESS; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_MEDIATION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.MEDIATION_UNSUCCESSFUL_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED_TIME_EXTENSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_SETTLE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_SETTLED_NO_MEDIATION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PAY_IMMEDIATELY; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_REJECT_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_APPLICANT_RESPONSE_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DISMISSED_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT_ONE_V_ONE_SPEC; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SIGN_SETTLEMENT_AGREEMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SPEC_DRAFT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_DETAILS_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_SDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_BY_STAFF; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_PAST_APPLICANT_RESPONSE_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SDO_NOT_DRAWN; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SPEC_DEFENDANT_NOC; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_UNREGISTERED_DEFENDANT; @Component @RequiredArgsConstructor @@ -57,6 +219,7 @@ public StateFlow build(FlowState.Main initialState) { flags.put(DASHBOARD_SERVICE_ENABLED.name(), featureToggleService.isDashboardEnabledForCase(c)); flags.put(CASE_PROGRESSION_ENABLED.name(), featureToggleService.isCaseProgressionEnabled()); flags.put(BULK_CLAIM_ENABLED.name(), featureToggleService.isBulkClaimEnabled()); + flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)); }) .transitionTo(CLAIM_SUBMITTED) .onlyIf(claimSubmittedTwoRegisteredRespondentRepresentatives @@ -71,6 +234,7 @@ public StateFlow build(FlowState.Main initialState) { flags.put(DASHBOARD_SERVICE_ENABLED.name(), featureToggleService.isDashboardEnabledForCase(c)); flags.put(CASE_PROGRESSION_ENABLED.name(), featureToggleService.isCaseProgressionEnabled()); flags.put(BULK_CLAIM_ENABLED.name(), featureToggleService.isBulkClaimEnabled()); + }) // Only one unrepresented defendant .transitionTo(CLAIM_SUBMITTED) @@ -81,6 +245,7 @@ public StateFlow build(FlowState.Main initialState) { flags.put(DASHBOARD_SERVICE_ENABLED.name(), featureToggleService.isDashboardEnabledForCase(c)); flags.put(CASE_PROGRESSION_ENABLED.name(), featureToggleService.isCaseProgressionEnabled()); flags.put(BULK_CLAIM_ENABLED.name(), featureToggleService.isBulkClaimEnabled()); + flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)); }) // Unrepresented defendant 1 .transitionTo(CLAIM_SUBMITTED) @@ -106,6 +271,7 @@ public StateFlow build(FlowState.Main initialState) { flags.put(DASHBOARD_SERVICE_ENABLED.name(), featureToggleService.isDashboardEnabledForCase(c)); flags.put(CASE_PROGRESSION_ENABLED.name(), featureToggleService.isCaseProgressionEnabled()); flags.put(BULK_CLAIM_ENABLED.name(), featureToggleService.isBulkClaimEnabled()); + flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)); }) // Unrepresented defendants .transitionTo(CLAIM_SUBMITTED) @@ -118,7 +284,12 @@ public StateFlow build(FlowState.Main initialState) { flags.put(DASHBOARD_SERVICE_ENABLED.name(), featureToggleService.isDashboardEnabledForCase(c)); flags.put(CASE_PROGRESSION_ENABLED.name(), featureToggleService.isCaseProgressionEnabled()); flags.put(BULK_CLAIM_ENABLED.name(), featureToggleService.isBulkClaimEnabled()); + flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)); }) + // Only one unrepresented defendant + .transitionTo(CLAIM_SUBMITTED) + .onlyIf(isCourtPermissionNeeded) + .set((c, flags) -> flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true)) .state(CLAIM_SUBMITTED) .transitionTo(CLAIM_ISSUED_PAYMENT_SUCCESSFUL).onlyIf(paymentSuccessful) .transitionTo(TAKEN_OFFLINE_BY_STAFF).onlyIf(takenOfflineByStaffBeforeClaimIssued) @@ -150,6 +321,10 @@ public StateFlow build(FlowState.Main initialState) { FlowFlag.UNREPRESENTED_DEFENDANT_ONE.name(), false ))) .transitionTo(TAKEN_OFFLINE_SPEC_DEFENDANT_NOC).onlyIf(nocSubmittedForLiPDefendant) + .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) + .set((c, flags) -> + flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)) + ) .state(CLAIM_ISSUED_PAYMENT_FAILED) .transitionTo(CLAIM_ISSUED_PAYMENT_SUCCESSFUL).onlyIf(paymentSuccessful) .state(CLAIM_ISSUED_PAYMENT_SUCCESSFUL) @@ -244,6 +419,10 @@ public StateFlow build(FlowState.Main initialState) { .onlyIf(divergentRespondWithDQAndGoOfflineSpec.and(specClaim)) .transitionTo(DIVERGENT_RESPOND_GO_OFFLINE) .onlyIf(divergentRespondGoOfflineSpec.and(specClaim)) + .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) + .set((c, flags) -> + flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)) + ) .state(CONTACT_DETAILS_CHANGE) .transitionTo(FULL_DEFENCE).onlyIf(fullDefenceSpec.and(not(isRespondentResponseLangIsBilingual))) .transitionTo(PART_ADMISSION).onlyIf(partAdmissionSpec.and(not(isRespondentResponseLangIsBilingual))) @@ -429,10 +608,6 @@ public StateFlow build(FlowState.Main initialState) { .transitionTo(TAKEN_OFFLINE_BY_STAFF).onlyIf(takenOfflineByStaff) .transitionTo(PAST_APPLICANT_RESPONSE_DEADLINE_AWAITING_CAMUNDA) .onlyIf(applicantOutOfTime) - .transitionTo(CASE_DISCONTINUED).onlyIf(hasCourtPermissionGranted) - .set((c, flags) -> - flags.put(FlowFlag.DISCONTINUE_PERMISSION_GRANTED.name(), SettleDiscontinueUtil.hasCourtPermissionGranted(c)) - ) .state(PART_ADMISSION) .transitionTo(IN_MEDIATION).onlyIf(agreedToMediation.and(not(takenOfflineByStaff))) .transitionTo(PART_ADMIT_NOT_SETTLED_NO_MEDIATION) @@ -455,9 +630,9 @@ public StateFlow build(FlowState.Main initialState) { .transitionTo(TAKEN_OFFLINE_BY_STAFF).onlyIf(takenOfflineByStaff) .transitionTo(PAST_APPLICANT_RESPONSE_DEADLINE_AWAITING_CAMUNDA) .onlyIf(applicantOutOfTime) - .transitionTo(CASE_DISCONTINUED).onlyIf(hasCourtPermissionGranted) + .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) .set((c, flags) -> - flags.put(FlowFlag.DISCONTINUE_PERMISSION_GRANTED.name(), SettleDiscontinueUtil.hasCourtPermissionGranted(c)) + flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true) ) .state(DIVERGENT_RESPOND_GO_OFFLINE) .state(DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java b/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java index 304b4340cd7..be7e2462701 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java @@ -8,7 +8,8 @@ public class SettleDiscontinueUtil { private SettleDiscontinueUtil() { //NO-OP } - public static boolean hasCourtPermissionGranted(CaseData caseData) { - return caseData.getIsPermissionGranted().equals(SettleDiscontinueYesOrNoList.YES); + + public static boolean isJudgeOrderVerificationRequired(CaseData caseData) { + return (caseData.getCourtPermissionNeeded() != null && caseData.getCourtPermissionNeeded().equals(SettleDiscontinueYesOrNoList.YES)); } } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java index c2a6a1a5d2a..2b503280ec3 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java @@ -21,9 +21,12 @@ import java.util.Map; import java.util.Optional; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; -import static uk.gov.hmcts.reform.civil.handler.callback.camunda.notification.NotificationData.*; +import static uk.gov.hmcts.reform.civil.handler.callback.camunda.notification.NotificationData.CLAIM_REFERENCE_NUMBER; +import static uk.gov.hmcts.reform.civil.handler.callback.camunda.notification.NotificationData.LEGAL_ORG_NAME; @SpringBootTest(classes = { NotifyClaimantClaimDiscontinuedNotificationHandler.class, diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandlerTest.java new file mode 100644 index 00000000000..3ea1b6cf428 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandlerTest.java @@ -0,0 +1,99 @@ +package uk.gov.hmcts.reform.civil.handler.callback.camunda.notification; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import uk.gov.hmcts.reform.ccd.client.model.CallbackRequest; +import uk.gov.hmcts.reform.civil.callback.CallbackParams; +import uk.gov.hmcts.reform.civil.callback.CaseEvent; +import uk.gov.hmcts.reform.civil.handler.callback.BaseCallbackHandlerTest; +import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.notify.NotificationService; +import uk.gov.hmcts.reform.civil.notify.NotificationsProperties; +import uk.gov.hmcts.reform.civil.prd.model.Organisation; +import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; +import uk.gov.hmcts.reform.civil.service.OrganisationService; + +import java.util.Map; +import java.util.Optional; + +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.handler.callback.camunda.notification.NotificationData.CLAIM_REFERENCE_NUMBER; +import static uk.gov.hmcts.reform.civil.handler.callback.camunda.notification.NotificationData.LEGAL_ORG_NAME; + +@SpringBootTest(classes = { + NotifyDefendantClaimDiscontinuedNotificationHandler.class, + NotificationsProperties.class, + JacksonAutoConfiguration.class +}) +class NotifyDefendantClaimDiscontinuedNotificationHandlerTest extends BaseCallbackHandlerTest { + + public static final String TEMPLATE_ID = "template-id"; + + private static final String REFERENCE_NUMBER = "8372942374"; + + @MockBean + private NotificationService notificationService; + + @MockBean + private NotificationsProperties notificationsProperties; + + @MockBean + private OrganisationService organisationService; + + @Autowired + private NotifyDefendantClaimDiscontinuedNotificationHandler handler; + + @Nested + class AboutToSubmitCallback { + + @BeforeEach + void setup() { + when(notificationsProperties.getNotifyClaimDiscontinuedLRTemplate()).thenReturn( + TEMPLATE_ID); + when(organisationService.findOrganisationById(anyString())) + .thenReturn(Optional.of(Organisation.builder().name("Test Org Name").build())); + } + + @Test + void shouldNotifyDefendantJudgmentByAdmission_whenInvoked() { + + CaseData caseData = CaseDataBuilder.builder() + .legacyCaseReference(REFERENCE_NUMBER) + .atStateClaimDetailsNotified_1v2_andNotifyBothSolicitors() + .atStateClaimDraft().build(); + + CallbackParams params = CallbackParams.builder() + .caseData(caseData) + .type(ABOUT_TO_SUBMIT) + .request(CallbackRequest.builder() + .eventId(CaseEvent.NOTIFY_DISCONTINUANCE_DEFENDANT1.name()) + .build()) + .build(); + + handler.handle(params); + + verify(notificationService, times(1)).sendMail( + "respondentsolicitor@example.com", + TEMPLATE_ID, + addPropertiesLR(caseData), + "defendant-claim-discontinued-000DC001" + ); + } + } + + public Map addPropertiesLR(CaseData caseData) { + return Map.of( + CLAIM_REFERENCE_NUMBER, caseData.getLegacyCaseReference(), + LEGAL_ORG_NAME, "Test Org Name" + ); + } +} diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java index 8a2418f21f1..5f1a1074b90 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java @@ -11,6 +11,7 @@ import uk.gov.hmcts.reform.ccd.client.model.SubmittedCallbackResponse; import uk.gov.hmcts.reform.civil.callback.CallbackParams; import uk.gov.hmcts.reform.civil.enums.CaseState; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.CourtPermissionNeeded; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.handler.callback.BaseCallbackHandlerTest; @@ -236,7 +237,7 @@ void shouldUpdateCaseState_WhenNoCourtPermissionAndFullDiscontinue_2v1() { .value(DynamicListElement.builder() .label("Both") .build()).build()) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); @@ -250,7 +251,7 @@ void shouldUpdateCaseState_WhenNoCourtPermissionAndFullDiscontinue_1v2() { .atStateClaimSubmitted1v2AndOnlyFirstRespondentIsRepresented().build().toBuilder() .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.YES) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); @@ -263,7 +264,7 @@ void shouldUpdateCaseState_WhenNoCourtPermissionAndFullDiscontinue_1v1() { CaseData caseData = CaseDataBuilder.builder().atStateClaimIssued().build().toBuilder() .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.YES) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); @@ -275,7 +276,7 @@ void shouldUpdateCaseState_WhenNoCourtPermissionAndFullDiscontinue_1v1() { void shouldNotUpdateCaseState_WhenNotFullDiscontinue() { CaseData caseData = CaseDataBuilder.builder().atStateClaimIssued().build().toBuilder() .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); @@ -290,7 +291,7 @@ class SubmittedCallback { void shouldShowPermissionGrantedByCourtHeader_WhenCourtPermissionGranted() { CaseData caseData = CaseDataBuilder.builder().atStateClaimIssued().build().toBuilder() .isPermissionGranted(SettleDiscontinueYesOrNoList.YES) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.YES).build(); + .courtPermissionNeeded(CourtPermissionNeeded.YES).build(); CallbackParams params = callbackParamsOf(caseData, SUBMITTED); SubmittedCallbackResponse response = @@ -309,7 +310,7 @@ void shouldShowCaseDiscontinuedFDHeader_WhenNoCourtPermissionAndClaimantsBothSel .value(DynamicListElement.builder() .label("Both") .build()).build()) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, SUBMITTED); @@ -326,7 +327,7 @@ void shouldShowCaseDiscontinuedFDHeader_WhenNoCourtPermissionAndAgainstBothDefen .atStateClaimSubmitted1v2AndOnlyFirstRespondentIsRepresented().build().toBuilder() .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.YES) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, SUBMITTED); @@ -342,7 +343,7 @@ void shouldShowCaseDiscontinuedFDHeader_WhenNoCourtPermission1v1() { CaseData caseData = CaseDataBuilder.builder().atStateClaimIssued().build().toBuilder() .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.YES) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, SUBMITTED); @@ -359,7 +360,7 @@ void shouldShowNoCourtPermissionFDAnyoneHeader_WhenNoCourtPermissionAndNotAgains .atStateClaimSubmitted1v2AndOnlyFirstRespondentIsRepresented().build().toBuilder() .typeOfDiscontinuance(DiscontinuanceTypeList.FULL_DISCONTINUANCE) .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.NO) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, SUBMITTED); @@ -378,7 +379,7 @@ void shouldShowNoCourtPermissionFDAnyoneHeader_WhenNoCourtPermissionAndNotBothCl .value(DynamicListElement.builder() .label("claimant 1") .build()).build()) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, SUBMITTED); @@ -398,7 +399,7 @@ void shouldShowNoCourtPermissionPDHeader_WhenNoCourtPermissionAndPartDiscountinu .label("claimant 1") .build()).build()) .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.NO) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, SUBMITTED); @@ -415,7 +416,7 @@ void shouldShowNoCourtPermissionPDHeader_When1v2NoCourtPermissionAndPartDiscount .atStateClaimSubmitted1v2AndOnlyFirstRespondentIsRepresented().build().toBuilder() .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) .isDiscontinuingAgainstBothDefendants(SettleDiscontinueYesOrNoList.YES) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, SUBMITTED); @@ -431,7 +432,7 @@ void shouldShowNoCourtPermissionPDHeader_WhenNoCourtPermissionAnd1v1PartDiscount CaseData caseData = CaseDataBuilder.builder() .atStateClaimIssued().build().toBuilder() .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) - .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO).build(); + .courtPermissionNeeded(CourtPermissionNeeded.NO).build(); CallbackParams params = callbackParamsOf(caseData, SUBMITTED); From ccb300c078436214e018a2ba9a043258d9dff1eb Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Wed, 10 Jul 2024 08:33:23 +0100 Subject: [PATCH 18/59] CIV-14244 Discontinue Claim notification --- ...nerateDiscontinueClaimCallbackHandler.java | 1 - .../hmcts/reform/civil/model/CaseData.java | 28 ++++--------------- 2 files changed, 5 insertions(+), 24 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 1094b98e68c..2fd4ef55513 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -1,7 +1,6 @@ package uk.gov.hmcts.reform.civil.handler.callback.camunda.docmosis; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableMap; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java index b1e909b7674..4a394ee0ef1 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java @@ -16,28 +16,10 @@ import uk.gov.hmcts.reform.civil.documentmanagement.model.CaseDocument; import uk.gov.hmcts.reform.civil.documentmanagement.model.Document; import uk.gov.hmcts.reform.civil.documentmanagement.model.DocumentType; -import uk.gov.hmcts.reform.civil.enums.AllocatedTrack; -import uk.gov.hmcts.reform.civil.enums.CaseNoteType; -import uk.gov.hmcts.reform.civil.enums.CaseState; -import uk.gov.hmcts.reform.civil.enums.ClaimType; -import uk.gov.hmcts.reform.civil.enums.ClaimTypeUnspec; -import uk.gov.hmcts.reform.civil.enums.ConfirmationToggle; -import uk.gov.hmcts.reform.civil.enums.DecisionOnRequestReconsiderationOptions; -import uk.gov.hmcts.reform.civil.enums.EmploymentTypeCheckboxFixedListLRspec; -import uk.gov.hmcts.reform.civil.enums.FeeType; -import uk.gov.hmcts.reform.civil.enums.MultiPartyResponseTypeFlags; -import uk.gov.hmcts.reform.civil.enums.MultiPartyScenario; -import uk.gov.hmcts.reform.civil.enums.PaymentType; -import uk.gov.hmcts.reform.civil.enums.PersonalInjuryType; -import uk.gov.hmcts.reform.civil.enums.RespondentResponsePartAdmissionPaymentTimeLRspec; -import uk.gov.hmcts.reform.civil.enums.RespondentResponseType; -import uk.gov.hmcts.reform.civil.enums.RespondentResponseTypeSpec; -import uk.gov.hmcts.reform.civil.enums.RespondentResponseTypeSpecPaidStatus; -import uk.gov.hmcts.reform.civil.enums.ResponseIntention; -import uk.gov.hmcts.reform.civil.enums.SettlementReason; -import uk.gov.hmcts.reform.civil.enums.SuperClaimType; -import uk.gov.hmcts.reform.civil.enums.TimelineUploadTypeSpec; -import uk.gov.hmcts.reform.civil.enums.YesOrNo; +import uk.gov.hmcts.reform.civil.enums.*; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.CourtPermissionNeeded; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.MarkPaidConsentList; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.handler.callback.user.spec.show.ResponseOneVOneShowTag; import uk.gov.hmcts.reform.civil.model.breathing.BreathingSpaceInfo; @@ -1525,6 +1507,6 @@ public boolean nocApplyForLiPDefendant() { @JsonIgnore public boolean isJudgeOrderVerificationRequired() { - return (this.getCourtPermissionNeeded() != null && this.getCourtPermissionNeeded().equals(SettleDiscontinueYesOrNoList.YES)); + return (this.getCourtPermissionNeeded() != null && this.getCourtPermissionNeeded().equals(CourtPermissionNeeded.YES)); } } From 22c1d3754be7e5aabb723a6e4eb5dd9a63860ce4 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Wed, 10 Jul 2024 08:41:12 +0100 Subject: [PATCH 19/59] CIV-14244 Discontinue Claim notification --- .../docmosis/GenerateDiscontinueClaimCallbackHandler.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 2fd4ef55513..98876538108 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -28,9 +28,8 @@ public class GenerateDiscontinueClaimCallbackHandler extends CallbackHandler { ); private static final String TASK_ID = "GenerateNoticeOfDiscontinueClaim"; private final ObjectMapper objectMapper; - private final IStateFlowEngine stateFlowEngine; - @Override + @Override protected Map callbacks() { return Map.of(callbackKey(ABOUT_TO_SUBMIT), this::aboutToSubmit); } From e28c2b5c3a98282e4e96105e3610fc6b8966a7c5 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Wed, 10 Jul 2024 08:41:57 +0100 Subject: [PATCH 20/59] CIV-14244 Discontinue Claim notification --- .../docmosis/GenerateDiscontinueClaimCallbackHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 98876538108..79343720612 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -10,7 +10,6 @@ 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.flowstate.IStateFlowEngine; import java.util.List; import java.util.Map; From 0d92359b92cfea614d7a78dd6c6dfa4694cff4f5 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:10:01 +0100 Subject: [PATCH 21/59] CIV-14244 Discontinue Claim notification --- ...scontinueClaimClaimantCallbackHandler.java | 3 +- .../civil/service/flowstate/FlowState.java | 3 + .../service/flowstate/StateFlowEngine.java | 101 +++--------------- 3 files changed, 21 insertions(+), 86 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java index ab004c45eac..ac97774b8fc 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java @@ -12,6 +12,7 @@ import uk.gov.hmcts.reform.civil.callback.CallbackParams; import uk.gov.hmcts.reform.civil.callback.CaseEvent; import uk.gov.hmcts.reform.civil.enums.MultiPartyScenario; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.CourtPermissionNeeded; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; import uk.gov.hmcts.reform.civil.helpers.DiscontinueClaimHelper; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; @@ -197,7 +198,7 @@ private boolean isFullyDiscontinuedAgainst(CaseData caseData) { private String updateCaseState(CaseData caseData) { if (DiscontinuanceTypeList.FULL_DISCONTINUANCE.equals(caseData.getTypeOfDiscontinuance())) { - boolean isNoCourtPermission = SettleDiscontinueYesOrNoList.NO.equals(caseData.getCourtPermissionNeeded()); + boolean isNoCourtPermission = CourtPermissionNeeded.NO.equals(caseData.getCourtPermissionNeeded()); if (isNoCourtPermission && isCaseDiscontinued(caseData)) { return CASE_DISCONTINUED.name(); } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java index ca717951119..af04fd02bde 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java @@ -88,6 +88,9 @@ enum Main implements FlowState { PREPARE_FOR_HEARING_CONDUCT_HEARING, SIGN_SETTLEMENT_AGREEMENT, TAKEN_OFFLINE_SPEC_DEFENDANT_NOC, + PENDING_CASE_ISSUED, + AWAITING_RESPONDENT_ACKNOWLEDGEMENT, + AWAITING_APPLICANT_INTENTION, CASE_DISCONTINUED; public static final String FLOW_NAME = "MAIN"; diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java index c6ef0ff6f77..8ad566a93d6 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java @@ -133,72 +133,7 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterClaimDetailsNotifiedExtension; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledged; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledgedTimeExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.ALL_RESPONSES_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CASE_DISCONTINUED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED_TIME_EXTENSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_HEARING_FEE_DUE_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DISMISSED_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_NOTIFICATION_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_FAILED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_SUCCESSFUL; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_SUBMITTED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CONTACT_DETAILS_CHANGE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.COUNTER_CLAIM; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GO_OFFLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DRAFT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FLOW_NAME; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMISSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_AGREE_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_JUDGMENT_ADMISSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_NOT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PAY_IMMEDIATELY; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_REJECT_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_NOT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_HEARING_READINESS; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_MEDIATION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.MEDIATION_UNSUCCESSFUL_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED_TIME_EXTENSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMISSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_SETTLE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_SETTLED_NO_MEDIATION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PAY_IMMEDIATELY; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_REJECT_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_APPLICANT_RESPONSE_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DISMISSED_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREGISTERED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT_ONE_V_ONE_SPEC; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_UNREGISTERED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SIGN_SETTLEMENT_AGREEMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SPEC_DRAFT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_DETAILS_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_SDO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_BY_STAFF; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_PAST_APPLICANT_RESPONSE_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SDO_NOT_DRAWN; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SPEC_DEFENDANT_NOC; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREGISTERED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.*; @Component @RequiredArgsConstructor @@ -219,7 +154,6 @@ public StateFlow build(FlowState.Main initialState) { flags.put(DASHBOARD_SERVICE_ENABLED.name(), featureToggleService.isDashboardEnabledForCase(c)); flags.put(CASE_PROGRESSION_ENABLED.name(), featureToggleService.isCaseProgressionEnabled()); flags.put(BULK_CLAIM_ENABLED.name(), featureToggleService.isBulkClaimEnabled()); - flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)); }) .transitionTo(CLAIM_SUBMITTED) .onlyIf(claimSubmittedTwoRegisteredRespondentRepresentatives @@ -245,7 +179,6 @@ public StateFlow build(FlowState.Main initialState) { flags.put(DASHBOARD_SERVICE_ENABLED.name(), featureToggleService.isDashboardEnabledForCase(c)); flags.put(CASE_PROGRESSION_ENABLED.name(), featureToggleService.isCaseProgressionEnabled()); flags.put(BULK_CLAIM_ENABLED.name(), featureToggleService.isBulkClaimEnabled()); - flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)); }) // Unrepresented defendant 1 .transitionTo(CLAIM_SUBMITTED) @@ -271,7 +204,6 @@ public StateFlow build(FlowState.Main initialState) { flags.put(DASHBOARD_SERVICE_ENABLED.name(), featureToggleService.isDashboardEnabledForCase(c)); flags.put(CASE_PROGRESSION_ENABLED.name(), featureToggleService.isCaseProgressionEnabled()); flags.put(BULK_CLAIM_ENABLED.name(), featureToggleService.isBulkClaimEnabled()); - flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)); }) // Unrepresented defendants .transitionTo(CLAIM_SUBMITTED) @@ -284,12 +216,8 @@ public StateFlow build(FlowState.Main initialState) { flags.put(DASHBOARD_SERVICE_ENABLED.name(), featureToggleService.isDashboardEnabledForCase(c)); flags.put(CASE_PROGRESSION_ENABLED.name(), featureToggleService.isCaseProgressionEnabled()); flags.put(BULK_CLAIM_ENABLED.name(), featureToggleService.isBulkClaimEnabled()); - flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)); }) // Only one unrepresented defendant - .transitionTo(CLAIM_SUBMITTED) - .onlyIf(isCourtPermissionNeeded) - .set((c, flags) -> flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true)) .state(CLAIM_SUBMITTED) .transitionTo(CLAIM_ISSUED_PAYMENT_SUCCESSFUL).onlyIf(paymentSuccessful) .transitionTo(TAKEN_OFFLINE_BY_STAFF).onlyIf(takenOfflineByStaffBeforeClaimIssued) @@ -321,10 +249,6 @@ public StateFlow build(FlowState.Main initialState) { FlowFlag.UNREPRESENTED_DEFENDANT_ONE.name(), false ))) .transitionTo(TAKEN_OFFLINE_SPEC_DEFENDANT_NOC).onlyIf(nocSubmittedForLiPDefendant) - .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) - .set((c, flags) -> - flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)) - ) .state(CLAIM_ISSUED_PAYMENT_FAILED) .transitionTo(CLAIM_ISSUED_PAYMENT_SUCCESSFUL).onlyIf(paymentSuccessful) .state(CLAIM_ISSUED_PAYMENT_SUCCESSFUL) @@ -419,10 +343,6 @@ public StateFlow build(FlowState.Main initialState) { .onlyIf(divergentRespondWithDQAndGoOfflineSpec.and(specClaim)) .transitionTo(DIVERGENT_RESPOND_GO_OFFLINE) .onlyIf(divergentRespondGoOfflineSpec.and(specClaim)) - .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) - .set((c, flags) -> - flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), SettleDiscontinueUtil.isJudgeOrderVerificationRequired(c)) - ) .state(CONTACT_DETAILS_CHANGE) .transitionTo(FULL_DEFENCE).onlyIf(fullDefenceSpec.and(not(isRespondentResponseLangIsBilingual))) .transitionTo(PART_ADMISSION).onlyIf(partAdmissionSpec.and(not(isRespondentResponseLangIsBilingual))) @@ -630,10 +550,6 @@ public StateFlow build(FlowState.Main initialState) { .transitionTo(TAKEN_OFFLINE_BY_STAFF).onlyIf(takenOfflineByStaff) .transitionTo(PAST_APPLICANT_RESPONSE_DEADLINE_AWAITING_CAMUNDA) .onlyIf(applicantOutOfTime) - .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) - .set((c, flags) -> - flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true) - ) .state(DIVERGENT_RESPOND_GO_OFFLINE) .state(DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE) .state(ALL_RESPONSES_RECEIVED) @@ -697,6 +613,21 @@ public StateFlow build(FlowState.Main initialState) { .state(SIGN_SETTLEMENT_AGREEMENT) .transitionTo(FULL_ADMIT_JUDGMENT_ADMISSION).onlyIf(ccjRequestJudgmentByAdmission) .state(TAKEN_OFFLINE_SPEC_DEFENDANT_NOC) + .state(PENDING_CASE_ISSUED) + .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) + .set((c, flags) -> + flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true) + ) + .state(AWAITING_RESPONDENT_ACKNOWLEDGEMENT) + .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) + .set((c, flags) -> + flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true) + ) + .state(AWAITING_APPLICANT_INTENTION) + .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) + .set((c, flags) -> + flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true) + ) .build(); } From 816226c9b5fdef73ded106ae8a4d337db97d74fd Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:42:28 +0100 Subject: [PATCH 22/59] CIV-14244 Discontinue Claim notification --- .../civil/service/flowstate/StateFlowEngine.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java index 0ded8aba965..4c898076bcc 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java @@ -21,6 +21,7 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.CASE_PROGRESSION_ENABLED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.DASHBOARD_SERVICE_ENABLED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.GENERAL_APPLICATION_ENABLED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.JUDGE_ORDER_VERIFICATION_REQUIRED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.agreedToMediation; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.ccjRequestJudgmentByAdmission; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.declinedMediation; @@ -33,6 +34,7 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.isTranslatedDocumentUploaded; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPApplicant; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPDefendant; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPDefendantBeforeOffline; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.partAdmitPayImmediately; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.acceptRepaymentPlan; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.agreePartAdmitSettle; @@ -84,6 +86,7 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceSpec; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isCarmApplicableLipCase; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isClaimantNotSettlePartAdmitClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isCourtPermissionNeeded; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isInHearingReadiness; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isPayImmediately; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isRespondentResponseLangIsBilingual; @@ -131,8 +134,11 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledged; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledgedTimeExtension; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.ALL_RESPONSES_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_APPLICANT_INTENTION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONDENT_ACKNOWLEDGEMENT; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CASE_DISCONTINUED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED_TIME_EXTENSION; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_HEARING_FEE_DUE_DEADLINE; @@ -177,6 +183,7 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DISMISSED_DEADLINE_AWAITING_CAMUNDA; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CASE_ISSUED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREGISTERED_DEFENDANT; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT; @@ -184,6 +191,7 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_UNREGISTERED_DEFENDANT; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SIGN_SETTLEMENT_AGREEMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SPEC_DEFENDANT_NOC; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SPEC_DRAFT; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_DETAILS_NOTIFIED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED; @@ -686,7 +694,8 @@ public StateFlow build(FlowState.Main initialState) { flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true) ) .state(AWAITING_RESPONDENT_ACKNOWLEDGEMENT) - .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) + .transitionTo(CASE_DISCONTINUED) + .transitionTo(AWAITING_RESPONDENT_ACKNOWLEDGEMENT).onlyIf(isCourtPermissionNeeded) .set((c, flags) -> flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true) ) From 00ff58b929f0a3f19b45e22a02f17c9353313ab1 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Thu, 11 Jul 2024 11:15:51 +0100 Subject: [PATCH 23/59] CIV-14244 Flow flag condition updated --- .../hmcts/reform/civil/model/CaseData.java | 2 +- .../service/flowstate/FlowPredicate.java | 2 +- .../service/flowstate/StateFlowEngine.java | 194 +----------------- 3 files changed, 10 insertions(+), 188 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java index dce36409973..e027a7efd4c 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java @@ -1512,6 +1512,6 @@ public boolean nocApplyForLiPDefendant() { @JsonIgnore public boolean isJudgeOrderVerificationRequired() { - return (this.getCourtPermissionNeeded() != null && this.getCourtPermissionNeeded().equals(CourtPermissionNeeded.YES)); + return (this.getCourtPermissionNeeded() != null || CourtPermissionNeeded.YES.equals(this.getCourtPermissionNeeded())); } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java index cd75eb3298b..963f40b9c72 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java @@ -1065,5 +1065,5 @@ private static boolean getPredicateForMultipartyCase(CaseData caseData) { && (Objects.isNull(caseData.getMediation().getUnsuccessfulMediationReason()) && Objects.isNull(caseData.getMediation().getMediationUnsuccessfulReasonsMultiSelect())); - public static final Predicate isCourtPermissionNeeded = CaseData::isJudgeOrderVerificationRequired; + public static final Predicate judgeOrderVerificationRequired = CaseData::isJudgeOrderVerificationRequired; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java index 4c898076bcc..ad3040faaf1 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java @@ -21,7 +21,6 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.CASE_PROGRESSION_ENABLED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.DASHBOARD_SERVICE_ENABLED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.GENERAL_APPLICATION_ENABLED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag.JUDGE_ORDER_VERIFICATION_REQUIRED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.agreedToMediation; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.ccjRequestJudgmentByAdmission; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.declinedMediation; @@ -36,173 +35,8 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPDefendant; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPDefendantBeforeOffline; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.partAdmitPayImmediately; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.acceptRepaymentPlan; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.agreePartAdmitSettle; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.allAgreedToLrMediationSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.allResponsesReceived; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.applicantOutOfTime; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.applicantOutOfTimeProcessedByCamunda; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesFullDefenceReceived; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesFullDefenceReceivedSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesNonFullDefenceReceived; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesNonFullDefenceReceivedSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.bothDefSameLegalRep; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterClaimAcknowledged; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterClaimAcknowledgedExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterDetailNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterDetailNotifiedExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedPastHearingFeeDue; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.casemanMarksMediationUnsuccessful; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.certificateOfServiceEnabled; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDetailsNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDismissalOutOfTime; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDismissedByCamunda; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssueBilingual; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssueHwF; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssued; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmitted1v1RespondentOneUnregistered; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedBothUnregisteredSolicitors; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedOneRespondentRepresentative; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedOneUnrepresentedDefendantOnly; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedRespondent1Unrepresented; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedRespondent2Unrepresented; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedTwoRegisteredRespondentRepresentatives; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedTwoRespondentRepresentativesOneUnregistered; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.contactDetailsChange; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaim; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaimSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.demageMultiClaim; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOffline; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOfflineSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOffline; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOfflineSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmission; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmissionSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmitPayImmediately; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefence; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceNotProceed; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceProceed; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isCarmApplicableLipCase; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isClaimantNotSettlePartAdmitClaim; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isCourtPermissionNeeded; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isInHearingReadiness; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isPayImmediately; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isRespondentResponseLangIsBilingual; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.lipFullDefenceProceed; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.multipartyCase; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.notificationAcknowledged; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.oneVsOneCase; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmission; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmissionSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pastClaimDetailsNotificationDeadline; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pastClaimNotificationDeadline; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.paymentFailed; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.paymentSuccessful; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pendingClaimIssued; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pinInPostEnabledAndLiP; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.reasonNotSuitableForSdo; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.rejectRepaymentPlan; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent1NotRepresented; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent1OrgNotRegistered; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent2NotRepresented; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent2OrgNotRegistered; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondentTimeExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specClaim; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specSmallClaimCarm; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterClaimDetailsNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterClaimNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterNotSuitableForSdo; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterSDO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaff; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimDetailsNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimDetailsNotifiedExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimIssue; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimantResponseBeforeSDO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterDefendantResponse; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterNotificationAcknowledged; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterNotificationAcknowledgedTimeExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterSDO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffBeforeClaimIssued; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffBeforeMediationUnsuccessful; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineBySystem; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawn; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterClaimDetailsNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterClaimDetailsNotifiedExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledged; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledgedTimeExtension; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.ALL_RESPONSES_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_APPLICANT_INTENTION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONDENT_ACKNOWLEDGEMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CASE_DISCONTINUED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED_TIME_EXTENSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_HEARING_FEE_DUE_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DISMISSED_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_NOTIFICATION_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_FAILED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_SUCCESSFUL; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_SUBMITTED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CONTACT_DETAILS_CHANGE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.COUNTER_CLAIM; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GO_OFFLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DRAFT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FLOW_NAME; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMISSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_AGREE_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_JUDGMENT_ADMISSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_NOT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PAY_IMMEDIATELY; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_REJECT_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_NOT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_HEARING_READINESS; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_MEDIATION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.MEDIATION_UNSUCCESSFUL_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED_TIME_EXTENSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMISSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_SETTLE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_SETTLED_NO_MEDIATION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PAY_IMMEDIATELY; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PROCEED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_REJECT_REPAYMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_APPLICANT_RESPONSE_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DISMISSED_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CASE_ISSUED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREGISTERED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT_ONE_V_ONE_SPEC; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_UNREGISTERED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SIGN_SETTLEMENT_AGREEMENT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SPEC_DEFENDANT_NOC; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SPEC_DRAFT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_DETAILS_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_SDO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_BY_STAFF; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_PAST_APPLICANT_RESPONSE_DEADLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SDO_NOT_DRAWN; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SPEC_DEFENDANT_NOC; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREGISTERED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_DEFENDANT; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.*; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.*; @Component @RequiredArgsConstructor @@ -391,7 +225,7 @@ public StateFlow build(FlowState.Main initialState) { .state(PENDING_CLAIM_ISSUED_UNREPRESENTED_UNREGISTERED_DEFENDANT) .transitionTo(TAKEN_OFFLINE_UNREPRESENTED_UNREGISTERED_DEFENDANT).onlyIf(takenOfflineBySystem) .state(CLAIM_ISSUED) - .transitionTo(CLAIM_NOTIFIED).onlyIf(claimNotified) + .transitionTo(CLAIM_NOTIFIED).onlyIf(claimNotified.and(not(judgeOrderVerificationRequired))) .transitionTo(TAKEN_OFFLINE_BY_STAFF).onlyIf(takenOfflineByStaffAfterClaimIssue) .transitionTo(TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED).onlyIf(takenOfflineAfterClaimNotified) .transitionTo(PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA).onlyIf(pastClaimNotificationDeadline) @@ -404,7 +238,7 @@ public StateFlow build(FlowState.Main initialState) { flags.put(FlowFlag.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL.name(), true) ) .transitionTo(FULL_DEFENCE).onlyIf(fullDefenceSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual)) - .and(not(pastClaimNotificationDeadline))) + .and(not(pastClaimNotificationDeadline)).and(not(judgeOrderVerificationRequired))) .transitionTo(PART_ADMISSION).onlyIf(partAdmissionSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) .transitionTo(FULL_ADMISSION).onlyIf(fullAdmissionSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) .transitionTo(COUNTER_CLAIM).onlyIf(counterClaimSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) @@ -416,6 +250,9 @@ public StateFlow build(FlowState.Main initialState) { .onlyIf(divergentRespondWithDQAndGoOfflineSpec.and(specClaim)) .transitionTo(DIVERGENT_RESPOND_GO_OFFLINE) .onlyIf(divergentRespondGoOfflineSpec.and(specClaim)) + .transitionTo(CASE_DISCONTINUED).onlyIf(judgeOrderVerificationRequired) + .set(flags -> + flags.put(FlowFlag.JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true)) .state(CONTACT_DETAILS_CHANGE) .transitionTo(FULL_DEFENCE).onlyIf(fullDefenceSpec.and(not(isRespondentResponseLangIsBilingual))) .transitionTo(PART_ADMISSION).onlyIf(partAdmissionSpec.and(not(isRespondentResponseLangIsBilingual))) @@ -688,22 +525,7 @@ public StateFlow build(FlowState.Main initialState) { .state(SPEC_DEFENDANT_NOC) .transitionTo(TAKEN_OFFLINE_SPEC_DEFENDANT_NOC).onlyIf(nocSubmittedForLiPDefendant) .state(TAKEN_OFFLINE_SPEC_DEFENDANT_NOC) - .state(PENDING_CASE_ISSUED) - .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) - .set((c, flags) -> - flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true) - ) - .state(AWAITING_RESPONDENT_ACKNOWLEDGEMENT) - .transitionTo(CASE_DISCONTINUED) - .transitionTo(AWAITING_RESPONDENT_ACKNOWLEDGEMENT).onlyIf(isCourtPermissionNeeded) - .set((c, flags) -> - flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true) - ) - .state(AWAITING_APPLICANT_INTENTION) - .transitionTo(CASE_DISCONTINUED).onlyIf(isCourtPermissionNeeded) - .set((c, flags) -> - flags.put(JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true) - ) + .state(CASE_DISCONTINUED) .build(); } From ff3141adc826061d033fb27f6dbf07833315950f Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Fri, 12 Jul 2024 22:08:32 +0100 Subject: [PATCH 24/59] CIV-14244 Flow flag condition updated --- .../CourtPermissionNeeded.java | 13 -------- ...scontinueClaimClaimantCallbackHandler.java | 24 +++++++------- .../hmcts/reform/civil/model/CaseData.java | 6 ++-- .../ClaimIssuedTransitionBuilder.java | 33 +++++-------------- ...tinueClaimClaimantCallbackHandlerTest.java | 7 ++-- 5 files changed, 28 insertions(+), 55 deletions(-) delete mode 100644 src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/CourtPermissionNeeded.java diff --git a/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/CourtPermissionNeeded.java b/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/CourtPermissionNeeded.java deleted file mode 100644 index 236d2bc42a9..00000000000 --- a/src/main/java/uk/gov/hmcts/reform/civil/enums/settlediscontinue/CourtPermissionNeeded.java +++ /dev/null @@ -1,13 +0,0 @@ -package uk.gov.hmcts.reform.civil.enums.settlediscontinue; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public enum CourtPermissionNeeded { - YES("Yes"), - NO("No"); - - private final String displayedValue; -} diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java index 887a54ec93f..969b8de7a15 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandler.java @@ -6,27 +6,33 @@ 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.ccd.client.model.SubmittedCallbackResponse; 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.enums.MultiPartyScenario; -import uk.gov.hmcts.reform.civil.helpers.DiscontinueClaimHelper; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; +import uk.gov.hmcts.reform.civil.helpers.settlediscontinue.DiscontinueClaimHelper; +import uk.gov.hmcts.reform.civil.model.BusinessProcess; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.common.DynamicList; import java.time.LocalDate; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; +import static java.lang.String.format; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_START; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; import static uk.gov.hmcts.reform.civil.callback.CallbackType.MID; import static uk.gov.hmcts.reform.civil.callback.CallbackType.SUBMITTED; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.DISCONTINUE_CLAIM_CLAIMANT; -import static uk.gov.hmcts.reform.civil.helpers.DiscontinueClaimHelper.is1v2LrVLrCase; +import static uk.gov.hmcts.reform.civil.enums.CaseState.CASE_DISCONTINUED; +import static uk.gov.hmcts.reform.civil.helpers.settlediscontinue.DiscontinueClaimHelper.is1v2LrVLrCase; @Service @RequiredArgsConstructor @@ -191,8 +197,12 @@ private boolean isFullyDiscontinuedAgainst(CaseData caseData) { private CallbackResponse aboutToSubmit(CallbackParams callbackParams) { CaseData caseData = callbackParams.getCaseData(); + CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); + caseDataBuilder.businessProcess(BusinessProcess.ready(DISCONTINUE_CLAIM_CLAIMANT)); + return AboutToStartOrSubmitCallbackResponse.builder() .state(updateCaseState(caseData)) + .data(caseDataBuilder.build().toMap(objectMapper)) .build(); } @@ -216,14 +226,4 @@ public List handledEvents() { return EVENTS; } - private CallbackResponse aboutToSubmit(CallbackParams callbackParams) { - CaseData caseData = callbackParams.getCaseData(); - CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); - caseDataBuilder.businessProcess(BusinessProcess.ready(DISCONTINUE_CLAIM_CLAIMANT)); - - return AboutToStartOrSubmitCallbackResponse.builder() - .state(updateCaseState(caseData)) - .data(caseDataBuilder.build().toMap(objectMapper)) - .build(); - } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java index 982afd0783d..11fa12474f3 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java @@ -38,6 +38,8 @@ import uk.gov.hmcts.reform.civil.enums.SuperClaimType; import uk.gov.hmcts.reform.civil.enums.TimelineUploadTypeSpec; import uk.gov.hmcts.reform.civil.enums.YesOrNo; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.ConfirmOrderGivesPermission; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.MarkPaidConsentList; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.handler.callback.user.spec.show.ResponseOneVOneShowTag; @@ -685,8 +687,6 @@ public boolean hasNoOngoingBusinessProcess() { private SettleDiscontinueYesOrNoList isDiscontinuingAgainstBothDefendants; private SettlementReason settleReason; private final MarkPaidConsentList markPaidConsent; - private SettleDiscontinueYesOrNoList isDiscontinuingAgainstBothDefendants; - private DiscontinuanceTypeList typeOfDiscontinuance; @JsonUnwrapped private FeePaymentOutcomeDetails feePaymentOutcomeDetails; @@ -1537,6 +1537,6 @@ public boolean nocApplyForLiPDefendant() { @JsonIgnore public boolean isJudgeOrderVerificationRequired() { - return (this.getCourtPermissionNeeded() != null || CourtPermissionNeeded.YES.equals(this.getCourtPermissionNeeded())); + return (this.getCourtPermissionNeeded() != null || SettleDiscontinueYesOrNoList.YES.equals(this.getCourtPermissionNeeded())); } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java b/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java index 2fada914992..a48315ee1b5 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java @@ -15,28 +15,9 @@ import static uk.gov.hmcts.reform.civil.enums.CaseCategory.SPEC_CLAIM; import static uk.gov.hmcts.reform.civil.enums.MultiPartyScenario.getMultiPartyScenario; import static uk.gov.hmcts.reform.civil.enums.YesOrNo.NO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaimSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOfflineSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOfflineSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmissionSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isRespondentResponseLangIsBilingual; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmissionSpec; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specClaim; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CONTACT_DETAILS_CHANGE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.COUNTER_CLAIM; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GO_OFFLINE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMISSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMISSION; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_BY_STAFF; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.*; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.*; @Component public class ClaimIssuedTransitionBuilder extends MidTransitionBuilder { @@ -47,7 +28,7 @@ public ClaimIssuedTransitionBuilder(FeatureToggleService featureToggleService) { @Override void setUpTransitions() { - this.moveTo(CLAIM_NOTIFIED).onlyWhen(claimNotified) + this.moveTo(CLAIM_NOTIFIED).onlyWhen(claimNotified.and(not(judgeOrderVerificationRequired))) .moveTo(TAKEN_OFFLINE_BY_STAFF).onlyWhen(takenOfflineByStaffAfterClaimIssue) .moveTo(TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED).onlyWhen(takenOfflineAfterClaimNotified) .moveTo(PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA).onlyWhen(pastClaimNotificationDeadline) @@ -56,7 +37,7 @@ void setUpTransitions() { .moveTo(RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL).onlyWhen(isRespondentResponseLangIsBilingual.and(not(contactDetailsChange))) .set(flags -> flags.put(FlowFlag.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL.name(), true)) .moveTo(FULL_DEFENCE).onlyWhen(fullDefenceSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual)) - .and(not(pastClaimNotificationDeadline))) + .and(not(pastClaimNotificationDeadline)).and(not(judgeOrderVerificationRequired))) .moveTo(PART_ADMISSION).onlyWhen(partAdmissionSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) .moveTo(FULL_ADMISSION).onlyWhen(fullAdmissionSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) .moveTo(COUNTER_CLAIM).onlyWhen(counterClaimSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) @@ -67,7 +48,9 @@ void setUpTransitions() { .moveTo(DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE) .onlyWhen(divergentRespondWithDQAndGoOfflineSpec.and(specClaim)) .moveTo(DIVERGENT_RESPOND_GO_OFFLINE) - .onlyWhen(divergentRespondGoOfflineSpec.and(specClaim)); + .onlyWhen(divergentRespondGoOfflineSpec.and(specClaim)) + .moveTo(CASE_DISCONTINUED).onlyWhen(judgeOrderVerificationRequired) + .set(flags -> flags.put(FlowFlag.JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true)); } public static final Predicate claimNotified = caseData -> diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java index d49cd052301..c9196482459 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java @@ -1,13 +1,17 @@ package uk.gov.hmcts.reform.civil.handler.callback.user; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; +import uk.gov.hmcts.reform.ccd.client.model.SubmittedCallbackResponse; import uk.gov.hmcts.reform.civil.callback.CallbackParams; +import uk.gov.hmcts.reform.civil.enums.CaseState; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; 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; @@ -21,8 +25,7 @@ import java.time.LocalDate; import static org.assertj.core.api.Assertions.assertThat; -import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_START; -import static uk.gov.hmcts.reform.civil.callback.CallbackType.MID; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.*; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.DISCONTINUE_CLAIM_CLAIMANT; @SpringBootTest(classes = { From 9195407d2b73973c422eaddad7b425f6a58b6dc1 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Mon, 15 Jul 2024 17:25:11 +0100 Subject: [PATCH 25/59] CIV-14259 initial commit --- Jenkinsfile_CNP | 4 +- .../CV-UNS-DEC-ENG-DISCONTINUANCE.docx | Bin 0 -> 123113 bytes .../model/DocumentType.java | 3 +- .../hmcts/reform/civil/enums/DocCategory.java | 3 +- ...nerateDiscontinueClaimCallbackHandler.java | 28 ++- .../hmcts/reform/civil/model/CaseData.java | 3 +- .../NoticeOfDiscontinuanceForm.java | 39 ++++ .../service/docmosis/DocmosisTemplates.java | 3 +- .../NoticeOfDiscontinuanceFormGenerator.java | 87 +++++++++ .../service/flowstate/StateFlowEngine.java | 166 +++++++++++++++++- .../ClaimIssuedTransitionBuilder.java | 27 ++- src/main/resources/application.yaml | 2 +- ...tinueClaimClaimantCallbackHandlerTest.java | 5 +- 13 files changed, 350 insertions(+), 20 deletions(-) create mode 100644 docker/docmosis/templates/CV-UNS-DEC-ENG-DISCONTINUANCE.docx create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceForm.java create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceFormGenerator.java diff --git a/Jenkinsfile_CNP b/Jenkinsfile_CNP index f30d7ccdf72..11719d0d6ae 100644 --- a/Jenkinsfile_CNP +++ b/Jenkinsfile_CNP @@ -8,8 +8,8 @@ import uk.gov.hmcts.contino.GithubAPI def type = "java" def product = "civil" def component = "service" -def ccdBranch = "master" -def camundaBranch = "master" +def ccdBranch = "feat/CIV-14259" +def camundaBranch = "feat/CIV-14244" def yarnBuilder = new uk.gov.hmcts.contino.YarnBuilder(this) AppPipelineConfig pipelineConf diff --git a/docker/docmosis/templates/CV-UNS-DEC-ENG-DISCONTINUANCE.docx b/docker/docmosis/templates/CV-UNS-DEC-ENG-DISCONTINUANCE.docx new file mode 100644 index 0000000000000000000000000000000000000000..d869f4a43376dbec4a10ab1051849a62074462cf GIT binary patch literal 123113 zcmeFY1yf`}qa=#M;L^Ac?(S}lySoqWFu1$BySux)5AHs=I}8rXcQ@XP`}XZW*sX}_ z?o+2aqUuCuR(4gkf;2b;00asI1_T6z7{qhX@3;*V1Vrxp5)A|fOk2dx*4fn7SzpE7 z-qcB#-p$6Er~m?tG7kjoyZ`?!{|7&Trj(6{4MyaUYdCM{!VOfKjYuV_tnL#~SUy_k zHxM+7tgy2n*0rrJZ}EELiH7jTsn-#MsrRohN#+F16{Kl3*R+NoJt*prIw~isvm>>* zw{QO@FS^T^{Z|YEM}ZfNk>`i!>X93|Lpt^A$3W|_J!q=N^}Ilx(6AgD8wtcP{RJ(c zg0DgJ-KE#3T*coXd{bp^VTXHYEp^Q*-adbKV@O|{%lLnLlU1OMpnGGd%2T7Rze|8I zX%+gl(O-A@46&W3TdG}o-i-{shv3GLCQaP>={+T4vS3FqA&|a;#&jNdOK6?twZtSp zT4YjiifrHn2lliL0{};VIuES*RPeBT{|Zd(w%P`VCo>>1Ys3nhtZV*Zke_{t86`o1 zD*-vl7Du^qc(h`U@ckn$w2nLmongcQb*>2W;PEpg@Lu!W@6<9wwa*#If80N@2Y~2) zq=dKyjoG@tOJ3c`ia40g1Q;E`5r2#}AsxFa&bSSrprtSH@R2q=4&M(tvY9W=OsQ?i z^y}j7tYr~?;{RYp96-4Bv!z0tW$s`zE};qp7tM1O0zq|1Z)14`%m&n|f8^mJ~P>a_}|e4)H-x=H+Xk zgsUfsu#k|6w;xmb7J@A^v1GHi=fZpe&E2WWY z?%+)L-ZXe)Nal(FcORN}J0v{>-ZkOmO@>8uv&Z#as_jKqtv&GZVj)~49b$X*IcgQO z8heEc5)q?V0pV^{e{_JDXq^nVFt|+H+QI)sK(JG2wuwF9&otBOTp3SWK zY}l>IpE9h4fmrt$7+*NArzdrw!S@sIZ8D(r>-YGk%@px4M0_x|^?>b+t0!Pa4b&5E z>gj(x55K5&C+rO&j9k&ecb!*?GxWTEP7!`yGCU1BaB59=6UAeN5fN-N09Vu(NHyW1 z1Kn63k8Iz!HVMTH@#GS&fxBMFa^#<5xSOGKZXl*ak&R-2m@dv=*DPCqr=x3`?F&PH z&yK`<&JY}d+#0aD6b^Z641#!qD?+UcZb3lsfEbYk8K42yaRJyjdNv>f*&y|LHiAkW zLKWC}r%*p^g$uTb@?|9~IV5l|Sa(cr>~|qAj!2`9YzKURt%2>h-n#TXrhb^Vdppl8 z0`4Y^rU`)#AAhYv3F=GLkdMr}I3T#wLXGW0M!1r0UM;a92QOai)MxH%kQR;`2hV=k zEnhWXxUBbiO8jz25WsEj*L`hEro!-V7CM;1A{Zpfd5ui|o#q-mVk_rF56}ZB16_f$yC?tKD z2=0dqGB##qLFp}+>FB2 z?Kv>#TtU;9&iM(PlV2@Hs|ybjd%PhiX!?6*VcvAN@yV2J19u(kLyiccEkAs0C-A7(u% z9V^{#L!Wh7PM?F(gI_85{9r-3A-K_2nTMg5Vc1-{s_suQ_A_kU@P?bPH$eUyp~{3r#M|j z96jB`6-XlYu%xkcygoiXVE$#mPZ}K&ACR|Oi|>~R1q-KMSEDB>C}&H}k4R!Wz%xLt z@BCv(@YUBrOaqfK^tT%&m0#?=AS8ScfuCf}eiwM>{$tXGSGIBW9 zo2`cHq*Ap*>{HCAodgxBy2b?3JQ0{|Lrap4U`+vrkQ{9noJ2@#w?}XGqn891t4z!1 zIMFYUD#RMrnr?nt^mLaTKO4IgA5$Ir9N1jDdCQ4=lNoC`5Tp)Ek#IO#$SCn{a0*2t zpGRVo(L*6Ji@^*#!lTa&23M9M!sXI(V~xq2k_pGG1!BZPCJ4;`A~@V4V1k~GY`Ep6 za@c`ZVtyoL(SaH#5fBYOAjg-WNg91gP^)JOTKucaOJzY5M2y(LIv>JVGFhcpm$lbDB-~`M73#2+oe3#<{em^LL!P+6MPzmdgyvt#+krOTY`E?`G@QMjqtuN38yz z!p9n+uHKiAl`m{*U(>IN1RsNA!nNLg;(t&2zHc+WlD-|XpMSpWmL<-6QxAD5lQg(T z(2qgSpc;sGwVXm7?ehj6q_Z6}6dW)AnJ=}5q>oS9lDQu*x>Mc-da;}Jl@`U@V%xEZ>Q2{jCQrEKx$a?!FG)9<+F zFzu-8_6GR6+(@Shc5!jKdtG4zBkKhcHqutRISm&wYPf`)InMVnrXd>&7?(75b=H^> z{H9!(O9LOT*LTqMvxdmb`!|H1!=Zs>Ia9w#>lTJ*EL;l6G!Jdh-1Cur37PZenOdqG-K5uycPvAp@CBHu*gc7Qu1y z3YbT=Wy!ZG>la#BZkgr6X~Gd?l%H8R)+E<`@R)6ry{^D5!JkhV372uWSzJOFqZKHNayaT-~(W?uhZcqwgiT@Q<8}Sf~PKvpV{#OB=_WlBz1w zH+FnawBhn-IUI^jn=}P?5G>=3qJ)gi28S!OFD?ws`|%5*30c1S73M_QVye4-`1+C9 z?Z0HE_u9X&MImM8O3%$^?zq7d?2AtbwGDEHcbTvrmZB{`Km*|sEA2)4bOZN#jffSl zZVXYUUYN3EilF;_W8Z5*{$RP&U?MHYG8AySpEHU5k=HoZAcQF2>_l={&g_z0&TazV zOZs5Y0-R{QXEUo(w+UCN-{}~;AR+)vREHZ7FE7`>;F&SKdWQe(_wDP~)DDS;(&p11 zVMPsSj&YyTC*BxD!dQpmqzLMl5`mr~lU&hWqmTmrOgBPi&!FUF#Z@5->Z;lwE1mh9 zY@I>pqSWWk>hclSQw=A9bS5zPLK)?bxm4XlSe^Qm_4mb%!4A&+9^#MhUrqIwV~d_p zp&IyQ7FfSR8oj3y#hgaVMP~o+C=r*eXQddmrL;vrIYU7gs;>sep@632*B*xQMh1)b z#xbuml@-R16$R=UE1M-@cge7D|9FzR?ICm$Jpz}&v#vl?06sOK2Cjomq0cb;d2G+0 z9ENQQiL(3JVsbhu*;IQ35hVTRws<$7ErkfO_Qm}RehLu>zZ9Tzv}B{xBKvD$)YaYt zU!VTC`gKRe*>)2t%(<0#B^duFVQQtf|}zxBW1EEicslxy_()q zM7D?sb`f7SXwhk`1j!ENGGy(_%jo$y823O#c=TQ`mUyBsuR>CgtWYwnLQ!y8!g|Q6 zu~fm9ULsq!Vs~+0ZXX$f!-NPffVKOV^AI+^fSob|2+>vrPTrkL?y;;~I)b@QL`1B6<@;T9HIc^)!3% z`M<0nZpcV^kXLD^50A=^*y|9pRR5z%eoksP1?KbK-jd82EaBn@XY;cgG>OeUJD-i%_ zNIEe!ivq-G)Fop7a$g0uvIC3ND9@r`=T#wGoJQfJQ!lxVzzvriDzwmuj4YCkp2u}Z zf!@QptCu)xe1kT%?=NliGP-%f&K0L2-k)ssg$Ltx<)9U6I%(`uErD=}x*cAaAt2Ei zh*dRZKP$=u!6I<#TT;KX~XLP z)!un)7?pHCM?m`!HO>>XK*l*7g}7w0MI?M%JL262-GaHau{yLo&NI-(Y)Q%EILojB zt_;#_3PYnuS@%N?{V<)cZh9cI2TsUys*=h_Dpd~~eVQ*Zed&Yrpxu;WioZFxoVS+ZV%v!g0@H%}BW@uZTXWx=Rua+Q z8dn-k9X8Gtb5RU0x_J(EdtKc*57&QAFxZO&`=u*e9zAJOp57}ns*R?HK+8=dAwu2rX3Hzh#q{{fy zNmcBV=pV2dXHbek5aQ#qbb9W~4ul~9BI8SXo!Mur#6mz_2fQA;;-3{Q5+kg$r{9?$ zp9|{R34`W%Y6!SsVjZdp-fS;r^F^($qxOpI*KS6AUiWJCn(mMdN}6<-y57ZB)b(yI zV{?c3fYIr`=Xc3A^?9-r;6}gy@{oO6rjZ36Sn`<&!MUhAoxPr@Y;YOUIVm~|R z&P1#$5f>+3>o5~0=R-}8yBk|UG~Ft(v??9F>K|tR(jlwP<`=fkny;8jLn??bA*_d0 zS>XKjzJ7VWdw!-}db0q$rk-6*D08IP@-oDMm7G!ZaHJ%ZXTqp{MFW63*S>=s8*(K+ zwBh4X=i(!kd@5bHuBgy_|4>(QhZAt!l`hCoV?%7aG~M*gSSBJ!5ro*ukcH9DHOfzZ zz-XAvJhf6w8DOloCigks>w)F=H`Yi7T>Np=(TS@T%(C@Wdb#iis)5=XU(iiz*o^6< z2BKo4kiw0uTgbYA;boZiAT^g5S*tR$X({h8C`4bIc|T1&B`s=eRJ!+)NckXI~no4 zcF0wF*tnsh4I#edfVe`db8a0<3Tf_JU9MZ(c5H=i{*g|~cv74zK3a(r^0$nbn7bE; zc=yT2aUI))_s_wQ<_ep>Ayxlnh`f~_ruJLEOw7Wm4Ak1X_89Uhf5a&SCm5T8VYBO< z^-+9*6?D`Kdps6yjbj9Ihj4N)OHTuJtpaz42;8{Hzj?`G$gGjD zoEx^qQ=p+$ZpJ9Pt85tJGEirPqG5>C|F~6q3S$J+ zkKvH^3H2Oe&BOG=K_75QCqwx4AU3BSQPxB0!J9K_bd|;y-c9s^YWqT@H52dc@Q@Hu z7-5N}^80n{?~)jlO=KZ#2_lJUXEz93e7|NYuPLsQSh-Im&RNh;G3{W`sjxHY9J8^1 zxWN6#B;IQ0rL_swcwl+$Kx!eGSG~}kRX0lnU-Xuo9cpZ@O|xY zwz;4uh4p5F#tSuu@_K~DEw&qsJ6rF7?Sn*hKK!bmvenO{X)j*0sFSX*SEZ7U&bP+e1wZ++O2JN-HRSOH*ERW00Xhy|gdF}pi z7{EpHRO&kFF0kh1<0RW@3opzfq^GzJT%TuP(kywi=gmMp#IG@}Ro#~kQqIlmqPafD zg=K^snkTbf2EWA(G0L)+L>N~IT54PFZrDbLt>1;$Dcx^}UQ|y_R%qr3a-z&yYp<;$ z_0ZSW>qa)COmCy}M%%a4OHzXg>Rz`t4U>;UU}rqT9O|)CrKU=6oA{Y`{IYN)QxK*e zf?}I6UC{EfT{FpB)R7SXU7i}V?abGFYI%6`|FHW@w)f(AJQAk+Xm@QEdq&ntz_=%vDjFC zT3Yf_L^I0nKdgf2nGNwE`N_EU8Eqp0ABmTmqH!(pprBw;h3VQHby2s7!!8&q(fqF8 zy6~{!KWHN+mm2vgy8xhTj2g9OT-Q9UDi;{~$eps?TVEF?PeP>?;+SIv@)z|OqIuJCTi_D4YEjn< zCWR-tsenf(IqZN5dWZN{>fOydo`ao`AQ9hSA{m1o4H~(($?4=qzr*FE$jp8HgU{I$ z1Kues=P7A8nr%{&9RW&lVB-CK&#u+%RCR)$U-B*r;}4XgGs_5?*LJ4p4@rG3NsKvi z`?y0j49Mzqp6Yi)ScGvy?DM zG}`piAm`oc5u zN>VApYK>Ge`{%q8_X#v|$p&8~u(!-NBo^q$(|dI;rn(u!_!MK~Cm!u%2Yr!o6DVwS;P4|lPMDQdljq%Ev-E8f7p zt~1$JRPjOwy=W~KtR4gWG6kdCwZ5o|qOzvPK!Xtk#a#37j02wE-WLfal_jPfORJrV z`lr8C!toyYBo~jR3aZg{Jb#uUm0n-1pkybwE7;kJj4wiH#`9+XGmci<`&?C&JPMRe zy0#3td_7M$ToSc0bnB1}s^(5OUvO=Gu-2^e7QZWg!;a5{vHh7-5WYGm#DyP#FrVF( zut2=n`DHt)OalqDVBF$1DT0&Q+Dz$m!`^rFOr&>AKY!EmeG5Vz&AphZnD}^ z=Kd&DoTM2GRlZ@T$$^2@9$!z`?JK;4b+m?7Xv+0pisDyf z;?01{{`rCe&W0Mr2wo~_QmIYAZ5w>-9ol7`W&LoE$e`4N-whFaI!!w z{cgP7A{N;TnXW%ork5BlgHEI2l)){_(^8xao~Gs0IUvMtbk3j)2EM>t7x^}=FeJhF ztYQv^;YUuMTgy!JD#y=OFKKxFjNV|5cj|s8GdB|9yQSB+=$FitU5g1|<)f+Uysm$I z8=TC9LTM9BXW)3?=)11IDqcI&?_mYnQ5KDBf+$j}eC!xf_dmG|D?7IBJtdhj3qujS ze;pPR+T)`uSdURz#(MI?GDM!_F9(5CC0&8hXC|6U>?%`e7SV@oLDo1O=Jd}_OT3Fq zD!7x5Rs+@J9Hz3|!4k|mqnOlj9eUTTKjv_{eL;x#JihAuZRgY=X1dHYuQ_l}mUR_x zOkxq8EuJgL<!IsQEVecCk*zR};~+@o-Hk1qU_pND_Yjedt0t=HGj6`3nWr;ezzp({Tc;Lq7Z1rkQvUi*IPtSP0py;`Sl9l(i)E^fK zpED6pUQx8zKmF8}dbIWV7HlUBWp8rzC1D>i00Aed!a~}{H@h(lvnPkooX|m^}I0f7{AQoFt>nzZjO*&zq z9FS!dB<#;i0sx~zF^Y0A?%MtoQ~?$oY7Ve9g^>;2{nXQJ=eBL|0@&C`3-n&=#eoJY zTWowsnXz6R{UH}EGwGO`YC1E?*SB=AoEBvPB6HQtes#3~arq$^ zsDGXjA{FhlsKa+=ARlliWzL_%u{f(q_A0_dFx?Ujv3kchYP{=D5 z#bhrOTsrmyqe|wX7}x85?RoN>5?)OoO7x!gbZafEYnkS0%IMrq^J96*>eN(K^UI*? z#y?+Os~_#&PWu)QQ1?estD9*mSyGu{hOwLY1R+HIY42R-RF&HHG%E zG1XdRk)sZ45&Dv1;skxaWl?H6imak&17*67eC!pMNj&Z0@T+u^bU70B2|d+^7+-D~ zELV+ny~1o!E&Hr4ay+Ssi%;?_;b0CVx4EoEmF$;9$~0oP8?sP`zcifC#FJiko}An2 zgnrG@n@_Wdm)Yk!0>SUQ)W4nqrKg#A`m;pGBULKSwcvM(l zql-ppJ#?5OnN7X1so5NG{y^*1>mAn2Jiurc<-;DM*_7P~F-3AB*h zlDlHp)^YEMa&|N9QauEe4V+M{8+x;M$lvqn~e-e2Hk%v#H$-wafGQ;&|jBeQSK^D6UY{RX2#lL>CBt?(YBK9BlT`NY33q=LofSYpw z5Kvat0D^~_33Kdy_@LT6G!k8z(C@UaX*84hncruX&YnX+1 ztajanSh^#`>lc8we-Up)PXvr!`xOVtLF%I`xPqEsUF1{~;zNc(n7tIN5J&e*?}S~E z74k?cX1DX#*gaS;R20cr(g!M-2r7Imoh_VsYg;LigM;`ZRCI_0ls1E!bG+Pn-R2yv zS?ggMsMwr>#JFLH!oQ!S;1T@h8;Sw71zsTCNzGC=m`O(ZZ=_wu`gs#kpJ30C-&v0T zO`wDI-#;YY??A^OBnSu|2n^_d9XS8bRL6fmcK&}79-!Y*uJ7LeXP2s^Nx4BrWU(iS zcaZ}=2cBlbOd@@(Q;ax~Rrn@R-|iLRe}}$S`El5)?`U8m z90&;NH>my#eZTDNoNeu#O`ZOecW6q{w##G$jP6ie@(}fw9;L8~$yQX)mGsD-{{z+8 zhp2r1xe;`*F+;wo)&N_U0xc55CGa&`XWgxD{5I~bZyuE4A zpSOBVMP3J>4$dchUdmPhL#w_Fhz%o*hhjs_9hp-KmO8)iV;aI%3d!OIGGaFbx!UtV z1hWXT4=`dC6pWXlJ6AyExnYb|;KZfeOQ;8EPmu(R%wO^#*T2S}WSH2YfcgyEat>QIjtc5su})(24Co9t zD=tahG%&fh0NDkp8!$PTEHJFHf*R6w;X%aLR6{s!potOb9D*Y8{Hx8xC#WSO9Hdw{ zsGH>(TdbV;Yr%esK+bFCe`(%+e)2= zP}9x&2+0>9KjIRZ|E(L6SPG5_+kK!GPscW+7O8&ehkKdtlzNtuMcuh!<(i0*bFO8u z@uqM;F_cvdY4I~&7)WU#do{)oa3*BIw?8z+r)i8eI(H=v@SCvI4;<07JI{4$){j1& zLAd#-JwM#1ww2{+5EruzVG+op(hIq5b!pCX6sd%=y*4y$EUX# zjUMa8n4QoE?(X{{omA941)P7(ZT!#ehW|Axr__>kTK$df=x=QQzfm4jTa*74+J4{A z79iSI25(O)AXQB*Q{E|Yc>}F+0Hf|1V<&!j;vv^*NKh4Q;>9{nyMNK~iqYgJ&^*E` zn=k)Mv(kI76YBVLFX>wS>RNv$an_}&pLZnvuk&F}*>A!X{a)J0u)8!kk!En1nnK}( zeEH2L6!(_HjDxWmuj4j7vhoV z^nz<(W?`fn*dEr{p9W)ie0gw z30I@>CAvzSF^gPsRi1spMR*vl!c5kGYu8CamOSYxKvGtV>?~3;&=|YLqWh_Q2@O%q z*&x`Xq0z2T(3qx59Ar^wIMjJ79w?%F*!Z~5)nkEyzdl-mFA0$OGGsEf)E~pQG`(pg zrYSj07vl=BhZOCziyBT5t!WW35^)@#X+fYTR<75)ECpvlX<;tiH5a4mjELsdS`Ul(CM%Az z8jZLta5Z|(klxMzKoU(u69-t>gnDZ{!llH>X2B0GaS5wo;$|6a0iwy~4H2htH^X&@ zw6E-FDz2pt8j8QqKlIlBX{{ni86T71AHd?ep0eQR}53J z7>IK^|5KDZtxwv}*^tcQX|ZZQ|Hm^$_0uV#Z%)N1I9h=|>>@n(`Op&;U>2|I32KOJ z8!)8|)0&bzKxba{(DSOP`ur=(w?=2?4P%-kQj=tT9)Fr;LHET_tkIp(6LAtD86U@L z)+1aBJE{SXX0Y}}5Q2khW-@a3u~1+e-SueWROIHs?z5Fg9pP=L`FG8V@3$)d|6`yh z;q}>c-+p2q9s~sWzw5TCBh!CWdoxwvZk-Xi??0-o;l5tvk3XUNFd^Bb%o; zce%Sfuqod{0xiCw-N|6RUDxZ=Iq?m*5ZSzRea4j0^`~)BY(3)7k@Bm1P6gq}=u_wb zEVglq;0AIOiUsFi28tazgC7wfn4?dj=E3_#b-X2lGMBPXDt{wvRE_M#P zP#_}F>TaJ+L06@sv30ejUr6>hx&v9yfF8z9`?f_wiL9r2*4|$tlK-Owmj!_2ygMavzF-sK!Nr-e3gTU-9@e$`luuzq%Gg zQPg8se9#weN>h`?8_Y|es_R!1j9Gp*e*{KiD2flS(RAm3W?(2eMA+DpaEBQE3gbJr4gdbY7$3K*IaP%mfFAt?prr~Xv=*ll0&iy_2%+{MQF%-{*C0@k%^@;Q&Pvr7L- zFUk`rD{yBGg{Zo71zd$SBZp8yYll-)oCqY(W~YFCm=!aO-Z-$=)K_S|3w3L?g0nwG zBgEB`A@t=cF-_M*5OQ_Wn0&!G3@K zPay_bn32M?@c;$+PeuQ3`7cXkV`^ey$Y5b(XlBYpZ*OZBt{^9l0E_dVZy`uZh$?}A zfCm4k!a#kuppslme7}J@DTxb%)J)@@eqTVC3CRk9fYisry&HZzeUKma5}HmRAc%wi zsi32FWhUP=FP0P)QgPF}*n-Zo74sJO9F-o$k^R{+tYmb0uS39t$;3TP-wB{yMqnl za62RL^?nztB!lO(XWcMPeuyMV6L)OqbDycS{hvWm2)xe4k_&vj%t*&O<$S!Z^wLAp z5pteaHA;y& zMg=}^4?K6?whu}LK28sOzn*+4dY^|GDpJ2H^*=1{zVFxL9bQrM4ikdU(v0-bA{VC} z$1!#%=wK>QoJ&zy+-8;p?;23HtXozpy~B^_zYpuHq)qA^F}uttw0%D6f4N}8U0r`( zT~D}$tt?=9=Dq-dmE-!_6YXYsau%ZWmuo1!wPf`iz$&rjiGC5+Wia58> zGn*8A4#CA;j~BjoiMdI8EBB=jkFPA*g-&;KC+yqsd{Ir@e0YJ-eyB?De62GT^##Yfbp<1I<7!#%U>XD+igZS=oc%}JH>_9xj zDdFLrhJuR;EUb$cxfgeToan#St3SXVrtnHqUL9RxS>OhADGDB4Z)L(70ptWe9x@OM zBnpd)X!ymk$r$p+SRfOra3c6%^`EgI==q#s)$k0Xn3IB;{@PiZVHD=k!ei_sL&}w# z;n0wzL|I}%nMUmXJ(vn7fj0&_0jQ@dFE17|Q$?Z-?YvLzBq=f;nn2{sz=wJQNlYbi zYM4gmZ)sg7ci1j}xF5Nm`3#Lj&rwq}GXoGDTHj)H!;l>Z<~OpZR*9 zIXKt<^3Z)zOxdI0d)k|b1uJc%a*vp`o5(CE<)j+v{n+TOCU6?K*+Y1o~P3k4uUX|?@2Q_OQ$;3%3%dv zwrtosew^#~)U!K1L6YDoOtB!N{F)`gBg@j`S`pC4Eg2-g=GUbUV^YfXp3&_&5hdKGKpeJPeAxN= z*fFK7s`R?g+{wz6GbRcON7G-QU7)M(eXZ=R@YuI?h}2GE$uJY{ea8u0SZE+Va?^OT~Y6`RvO0oqsu@+EL zDf4OYZQyR-gd}Ee9*{3B6hE`jk@5xu4k@A!WXE4G-ILVhjcd#WDMYagW=_Ovx9%ye zpU%NDim{DNObXOv)IPoWyX(i$v#;jH!wap;864i_ybDKJLjFMuJPSoPeG6W#OwYgO z+NH3`FqyPPyR(SI*ar~rDC&LtQJ!rF$L}e20X55GIpd)Ab6 z>4h!Zpt)C2DO_a(7x&uYv|QA_r&f} zX1W@bSzRmxiVQVThUSjZOb(`4pP$!XJ@6r?%s|Hto7QZdr;e3ss=P&-BHMzrkE5bV zLC1B`ZbnqXx7AVd+>Z;hNrM1q;m{5>2J510JLOA#;El z5vwKyKdgZ_5kY@y$Rp^)A)Nm6z(FD5$H~FQ&gX9`a3Li2_-djMQ32q!VT<=K#qH65QOzUc!-q8V4?W5%rFB0Ef&p}tvfv>ezZl( zC-Z3`4@=S9EQdkBOY@0Sr`$IkY-iTdJi*-7Y-zl~2l=lD`K1&f+nJOP)xxV_dwY_* z_kOGf!MCQv2LFouiz+%1xfhO_4@0RmFwWrc?3rUh9P!e*^I`kQEUTDS5TDZ|=ryt3 z6i7uZH9002yTTeog|_e$SuKJ&PgItJiFN07xz*A#baGinD)Kg*DUBffp=x|b1x7rc zng66Jx|_~zX-lu+cZBYkz6a;U-;;{eP?1&J{^nW@VI1h zJ{6_3|Vrnjh`XKa%pBMo5|c!lF`J`A^4mm<`LEL zZ*c_Z(b{!LXSJ*K$`q6L$9x)Q%*n@%+GSGyc?i4y?wdB~ArG$wO@#->An)W&?{_j9 z1DQERx(p@eoKQjx%6Pj}f>IO_67ur_bz*x~diNQoFqG9r*kr_Z5%Ke>JrJAYbob-h6y$(kb276LAYqC-porm*>d*`#tjQ^w{Y#Z4gUnJ{kJKc>f|ZNAr6Ilq>qT=wVB zr(XTYC5*ae4)AL4*|Zk4T%oBXH637pq%!^x(b$al8P$xS#@ICq4RoQRh9OZ{MwPlH zL@e@Mna97VsuKn7>r(!7#UWOs&Y&0fU_{xFILV4; z9M8S5ubz6M_%t!jq!Wc4XyaVw-IQ!I1OzbM_`fcH0ukWB`TKC+h1}fp#ChFi7S7$_ zzrvCO=P0Wf&1)!W^QyK=Qzek805S9R#wQE8pUzx-Vh)8mvV$fa0dJ$e@1x_oSB|O7 zFhK&RlDPx(jeq)SrDW_D%=iCel60|QEW{O+@REQ#m9Z?ZZQGAE>gpkW1NpNDm_s0U z=O0cxZ*Zez*F+Jv+|iFh^C2(uxv?>u(6^X1>Phd5xPwzf<|Hns6LCYP4?=UJez)-3vsu~YJe!~iSdk(#h=*Qvy?HcvgaS)qY<~Ej&pSzIRUQTM6h>!T-xbR%aKEc zDIU+p#$d_YAYKj2=8&i%ep{1)I077E(x@!*B1#w*)9NSJyKxHn&wGKdMhrYE0J1#i zNM8~-q|xZ?rLAjchJ1;rAE?C4Ot%Fx37oPBM&W-f?aG*l&mHt`u{5aSQ52|%L2C4N zRo4UWqb+v9Ed92#9q$QxM4iu*4xl8DtT`fzocBdO ztn$C4~!sZ>u*EQ2rRFgs90XP&r z3q@Fu0>anXQ1VeiU#~}{N2x-YeZkm;rr7NQ5k-&KnkX3}f?#w=*60UeKK;}^bfA{G zo_5>pQmAgG(Os4{=0Rgi*J834uRPxoH^PfdXg1P-7}u!8Q(WnB&ZBesbYr9p(vE8E zj!N7dz666Dud*x9`lI4z84x9KTi^H5S^*V_{NHLl&~n@Nf8rcePl(mb#*1zqnk^We^R=L^6_Mn(38 z8PBRnQ#5(47yPzdIV)m`${B{I1=i`%(=Jr@+u1Z`tJu?H#VV!@_nd~8sdDvf$dJAc zzsu5+fGW(BQ?o_T`8l-`FHWAQ&&!?9Y9Q+JPv)~l0wSAtgOA;P!Y?;$!UfF|syV!z z1#Cvy=h|=YVrpH*m)3yuUuyyxgrVA2P>#Lu&N;+Pfef#-MnLI`tz2&1hNo>N#V%=E zmOVt`K#Q8eN|++3f3%+xK~Q=_-Bn*Y`7BM50#?@SI7}L1LW~8p8GsVe;>c4xA)KGbjB4;nAbQjz(qsQw zLXaTv=rnvNGO(~Je9q5CnwS(FTKcCE3zD>^4N!MmfS*cXD^rdua|u&qVDlQ5M58Ih z?S&!DtE-0#AXrfNsw1;Mrn=<}`|^|8#vVj3AIvRuwKUPg3e$`V{w18y_Uv3wv9ye< z2YJA{G|jC0x4bYat%)g>Es^OTm%@6JFa;ka7bOAw$&SsLJ;iuZ^q0`Eh?tN5P%gXJ zDbeiq$#ZDlfE89cNTrdcKa5cUK8Q4;+E?zB35+7kUik4O8nGb_8u0T__Quw8V*U~dy>lj z>c=eGGXZg;#y%m#X;{*)pS4IMN?aZNuZU14b;-$RoZ%G8TLU>~AF~kTC7XHLY>}RN zmQ}XZYssz!bpvdY@?fYj`bSP7y6*Z`3=;{|NdL(KJvpoZY(_tmR`Q4>MYc-UgaVc# z2#$>SE=_0hmCsWrX02u8BJpbz*Jnb_+t8HLn9C4Z>>MR6N`bYCD+I#?*!=#nS^n(q zPvN6O=Oc$7IQjX!@Q+kBQ2oeT^aXfeg(j4K7w%>dSb?!#2PDNXys@ZDPKD3-YKbY% zRU%l1d2rP=4tGeM4>Oo>*e@om1$Y3MqR)U?W?AtQaG$*&nH_4sS9)l#z?t5H_=f`LvIwFEeKs|v(}j(Xj2qnE~zr#l8EVN9-pg`+|mh5ubNl_4NXwExw?+t zVfXta4y=EOU2z!)>=YSWDr>n-sU$W`>O+sbrlj65!6WWSittU)EU27B=$~OJeUZ?+ z{|BYW!+zuYFlfjyy^qT>2ux5d5X?|PBw$7aJ9xd>qAi#>>*u>@9Wc2$nXE7+!^V7^ z3&0%3f9d3P(nHHC7HjbbtzJce1YqAA8R9~s67|unp8efzak*}vl?{}s9ZQqHNQD=S7V~*a zH-d8Cxn>ShJ;Dw5%#Jg%fxodejqi9CBBDZBWl6B(*Bz_S3_Zri7FkZ)_6(JiT9~9K zaY7!W52lz9d9J&hu%Rvf8afw1FGlV-)M)^nh6cWEI4alz8gM{_3r%Oh5;Xk=rNB6b zs{{xQgz``y2org(!sR_6Mk*)hetxIIvOwl71Pd98A+>^i32!Xc-{|l&D(j63IE{jaM>>Y2S-=o)zsgI1tg@q z8!72-BxE2RA{`?Hq#H)J(lNSoA}QVAMuRXK>CxRtxSziB{Ri&3=bmpopQmouN&SLQ zS{0^~({14A486fmmERr7vv2^I&q*@K8o)O$Gp(2+#2mhb!OR!9!bA;q zP0hnCtHF07Of5S2=HvVRt|1c7Mnlr(kN#)2|cS)N|D_DG)A}iFdU!pOOHu=Mg%wLywib(y3vh;VS0v} z;ZDrP2{nPRKZhwS3(BI+!y% zk$P9=2Jt$dG%3y+VT220BJVhRpr597-{`5~@gb#B|0<;#fv0#84w$Akg51xK$~D|G z^vmX@oLRtX`1t{jq#JT8Tw+dN?*Fld87NM6U99)pwES;yxuZVOwnAuvJMC^}L$G}z zcIjFLJJA^@y{&Vog_#hw-??$3uf1dwhN|RUtvNEXFE}CM&Xo+I_*2TKLcS9A>~bk; z>8D`j=gr_CHUsr>b^%}uc4%{DW>a?71Hi1v%pqXPyU2i!a~^_(-4ux|>I9A(d=yQf zyxaTfNSsB90u-#)f6TRRdQcouEzG73=ffAx4lWt9hx3q&plp4J2bbE9H=mc4j@Om9 z&0bb8zbHD09!1sydyR;UMW-5zgh^u~6ZOrgP@nzW;=io-Ho?OX!HXkEdu!+1`ZH~^!etf_nlq?a)eKz!!5A6F5-v0UbCE!pqq{E5| zY-EyYQgE631oIDAI!s72!~%lJiV-pmdROP{Sm~a>)^HTegkNb-uG+W)Wp2Mv3>H@2{_n)g;S4y`!tWKALnt>z$0W34a|4d4ns88mdX|uj7R#-j({yhOVe} zQ-@sICW4AQ8+sC%N9VXOw5n~d%pt4uAuI2SuCPS|ljZF(?!@r)Ia84j2$@1M0}XLu z-SeqeqZ%eH)oGDO6+XK9{7#>yb5bK*zUa0)x#u&EhW{X+k~riVvtm$^7IzX*Gt*J- zt11iy(EQ9?(;d_3VIOfejZmgo7K$bJ3O=c9gd=r83G|2D?S z)mlm@bdtp<5^^#3ewFAw(xS*tXH5l7LYFbUihr*;T#u^CHzh`HJ{OjgJ#;$1po(nt z8J4tYz3m z-1co`tKoRIFxFW1Y%l`P$~d@eGLg$vPUC?~*)tL>c2wbVeRT0#@vmM^xFvfNRy=%Z2Ej1uK6ehN(_ zw%nnjn0jMst!m5_pO>kK;NEu{;4+00@uU$MiaLY2bbsc0Wu{f`*pYx|k5K4hUUz}u zQ;uu6OW({8N*|%+|Ivf=DylJFzeA}wqbHJF457J}!vF1y(Sylj$VxBfw&2#%YQ6ez zt|gXU*Kt)aa5CoYR^B_WhqG97adF3|Y-hCz;>*M_Vz*Ia0tVgBhQ5q;3z%IzI9p8< z%A7W?uzsDa%7@Y^jM`kGo|LY4;^kJhq*MS7y-5!_Y(WSIuN z$m-`l#I(R9-doAuOnqrEpy3%SITh7g1JHS;mQ!hlMkm#H3ahx1;16c`ouO3jjLm3s zklegId2aBevPdI2R{5cQFnMfCW%-D@Q@LJ1s2~9gCi9mqy1J0A^UX)+YKtSHd^tNAymQFGJd+IbpI=PA~ z$0A2B$SQL#si|U994IHIwToPHOp} z?>RvB=tE&*6g;)5GB^P5Nw}Non;QzDp+%RnTG!{yh?V0^awazB}h0zx<_~k1vE%9iiU? zDrMH5^>OF>PG0l?dIVioMOWRNr8$iMoTD}NSg>65=Mpa$Kg$Pw-Zl#Lt@5W=j^jXr zMgPM>taTq#=M*4(Khr;8K40`iwlqu4SlcuoHif^S}kygMee$-9w+1} zz}Pjf^_Mr0Ph8)BcBJ_jcKCw^%b93JYc=ZH*ttjpu>9$haKxEWE$C3T!r-Wq7IPEt=Q4YF1;zbJD9RjViY^xNGXc&r0|AmK##jXK8- zWB=XX+oRdu(_;3zS2HsJPURE5g`1)1Td-NE7IEC74ATmZeaDH#g>;MMZ}@Xxtx;d) zjztZol~G5>`0C@`B==z3nRT{D%upW46KeL_lv_hxm9<^#z&M833~lLZq*;oOBW@{j zA%rg1u<+AKprZ?03@*?~cj@faph6gp4;iBlucZ6auoxdMUJ~kaA?qisBxIQnVpW7(JW9xwR9n6WHz6L5Ij6p60Ng@>1@dKV=5ce~{xcD0b zrr3p~Z#?E?Rb6erYLM^|o#mq81iT}!Yp3|`s^Qb3kK+whP))oXWkR`=NR~csg1eag zs)6I*eN`a%q!^+Bsc$sv+Yrh-kS{LC>H771mqMFTUV^xe>yx%c1g6e3{Nu`-!sW$; zPy@oYMCpS8EBOMisy|O%y90*QqOYRFB|j=g`YI$*#RQ-+8E{_{Bj!dhco=r)FvbP^0;^Z z^qDh#?@iFQGgpUTg8)|51ljE$M*;x^!wD9CyZCmopB{f9wyP^dzYT2%J66eIpsZU| z)xBqffAm~F+ZTb5 zBaM?g>>L`{G3L?G;gQ+%)=!_&xJ`P^6ADxr1MTkiPY2VIk*BjBTVrwa-psG!g>cy7 zlHoCcY020)?~B0kRF9BpVf0A19Dax56z8IdLcMKuHi#C>bX3L6rh&_G0`M~5X7NUA zT069$#Xwx4yXj~9bmLd&IB1W(K|nuuSg$r-9(h|K4}OaWIJRZ>v9n|2&wTpEV5T9&Zs7Su{^Q$s*a(#>`l@LC_IxnqQvE^}~KcyIH8TK4uF!H<&ZNh+oFCPVIaY1O@+7 z!l#Kjig&vu!MR7WB7tsywoKf~JN|SA^a^XNKmT0AdsImC;-??=_o#}Cyx$un0p$db zU)j11=3_SBvRx_DJ)B+UGH8;sR&K3JA1>m(_XnMVa>@HaS=k$3ZigU)+$Lv$&(1Yq zJg`*Yb;1eB3K!39PFre&cDUa^xCxX_a;k89y5?Xge_O5|*AIprCPFnBAK-L;S2SGN zOEs(O_T*GwIFEGZejUWNm9HgHkEXTRQ&UTvjR-E6R{UtmoJoKBa9SX81TnsaPV7@9T+V}K(=zH2W_wZz{Qxy zLK%qY;Wws_kMFN0?0xt9wD`7ybAgWi&Py)i!e?VHwV~0Ga?w3mP%-*7KQw%C7cI1# z(-AqOvAjzH>W~#t_aclMAhkQ-L_M3?g-PO1{dIZ@Uw3rcmci+Bi>DXZ*QBrS@l(=r z{m%qB@Ehi~s$vH1$#3ynDO8|({NvDow=h#eObuX8WTP7!V~Lb6X}fs9hp*5)bWA(x z3EK1~HD${e?e#v9eUpj+zj0Uf(OioAaJ*dL5Ovt*?kPyXOKLG7r)Il>+4>#F{KJylHBv4w>I=!*-^?-8n)g%$(Y5kkJ{ zK|limL_{BhIKX8dQ0fqkqm?6?sMKkOEL*-C<)Xz+68=7r7}04rj3%O|6x*nM0cz%C zkL~1kopkxzO4XG6;aUbN(14mny&pSB>05F_J#|?0bHH&v+^^+6K;L{OroFnIlGTx7 z5e;{kRSUU1n9nTja-z4N#W27Ixm>4QqurNgWF&7MinY6!>dI5n52bif60+tz@>$4* z0LDbH23C@S(S0@1Mx*p~-Q*nSyb^JS%J?4XoN_{ibqL0>N&{U-MUL!>dqooi!0dbG zOlr+3JC^Gm`oW2jQ9+>ZD?>6_iPD7$*1TNmY&dbWN%GtZXVppbIxE7)Mvs5!apWG1 zrY+@Y(Ng7HEBSqtsC~}dX_IDPVdKMGIUKk7dZTKT7y0@yq6d}UEs?vtUxb@AoUV|f zEVKW3#l%77;Rr#T{Q>gOZcr?@Q06^cQY~7DJ7f|98B;SR8}QgZeAFk!AH}o0jLdUO z7q0|P&C4Vw5(@Sr1yRCQqBNceZq(R}Vy8y2_2?$WkJ*KcR*`)SrU!*2VTME;6XY!-leQk>@Z3LhBR_J9~n$N&r6-)M36R2 zZi*hap;`zIkFF;KN|n4M6pj4~Qy*dQ zUxNeCDcXcq;L+{dvRi0G)TS3*v-`Vq<=pk1a@WlRjHipXRyWRKaBHHDkd0r6iFToY z8OEp14+F=9ppQ>EM^ucCry1~7lE^Ftq5!+j$f8h^?o5V+zVu` z1ILA(=Ql1!l+QbmZI`~dqGza{3%A`ekkPyT_% zv!(tqEjRrZ33f~Dt;pTNhgq*5&5WV_PYVt8A$POxfI7mZ@1p-TE9C_+_pmVBO>Hs; zI}pvcBU?ECY(E6m_qFEMbaW~mt1#TTw$P_~-S=Rpsc4&}v)FSQjMr(6(dM!RAu#t| z<_8qiR{gg?W5O|KM_0ke?+$@ag|hhFNKHO5Inz9uZHUtr}6F5j^nrq?9P+5DqYKE<#%M z;Lu4|l7#isG`P0?tU8{5u|yPl8RZRJ!kR9atPIag)BD8gdA2it@ekT>k^i##Z^0_l zfN81!&)rFQY49o+(6RiBn9zF&Q^h1A$sD7fNd93~Ykr076s>SG+MS=9g=w!r?kJw;S@3F-aeePD<0EXKH zl}X>mH)ZYQDI6n~FWZDnwYqciu6+5s6=)3>1=mxTd}3hwlz%lzUI_d*JnFld)387A z_{dj0+~Le+CR4GQ(+-Uq61Ade4oL88%orOcGTcq_JHgnum;r(& ze9|4R6{tY)VYDzusF|{lQ*M1@>-@$gxaP&Cd9Y7a@UfKB%FxRTj+|C!?2uGxV#+7! zv3zB%2`7v>&nklG%;M{6I#2MBhym8GOT0O91uex6lu4;Fz%dR^Qz0k0cV7JHiVM@` zIuZ4I8K)dx%6RodP=}7rL|Q!&(z>GC8AYvJ1=kk&%-=9SQ?7qmzeuY zkTh?~D z4~;k$4Egnv{3WJ_bu^0tiP{|+iTWMb;W)g^{vEt@k`m6Q%Wd%7b>(w;@{df7xdO?j zre%C6JHsViUG%1TS0^y&S8GbJT#DC~%>5!E7m4RC-uTNt*NVkA(FAAPgI7jai2u$f zU|)`ix43=3_RdYcb$I_$tNvgHxhRj1uB`b}@55l0(6!lvQ}(TrO#j+6?%oh~wT>(1 zEPCkfCyoEm!U&&`P=jp^vm7|hUnf%t1LM-nc$u(#)uHdFT9#^oe0eAteoPYnY|Gm> zBU&qVBQ#{P)5}}Vh!{Kz1weE*f7rByk4qx}ZO%zeP1*M2J#B%_-kKS>tRlE#-Hjy? zi+lk!l3z+we9TT7(nT-HM$9F@_r0pC zjx;bX4mNrK-8!*pX$q6dR$kB_d0M-9C=mf6^S)Gv&d;58ejMysZAOF+US;2et67UQ z$}m&-wVYM^0gqH5r|%-H0dJOI`j;yfQgS@Kv~^;N%P=HBtA{XNC7_4pbuecVJWDj{ z@z^0x8>kfLAdMbiLbuJ7F#WJJn$a|}B>hU(;X`&{Gwz4X5L`seI8 zy{N+xPD3nz)S-l=R60x+j=Y`aw&X-`%fu5{eRaR}=!IHpR`5FF@)h_w%+sJHBM&uc zoFE~I=x2j$R$x9F5{Z_NMD~PMe9wIpRutuOt~FJYfbd+{i1f$AEJ1SlKCfxPR0R;-W6_In^66yYmR81q_+vFXbPn1EH%+Zt@!iVpXt7 z5G $M`%WIqR1|ZsP`xW#1(WXWHksV^L&8J2BOi7}uhjZLtv_CQrBKzhg6*%dzJ0 zxBmvy49#Q$-IYzW7y5vR zTf)JdZ=TVD))Ta)(_ZJ3eR!ZIU8T&RGKC!ZRf1dCqO9kwLEq=oI!y46(nR(5=Zj^* zObk_Cx8Mc#9h)xgAkJFn?dfvukLL?`IQI<8t}= zD}Z4=Qm&e=DM*o`tHjUkq2rtegay}S*tV(zhm>B7s0ncrU z=+brT1-0lK128FH?K!*|kqqFlP_wujr_e&M@cZ&w0M9ZV%xfj8cLq(q@ZPXIs#&d6 z3otx05C(mdeilF|8#g#{fg+Wh8rCpu&j;2LtdQGztYyJ+wsu#2)dpwo&crbI2rbYQDs z(Qffd!TSg*U2W0F!Y)NC6p9b;7v0Vl)@*k+SZqDh0|h)^i%Y(X3EnM4DtG_toGUzk z=bB^{f^9?lIbSj%1|HQu-=4zLy5To7OMVKMCWfV{GMf07o<=-5VpRlG(|mfW!jSTI z8ypF}L^mBP7m>h2BbY7bFBbof;bhRH#!;yHsUY2?DZywavn9MXBd{rjYGzp)1ltI@ zuyA0A9#UO__4Yu$>4e3N%ZU|PN=O|0&m5|HOm&)bC`3A*B=KURfM`3`epdA#drL`U z7nQlNKK8aEGK!JA=3QX@9F@K+e;rSAa`tchE#EE9y8TnJ`A8^5A(Qo6G!fsI#{s}6 zhQI$3QZO`ZdR-h*#1y%Q z`IhrCXtAw$N(8?6kIt*De#<`k~Ru>t&rfy zf;XPT^!lz^hrso@9Z(EnNO%E|q-qq_z9#UZK8Y>M-mjZL!V6u~EPDY3q{Z&@wf+94?55 z$?1}F!ejL~?ty~!{e53zN?)*7s=m;V&jAm7!l>`O$G@o@Ik>kGB8~kuB!K?4y=_ig z=0_!8n9|#~F%g|kgI2QWcPQ-sWn2x&1DTGma=96DFebH1@mR9(FRalSR+pAf>YU*3 zo=235(+gk#4sogv$T2Hf8E(IpC!oi24im$7EkWjqJxu`|J>uF$^+irRM-}`T+Osk6 zS4s2UhuTH6x{#2bnADCj8HMhQ~f$HllN5{DAteS3bK`ZtUgvSX|XP*xf1;fpo`syRIZq zLlC40^fAUr-V?4Qz(q%U_2nrPxx@527!?a@5Oy>=s;U#WbGbCrH)C7sseFWG_w2H_ znw1GT|A@=WZgYkR1+FK|*eo z8@KbKZe4_!nQof>D!8(dJu>|-Ce{l4uJQQbIsKsrCS;>eeA;9srXo)9^@~cU6-~?z zS}N4`&jO=FA0AyvrfH)+_U$TJ8aN7CF)CkJ{wX@#7bEs679(6ut79m^4hh}y z&zFpb!P?}_qT6U#9B7ztUA`F40MOX1!A_N!dbss%<5Ig6LnB1Wk}q87s$C0c3rc`F z|NUBRpj_Z08_n0^lNTWbeiAI>dHGk+y=Z7N1iEiBTb6i0=GJnZ9qS|4%#i7=BS=$2 z%>vBeM|e<3IH^xxM0;+6lv*7NL+&ZJ3nm&B4g$A1laPLy5EZFN+k88^?_kA76GT}LoCJ0Gwo^RdY_TJ#+%qRgv3PnqHObH+H4GzbShjy_9T=#+g1STzhAAq zfZkCtPQC)J_G%mBs{Gy;CXU9{##d}Hf^Wd|RC{CFtFO<@BltqVJ+Uw@0CpRR&2xe; zoGi5%F45s-70YMCK*=7=jBtRXRABsxqA z>0HBvVD<2;u)f^I?xZTpc#qsxIzWvEaVt=V1fE0S&+2lc&A5x1zW|KAi-A-Uta4J7 z;ZBq%SS)^kkX@~F274}0vmC;9e>0RDnk8<^qzReX#Gadm2w4^QDy}MTJBi>D^aDDN z(Bh~rNh%nCA=hSf@Y0O3>{Hi%n#@!hcb0`0hc~D|Cr7Ub0PSqnk9NJDJtuSj$m73@ zwF!Zyn1)NiA@>8y5MtO?BEJ2F)QF%U&M|e}lz?FTZXVG3oy+3~>XwLGSbv&>=%|Ra z&7!oan{gU|C9!Jz_xJ%5L`duJve!7Xqji!R3(&3ieL3djIZe#r>R6llhgS+I@2ACA zMfb?;`K%tJ(SiUTNdu7w$jG7(9>trejA#}S2Eh8x5B&Mc>lyw!@ZA+@J0y3)JGE#g z!$`kI;BndVixG8sBY(8z6^>;am+-s5A6QY9^)D>OQ-w8(nLD3)zp*0A7@ws5i^YdC zXd!=eBT^((8tI|{Upj`}-NwF5{F zpWRP!9v)=?d;a`)5!P=Pvn}z}epgl`DO%P0+59|>GAkk5wtCo>=k?15_=eS^ck}#= z*I+yt`VM3+pd0G!VZcI|3v`hK5)94;Nf4`~ybzVeoM6V82(UJWLj0XUZ&PBGcChvA zm|Yw{!6P@JCCUvrO8L&@qG~Cxxv;~IJg$f`e%I0Gqg+--)7WA}mCl9eKZrb^S6jp^$SGuG$r*24 zb`iog2-ttqoU&*9JYg$WT52mC<0~ZLZAC61D@*oq2$fono`I&~M+zb}EsjbL5i(pb znk<_)SG#!Ik;3f%$rsB`(}w$KvE^RRD$@qN$N9uDT{VYeNLy=W;P)BzBs_@%J zN~LRr!jq6TGTkV&TmTo%b?!>yz2;Ix7lQfERl><5P>4mVA^y^n`+nto0E4KOQM5Bx zY!jZ_coZlzuy61s&~U`2tRcIiPY`RlHGcT}oZ)i6*ot z=v=D372icQX#K>}=r_^~wkY26K{8gnw(jgp659T?Bfg>MK*(RZ-BofosrzfkNvr9# zpoYKyGGZ(8A5;8oi@cHokBJMs(c8{`h6xZnirc?7>f8N!@cUn=l#uAHvgxld8ENg+Ss2b19;>%W}J**z&ETcTSHQ}e}&PzI!4Hh%oOj9(F#)UT&57(;b_ zTf9?)B*`BHv~XXg3n&mtfB2zce1=cRy>fm!kblE{)&DYlYM!A&{z@*Fd8aPJSXk%R z(X*~_?Gn0hB%G$Lc8Lqxc#O0dL!1 z2>K9~={BK#2>$2YoYW@y=mM~7U-zr=5&99F8aI4FksG85{~aU#*n-$^+)0+1I=gX` zs~ew_cN85CJhx>*nO`OLpSzh}!iSbo=Dt-&M>lt|rPyI#YEI&MiRkb@edqLWr``cl ze4htLLQLjj!6%iN;AY5XuV@B8ZHGzbL~QaANLOOTeI=~#$<%B)A%2mJaRc?##awjR zRnX*JDO2i53w|x0<4NZ0P)${K*+yywBb|((z}h-(IP-=0EB>Dlj8XPN1&Im+Y#&u^ zhYS&~?X@4aD8B{bc21|52ZQl|vPLtEzjpMf{QZ%)GW5ga$;QM2q1-Kej6{`Q4<-wH zZT9M{`d89(WtjD5$bDhYKaV7ft@B`>L<@||5ctXEVd)qWDuLAvzf~mzU&jpxc!xr9 zPBvQL^1n|F1ip$qch!7vU|bb|53F<@Nj~D9roEx;jcwRqhzi|HwS3+B(iJ$Q-0ns9 z2iHN37eCDGG@8VS{*U7EkL_G{o&G}=fv?xsH$@DdTHm;rlypM_m9N!$KR58tFo*OT z7(r2hkXSV*i6(?j(Mt9Et^3{Zl~F?i8q)FWh)im2Dk(d~fQxdHPv-DVi0xTtE zo>iVDMyVX{3MH)ZI@GF_mu!nA#x6W-%MCOsY(={{L2_+=>#;VnBt1UC!E4_slXHRQe~+tX@+Nu zM?OtlVGMkLNLe)_snd!%&zmeu;Rzi{L|w{Z;#J0oP3FmTguMg#JI97Mkq^~A1a*iA zrDnB{(bkG;w#Hmu`ajzYn|3=1{Bwajn~BbO-Q&hu$&rY)4fYAUc~4aRzXc@cN?Yp05uO%#R)K3i3GUyp;{yyMnl?7Ri^C9-AnQ)_uc@ln^c zjN7*oS8B{SIc|W1A2lWeftn=^O`ML+GuHAK2Yqpyf&59A`2k4eBAJfyA9Lv47WQZC zGz(AWz(L1{!UNR5h*Hjvh#54z2GvsEPW#kTt6ZOKm=RH9_&mMjw?OgiYEPvTVwW<3 zI@u0V)+Wj1?@Gq?18J#|$*hUx&$*>=jbV;12rdbxg0b(S*g8FKD+n3`-q{&A=mbBK zG29X(b}?s`aHpe~Xzov_#!~9_LPMypP*M?w=`KPy+j2~lOb}g&+;M;l$SNAm@rM{I zo6y0oyr7=^b?gT&AyKw)M$RtRPLVPX!D)ZuQ+~9#G5T$`TSB$B%?&rLnPHTl=$35d z`$?z>vfo&23k2J>(;sZehxG#IUWOEP>L)*tLnX}ZB%20f{N?cayY*L~AWEERBAp$F zYmIZoyzQ4gJ{=W&me*kUpCs~41iJ}qLIHkcpB-L(hAx%Pe&2R)vGXq{gakPSokaK~ zLVfG02^d7HGIEEJizXEeAwDxMz&ai=0g)U^dn_ktuQZBcRb zJX}&Dj6kDQfyyHqjTCh8_)8WBbs;ko#R9>1*A_URoxvsk_Px+|$*%q>fs?lCIq+WM zigK50eA^lfdv7LFa5E(18_-y=yph_Jh^U-ak@%&uWjVHJ8G+WJh|wu?+S0q*!01?$ z@z*vm<$#3AR2ezP3!d3r=){8(^#G?{{dvs7iZ4w#EO~WmG7EvQ{ytPRvpV1V^l#?~#z~nQnm0TX3NPy45Ky@Y*Rq}& z?FrDfIF=Hj2aw`NVP!H#S%bzbZJm^9aX~|}8n72c^2&|~N?82wNeB7nJ^*EvF;^X! zij_V`qrpm`0wUyFp&bqTQWe4F54<}RY?_I;B!;v*3~s;V-f?=qvm=O%_@-9WoE0({ zi+#pu@Ajtppf-x6a@s0|hR7=*7M1{J%WWAx&}GN0aVV_j1hNXqrF81&?XI>!=I*Lu zw0yl1BWEN`&3n^_yQnKQr-mes0r|2sY)n0;5^o4GJe8E~bmC^fBn-CSEa-hpypM95 za#-~lIq!Wtf*Um~0fyJYO~hG!pM%F$8B=*iy*q(FX)rSP%QU01D&6pVbJ=ER;8#jmOJccFcoGSG->reROMUB9^r$^vLeKGLv1Byn_u1Ygn0 z85PAa7hL{KD|ZMx{Wh{VuT9O66b@WS*@Tkf;BMeeP_uQj_AE~+ieg{WZ`@>Q;H^-? zZ-bwnRIJ8-5b-sG!vw&b2-2m5jo|n{Q z<;Eu;woQr$+U@Wwz9W=FLHpvbQ|)CC)HE%roK1uFA~-ZNz*)tLj+r<0G`s^71Iub` z!i-^FQ3p~ev`n9hC;Vpm@bCrGj&k2)1QnB%vUzEQKdw(GNQ5ou`?`a>tITQIhAC}&Q#tkP@^of}>=z2<4-bJ5S+?v~V zJ%vwBhyA%xhlrWS;60!O!xACnqb2c~@Eg^rqZF=R?tI)Y%H#l>^`JPXt5{&xtzz{ON^E`Ty<>6q%LQRYCLO^GNEmcEO?!k#n?lz(83 z06ChkT=9zQA^e(e?1%P>5U%?3?{)B1VFpTc_yQzez$yxk!%1h)Wma} z5}mNp#5}ucW1RIs*|e#eHRd41I#PRJ^^}C|_p0PU(Y$*&aQ0e*yc7NFqPGd%T%sw< z9wq->p>32-K70N2M9Z%AqP@s{EOYbxs#=@Ya^Z95nX9{5aW|M!9#a;8*w%AWow|f5 z=i_UV*VIg9!oaT2Epa6g7Bi5jfMsCZ!dp8}_yXtvreXCo`u+3`x3GfGlzU-=x^v{oh`5 z6wp})`K5e4;&r7FxY#%|uZc7&Og14{5&^8JN&FakS7T*J?WEFh*VMVz$V-)HwzpuO z->K~FSx4$@F)(p@TI@EddlUNTn1E@BFk{m$x+yrAPq;kAPtEdwczvCgQY-aiu|$lD zt5z22Mqr%GG&E> zj9j4xw-edk#liZNYJD#bOqlqu%*pCgBy4t+S9-ZeyEx+>XmnOAyqojaYyE1aJl^)z z8cJQ*+Q#shG%v@iUI`YpU40KRD9e0rH=P%u?6vrVcYl1ktGMBXdcF%D)ke%9)uMFX zkd;w)rX*-UTjuDEgva(<)t*6Bvj;2r7ulO|08Xnm@V`jjSIUbTF7vwLN2yxQ0)8rD zw#M3zF6WJG+`20IZ3sUB4i>DTR2lj1mconfCY>78jDshtA#m?f$qsx*@_S69Ep4smn+s z+nRAPNJp(Le182o!CkUl^k5SYj^->qz%!b@l!=+J@AhZHVx@a{Ez6(+$?#wE9Len2 z3i3KO6a+m;nGne_z&E2drQ>P%1o5}8y$L_};J~yXVoA};&d^sF7@2zg3=xSrH2C+s ztDRhrQYQnB!i;{l5qxcl7^YyJyHx4VQyN8bRbc{{S)!^0m8p88uVesd+XuM3wXRP8 z$`(v48Z&20Ma=jrRh;sguJZ6W8TWv<)=YgVPK}q)A?E0r^bs3HP|k`toSG#l=l{(Q zqbi-O%thS(?!?MeFU@mQe!eJ4izAsvl_a1ALQV3pu(h#+)HYd)uXK-W9D~YL=KT3-K-(dw^2)>2|3}c8$${ zt7d2J_o21`Kq6$}3nwg3%%OHxrlmmcZ@VAVSSSiGDC*Ifryr`Vl{K*E-+g_Q^p2A+ zasM>->hF7%eYPLH&1<#4P(2S9$E9>DHlw?l!4CGxCTX#Tgvy6O8#hJXNgr>w zHMBsup^zT#nhqxT8!Fzks}L&%X~ku_ewS}999h_wUY zfY8ay)y2c6pQKOASO)LbCf4a0)B1V@KRImC4x95_jNv(pN`&G$F>G4F@syB3lx* zjjIAHxRXXhc0YzN_jGK%;=8?sm>p6VbKNDLm)0Dz&aK;JCzmB0)@sJg*jv6iYL)dV z=y1fGK2kb@Ad6yRD+kkQF?C1#pcF-|zV>=zCAK?N7N@M}nN!>HsEWaUctJr%R;=4L zgr&fz?NH^2qhP$K-u$r|IfP~UaQfHt z<3w@Com?R4zuUhgQ-323pXPpA!}uw3@7_)#H8hv|@vVCA=7uszMgcF=UthQXZnxZ1&(fHd)Ld!LWM zD^s*A^17|oeri*U#XlQW_$Lw%$8+V3cVAYDFNlq8bEJDGUpr0;w_ttIF?pp_)3Y-2 zZ>4n=DH_zb9!Lf%7PkjI3Q(Sow56C8J+8;XyseDAX>b2!(`Kk|TkbrX=CT{;H%PLb zVN)xcvNnV2=rjqMsW+o*|E_dt@pkxXh%Is>}!mWn1DM^2Z$?3QH$xdu;#wS);K2iA)-D zW2w%2bYA{`v}+jG>syv}(ab$z@YUEa?cNVC^@~?c;m$!HYic_$D2zv273}>ZY;q>z z-hcDWB*Lz%_0C%I72*?;&V=D8ZxVqn_~e{-sc&#woTFaD2Oa(%MVW(Y-PdwaM=b7~6wzx^_pKw0|Q&eZ3 z??-1T+M#xhv>PvVY2N0Sa)sAhO4Is4)E#R~O*5#r;urOpJ#Y@&(rJnl1a zTVW5PDmSw!lyi%Orq5lA`-&AJY`75Sm33&dC?jWr$qaY4ESxVaiPvgQ9^5VUZgrj- z$2-A~$JkNCaQ_(7rVr;H1vL9M4qw%lR>z3M&YG$uPN9xF%rrS8VWkhgdBJ=$s9$w` zuSz++@E4Dm%v1jyNgk(Y{OMwhVSQ^N-cA)+=(keshbJUm)R3|Uu^mx~Q@G7Muru$H z_Lue>SDKmFT*wNPDT`+7pVH0|pHrOwPBGH1JK8C&3+Q6=Wp6M!ve4vxl)}t1P^oGR z<&ov^WJD|f!b_2vk+i@2E+^0r*i%!e@*zU3YsuO$`RpXR|U{)3H;4|17sdxq}_+TIuTZEn_jg^Hr_1IE+<`r)YqnWXdzs;-Qse}{RR zvaDuqx{7e@y>Bd1{I7PFZ?LQ_PL+LQw#Lyjlhif>2Klg)Neq(=j@}Z3Do*~M2b!2# z0!M=0-l_1>LLbRTK`(OYKrxI|2A$mkPk6O~_+D8#bxbsnJ{pKm!(aX~aGdj2d#;h( zSiiia%uv$N9CKgw#glO|CUs^ddf~I%7aB68?+A0=f3w!8{+RkN7I#PMNN~|U4tAri z{98Eu{^u2j6W)YC;uekS=Y!DqI6Qo6^0f5I9k23zX#U61Sw}_jw^1BKq)X{WM5Mcy zhNVkXy1PM^?nas)T}y)s3n-0rhp>c#bi*#)9q;h|&*7Yzo%zla_kOMfBc>Hk$)8%O zSlTJchjqzm{I~NlFUc;mIRM$>v3ypG_z?y*&qu}7{w3XCU(AB zat}OU%xGqo6|{UpGqEtSaZPD?J|GGe4&Su<1x|WOa%dkEzmn-#4iJV5YeK14WMju@ zBU~=R++y+hMmLm~M8Hzp@7ss#!mPxVjKcKh z@lsZNlwd*(I)B%X!Y|yy7gLk_XM|H>kdG}fYSlr$y}@6?wI`tECsUnOzf zBC%>!p=+CjEG|zE?^;)zKR)%8tV*=K8$pb15x!c-*CHEr(wt#ztINv%O)JwGg~VL= z{0S0)A8hLg?p!6rkxMOA*6IQvGbC{vy*2eOxHgJ}c~mHIr<#BoagTxr7d?Ox*!!8< zoe;pt$ZTu2x(Ia*f1<;qT>Ux5q6b{S^}_u2tJ#jC~HF!>{1Pb2PoPQM|%Djxo+l!t0xRI!sn)j+|3z z&=pD5^4=Gbnme_OPt=ks`22^;JE1|5mZkNn%e)Ak;L{%*5mRF_h^lEYMT@D|qA`Z= zcgAprLtbPM!!%W5rkmJ^$l+BSdE>v^h=e5YAkmRueH@R+M@+DEv7 z#k9l8I)KOyw{ zf$s5Ypa;Ob-e4cHr_`vqr5_xrMF`Gisu)NluL^e2`OvoXUiWbYYMD6R0c64t ztHJEUk{xKrR~VK;$S>=L6M)p;L{udUQA6Orf>t^e&Tt4ZqM{f@O16w&vVu}xWIei@ zD#goC%A@&T)aJt?T}ZtE1ap;U+FGnqCJNfuR6sAI-2)67bmKYWYFPjKtkX;>%L-EE9(ba;!PZu zyvoJKU$*&ocmEeA0l>dAvtRoSRR8A{UnM?XB?>TniXw_KUU{Fsq?@F133<6Fr!esm zQTz+R-LeO0pDZWnK}HJO@)#|XU+`Ckn9sNb(jhlr18-)U-kUxTIJsdsU>e)~gjGyFbt%i8#oo&rxQy<4TC+PJUdYPQ5xNf@G#$g0lbeZ~l}|JBw?pcjwT)6!J;t`>E#n+E2{~ zJ~Z|81rS|c`7640qo$z;ucI11ElFubvpZQYioH21`wt`rIA3=~+HAgOwo9|+72^(D zi^g%*BuC=cAsj_1+En68jk;{dGg*g5ir{@k#NW|iF+RnSvyj81~} z&?Cg9|5Lj#Xmm9ja79*~@@4SXIl7LE@Ixntgyx}0ZEe!aQnVwCy)!uz< z%FI{&(N~j2iXMp9fU-@I?kYvZh6;MSu&w^IjLV*4HnB9;Cl-{Wb3KdQw#|4!){#n5 zl#lrSgu*WU75)*Q>#$@#T!AZZJ086|jC<*yl)^N@%kTo2C))($^=!3^@3lP1SON$>`n$VC#>Jx!3-lRji$k#(X~qHqF`700mDmk#8Pr_1 zZi_o$+CQA2b9r|i0iNha1pYpP|1L+}i*nbufv`6|hX9co*zY3o2y_>GzEF>4M&6|D zvJan^ec=M}lf)aYzj+1#_qH&#-`BsEa2}g$6M0Tcj20xX{*MvzqV&0t$UuNzV5-JC!Z{Ig&W$FUT`lT zMtILV)~bCprBcRw0)p+9zGr1fOXfG)4&!#~t}mSbzg5Rr`7e9Gs0sA*FpE506hQtH zk?t6kjbVP^|L-6gxLkt4H?yTSgPa)x&*2Ds-xUrQ9~G7@!SC;wejDxT&wS7LgG{n6 zY{U@nkw2JWdW2$88OeK1*g+`rz>U{VG>mpoz?of&gJeD%PsX5uXmSJsFBfOG{H0rL zynLR-a1w`Y_{<^L8?X7Pf0_w2w|R9nFJtY}F5U`TwZBb=J6o$yEEH6e&wA~B^{!}D zZk#aEu^V)k@b1TA!vui4}*nJq7ag*}jE*W7GkhL|wcHf=Rq#Lea< zJM}h>-PRuahUQr6kI-xE6c++r$nktp%2eCM)icJF;b3HBGIPcYR1#;p+Gdc#j==cA zuS4T)hCPhwt5IGZYP;KbiL)3sc!^lNL_QHC_|8WfJXA4O#ulN{;PJez@J~*f6K`Qy zxIq5l%GdMX3KA#Dr8ZZwd@zH%1Ov>oP}egoQK>mdR!;?lie`XY&$7(rO2ltd4G%Yp zKX-O;+aIZDLsc@n%eYD&)7M)>f!@pTVf8~eTUe)ww61t8b1F<($NNz5vu;lUs#$`_ zR_6N^R;94TCo;k!nDzO4BJM@0Z|~Hh)RdK5K?qqo)-X%AAuRJx^RJV(gK1-1d@)bV zfmO07vLt2rJM$=T1?)jdA7j$Aj+_~WXAEAonv6Q|Aefo+&wq2+PRWWEq*e%b)h#G& zpZVG_D54=q#7YqSE%6D(yVOf+3V(h_a6=duvncSZQD1`f?<|fCXELB!|q^m&aDN56kCT$FK%cqgn6Anbf)W!aNNQOIq;8V`C z21h#~&{L=(Yg6r{wt8~5c+a%AOly1u@1>76Vp<1n9|9x8g08%dY(GcT6CIj8Ws`X8cEf|$B zOIZ$thDxfc56>Nf4L1P;9kDtsS#casU|g;rPE@8heB-O-i7GuAbBv@)&WVii1DN5U zg_HEgO8&1+|#NiatJ_*A7!-hYaWBiH z0+8IkQO-ZccL^7OTIL#C76Y&frp4}##o11CP5aWj6I_S3u2uxw?#ttvJA7lx< zz!1vbtZ3`&7UnWt9azXdic~O;-ZsE4^HXJ0;_4CYn2GpgmX^VgQJ8g^kU4M~D(+V> zG0xi1-Jr}ti91^2fDae@cb#SYlVENxO!yRUf;8ZtAn; zJ7&t7UB%PE<)}UGJ|zahB};Pp3_n*SpXtquY%+v=1cs{+%0=)%)=w~9n?+mChYVNa zxNRDB{P793wcCU^FFAQH>9ff>MAKJY{$i;@wwmi}Ygnu%-X@AZar-k#z$lry05Ewg zy01CnB6)-Q>HmGPTw12i-)2?o;`rH=Uxi}kt4rO$?f$fmTl+8O^2PgD;Yle2O4UGC zQat>h-p$ib&~^tL(&D!M88h-#KhkN5QJe5pDR?n%>xq7SR~8xyGxI4I z?VVH3I29v(Y1rJGF*Bh+XH;ENvn!=f>f&Ebzj||JdOT$Q2a7pZ6W)6adr_Wuk3Ts$ z^lH(?cPeLRs(^Cjlw3>`qtKx@A7gH9ts#VevaIXukSHiHNs?FNt&{EXdC}l2{mA5cnwS8}l zv*Cy%nJUz-Q5*(Uwf`$vF@xKseL5h-8^kT^lzuT;n1o^(aBXRuy?amRc5h z^qYZSdHJqA=6IDFWA=ABYH?SQALkuAdKw_LrvyiYD4$W$7=MpSZ}p<-o%*-rvu33D zB`1VN=n zenRHgooBI^Z?kx(1LEO*E;gl;1-Sa68-w8KVA}iS@_H3yJr&gq=k40GEL*%)<)wE+bp> zFl+a8r<3oB*EQy*lA31p6D@=!T+A5XE!fma^&5H2b-MS5m{j40E;VyWPLf!YR*L-R zwQQ`O3qdKRlYJ$Ghx`no$y2zT2$?h`M!f4lDo2`a=Xq6ux(bDC+H*T%+KnK_j&fYs z*+sDZ_f?1917bUiG#CGdi#{5+Z5OlrnFDV!l0G$*4)B`$o-r_;*Z-TrM^Ib`nJ!*qD4eKwNa=l_%p4G~-w z!~K?>ethISZj~L1{gtY6C8(UOB5QPHVvq$k{EWC>Eh^ZqC1OK^VHg?A=XArIHUY=e z_LgO`;eRIkbGx`FL-2bFn_R8=$wi#qJjaF_Uj`fP@lx4V#Z!E*rky&Pv80(u#+uniu4ko`Kl|S7O#!o-4Vpqp;ybG>| zclWFBTG>ohFFs3juHtD1X8^fA9>Tx*NPYlDh!30JOlPjgbs$`oRd&>Pl(yb+@Yy(uzw)8gi{uBo` zlDD(DCte@>$A#A5VMj`bujLMUR2Yw%Iu0~IA1^QTRv0w9a8Eg z@cxA!c)URp7GSjI{Vf!_k=BP@n$UIo00oVHp1v>Y%K?&V&9!43E?B$`=+!jIA|$01 z(cgnFR%!dp3K;x~#+iK%7}kcqcL^XRyN~@M&xc(gV|>4(Ged>(v8dmTFrHT)Wc!Xp z>YHy>c_3iOFnagfU-QR8OLxh{$Ny>$1Zs5l59+4WKdyqAs!q14oo4~Y>F%q5q!+3Z zZO@)8+7dtjiBMMTd}JCKuN-~5aELcj3BWmr>u_S(D%_Q-kr|LH7(#4aOn9HbqAG6x zxs|84g&G*RZG3iW+o`KCZq~zfk&X^DC4Y)X`Lp}W;={%OcQ4BGlO*-Cewo&HxQhxH zH`L5|?@VYmseiuO0@l`Q6fAJ$CqABPKvT#`L~B?lfL@cddk@C1%rZGW&Q<`e5!DCp zdW}>|(68pnz=|ByM;q8qt+8qe^(|(o^&K|!$DPyOyZge3?C}#`MRqvUw%5ZP@&hh_ z-uq*9c8-E$n!%VTO3QB&KrT#}-*GJ+I0n*9sX;@5J+*80mr@s^IEUQ0QRyf!+w4+D zMox)3iVRQOIwx&RkG~S$)<)`-EA1?y_9o*A-eiYO3A(i7OZd6}DY@qFA54&RTRPM3 zy?b3fmw9I(W=qpM^t5bfUW|oJ=>(EyxjP4^So2A27O@4lqksfQ!%k5pCzv7hz&W+X zwwnuKx@W+B6u(@kT`E$}*CnW@8oucEEw1kF8i84G(uT+^T$ z?x$|7Pn%ZfTG#_-XiN40+;txg&~>UY!ZWSog^GWmmS$leOSx~~ zKIC|g2D*wYhUR=2n^6)zz!{4l!%XZ|V+8kp)I|!D$xqD7liaY|nw)>vf$Wbox-w#Z) z>Pi>`>>T(nS#<*gFVomt9Vk&=*APnD1veoV?F{n=P7OBAQSj^`>!#5$(}dl_7>mXk zW+p#Lg20%ky(iQ^#+HHnL34ONK~I=XMSi9(kXk9W2-fo}?y zd|Wc9+XcS=`7u6EJrD6=Q2sQpS=GK+RBW^Bm&#nKECC0d{(j$d=cFJBm~3}ezAuJ@ zQ&JzF^g1`~p)*?lCY4Q+E(g6JYSm#U?3^u=wqX(>59DRE^z{_hsp_-Po8jC&(VHQ>*rPCer_bM1VD>LoLx)TrH`9PHw>g3Dc#r>x zTa$O1VfTVg{=pes^hx{1x|dg*?<+V3WKo=8eB;}H zM`V|~k!GWuvd-DnAIP?Avme)(tNI0pL4K)gs#!(03bKmfB!O6YN%GF^FFMKuh zCpb=4i(Fa!u4V3kXfsg`QMQ}cQsqt1U%u);R0eGO=gE6BqJ&g(JdRZr(#`nhtcXi2 z!q;I$CuHEjgNXxU+FJ810rcJ>xzci1R(*z6>fu{3@oyQ}WxV(7EAwz6IzSeN66^SU zwL+obgyh+K=@X^Rvg9e@$?>LdmhkcP&{&MS(j4yGTmGaNQqp_hu&qt{{AX!&Thb}X zAt&6HlY|+(QW|h>#&nGKo4-?U=^lW?hcl>oM1ylCa(=u1V!{7(R6j>g`{vis+xYUp zqkB5lhei+c@B8|>A7MsQP%y5}?AEZ;n_t=ibf6r9I35{nip7?h15tjh{4EA0E1L|jS35I88U`HQS&R9X!gP2=G^ zX!PntH${4{szlMo+4qlzGy;D@aoEPrf#i7a5~K_;9Nej z9WN+ksUGk&{MTMZkpXdp9-8>!X`dqF zS;Ah^U|vfBGUgs(d<01~Ykp8jk>5CGw>J8TEgDPegKzwa^bz%fWZ=v&NTYPf`-^nx_57`N8(r;%2NvSWF657a{Djx{+#@doR>FGloLlc}`ld5D z1_-(FbDVsTtAL8&;b<=XMSEA+72}bW1oNx`yarz(UYC|WL#ut<>)8-zR{TkRdeDjn zgF9hf=NGy>Fh-LvC%f#c2Uqxt_j!DnHGbD-mUpv;sCY?YRe0epzU19eb5BFA_UJHu z)yY!|0bAa%ZIi@R7eTw`Y{@sn)pfn&Ad4c80-_I95nLD?#o1H#q!p1|#;c*mJJ$1||ZS~kho`?GimRM2cvy_22} zDM&(^L!YgWG$kXT5a?5A=jgN^C}>!>F^ay!X69@b%%cHT_NuwtRoy~; zhGv@<*-`CH0HRXBXJMUICu%G=;-~w>7FCipB=YWa&qX3v?S%HTdjGS0D8pAjm$SkKmYwz1wtA2Ke}vECEE?3 zX4Bq4yMb|UV(U1IX?ToSTUF=sp`o@giB+HuIo|iz0{9_T^ts7LeM~+$%yf2dg4BDI z`H+5F!-ahxd)UIx2`cW*h;hmKLb41~rh%7`+IRSyNfxj!q|41+yjs%%-sp|pcmlW+ z$i2S8q;0O=&3G5ZQCy__c+4$62*#Y7cxXtKxc9l^R_(xlJ1E<5YtmrGC90tH?QDoV z2DgXu(U(Oh=zX8CG3cp`@>YLDN#Ksul;jlilu59hrASsSn@suFDIQ{ zmlF=b(@J$1NG}~JY8|3cT?@j@H0?Y^MHafGu3(pNB?7cJ8p!kb(dO;&Q!1k`DcptP zoXB`xiGn8J)VtJ})Aj%9^9tXurQ>q(P`!Q8*X41lO7taZ0o-1uM93y~$65`AgL~Ke z>E5UVNt*LRb|$y_SR3<87Y&pG${9zf5)|>>Co){c*EF;HL1?pyx#f(*@)&2nuXO^w z`?`d4Y#_vYt$&D09ZF;sME15osFHa)%W~sgsoQgitajhG96F+ZFhi21sAwF7XpBoA ze?!MZaB++q|C&4~Vf2pN%jj|yCp}~6HLH3`p_Lbw_IZM+9=`bD6cc(u`{s~xvcjC$ zahFkwRe_ShHGBLTdLGDbiW>&AY)It6_dR3n*F%d`mggk|6H+R)l4Gd80tZV3jC-@V zyF8yXO==R%5%!b^dhm?O0>G__e+E zjfubnvXcIAz4<7rWUrDoI zHBR>_T5y*qLITlbt#I0E;-U@}y~m=Tv&^t(UgydX#7wi8gbxn#$IBW?ykBqZAv4C2 zDj+9(F0oDl&opppYSNS zSA{w5PuntBC2zA|cl`!SqYoyzyLJy$jMm>cas8ix;hRtNRSu_x2W#ltCH~YYaYTi$LTx4#f`_U)aG~bN71zNKzt@?9U~)POO4vW zT}d9J*Svy6vbZv$xmX-2m4rMJVU4Z zU8GZ@pfKT3_Jy3EU;E}Hh1U0|b*!2nY2{B5@SE$#k@Pn;Z(9F}Rtu)4H-#vF@?pWx zPg`egl-+!3hvKiRSnYWTt@4cvAQPc4lqKW0lA=<+#(}riaqlYw$eYQZWt;!hW#mYz z0@83!5_Cnl10Z9w6_U0GAIawK-^WXiIWsEKV98kKbw#h-sWUV+lz3L0MRj?8L_!a&P#zH_NXDb5)*L8!g=5WfJWVDu|X`jTyaiWg=yI^!%_eZUjSX3Dn4!kndHS!3|@BK9bBiUh*4M(H;wMT2L zI5tMTdf_(WyL$EYBi&8>!to&UP3c=_nar65u~=7Y2c3PNtTMs}dmz4BsC7u~ZR6rG zzQDcr1%=HA5Xe$z@$Wq5=}o)~`7?hPVP_tKL>!IrZg<8{q(>-ySaWlOD=T3HRnR7i z=kqF~gqpo)VGV(EQ_xR&U>fz^7n3y-cKp(CttK$)RS2~B@+hV`pn7>rqk3FY^zUTc zgFa@rQVM>l%5gquLT08YqL5F(N?bM@%sWkwXeCFp$|BkQ`D9AKK;fpAv|y`X)-XKKubx3zu`owqg_()~RT| z_@uGa?b@WV>&2bbs<{Cd%}>ef6<~COx`sEJSC$oTHyVH4@4roSDeh-X1pOSF0iCmG zaCDuw^1Q^VT-NaKUe_PkzW;meCfKEz8PfTR_{BqyL3mK_aA-q9DF1#D&CoAn|1z(4 zPO;7StT+E{JbA9?-t=gcPd51GJvXuEV`IQ?TaA&d6k8z~o^P-c_rLZwNv}t3Nj9KU z%rP$3?klxG>Wk|5Aj}VKMg}7i$|~YX-nCXORl>L(5+mhhGrR@vgGWIP&fcb$vgrZ><}WY@C+Fa`^8IDZ)ZuK4(MX zq6I|=7!K)&9F1|(e<&qC5Uyj$l_^EF4yk+R+atzr)r0|cqo*V3ywR5;o%T0vmrFgt z#0Ydx?bxrKrrD!*jqJt{c<&Y$Eo`>|WOG)05-4M2}%s~h_G+q#<3{&cWpg4AY{P+(MVAL_(_l@*3x|TXMd07;N(>fvKK%{J{d6(6{K*njat|}0q`{PJ#N0O4?buwcXYu}0Wv-|y z4og%gR`+g61%_t~0shL{MLjP5-((&Cbix%w#}3Y!jSsH{MSl+DYDIVFauJ3)!g)Uw zR^FFE&YMy~x?gt#^p4tA9~yyB8yHGbMj?g6egJqfvYp$GU0hri)bl27E$rQxd`<3@ z&&{Zk!e-{nnuB2Vc$zm$H-YVK5tLtc|8{4m8YsqKNj#CrDM9lLyHiS<4ha(zdtK2cuf7Ux0Q#m*k zm^>5J@YWs$V@u3@k&Gig8&qTTQMYkD=<8wz+RB3JN(-qw(r5amSPfm1Fi0iDT~UYJ zca&IU5qG+KPv-Nqd3)`UcMC(*k4j9dlz_Cx~6A5_0d!I+6iGvvc%1;*j$q1eUN6?!V7jJ zAMekwlij0Q-sn$>+Phd8vO1Ps4>PlEtNkeJ;ixXM`Dcg)AcJm%_E)!8o3;#je%K~H zYIf(i_`YuQnXvGu!6?gCCD1+UMN6Rg4!P(IL*3~X$9EGt#Y-JGqT%nZo)YYc`Dm50 zCkyh=CSfL4!_f!CFHB&G4@4LU-~m^S<3|{_=;$K~Q;^oz1+ogz15(nXpLO8`8kZi= zDnPhyw4bMXmASQLp;|XvI-~Ury+>GPTfadzc6c3U3)1ML*x}zz?etK1ZLANLN6yGG z+Qel2aE2?Zwx>miiPb6t!vXOf-FD-)t%^KgR2AukCSueu?`lMc=>MQW?p|oX>y#r(8l{KnM)IB0BVDtlp0l z$>B5K48BvKJ8w~ki^Y5}P;lE45#P?Lpm?DjLz;gad8)ot54Krl3OsuyUe;sZmJ*Uw zg;d1`w0*U&`KJudsA*yaeJ0x`WvTM^nn55qv38uyiryJ88?MaR1CVO)U9>kzp+miC zC-n{k4eWuD@U4~HucrnCO9}Yyx8ae}+*~%~jN&AHl6C;YbLtkpij!t0F{U}BIr@o> z6%Qn%C(P8?O+@n=VdQ`qqg(m z#NNUzZ?&WS;(SO;q0Q%{@a>?t*=ZSWCF4qz8kI)gly~gv6@U}djiTh>e<=l$r9V#c zco91ewfZUn)Uj0W2O(5e-<;NuLMm(w0~Jh;&|23W(H6sk5NyS$wZxM`lO=p6z(P#N zTXY=DLiVGaK#;e*@ ztTv}#6D8_~-3)A#InRiq0r-fsExH*v5>TL+HvuWadUPdr!;R36i~4F9!BU-Sq+lzB zF<_{gR-l<1{|>#h8^v}@lzg}{16bFUiI;=FC_;g-jWiRwblWsh{tDr}*3+?bvzTda zce?Mk{lyaD6WfQzdRJaXmki zJ`1j}Im4gN`hIc9{b-^C~qK0$7S>i~U^vgnWSM9?&V-l_o~roRP^u z$lIbLfjC54TgJ5J#Q5vXEC|vP)B@n=(yG#h7Vm*^or5~ph1H9?8q}^g? zL}L*ZE2{5KdXf6mxqW&&RgFn0IOXc${8`+h`027K*jq%rEQyhfzi(=LLo<5RMH z4!YFzR2xxlFK9P2CZ1W$wCGLO-C7-KB1297_jEq7rJnYkVpKJn#a znV@q!KaGR7)3&#VK9|3kgB<-oJ5xFPokt*x`!gNZphnEO$8hxRJd;+0l!dWpI+@fO zvvcq8vwJ>R6e0nEx^L{XJeQttlXMg~MdiB%Ay|~tm|!l8K$PVg6xe`@G4g_V?T_Yg zwG)PHNbg@|`x&vSY0E)4#@otjq_Po(#cE7gDqd3)sBMaL%3@Um3pmGb`mqY$zu7Vl zRljal{yqFlKHZqFv<~<1Xnv^bj=@2g_fh8 zG7M;)bg*!W08)PtU-&Db$f33~bMj8{jtB(BkDsPp-U3rX?Y5z@l8)lyR|R2jC2z0c z4%=GwemJkRR&-|ii#<3>rMy3#a-bI!7s*;C6XdT?93i9A(444@2=fNGoQ95brauC> z4GIAci^q|<*pWg;Xe4Je|&JLh;=;8lSb@H=G_TA`Vwj^UNWe?QEj2vs5veH4< z`*_&Gj)xGJxR*O3L66F+7d!N=QCfqMz^u7@+b<3SxP8JvUV^-hJ0G|2$yQ#cKyOShjt?!btw9l@wRXR`!@0{EFw6h_{0cd678cd3b=k*k6>gOR6sgwA4!d zLuk8^ql+b0+7+m@i0+YgQaopT8M`dFHVB`~ND#RHR?H4drAwu|t4a<(gad?OK?Sty1jLU(7qi*N2S}zqHY>UCEW6?86NaQip?8F3S z17y1ZAC%F@hr?;NE2U!`+RnuNvTias)K9&Qn4p8A?9~Ok@Fj@v1U?*k5i^zEW)gT= zV45d$AtA(7KZSZR#$X_R-svGcYWgqU8X`5&G^s`GZcHq?->tv{t~%MdW`h^Z6m~b2 zr>MbhJ)2y+h08ZZ@@)Cn_cHCqQ%6-3)CJo{G<+w14gHFfNv*5+-6`IOv~pub?|Lp< zRGEDA-2SlblCzYJkvaEcLQJwZ@5^a-yU$9J_*zgL=AdKx8QO2;p=0zL(JgjNvdsJy z?9)?Uy9kH>0?yIshCM>WDdi6{6hD&K`k*VhTjxnIenUq4snLMi()pOzUrs^LF`x-* z$CdWx?Ud|rWLyV?i@*L-o!t=oSH6A}qm|gJiS!04Li0fDr4|C=y z-^PJ}pPai>;xY8mk7U?7$C>wfEu)=Z4;A*B((S^T9c|8>@hl=K|~X99$XHVJRpMENdo#%MQH zcS*5ywY=H-GNKP*d1>gKLD$azxo{g{Ih6~3he)O^mbz>%Kh6C&&6ALz4qc$$50HNO zPRIQ;L76f8q`q67J6t}PAQ4#;~dG4>|67+~6nYq{T7y@MVUKQS`*OG0FPCjhs z{<``5?0f$j%L`5F2<@N#qc%(&bDlZNPQTr@w@9*%H^AMxZ#z;YtgvdlhW zejb(8$@)q-oSMH>&q5gT)kmLnkj?>k<3kch|;I)!=#JaZ2!Yo!HQOM!0wV=ZdWzGbu zkz(Qs?45ozXEyp84jZ0M3kQv5M=@h5m(k^fQQ%ZF#Kl@d)or3QSV9zF)7x1j@keZK z4@*~76lwZk=Ef2Af7fg`or^F>hvW8)HhxLOoDvf8<)Be-qNjManeW<7|7V(&)Q7aE zlhT3TOu&?tXQlilUhy9F52+0U954}<%`sEDTW@3-PUK%3On^cusV;Fk3)e{S?V)1U zX_`#iT5>8m_cPX`5_E_}ugq9weik#6r+L2fEQbQ@=sn(#yb2|wzq$AYca{KMCfiz;4>&|FW#M+n5T*(-9qh4f%%CSDI4i}q9$BN#T1NAVP;*w1x%JI z8N59%ggWl?hNzaVB8N)#sUEj7I@pVA?0b6 zui`RKegA(8^9v0)(rGHOVQ?MCm$@bCK_$^h6sOC#^NEN(H)=PNl>D_G6+{-1rx#zM zkk2Fu8BRGEy~YHo2<_HI%N|ZFPCgUObJmG8-oCtXAA5HOeSNi%BPU-|V;-n1Pe_Wx z&7AN5IYPc^6MY0wzepKi6QIG4ab*VB>n%k&+^DjvN}l!gDd4)9k2kycO+hMG>^?M^8iz>{Gak z!Tnd{r1MgQ0(dIb3;)#;st9FydV*udI&sQgU9U$OAO1GS^i_;n`a{%ED2r%VRNG+Cpho#RTGazfX?dgx6jKG>#o`N)jN;y3ybd-*J&=HNT=CR zLGvCNh$#e9T-v2+(&Bi4Y=WuE5He8-DnoOGh5jI-lSDR6>Z~z~t1n3c|UYCn52^v*&fxL0pu zRQj$ssvHiw5S`TI4BEPE*QfEslbTa2`8HKbGXiNl+5Q%oGAiAPx|Ahtq3!!8e(khm zP}P5+Q!yD7@2}AMlEB;DW%WS+8v^E>D*e%@@G9|Kej@wgh;$Q`!}lB#2Mg34`gVku zp=Lj?-|l;@;~YvTw^s!>ZuZPZYy@xckFWR)*9o4%wHpe!wxdhstHq>p;N>dQWs;Ls z;>(qIXUSpC)99Vk??tsh>Va+T&pNse$HAAAUEYzBi>eA!f7d1#A;Op%jZ?>kF4>Rv zmqc)4u!dqNIW%9c)o_SVUe~=s{nYAU#6P`|r1U_9th+oJBqi*#NiL{jZKj(Igcol zSw1&Ant2sXe%$doyFb86MLGY<%-vv>^UraFP5+zy@}^Uj4?-8=XFJO zvfzTf_=kYDhsuW|aTyvbgfsZe2zPCK0wO?(aOUD3#s3CsoabvL(O;DThgcA|o?+cx zU}KFr(|q~C>wBq`%ROpOype+av&Nk2Q}oYamz}{j>@VEASY-o<##Yd7L__si2_Vdt zGO*%c@t+dgFOTZ6v%&vaTS+JW`AWJqTR;GX0N+bcAfnwp>7=Uqej^VZ>2j&7Pa~HL_K;5BWh8{q6EYj2iJZY`9x0*yJMPC#BC;3qd>H&y3Ao|0sG#LW^oQ5D%jTzk<+ z06itpUbjFhUh-zNsg6!LH}|EdxWf$s)&l>QPGjm?&=iL)dio7+)MU^J`fSx+K=+!~ z_um4x9X#g8J1(yr0RK*#l0oB%*!ZU5XHR4J-`hEn;|WIbYV6KmZ7%^~Y`A=JQ((@^ zqXUjJWk!!=@4(m`Q5N5sKSXaHi2y}hXu^c2U3s0}70>EIR0hKhtACin@9S7DN8hWV zupIQOexHaVTpBf<6e_#%9}pkgAEntSkR0JbY9*=ChC#b#kek&_Br~m z2Wvy=v0Nmk8zinN`a!^U@@q<{@qr~e^axdkM3sD|{pUi(2jw^YvU9BO@c7o?1Wto? zDcnxMhm%^0^J{!Moh}meCr^AliMkE3#mIkzZ>N{8q;i3g|1Xw3Hnpn1ks}=sqdREU zT6I_3$~vu+mT+-89-rx2D9^0tyn}k+&6J6{x+tSdE{0jrNU_cdkPQ@ z9&$eC7%3gaSo{px#60*M?;ep*v)XY4MNT|LUM;uUZvpqcFlf(= zpu$G2nZT>#c9HF%(l$*yzrf+Sj)a8QJA$*iZi1(*;Nfblh4IR{ni*q1yr(#yD4;v> zb9kRg2Q!rqa)=uab3ivbh4kiA%@w&2fX2g1=GgCq@K&E<%5Z^9F4?I4hWV;17|%n^ zsNg*AC4kw9da_eG$l#}a%6|aXYrCrg)jmBnL*GZEMobQ3dcLbTeR8f;QJFk_+G>LOO&lPOUCCs|TYx`DG^eu7iaqrp z-GyI?x@2@^cA>hYVUiUVUtu=ujkMX{m@Y{b9mDkLN*bBy#NU33BN_D@j3;=A%HBPzbm%g08O%TJ zwIsKEEn36gREYdZl|?SfK>gO<;p|gm?qOSUNFCm+qRjFZaUtr#R>}=xj^ofr!;)y8 ziW1@rR`PS491k&*_yt<)-$e%1kGV+r=&%k342>s@et2q?zXjnK+wrXw*X#uZ>y+d#60N7_NZsm)sLu{W4;CRzRXjGL2TgJrKM0> z*QIEhg1Wj}_#I>S{g`N3js!_aM4{+aC}*shXonn}lj*$r**?0#6Lt@8P{^|E{4~9V zf$pE;Mr|bS77bl)g+WZa-tgkWXTWpdWk!mGQEkA>Ty2mJ_7vdUcdz!DuFtDq_+A7@tqTve>oSyGPaDrmC$c!r~(1kL|g26Me?pyyK0~0$H z1CK>(?H5ZNhE|4eq|mtA=?Ri(PksNH)xYzrPrCvOvjnS9-Tdk%PFb}LtyN)Ck32P^ z^&nyVAmi8Rw~ay&$vWpFEKYeedg2@3`#N;tOK|A`6*nc!@02_(_+yN3$@2`J zaV}g?T+6!AI{-gpkSe+S3L_#Bc?V_Ls{L2^l!As@wJ@m0v@ybvSVcOgF#Pkp1|EW% zTc%SJf8d=fH)r-RKZOIf*-splyJmghefAjI{w&bF z_-UBxOdTn{HXCVB#>cI;^ET6Xi(-K}%sK%%2W(>diz57vfhDmWW86oRLVS52J5pG- zi!~5lNBp*#l<3KiHe~a*c$m3d1jv0bpe`?R)5V`lB0l-2f8+(*3gr1Fa2`##!UMn1 zNmpiXH=J0t%oE99UI0_Z8MBty9ObBqJU;lY^T3=7YxgfX0F-Ff8IejuosOC;)t;%W zfE+Yc3G03F!3>(d8l%MvOAZ5#jg1Gi(o9DSpSEu8hCjaA9a-!!8#u!8ul#lcC|2J_ zC*@wuqi$S3YSWh@w7>y0Os@b7B`(~bg%!;81g^xxt&f|bd-k^It;fj&GW{m`kj35ngivw-LCJonIp8D1~XcR^ENtL_Zro%ebGkLBQc*zTljH$*e?bUM)i;SOyK0VygVxpsNLjrTW2-u;vuNozd3g09wYTS+TUR`ww); z6Uz7|h29LxbKz~aSMXWrz*E%h(o69PY4^TE1@)Y*iU+8mfft%9mQ3m=&C>9Qe%7Zy z4#aoHDDPv_2rO2+s03w9&v%VGz0hQwSL8J)mU4o9YyL^ep_y4e>QuMXmL@L!Sli00 zOuJ5)w_^A&$dMu1=(!)Sa)DyP1k{=>*ZPmjNw2e+)yy|*)SA*c%XF!Jr+&q2`J3h4 zjTD1+$0NKh)pZYxUc!)LLZ9LYsx|y98t)})H3d;v#C&;$j_|zwG;*Dq`}y$wO-$m2 zSV)Qfy&v^`^=dfo{Z8iJu7CMK{FW=}wKaYH^99Gsy!6pT=v2B?c(q5<^*3Xnp%p$R zlLJs$a|90{sV;qJ9uWatS&J2_}n>A4wRx?)rCqBl;6;jB}aR5j++|f z%k}Di=#+oZdg{6@;SMi&dV@C}o^Ad>^{8nl1*56=Dw>$rRnySrMti76uha`QtI{~Q zIr1SR)J!L_^pp(mmjP6WLSt^P+AYTxm^IGOo!3SBO=O&rNWz?RMlp12pPsHJ^0HUL zEh?*?Lg5hF=loQ#Ya{C(iM172vZs+cp5 zNH*NtaZ_bb*gk=D(6J9k@q@q#tp&KH_J3^~zuvrM?~`O`-M1GTSlWHXr9T;QHUwfj zD^;^s!RvZ==Wyd~^-~yR#&f`NisUfWi1HjG?GYDx1c%l0@s&_#T2NEC~`0;RCYzvPx>PXGO)IeNCEd zo+QExNI?S9q0q}Ky0{M4Xr(Nwge>wifzpJbvy&~bshMzfPyDVNoUC^wKc}nr@GGiF zY<%x>Z((6A`k|l({;7PDfQRyNMNXhvO=enk{Q_MV2{5fq)YGQqW-~p*4PyU-6|WV~ zg$+f$cGwio=#=oz;8i1id%9C|F^$?ralq}O%@=-O<1_FA>*`JR#0&hE)1Pi-#8A6O zpz}bb_&BSHnXwbT`8N58eY^y|E*{CEA~$pf+0HjS30;_whAO{`EoMy@`LAgVo$H=3 z|3Q0dapBowv7$ItyCO^D1=$5QU(m6-+!0aI1Fhpx0YK(RA4;vp;^)8Bb(5_)O&AJq zIXpMXWi@PZ*&j{ME+T+RtM`6pnJpOzj(yvN%vb1S;iP3c3d851^ZgQkF8LD#vaM*- zWwefi$hyuWv?6Cz|L&e|(Y!eNz&G3cPlIos-CD2b(;TirJn#*ubyRl;EH#R>V|{(T z{2uJdmOUO*x7{)E>M7G)9Sc9@$6^jc_c2H(<8>vLh~5x{ubPVAiuzqN(Qx{4oqhV> z6IKm4S`iP}ze>B~2xh%{EQeV@(cP^geih|S>HsxHRAqy0pjjxMlfpI&`}lhBk^ zDFmK@l!W_ZtSu6+b=~NQx}U%iJlOVKy80*Yo!yUjcQ3HcuYQ4LV9j&0T#JqDEr$P8 zc4(gWqf)$SUUG*>vsB@3imolR-7gQIIO=zbNFX7Wx&pLOj#+m2l{1|N5MdPBT{PW&+oR<>p?d@v=0U+v8i z&L~P5@ zeNlAZcUu#+wuEmM#WWJj!r)L^!dfl$VXKRAXo=409w)(r_Zf2ywgS7Qbo+*QPDHIm zf_K;*y&Hr{W62Gv_T))Q%6Vhqf#gj15%oXf=f=LbSu3Or)_d+&!aOpLhO#-z`#6ULPv zivQiM1#K=5! zZ1)LgX=z`-`qe}BdN?OUjmhlsGEK2wq&1QnYIea{qc0NGYN|fs^rqtd%xhw>g0z8Ibb~~dyqL4= z`faR|918&>4^Cfc0?^pw`bK~qKi7`t3E1*WZ(&mz-X#6|l?v}X!n2&;u&jFG`o91X z?5|yX#WHd>)pKA9s#9`9^0#g=x=+$~cO6hgDK1+!5+E$Dk&F>B#t8A4_kg(p%4esK*HMbA%4N!E0%~5+mB?UIPq7@v0&>_)X|NC51k>!Sy5P7=QQ& zPUtZJLch?q2ZVXJxJ6b0CxBDRHD(;xl=x+N1CMkNd=XiR)igD&#ZwZ6yI>?zPX% zhp+GMxk{nqx_(AZzr~*wrIk@tCh!*?`XneUC9;)ll>>^DJ(5(uy>@uBj5~<&C9Rr;Azz2PenziLXq-fi-#2fl1mz* zFqfSviG+J>fz6lvRljGPSx|0-+M~?Mk6oujfY=w6A3>|NQPO|g z{THjfOr8Q}5`WF_@e#AE^iSz2lwG3Rq>%3%``xF?24s=+FFYQ(gBIjs22<_=^q**z zFMc=JID5p0UYisGmv%#$f_u6?j@;bz)gLnUpT;3y-4xNs5Bsk5)w1rxGwYMPxqyUt@T~1Cg-tJW z-kgm5#%lS!m0g8o>4X>Xq(p%E1ZubL4Ng1NVzhX4p`_$cT;x>D!K_{V>xH={nL7!8 zj!r&u=tC_24KY#K0`8xsGjl~0YI)z8`V4~6AR4scrcCBRY;^p9=3(7WSdz{Id?5w3 zt8u72GP}&!La+s=8O2_{-#i@sP z94^;5GRpNUjvF+M>wNXh+@A_F2=l(K;#xTelI5Rj=eL>3L( zjuM~1bk*irt3=BBN2nLIbql|~s)-NP0%D)!gHuk+OVr`|f(~~B zOjB;Lk5Xe%p)%+cUj?Y=SPEK;&xA^c3+2M)rrAY^6{kO{#X#;-yqbG1}o7SG9SL7j8?_Vp-LAdHqH*By0iUL;X@ z#-}r4P^Y#-UT)AG4Y@B1QY$)5Dscy-_rf}$Q;?Zl+T_|sS4yHz4hPL)$a*Bb5YXv?s=rW#v@=5(N|Wp?XYLJXGwAa7iFSsXseNXOTF|OK*SbpYu{8iOq*nwuPL$Y?{;zjF>{H=r!mPN$jS=wS< zG3U-u#H_C+K4z0u?Y*cUW$r;ncwNDeq#ADz=+OB30a+$M%MPacb~5496sqaXcc%e8 zv;Dhx#LG-ly$g(v>7*MHH2Dn4PTA9$8r!dX(W$r~1wA>u1D6?DNs8EMMi`b+la% zq@)QR8VEsiP=QD9PVe9rXv4UqTJR(@U8LkQJbZXb0N2FK%=t)DZfR)A=Le`HA3EB4 zyM^WPocvIn45-75;1y{Df-y7JV->ir@U%iGU!57&kAHYvOviN_` z`|)e(N^>i!lfY1%2o@@5qT*H$j-qiv^)m1sc$dVovF9CU{DJA)j?y$Wa^ZT1niUKF z&X?l>3j~A|Im9UE9lIY?k>2=Y(o$KE(vJpa+*OCieXrGiE2P%H61v z(BL>6TapGaB? zHih6K;GtA7twl7)g!d@@jPA8_16drh-7u0+^tg0v;5wJFF!yVB+9)WmTM63-*0V%foe|x^_0SJG+iTkfg+vJ zii{dw%$f7jw}ZQuzA$!*cKS0gJ5ZPO7i|d@z1>8^aXD;Li$naiB>l-i^kiIL$!1_I z(yO@g!0|*OcQlxPVQ4$O#(PJO|D4R&wn#GizwkC>rj?#9&$z2xDQB*i}Pv>qz@RCxgK8z z61a)@X&ypyyK+g+tM1}15cC{q=TXUIX)cl_9z}@-JS$hp^oG8<*6~XQrsC&JwS@6m z0+61CgCG%)7e>ZYFA9e&C98n$ldJ?!_K&n|0R zwPSZ0OwK5I4a$Hw0Qm<=ug&sQQZ^DA4IcvpG$=1ddUW|uc^$ z+l_VEH~BVXJVEnQ865VM$9y8ruT&k?ZL)t^4g4;lr}8aH@29CpDakgI8@;$9Nl^ ziXki{8cvEQdfv0CH!++sV(KzLCbEOp~#seyP;2n?GL6qu`szw*MBo9 zc*ov(*wji>&r{IJE-n<8PwGghn5gAK-F4xBYlUu zz%9qn!Tph1@VCf2VV2Sll!XY(u^`tEQC0ET4T~I(MwNDvgsjB(^rGA1V9Ik@FEUK4 z&t(#SB5BOuL=K~nu>pI<l#`+4t2vpZ{J7CG#efa0*CkzYrDJAXfgnU3L81*=V0 zWvAzThsvfB;RF@NFtAOSka@{*SCU%%@#7G))7plgnBIYIj;S%Y(Mv*c{&nIFRDPIZ z$ab^m-Emn@XlMcH2+7bq&IzQyH$NWTCg zM?<8E@uMp=eq*&@oqu_KQj47qi$y+yZN9TpUK&rM_)kUV}#Tm^9*& z%BPP-)S}37!#G$$lPiS+*lh*G|HdlBNstxva*C*?im7)t6shM5h0F?(9FU)&sQt9r z&2G7U<#wE8&=`~kAiWAG>GlIm1K4dP2|vwST3Z;B?!~H&R(TEUeWKu8&xr>-4TWu_ z>7ei`2TO59jSzj9bxAdcg!%=#Cc*bt$RHIKeSauI)p!%TdN`oM`ST}-QvM-9A4#>@ zw8;*ZxzjhUVuk9=`8nRJZ6!P%w5tBGs)2nLK)ss1rom8X(P*p2_shXGfEoDL*m_GY z_YxT<{A~7QB6PEnnUX)o47veM6?LY|Qx!779hVI5ms;H=VI4JnaVX?G8xa~D(#{tT zubL$_VWR7<3C|~Gbc$k3)^RdY&l0WH^chPy2`rgzq4gYPb!cJZ!9x(*ve%R7*z;Z) zgQ$lu012#n!DLRRV7a-Sc@KwtKYF>I_yq>|9mxLn-5T_Os6dkFm?Vxco@VB8g1red z;_d=)yL;WoB3$d^_Ta@Z4;9jbi0urhJB_*gMB`wjKhH``)V~r@27>t96|oKHo~ypC zn|L02`6pu49D=ezluWnONvKR|^F=n1UN_#qMb#rJ`LVQy?+buruS+5+hUeK3jfev# zBePWA9i}^Yl*MGv)FU0*N{ePca2d|ObuM4yqa*TT_~*fT>%#6fXZOr%V+70mwq_HenzR?6pY#k-c>eiIql z+#zdF|LOurtdOV4y-BcOLw^#Mcv%{r0-U-^YE47o@^hY&RExH}%A)rKQjX|I>ejJ&CLFPAOv zBuLI$9h$0uc0OuM8$#)wJ8k43IwcvxLLJ3)rF9y@NOaXgN|| z%Qb}!b`>C^-x`4VZh}^D$^*Vu{5WNIEFrCpI>|yYwcS(6184b2w}UDBG&z76Ud$QG zc=)o5iZwFhlez59FG_Dd7w*gL#Izci4RL`z#nI~vF~$PW&f)4>fK1=XJP z@vUS;iXXddr*4%NOBm)8$W9LUFTU`A?6oigZ;@op-Vf09&0Gj0E&+npBXq#{3IvU| z_rd0N{=di=i6_qTyJ_nE^9AIBo8WWe60TEDQ!atAhFC$6Tx%Dg6!2$He z;H^``I~aycJ1{BNZ-{ok{ISGaeBxtUXdU@?jt|>*PNJcqYBxUQa-xYGv1{e#&csbC z?%n@xD^JSsY(EdMRjCrI_bGVSmnOn%y4$rmQw06LIBSpBp&^&xp%74o7rQT&Ao8Td zO<%sg2>svtK6?H_$(VhNebIY@uhRuLZ#wAUhp!#D88DlFh%?ZES6D3nsHxax!*g

7J4f%1g=?lL>|Aa5`TPIf9zW5J8f^5&2@8wze2}Ph1Tkr5=}^JW*D&FoC_(7dPLzu4Ve&W4sO}^O?8s-<^z855{24oZ zk87iUY~OJ4Uk9({1N{^J5@*AB?ZQE>l!t`vvW`WpctJ4N`PJJ(!pQIwVk|9qNK1a% zmPyR252U&XK|~vMKlyCm3q^i6EFX@}jJF5)rQnVe3U?`Td6oM#mbTepjdGA;Mfdw$ z7Q}F6U7k8cLP~#v!ucuuD*=W|| z5Q1!J0zJI8gUu$0Q0)FEw;n&j_Gv9bRWbj&z>w(+{Y&^08xVRs^UaR;YJaKm z4Dpaa{T6~bXl`mkHu*1bd3jYgE+Np0Q4ulx4kj}523&cW^2G(bX3&u!WoSP_*_}D` z{r81Ekn5C1*!@J6J4;wg@9p5;)ohCv+Jlq+)me(tZ{Rq+U zWrr;DRCOwQ`o8|+pA(7qDE3d}_>;#&JhfH0Vp>tcxbYGEZ#Zu1Al5YSq!FVJJ?P_e zQ=uP7x$A-`X*?VkdiEz1X=vE^ROoq^nwUEtzIsXi(4a>wl*~9nwFJb6ko%Jj!;eHl zlQ*=T-$FIG`trj?`_X-RLK{)b<3*Y2A7Yq5-Q+aC$gG>SB^mO0t#?SbK3yvjW|H{9 zUm8Y3iJ=L7I{2n579np=#vqriScS$o{hDLQ{n!wXl7Xqd;%CHvkd`z(9;bsFR=5T& zOYz!1#RH+JAlH$vuHfU_z@=~9p6JUdR>y-1fehaS&TX&T`3q+XuY@M|1Mi+3RC;kg z_wHx=5iq;Zpy9Z!MN!uK2a^kq1)CcwU$-fv^@KKX1_*&1Lw+xdM<9+(vsh1f$Fs-; zE-l*j`1xFaypd#ikJpH)Co?%Dp;2@R_jhC|QHbRMT_Z^J9Nv@Vx&3l5#!!q$4}uD(gE@S9pG6wIDG^I1>*9kXGx$kbOJIRD?RH`1xxMP@bU6r#IUCdKL+*lj0nFEiA z`0;)hTLwh9a(}nv+NKLM8-}lt-{bx^D;VvNZ=3qvg7esZS3}=-3gTk~5DoZP2**SZ zgmAUd)Ia5SI;ud6&tJ1%XKa2FgorI@=i5vYZC=a2rS0QNsLhvVYKX`BoZg|y8fLE+ z>apE_VvHcRLfCv%VYwh)byg-RiI+eJX!s=dr7l=XnZkhhOlpDqMf>E4e8o6@?Uz^a zNX2Z^d3rwKUSBklIQ|1!82>Xh`wv$S$b9qFM3N_zYkiO|a6neh?98rE65mX1 zYFUDczi}L9q#S^9f!_rf5yj?m#c#Ic4+iD;DSYYOy{j=2r09^ z#lImXKtOKTUuIQBmX3E+zxD&ULl`}P8?rHBHh_|rNFeQ0s%dM)T!(mHhyPf*%c&NJ zyqHRwg?RS^ZM=t;O`uKqrYX6mcRA}_$eL?`j-abD{^QpyUSNC>?D`Lhj-q(vBrk(x z?X=73N735%n4F8S_{7%NYj+$O7`EG_Sti5$7pTm73pmTGk=~QW6!odccgQZql!WI{ z#dQCn`!|Cw05)a!iwgyw`=wz)Y?ePBbZVy4y!L&^7r_vi9?Vme6wmfLHZat_#o0N6*QF-g$3nT&RfL|4VURU3SA!Ip5XZN0lma1t+?mOn zT#jZ%szq2bOwUPVcBf5vLsSVo20*2d*ZNb0YnRn!G9OvQ&dI=YL)2cJ1)UW_U7g8a zjfg|ucyQlb)+w&4G2l!pZI{>xC$?v;SW#vP^APgg7dq{JdG?&>rDI~iaUcScyI zz1WWPvWxqfpf56;Caf8BX!N7?QZLGGxOfOoZer%bK|?}{iFqm!^k?YJK#6Y1|LrKt zm+%Qd`z4ppTA{8JbC$J+1>MeE`$AddH7A@ddLDvbrGXk0?S_dv%G7fV`Le>1eZV$3 zUG053cH>Hdyq{dlqmbw3O`*rRcuJvXEnrro+=Y7*-jEzJ(+erBZeB$!Qk_ezi;uY9 zoloG=TpK&cyhIsG^~yjE@LzCbKsn$l!fEH+X34tUrmd!F1b&!dc=HY43>yp? zXN9%;ngBU=24fI?_as38)#5@|aKbji%J{oEDKhN)NKQ^&nN#e5u9m|)aRJ4RlrV;;v?i z6)0`Wjj*}dWVia3TLPLaJhNIZ;8{gA>kvPr2^Zd$JKSvNWTWsZ8&ihJK?o9yl5(n~m zh_X?)u9?|V=aGgtc2vOy2-ojw{D5MSs1TtWiy|w5uT4ni;m19Fl+9&4qMaN3iqJ5Y znV6;Apm-@^EEt;g9%qmR@E6)i=_=IwkcX$lB#j~qTCj7)*KX0YZ~;eLQlzT?6%>@l zm0*`#L|#Eg{%8&~zQmXbH<*=>=%W~FSb@#+Fnw)O0TkO2iCK64;rf1nfj-TqY9(#w zY6|&G8k>wH%OJr(cwnU;%X&ghagHM)Msr}0UF3nF0^k#71IMbx+_Rqy!W)3v8O(xb zjBoQwAMyrI&QyiyZt?6FuS-+9I&V2rwvF zwl|TdsxSg!){uCdpk1BPJ;*EN_&TQ~$3K#geod_O2v3Rh!L;(LIQZ`-SmOKoV11x@ z_|8eIofW8-1ERBXY4g_6?v_YQ1Qw3`P|Pv)L8(pPvu#RO=UmP${0B=|(A!{Jbkzyt z14o33VRK#c=qpNV*R<3NUH5&u+wf02*T+`B0wrVzUNNv1(k_gJ?HPzb5(DCd#>wLo z&Tzk7%{;t8hvi=v7s%Pg4#-P66K*r%?Gn<2%c|}7F!i;9f0o$cDNo|_biNBv&4um% zbaR!O?tJ-oR-4NyOI^|;uSlqQ4C!FqnZP7Q?xFShRu{-i8|b$hC1CHe8@5?QHYd9z z=L>Ej2-hIRX}q4r74FPe?ZTs2x zG82G~KI}J_#{Q(?ydeEXXE|Hlnf^r+eKaqQWBWukW7z-ae3E}9%pEkH8bqajhLoY{`>xMpcwG_u8!RkfJ+ym@whb5V7sKU z3>@L*qG5loyl-|j4nCW{#lNum?|u*P;rhVTc*LwddpgF~O-qKP{p1g~+UXb}inI)E zf~8;stv`(}*)vRia{le{ih#sqYsPnlwp4rwlaubX>-LGx8-BEWrZKUblQw4-^;3eN zg?Iw`v`xF^r*GdD4CK@L)@uVGDnbd2j(Yq&=8_&9kPI`^PRCi64#Ie0B94;`VRfe0 z)yea;iSRxW)pVxqC$lAq?O&*?i$;83#kC?=*iZyP>zDK(BPu5w%6}V z{^}!t{w$fx4|(N9eHtz#^@aF08HWi{vfENBc8*N``a;<(EG2{ehs9(os*r}G<<-`26*~{OR ztUMnZ^Ev$p0z-fD53O!|d*NEVB1}vd-H1`k7TtAC%=>dpA_Dd2&&c*O#f}=+XubggZ0Jh-Z)1g}EZ&ND01&KIARzon>+br&GM+}wzdCmtbt zvUTxmm~BtbmOdsLPhj0p8yai9Tt*-LliUkEUAT2bEUb_9OiMQnL+JHK-62JPUovS+ zf>C)FokWHl7|_l@5(!>#0{5d_C&}QIqssrVT7}E0=4)sod*$)N6V~G#zO2kfA7J5- zGfpEne@P-NI5);u4PLoC6z)=g|%*uv8_%Cy&#%Jr({nx46*{&%5xw zMcdH|6CB)}!iXO@BEuxmexYKdwvQ!?zGF6I(U7^?NGbND2Rdw8XRnnq&}G%I){_95 z&g(1pa%Y;p$=whejN$N%&Yks~{GE0_PcM)*sOHS1#H2E3DWE3X9lNU?NPezn(7=d1mUJyz$e@fZ3>YQw z34-wA%ojUq+!*I5uzG-^F(&PZPYBPCd_UC4ZMr4h_X+WS*KilH zbN2wxsWsQ6DS!X`T}_D+y)H<}`g8ob(wnx)rqa+iLa3Bn)}unp?!rBY3jGh8zL;48})2={Y=V*F;0}<_>Q}+hxz;9hf9&2pQXxy3)|aBzOD{qp zcJ^VKXgmk5?f!G0=;V{^hHs#w)d2@^BJE@^ALslA3Ulo9z()PC|#>-t2G{4|6tOqwJz>?|za69JGv*`g23h zc{H_)ha!2C#(#i?@;vT4w?M+4D8uBRNDONo&O^fP;*O_3ayFZHBbu8bdz)?#>|Mm0 z@iks^77dijnT_UMx5K2c@5s`6{CSd3nz{M$NKrmG3&f5E$SFQGdZFYWzo?g}lQEE2 zV`DlOncGAZl!k_B#CW9KMmNb&5o(KB;Z~e%o(a$uXNPmkm8+aEUc7DO9)d7Oq>lJ4kJd$`zs)tLC5od`e5Xqkdn_wp9NXDW-$%e&t2Th`_1joiDZ1$Y_2 zJ!^Ewa0Q3G6N0Y-b9fn>6zj4JyNd0IJp zp2AtP-(mhS&TqobG>=!Pb&D zmlrn9WP?gnA$7T1ABK87vQaHSNDiyN~+&8cSC`&3FT=-scH9SX;~r@=^Mx^ZX?)oZ6RYoa+_Z z;~!jWFlA>>%QUvmVqG|JJmc5Y8*4Kl{_J}T&A5ErI(tzUaqM^u+f)<6=x$BMrg}TW zMq*HGQ( z&ynSimuy%Ax)){v3z9f%QB>eHVzD{Z!K>!En)DN)f!G5rzD(4@Y~hNdS5sRWP?*tY z*g?j42H409O~nF9ZSWu@r$W+{H<3L_0vTJ#d*!-{;J12I4cTuljchU)m>OwM*36oc zz4Ct`GeporCGX|4=aY><27FwI);a`(JLFR5Mr4FS>*$>bwb&R0^YmDBZenmW&>kCW zpJo~1RoLdXrW#oy*OF636nglI5l2968UnVGPp|gKYce)dspJ|O!(U1UW!?JfmGh>= zs*m{c>(ICPLPOz_PZKPtoj@r*i6h)}PfxWb@`l?NJ%UhSyX1-SnTLvs}wK% zZVsBF_UveNsKNw?0ocFuI`!>;1)Y`U$i)wgJ9*8FO8hybVbpV!UZ&Th*woFu?<~g8 z0(BXH`mgc++fTiCSy&A~u-DYKLp~i15ybfZot9i%IX{@Tos2;0*Vy|p%XuBrSsiWV z*7xQgNww9bLW#7s)zvXsh04jIV=?*^CvbRW_FqKze(b^iyr`N}MT*FD^Lqa1K0T~B ztk60u7k*>dI@kU^9%tW=bfMTx_FFBoud{nnI#27>M1cy*)#ym93mC_^b9yCNmA9YK z!51h#DzSx0eOc2NMW3q}<+74TbI)>FQTRCSp}osIMhkThTU-^;&<2GUH>Nq^gTiM#%fbIfI8|c~wokO(EaG;}X|n17Bq) z7y6d`vWD7rsS=@`1H;sady`7Angv8zAr3h2gUafPv=ibhMf*lwM;epOl04>8LSh6b zg9$I=onwYg&@Bh%b-GA}CM&iy6TS-R)9+#NZ`jSZYe6sB5!Y}+0X=KQP*r;f>A z+kr)+(*b37|3N+T7&=fFbX4D{#^qSvpPU7z{YP1kv)KATdCga%lJjjWX;GPCfHPj+ z_Ey*U>bU)=Cav0X13aPeti6-QkJanQ8P>3>Wr|%18=e%qYYk4gb7NDA zIT;xe282x=m6SXDX>D%1`6fl>!Fluse+%t_-XBk>vgh)*^WFQk-3U!x7;`7A%!!vc zV_up1mpGE^Z;UBFKj8glW3GbQ6}rT|RA8-4?It{T;auYecUNF%<_;2$g)_vh)?cQ` zKuf^9!w=D^{`ITj@mxC;&MA4h#E};ajV+>b6ReXXpo{G%^#gL;!^BHZv)_XU>%w^D zHpO|Nd38(nl>wS}%ed?eA4BG9ysbc6+WI&b2t;WnhYja-* zCjF+(4IwXw+1x;-9NfS%9dV|;Tl6%##;(Q3gUZ=u=(Lk)m>+gsc69VUbmNj2q2R%v+B+C*fb%K>t8Z@(o_1S( zYPY`pm1VBE%FJ@=5`sWnW0nAQpwlh~)vJH~c+St%7A2ZwW0e>j=oOWNa`h*5{doOW zu64B5gNgokxhqfF_yJ1&$E0yN%BEbuk5^^`#8N_#D2ou~_B9|KLhlRNwp`wvevJlm zJ`_0SW2`ve5S7yVG14Wxsobo7;d=Au&<7VwOd1PL3&d08{S=|pHEUw+n4>YsE#RY? zi@*Je0GNu1*CMZTCR;l+fmVeD8_~3KEs7M7%K1U#-R-o05(V2xPsxJ2a+ zQB~PSknA`mwo@KlWS0|LG6@#yH!54#bRVnPeyu zr9wN~T3^eGwc0+BxjH4K`GynKxq(xMMcdone^M__1~zj2ZqlLdB##YI$L>b}R6mGPnjX$_3H|HVhjV$~DgE zaymBqjVgUzAGK{7(J?)MDe`NCzEz47)pPDp6Jtnp>i+j-H?aUGkouF~z=qt%)fXPX zRfYnZe2AL`*bsbReYp}J;eViH=H!IAGe6E7{f9TqFdW`gNP=J21FX3Qq&%kqanhB+a>kIAyz&5 zrej7}q5WZy8iUUhm2XphQ{&Dmj6Rs%UBqt7p}ysI3qvF$9N9>b`eX52dr@f~z=3#=Rs# zo)w(eyE@00ruoWC3e`RN&dDcrkg}DJu2nfWf@_p7enaT$wfi8?tGqdIbWPbqr3c?4 ze)UOMJMFYnHok>lYnha*c=10jn6Tl78>Ui_P@a*#!6K2UFzk$ux-%4pDQgl}!Y86i zTqRIqoR`0@kkFi3sf10!Jx_2|Iv+6MSLK#j)k2}|v|dz5FQFAFP4(GCVGBcem8nZI zeJ>MueN`f8wT*^w_{9_QlT0x?s>2#=!gds{XZ@~piSywIc|eX> zKs0#BwY&%UT=mCM{yWMu%2gintI>e#$hHQF^1zMcypHN@)oEoa46e%CvlbgFAMx7S zM7o5p$5IV+jVyAdkvL(~O*j1{;Z^9A0^+9_L?93!U-3c&jV;Q3_c)0cvHOIFgG!LZ z^5I&v*%%(+ldhO6ZYC9+^8taw?)0Btg_FG|*)~AH>kLV@eN*SDZ^C zs=(!|{G>E>4-GQQD|TV6x@yVEhsyuTC*?|5nIM!k;jHph9$MYbH3YylVGvwUZj}z< zQaE?r?b{49o7--mnI@CvmR%}m)%+p4$Jaz!5Ms5&(FGD-@sW>gHr{m8<|jY?NwlI* zj`R*pP2x_46Ja~AibG~p2E9q96KUdKLqS7>{7heJnOqk^=}5Oc_!@&G;j2)*;23H zSb+T37$o=nn{Fx`=iqtP0dmNXw3uS8w@qG!Ne1+0C<;o!%raBX+GsVlk&reBqTO%5 z{i0zKq8Nw-w$X}ggB;rER<@t}+~a4Izw1(YQ8VX!v&sBJRj*@iKYtnQgb-wvEa;6mr{!fVPow_lxi0fFOf56lJ^a zy6a~7$fxKvWgf|^DD=$dsHAz13!!O4VA>FhEaxDVHiRY1QT_!Hw9y-DLx|gVzx&-; zX7X2gD({LHLKxd1)%L&l{d)VV?O)e!{+un_4WGGbyT!jezkS~aKir;j#@X!|=lr(a zX1kZS)0bJkoj7HBx^WYywBsgBZYNBh);?{cjoTM(yIuR}RaR}MPMeNt7J@?$Ree7c&n=(3i@|1Z03F*dKwv?9}Q)gf{a%CKE?%{A}$?&Z9D)!|SCSx(ALe$ALM zBf}2T%dj4r1F{mG8M7Zh>F0b^c)BEqge?BWLI^bRJdRJaIbt;KPM60c~TKmzDel&#w(ekj? zT5DxRknj(F@PjFA3cO3gNF}sQ8=9w$R%;tA){J0_Ew*UaUVH5}dLSuCNJ*tGWl$MY zN`a8ob*?gu^URyx^rkjiFT?Q@WKKFkhDduiZA&7&r}9y`qvgWfeVIgefP80TC!i=jx6|)k|Oc z(tNKo&Nw5lQ4FPI;ZJ}1Q~TQ2zP61PWQHr>)!};gs?Xw=7KEqHN3XuU;)*MV$>-q= zd0z6M?i_a5VeQ5nZ=Cgz>()(9zK(1Z)pauF8RxEP1iksqZ%)3Ye6G3XnvAEQOx5KN zeBcB5jB>)|RgdxHZoBQ)KK}8KPuWp_@Q5^zXOj=%$Sy}bkloQp*s$5hG^I#PUJIc~ z8*3DJc5%SKldiQXrFLAjD9Rw1StLf)*{j&XgsbcA==n(Zu!}@yS1S^f-5+5~k82QG zH1`01|NGycgJIGI(pc#PVO6@8RLCQF6BRYPeC*h^b7o%iyH z{dvD19@wsQgEITOv5t^A6ZG%C>%M_=e%vP~u7RU#-a~hqX@h)(@MqUp8sVOM?rmoK z9gg2h%gyo39U;30m5m#abmi|m~1nmqNs!jV3vA7)ze<30rGWO&}gHSfmk;oU*_@~Y%TUWiK= z?|a|-a^T(C7-K5Nt13MYXHudiV_bC)Hs84 z5fK6oN?0fiQ&kOGvh{l*1A-jC5>OR|;7Kf0<%deVqi`KLkWlt-O2Imcx-U&KL#6d{ zj^griCAdo>ytnsLUfvlgm@cdW+rq&LRDvUKRNQD03=@|8@jL;Fmfmna35S1WV_?g3 zlzmM@to!oa0Hj6$d#185SPV60fZ)V4Ey6cF^yZsxN|KJq2ILswL?W{M%|0Rn&ZVU) zgWupC#VgIOl`Kh*ajb6o`OW*Djc3NkyOgYnF9JyNPy77PwItn0Z>0f2i;Eu%*-ANi zZ}F-tDwAtPp3=vOALI$A0i>}req1zg$p27Uk^bG0UgHI})^P5ce3K^AV;!^3M7ZL} zafNm;8;N`?(<%@5>)pwMas|rWSe(fj>UHI@e5+Y6o-;E|ofn?`60akfvKUSHmB01A z!s1T@jl9`2Nh5=;S{{)feuwk_VF)rHuPfh`0eLV6KsMxOJk$e0ocj*$3`@(|p0v0IG$kkv-37n&V zR1Ob{MC->3fR}cTkY4`sm#2XE2C#i}Ovm!Pmy`&RItK}=I4Uz_L{-A_FK!!+X^F@L z&-3eEf#163yfSl1g?FrD2|@{x#cO(N24T%8lE?0;!1C6)JXC=Rfcx@Ic_<5&Sxc0# z_^rihErT-R7a6&4VuG?yl8E@TEF7O}G~&syxVYwCzH9uh z#dIm_uIWuh*vd#+)LHRLQ-#w_pQB#7nJ3j#1C2GaPWa`_B@<>|vQGU|n-78%WM|k&=3k?Y8wied|mq+qYe#+aDBj=9Fw`9m{&)s+5z4_3G zK9n0SYJi&|ru<9hIM0AE>Nf?1&p~PeBjV%ez)DRnP^c9SNP)wn%_qX{oq5 zna~wL*Oqj6NAFt#Q16UH35*g#3O&fJtdMeM9${XF>|Ig^U>a9i;2N zo`JLxRL_;HRQ&vq1zll&{hm~u3E@T> zD*c?e%+@?s-Q_ zMDM}1Ok%iNjm?iVxTk#m76ypNJz==7zL{Y{kz~Aqzg>PsbN0EviM*c_*Jn4E4gJ3P zmfIo^^kgCp;e4rX>a^*RZedHS9!&JK!jG@jJ^3k5O_DOV9lU$JKRzhVc(_8D4C>f` z`%LF$Vyi9Qt30ZVtIVM8%TM{c(@s0(SMRJJt9+1MT`4D1Z6~tFU z3{}BEBAJVrqzaYJda-VX6l7!($&!q29(dmp2JbJw*)R1RK-qBo%HP4*j&COqt|O1X zUV2&c-2*MR_Z6n-fwbeJrFlhj*6SnQ-`{F#IOkDF=5COjO7e0l)H$cnCvmI|d64-K63QwWiMy)DW!BFf+5 z6TW(&o~kdU80wuXE#yGmQeWi}C}*VPQ>lZ`ljwjZ8R^aNxRg&($*$=NaT=<1Cv)ZM*HZsj2F|XC$V=aZZrS>H3=6D?S-larBr! zR7^bugMJFz@3QkMXX6CdU3Yz+6PC*^yS(|~4}Uz^(q!fx!xjE#HJr;zoXJO#hJa0-%Po+#a-q*7fiFA-x4I1f`ZYHc{mRY)4W34rF z8-ee9=iAMphaA*=YWGhyuaDl#6Q20QT(^-5L_S7ZC@N`@SKf&u|5|?H6`w|$vZ^?% ze&`uVSCLHBO#}2ye~!Xup3+M?;rQd5BMv{j`Q3ScNV~W75Z0V1dwDS>;$zN|KIOaN zMjK__7IwKF_eYhNaG0Lz|@W>{5)P_v}lS5Xb)OMK!i&7g%J9!%VAuhB8N(V=c{rM(hARSw#VIe z+bv%{Ng=>5*L@LV8pumU^1Ky&x?B=2UDDx2y7Bk;{~>?a!wt~aY$SrfDI0^3cirWS zXXBbnF21z+Q7D8XjySxz>E?m`5!qL{YTaCP;e{bo6G8zDdTUds40a6l{N%}lma6h$ z7gv5vLNlT@jhxN=(fTgM5s6EplMeEgi07AHYUx~%=yRa!uDfntCZt;V%oN^3e7ex= ztbPlFu#1~4sVJ(-s;fS(*&$l>U;5G)o2_2>{D?P$8@y8-ZHA}CEIdl>eh5FV|L^}^ zmGURtn%SX(QM3m9^n{VVcOa9F(jpDwQLm(PoplErNK%=4KJR$@+nZ&V84U7o^z^4U zZ;#(E+Is83R^vl3NS^uRT>7Lb5-u&`(P%R!dC#^%u z8)gUToOI%eIiuw_zx{3YPUg(MGq*o*p2QLU)XB#_?s3se*s|GVmcP%gODw)YwuOz(OG>MnntuX<%nNM0+$0zX{JbjKBhgR612b7|2~ zan4`$6ol(ubq*j)l+f1&!h{H_uo1b3JWK#3uv(nZO-vmtu_E;hICfu3cw9jooM)xM zK&EMPralUbV8Y1fdi?)T@EpZp;2BA%(DGLqm@awQWmg0d{JPn5&pnzieDU+m`4^m@ z+e<p1(;GCuNWA+;h)~Jl6x6*gWlNPtWis4vjM?mns`&rzO8k5Tdvr7sS0hlS*7G z0?&ZLW#fQ649U^m_uQSPN7H4sbgS{;oN`0JpduM#5*~<~Y?V@2;Snn~uX^=snvX>z zWR2BV3t5`o+&Rk(p9pJO5MexLuc5#E<|l>Q>Q>r;f|rYNg+`dhkyV3&0e4XLUZ&n zKX0zT;il#$&5rjI*32NZ^`qCePAKh~sWlq-E%$JSa#7cOLtU@aZ+W7u^%%|K z^I;>69)r+KqRO%Skpt(<`SM!XR-XFJk&jX!bM^cFl@9fLyF zNZob<&jW$-Kt)D-(ISLTM7lFtOeGMNxGpMz1UStN0b4N$TZJK@62^I!FoRa6dljZI zv}*0yPHA~TX&M<{kNZO&%R9nXW;?%?A4P5U$!9SJ%VX07+WIFh3s|82*dzFac8 z)bxQus@}rvc;?E#Uzu*Mh_L>4`QLK(l`!N5lMDDQkJJm(uzmGT{N70#$$0r=PTDeh zKg=y=Kgly#e)(lWK_Pf8|9hJmD?FlEYn`>zOe1d3#-HJF80RJgh|}IQ%zSpcwS|Fg z59EhDqr8v`C;x<_XX80_QN1>mnDV21vUd`BW0sgW>=$+XamO{g?7VZXH~PVmM-I1a z-8Yusa<4(I1+$TUC9ArFxGSHJqzVRN2dud=hXgf$($>7lVkewcPB4`#}m z8Vc$_DTS1az{vcqdv)KD{NrkMge+K3A}(^OKA3J^3WMD0fvcl1o*+q(0_Q=iN9(X6 zRw15#|yeHgTPURCxE(9&JjovlCZs;4}Z{lGS|Hx z^M^8!zsinTMu8&^0-@{ZJHX5Xx8HVq_6W56ODGER+O?~%xw^UZFMo}4G#hRC=8bRM zG0R37#lTJS!Of8$NQGBvBY{E91^ z%R;^_x~plR;;(nf^EjFUN+H?^4@$972q2x5t(Lek5Avza8kv*7uBMxS{X;Y^}g`JkYm|;X1;>gxv{4`K)>NjHXj`BuhP5cI|YZFWU!TYFF z6qB?uh2`3WxNfkYiHak=Gu#ycaHwS zEvWZ@ID?7L^i%Sq9PFX>sZV`sxaTHc$+*_KawAvP7csM|ukI^1*VR{kvH>+D7b6`E z*U5mg#?^k~Zlqrj4%t>`$cyygi9#|grJxG|5~_7R+(HN#RHMx#i1uNd1QC{C5g@;d zv?Y{(+R3@q%{3Cvc>#j_vX{Lq*EU$K{F%>uCKtlU9FXDEd; zC-Ml9TKuJQs-*Iwj^(6BCDz+k2P*v(h<97@5i2w=c)|0Vx4!LdS%)a6Y14eFa!~2# z%(=U{`IcJ;=7snTnNQ);oaH=_w)}tjmmJ`&%I}_5C8eYeyT*y%m#woh~P1)1^*3~z#=(m=j zUW0`iW}P4z5U0T!Y3r53{89N+0>MtNrBE$#<)cj4@%`qnuK8WcqV8RH?RB{&H=;%M z>qQUX&2N6wV9IM7L=lTBL!Wj6WRYIZ}`FYl9TY zm21)=tPg&}hfSvGg)ews^T_B~OpP89 zFq!#8D1TOcUm2CyOrUJ7dx+~`%{A9Z(}D^tE#l@+K9pI&HP8^S^$8^j@{-wz$pCz_ zLHK5X*-nGb=CjowTTnQH`{IZlAO1{o~fbnj5+mM^ay{#g!|$i7utb2hf5-iYvc>6bsh;y zVkB3l?Ui7I3M2hmGUP*;r5N}lPts0itZ7+hnPoH0Ofj?PXsuh+7YbqKoy{qyoSOT~ zs}zv24CPbhS(=Xgj&!S38UFjX7~f=obpk(kiUU=1DEPenX=SbjWX{o?0RmR z`wR#v+N>V+YQ^4Koc*RK;lyUj5F@-|L zLSSognTKc)=AMcOi6ajnSO%=RiK;~M58cEGs|G#1m~JhFU;{l1h$@_F8P+*}D*CRw z?wTu0b(^)?^k90-8&z)dlT)ttMIwCeamoi-ArS=f#y7s9c~i9hne(2t*|VCp*IGM; zdO|K{8kGC*etTY;J7C2ixYzIS`ew)I**$Bs&9a4aX|zOzJ#lChQjY<{rs*cilq?{b zVWkj`e`Gjk_MDv0?PE&hM*8z!q~CLn(p<8}LCFo$)UYX1<$N4pIMO5R!@mFh=Fb;j zoX?3n!-zP<=g4JT@l3vS09pG0kdMoxzd)srlOC0rc?_x!6`b+sY}&M`8MbkRxY*bP z&>;RF|M;hD5sJUkUg-hPQ+D1Ds%~-oGA}sSB2~_2MNy)aKC7Dbb}HTEfC8XIEu?!x zl>NW{>+70Vzvk7=22UP*=*m>oR0!eUc*C|Yc}cT;kcVfpr_p1+AP4fR&dI9skiXSv zs9r*qXdwkQ^;;?D^STwfoKe_G>=>`Oi0R zecM};G_vf2kcv$;>8s*aIw?lylS2{6i%4R$yxW|PYTD08_XtURzpKCt! zp$|5%f8Fbw_19ZJ-&=VYPe_6a1+(^AYc`W7PRd?`H@mMCdi*meSsW?f8d=Jb>6KX> zk9Og?a>~ea&T+E(f}?RY8Nltra-Tokj^q8t`R+Tfx|B+RN8~^wxoHs3w_}|Hg+Oyj z7{Bi8f*|eeYKA`vtFTHK2`%Wd(?s?$;t&)+r3gSG33zq2gag7Rq!fb8k;bZcJ?0Mi zS5Cgle|acx zWofYAG)geDM>(vp!g9^?wtQ|*aW&0OvCX{G`jk7OZ9HhD`-uOna2Btn$tdCM9zx*q`#c|oO_(}Idg2Aa!)*C%ptnbS6tZ~eCYR^1HW@Xe$C9b z)mpyugKtf%U_dsRkbE`JqBnU}6$to~KP9suEz)QOHRrb;f^m&mv+rt*xm<9;`OW{F zcw+OHP=@ov%&6dc+u{|!yjPjUq0zMW-g~DxPY*#{dgs#PzAqWdTaB_;z4BGf-e37j zv+D;xkSo4RJx-ZCDHP{X%`boPi~JO5_7dVcrTBsuzMxrc)yFndqY)5+XOVSYwZ}gJ zWmQM68bF|t!K7PLuw5@1Q~p&4>PRls72J%Y`Ni3|yC$0Ohucdj;M1D2Uh$6igA+N2 zs0q1+E(M+m8xxbnxUco3A`0B|^+KF;{*Vs85^YwIR*W73KVHCf@Vf+@5V|LfG7We^ z*K?}l&@(;ejcT>Zf8_uMVwr^GA(B8cwo$ff{It`~Y99H>K^M|=$-C~lHwQQ0{`R+K zi;_+9fB*5n&FQBbaJEb4U@rAN(F-8fOhk`<)XL55Id?ZpFEurUaGC5Oupnuf_2VE??cPia~bb^pmK5IQ?Z}eGPm71 zYhb^fGv}UM&1{XrAOCbg^QA9+xjEykvvQneez^XI>(eCQJ;f)lgsFU)2Q;SCMc18c z1Sn%lj0sHT*W3R57xrq_Uw^$^JSRVAN180`yW;OxH7Ec2l;*EidQ-6RUO5OI@A2wa zzb5M5^k&jT^-~%2J@thN` zPeTFkL#1PwVclR}5D{TvgOsp})Iz9gg|JoCOolQ!LABOEqLH}YrqbCMPZ!3EcJI{~ zfoCf|nZS?V63?#}Nw0BjFqL!m zY}=Vn%PFlErERkDCL_uq$~yit)yxXNTEWWKid`*Xy$Z9H%-8-+^cD$QeV15|!SOyq zyl)=1#dR7Gwv&+7npRnr2CDH=@E&ZVHtqZC->zuBbHG74lkM2(b<7${^HS09Fr&tF z)A@nysR!cs&K1}9zyJN5AfaV$iYGq>Y0`l49@6PuCQqIiX^X~9J5XZq$=yGbwtwHQ z@KGXDLFWhK4iw**{FCT5bb!o|9py-ll&yOj1Iiq# zZu864IW7j=jH6w{*|?h@&yj1UMDe~eX6h` zP*Dv~R-(WQa9&d6Ud->ZTS+NNo=^`)6%c4n(uRV#9gL&-t+z?glP34Gotbs_+uYeUQ?rm z&QvmfLMZT=zNR;^x%~1gnj?-pqB-T{Uk4!%raGojlZ8l|@&!brl@HRX>Dw+^;fnem86tz{Me&-_c)a<0^J^y*lYhUx4>?Pd`Q%?i!5RuOUSUr7)Tci6NdhHOgkgpc1>mN^ ztKpVqB*+X56+wUk&=T{UbEpJXr68D&T5%GT5e^Bk7XyC4ePKb_!;nMy7q0V48`ooW z$aAPXl7I59%Eb(ytN(Fznh2~T&})#dm;CvXW|K{9b8gF%LAefkYd+67*zUx_D^pIR zc#`aLKsgjc&Zr5@jNZb)&-mu=S60mONYF-#;I5sq@N zvPZspG0Zgy%SYNd;yqped#X%}ua4^|aHQpB{ZobMV23R!aUq`NZ!m}) z*W!|yI|g+RIN-a@4}bW>lq+P!Y*B8cq~1 zg>}~1;m(TmMcq+R4H%2P9a$%GAjNzftZ6 zl7kYWVB$i$LAm5A<{$~mQiNiv)Yp%U6!oILM_uSt$r=EUBbK2===J}uh{Fmm&n{OGUA<~;%#qJ$J zC2_T6*l#xwU*t)g28E_sWZCEiZSce=G>=$eMoy{aUu&9qg~^1O&0bF9#!qZ!MLGuW z8Wkwg=PPB>dVBPc3~ZnGhd)N%o!*>s>gmnd=bYPIaQ+3MY_Du)-FZi}&gbMxU@i2! zg5XV;9i%aW8W(xt?IU{k>m8&;l9Zvmx%!&xn!^q|y!qyS-)c@i^|ag~Bd5K_(-S66 z%I_U0D~{>PJ7gJ!%j@yS26*TH@ej>+f;_%=$idCb+iz>`iL`~r&OFi+^!S0`P;f2jFfBCEYpvc$v*{8YeuYXOGO~$W<9%*2&rX(V; zyq;Sv#P9mz7s{Swcyj34U2!p6V3A+qZSS$a(46L;aA|_OH|h@M&9T4uRrC8$L|6Ue>gJ9+XGPk^=UBktiKy(8LZK`7 zczE_*_oTV##1oEh4mtR{&A$75t-1ZSTcVCdhKO${U*y$F(L31eS(`Ldrv#zM(|9fU zRmZ-Uuy8Pv+p6AnQGP~pV;6qoVw{Yd{l?We8;7d*dJ1~m1sh1>eBtv`TruGzANj~9 zi;TgnBOhl6kuVXlJ!!qOrRtvOzSBM;ws%oa+G7(6nNzl<6spzWV=BJCjMxzfh2Wk6 zO^zw)qKhtW{{HtXvz3mxXU&?KgRjWPRMDGmx*=Nc*EE;^?ec6DfA4$WZ@&7~uQewf ze|&DkjG!_NdYcgsF{TitC%eLNO}sW+)57OB#~8RsYsqC2TwHVBU1z|~p6?X0$$!q` z339c7jl2qv9hH3QVM67F-@4ECrrBeUJ@RNBhkMpYSchS&@2YyHvr2>Ks*>ezjxRB#_ZV(z`{a-U4SGoHIEdMty%XG-38 z9PXHTdt?0xWuQlO%uj#XeB-^Y+8GFo` z6a$&Iw##G#GGW}vj??ZbcN2+hqhY*3`MXZG#?72Lvn6N>-VL*lcoql&_|liYlq-b&eOyZY6Q`W1H3<1WNYGs)!L@L z+OtU5!cZYR_p_h#C6PMS7*nJMp4*Aaao99YP%qpnKbBX{0;rth3sUHrl8Sp(VlX zOJDlZ_Tq~#j=FkJ-VdeFh9E^<8P|ruw&$LEZX1C`ntF^Cgg~TIu2I-SSKC$tz%@Ad zd*5$2e%7cEY5o`FnEs>-w1*&rDl- zxpw+8%jf-O!sK@R(6jE38#giiPK&_=nTYC7n=Y=a>8BW*5 z^TTO~^GtjAt?N@FoGH_$w?SBK5LX-I)`oJ5dxOqK2zU+K)ayjwWu|6dwMxXDwdwL#WdpTxh+GRtU$ zW&PpQrRA4jzKx2R*QH&(@(lmp!MjYH6k$dD@>$+GUv|cdng0_ap3IlHK7OdYDv!s7 z|9nPz;y7VqR8ermXqFn2NCTJkp~TC*I9B z-#ll9cu$i%m}#`w+by>=cSd+jaz26TISbE}m3#sD zqCAAb>}I=e?^rEE=gM6Ec!n9O);8qx5wA2zS8)XYJ;oNu@vndV>#Q@%2S=;l%2gRN z_nJCgFnbNxD^qZ+a?QU4#08FE*}l49jDd}cuy{}fbDxk97SkI`=zEL}sJI+dIRRoQ zA$ZivkIKrg%ze0>`DJ{NhVn;1xj-rWQ5yUpV*BkAvJ@cX5YGLwx2J*``pq7X5NkXk z9-?uQ+?io~v-m~ZY}4$q*Iv!9e)Y@dxZ{4_eD}KtH2eJbe>Y$G@>g=Bw*UE`6Ph0# z^`mB|H@_*;yK=7ny*-2*Ip%3JS!u?f9(pGq4YEt@ zTG4Y@Ypu0&_4jqxUYqL;t8Rv!Wd5?z<%1z_l_^-(Wej6*ZJ&BzpT+@p%fyh1A^p@9Nd+p(dQ_4ml z%bHT?RtAoM*cDO>N@X#%$ri2zmyqa+_;9%U6o|nJtTW(8>tsShe_F2#6qT#{(LYd79xkHTJCzVsA*}18e zws0Vi_M@kKkQ|duiXx6q585Dt?NNlCW{4K|{Z-V&+T>&U_wn(q3sDq<7#(mPg(jg5d+d zytDYEUpmxtX<}ATpB+6{`6JBiX~eb4zaC=)dWqJInF_8EZw-=0NPVeLF9Dw$3Q*SS zolk_?B(Y>3lxdc)!gix>3WQKXv*=_lZsbm5m`NrWE`=`dY9CS=BkTK;Xv zH)iiZi@h`lC1Bd77CsQ8Oon^m$0sb8TW;BAv(28>y!2%+Yo0J!8N~K_in->$>Pq1WZ{^TmR)w~`~unb|N5`Zv$xn{ zFvmOmXIMk=gWq1wxP^UZ^inje3KT>7iD#?sRT@D2>KVJf&G+mvR^J~{7L;I`hr}0Q z)J!PXx%3w<-y@uIk+wlRgLiaZrm5-yaO}`pke=%*Ehs-d7CpLLs%#3*aj!*b>I2|r z9Ibqn7w)b->--+dxsXztuSMS z5a_3-P=oYT92sah@2GXnPVT;*Mai|Jw3RC*p#@yB4tYP0BsNzI$Lr?y4)Oc;+ic~1 zdp=89@mJr8NEdOGa$y46^jVt@n^rU50#z=4*ENs^&r)htUl25)sivckh~edO}QC<*(A}yz;B!>al2$WjrKX-Sd(k z+>3*&yfx@?G~jHeB^>S$x+EySYbvIK@w|}-BMBZxohVT`76I1IG#P2=~F!f z=fh+aeyX+VnIhOCt|vWtgJ$a&zqomF^h%JskIYP)YPL%VdH53qF)R^DVw0Ts?Yj=P zkApP+! z(d+O@PYI&DtkXIE#Q$mb+4t+Yr;|l{lotO|BM%(?M#@Z9dflKds2}1hVs&2kq($6C z)>UVu3rX9<=9wEmb3oSedMFHOcFf*DoV({dXCSGM(h^}wk8@jV2wR-SD%ADrF=$jwHAwjM5g<}HU(NfT0tdDcCloa)+z&mS7hB|FGynts{F)>lW zMuQf2l(pSVZ8L3(W15QyQXF$7aR_G4VhII-WR{NB2nC{COW?A#jGzJ~SI>Or#?7-f z+ccDkPg0VBfgB|HI*r8es>9Gl1et<8dGds2N|18KF=5iM+zH zObahi3(F2a^6(+rQJ30fw)T%Nw?qbR~-?i@j4DRc+v*VbGCR+5?oFov(ye2(yKl3o+Ri62wqk!>2?^Fm*b7ainvmqY7VWq@;W zFAfHE12oPk2fl;@lvC&ygR z5CnomZwW#%PaX*=?=177a_^cq9{1SCG>?i_^URsEQa+ZNKDC(>Jpiq5zLUVhIhQUw zI@I;hBY6ZSoI7s6HD|w3K4ejN;CG&fXXL6Sgy;~Q75F}CV{(KRlM2DPXR?In{8nM= z8JpKl3Z;4PJ$Eq#oKPz?Dg5trgF)to)Kr6X!4CCjN$i>wCGt~5f$>r8*j)k zRo;|ckw zLAkO3rOZYcWX*YTdLhRYRPd2E2q;@-wPt7|N zf_m|vFKxd3m9OT2^||Mq+bkX7E1^{wWF6Hd&v5eBd+2lizR zKMI7hWg?pw@;qH*c${6dZEQBSt;V+9*l64|ZfskPZQHh;rg39U*x0&nzI&hhf1Wur z=j^l3#@cJ?gOZYo5HPPi*qIo!huT_OJaWfBb0xs&MK?IK*v~`#$(Q>VlyK`Znl#t8 zc}fnVjPubI-<38}XZJseft3#~a3+BBaAipsrR^&V^Ay3;W%)bOyn=1u=CHaB2j39q zT{BrOvV&z;)$xyassaeu4|)V&%hnJqYM8z9+_fLHotxC_G=Gr}<^HVLFMsi8*nSc+ zb{s0mhdXLWHxB`9H3ol9@7dhvm%}FG}v<^TXJnXbg%36az&mEKrfry_GWx> zH9ie=VOZga?sJ)SjqegI{b*R1OJ_doa=q?yTUvL0SG%5j=-Ti&L9U6-MfK*>C)DVP zkJRVPaveAm&D{53z*FN%iF#1b7_&nn+uhnRbsT1{);Le3ULn~XE^fbVp!ZZiXjAM% zDveY>9LA_@WY;1EBU{j6HyQE{n6|ZUpbW3?o%%_0ZMq%`-{EtQgKt^D&D8xcGxb&I z>8q0p4b)&afYGpf+wD5HO4jvhLro>=Ffs*a14gpVhp*W3b=w^q4)7{Kh$Jp@f3%Sr zpG4FBtxQWY1ri`JnS4XR0R={>{pQop)Y|^mjD11um}s$a%@gAY;N+S-_n1c4RPaX}# z-Z}@gEppahE~KP5Qr`CGwjb)7CELqGi@WI(mc(oRMca9qG)!^+1yr~6##S(fprzpjMg4u3t&#t>qyFFBH~2@cK> z7v<91(%Ya(M?vvw#CUX*(cbj4yBIkvUykG~6L=ivwc$+mv*_}qZq}Gp7i9!iel@-1 znox8ni&ocg|2f@f$T5y9VqF%8M8WN5>-FnfQ>Mj+kCdR@V%!-Am2+{Pj;2v`>f>7> z#BZyNuqDJYK8q>aY3|+1M&EY^$QNKPESW1_ut&yT?6RoSDv)HHRFu4A4{yyii-BC& zG5V${ljp<+8IWnp)V>Mbe6RZ$*JV>s6$Qx5K+WeYP)(-paT_9bx_E^}k=hOa5c|70 z@fCFr@DyKU#eiB{CNHQ^GZiQ~2R+^H7Wn-7YxHpEOy@6}d5w>95OJZvxj~^IHnXy` zB61o#(S+HIp5pO!?9PpZ7&AqKaydXZTUj_U1&dlO-Gl$<=oJzT3{ohWQ{?XtzT7o* z-L9K7h)uoW2~%mi<&B@MI9ztXA-2Uem_{RNq)v0>lX$}0stuJ@OSF(>d0mZJ6)YhA zu4gHdsVGCYt}xbj>S3(U!y%!!)%z^j6yU+2LnBq4*wqhX`jBAhOzgT=CxfWuJ`Oz< z>bl;P#_24J4)ZLOugGQeYY%ws z#^Lh)DOOORq(C00#T4bfSW=t)+kc+(_E2&#_*rp$aOR+8o7p;+^( zP7^dy^T4O{$TSdk?ZuR-R9<}%hN)s)(=e^WBha$wmiVit^X^Ro96AHw7+YhP82vmR z$w4v|hUR1FO01*y#s~fjbWxxE$t)&z^S=AutUyekOR$hs!of|$p?wW; z=(P+Z6BUDqfQQJE!vArW?ODx=!2DC>cQwu`c)W1Nt5@HtD2&~Tb*wRcVqu6O zu87nu-3{S&+-X8pl>~}-o=SwQ-aL*B(?|V+=<=p3YN( zL?#~g4x9J)JY&-`M&Pb>_&#+AEtv1(oCmZW)H|8~)!|YCn*(@EjN=NA@^;e!PBzlL zgJjG2&BZmx>#C{SC4(hBOvhp<-^DZwu25nZH>V2`7%otzw+kD+&M0kf9?P$|ft3rM zecGLg)FJC4?H3wt`ruC+6HVivNp|Nclq3$<&&Tay{-}~G4Jn}Q{Y4_& z^$}q6n)<>dxey7xP^m2J8*MO?HYMaG#p|<))#Z00O1kd$XDS}Xm3;|@w8V z|JCV~*=L2oeGer)L6N_#jSfRx@{@B=)X%Mh$?QLCZUfO}erJDfmeq+qpW{Aap4aH@ z$G$k-yj@8Me&H+YfF6nu=l^|Gxe>s>XGihW{<0;8OG{5s{twIHFNC~F=1~|w+kKv6 zME0htA`hj|oSl519UG$SidhQ7i1AhI$(9ZWD#?_Tx)p|FORoDJiH&N`!A}LvzmC3O z;k}78vISTJsjF0I{gg&8NuTZl8ZCvD_uP}v`W&b123;@uU_c~*)XpSUS@5BtFXZg? z_(VgdeIoU*+Kdu~&ozkK1n4)G)OpLC|&q}5VJ96oN6om>N&1g!uH-gGC8=_u1Xwe5oGoh8vaN_%hdD6WCf)A85GDv~Sg0&54f~ z4=Kw)bFZfsLVTWR8!L9_`T)rl@ERn>cABrM+U}trr5s5!``?;BpS36@2)*MSzmy6M zEloJ?s_3meiYot z-4}pneE=eqiHjgU>%~fAUjZzny{?yP{(HVKvYDhYfc9s_w*9DB+u(Pju`6$I-zYg$h zwX{5s$|mkIw#@vn>v3|)PKYFV+ir);tNja*Y?7bU{j34tZ)YH&_ST6#zU#v(5#qtX zt0tgfFti{TaC0an#Jgvrm%IW7Ll9>M+scE{djaEYe{T$6Gqa(6= zn!pu^N*U!+>2L5ho)%jU93M#rPvH*H)La)Pq0G)Q%YqFdCVlXKW-*ibaC%sgs$*$9 zDo06ZxbSt6>omKHxBqK@t~MXvqirKUVwGb~u%dlTT&#|oMtYIK?wOkmt}Ws37~#2( zxpvInt--h8BK&vRK*AF9?Q%Iwte6%7k`1L8$y-I$D_#--k|(wKX6}euNFVS1sv+ar z|9+9aK}&%Ln0B28dhY4pc+@wn)Y4CxKTO<9hh)Y_$)9h z6Tw@gD0k)M6wrkX@kNE(@`x=L>m!c_7fkt{R=}?~lYZgs!4OuFZ#K;aNPc(-(!P5!>z@67qj?)vZ_-%P zZk;W)bPyPoYcDVulnxgg%`xTO=WZ zX(sXfTotva&$~Ps^b%jFn!6)BjzuP>KA578vmI{7R()$1YD!z60I;E?(lLeZ?r=Ci*DSu zn)&{g;0{ZJJgy3IqCl|XV@7&uC8K5j4U(SDl-C|GZfDJ zNz9v7!+H1f0VJAPwV>)JL21+4IUURf?Zl?xEXnLnR4kr=@d2VpvTWauxS6SM4KT_4O>0b7Rg%_nFMcV$I<6ke-o`CU6nh0!L7b-d2JGPNbT*xa2y!487TF)BcVAkjtr`t7|%IQpF=r|B*E5}0)~)*R2XGy zs07fqCQ;aCM>uo1UfO(>> zpLR*&ezlcm&wX46-pLJ%R5vL$S}sxCQUQlAjvL(M3kDxWMv9e+;IC;(0ag(KA}^M| zWs@HEe)D_YEvy~GvDV`&H=OhyRdT<{#otENR#;JffkDb_@$a^u6?unIfzMd)j7t3Q zN92l8KhT+odww1faKPp{pxeICJHlu#;Eqh}b=s3@XICRAQ8J_p`%(5H;DCNT5yTG~ zEvwBu0T5n2pip_;z3>98hLAWD{RA$Z*{go%E|Y2ZS99MM*eN2#B2?~kE%&_^{%_wP z&eJeichEEsoc2;Sv+3E?lJ!Ap4+%>m%eXVj1U$p2R>?4n^lR=THY-}Sad1`-*)@!) zbasQf4%nSF7P;g3BZ0AW2+Ae5dlwZU8CJzug-+n+?o;@UxY%mpinQ z01`$;$|Nt7aP3SvZvabWHKz<2nL1Be%*PxCsQU{YTSntTD!@MVCp1_--y_fC@HgWf zI+htCG+|ogGG!zVtUekgM&B2owG(`}ORv@L-E1(m9vdRf!TlBsdZsF!i@!VN++%j& zK|f7fcNnjv4*nEW@OwWA!=+|5?#R+}#?J2K)QJ)he|gBAf}aRQ&m^!Nw^tIzetxI3 zyRF{9FGSc&=(8U@FSV$&we0#zbelo@4@my4ZFAf$*yu4}DdPhVq0`8t@T5w4zrz2T zOC+}9jM&7ixzW;B@Ym_Ew^Mr=EuE|ok%icn%J$rK7#C~394?86iWhS_n@-{Ej>o74E4sBcrh$x|I$U*m{+ALDpGc zbDaZGCi2sqNCCa}}&7IEMJ3fFavr7>B@pYfscUpa2 z-U*y8J_l-wHYcL|@|w{p*FG9V;AX&zics6U%C}aj@xF-Snxm z=fq(kTjefq?!Z9~1<^Y}Iie)F%=pGulGzPx#dzrpHd_0L0ntsueK6Y>516t~{mkGK%>GDY zG0F6}Xm72p=BO@`qoEonyw=qV{FiV_mW#S}uLomF?vA!a^*3|(O}6&w>*_;atbVbh ztmE|iQKNBHcfL=xjr|Sibs})<&d_wWGccZRJIOXzEX)6Gg2*L5!!^9|d# zD6bJB6ehY&go3f}Nna$YxyEA+!2h7qM?DRinp%JhKvNk|QU29QHAhB~{zu*qB`Tgw zf1K~RMg&L{*!+}QMWw0#D;ZhP^>kd}B%x0ep|?$-|E7m_>|70_s(w^EUQ}AYD5ddsMTh8AyFs}R$+Wnhp6rW7(gjv$ZYvVtMUb5k*fs^=5?@Dp z7LaD&0|Qie(N}i|8Fq?7tiPcE|z^}hj2f|#d?5d*}b)oFEWj#C=I_-(^8wa{;Z*MtJc4tpwXYnVwyR*ilN3$V-= zbF#VJ@t=nhkcAw(Is6aHN|0WLI_F)~p611@0oHT6=Laj@27*81?uVksg9fq$?+U$M zhO4--?3w-z^*y8!>;SD|Y^_fHt2Pp?+&OF`I6#Ep=40~wGyPZda;*zfd4HjGf`To` z&!?((?Q|Km^Aj$lryti90p_anijYURkst#Y6ezPo|H-Vw=>D_E{1@qG9Abvh)a6QR zdgy-3;OFU%(=~#}0rHGx1{QzcPfy;0uX-{gQ2`0AG6?V_$H2y`ECM>=d+05$^`Cz_V_E24=l(ABNdRJ%N%)6X z<%-?p5eE!?RRvc#)$| zt;>p<_`UPM_wJXQer($$;-LF@>;yzAL>qU;@~El02=~Lz@s0f(&3h@5aCW_WpJV^t zt+sa8_j}y%-_=t{`j45|bWA=7k9;xl>CZ)c(;?@SJG{Zlx$NsT7BoZck}?d~@TvLw z765Tb6_K-TG{@rP%iX$-S2DP9~JiBwDfjf>w|QjT)6&0I_tx=Zn+ff%m>=yeQ!c zowL48LhdA7IV-ij2h@)Y<`vtH%;e59pcVeXHJTw+-Kerkah;GIfFvmDmbvLX?LRPU z^+YHu+wU&;IU5FYrHv=3-L5lF`sZFpw3qGPd0XB~G-3hW#oCtO1zTyN1L8S(PU&WV zqX9C(32xuzF5xW^v^5em{I_7-2`+1XpIdgIvUY$sMXr$=A1Q+tbW7G?F%$9WpTc{; z4$zUy!0z699NDF$>U#mP_CoIKl85Ie;K`O?HZ%KpAsx+-8ksQ+=uClNleyI&kOPLa~Ddx(1 zMyOT~Al&w+=pO0!=O<1(SLgJAPoDZL8c^)D!cGgWYbo^ZJ~Pp`Q>IEqeMC~J2J0|Q zS?3_u13KQBc`rJY669L#5Y{I?+vsFjWxIwictPP?lH_)ubFOw?A3cHXlJ;gFIi-5{ zwz4Te%Gvnwa8trjA+%wEJpvN<^DMZZ4f)ne9fQw*6yEkp76RGI(uPjgNe}BCz4qx1W!M;*Lf|Vf1_O-z zWes!D6|`iR;eKKDJf04J&b<@7Y9iJr4sRL5dPlc9Cs>U}7hw^m3Eo85S%!En1fyrf z2ppIcC4RdIbsB1j9l)oa!#VuIsl1oJhRCU-WO@&#t4$+yJKt3=CAMHy+P-e`TNHOo zSPym_S_&D9#~^F1OmE|^xn=*9Z7ssYMlR4vWM#D)k~-xVsN5^KCs)geD!KOfn+7CV z0&3wlQM9?7Cb7d8b#*2Gv$-D>;nx9o3g0T2S`Bn6+0A0>z|4gqG=>8N@9JXr10?7v z;E4LvyFG#ghN0&tY$4hAyA^$_SaFUv6JDUatJXY&HTDesC9MxzZZW-v*< zrFvIcuY8(TlOWPsVegUwd3XpDng_MnbHQ56XfW_vLY(EN%jQnzVe%e0!UMp^yu`_# z+G4G#=P>lrxtry>k#@huxA~}O;3|Z^`LFq}?HLl+THH29&_Z;{$g*EBGu8~vIq(w% z^!xHlY;o`0Ec2q;_t6+pNLi^@TRjl;Rbu{`TqRY@mKZEuD~=SnYSz ziN!AUZs2?pF*_Qs@=$XVMHZN=r3;jAQBh^$Wq?}NmHx_>FlfC06Kl-R7&bJY=)dhQ zFP9@AH;6604ZIO1&d_f^JUNxU6)j~3<)akk z1vxd%K|3_wIW_1yM7P5`9LyGUrITRd24eX#M~o1&m4i(HEe#a!&=-kN1RAM27-a+0 z>xILJ!*YSu^0H}b$}7gpkEubK^ogRSjtn2A_lR?QV&uVKp_grx3Y&)t<8iKWo@oBJ&>(A1LNPtGE!^Ti3b>uCj*Ugum;VyWif+(GEFMN5(`-?_YmS z_N=jz+m&e*#R^rXWd$nOI*|3GefBtHtPN~G$MqqU%D!g4CIDO&O~Q8x7ZK>(@t%=o ze^y#eoJaf@jpp?e^$|}7f}cFr?1~jm`+g9&=w8_Vz64fw^qEJ3JuacWW!Zgo-AT$F z>l$qfb$E6@n%?@#42|a5;x(OD<85o%AtsTWf23WdYWlpx8$9WTM6Piw`43V}9ETVf zLHqRNkN2YcYxhx1iJk%;H-}#|{0rE%ebl=a4c z1nD|3R1dWwWT0S|tK?>#4%q1$q$};5ZMe>VmD->9GzIcGoB0+p0V86WWgBNa;|Km`A@t=t2Fy9xsgrgbJ;0s|b_&Ws=RGLDp6idfis5vmRq&#f9b zCK|NTnJMO=`p6ss#~&bsk1+xi7Q% zUEdCW7mR2@$MmcFb=YgA{ISnG;YPXN7S=mVPnzJKJ2uM<=W{3p+0)q$)h#l&YK)s1 z8|T$m1X~L}U>Ml|59%joBjVVB>J!-!G~PZy?@JsYd2(Q#trYH+Mm=0sXu% zL2=x>_pxCmA%*>Q{G6411vTQX(pJNtvnmQ$Ln^ioQE!3cY>V~3W&V8C7PTh+Jel1+=7Tx~4YZNBPg~!p@C=Z!Eg^D5Zj!o8V<()t*n6^E!1MYUH5R40 z)s7+?+DwifN;&Ps=i{gun0mF>hbzf#`5yNYRKK*wK6?p|G-Gn3aee1sQvB2UIdo^P zD8+ym&`edq;=}^(#%<$W--HwA_bb-XO*tH6q5VYFUoVgMD%~5Bs>#C%#+gT&MOIl$ zu>XC1lrvyS>Z;ccX-+Spo1Z}2f&^g*4rI1_BV2RA{(PGc!(3D;ST*3)`pdg;waU1Q z2=?gujGpTRR1|Xc(TNSQ0L4q%6tmA|VTu}NOAw6zR7 zH3UVbC`)O+=MA9V(xPqCw7_aI*|i{0Kc_AEU^D-!VCSJaJ=4@Xb)f8`-Gm)x4|tN_ zCJs=@17^+TwE~;{!`_&j8qGU=#CcOa15#ANsM2g=ThDjCV9>nDmx2TW1r&ku(G# z^$9MnB=%xzJQgY(FN2>oc2~Gwfc`H*w_QXzifm=wFy3QltO~K`X`R(~$DVeD|Gea) ze}z5PzkcIZ#1gQWzd*mi5&pYFp|cKP4Lj0$;cT>VJ3uAQOtQZX;qR|{;6JT2w-@Te z6|Y#fQ}b`bO#$Idny2f<`To=Z2S=pPjBWSh!Ae1#Hv5lT8U`4{<@G|q;%?kn{2T1C z8{&yRDGq#G&29d*PzZ-Se@h??Ir|mC=0J^H72=xL>S7#A&!Bew^%j+4jRzmshU&M$ z==nz%_p!cRt}$C=9|D;>w+)#8nq%h6n3;IYk7F^N!?nna_n~|FSVxP%uR%);aAMc^ zEnndm3AXsxMq>LcGQ;q_YY{c^G<&nS6AcOIqEwKlJCH7e{e#OfC^{RH3$RNe`C#w` zNxh#v-DGrT+dpVyzqw&HBzbmoi_3XD0@7E_D?p1aJ(9Vb`!!aaOZ90(956sEsCGRz zyf3>St}`{-URzr(`=*eZa%sDhJeHr8C(ajG*@2=*d5snsq#v^{8Tp*k7o-FoGW||F ztEETTI4e*ChMukrooZ}4L(c5{_6V{t$2H?(wR=aYMO$KV3J*OFobE$Xf-!1Jncz%nK3CBU`I!D+*8qZe}y9 zDIw^|2__bYztXU`UjMhX%e{=;&`TKSTe(cs+cbcqt>myL{_o=9>REJR+%Igg0`FfD zI}v(NvaTtt!m_0KfxD@w=bFPvQ>^dH?ydKn1WK*|(AxS7luT(~#fuwDa(p~G-kwfC zuRvH_t#8+LyJ`}{Q=G-)Wc~z)v>t+GOP=uegLU^o=fiRFYth8C0UuBBv{%+2P~e8Q z+h$nX2S{%eR7z@%w)_J9AFN9SIHo^OYs3v4NE zs7i)Kv6sS>j+X7$4C)Cf3&-Q!Dt7lpuwI5=#l`XmU+1a9q4qq7?N_H2GIe+Z#TL2Y zF=6r(X+zD4(2A)MiKiE3_(XpT(_ivJzyRTumS@0)>N>;Q8k_C*y;ywOhy7mpFFPQ1 z_p?2Wb7Y!F`N@phBH=aFUQhFZ(jocylu?@po2mNVB(qB>PHjx3V2Yi$Td5}TLiH21 z3T68ulfP}zKq*$dbM-tbeAch~ajAQy0CDog@)cjHb~#XGYh>%@BYWY4eo95@Vg03n zWk4HbKnr-d-M&xVeQXc#zsb*m?PjVX3MKY&^AS`fU$9^k0_ZFES0UF-#b$|L52dUg zw{nOREL=9d?|(pEo76{zG_Vj3HPF;aCxIuL7fE!nOYzM`U_g9ZB6Kn}&;ibrb=Oim z<{KcS@Xd%WpIv^Pj&dtoRA(M{1$gK}VJ;BsIfbLFUlzBT9->5966U-Q&SHIT3fiQj z(fiy-2%O}7YBto=35MqWYa8%DC5iS1as;BEt9wPFN3MD86-{`lF`w+G#h<8m)IM+^ICfXP|W`%CMLxO z$Q*W|JrI95wyR@6u%W--eX8RGqk)y}`-a*Den8;^&|(a*lfz+~9!eLH4Dc*r9$WeV z_xJJw%BNSR74E)w&22C>z|%!&-SfQ5NdR0?^sYF$`$YeI9Gbp+Ko!9J7&-xWhq5MZ z`a4+0dI96&kUzJ~K=S8m?n0BVyQE);7a~0_=Ym)ztPP8wAPI+Z7tW>stg2=b3&7)k zuhp&z@D2RaU+2{+FU5+1!9ZP&*Xf|B>UoeidIMN@l)@H_z^64o<_l>DDTj!H=V~_N zbAWq*C)xgXL9-;^ZLuLcDR3A=EdKR_vEx*xHe`#yB(DY_i%DPV`saKELnnWDwMPa} zaHRGFw5qG!*IDP290(#8Hl|w7ts?@}U4X9js`4kBIQMCUx2L6^4cpp2Xqy|vxtS=(a?5$-cL82zzi&>F(}KG$iSLok>wzLEZOB8;39c+=dE%#D!A^r z!!2ogKihm`?6Dr-gM`k0{Bo@H*RfHMaq^!O!pL*6;nIJPt}RVWFK#PD=ob1?q@n%P z9e}ep$?%K(55L2S$t@cjXf?JRun}Mp+yrovo1uu*d}H_)pAmZigKLo-FDiWF@|EK| zvy<7*hk7qN^`*tu$|*S?stQTF<1mHSb)tSvqA)EaTl(@zYAS{frtOD6`;^_wC_k_K zS+hJ|yLIoEoFjj)l+!1}GhpCgir(;Xe2;nthwlMsJ!bw*X5%zV9LExow&SE13`x{=x z3)?{=_$Whg?ugO%B{=HLxOL`2y92cP7VNeaN%lqqfA!zcrDok=#87#D513d>3lH$^ zn(%-x!wKJkAqXJ1k0pPr?cRzLLmu-t$sCAX7?+pC|4}P4o&R&4fjnXtIID>Z;Hu)6 zuPZ4CVQy&c=YA={kfrCtGZcQCP7A~ETaoqvug=IWuaKmD$Uc(5)@SFJNcyHM3?F!P z!Jz4&CK5X&dIUuOVi0SA__Cxw^F+Qs!~fMveUz5bs(X36?-5d1ti>h*M6Xl6ZyhMfo*pL<4?WSEFwj5N^^r)ulNY9P4Ob}_KOf;W9jE5j>m5MN$8{6ODv8qt1^5LW63 zacFbeC)AX7J+GfnS9y#FAq|O{Aep$x=S`atd~3-lUx%>+lnDr4>J-7E2oEV~xYMdr zj8I3pA@)VSD8n}GXp8V@_^WyC%gUgJ85nx$Aj7 zvjYaLi-7!W3FHAu_2W(6aXa*?6x!;RqB5`CA*i|@Hxj2oAehV&%4pu8Mwp5fjnqfc zuGgC$+{#p+YhoA)a>Xs;s+JKNAFw_;J=wgSts4@_J2H=Jl~^J8SL9)56u}3z&Eq)|U zf-IP+mRUL?gDU!vJ&^b!-{W9FM=O3#2_JRMy~UzIg0ik1vHPQa%Z(8MW@XIdG0d*s z6D(o>WK{uVE85EE3pRTB8{|Kc6!~{sJh?wvw1zC-A_`u`#})#x{oRD(1fQMHIip}E zU62~#A357&m6__{C3Hg5mmt73@yyRioIy9-_Dwr6#w;-wnCP)8eF`5fC~*Z5Q^gIlO6tiWQidG zI9JZT$e%+uO_Fqn^_2XRqkk3^7t4_EsyO}G^1+|I%z~=&HDt{1sxskzK5fWwUef2f z$H=?A#hc_W{{p>@=XbY0ui3eSS+=cDuNEsp4}K$>Dff{HVfm^}bYj(kPxyJ%WbYDs z4G_}@CXH62i)@VvVHK|&tZKZvLEYn6*FuP$c~TH;8ozz$Qtzhrqci!?Dpt5ffQIpg zGgabblHAq9lyMI&UjszUD10~EL1uY$heEGMN{@Z;5Hs-g#f@~I-uMyBSuYEoVc_M# zPGmh4{Zn|#GD1G~0#|wD5^moQn+8S-NqN(G1&Es+sS1wH9|m&kn_w}(t9y}#nLhBP zrVtBG1QOr;(+QO$M=lafQk2%NJsG}D#?aD`C{m3JBNJf$@|Hxrm_77Bd|72&XjB(~ zYk;_cMubnRjyT1v4=}kmftgRp#j$*_o$z<0F+NHX1uPYL{)o&%FE@M1&Y4&Wz@Kf7 z#cnUBgWJtBkemF%OMm%F@BwRay3pn}DynB>;QafeVGngXqGrO-C-7mIt|iK<$nQlY zL<5?aj%L*nwJab?Lxo{mME&3u;^~JVjI$4Lfy+>h>B5K2NgVpe0Z3h4X%p1 z!*xBXfwRb++9mF<45=Z0;%>>|7UM|ED3pxwQIM1P-nx;8#4Pv#t zdhRru&smr(E{;WRS6Z0tm&31za9S0@Jcm!07O&t#y*(^z*u?=@+1HLAkt=JiE&0#e z)khvs<{tuwL9{l*`1Mo{rfRJQ5W6K(A8^pb(^6JhGAVxhQNvXB)gRvi|r)Tg7 zHe4XXc1)1_b+q@Ka3=#h&_61FY@Ur+vk6}|s;ksT&F2ipXe)LFAN^}<1P5a7{>9^@ zD&;;(Oc`;Q6p_DUc(2eXTAhUhEktyPUJxg3`Xjy}jH)cr4;Y3!Zmt8vU(+@*`ke+% z_NT6H_(RrbN>XA652$P1pg$CFv$I5#9#YmyV>~b~?N{<*Nxl)$<20DSUyE8j&W-xu z^RZk@_hn#i;pMm7to?Gr*KiMEt-}s?fXNvykf!;>2$^xVG9vDuB6=aOnVWkW1`ntc zeH;W~d*KYfT2S@0SXM;~26)5oe;w!9x<&`#v!2soUZ^=a zIu}mlO+2$Fo|V0Zm)Wmh(A$j3Vc1%gXlXe)od}e1Js*Wo7eJwAO36(zM^GSZX0z*n zqh{>c=&KBdi|3pSb(5}5QxcU#JFRN*9_VJ8_oNarHb)uftWvun1iLGY*#l?bvJLc+ zOcC*x1|E}@W*l2C$T=@{DTBNJdp||*e{*S4dG8WN^68oUy8IaHGi6M%wn0jjVZo9pJ4v|>TM`Wxls!t#@scv_| zn>~A|>%5@efTnf(_5ly}?1!U9yatcCSOczX!kWLBJ)CVXBSrv=LktVOSC1SIW3?8; zl+@Qx?(^z@C>ctgizkK?8v%ssL8^Z+<)rl2S)QrMdG$?cGqMQL8Eq+ZO8=ws_LRIw zr`0rthgQ^(&gmYLw5rrBIwZiB-7L|(TzVG9rx*5FPg1qM$yrm8ccMaO&uE1j)h@>r zza*`U9GktRrP(7V#IK|3wdiQK9t*xt=S@IGRyEEon|32J#9Y={Y5 zpc8$zwF!TOzl;nRF9>FZjr1$@%ZlolJY<}&QF zEUvwC)q}CaAg~RxpK|3!)mfYkd>SvJzgTXQyXgz4PE3AvLHbSawJx(RPLGq8NfXLS zo7R2I<3o#L92sb@mPv`KY~^Unt|$OB|D9RoFA!mCj(v*2nALdO zhR`CL9!ud(ZIy)~gM7^kKfYkaWcC}2^yFh$$SqtVbU!s>;wYBxkN9G8L;C_80E#z{ z5tM~~i`QNSB~={+o{T|y^m{i?yv3mGdb;BlF;i3E4}NVJ<|P|`*~ny<^ajP}r7Cd^ zUk>=R#8WdZE;n|GrP@+Em7u*p^uzCwPocPQ*fIIZ=^A^t-U^FF}6Z4IYN1fn@Yv3Nq{P9<)nF z15$(wz`g}6aO()>AA&CO8uE63r2UT^-chl!tLe zFB`0D+g8-|c#!dT07a;C-Eo4^Nzn;bjL9v0L)_==ECk;c=gON{)ba|ae}2PlH=5_X z4e-eCuBBqfzj&e4N7|LK7sd{UP<$B`veaD{jGeW!m`YEMJKJL+?7JYMx77!XnM8!}K%RK%TTOBYZxKw5&(RSZ*b&@e zT7|ECCv>{_1A&t=`0eCMuljqax7&@Mc>CDz_#E^jT09*fg(DjeMr_dg=4`m|||BSlXx5ptVGz;Wm|* zMs>Qy8FwjNFuEAa$E@-d&EJAcP7c+EP4v?c^R5gf`yy>7-_Pa&zsRO_C|NeI1B06K zyt5y)4itr801<~S@MxafagN)Ct=e_D8SdSv)60$$?+ z@4XHf0ULb?1{VQpu*zL9+wP0;PWl4O5_J^c!qwq}ii4y`>ExkgNFVg?VblC6*$~&H z?t=QFC?F;w1Gbb2GP47T{Lh$akh%~Dm4p>^Z!@&Ve^Advh_zxGemFty`Ayz(rQ$dp zqmZpCW+PV7H^H36OvNjxtP%;PIxG7RbQaUWY(o|zTjl2@h9U#B+C{BObR3P z=S*MSbc#4boopU_RZ#dRn&l^bsEX%OY$Lr-D<|3YY-Apc2|5dvMM`LgP^dH}=+m^g zj2K2QAroa%Aq01Q8&Vm)w1cfHWL+Aptdj0c^T2k=+w*l6W z$VYZSwO-~lF<>z?DH;;xQWaWW8oIWT2vPE+{Hi3>2(iy;n4;2(q|^gxQZ1+|Q3a0R z=L|wp^S|5QFSmzv+(w0`F;ttgx0+NNPg4X@vkEYqK*ay+kYjaT*HC`#dqq{cYuAbX zRHVU8zSpAjuJ_B)*UX=DGTJHnOAjWj=rImrUEvWOI~5xO^S5n9o-zaIRTvoA0fbek z`t)onO~{}8b@vVgo#K*ZZi!NpQHA&@>s{B&M}Zs1VevXoLjO%ymK@1# z-B}>7T~s)zy+oiN`gHbYc|HfUP@&qWdSWE%b?)@tnO0o8l#4YL1=yf_Z%i(5Rw~3i zwvY2S{2A#HX*yya(!#nQr|b^g0wr~jlywW+0S!qG;-}frIXyK8wbjC+V}0!X5r=Ro z)BXW0(o`{vz-!dfJVP7L-xApS{0Ag2oIzG@o3}@QN?K;T|2a8LJHdKRXK==*@%?Mv zU9~JLd@oAYp}RLiG5c)`h;G<4YONkBAkH+zz|TsalMkS|!k+0Zv4w@66t_sl4uP3A z@42$ax!2F+wC5_8;^$VEvK`0p7BZEo9w+k_SC=^*6ZQ0OW!eFAdjrI?+gu)x+9?ZG z&K)Fgwq3{BLV91Ob4Xt=Y9(RCnpqnkDi)O4u(}_Hm^nWPU>cH)a#vFQH6qU2R|Ecj zY6O`TWe1<|op(CLu;IL15&TKOOlof(W)7;-1lN%!@XfT(N8kTiVNsaX0Q@v4{WQv5 zk>y8S>rT@w@?A<$6MWjrM@3lSIyPC*S6=csmjkZ3O9O@8>sBSUf8>tdz!+``+U*?B zGRvSAybQqrVZK&Bo7eIMiJnjFQ5TwL|Dr-gBIjs*mCKx2wpH;AnB{IP@O((C(d=eQR`$-G7 zG{&i2TBl1~FCxd|BBr4EA67630qAGg4eO$scW!pjUloi-o*odU-_5Pr9E`6 zf>Qy16vrV4Hy3{YauAeV6PzI}biYDeUJ&LQb>+G>kcv2Cv}uS%zG&!Q>k5!AB|_jX z1!$&tQEdJoy&ZfYNQKOAQu=DCT;_WmRiG^a)crK;Y~V*tYFVY^P%<6WhteoY=PQOl;f6#P-DI?e{(R+;h(Q&VTUr zTDw+vb#>v_#l34kkIeP}4w7{-Ab8uB#6^z=Ca`cqh6Q_d-jqWTH!bp>uu&CR@X-GR z)|3XVfnbA86!uhwl5>}>XYC=QT}CSM9`+}fe9aSF{>WZP!nRW}aaN^9);3fKgV;Z8 z;wj|zpyloT@2^qjd}J;Ec(fYizy(OF=`qXBHmd6A=l)!?pWYpLPin0rD8g9!W)1p!)q9uyHS6*(lrbx^xh`!KVmRhjY6Tw@cj*$D-+ z-N+RYU>S~jjc-~&dSYp@31g53(JuQr52#MBkn7rc)WiooM7$?h_C$Ki4$D6XeB3Vp zy?1$vUiy%H<8(%WV*%8x(i+0PsSYaT_<^=cElU-fFS>7Vo63hnB|=>3f{ z%xv}dWPzG9HG>wd%s98Y=&i-HY+{}Ws)}6q)2yPZ;iAE03s*al!DU8D~3btd=B$3oI#f3VY0@N z55H{*5kL60_?8WjGo}vWEUmm;Amk3n>Q0(Fr^(u#r{Fmp*!b$Nu#|0=UH-b+#hK9) zN=LXXlOOa;D2WU`W|p6+2O|1!VjQU_KWGDCT2SMUEHqVybnV>UT635;m7Lq83otYj zuxYc3`rpN`&#{D|tuQ>0%KXVzw#l=%Y#9zrFnlZUez6|AU!-JYrU{j=qQhhLZ=Rz+ zu_Z1h1wEl_tWU|Dw^{0R%BN1{_8b&H=64EU0P277d*yUw1|=PVOvXzpHNZy(=(1mt z+&a$@#J~AXq>`2i;&Qd*u~O?CWFL`f#~5IaN!kfDdrt_|X|>v*pxBTrBL5Nn@I7M7 zO_yA_yvL@76}fB(NCIa=Q&Fo9sTrrxPY&|Km}+x?uMsU?`iSR`Qf7Yus!SLoI%SWJ zC`EN&KyO!*1*aRbyf|3)|1nu_4aQ6++VdNCAnT}xY{>WLkykL{47~jV8@n(NOlE_~ zV5X&_GR5fmc?YCGL1S`RKp^vTW2yB*qPjmv$3#USwf5n*5TZLPpwB|;*nf>J6EaU>E`sx$9~J!TejFm9 z7HsQT0ctVcTNFbG4;$adj|o=bbWkxxSJPUs>GQOCSE*Rf)n4CLF#iIyxi3qkwnf7w z(9ygwWjXZ2{yo=!YUfOnsM&~uORZ!sENJ@228uUc(gj38y=w!`(rnquc}i^|8d1Ep z4#lPLJ)8TblChA&V+$7bV#6{y?YEMYvI3h_4JN4wiKeXb&12kJRCgvlfZYnRvk2b8 z%YXL4&aScqDk~C+4?s7X*PMP45!J8@AOfuU#8~LSRJp*zqDrWa){^{|MPam)mjN9U zKRC%M&+Mej;Ib7bR0HZAilDa2k@oujP>I2$(nUG3-L7>TMulcaH5ZVrJOyv1Yo$;! z;36(DAsI5BZe@%sE!rHD@UEPu(4#b`gz|LW`cZCZb3a$I7Wl`S6v{wA;K$?fahgv5(Dn%mC9Z_9Df#EJ z$el`n?=P>W^qi%c5kfDU>FM7ch1aSeY#A3gwdd~}#{ygfhRPK(;|B4*YUIZ;zAH_) z+l3<**fez0V{UqM#Q|{>f@tx5J3#2pFKM(2N03BD_M~THT+dy2gH@ZZhvlh6plzSM z7&ldg$-n=HNIi@^x35Mv3&;nMTZ9+uw^llRr=8FFp~r5%1{^%7-Yz||S)dHgs^IBK zVeE87LBgmL1D-X`#i89$u{h^2^2Qy#lLm`7{-E~-+YFy`t8)F&8AlnA;VM{I3GgjP zCA^hZTXMRo`}W?QnA(G!i{g7sjpJxKYaYnx3D5|ZjfmUz3l~|PX|xP!EsdgxWWOyz z(iow6Pyl!%jul~{vGS=Br3lnSA|c%?Np#G~u<>kv>xAIj&pNW zl%t8L9#~wJ%|)}eDtS-Grmip0 zRggTQPXwRAFLHIfM^8%)!nxMAOylQ@RW*+L!ooEu(XZ7iOlCM`A-g>N;)6f_Zo_H`~5;+w*mj-C+PSmAlk_=YfB3hsG#v1^pa$6DZJghtIPStNF zQ?w?DgzRSb$h!NXe5c}Z4B&mkh*7RMPq%#OB#G#O5>X6w4?k(ZZxXl+HG^%`v-RXT z%r?;6hDdDrF;NP3Jn6w8ERV4Yh-vkw_Zgo(7p)E6);P7bc~ZT`lW1OC%geBBRWlxe z+=kA0)fMk>YN|+f6RIzD9MiQ)qxH` zhWU2MUL7p2!-6MYicLAck{eX_k}B+q7GELpF=C zL=6(L%G~QrZALr?tK{P-u@-rvNyEH|*%$#1IHYUgJhk4LLacab zcj<2!l1jRc4hEZ*0@MSPBMTx-1}sXXJ&nJ0q<=Z?mQ~nVfOca36@i zYL$1hw$4Q#RDIJ?TIpFKS@4-D`o^72ahrWL!zZA7ybVyV?($ZMf-W`4ki20SMLX$nXdNrem&Gza+v~7+DAS z#4r&Nz6S;vQ4%H+vs244n6f%`nZ(vJzl|;`TO$UE`UZpVQT0IO(106%!~Jf8!fuzB z$vJa>+hj3E7c33|rr4@Rs8w^Da@`R#S!rr_J^iCmOM6RTh)b4Np*eP95AA~FEk z%crN$#}UUk4`C9HWkPgf#>}f9tH-4*%IqgL{-QOrYaH9>kL84MeP780nAR1I)jIG) zB~w=IHdV4g{w|4qh!P%WPiRVpG!jY7v5ese^LvO30js@Vu3%6}G(iazznlH5aNU?2 zMkl#qM*(ub3i-b`liPSaiu+~HaesHQDRmP3fdkR-1WGAa|#6)67R980Vs7ljV4HCwPk z2Pip+;IkN80h+G{t=&~C_1#S-n&~}@aTzC5`z3F)*a5_pGR!FPG=?}qA&fWQ6D0Zn zw13-tI;pdm1wQMr@v}=MaR6+jjarD4f7}B;{SOt;^c1W3IGL*YGJoyYM^)Bh#X}vx zkB0_pM*L(2ZZrR~UTr7zpd9ex0h8c^%1nd1$thBn;^gpgrE>*%ln9G<%fBp~dAdnF zCx)cH3sPfIYPSbcFDtxQVv~X%G?01ueVtMzajjeC5BPk?1As}<5>*w}emb5KZYw2< zp@Mv)-HaUJ^su5j{1+OY%NT|zzDG^=ljMF<5w6TiR$`;%uvv{ty~8r~c(0{MfZ?+S zN_9jHV-H-#-d&{=8?@F(`AVL0<-w@#5F=?VW?@PJ++T}N?)h0ObamI2U@C-hi9>y# zhb0xu6XDew_X7~a*ig&^DI8jZdLn)c?iBhv~3P(dd9}GSin9A= zy36Tj00|A*uKVy#y(0p~c3yr;o==MIzN!s!%lNt0ug(7DeiJ(*QOst2Sv7Zz4qdg+ z_?2@v;k6G!njAerNZh7Bkm37RwyyAL? zHc?}ZO8f#{lKj$^kKON)8a#lL@gUOKME0G?&M~M!4d7Gh$ND)H#5SZ=m~ZwQHqoiv zsRRLdDlN6~2Yl;C5%d$k<;Nttmoa1!#n4dGAE|%IfUgfPOkK6 zV240<^_f<4zxD4KUuicRj>GJvnH&$YHAuURruT|5B9R==dVzgT{5p_(9$(sF;bG-p z`|hd!zO?E;cUv*C3RKf#8dLL{EK(3~8n3&uL8ga{135#;Y{>KWFkgt_;Y5m;=eatH zbi#x621yaBl}%iLt_z4yq#IZ{Z(%|cO4!=icCD^f(c!ta@rD4)OiK+ns^5*pbE96%1?L}*oiY%Es%STH%F8$Y3`jsGL=|Gi;B;ca9#evwMC>N$ zg9x~ImP8iEB(~jSZGcVZUMb9@NB)+O_)T*BSN-hk;Y@>gm}?T|ZYp)hw1M9K8CTC` zY>8BR8S~42&uvH6_NAy^CG)xGQ0VAkEG7?CZW6R)8|wmzU$yUem)X6`o$PbJvihy) zA8foI-;xw>C2@F2ZDfRA)L#+BB3FnTZygt<;s_lbixK!_%TM^Vzl?axoyu-V4Q24C zYah>8UQ)0c&C{_BDMPxV@Dx-oG_Q#8@l-MZ(<@CGc35Ro~_Dc=V@ivcB zilX@EG@ZQe5Q$<}VStWF)q^4^HCB(F1}D1p)N4Yi?n4B%??MWq*m<~SEnr-#4FGZ5 z=M|CY#6pm~5UFyB3$uqxD5zV!sJSgsnO4-m-T??PVQQY8ZZt8Z!gl(|L{v->8;6F)zB-}rf zgWPsI-SqZL0UqQRv`nWWk6Yr3(sW&;2KsN+EhPw@ZqXw`hw+8nP49rv<_-6$J$qNaFeo4YM@TSt6@mAd;RCjm^>-Cp+p7iqvX*_kh#n(8m1aSZ%3HZ=;Xc&%b9G4PL z3N8b@_8g0{+WE0-*5O57Z)f8R#7A%E_-B-UVweTjz8A>~DA&6#k}bTk>F>DpHDp}} z=^gPL2_KP^l%1hmm%e9tL0|nPkQr0gybL%8!jQLn%o*Q^{5xN^la`Y123luD=t01_ zR!71~9-4hJU!P294@1Ur+|qP#^}O?tg58knR?C|~H(%nOi1o|ijs8Yg9@02l+wANSSC zIVHtCCnsJJW@`4nQzFs%wV#B5`^L)YqDrFIXl>Z4a zdXbtKz+?={R(=%x>(N)^Q!+d#{GqEND2i2GwYMXCUVcjLNk&O2 zw?A;-2O`@9voN8*sF-LkXx~rrY)SJDsyL1j9eX0?h@QEAo8R^QIO>64ITxTXH*Lo; zn)ExRqA+Hf z?FxvgAdZRS!Es3|BIU=-FQP;HB`Xsh2N zoQt;G`q*+XV$AvA#mDs)JJd2Ff(%W(J^4JjhV7BN$;5>$Pa(q_(8aqlue0D6x`0QZ zBjWL8%%x_Q@nn3v#%e$yO7Pot2V_2*!9FGMR9YVm%2DUIx3+hM@#plAF?A-5_D z?ll;+oxI1?5QF-^x;?2b-aTn2_2q;(;KQUVC$;etv-qm`Bu_Bx`c@%|%TtHYRpCGH zn-B7H5{S*t!35IW4l5(5L0T zbEXoZz!k#iX=0RYht;7&NIJR@po%5ElZrY&>g})e(n1C@$NzZ143aMgu-<{8rYfA? zbT+!@?1|oQp_F^|XxoJJ(g>||>Z~NA?zHmq%u7r z__$2)4%RAj&%1m8R;d$sRw29_loCnD+ii`>`nW_T#CH3ExodTUYb4%|57~cF2OIE*GSC~(Q7A%vqP z7~h>QMN?PX%Y@A!;KV%vhRcozckd(?X82tQ5Ho)a8z=db0tumx3HJ`EA!n30FQ?$O z&qp&~%5x5_B4{OPq^JU0kf-<+thb%F>>KYz4{ZrLJPto}OZ_DZGBw^Kdu}UswCqea zFjl0#_&qm5OJ4kf(IOcMQ2(}r0AJGL3Su=PKLP==;1K8_P#{3YX%G^S=6mzBc_3@VQjPABJ7h1BBc#_E7(6>Y(Z4;hTCx%rV^HR6gE1X+R zzhb+TtxKwNEax`YnwUd=hUgAg~M`BoG<@md+xIKO+R9D?ALw>ivT4 z2vig7uJ~-PXm4kC-rf61-Q5hI~66S4*WKpJC@gu{P4oNjb4H|YLJI>0CrLyJ2pOu5oy9WCPvs^ZlX!1 zSSbcYT9-1u$(o~K zHp_Q`-lyVo06Dpw%SObf^Tcr#*%3>hU=77d}>>5m#54R&!yhu`<0e!Jp&(vPN-sedw4;7 zsB}cGDT<>cL#YC@wFMXAy^1q)A(=Y z(66)o)09VQ-dH6CUIN_kYLcN56fy;~`h9)KYP)Z@XG4*xu{k~7_iqy;u?7OKu5FLa z8>UG?9&KELK6f(@SenE;66S9)b%@_tBv~v z-%k6XI@x>7k+))>by4B3wbAi<`G+lH9nW)W%A0Q0)2Q-&90g|f?MPfqbiS`%-~JHz z)k?*gEF6TG!9~-GAI#l1ujFhKQ6~;m9E9jSjfS!HQO>u?W)YIAC*sG6l4Y>wPmn|P z(Az-tZHL%CUUKtG*q*&TkBasG5n3!kRT+p%oz*Q^9mgJGkKGVwt&iU@xQ;h;An98m zDVfBHszc^X$MZIv?Sir#zI^0w50fWPHL()CBptpT7084_i7;26CJ(<|r89yfiO9;7 z)0Sqw3n~+M2BiqT>=ymKd)bovcReoT0<^&FXyYe2GuzC5paOC;&DHIyRGpqe)!bZW zsD#Cpk=z^$uJOf2x6wdDy5U{a{Sr+5xGB&Qs%A0_1V7LesxFGai!=^r7WqjOTID~p zWkhyE4?rc;FM4@hL`VnKb*F*5cG*0z@zg`r!*dUV%w81TDt z8WuX*f*##@N(mVJoNne3TGS+lPXmWg3t`v{4BP#b6Cdzq@Qib zII1dn*!)86YZ6+ja??bZc!(z*O0+qsAh zWiI=!ZSfIji7D*dmK6ZcGjAKp_5v9{=Nn}9TTZPOIimOsz|BUP=P*B@zG)RWz0c37 zAX&Mz2(@iU4%HPt{K)E>f&6}2 zAy|C9zo2*#tA5r%wzl{1fcQab<4IWp*$#Q$_^?#f_i$6?$t9j;%65f*-I}hZbl>uq z7~_T2xuyAIL73T?Q}0aQjB|1tKo?j|$`8T)xF+VdF1 zlsnXG(70+?i1Y}-SaH4}dBbFDoDX>cdP(X0$B3BGB>+{l>UdKqF-oUtS=H-ZY^;ec zHwOrkv^D0=+DE3voZxE6sAiPSPon9%iZ68~xo>NhUc(klMqwR@v%h)3f~i?cuDqR{gbWO_VtzYOf-awzF&+X|O=mej|V#r_5juq;r^G(CC^C#`%pR*^)uhDsbh#tXv zmIwu0vdIu1+aG$Z5wwdXIACP-3kyzK){09sDqXwGS~#xTky4vOvTM6Fj+Q!qenNtP ze0_m~{Le*DE!%>I3%DLa5P^W8{O2O*Z0h1-X=m>I&jQ$}Woy6Ajr!@^`w`lkJJa;6 zfFqApKyKGzVTX0jc-dexR|n_{NJun8dfK)p*K$mV!IHp=c@tJ6cxSmf)Y=gkOJ$6{n<&CD4eUFMn|6QOR)^XaDG*Uh8vW?Oft z( z1QE@dO={bfh`j?<2bZ;+jvC2#onENk13$0uas_3)BRzfzoo8mB^TGhsrlBw&JPbdR z3r3o@d)G=CVk(5PAoiD3CWg+@XKT?%v)^uc30{kgArllI&|l8)M}=h-wHKjRGMo}AqZ2zDv}@$Qz0GavqtoD<^kSh&=#=eess0kS_flehbOVP7?E ze2z-r1?Fnkss%Teqi32a(!kj}!6@~jml3~6hzDlePrIY`e-VYiUr&E8I0+&e&qZ1@10r%hlk&{wQ-=igxcnM%R~W) zf);i04$bsynf-6Wer3*50YuH3b=%*O;L+ohxq1itxt#)VV|Jmdy)HKVez2kw zKf=~uHCVoOmv0F+LSH{@M;=Tbviam+jg27SG5Uted1T?jNElmE%0k~q^%AY%OBN|G zL;y%mAjQNV58|=H;_7CpQ5~nr&{?uhkj0G%uT>1a0*d&g6f7U{1NLa80!f3!VJi^h zGz)#nvQU4$`b&Z83!%u9M>~okXB32yoO;uC3ZV|McP}KBf^E_uVxyEH6c3`Z3#dXz zN#iT&=FgRo6vJ)O5Yy*z_lxksEdo#qw(?oxv8oi(q-RIxf^?#XLn&EVo_*<4K{F^8 z;m``co2nL}SmEtw;j#<(>t1t!EAMU@MhK}Yk;9P>*hZ$aTA*vvR{^LK%F=c)HKj$+ z1L&J@C1Kp5r)(8GvI^dI0|R*xP{5^UT_I55%-;_)sC#*6#*zElSS-BrNXM}y$y-S5 zn!s?_;Y6Urgt(F0&^EvZ(#6}z(2Q=<#*^Y;4r3bWVU=(&t^oyGO3E_t z5UMho-hwjDqju=9u*GGPYNRyN1j($?D@w@`=(UUkh7w947H~IoRC25Du`hhAk2j)VLp9xU?1u-COLJ0uS#(L!b~7W06d1!x6TR&u7mx0B}PY9Uu?IPB*tMS$vho0;G~_i|_G39I zY~dF(Qb=f!2y8=C_L5=hz!hZUzVb53{koe$l#?5!O5+pIYx4$805MmDkV?QCuR86p zSE?pjN?vzNQ^a*?Id=i(u>w9#h?`=aA&EZ2z8EBIOcA|_1-cO($JXwMx+NbTTA7!- z0i;yminRrlN7OAtfaDtdS}QY)X9{^fDqOTKDrCOc9W*jt{&#s&chr&Un4LcePr`7q zd#%l?ntTG5y%?Wa$>Xx-#uX+~0QF)L#Op*@WD6gq!7y~c68Zetkq$)JU>GGLO&r~m z{c22h5o4=-<(=ce=kV5A2(d9oc3%^P zHMOHFCg58Co|WdhV^Ym|Ke# zn>z5^O*3({b$B)NtRb3+HjD(j{bst$-Z4p-Vf5rJWevBK!BtGc&{<(rHuZBBX9BtIa9x_oJ0KHe7#Db4bvLg5AD?7pE)BEG{ z3%G~)|L!vUDHrjU!GT9@Ob`&%|J-HRx!M|;Isx|?|7JWRoT0 z=#F^bxi)Do$Xe~&VarP8j#wh_a zG+JmMj^AkW!L`B=TB~mc=Dhe07OT zhvpxN4%T;Ja!4{=ouxQ(bQg5p>iW(t0!jXA0u;R&O2;i@zfxrXy6LQo@*sHq z$h@ztGj5!GXJ^4~#Fqb6Mz&Vuuu(D*)Q7OewIQ7W?)WPuGZs7uv6q~L0SSI2j224f zv2xv^K4oIuaa@Td%ZABj)(OcwdlHnGVOk_eG&Ph)?ip0Jm{%`5)Y&*lj(*uaSgp$f zAwFxR&oO$v4!rB`&@}SQo+iRuae}ds|8L7mblYiGUj^pzZb&|(?9mUV!CsFG!FzL zrPYx;OeB`ncP?x)u*VaT_c09*0a{tBhpZ7Kd+$YEumt$T1XwZE0ogv})*`uXJdOg* zDH&_?vOrIX^_`=e+PAmg5vA6~qj?Ute{{2)0iJ!XckxTfcY(?U=g;Qc)>)?`D_5=` zg5j0LCQ5C`Uox3UFiOeO&>0{cd%C?R@&f^ml3pWGnV)zHmcg+YK)^N?LWL|h@l>@N z>Q;3L*JKlBVZp0aT>zdZbReOc34Sk))(_;GN!5=l*2=^>U6Z#*?e<;(JHCs9c1`$8 zx2DVuln7Me91TTvTV&ExK^#u}7F9jZ?49f1;(`!+rnA`E?Jc2Y<}%mU&LuPW1y zt-jxx(Bgi(ECs=%`aCr+O*zYx%Dj>R1!TB_wAIu{lFNpMwB$e{RU!v4UfO_y07-#R zX?a6Yy0k0V#q-v^{>WDb_d#ub?Bw9aWXdNVouG@2wvO-3nvmeA!YY@^QG0bHx;!hY zq>nu-3NJQ=YC(EE%{mg#Oe-x_=rzSZ*5pyw3~o+yY% zWIf$S+GgiHZaUQkB4pe5E4_FQNjoX(_&D)&VnAB#E{%%bk2}}9qsRBg3N;yH3@za{ zD@QTMlIP{)@AlW@`a)*Cr-CI8tdM^9*xub(Ma8oHw{PR_;%v&@2i6&p*|Pd3MW_am zp}&C2+{}l_G;?d^I!IZq2X6-#cXwWvG$WW`rd0ZpEBDSZ3w@fGUx6ioqjye2%ck;P zxFTMA;`NN~audofys{ijWc2pT3pgOA^o;IfsY|kRI18k~sCx^d4>YnZ{%H6+Fdz!X zuV^Fgrr6LT^GClSMtE$w>Fcqz7{24RcurB;)ujXwjxes+}~pu z$0)01UYc6zCN=KlKRS*))Fc$`rEu7OGG)+AC$l)NWkz56>%l|ap0Lfq|p5-TW(G|KzaaPP=9u?#Ie9Rx@J9$O{qTFm+uTs<7Pjk5y*6{Eyp7^yddPrrD`w&~jn!zuX zff9*6J)l>h31w_a2h5T;`ks_blDd6IdS-TaWg&oy_fw53^7H+2WHWdAqxG$!g~-jXe%Sdzm98Db zFh!%V&}Pgd`7T1j$&)uj!l_UB&=xxf|K0+nC=ryIw;?^iot=U5?9CTRN%%}KN29(z z@|jh;9$G6a%8q-=Z#JpcQY=C28Vn4ccAP3y!rQw&PgZ-DuY`o)J3hN9PxP&PGt5q= z^(}Ig_#OH0S1Y5qqFHYCKdN*%se1>z56R2k9e8O0&NrE$0 z=&<4|r|Gw&G%O-9Xv5htijiGzN7)$kCJB)25PFnFEc-JMMGDz;qs z-6a(@CA4n+4GYK665S5U(fRAt*kxv=eljTn7QFL7ZK&agTm$NJ?3K&S3^QUUvbe)1 zepw4vKuRe3MFb?a341tIfRs_jm=mT6f?B8F+%Y7TIBLjG4S>%RKpY(9m|W*vTGD?N z)#FC`AQz;8WaupsU9JW`7_Q=tnA!Tz?+yA-`Td*nOSag+Dg>WDs#YIL@~+7)+#Ao9 zBJf{(#e zKbR4hdwf-Xfr$s{WEN&yrto7sec#v;>WQe5vA(iDj=$@57tAdVSDK9~!+9a}}vTUq%smc6G zBY(&zR>l2=`%Nk{pL8c=ZM_aEDcx*$wM|v*ThG!C=|&TN8c_<%fUoB?5#i*~OcSHQJXR3i|4#n3dx|ga?ViqL3N@0QvSjqTe?b>@mpS<3;i=?@7}%j zx6?_A!^c}1;qG6t0tydS0BX*iOV7d2gpC9~JZjjP7puG?xP_F1bHXvVBKHfIpay|2 zOBue5Mb)sVTIM((mfdC&KA>v4|@ZkJab$1AYsxbVu?Y(uE4sH`nLt z)%5$z`#UcC5(v}Z?FM%s4kQr9#S|P>Wt>!?jw!i}91@(!X8*v&z_i*x9yAORyN%W?K9ZPmyVf%}h-$iN&q4DeCP0EAd&fGsKj$q-N= z3CjNY0$9|)`I7#VO_>nno_+uv&3|S0z=Ze#jxoLuhB5vIL0j|;6ksL(P5fVpNWd`4 zgf{5@d!7~T>fEG&d_G1%ey3udNCZ&+TW$Vdp@0Cm!LI*mLzuu9y9TwM+aJZ7%A9Gu z$54ZI*63HOuY`380wl?$YNv*fFZA7nyOFXxx6qM_Eo>;m$Rx)mvA?YqcFs!#C}rn4 z1~spKJH`u=0?uRa=puS-kk@|z(!Wbs&z(JVP|-aa1Qc5+`l_6lQ+;funGvR66KWzR zUUSe{@IiOG*^OZp3HE&ctf7X|UQW!V5HC6ym^DM>2fp3bQMjXy9dy$9umTiIr~VfE z&mPBM?oP^|ILlg8@)8X6Vq39u8J0b41m&B#paC9TjIKjm3uiHZ7QV|N4j@=teF?du z{VoZCU{V2(>M17~UtdH%G`C8_t^>wZm475QWbT*(hbk9`m`5gV0q{qmtX1VCpw?DW zy&0Yd{uhJK!01kSL?z#nki_r*?<-u?PB}#8&yo;odlk{7+;ZXMC{7OYAM%K>nku4! zspX)<+rWZst-{XOnzY3&({W7=W%0RS8z3CP>nXxyr&IDIn@ps=)MYXI8ngqOD{Nyb zQ)~*`U`4BsDG@jdGyUsJ(SC7N;RQGU#sk(@w`tMz|2Abpg* z)c*+nZ-ap8t^fJaKfwVfM~(Iw>wg6gqo9Anfh`8casUITOk52H*Yy7p@W@A3rg;9p zV50vGaX*4i!zHIvKJ%nX*KJ%o}n=6Twy7=6! zx;|v;m#jYqZ<1%zy+PU^oQuT-L6$+50$QZ+QfO)Dbx_k+ywj&D`i`8cUv-lTN;pUG z2^F?ywsJe!Y?Y)|!`vyfQ8Gidd2kI071rN7W%x6Gwn)cNtyY-X>NNHX zcKxj}p}ud_3YMvTbYXA9eO@aH^=8!W`$~!r)}&mgf*Yxi{PY*H7bnjXO`S(C&v{uT$BO3g*dL6{4GG zoT+sgggfxI=M#{Wv)I`pON`ahq$dU@MfPs%b4xL0iTj0>3lqax(VI*j@v|aBt<9Cb z$vJ>j%T)uTUL~Ss@{%c?GcioT+&K9m9rdRKTfTnT_D3ux!xVUexlG4Bzt?c<728F@ z!9*RL+M6`GoUxH0J9~^Z*R1I$OP4l)c{6^t>4vX`zGj<`#=+v`%!QlyneDO;KEb$U zv~ z^YN!wT_s6_fuN}S`b?kQ{w%h#j;du++54uq8~_& z%lIo?Pf^Y>k5Fzq^jPf2`&)x4Asr(N2ljz{4L(<2gA7$$S7*vsxaXL|0P2?2Gho`a z(e2ZI4#5@0@U3GaGVh&hCr%&JZ=3?erMR~>c8)SH^hTDyL^-Zz4VVTS2k?!mL{s`5 zrj*Xsr-ijSLbhLiTC)5#!C@$zxu*tZ$b~ms!36 z{-&qeJv4vii7%JSv@^$X0Jzvkx%ZpF|9X1UER~7t0s{d_Bmn_I|IgE#o2ik?e=`4(-qjyUZ-nyuj}B`sbj~<*#^p;}lkR zI1=ay)$ZojuI6IhzX%%`_iVM-g@3M#6oaOko+*LZHVWz!W?G}x)ss*K&w$or|& z{9&U@DZu!d+D}iH04~uJT%b;;bc3g6OMZ2MoNKkkTW}^v=ILByyDhR#tM{a>wt<}* zYxBf6Cg#=;at}r>UYx8%=XIIDGif2z<`9RNVv`HvjtkNaf{x*rHk=17aYj0VucWw- zP8CxonI)Jx2?MaFB>CZ+6-wm&9A;{z!?oZb8Ldn-L2sRAIV>i?Ane`$w@7fiKEqGj zO{T&0T3Wr~gOk_f%hOxliV2AGj@taJ_ca%AqcvsD{5Akx)*`v;9jEZcJ)j z9XLNX8} ziM^AUq4oVuw?wNkZDYJdI2U8a$>8*2Be7ugzd2P1VI7~8b_)t!4ntb>UHA*h#jmL`{M(-IzXBBHX#<84gG5KKxV)vA5$&_t!5gj*F4PZ?#KO z(xAdPLXNhCViRCE^vL}|M@q3jJTd)wLM}PM>Q@^?PPB+8WX0<7`!&h?(8G0bP~l_( zjiVuy$X0ulgUZ6V5}55Sf{?}FWcIALnD43KceK?*_UwbcIwC!)&Z^_~; z_`UJ0b(%h25BCLp?=>PO{`c@tF-QiRa9*hlr6aS7HuA4jPXd?%Kf7`G3NdK}gPXuiALP*8S-~IoJm|@$ zSwLT5yuKpGmjE+J)a0P7RKP;>@ock9X|Z||=uVEf(hbD!EhHKRL)?xk9U%R5*X$de z6SZ8d$O_sJ-H%yBR6``~1~la!&Qo7@9f-xTq(wsqvdoZ8|)#!PzjfkW{q}_C{b){+NmL6UcZmz7yvASsEKF&3)N6Kj z?0{VFi`FBEm{?b!KuP;*#iCPdb(byz!`z)^qcQX4?q!3kK9$%-UKi%R1^*s@BnI9P zWo4ur%tq>7S6iqJOIjI_fS0jyV_wjv=g9%#9Sx4B89d5^?~4(Bo$ZJpuH*bV0%Tp? z-!0Gg3p` zj)fH$sk;$9y|Xl|BZ_wVC1Rr@`bbVkehXk61Sgk8s~%mHh$~VomzzMg|2-wAR($>o zh9Tz~(oRtKTB5iy=3BA|r^JV7u#+rY_xwAeEPWQnMS333ohQxq z%lmrfsw-$3+S%E2fSn}4D!NYfC@`83hCe)WqHx;AHRM z%w%lu^lvXFE`R`~&I17^`TzGTDnU=N|DVw;|BfVkC8;AcXBs7jz$IgZUU*Z}3|(ep zyPyvBwPp8f7XfQ4JNAi>$47BttY);3L6fQpmu!uU8f>U3&Wb~#Hd4#`7wK_2D*X!F zum#dL`TB{-q|6{|ctv%*-}-@(VA5?tnJn5~_NY+=2BLksOw_6tj7Or{k&YnIh|mmS?dlL>K1QE+;;4rVAy7{ZJT~6-0ZkE$;_X>%sjfOqsiAZ`PIhH zW;5>Tr)j*N{Lesb@r*lqFG7t}I2GluE}HvOc!NdG2Y#i!Q5O=8mc%|1yijrV@2Z=i z(O}G3qarr#oV&n;c?URiB!HZD6AKDJ1@LIng=E<|!Lj+54Mb|)AKAOq#m}8$ENhS02Sw$jhlHWuWZ{fRTIEjEPn(9$lE`V-MdFlZu+7po7oOBvSlsj9`&PuvFRjOaJ(=Vw%9TnD>JnQ?-RWc-C zZ+eN-inHD4xUaMC^I}TxmR)jT!{Jwz+9eEb_0~6JJ4|lw4e)$mnAfMU_^WGxec?9m zpc-+;p!3_FXzUSEo1~d*uU4AYM5<>b&4c2B<2@FVE%52qdZ z8@K)7-x#V_cE!N+?2{*_&gK6(xNCE>Fq^bbdJFGALAjXR{L58)zJ0hf^Xy;GqyHYX z_;d%=#yppv(0YS$?}Y~*&ljHID{EJ+m@9W+_p;_^b3T_VyuI@HOJrr~UX71E-X-52 zs-4;2@gG=VV`hn^s|)ySfmz}fP*xZ@OC*;Tm*nS;<_bh5wq;VR_hC?h&idcEWBcn# zrSj{RzAbpm701zZ`S*=w(FXFWmb0ZF)dN=`zj2c2+G%ZR`TqBu=_;G&PRcmFR@iNM z#f9Y(g|RcEUW9hNpPp)P^aSH&)5&h1Mc(f`y!p)^ot;~kJr!dqKjED*{gJ7IwD6-< zrr~G4)<*yKOJ0-oz*d`jDA1O3ITk7~Q+ez!Q{ zVf-}wylSyug*BVqnmZXE`pnPR{aoXf+;DrhY4*?3yODW{)81}op4}@{q#^X_=qLA8 z4_}5X-CuqFF~{pgnJet~dg`YK*+hNRpRxF|;q)4I_m<7ksl08wjvISS|5Z zRI}*KjbmO5b~|zHJrp5zl<6-^wp5hY`?$*M@8p<28|FWIoz8Psc>AN`OK&PBtT~vn z>FdjNH`y)iHY^iR;Z{_?@`jsxcU+qAGy~QMgF7_~mnp6E`5mx%>I*~8z%yNfrxdF; zKb<5i>(i%X{hXIeb*jik`@G#B+E~OmZp3f<7`8c|-7B)WYrAsKpDn<JYc`GfwyLVZmR*8JzE5|a zWAEPADPMj3S~}xwM9;o*H|zPi^S5dDX`O%D_y2)sQAQ?RV4oPav7q{J!}A@$pz;H* zs}x2gNGL1X8Q6(P%`1rysVqn>js*ojMoa23CB)Rvi-f2o#AgO3f+O z*8`F08kYone{zyzV6aMI1h3{q=nQ0sZg2p`U1=`RdTjQZeEY_41GM)raH*&aLNAbY zNENCbVmY!QSRJz6|0LHMVDL-^Iv=#)0|6W~peCi|=a=N=mq6xz(LEBhZOY5FK>fWy z{h(#32q2>k)t{P|f>Zm8&W&?*fkAbN2h?&v20wI>tWPZh@9}_G4(#WFfg;1@^Iqb) zRg4TE4B8li0KtY(-MOhLnTh(DxrynihI$2g>FDl9-&=w(;`3@o>^n`+jX+vYkzqc6EZXph?s)sC_N2VFnuaN`mqr~pIl1)*z4ZF(YWpK=vRJG3E+t{b(MM%KOj s29j<>osDh)dVz~DLiRS;0PMwYfHx~}KNBd&2{ClCFfe%C0cK_f0Hb#d%m4rY literal 0 HcmV?d00001 diff --git a/src/main/java/uk/gov/hmcts/reform/civil/documentmanagement/model/DocumentType.java b/src/main/java/uk/gov/hmcts/reform/civil/documentmanagement/model/DocumentType.java index 6285627d660..9546800821e 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/documentmanagement/model/DocumentType.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/documentmanagement/model/DocumentType.java @@ -55,5 +55,6 @@ public enum DocumentType { JUDGMENT_BY_ADMISSION_DEFENDANT, JUDGMENT_BY_DETERMINATION_CLAIMANT, JUDGMENT_BY_DETERMINATION_DEFENDANT, - ORDER_NOTICE_TRANSLATED_DOCUMENT; + ORDER_NOTICE_TRANSLATED_DOCUMENT, + NOTICE_OF_DISCONTINUANCE; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/enums/DocCategory.java b/src/main/java/uk/gov/hmcts/reform/civil/enums/DocCategory.java index 53b193e557a..599c0c04058 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/enums/DocCategory.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/enums/DocCategory.java @@ -13,7 +13,8 @@ public enum DocCategory { DQ_APP1("DQApplicant"), DQ_DEF1("DQRespondent"), DQ_DEF2("DQRespondentTwo"), - HEARING_NOTICES("hearingNotices"); + HEARING_NOTICES("hearingNotices"), + NOTICE_OF_DISCONTINUE("discontinueNotices"); private final String value; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 79343720612..3f346d15d94 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -9,11 +9,16 @@ 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.documentmanagement.model.CaseDocument; +import uk.gov.hmcts.reform.civil.enums.DocCategory; import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.service.docmosis.settleanddiscontinue.NoticeOfDiscontinuanceFormGenerator; +import uk.gov.hmcts.reform.civil.utils.AssignCategoryId; 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.GEN_NOTICE_OF_DISCONTINUANCE; @@ -23,14 +28,16 @@ public class GenerateDiscontinueClaimCallbackHandler extends CallbackHandler { private static final List EVENTS = List.of( - GEN_NOTICE_OF_DISCONTINUANCE + GEN_NOTICE_OF_DISCONTINUANCE ); private static final String TASK_ID = "GenerateNoticeOfDiscontinueClaim"; private final ObjectMapper objectMapper; + private final AssignCategoryId assignCategoryId; + private final NoticeOfDiscontinuanceFormGenerator formGenerator; @Override protected Map callbacks() { - return Map.of(callbackKey(ABOUT_TO_SUBMIT), this::aboutToSubmit); + return Map.of(callbackKey(ABOUT_TO_SUBMIT), this::generateNoticeOfDiscontinueDoc); } @Override @@ -40,16 +47,23 @@ public List handledEvents() { @Override public String camundaActivityId(CallbackParams callbackParams) { - return TASK_ID; } - private CallbackResponse aboutToSubmit(CallbackParams callbackParams) { + private CallbackResponse generateNoticeOfDiscontinueDoc(CallbackParams callbackParams) { CaseData caseData = callbackParams.getCaseData(); CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); - + buildDocument(callbackParams, caseDataBuilder); return AboutToStartOrSubmitCallbackResponse.builder() - .data(caseDataBuilder.build().toMap(objectMapper)) - .build(); + .data(caseDataBuilder.build().toMap(objectMapper)) + .build(); + } + + private void buildDocument(CallbackParams callbackParams, CaseData.CaseDataBuilder caseDataBuilder) { + CaseDocument caseDocument = formGenerator.generateDocs( + callbackParams.getCaseData(), + callbackParams.getParams().get(BEARER_TOKEN).toString()); + assignCategoryId.assignCategoryIdToCaseDocument(caseDocument, DocCategory.NOTICE_OF_DISCONTINUE.getValue()); + caseDataBuilder.noticeOfDiscontinue(caseDocument); } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java index 11fa12474f3..a54a8964903 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java @@ -687,7 +687,8 @@ public boolean hasNoOngoingBusinessProcess() { private SettleDiscontinueYesOrNoList isDiscontinuingAgainstBothDefendants; private SettlementReason settleReason; private final MarkPaidConsentList markPaidConsent; - + private YesOrNo claimantsConsentToDiscontinuance; + private CaseDocument noticeOfDiscontinue; @JsonUnwrapped private FeePaymentOutcomeDetails feePaymentOutcomeDetails; diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceForm.java b/src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceForm.java new file mode 100644 index 00000000000..c9f67967f40 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceForm.java @@ -0,0 +1,39 @@ +package uk.gov.hmcts.reform.civil.model.docmosis.settleanddiscontinue; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import uk.gov.hmcts.reform.civil.model.common.MappableObject; + +import java.time.LocalDate; + +@Getter +@Builder +@AllArgsConstructor +@EqualsAndHashCode +public class NoticeOfDiscontinuanceForm implements MappableObject { + + private final String caseNumber; + private final String claimant1Name; + private final String claimant2Name; + private final String defendant1Name; + private final String defendant2Name; + private final String claimantNum; + private final String defendantNum; + private String claimantWhoIsDiscontinue; + private String claimantsConsentToDiscontinuance; + private String courtPermission; + private String permissionGranted; + private String judgeName; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy") + @JsonSerialize(using = LocalDateSerializer.class) + private LocalDate judgementDate; + private String discontinuingAgainstBothDefendants; + private String discontinuingAgainstOneDefendant; + private String typeOfDiscontinuance; + private String partOfDiscontinuanceTxt; +} diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java index c1ab6575272..c8322b2f76c 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java @@ -91,7 +91,8 @@ public enum DocmosisTemplates { JUDGMENT_BY_ADMISSION_CLAIMANT("CV-SPC-DEC-ENG-00916.docx", "Judgment_by_admission_claimant.pdf"), JUDGMENT_BY_ADMISSION_DEFENDANT("CV-SPC-DEC-ENG-00915.docx", "Judgment_by_admission_defendant.pdf"), JUDGMENT_BY_DETERMINATION_CLAIMANT("CV-SPC-DEC-ENG-00982.docx", "Judgment_by_determination_claimant.pdf"), - JUDGMENT_BY_DETERMINATION_DEFENDANT("CV-SPC-DEC-ENG-00981.docx", "Judgment_by_determination_defendant.pdf"); + JUDGMENT_BY_DETERMINATION_DEFENDANT("CV-SPC-DEC-ENG-00981.docx", "Judgment_by_determination_defendant.pdf"), + NOTICE_OF_DISCONTINUANCE_PDF("CV-UNS-DEC-ENG-DISCONTINUANCE.docx", "notice_Of_discontinuance_%s.pdf"); private final String template; private final String documentTitle; diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceFormGenerator.java b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceFormGenerator.java new file mode 100644 index 00000000000..5e231464c00 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceFormGenerator.java @@ -0,0 +1,87 @@ +package uk.gov.hmcts.reform.civil.service.docmosis.settleanddiscontinue; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import uk.gov.hmcts.reform.civil.documentmanagement.DocumentManagementService; +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.PDF; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; +import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.model.docmosis.DocmosisDocument; +import uk.gov.hmcts.reform.civil.model.docmosis.casepogression.CourtOfficerOrderForm; +import uk.gov.hmcts.reform.civil.model.docmosis.settleanddiscontinue.NoticeOfDiscontinuanceForm; +import uk.gov.hmcts.reform.civil.service.docmosis.DocmosisTemplates; +import uk.gov.hmcts.reform.civil.service.docmosis.DocumentGeneratorService; +import uk.gov.hmcts.reform.civil.service.docmosis.TemplateDataGenerator; + +import static java.util.Objects.nonNull; +import static uk.gov.hmcts.reform.civil.service.docmosis.DocmosisTemplates.NOTICE_OF_DISCONTINUANCE_PDF; + +@Slf4j +@Service +@RequiredArgsConstructor +public class NoticeOfDiscontinuanceFormGenerator implements TemplateDataGenerator { + + private final DocumentManagementService documentManagementService; + private final DocumentGeneratorService documentGeneratorService; + + public CaseDocument generateDocs(CaseData caseData, String authorisation) { + NoticeOfDiscontinuanceForm templateData = getNoticeOfDiscontinueData(caseData, authorisation); + DocmosisTemplates docmosisTemplate = NOTICE_OF_DISCONTINUANCE_PDF; + + DocmosisDocument docmosisDocument = + documentGeneratorService.generateDocmosisDocument(templateData, docmosisTemplate); + return documentManagementService.uploadDocument( + authorisation, + new PDF( + getFileName(caseData, docmosisTemplate), + docmosisDocument.getBytes(), + DocumentType.NOTICE_OF_DISCONTINUANCE + ) + ); + } + + private String getFileName(CaseData caseData, DocmosisTemplates docmosisTemplate) { + return String.format(docmosisTemplate.getDocumentTitle(), caseData.getLegacyCaseReference()); + } + + private NoticeOfDiscontinuanceForm getNoticeOfDiscontinueData(CaseData caseData, String authorisation) { + var noticeOfDiscontinueBuilder = NoticeOfDiscontinuanceForm.builder() + .caseNumber(caseData.getCcdCaseReference().toString()) + .claimant1Name(caseData.getApplicant1().getPartyName()) + .claimant2Name(nonNull(caseData.getApplicant2()) ? caseData.getApplicant2().getPartyName() : null) + .defendant1Name(caseData.getRespondent1().getPartyName()) + .defendant2Name(nonNull(caseData.getRespondent2()) ? caseData.getRespondent2().getPartyName() : null) + .claimantNum(nonNull(caseData.getApplicant2()) ? "Claimant 1" : "Claimant") + .defendantNum(nonNull(caseData.getRespondent2()) ? "Defendant 1" : "Defendant") + .claimantWhoIsDiscontinue(getClaimantWhoIsDiscontinue(caseData)) + .claimantsConsentToDiscontinuance(nonNull(caseData.getClaimantsConsentToDiscontinuance()) ? caseData.getClaimantsConsentToDiscontinuance().toString() : null) + .courtPermission(caseData.getCourtPermissionNeeded().getDisplayedValue()) + .permissionGranted(nonNull(caseData.getIsPermissionGranted()) ? caseData.getIsPermissionGranted().getDisplayedValue() : null) + .judgeName(isCourtPermissionGranted(caseData) + ? caseData.getPermissionGrantedComplex().getPermissionGrantedJudge() : null) + .judgementDate(isCourtPermissionGranted(caseData) + ? caseData.getPermissionGrantedComplex().getPermissionGrantedDate() : null) + .typeOfDiscontinuance(caseData.getTypeOfDiscontinuance().getType()) + .partOfDiscontinuanceTxt(caseData.getPartDiscontinuanceDetails()) + .discontinuingAgainstOneDefendant(nonNull(caseData.getDiscontinuingAgainstOneDefendant()) + ? caseData.getDiscontinuingAgainstOneDefendant().getValue().getLabel() : null) + .discontinuingAgainstBothDefendants(nonNull(caseData.getIsDiscontinuingAgainstBothDefendants()) + ? caseData.getIsDiscontinuingAgainstBothDefendants().getDisplayedValue() : null); + return noticeOfDiscontinueBuilder.build(); + } + + private String getClaimantWhoIsDiscontinue(CaseData caseData) { + return nonNull(caseData.getClaimantWhoIsDiscontinuing()) + ? caseData.getClaimantWhoIsDiscontinuing().getValue().getLabel() + : caseData.getApplicant1().getPartyName(); + } + + private boolean isCourtPermissionGranted(CaseData caseData) { + return nonNull(caseData.getIsPermissionGranted()) + && SettleDiscontinueYesOrNoList.YES.equals(caseData.getIsPermissionGranted()); + } +} + diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java index ad3040faaf1..f2437180cfa 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java @@ -35,8 +35,170 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPDefendant; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPDefendantBeforeOffline; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.partAdmitPayImmediately; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.*; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.*; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.acceptRepaymentPlan; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.agreePartAdmitSettle; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.allAgreedToLrMediationSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.allResponsesReceived; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.applicantOutOfTime; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.applicantOutOfTimeProcessedByCamunda; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesFullDefenceReceived; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesFullDefenceReceivedSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesNonFullDefenceReceived; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesNonFullDefenceReceivedSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.bothDefSameLegalRep; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterClaimAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterClaimAcknowledgedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterDetailNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterDetailNotifiedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedPastHearingFeeDue; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.casemanMarksMediationUnsuccessful; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.certificateOfServiceEnabled; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDismissalOutOfTime; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDismissedByCamunda; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssueBilingual; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssueHwF; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssued; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmitted1v1RespondentOneUnregistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedBothUnregisteredSolicitors; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedOneRespondentRepresentative; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedOneUnrepresentedDefendantOnly; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedRespondent1Unrepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedRespondent2Unrepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedTwoRegisteredRespondentRepresentatives; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedTwoRespondentRepresentativesOneUnregistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.contactDetailsChange; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaimSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.demageMultiClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOffline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOfflineSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOffline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOfflineSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmission; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmissionSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmitPayImmediately; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefence; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceNotProceed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceProceed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isCarmApplicableLipCase; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isClaimantNotSettlePartAdmitClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isInHearingReadiness; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isPayImmediately; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isRespondentResponseLangIsBilingual; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.judgeOrderVerificationRequired; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.lipFullDefenceProceed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.multipartyCase; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.notificationAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.oneVsOneCase; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmission; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmissionSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pastClaimDetailsNotificationDeadline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pastClaimNotificationDeadline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.paymentFailed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.paymentSuccessful; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pendingClaimIssued; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pinInPostEnabledAndLiP; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.reasonNotSuitableForSdo; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.rejectRepaymentPlan; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent1NotRepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent1OrgNotRegistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent2NotRepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent2OrgNotRegistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondentTimeExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specSmallClaimCarm; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterClaimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterClaimNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterNotSuitableForSdo; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterSDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaff; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimDetailsNotifiedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimIssue; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimantResponseBeforeSDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterDefendantResponse; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterNotificationAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterNotificationAcknowledgedTimeExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterSDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffBeforeClaimIssued; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffBeforeMediationUnsuccessful; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineBySystem; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawn; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterClaimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterClaimDetailsNotifiedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledgedTimeExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.ALL_RESPONSES_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED_TIME_EXTENSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_HEARING_FEE_DUE_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DISMISSED_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_NOTIFICATION_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_FAILED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_SUCCESSFUL; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_SUBMITTED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CONTACT_DETAILS_CHANGE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.COUNTER_CLAIM; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CASE_DISCONTINUED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GO_OFFLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DRAFT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FLOW_NAME; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_AGREE_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_JUDGMENT_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_NOT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PAY_IMMEDIATELY; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_REJECT_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_NOT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_HEARING_READINESS; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_MEDIATION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.MEDIATION_UNSUCCESSFUL_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED_TIME_EXTENSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_SETTLE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_SETTLED_NO_MEDIATION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PAY_IMMEDIATELY; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_REJECT_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_APPLICANT_RESPONSE_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DISMISSED_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT_ONE_V_ONE_SPEC; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SIGN_SETTLEMENT_AGREEMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SPEC_DEFENDANT_NOC; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SPEC_DRAFT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_DETAILS_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_SDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_BY_STAFF; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_PAST_APPLICANT_RESPONSE_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SDO_NOT_DRAWN; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SPEC_DEFENDANT_NOC; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_UNREGISTERED_DEFENDANT; @Component @RequiredArgsConstructor diff --git a/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java b/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java index a48315ee1b5..56136d374f5 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java @@ -15,9 +15,30 @@ import static uk.gov.hmcts.reform.civil.enums.CaseCategory.SPEC_CLAIM; import static uk.gov.hmcts.reform.civil.enums.MultiPartyScenario.getMultiPartyScenario; import static uk.gov.hmcts.reform.civil.enums.YesOrNo.NO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.*; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.*; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaimSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOfflineSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOfflineSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmissionSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isRespondentResponseLangIsBilingual; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.judgeOrderVerificationRequired; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmissionSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CONTACT_DETAILS_CHANGE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.COUNTER_CLAIM; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CASE_DISCONTINUED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GO_OFFLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_BY_STAFF; @Component public class ClaimIssuedTransitionBuilder extends MidTransitionBuilder { diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index cd0c4345779..4674d6da707 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -441,7 +441,7 @@ notifications: notifyClaimantLRJudgmentByAdmissionTemplate: "af5a407a-d295-48ae-9bd0-8ac029c0a697" notifyDefendantLIPJudgmentByAdmissionTemplate: "734f9bb6-2e13-4364-8c25-b90a611b91a5" notifyLiPOrderTranslatedTemplate: "d81749f7-cef5-4159-8d99-146eb572a690" - + notifyClaimDiscontinuedLRTemplate: "af5a407a-d295-48ae-9bd0-8ac029c0a697" sendgrid: api-key: ${SENDGRID_API_KEY:false} diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java index c9196482459..8a2418f21f1 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java @@ -25,7 +25,10 @@ import java.time.LocalDate; import static org.assertj.core.api.Assertions.assertThat; -import static uk.gov.hmcts.reform.civil.callback.CallbackType.*; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_START; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.MID; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.SUBMITTED; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.DISCONTINUE_CLAIM_CLAIMANT; @SpringBootTest(classes = { From fcd5e6709c1c6ef0b3e79b83e00f44b0e8090400 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 08:50:45 +0100 Subject: [PATCH 26/59] CIV-14244 Flow flag condition updated --- .../service/flowstate/StateFlowEngine.java | 166 +++++++++++++++++- .../ClaimIssuedTransitionBuilder.java | 27 ++- .../ClaimIssuedTransitionBuilderTest.java | 3 +- 3 files changed, 190 insertions(+), 6 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java index ad3040faaf1..9e234b4f96e 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java @@ -35,8 +35,170 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPDefendant; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.nocSubmittedForLiPDefendantBeforeOffline; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowLipPredicate.partAdmitPayImmediately; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.*; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.*; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.acceptRepaymentPlan; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.agreePartAdmitSettle; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.allAgreedToLrMediationSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.allResponsesReceived; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.applicantOutOfTime; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.applicantOutOfTimeProcessedByCamunda; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesFullDefenceReceived; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesFullDefenceReceivedSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesNonFullDefenceReceived; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.awaitingResponsesNonFullDefenceReceivedSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.bothDefSameLegalRep; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterClaimAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterClaimAcknowledgedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterDetailNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedAfterDetailNotifiedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.caseDismissedPastHearingFeeDue; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.casemanMarksMediationUnsuccessful; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.certificateOfServiceEnabled; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDismissalOutOfTime; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimDismissedByCamunda; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssueBilingual; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssueHwF; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimIssued; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmitted1v1RespondentOneUnregistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedBothUnregisteredSolicitors; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedOneRespondentRepresentative; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedOneUnrepresentedDefendantOnly; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedRespondent1Unrepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedRespondent2Unrepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedTwoRegisteredRespondentRepresentatives; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimSubmittedTwoRespondentRepresentativesOneUnregistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.contactDetailsChange; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaimSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.demageMultiClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOffline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOfflineSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOffline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOfflineSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmission; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmissionSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmitPayImmediately; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefence; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceNotProceed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceProceed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isCarmApplicableLipCase; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isClaimantNotSettlePartAdmitClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isInHearingReadiness; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isPayImmediately; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isRespondentResponseLangIsBilingual; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.judgeOrderVerificationRequired; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.lipFullDefenceProceed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.multipartyCase; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.notificationAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.oneVsOneCase; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmission; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmissionSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pastClaimDetailsNotificationDeadline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pastClaimNotificationDeadline; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.paymentFailed; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.paymentSuccessful; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pendingClaimIssued; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.pinInPostEnabledAndLiP; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.reasonNotSuitableForSdo; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.rejectRepaymentPlan; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent1NotRepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent1OrgNotRegistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent2NotRepresented; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondent2OrgNotRegistered; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.respondentTimeExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specSmallClaimCarm; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterClaimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterClaimNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterNotSuitableForSdo; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineAfterSDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaff; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimDetailsNotifiedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimIssue; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterClaimantResponseBeforeSDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterDefendantResponse; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterNotificationAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterNotificationAcknowledgedTimeExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffAfterSDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffBeforeClaimIssued; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineByStaffBeforeMediationUnsuccessful; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineBySystem; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawn; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterClaimDetailsNotified; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterClaimDetailsNotifiedExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledged; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.takenOfflineSDONotDrawnAfterNotificationAcknowledgedTimeExtension; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.ALL_RESPONSES_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CASE_DISCONTINUED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED_TIME_EXTENSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_HEARING_FEE_DUE_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_DISMISSED_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_PAST_CLAIM_NOTIFICATION_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_FAILED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_ISSUED_PAYMENT_SUCCESSFUL; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_SUBMITTED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CONTACT_DETAILS_CHANGE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.COUNTER_CLAIM; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GO_OFFLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DRAFT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FLOW_NAME; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_AGREE_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_JUDGMENT_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_NOT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PAY_IMMEDIATELY; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMIT_REJECT_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_NOT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_HEARING_READINESS; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.IN_MEDIATION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.MEDIATION_UNSUCCESSFUL_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.NOTIFICATION_ACKNOWLEDGED_TIME_EXTENSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_AGREE_SETTLE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_NOT_SETTLED_NO_MEDIATION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PAY_IMMEDIATELY; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_PROCEED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMIT_REJECT_REPAYMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_APPLICANT_RESPONSE_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DETAILS_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_DISMISSED_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_DEFENDANT_ONE_V_ONE_SPEC; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PENDING_CLAIM_ISSUED_UNREPRESENTED_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SIGN_SETTLEMENT_AGREEMENT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SPEC_DEFENDANT_NOC; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.SPEC_DRAFT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_DETAILS_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_SDO; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_BY_STAFF; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_PAST_APPLICANT_RESPONSE_DEADLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SDO_NOT_DRAWN; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_SPEC_DEFENDANT_NOC; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREGISTERED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_DEFENDANT; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_UNREPRESENTED_UNREGISTERED_DEFENDANT; @Component @RequiredArgsConstructor diff --git a/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java b/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java index a48315ee1b5..424defaef1b 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java @@ -15,9 +15,30 @@ import static uk.gov.hmcts.reform.civil.enums.CaseCategory.SPEC_CLAIM; import static uk.gov.hmcts.reform.civil.enums.MultiPartyScenario.getMultiPartyScenario; import static uk.gov.hmcts.reform.civil.enums.YesOrNo.NO; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.*; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.claimNotified; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.*; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.counterClaimSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondGoOfflineSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.divergentRespondWithDQAndGoOfflineSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmissionSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isRespondentResponseLangIsBilingual; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.judgeOrderVerificationRequired; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmissionSpec; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specClaim; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CASE_DISCONTINUED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CONTACT_DETAILS_CHANGE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.COUNTER_CLAIM; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.DIVERGENT_RESPOND_GO_OFFLINE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.FULL_DEFENCE; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PART_ADMISSION; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED; +import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.TAKEN_OFFLINE_BY_STAFF; @Component public class ClaimIssuedTransitionBuilder extends MidTransitionBuilder { diff --git a/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java b/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java index 1ccf5862838..06f355b3e74 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java @@ -45,7 +45,7 @@ void setUp() { @Test void shouldSetUpTransitions_withExpectedSizeAndStates() { - assertThat(result).hasSize(14); + assertThat(result).hasSize(15); assertTransition(result.get(0), "MAIN.CLAIM_ISSUED", "MAIN.CLAIM_NOTIFIED"); assertTransition(result.get(1), "MAIN.CLAIM_ISSUED", "MAIN.TAKEN_OFFLINE_BY_STAFF"); @@ -61,6 +61,7 @@ void shouldSetUpTransitions_withExpectedSizeAndStates() { assertTransition(result.get(11), "MAIN.CLAIM_ISSUED", "MAIN.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED"); assertTransition(result.get(12), "MAIN.CLAIM_ISSUED", "MAIN.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE"); assertTransition(result.get(13), "MAIN.CLAIM_ISSUED", "MAIN.DIVERGENT_RESPOND_GO_OFFLINE"); + assertTransition(result.get(14), "MAIN.CLAIM_ISSUED", "MAIN.CASE_DISCONTINUED"); } @Test From 1fe8a2e245704b34dcd16089969d2ed58fbe5f8f Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 09:03:10 +0100 Subject: [PATCH 27/59] CIV-14244 Resolve imports sonar issue --- .../user/DiscontinueClaimClaimantCallbackHandlerTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java index c9196482459..978240a489d 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/DiscontinueClaimClaimantCallbackHandlerTest.java @@ -25,7 +25,10 @@ import java.time.LocalDate; import static org.assertj.core.api.Assertions.assertThat; -import static uk.gov.hmcts.reform.civil.callback.CallbackType.*; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_START; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.MID; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.SUBMITTED; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.DISCONTINUE_CLAIM_CLAIMANT; @SpringBootTest(classes = { From 26c8f7ae6753aa2eed1e5775a2c5466b5e4755c4 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 10:00:12 +0100 Subject: [PATCH 28/59] CIV-14244 Notification properties update --- src/main/resources/application.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index cd0c4345779..55e4b640394 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -441,6 +441,7 @@ notifications: notifyClaimantLRJudgmentByAdmissionTemplate: "af5a407a-d295-48ae-9bd0-8ac029c0a697" notifyDefendantLIPJudgmentByAdmissionTemplate: "734f9bb6-2e13-4364-8c25-b90a611b91a5" notifyLiPOrderTranslatedTemplate: "d81749f7-cef5-4159-8d99-146eb572a690" + notifyClaimDiscontinuedLRTemplate: "9a7cc57b-38ab-4c0b-b63a-f5927241f18e" sendgrid: api-key: ${SENDGRID_API_KEY:false} @@ -745,7 +746,7 @@ idam: id: civil-service redirect_uri: https://localhost:3000/oauth2/callback secret: ${CIVIL_CLIENT_SECRET:OOOOOOOOOOOOOOOO} - + caseFlags: logging: enabled: ${CASE_FLAGS_LOGGING_ENABLED:false} From 59ec99e8996132f3cc5210fca8562eb7976f3471 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 11:09:38 +0100 Subject: [PATCH 29/59] CIV-14244 Fixin error test --- ...tClaimDiscontinuedNotificationHandler.java | 28 ++++--------------- ...imDiscontinuedNotificationHandlerTest.java | 7 +++-- 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java index 1a92b60e03a..4672e1fb15b 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java @@ -19,7 +19,6 @@ import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.NOTIFY_DISCONTINUANCE_DEFENDANT1; import static uk.gov.hmcts.reform.civil.utils.NotificationUtils.getRespondentLegalOrganizationName; -import static uk.gov.hmcts.reform.civil.utils.PartyUtils.getAllPartyNames; @Service @RequiredArgsConstructor @@ -60,13 +59,6 @@ private CallbackResponse notifyDefendantJudgmentByAdmission(CallbackParams callb notificationService.sendMail( caseData.getRespondentSolicitor1EmailAddress(), getLRTemplate(), - addPropertiesLR(caseData), - getReferenceTemplate(caseData) - ); - } else { - notificationService.sendMail( - caseData.getRespondent1().getPartyEmail(), - getLIPTemplate(), addProperties(caseData), getReferenceTemplate(caseData) ); @@ -79,27 +71,17 @@ private String getLRTemplate() { return notificationsProperties.getNotifyClaimDiscontinuedLRTemplate(); } - private String getLIPTemplate() { - return notificationsProperties.getNotifyClaimDiscontinuedLRTemplate(); - } - private String getReferenceTemplate(CaseData caseData) { return String.format(REFERENCE_TEMPLATE, caseData.getLegacyCaseReference()); } - public Map addPropertiesLR(CaseData caseData) { - return Map.of( - CLAIM_REFERENCE_NUMBER, caseData.getLegacyCaseReference(), - LEGAL_ORG_NAME, getRespondentLegalOrganizationName(caseData.getRespondent1OrganisationPolicy(), organisationService) - ); - } - - @Override + @Override public Map addProperties(CaseData caseData) { return Map.of( - CLAIMANT_V_DEFENDANT, getAllPartyNames(caseData), - CLAIM_REFERENCE_NUMBER, caseData.getLegacyCaseReference(), - PARTY_NAME, caseData.getRespondent1().getPartyName() + CLAIM_REFERENCE_NUMBER, + caseData.getLegacyCaseReference(), + LEGAL_ORG_NAME, + getRespondentLegalOrganizationName(caseData.getRespondent1OrganisationPolicy(), organisationService) ); } } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandlerTest.java index 3ea1b6cf428..6b335ef37c4 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandlerTest.java @@ -64,7 +64,7 @@ void setup() { } @Test - void shouldNotifyDefendantJudgmentByAdmission_whenInvoked() { + void shouldNotifyDefendantLRClaimDiscontinued_whenInvoked() { CaseData caseData = CaseDataBuilder.builder() .legacyCaseReference(REFERENCE_NUMBER) @@ -84,16 +84,17 @@ void shouldNotifyDefendantJudgmentByAdmission_whenInvoked() { verify(notificationService, times(1)).sendMail( "respondentsolicitor@example.com", TEMPLATE_ID, - addPropertiesLR(caseData), + addProperties(caseData), "defendant-claim-discontinued-000DC001" ); } } - public Map addPropertiesLR(CaseData caseData) { + public Map addProperties(CaseData caseData) { return Map.of( CLAIM_REFERENCE_NUMBER, caseData.getLegacyCaseReference(), LEGAL_ORG_NAME, "Test Org Name" ); } + } From 6ca083d4e7786d80e03ce9d28771b372b0c1e6ad Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 11:17:40 +0100 Subject: [PATCH 30/59] CIV-14244 Fixin error test --- .../NotifyDefendantClaimDiscontinuedNotificationHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java index 4672e1fb15b..06566988eb9 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java @@ -75,7 +75,7 @@ private String getReferenceTemplate(CaseData caseData) { return String.format(REFERENCE_TEMPLATE, caseData.getLegacyCaseReference()); } - @Override + @Override public Map addProperties(CaseData caseData) { return Map.of( CLAIM_REFERENCE_NUMBER, From 85f0fa0da10e3e7355699c69c2be30662bdfca4d Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 11:32:09 +0100 Subject: [PATCH 31/59] CIV-14244 Unused util --- .../reform/civil/utils/SettleDiscontinueUtil.java | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java diff --git a/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java b/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java deleted file mode 100644 index be7e2462701..00000000000 --- a/src/main/java/uk/gov/hmcts/reform/civil/utils/SettleDiscontinueUtil.java +++ /dev/null @@ -1,15 +0,0 @@ -package uk.gov.hmcts.reform.civil.utils; - -import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; -import uk.gov.hmcts.reform.civil.model.CaseData; - -public class SettleDiscontinueUtil { - - private SettleDiscontinueUtil() { - //NO-OP - } - - public static boolean isJudgeOrderVerificationRequired(CaseData caseData) { - return (caseData.getCourtPermissionNeeded() != null && caseData.getCourtPermissionNeeded().equals(SettleDiscontinueYesOrNoList.YES)); - } -} From 1165bbb0a5ceb74b83967b1bfe4cd948e31070df Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 11:46:19 +0100 Subject: [PATCH 32/59] CIV-14244 Test class for GenerateNoticeOfDiscontinueClaim --- ...teDiscontinueClaimCallbackHandlerTest.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java new file mode 100644 index 00000000000..05bd9ca0d49 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java @@ -0,0 +1,45 @@ +package uk.gov.hmcts.reform.civil.handler.callback.camunda.docmosis; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import uk.gov.hmcts.reform.ccd.client.model.CallbackRequest; +import uk.gov.hmcts.reform.civil.handler.callback.BaseCallbackHandlerTest; +import uk.gov.hmcts.reform.civil.sampledata.CallbackParamsBuilder; + +import static org.assertj.core.api.Assertions.assertThat; +import static uk.gov.hmcts.reform.civil.callback.CaseEvent.GEN_NOTICE_OF_DISCONTINUANCE; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = { + GenerateDiscontinueClaimCallbackHandler.class, + JacksonAutoConfiguration.class, +}) +class GenerateDiscontinueClaimCallbackHandlerTest extends BaseCallbackHandlerTest { + + @Autowired + private final ObjectMapper mapper = new ObjectMapper(); + @Autowired + private GenerateDiscontinueClaimCallbackHandler handler; + + @Test + void handleEventsReturnsTheExpectedCallbackEvents() { + assertThat(handler.handledEvents()).containsOnly(GEN_NOTICE_OF_DISCONTINUANCE, GEN_NOTICE_OF_DISCONTINUANCE); + } + + @Test + void shouldReturnSpecCamundaTask_whenSpecEvent() { + assertThat(handler.camundaActivityId(CallbackParamsBuilder.builder().request(CallbackRequest.builder().eventId( + "GEN_NOTICE_OF_DISCONTINUANCE").build()).build())).isEqualTo("GenerateNoticeOfDiscontinueClaim"); + } + + @Test + void shouldReturnUnSpecCamundaTask_whenUnSpecEvent() { + assertThat(handler.camundaActivityId(CallbackParamsBuilder.builder().request(CallbackRequest.builder().eventId( + "GEN_NOTICE_OF_DISCONTINUANCE").build()).build())).isEqualTo("GenerateNoticeOfDiscontinueClaim"); + } +} From 3989d4dab37b0264940f67225cd09af66d6d91da Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 12:01:05 +0100 Subject: [PATCH 33/59] CIV-14244 Duplication error --- .../NotifyDefendantClaimDiscontinuedNotificationHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java index 06566988eb9..39b7c091f6e 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendantClaimDiscontinuedNotificationHandler.java @@ -38,7 +38,7 @@ public class NotifyDefendantClaimDiscontinuedNotificationHandler extends Callbac protected Map callbacks() { return Map.of( callbackKey(ABOUT_TO_SUBMIT), - this::notifyDefendantJudgmentByAdmission + this::notifyDefendantClaimDiscontinued ); } @@ -52,7 +52,7 @@ public List handledEvents() { return EVENTS; } - private CallbackResponse notifyDefendantJudgmentByAdmission(CallbackParams callbackParams) { + private CallbackResponse notifyDefendantClaimDiscontinued(CallbackParams callbackParams) { CaseData caseData = callbackParams.getCaseData(); if (!caseData.isRespondent1LiP()) { From a3c024323a3e9454a8975f6dce413b781cc61f04 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Tue, 16 Jul 2024 12:50:29 +0100 Subject: [PATCH 34/59] CIV-14259 testcase added --- ...nerateDiscontinueClaimCallbackHandler.java | 29 +++++- .../hmcts/reform/civil/model/CaseData.java | 3 +- .../NoticeOfDiscontinuanceForm.java | 1 + .../NoticeOfDiscontinuanceFormGenerator.java | 33 +++---- ...ticeOfDiscontinuanceFormGeneratorTest.java | 96 +++++++++++++++++++ .../ClaimIssuedTransitionBuilderTest.java | 3 +- 6 files changed, 143 insertions(+), 22 deletions(-) rename src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/{settleanddiscontinue => settlediscontinue}/NoticeOfDiscontinuanceFormGenerator.java (84%) create mode 100644 src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGeneratorTest.java diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 3f346d15d94..16a44ff92db 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -11,20 +11,21 @@ import uk.gov.hmcts.reform.civil.callback.CaseEvent; import uk.gov.hmcts.reform.civil.documentmanagement.model.CaseDocument; import uk.gov.hmcts.reform.civil.enums.DocCategory; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.model.CaseData; -import uk.gov.hmcts.reform.civil.service.docmosis.settleanddiscontinue.NoticeOfDiscontinuanceFormGenerator; +import uk.gov.hmcts.reform.civil.service.docmosis.settlediscontinue.NoticeOfDiscontinuanceFormGenerator; import uk.gov.hmcts.reform.civil.utils.AssignCategoryId; import java.util.List; import java.util.Map; +import static java.util.Objects.nonNull; 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.GEN_NOTICE_OF_DISCONTINUANCE; @Service @RequiredArgsConstructor -@SuppressWarnings("unchecked") public class GenerateDiscontinueClaimCallbackHandler extends CallbackHandler { private static final List EVENTS = List.of( @@ -54,8 +55,19 @@ private CallbackResponse generateNoticeOfDiscontinueDoc(CallbackParams callbackP CaseData caseData = callbackParams.getCaseData(); CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); buildDocument(callbackParams, caseDataBuilder); + CaseData updatedData = caseDataBuilder.build(); + if(isPermissionRequired(caseData)) { + assignDiscontinuanceCategoryId(updatedData.getNoticeOfDiscontinueCWDoc()); + updatedData.setNoticeOfDiscontinueAllParitiesDoc(null); + System.out.println("isPermissionRequired--------if--------"); + } else { + assignDiscontinuanceCategoryId(updatedData.getNoticeOfDiscontinueAllParitiesDoc()); + updatedData.setNoticeOfDiscontinueCWDoc(null); + System.out.println("isPermissionRequired-------else---------"); + } + return AboutToStartOrSubmitCallbackResponse.builder() - .data(caseDataBuilder.build().toMap(objectMapper)) + .data(updatedData.toMap(objectMapper)) .build(); } @@ -63,7 +75,16 @@ private void buildDocument(CallbackParams callbackParams, CaseData.CaseDataBuild CaseDocument caseDocument = formGenerator.generateDocs( callbackParams.getCaseData(), callbackParams.getParams().get(BEARER_TOKEN).toString()); + caseDataBuilder.noticeOfDiscontinueCWDoc(caseDocument); + caseDataBuilder.noticeOfDiscontinueAllParitiesDoc(caseDocument); + } + + private boolean isPermissionRequired(CaseData caseData) { + return SettleDiscontinueYesOrNoList.YES.equals(caseData.getCourtPermissionNeeded()) + && SettleDiscontinueYesOrNoList.YES.equals(caseData.getIsPermissionGranted()); + } + + private void assignDiscontinuanceCategoryId(CaseDocument caseDocument ) { assignCategoryId.assignCategoryIdToCaseDocument(caseDocument, DocCategory.NOTICE_OF_DISCONTINUE.getValue()); - caseDataBuilder.noticeOfDiscontinue(caseDocument); } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java index a54a8964903..20e75ab9abf 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java @@ -688,7 +688,8 @@ public boolean hasNoOngoingBusinessProcess() { private SettlementReason settleReason; private final MarkPaidConsentList markPaidConsent; private YesOrNo claimantsConsentToDiscontinuance; - private CaseDocument noticeOfDiscontinue; + private CaseDocument noticeOfDiscontinueCWDoc; + private CaseDocument noticeOfDiscontinueAllParitiesDoc; @JsonUnwrapped private FeePaymentOutcomeDetails feePaymentOutcomeDetails; diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceForm.java b/src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceForm.java index c9f67967f40..b96f0c17b3c 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceForm.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceForm.java @@ -35,5 +35,6 @@ public class NoticeOfDiscontinuanceForm implements MappableObject { private String discontinuingAgainstBothDefendants; private String discontinuingAgainstOneDefendant; private String typeOfDiscontinuance; + private String typeOfDiscontinuanceTxt; private String partOfDiscontinuanceTxt; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceFormGenerator.java b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java similarity index 84% rename from src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceFormGenerator.java rename to src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java index 5e231464c00..bfd7ba9b1a0 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settleanddiscontinue/NoticeOfDiscontinuanceFormGenerator.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java @@ -1,4 +1,4 @@ -package uk.gov.hmcts.reform.civil.service.docmosis.settleanddiscontinue; +package uk.gov.hmcts.reform.civil.service.docmosis.settlediscontinue; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -10,7 +10,6 @@ import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.docmosis.DocmosisDocument; -import uk.gov.hmcts.reform.civil.model.docmosis.casepogression.CourtOfficerOrderForm; import uk.gov.hmcts.reform.civil.model.docmosis.settleanddiscontinue.NoticeOfDiscontinuanceForm; import uk.gov.hmcts.reform.civil.service.docmosis.DocmosisTemplates; import uk.gov.hmcts.reform.civil.service.docmosis.DocumentGeneratorService; @@ -22,32 +21,32 @@ @Slf4j @Service @RequiredArgsConstructor -public class NoticeOfDiscontinuanceFormGenerator implements TemplateDataGenerator { +public class NoticeOfDiscontinuanceFormGenerator implements TemplateDataGenerator { private final DocumentManagementService documentManagementService; private final DocumentGeneratorService documentGeneratorService; public CaseDocument generateDocs(CaseData caseData, String authorisation) { - NoticeOfDiscontinuanceForm templateData = getNoticeOfDiscontinueData(caseData, authorisation); + NoticeOfDiscontinuanceForm templateData = getNoticeOfDiscontinueData(caseData); DocmosisTemplates docmosisTemplate = NOTICE_OF_DISCONTINUANCE_PDF; - DocmosisDocument docmosisDocument = - documentGeneratorService.generateDocmosisDocument(templateData, docmosisTemplate); + documentGeneratorService.generateDocmosisDocument(templateData, docmosisTemplate); + return documentManagementService.uploadDocument( - authorisation, - new PDF( - getFileName(caseData, docmosisTemplate), - docmosisDocument.getBytes(), - DocumentType.NOTICE_OF_DISCONTINUANCE - ) + authorisation, + new PDF( + getFileName(caseData, docmosisTemplate), + docmosisDocument.getBytes(), + DocumentType.NOTICE_OF_DISCONTINUANCE + ) ); } private String getFileName(CaseData caseData, DocmosisTemplates docmosisTemplate) { - return String.format(docmosisTemplate.getDocumentTitle(), caseData.getLegacyCaseReference()); + return String.format(docmosisTemplate.getDocumentTitle(), caseData.getLegacyCaseReference()); } - private NoticeOfDiscontinuanceForm getNoticeOfDiscontinueData(CaseData caseData, String authorisation) { + private NoticeOfDiscontinuanceForm getNoticeOfDiscontinueData(CaseData caseData) { var noticeOfDiscontinueBuilder = NoticeOfDiscontinuanceForm.builder() .caseNumber(caseData.getCcdCaseReference().toString()) .claimant1Name(caseData.getApplicant1().getPartyName()) @@ -57,14 +56,16 @@ private NoticeOfDiscontinuanceForm getNoticeOfDiscontinueData(CaseData caseData, .claimantNum(nonNull(caseData.getApplicant2()) ? "Claimant 1" : "Claimant") .defendantNum(nonNull(caseData.getRespondent2()) ? "Defendant 1" : "Defendant") .claimantWhoIsDiscontinue(getClaimantWhoIsDiscontinue(caseData)) - .claimantsConsentToDiscontinuance(nonNull(caseData.getClaimantsConsentToDiscontinuance()) ? caseData.getClaimantsConsentToDiscontinuance().toString() : null) + .claimantsConsentToDiscontinuance(nonNull(caseData.getClaimantsConsentToDiscontinuance()) + ? caseData.getClaimantsConsentToDiscontinuance().toString() : null) .courtPermission(caseData.getCourtPermissionNeeded().getDisplayedValue()) .permissionGranted(nonNull(caseData.getIsPermissionGranted()) ? caseData.getIsPermissionGranted().getDisplayedValue() : null) .judgeName(isCourtPermissionGranted(caseData) ? caseData.getPermissionGrantedComplex().getPermissionGrantedJudge() : null) .judgementDate(isCourtPermissionGranted(caseData) ? caseData.getPermissionGrantedComplex().getPermissionGrantedDate() : null) - .typeOfDiscontinuance(caseData.getTypeOfDiscontinuance().getType()) + .typeOfDiscontinuance(caseData.getTypeOfDiscontinuance().toString()) + .typeOfDiscontinuanceTxt(caseData.getTypeOfDiscontinuance().getType()) .partOfDiscontinuanceTxt(caseData.getPartDiscontinuanceDetails()) .discontinuingAgainstOneDefendant(nonNull(caseData.getDiscontinuingAgainstOneDefendant()) ? caseData.getDiscontinuingAgainstOneDefendant().getValue().getLabel() : null) diff --git a/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGeneratorTest.java b/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGeneratorTest.java new file mode 100644 index 00000000000..8e81988c362 --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGeneratorTest.java @@ -0,0 +1,96 @@ +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 uk.gov.hmcts.reform.civil.documentmanagement.DocumentManagementService; +import uk.gov.hmcts.reform.civil.documentmanagement.model.CaseDocument; +import uk.gov.hmcts.reform.civil.documentmanagement.model.PDF; +import uk.gov.hmcts.reform.civil.enums.YesOrNo; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; +import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.model.PermissionGranted; +import uk.gov.hmcts.reform.civil.model.common.DynamicList; +import uk.gov.hmcts.reform.civil.model.common.DynamicListElement; +import uk.gov.hmcts.reform.civil.model.docmosis.DocmosisDocument; +import uk.gov.hmcts.reform.civil.model.docmosis.settleanddiscontinue.NoticeOfDiscontinuanceForm; +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.docmosis.DocumentGeneratorService; + +import java.time.LocalDate; + +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.verify; +import static org.mockito.Mockito.when; +import static uk.gov.hmcts.reform.civil.documentmanagement.model.DocumentType.NOTICE_OF_DISCONTINUANCE; +import static uk.gov.hmcts.reform.civil.service.docmosis.DocmosisTemplates.NOTICE_OF_DISCONTINUANCE_PDF; + +@ExtendWith(MockitoExtension.class) +public class NoticeOfDiscontinuanceFormGeneratorTest { + + private static final String BEARER_TOKEN = "Bearer Token"; + private static final byte[] bytes = {1, 2, 3, 4, 5, 6}; + private static final String REFERENCE_NUMBER = "000MC015"; + @Mock + private DocumentGeneratorService documentGeneratorService; + @Mock + private DocumentManagementService documentManagementService; + @InjectMocks + private NoticeOfDiscontinuanceFormGenerator formGenerator; + + @Test + void shouldGenerateNoticeOfDiscontinuanceDoc_whenValidDataIsProvided() { + String fileName = String.format( + NOTICE_OF_DISCONTINUANCE_PDF.getDocumentTitle(), REFERENCE_NUMBER); + + CaseDocument caseDocument = CaseDocumentBuilder.builder() + .documentName(fileName) + .documentType(NOTICE_OF_DISCONTINUANCE) + .build(); + + when(documentGeneratorService.generateDocmosisDocument(any(NoticeOfDiscontinuanceForm.class), eq(NOTICE_OF_DISCONTINUANCE_PDF))) + .thenReturn(new DocmosisDocument(NOTICE_OF_DISCONTINUANCE_PDF.getDocumentTitle(), bytes)); + + when(documentManagementService + .uploadDocument(BEARER_TOKEN, new PDF(fileName, bytes, NOTICE_OF_DISCONTINUANCE))) + .thenReturn(caseDocument); + + CaseData caseData = getCaseData(); + + CaseDocument caseDoc = formGenerator.generateDocs(caseData, BEARER_TOKEN); + assertThat(caseDoc).isNotNull(); + + verify(documentManagementService) + .uploadDocument(BEARER_TOKEN, new PDF(fileName, bytes, NOTICE_OF_DISCONTINUANCE)); + } + + private CaseData getCaseData() { + return CaseDataBuilder.builder().atStateClaimIssued().build().toBuilder() + .legacyCaseReference(REFERENCE_NUMBER) + .respondent1(PartyBuilder.builder().individual().build().toBuilder().individualFirstName("John").individualLastName("Doe").build()) + .applicant1(PartyBuilder.builder().individual().build().toBuilder().individualFirstName("James").individualLastName("White").build()) + .applicant2(PartyBuilder.builder().individual().build().toBuilder().individualFirstName("Jan").individualLastName("Black").build()) + .claimantWhoIsDiscontinuing(DynamicList.builder() + .value(DynamicListElement.builder() + .label("Both") + .build()) + .build()) + .claimantsConsentToDiscontinuance(YesOrNo.YES) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.YES) + .isPermissionGranted(SettleDiscontinueYesOrNoList.YES) + .permissionGrantedComplex(PermissionGranted.builder() + .permissionGrantedJudge("Judge Name") + .permissionGrantedDate(LocalDate.parse("2022-02-01")) + .build()) + .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) + .partDiscontinuanceDetails("partial part") + .build(); + } +} diff --git a/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java b/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java index 1ccf5862838..06f355b3e74 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java @@ -45,7 +45,7 @@ void setUp() { @Test void shouldSetUpTransitions_withExpectedSizeAndStates() { - assertThat(result).hasSize(14); + assertThat(result).hasSize(15); assertTransition(result.get(0), "MAIN.CLAIM_ISSUED", "MAIN.CLAIM_NOTIFIED"); assertTransition(result.get(1), "MAIN.CLAIM_ISSUED", "MAIN.TAKEN_OFFLINE_BY_STAFF"); @@ -61,6 +61,7 @@ void shouldSetUpTransitions_withExpectedSizeAndStates() { assertTransition(result.get(11), "MAIN.CLAIM_ISSUED", "MAIN.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED"); assertTransition(result.get(12), "MAIN.CLAIM_ISSUED", "MAIN.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE"); assertTransition(result.get(13), "MAIN.CLAIM_ISSUED", "MAIN.DIVERGENT_RESPOND_GO_OFFLINE"); + assertTransition(result.get(14), "MAIN.CLAIM_ISSUED", "MAIN.CASE_DISCONTINUED"); } @Test From bc2e94e4a12eead012aa85d7b82ef1b61d8bd6f4 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Tue, 16 Jul 2024 12:56:52 +0100 Subject: [PATCH 35/59] CIV-14259 changes --- .../docmosis/GenerateDiscontinueClaimCallbackHandler.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 16a44ff92db..7f708e2f876 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -19,7 +19,6 @@ import java.util.List; import java.util.Map; -import static java.util.Objects.nonNull; 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.GEN_NOTICE_OF_DISCONTINUANCE; @@ -56,7 +55,7 @@ private CallbackResponse generateNoticeOfDiscontinueDoc(CallbackParams callbackP CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); buildDocument(callbackParams, caseDataBuilder); CaseData updatedData = caseDataBuilder.build(); - if(isPermissionRequired(caseData)) { + if (isPermissionRequired(caseData)) { assignDiscontinuanceCategoryId(updatedData.getNoticeOfDiscontinueCWDoc()); updatedData.setNoticeOfDiscontinueAllParitiesDoc(null); System.out.println("isPermissionRequired--------if--------"); @@ -84,7 +83,7 @@ private boolean isPermissionRequired(CaseData caseData) { && SettleDiscontinueYesOrNoList.YES.equals(caseData.getIsPermissionGranted()); } - private void assignDiscontinuanceCategoryId(CaseDocument caseDocument ) { + private void assignDiscontinuanceCategoryId(CaseDocument caseDocument) { assignCategoryId.assignCategoryIdToCaseDocument(caseDocument, DocCategory.NOTICE_OF_DISCONTINUE.getValue()); } } From 95ad0ec1689b6e6d25af5ab421ed0ff9e06bf3b0 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Tue, 16 Jul 2024 13:44:55 +0100 Subject: [PATCH 36/59] Civ-14259 checkstyle fixed --- .../docmosis/GenerateDiscontinueClaimCallbackHandler.java | 6 ++++-- .../NoticeOfDiscontinuanceFormGeneratorTest.java | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 7f708e2f876..97ebdff7559 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; import uk.gov.hmcts.reform.ccd.client.model.CallbackResponse; @@ -25,6 +26,7 @@ @Service @RequiredArgsConstructor +@Slf4j public class GenerateDiscontinueClaimCallbackHandler extends CallbackHandler { private static final List EVENTS = List.of( @@ -58,11 +60,11 @@ private CallbackResponse generateNoticeOfDiscontinueDoc(CallbackParams callbackP if (isPermissionRequired(caseData)) { assignDiscontinuanceCategoryId(updatedData.getNoticeOfDiscontinueCWDoc()); updatedData.setNoticeOfDiscontinueAllParitiesDoc(null); - System.out.println("isPermissionRequired--------if--------"); + log.info("isPermissionRequired--------if------------------"); } else { assignDiscontinuanceCategoryId(updatedData.getNoticeOfDiscontinueAllParitiesDoc()); updatedData.setNoticeOfDiscontinueCWDoc(null); - System.out.println("isPermissionRequired-------else---------"); + log.info("isPermissionRequired--------else--------"); } return AboutToStartOrSubmitCallbackResponse.builder() diff --git a/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGeneratorTest.java b/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGeneratorTest.java index 8e81988c362..368c8296334 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGeneratorTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGeneratorTest.java @@ -33,7 +33,7 @@ import static uk.gov.hmcts.reform.civil.service.docmosis.DocmosisTemplates.NOTICE_OF_DISCONTINUANCE_PDF; @ExtendWith(MockitoExtension.class) -public class NoticeOfDiscontinuanceFormGeneratorTest { +class NoticeOfDiscontinuanceFormGeneratorTest { private static final String BEARER_TOKEN = "Bearer Token"; private static final byte[] bytes = {1, 2, 3, 4, 5, 6}; From c2d9e8ca458b036f24841ce574399153b61e075b Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 13:55:33 +0100 Subject: [PATCH 37/59] CIV-14244 Fixing error for the condition to discontinue. --- src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java index 11fa12474f3..84c8709e467 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseData.java @@ -1537,6 +1537,6 @@ public boolean nocApplyForLiPDefendant() { @JsonIgnore public boolean isJudgeOrderVerificationRequired() { - return (this.getCourtPermissionNeeded() != null || SettleDiscontinueYesOrNoList.YES.equals(this.getCourtPermissionNeeded())); + return (this.getCourtPermissionNeeded() != null && SettleDiscontinueYesOrNoList.YES.equals(this.getCourtPermissionNeeded())); } } From 27f1f11bce9a3f6cb07f9f29542105b2ff811a48 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 14:34:40 +0100 Subject: [PATCH 38/59] CIV-14244 Deleting the states not needed in the flowstate --- .../gov/hmcts/reform/civil/service/flowstate/FlowState.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java index 6b9d4de2614..52f5870404e 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java @@ -90,10 +90,6 @@ enum Main implements FlowState { SPEC_DEFENDANT_NOC, TAKEN_OFFLINE_SPEC_DEFENDANT_NOC, - - PENDING_CASE_ISSUED, - AWAITING_RESPONDENT_ACKNOWLEDGEMENT, - AWAITING_APPLICANT_INTENTION, CASE_DISCONTINUED; public static final String FLOW_NAME = "MAIN"; From f3355b974be3e09cb358529e5e0526724a7e701a Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:25:01 +0100 Subject: [PATCH 39/59] CIV-14244 Update the flag for camunda into runtime --- .../GenerateDiscontinueClaimCallbackHandler.java | 14 +++++++++++++- .../civil/service/flowstate/StateFlowEngine.java | 10 ++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 79343720612..8bf944d69ed 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; +import org.camunda.bpm.engine.RuntimeService; import org.springframework.stereotype.Service; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; import uk.gov.hmcts.reform.ccd.client.model.CallbackResponse; @@ -9,6 +10,7 @@ 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.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.model.CaseData; import java.util.List; @@ -28,6 +30,8 @@ public class GenerateDiscontinueClaimCallbackHandler extends CallbackHandler { private static final String TASK_ID = "GenerateNoticeOfDiscontinueClaim"; private final ObjectMapper objectMapper; + private final RuntimeService runTimeService; + @Override protected Map callbacks() { return Map.of(callbackKey(ABOUT_TO_SUBMIT), this::aboutToSubmit); @@ -47,9 +51,17 @@ public String camundaActivityId(CallbackParams callbackParams) { private CallbackResponse aboutToSubmit(CallbackParams callbackParams) { CaseData caseData = callbackParams.getCaseData(); CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); - + updateCamundaVars(caseData); return AboutToStartOrSubmitCallbackResponse.builder() .data(caseDataBuilder.build().toMap(objectMapper)) .build(); } + + private void updateCamundaVars(CaseData caseData) { + runTimeService.setVariable( + caseData.getBusinessProcess().getProcessInstanceId(), + "JUDGE_ORDER_VERIFICATION_REQUIRED", + caseData.isJudgeOrderVerificationRequired() + ); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java index 9e234b4f96e..58cada88a23 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/StateFlowEngine.java @@ -88,7 +88,6 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isInHearingReadiness; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isPayImmediately; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isRespondentResponseLangIsBilingual; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.judgeOrderVerificationRequired; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.lipFullDefenceProceed; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.multipartyCase; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.notificationAcknowledged; @@ -135,7 +134,6 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.ALL_RESPONSES_RECEIVED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CASE_DISCONTINUED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DETAILS_NOTIFIED_TIME_EXTENSION; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_DISMISSED_HEARING_FEE_DUE_DEADLINE; @@ -387,7 +385,7 @@ public StateFlow build(FlowState.Main initialState) { .state(PENDING_CLAIM_ISSUED_UNREPRESENTED_UNREGISTERED_DEFENDANT) .transitionTo(TAKEN_OFFLINE_UNREPRESENTED_UNREGISTERED_DEFENDANT).onlyIf(takenOfflineBySystem) .state(CLAIM_ISSUED) - .transitionTo(CLAIM_NOTIFIED).onlyIf(claimNotified.and(not(judgeOrderVerificationRequired))) + .transitionTo(CLAIM_NOTIFIED).onlyIf(claimNotified) .transitionTo(TAKEN_OFFLINE_BY_STAFF).onlyIf(takenOfflineByStaffAfterClaimIssue) .transitionTo(TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED).onlyIf(takenOfflineAfterClaimNotified) .transitionTo(PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA).onlyIf(pastClaimNotificationDeadline) @@ -400,7 +398,7 @@ public StateFlow build(FlowState.Main initialState) { flags.put(FlowFlag.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL.name(), true) ) .transitionTo(FULL_DEFENCE).onlyIf(fullDefenceSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual)) - .and(not(pastClaimNotificationDeadline)).and(not(judgeOrderVerificationRequired))) + .and(not(pastClaimNotificationDeadline))) .transitionTo(PART_ADMISSION).onlyIf(partAdmissionSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) .transitionTo(FULL_ADMISSION).onlyIf(fullAdmissionSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) .transitionTo(COUNTER_CLAIM).onlyIf(counterClaimSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) @@ -412,9 +410,6 @@ public StateFlow build(FlowState.Main initialState) { .onlyIf(divergentRespondWithDQAndGoOfflineSpec.and(specClaim)) .transitionTo(DIVERGENT_RESPOND_GO_OFFLINE) .onlyIf(divergentRespondGoOfflineSpec.and(specClaim)) - .transitionTo(CASE_DISCONTINUED).onlyIf(judgeOrderVerificationRequired) - .set(flags -> - flags.put(FlowFlag.JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true)) .state(CONTACT_DETAILS_CHANGE) .transitionTo(FULL_DEFENCE).onlyIf(fullDefenceSpec.and(not(isRespondentResponseLangIsBilingual))) .transitionTo(PART_ADMISSION).onlyIf(partAdmissionSpec.and(not(isRespondentResponseLangIsBilingual))) @@ -687,7 +682,6 @@ public StateFlow build(FlowState.Main initialState) { .state(SPEC_DEFENDANT_NOC) .transitionTo(TAKEN_OFFLINE_SPEC_DEFENDANT_NOC).onlyIf(nocSubmittedForLiPDefendant) .state(TAKEN_OFFLINE_SPEC_DEFENDANT_NOC) - .state(CASE_DISCONTINUED) .build(); } From ac31e2fb00b593930c4e42bc74f4da72eb7ed691 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:48:37 +0100 Subject: [PATCH 40/59] CIV-14244 Reverting changes for flowFlag on stateflowEngine --- .../hmcts/reform/civil/service/flowstate/FlowFlag.java | 3 +-- .../reform/civil/service/flowstate/FlowPredicate.java | 2 -- .../reform/civil/service/flowstate/FlowState.java | 3 +-- .../transitions/ClaimIssuedTransitionBuilder.java | 10 +++------- .../transitions/ClaimIssuedTransitionBuilderTest.java | 3 +-- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java index 06700945e63..23ab93e9f18 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowFlag.java @@ -21,6 +21,5 @@ public enum FlowFlag { CLAIM_ISSUE_HWF, LIP_JUDGMENT_ADMISSION, SETTLE_THE_CLAIM, - MINTI_ENABLED, - JUDGE_ORDER_VERIFICATION_REQUIRED; + MINTI_ENABLED; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java index 963f40b9c72..1547a61663d 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowPredicate.java @@ -1064,6 +1064,4 @@ private static boolean getPredicateForMultipartyCase(CaseData caseData) { caseData.getTakenOfflineByStaffDate() != null && (Objects.isNull(caseData.getMediation().getUnsuccessfulMediationReason()) && Objects.isNull(caseData.getMediation().getMediationUnsuccessfulReasonsMultiSelect())); - - public static final Predicate judgeOrderVerificationRequired = CaseData::isJudgeOrderVerificationRequired; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java index 52f5870404e..117fd4aaaac 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/flowstate/FlowState.java @@ -89,8 +89,7 @@ enum Main implements FlowState { SIGN_SETTLEMENT_AGREEMENT, SPEC_DEFENDANT_NOC, - TAKEN_OFFLINE_SPEC_DEFENDANT_NOC, - CASE_DISCONTINUED; + TAKEN_OFFLINE_SPEC_DEFENDANT_NOC; public static final String FLOW_NAME = "MAIN"; diff --git a/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java b/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java index 424defaef1b..2fada914992 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilder.java @@ -21,12 +21,10 @@ import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullAdmissionSpec; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.fullDefenceSpec; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.isRespondentResponseLangIsBilingual; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.judgeOrderVerificationRequired; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.partAdmissionSpec; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowPredicate.specClaim; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_FULL_DEFENCE_RECEIVED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED; -import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CASE_DISCONTINUED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CLAIM_NOTIFIED; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.CONTACT_DETAILS_CHANGE; import static uk.gov.hmcts.reform.civil.service.flowstate.FlowState.Main.COUNTER_CLAIM; @@ -49,7 +47,7 @@ public ClaimIssuedTransitionBuilder(FeatureToggleService featureToggleService) { @Override void setUpTransitions() { - this.moveTo(CLAIM_NOTIFIED).onlyWhen(claimNotified.and(not(judgeOrderVerificationRequired))) + this.moveTo(CLAIM_NOTIFIED).onlyWhen(claimNotified) .moveTo(TAKEN_OFFLINE_BY_STAFF).onlyWhen(takenOfflineByStaffAfterClaimIssue) .moveTo(TAKEN_OFFLINE_AFTER_CLAIM_NOTIFIED).onlyWhen(takenOfflineAfterClaimNotified) .moveTo(PAST_CLAIM_NOTIFICATION_DEADLINE_AWAITING_CAMUNDA).onlyWhen(pastClaimNotificationDeadline) @@ -58,7 +56,7 @@ void setUpTransitions() { .moveTo(RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL).onlyWhen(isRespondentResponseLangIsBilingual.and(not(contactDetailsChange))) .set(flags -> flags.put(FlowFlag.RESPONDENT_RESPONSE_LANGUAGE_IS_BILINGUAL.name(), true)) .moveTo(FULL_DEFENCE).onlyWhen(fullDefenceSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual)) - .and(not(pastClaimNotificationDeadline)).and(not(judgeOrderVerificationRequired))) + .and(not(pastClaimNotificationDeadline))) .moveTo(PART_ADMISSION).onlyWhen(partAdmissionSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) .moveTo(FULL_ADMISSION).onlyWhen(fullAdmissionSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) .moveTo(COUNTER_CLAIM).onlyWhen(counterClaimSpec.and(not(contactDetailsChange)).and(not(isRespondentResponseLangIsBilingual))) @@ -69,9 +67,7 @@ void setUpTransitions() { .moveTo(DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE) .onlyWhen(divergentRespondWithDQAndGoOfflineSpec.and(specClaim)) .moveTo(DIVERGENT_RESPOND_GO_OFFLINE) - .onlyWhen(divergentRespondGoOfflineSpec.and(specClaim)) - .moveTo(CASE_DISCONTINUED).onlyWhen(judgeOrderVerificationRequired) - .set(flags -> flags.put(FlowFlag.JUDGE_ORDER_VERIFICATION_REQUIRED.name(), true)); + .onlyWhen(divergentRespondGoOfflineSpec.and(specClaim)); } public static final Predicate claimNotified = caseData -> diff --git a/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java b/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java index 06f355b3e74..1ccf5862838 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/stateflow/transitions/ClaimIssuedTransitionBuilderTest.java @@ -45,7 +45,7 @@ void setUp() { @Test void shouldSetUpTransitions_withExpectedSizeAndStates() { - assertThat(result).hasSize(15); + assertThat(result).hasSize(14); assertTransition(result.get(0), "MAIN.CLAIM_ISSUED", "MAIN.CLAIM_NOTIFIED"); assertTransition(result.get(1), "MAIN.CLAIM_ISSUED", "MAIN.TAKEN_OFFLINE_BY_STAFF"); @@ -61,7 +61,6 @@ void shouldSetUpTransitions_withExpectedSizeAndStates() { assertTransition(result.get(11), "MAIN.CLAIM_ISSUED", "MAIN.AWAITING_RESPONSES_NOT_FULL_DEFENCE_RECEIVED"); assertTransition(result.get(12), "MAIN.CLAIM_ISSUED", "MAIN.DIVERGENT_RESPOND_GENERATE_DQ_GO_OFFLINE"); assertTransition(result.get(13), "MAIN.CLAIM_ISSUED", "MAIN.DIVERGENT_RESPOND_GO_OFFLINE"); - assertTransition(result.get(14), "MAIN.CLAIM_ISSUED", "MAIN.CASE_DISCONTINUED"); } @Test From edaa66d9b01a5db6bfc2c9744a26f48010f65cee Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:52:29 +0100 Subject: [PATCH 41/59] CIV-14244 Reverting changes for flowFlag on stateflowEngine --- .../docmosis/GenerateDiscontinueClaimCallbackHandler.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 8bf944d69ed..7225ab0614f 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -50,11 +50,8 @@ public String camundaActivityId(CallbackParams callbackParams) { private CallbackResponse aboutToSubmit(CallbackParams callbackParams) { CaseData caseData = callbackParams.getCaseData(); - CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); updateCamundaVars(caseData); - return AboutToStartOrSubmitCallbackResponse.builder() - .data(caseDataBuilder.build().toMap(objectMapper)) - .build(); + return AboutToStartOrSubmitCallbackResponse.builder().build(); } private void updateCamundaVars(CaseData caseData) { From b2ff72e3b6d130aee37307dc88a4e82f8d499ca1 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Tue, 16 Jul 2024 16:00:40 +0100 Subject: [PATCH 42/59] CIV-14259 code refactored --- Jenkinsfile_CNP | 4 +- .../CV-UNS-DEC-ENG-DISCONTINUANCE.docx | Bin 123113 -> 122097 bytes ...nerateDiscontinueClaimCallbackHandler.java | 19 ++-- .../service/docmosis/DocmosisTemplates.java | 2 +- .../NoticeOfDiscontinuanceFormGenerator.java | 2 +- ...teDiscontinueClaimCallbackHandlerTest.java | 107 ++++++++++++++++-- 6 files changed, 109 insertions(+), 25 deletions(-) diff --git a/Jenkinsfile_CNP b/Jenkinsfile_CNP index 11719d0d6ae..f30d7ccdf72 100644 --- a/Jenkinsfile_CNP +++ b/Jenkinsfile_CNP @@ -8,8 +8,8 @@ import uk.gov.hmcts.contino.GithubAPI def type = "java" def product = "civil" def component = "service" -def ccdBranch = "feat/CIV-14259" -def camundaBranch = "feat/CIV-14244" +def ccdBranch = "master" +def camundaBranch = "master" def yarnBuilder = new uk.gov.hmcts.contino.YarnBuilder(this) AppPipelineConfig pipelineConf diff --git a/docker/docmosis/templates/CV-UNS-DEC-ENG-DISCONTINUANCE.docx b/docker/docmosis/templates/CV-UNS-DEC-ENG-DISCONTINUANCE.docx index d869f4a43376dbec4a10ab1051849a62074462cf..d78bfb9dec17033c8822166f066e872055791d6a 100644 GIT binary patch delta 12402 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 delta 13461 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 ebnRdIrAuj`HGnWQ>1tZf8h{C2ZtWi&>VE;& EVENTS = List.of( @@ -57,27 +56,27 @@ private CallbackResponse generateNoticeOfDiscontinueDoc(CallbackParams callbackP CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); buildDocument(callbackParams, caseDataBuilder); CaseData updatedData = caseDataBuilder.build(); - if (isPermissionRequired(caseData)) { + + if (nonNull(updatedData.getNoticeOfDiscontinueCWDoc())) { assignDiscontinuanceCategoryId(updatedData.getNoticeOfDiscontinueCWDoc()); - updatedData.setNoticeOfDiscontinueAllParitiesDoc(null); - log.info("isPermissionRequired--------if------------------"); } else { assignDiscontinuanceCategoryId(updatedData.getNoticeOfDiscontinueAllParitiesDoc()); - updatedData.setNoticeOfDiscontinueCWDoc(null); - log.info("isPermissionRequired--------else--------"); } - return AboutToStartOrSubmitCallbackResponse.builder() .data(updatedData.toMap(objectMapper)) .build(); } private void buildDocument(CallbackParams callbackParams, CaseData.CaseDataBuilder caseDataBuilder) { + CaseData caseData = callbackParams.getCaseData(); CaseDocument caseDocument = formGenerator.generateDocs( callbackParams.getCaseData(), callbackParams.getParams().get(BEARER_TOKEN).toString()); - caseDataBuilder.noticeOfDiscontinueCWDoc(caseDocument); - caseDataBuilder.noticeOfDiscontinueAllParitiesDoc(caseDocument); + if (isPermissionRequired(caseData)) { + caseDataBuilder.noticeOfDiscontinueCWDoc(caseDocument); + } else { + caseDataBuilder.noticeOfDiscontinueAllParitiesDoc(caseDocument); + } } private boolean isPermissionRequired(CaseData caseData) { diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java index c8322b2f76c..ac66c33198e 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java @@ -92,7 +92,7 @@ public enum DocmosisTemplates { JUDGMENT_BY_ADMISSION_DEFENDANT("CV-SPC-DEC-ENG-00915.docx", "Judgment_by_admission_defendant.pdf"), JUDGMENT_BY_DETERMINATION_CLAIMANT("CV-SPC-DEC-ENG-00982.docx", "Judgment_by_determination_claimant.pdf"), JUDGMENT_BY_DETERMINATION_DEFENDANT("CV-SPC-DEC-ENG-00981.docx", "Judgment_by_determination_defendant.pdf"), - NOTICE_OF_DISCONTINUANCE_PDF("CV-UNS-DEC-ENG-DISCONTINUANCE.docx", "notice_Of_discontinuance_%s.pdf"); + NOTICE_OF_DISCONTINUANCE_PDF("CV-UNS-DEC-ENG-DISCONTINUANCE.docx", "notice_of_discontinuance_%s.pdf"); private final String template; private final String documentTitle; diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java index bfd7ba9b1a0..80de663547e 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java @@ -48,7 +48,7 @@ private String getFileName(CaseData caseData, DocmosisTemplates docmosisTemplate private NoticeOfDiscontinuanceForm getNoticeOfDiscontinueData(CaseData caseData) { var noticeOfDiscontinueBuilder = NoticeOfDiscontinuanceForm.builder() - .caseNumber(caseData.getCcdCaseReference().toString()) + .caseNumber(caseData.getLegacyCaseReference().toString()) .claimant1Name(caseData.getApplicant1().getPartyName()) .claimant2Name(nonNull(caseData.getApplicant2()) ? caseData.getApplicant2().getPartyName() : null) .defendant1Name(caseData.getRespondent1().getPartyName()) diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java index 05bd9ca0d49..6cd8c4a4799 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java @@ -1,23 +1,45 @@ package uk.gov.hmcts.reform.civil.handler.callback.camunda.docmosis; import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit.jupiter.SpringExtension; -import uk.gov.hmcts.reform.ccd.client.model.CallbackRequest; +import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; +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.Document; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.handler.callback.BaseCallbackHandlerTest; -import uk.gov.hmcts.reform.civil.sampledata.CallbackParamsBuilder; +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.PartyBuilder; +import uk.gov.hmcts.reform.civil.service.docmosis.settlediscontinue.NoticeOfDiscontinuanceFormGenerator; +import uk.gov.hmcts.reform.civil.utils.AssignCategoryId; + +import java.time.LocalDateTime; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.GEN_NOTICE_OF_DISCONTINUANCE; +import static uk.gov.hmcts.reform.civil.documentmanagement.model.DocumentType.NOTICE_OF_DISCONTINUANCE; @ExtendWith(SpringExtension.class) @SpringBootTest(classes = { GenerateDiscontinueClaimCallbackHandler.class, JacksonAutoConfiguration.class, + AssignCategoryId.class }) class GenerateDiscontinueClaimCallbackHandlerTest extends BaseCallbackHandlerTest { @@ -25,21 +47,84 @@ class GenerateDiscontinueClaimCallbackHandlerTest extends BaseCallbackHandlerTes private final ObjectMapper mapper = new ObjectMapper(); @Autowired private GenerateDiscontinueClaimCallbackHandler handler; + @MockBean + private NoticeOfDiscontinuanceFormGenerator formGenerator; - @Test - void handleEventsReturnsTheExpectedCallbackEvents() { - assertThat(handler.handledEvents()).containsOnly(GEN_NOTICE_OF_DISCONTINUANCE, GEN_NOTICE_OF_DISCONTINUANCE); + @Nested + class AboutToSubmitCallback { + @Test + void shouldGenerateNoticeOfDiscontinueDocForCW_whenCourtPermissionRequired() { + when(formGenerator.generateDocs(any(CaseData.class), anyString())).thenReturn(getCaseDocument()); + + CaseData caseData = CaseDataBuilder.builder().atStateNotificationAcknowledged().build().toBuilder() + .respondent1(getPartyDetails()) + .applicant1(getPartyDetails()) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.YES) + .isPermissionGranted(SettleDiscontinueYesOrNoList.YES) + .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) + .build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + verify(formGenerator).generateDocs(any(CaseData.class), eq("BEARER_TOKEN")); + + CaseData updatedData = mapper.convertValue(response.getData(), CaseData.class); + assertThat(updatedData.getNoticeOfDiscontinueCWDoc()).isNotNull(); + } + + @Test + void shouldGenerateNoticeOfDiscontinueDocForAllParties_whenNoCourtPermissionRequired() { + when(formGenerator.generateDocs(any(CaseData.class), anyString())).thenReturn(getCaseDocument()); + + CaseData caseData = CaseDataBuilder.builder().atStateNotificationAcknowledged().build().toBuilder() + .respondent1(getPartyDetails()) + .applicant1(getPartyDetails()) + .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO) + .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) + .build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + verify(formGenerator).generateDocs(any(CaseData.class), eq("BEARER_TOKEN")); + + CaseData updatedData = mapper.convertValue(response.getData(), CaseData.class); + assertThat(updatedData.getNoticeOfDiscontinueAllParitiesDoc()).isNotNull(); + } } @Test - void shouldReturnSpecCamundaTask_whenSpecEvent() { - assertThat(handler.camundaActivityId(CallbackParamsBuilder.builder().request(CallbackRequest.builder().eventId( - "GEN_NOTICE_OF_DISCONTINUANCE").build()).build())).isEqualTo("GenerateNoticeOfDiscontinueClaim"); + void shouldReturnCorrectActivityId_whenRequested() { + CaseData caseData = CaseDataBuilder.builder().atStateClaimDetailsNotified().build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + assertThat(handler.camundaActivityId(params)).isEqualTo("GenerateNoticeOfDiscontinueClaim"); } @Test - void shouldReturnUnSpecCamundaTask_whenUnSpecEvent() { - assertThat(handler.camundaActivityId(CallbackParamsBuilder.builder().request(CallbackRequest.builder().eventId( - "GEN_NOTICE_OF_DISCONTINUANCE").build()).build())).isEqualTo("GenerateNoticeOfDiscontinueClaim"); + void handleEventsReturnsTheExpectedCallbackEvent() { + assertThat(handler.handledEvents()).contains(GEN_NOTICE_OF_DISCONTINUANCE); + } + + private Party getPartyDetails() { + return PartyBuilder.builder().individual().build().toBuilder() + .individualFirstName("John") + .individualLastName("Doe") + .build(); + } + + private CaseDocument getCaseDocument() { + return CaseDocument.builder() + .createdBy("John") + .documentName("document name") + .documentSize(0L) + .documentType(NOTICE_OF_DISCONTINUANCE) + .createdDatetime(LocalDateTime.now()) + .documentLink(Document.builder() + .documentUrl("fake-url") + .documentFileName("file-name") + .documentBinaryUrl("binary-url") + .build()) + .build(); } } From 4b826463c27ee6fcc5ae8158c895cf7639585ab7 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:12:53 +0100 Subject: [PATCH 43/59] CIV-14244 Reverting changes for flowFlag on stateflowEngine --- ...nerateDiscontinueClaimCallbackHandler.java | 1 - ...teDiscontinueClaimCallbackHandlerTest.java | 55 +++++++++++++------ 2 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 7225ab0614f..0af36839f49 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -10,7 +10,6 @@ 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.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.model.CaseData; import java.util.List; diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java index 05bd9ca0d49..48cc0f2fd0a 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java @@ -1,17 +1,26 @@ package uk.gov.hmcts.reform.civil.handler.callback.camunda.docmosis; import com.fasterxml.jackson.databind.ObjectMapper; -import org.junit.jupiter.api.Test; +import org.camunda.bpm.engine.RuntimeService; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import uk.gov.hmcts.reform.ccd.client.model.CallbackRequest; +import uk.gov.hmcts.reform.civil.callback.CallbackParams; +import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.handler.callback.BaseCallbackHandlerTest; -import uk.gov.hmcts.reform.civil.sampledata.CallbackParamsBuilder; +import uk.gov.hmcts.reform.civil.model.BusinessProcess; +import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; -import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.GEN_NOTICE_OF_DISCONTINUANCE; @ExtendWith(SpringExtension.class) @@ -25,21 +34,35 @@ class GenerateDiscontinueClaimCallbackHandlerTest extends BaseCallbackHandlerTes private final ObjectMapper mapper = new ObjectMapper(); @Autowired private GenerateDiscontinueClaimCallbackHandler handler; + @MockBean + private RuntimeService runTimeService; - @Test - void handleEventsReturnsTheExpectedCallbackEvents() { - assertThat(handler.handledEvents()).containsOnly(GEN_NOTICE_OF_DISCONTINUANCE, GEN_NOTICE_OF_DISCONTINUANCE); - } + private static final String processId = "process-id"; - @Test - void shouldReturnSpecCamundaTask_whenSpecEvent() { - assertThat(handler.camundaActivityId(CallbackParamsBuilder.builder().request(CallbackRequest.builder().eventId( - "GEN_NOTICE_OF_DISCONTINUANCE").build()).build())).isEqualTo("GenerateNoticeOfDiscontinueClaim"); - } + @Nested + class AboutToSubmitCallback { - @Test - void shouldReturnUnSpecCamundaTask_whenUnSpecEvent() { - assertThat(handler.camundaActivityId(CallbackParamsBuilder.builder().request(CallbackRequest.builder().eventId( - "GEN_NOTICE_OF_DISCONTINUANCE").build()).build())).isEqualTo("GenerateNoticeOfDiscontinueClaim"); + @ParameterizedTest + @ValueSource(booleans = {true, false}) + void shouldUpdateCamundaVariables_whenInvoked(Boolean toggleState) { + //Given + CaseData caseData = CaseDataBuilder.builder() + .businessProcess(BusinessProcess.builder().processInstanceId(processId).build()).build(); + caseData.setCourtPermissionNeeded( + toggleState ? SettleDiscontinueYesOrNoList.YES : SettleDiscontinueYesOrNoList.NO); + + CallbackParams params = CallbackParams.builder() + .caseData(caseData) + .type(ABOUT_TO_SUBMIT) + .request(CallbackRequest.builder() + .eventId(GEN_NOTICE_OF_DISCONTINUANCE.name()) + .build()) + .build(); + //When + handler.handle(params); + //Then + verify(runTimeService).setVariable(processId, "JUDGE_ORDER_VERIFICATION_REQUIRED", toggleState); + } } + } From 8c44edc2b920b6cc2801fb3b134da8754c7b126a Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Tue, 16 Jul 2024 16:24:51 +0100 Subject: [PATCH 44/59] CIV-14259 merge issue fixed --- .../docmosis/GenerateDiscontinueClaimCallbackHandler.java | 1 - .../GenerateDiscontinueClaimCallbackHandlerTest.java | 7 +++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index a18e8ba0507..cab4e677070 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -36,7 +36,6 @@ public class GenerateDiscontinueClaimCallbackHandler extends CallbackHandler { private final ObjectMapper objectMapper; private final AssignCategoryId assignCategoryId; private final NoticeOfDiscontinuanceFormGenerator formGenerator; - private final RuntimeService runTimeService; @Override diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java index 6cd8c4a4799..91a9560daaa 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandlerTest.java @@ -1,6 +1,7 @@ package uk.gov.hmcts.reform.civil.handler.callback.camunda.docmosis; import com.fasterxml.jackson.databind.ObjectMapper; +import org.camunda.bpm.engine.RuntimeService; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -16,6 +17,7 @@ import uk.gov.hmcts.reform.civil.enums.settlediscontinue.DiscontinuanceTypeList; 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.BusinessProcess; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.Party; import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; @@ -49,6 +51,9 @@ class GenerateDiscontinueClaimCallbackHandlerTest extends BaseCallbackHandlerTes private GenerateDiscontinueClaimCallbackHandler handler; @MockBean private NoticeOfDiscontinuanceFormGenerator formGenerator; + @MockBean + private RuntimeService runTimeService; + public static final String PROCESS_INSTANCE_ID = "processInstanceId"; @Nested class AboutToSubmitCallback { @@ -61,6 +66,7 @@ void shouldGenerateNoticeOfDiscontinueDocForCW_whenCourtPermissionRequired() { .applicant1(getPartyDetails()) .courtPermissionNeeded(SettleDiscontinueYesOrNoList.YES) .isPermissionGranted(SettleDiscontinueYesOrNoList.YES) + .businessProcess(BusinessProcess.builder().processInstanceId(PROCESS_INSTANCE_ID).build()) .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) .build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); @@ -82,6 +88,7 @@ void shouldGenerateNoticeOfDiscontinueDocForAllParties_whenNoCourtPermissionRequ .applicant1(getPartyDetails()) .courtPermissionNeeded(SettleDiscontinueYesOrNoList.NO) .typeOfDiscontinuance(DiscontinuanceTypeList.PART_DISCONTINUANCE) + .businessProcess(BusinessProcess.builder().processInstanceId(PROCESS_INSTANCE_ID).build()) .build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); From e05e945445df81bf330769af557a0a3e34513a49 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Wed, 17 Jul 2024 09:16:54 +0100 Subject: [PATCH 45/59] removed toString() --- .../settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java index 80de663547e..4fc762b47ea 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java @@ -48,7 +48,7 @@ private String getFileName(CaseData caseData, DocmosisTemplates docmosisTemplate private NoticeOfDiscontinuanceForm getNoticeOfDiscontinueData(CaseData caseData) { var noticeOfDiscontinueBuilder = NoticeOfDiscontinuanceForm.builder() - .caseNumber(caseData.getLegacyCaseReference().toString()) + .caseNumber(caseData.getLegacyCaseReference()) .claimant1Name(caseData.getApplicant1().getPartyName()) .claimant2Name(nonNull(caseData.getApplicant2()) ? caseData.getApplicant2().getPartyName() : null) .defendant1Name(caseData.getRespondent1().getPartyName()) From da81ab5d91b2b2aaa5237e3e8aae8a32611dc5ee Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:14:58 +0100 Subject: [PATCH 46/59] CIV-14244 Forgot upload the Defentand2 blank handler for continue with the camunda flow. --- ...2ClaimDiscontinuedNotificationHandler.java | 47 +++++++++++ ...imDiscontinuedNotificationHandlerTest.java | 77 +++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandler.java create mode 100644 src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandlerTest.java diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandler.java new file mode 100644 index 00000000000..97459894354 --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandler.java @@ -0,0 +1,47 @@ +package uk.gov.hmcts.reform.civil.handler.callback.camunda.notification; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +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 java.util.List; +import java.util.Map; + +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.callback.CaseEvent.NOTIFY_DISCONTINUANCE_DEFENDANT2; + +@Service +@RequiredArgsConstructor +public class NotifyDefendant2ClaimDiscontinuedNotificationHandler extends CallbackHandler + implements NotificationData { + + private static final List EVENTS = List.of(NOTIFY_DISCONTINUANCE_DEFENDANT2); + public static final String TASK_ID = "NotifyDefendant2ClaimDiscontinued"; + + @Override + protected Map callbacks() { + return Map.of( + callbackKey(ABOUT_TO_SUBMIT), + this::emptyCallbackResponse + ); + } + + @Override + public String camundaActivityId(CallbackParams callbackParams) { + return TASK_ID; + } + + @Override + public List handledEvents() { + return EVENTS; + } + + @Override + public Map addProperties(CaseData caseData) { + return null; + } +} diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandlerTest.java new file mode 100644 index 00000000000..92c9ebff9dc --- /dev/null +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandlerTest.java @@ -0,0 +1,77 @@ +package uk.gov.hmcts.reform.civil.handler.callback.camunda.notification; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import uk.gov.hmcts.reform.ccd.client.model.CallbackRequest; +import uk.gov.hmcts.reform.civil.callback.CallbackParams; +import uk.gov.hmcts.reform.civil.callback.CaseEvent; +import uk.gov.hmcts.reform.civil.handler.callback.BaseCallbackHandlerTest; +import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.notify.NotificationsProperties; +import uk.gov.hmcts.reform.civil.prd.model.Organisation; +import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; +import uk.gov.hmcts.reform.civil.service.OrganisationService; + +import java.util.Optional; + +import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.when; +import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; + +@SpringBootTest(classes = { + NotifyDefendant2ClaimDiscontinuedNotificationHandler.class, + NotificationsProperties.class, + JacksonAutoConfiguration.class +}) +class NotifyDefendant2ClaimDiscontinuedNotificationHandlerTest extends BaseCallbackHandlerTest { + + public static final String TEMPLATE_ID = "template-id"; + + private static final String REFERENCE_NUMBER = "8372942374"; + + @MockBean + private NotificationsProperties notificationsProperties; + + @MockBean + private OrganisationService organisationService; + + @Autowired + private NotifyDefendant2ClaimDiscontinuedNotificationHandler handler; + + @Nested + class AboutToSubmitCallback { + + @BeforeEach + void setup() { + when(notificationsProperties.getNotifyClaimDiscontinuedLRTemplate()).thenReturn( + TEMPLATE_ID); + when(organisationService.findOrganisationById(anyString())) + .thenReturn(Optional.of(Organisation.builder().name("Test Org Name").build())); + } + + @Test + void shouldNotifyDefendant2ClaimDiscontinued_whenInvoked() { + + CaseData caseData = CaseDataBuilder.builder() + .legacyCaseReference(REFERENCE_NUMBER) + .atStateClaimDetailsNotified_1v2_andNotifyBothSolicitors() + .atStateClaimDraft().build(); + + CallbackParams params = CallbackParams.builder() + .caseData(caseData) + .type(ABOUT_TO_SUBMIT) + .request(CallbackRequest.builder() + .eventId(CaseEvent.NOTIFY_DISCONTINUANCE_DEFENDANT1.name()) + .build()) + .build(); + + handler.handle(params); + + } + } +} From 9fb0dc6c1c30262436c22bef5f3555391ba784cb Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:30:27 +0100 Subject: [PATCH 47/59] CIV-14244 Error on test name --- .../NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java index 2b503280ec3..6c5f73121a8 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyClaimantClaimDiscontinuedNotificationHandlerTest.java @@ -61,7 +61,7 @@ void setup() { } @Test - void shouldNotifyClaimantJudgmentByAdmission_whenInvoked() { + void shouldNotifyClaimantClaimDiscontinued_whenInvoked() { CaseData caseData = CaseDataBuilder.builder() .legacyCaseReference(REFERENCE_NUMBER) From 8893729e75555660d4d26e58ba2ea0906eec9107 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Thu, 18 Jul 2024 09:30:54 +0100 Subject: [PATCH 48/59] CIV-14385 initial commit --- ...continuanceLetterLiPDefendant1Handler.java | 66 +++++++++++++ ...iceOfDiscontinuanceLiPLetterGenerator.java | 47 ++++++++++ ...inuanceLetterLiPDefendant1HandlerTest.java | 70 ++++++++++++++ ...fDiscontinuanceLiPLetterGeneratorTest.java | 93 +++++++++++++++++++ 4 files changed, 276 insertions(+) create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/PostNoticeOfDiscontinuanceLetterLiPDefendant1Handler.java create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceLiPLetterGenerator.java create mode 100644 src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/PostNoticeOfDiscontinuanceLetterLiPDefendant1HandlerTest.java create mode 100644 src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceLiPLetterGeneratorTest.java 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..7ee3b99943a --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/PostNoticeOfDiscontinuanceLetterLiPDefendant1Handler.java @@ -0,0 +1,66 @@ +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.enums.YesOrNo; +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 (isRespondent1Lip(caseData)) { + generateNoticeOfDiscontinuanceLiPDefendantLetter(callbackParams); + } + return AboutToStartOrSubmitCallbackResponse.builder().build(); + } + + private boolean isRespondent1Lip(CaseData caseData) { + return YesOrNo.NO.equals(caseData.getRespondent1Represented()); + } + + 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())); + } +} From 49a640ddcbca8f0b84914c20b6a250fd1fc149e7 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 <114995593+kalachandrasekar1@users.noreply.github.com> Date: Thu, 18 Jul 2024 10:47:06 +0100 Subject: [PATCH 49/59] Update Jenkinsfile_CNP --- Jenkinsfile_CNP | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile_CNP b/Jenkinsfile_CNP index f30d7ccdf72..11719d0d6ae 100644 --- a/Jenkinsfile_CNP +++ b/Jenkinsfile_CNP @@ -8,8 +8,8 @@ import uk.gov.hmcts.contino.GithubAPI def type = "java" def product = "civil" def component = "service" -def ccdBranch = "master" -def camundaBranch = "master" +def ccdBranch = "feat/CIV-14259" +def camundaBranch = "feat/CIV-14244" def yarnBuilder = new uk.gov.hmcts.contino.YarnBuilder(this) AppPipelineConfig pipelineConf From 43ae1f283e50788c9cfbd3acd5ce00e0b6e8a431 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 <114995593+kalachandrasekar1@users.noreply.github.com> Date: Thu, 18 Jul 2024 10:48:36 +0100 Subject: [PATCH 50/59] Update Jenkinsfile_CNP --- Jenkinsfile_CNP | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile_CNP b/Jenkinsfile_CNP index 11719d0d6ae..f30d7ccdf72 100644 --- a/Jenkinsfile_CNP +++ b/Jenkinsfile_CNP @@ -8,8 +8,8 @@ import uk.gov.hmcts.contino.GithubAPI def type = "java" def product = "civil" def component = "service" -def ccdBranch = "feat/CIV-14259" -def camundaBranch = "feat/CIV-14244" +def ccdBranch = "master" +def camundaBranch = "master" def yarnBuilder = new uk.gov.hmcts.contino.YarnBuilder(this) AppPipelineConfig pipelineConf From e109cee6715880da93e9470b4a875c5ae2767c63 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Thu, 18 Jul 2024 12:30:45 +0100 Subject: [PATCH 51/59] CIV-14259 template name updated --- ...SCONTINUANCE.docx => CV-CMC-GNO-ENG-SD0001.docx} | Bin .../civil/service/docmosis/DocmosisTemplates.java | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename docker/docmosis/templates/{CV-UNS-DEC-ENG-DISCONTINUANCE.docx => CV-CMC-GNO-ENG-SD0001.docx} (100%) diff --git a/docker/docmosis/templates/CV-UNS-DEC-ENG-DISCONTINUANCE.docx b/docker/docmosis/templates/CV-CMC-GNO-ENG-SD0001.docx similarity index 100% rename from docker/docmosis/templates/CV-UNS-DEC-ENG-DISCONTINUANCE.docx rename to docker/docmosis/templates/CV-CMC-GNO-ENG-SD0001.docx diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java index ac66c33198e..0564c26b724 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/DocmosisTemplates.java @@ -92,7 +92,7 @@ public enum DocmosisTemplates { JUDGMENT_BY_ADMISSION_DEFENDANT("CV-SPC-DEC-ENG-00915.docx", "Judgment_by_admission_defendant.pdf"), JUDGMENT_BY_DETERMINATION_CLAIMANT("CV-SPC-DEC-ENG-00982.docx", "Judgment_by_determination_claimant.pdf"), JUDGMENT_BY_DETERMINATION_DEFENDANT("CV-SPC-DEC-ENG-00981.docx", "Judgment_by_determination_defendant.pdf"), - NOTICE_OF_DISCONTINUANCE_PDF("CV-UNS-DEC-ENG-DISCONTINUANCE.docx", "notice_of_discontinuance_%s.pdf"); + NOTICE_OF_DISCONTINUANCE_PDF("CV-CMC-GNO-ENG-SD0001.docx", "notice_of_discontinuance_%s.pdf"); private final String template; private final String documentTitle; From 00a60cd8290b5ef42287d26bc0582ad722218797 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Thu, 18 Jul 2024 17:12:38 +0100 Subject: [PATCH 52/59] CIV-14259 testing issue fixed --- .../NoticeOfDiscontinuanceFormGenerator.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java index 4fc762b47ea..de28fbf1997 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java @@ -59,7 +59,8 @@ private NoticeOfDiscontinuanceForm getNoticeOfDiscontinueData(CaseData caseData) .claimantsConsentToDiscontinuance(nonNull(caseData.getClaimantsConsentToDiscontinuance()) ? caseData.getClaimantsConsentToDiscontinuance().toString() : null) .courtPermission(caseData.getCourtPermissionNeeded().getDisplayedValue()) - .permissionGranted(nonNull(caseData.getIsPermissionGranted()) ? caseData.getIsPermissionGranted().getDisplayedValue() : null) + .permissionGranted(nonNull(caseData.getIsPermissionGranted()) + ? caseData.getIsPermissionGranted().getDisplayedValue() : null) .judgeName(isCourtPermissionGranted(caseData) ? caseData.getPermissionGrantedComplex().getPermissionGrantedJudge() : null) .judgementDate(isCourtPermissionGranted(caseData) @@ -67,19 +68,26 @@ private NoticeOfDiscontinuanceForm getNoticeOfDiscontinueData(CaseData caseData) .typeOfDiscontinuance(caseData.getTypeOfDiscontinuance().toString()) .typeOfDiscontinuanceTxt(caseData.getTypeOfDiscontinuance().getType()) .partOfDiscontinuanceTxt(caseData.getPartDiscontinuanceDetails()) - .discontinuingAgainstOneDefendant(nonNull(caseData.getDiscontinuingAgainstOneDefendant()) - ? caseData.getDiscontinuingAgainstOneDefendant().getValue().getLabel() : null) + .discontinuingAgainstOneDefendant(getDiscontinueAgainstOneDefendant(caseData)) .discontinuingAgainstBothDefendants(nonNull(caseData.getIsDiscontinuingAgainstBothDefendants()) ? caseData.getIsDiscontinuingAgainstBothDefendants().getDisplayedValue() : null); return noticeOfDiscontinueBuilder.build(); } private String getClaimantWhoIsDiscontinue(CaseData caseData) { - return nonNull(caseData.getClaimantWhoIsDiscontinuing()) + return (nonNull(caseData.getClaimantWhoIsDiscontinuing()) + && nonNull(caseData.getClaimantWhoIsDiscontinuing().getValue())) ? caseData.getClaimantWhoIsDiscontinuing().getValue().getLabel() : caseData.getApplicant1().getPartyName(); } + private String getDiscontinueAgainstOneDefendant(CaseData caseData) { + return (nonNull(caseData.getDiscontinuingAgainstOneDefendant()) + && nonNull(caseData.getDiscontinuingAgainstOneDefendant().getValue())) + ? caseData.getDiscontinuingAgainstOneDefendant().getValue().getLabel() + : null; + } + private boolean isCourtPermissionGranted(CaseData caseData) { return nonNull(caseData.getIsPermissionGranted()) && SettleDiscontinueYesOrNoList.YES.equals(caseData.getIsPermissionGranted()); From a70156ecda8ca1c4da8bfbbd2d5afd5ef8968f4b Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Fri, 19 Jul 2024 09:33:56 +0100 Subject: [PATCH 53/59] CIV-14259 review comments updated --- .../templates/CV-CMC-GNO-ENG-SD0001.docx | Bin 122097 -> 124128 bytes ...nerateDiscontinueClaimCallbackHandler.java | 7 +------ .../NoticeOfDiscontinuanceFormGenerator.java | 12 +++++++++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/docker/docmosis/templates/CV-CMC-GNO-ENG-SD0001.docx b/docker/docmosis/templates/CV-CMC-GNO-ENG-SD0001.docx index d78bfb9dec17033c8822166f066e872055791d6a..5283009d2ebfcdac2b923e8530458928572ca38c 100644 GIT binary patch delta 15223 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 Rf4^B6I0%U1%HP*O{twg3W$XX| diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index cab4e677070..27d34e1cb71 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -75,18 +75,13 @@ private void buildDocument(CallbackParams callbackParams, CaseData.CaseDataBuild CaseDocument caseDocument = formGenerator.generateDocs( callbackParams.getCaseData(), callbackParams.getParams().get(BEARER_TOKEN).toString()); - if (isPermissionRequired(caseData)) { + if (caseData.isJudgeOrderVerificationRequired()) { caseDataBuilder.noticeOfDiscontinueCWDoc(caseDocument); } else { caseDataBuilder.noticeOfDiscontinueAllParitiesDoc(caseDocument); } } - private boolean isPermissionRequired(CaseData caseData) { - return SettleDiscontinueYesOrNoList.YES.equals(caseData.getCourtPermissionNeeded()) - && SettleDiscontinueYesOrNoList.YES.equals(caseData.getIsPermissionGranted()); - } - private void assignDiscontinuanceCategoryId(CaseDocument caseDocument) { assignCategoryId.assignCategoryIdToCaseDocument(caseDocument, DocCategory.NOTICE_OF_DISCONTINUE.getValue()); } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java index de28fbf1997..079fa6e8a34 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/settlediscontinue/NoticeOfDiscontinuanceFormGenerator.java @@ -7,6 +7,7 @@ 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.PDF; +import uk.gov.hmcts.reform.civil.enums.YesOrNo; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.docmosis.DocmosisDocument; @@ -57,8 +58,9 @@ private NoticeOfDiscontinuanceForm getNoticeOfDiscontinueData(CaseData caseData) .defendantNum(nonNull(caseData.getRespondent2()) ? "Defendant 1" : "Defendant") .claimantWhoIsDiscontinue(getClaimantWhoIsDiscontinue(caseData)) .claimantsConsentToDiscontinuance(nonNull(caseData.getClaimantsConsentToDiscontinuance()) - ? caseData.getClaimantsConsentToDiscontinuance().toString() : null) - .courtPermission(caseData.getCourtPermissionNeeded().getDisplayedValue()) + ? getConsentToDiscontinue(caseData) : null) + .courtPermission(nonNull(caseData.getCourtPermissionNeeded()) + ? caseData.getCourtPermissionNeeded().getDisplayedValue() : null) .permissionGranted(nonNull(caseData.getIsPermissionGranted()) ? caseData.getIsPermissionGranted().getDisplayedValue() : null) .judgeName(isCourtPermissionGranted(caseData) @@ -88,9 +90,13 @@ && nonNull(caseData.getDiscontinuingAgainstOneDefendant().getValue())) : null; } + private String getConsentToDiscontinue(CaseData caseData) { + return YesOrNo.YES.equals( + caseData.getClaimantsConsentToDiscontinuance()) ? "Yes" : "No"; + } + private boolean isCourtPermissionGranted(CaseData caseData) { return nonNull(caseData.getIsPermissionGranted()) && SettleDiscontinueYesOrNoList.YES.equals(caseData.getIsPermissionGranted()); } } - From 1dee78b40e623935e642b387312396142013547b Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 <114995593+kalachandrasekar1@users.noreply.github.com> Date: Fri, 19 Jul 2024 09:42:57 +0100 Subject: [PATCH 54/59] checkstyle fixed --- .../docmosis/GenerateDiscontinueClaimCallbackHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java index 27d34e1cb71..94601bd9041 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/docmosis/GenerateDiscontinueClaimCallbackHandler.java @@ -12,7 +12,6 @@ import uk.gov.hmcts.reform.civil.callback.CaseEvent; import uk.gov.hmcts.reform.civil.documentmanagement.model.CaseDocument; import uk.gov.hmcts.reform.civil.enums.DocCategory; -import uk.gov.hmcts.reform.civil.enums.settlediscontinue.SettleDiscontinueYesOrNoList; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.service.docmosis.settlediscontinue.NoticeOfDiscontinuanceFormGenerator; import uk.gov.hmcts.reform.civil.utils.AssignCategoryId; From 72b82081da576ad57352d988c51b7457a9b335e8 Mon Sep 17 00:00:00 2001 From: Omaira-Melo-Hmcts <148855113+Omaira-Melo-Hmcts@users.noreply.github.com> Date: Fri, 19 Jul 2024 09:58:32 +0100 Subject: [PATCH 55/59] CIV-14244 Fixing defendant2 notification error --- ...2ClaimDiscontinuedNotificationHandler.java | 45 ++++++++++++++++++- ...imDiscontinuedNotificationHandlerTest.java | 27 ++++++++++- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandler.java index 97459894354..c0da342b167 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandler.java @@ -2,17 +2,23 @@ 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.notify.NotificationService; +import uk.gov.hmcts.reform.civil.notify.NotificationsProperties; +import uk.gov.hmcts.reform.civil.service.OrganisationService; import java.util.List; import java.util.Map; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.NOTIFY_DISCONTINUANCE_DEFENDANT2; +import static uk.gov.hmcts.reform.civil.utils.NotificationUtils.getRespondentLegalOrganizationName; @Service @RequiredArgsConstructor @@ -22,11 +28,18 @@ public class NotifyDefendant2ClaimDiscontinuedNotificationHandler extends Callba private static final List EVENTS = List.of(NOTIFY_DISCONTINUANCE_DEFENDANT2); public static final String TASK_ID = "NotifyDefendant2ClaimDiscontinued"; + private static final String REFERENCE_TEMPLATE = + "defendant2-claim-discontinued-%s"; + + private final NotificationService notificationService; + private final NotificationsProperties notificationsProperties; + private final OrganisationService organisationService; + @Override protected Map callbacks() { return Map.of( callbackKey(ABOUT_TO_SUBMIT), - this::emptyCallbackResponse + this::notifyDefendant2ClaimDiscontinued ); } @@ -40,8 +53,36 @@ public List handledEvents() { return EVENTS; } + private CallbackResponse notifyDefendant2ClaimDiscontinued(CallbackParams callbackParams) { + CaseData caseData = callbackParams.getCaseData(); + + if (!caseData.isRespondent2LiP()) { + notificationService.sendMail( + caseData.getRespondentSolicitor2EmailAddress(), + getLRTemplate(), + addProperties(caseData), + getReferenceTemplate(caseData) + ); + } + + return AboutToStartOrSubmitCallbackResponse.builder().build(); + } + + private String getLRTemplate() { + return notificationsProperties.getNotifyClaimDiscontinuedLRTemplate(); + } + + private String getReferenceTemplate(CaseData caseData) { + return String.format(REFERENCE_TEMPLATE, caseData.getLegacyCaseReference()); + } + @Override public Map addProperties(CaseData caseData) { - return null; + return Map.of( + CLAIM_REFERENCE_NUMBER, + caseData.getLegacyCaseReference(), + LEGAL_ORG_NAME, + getRespondentLegalOrganizationName(caseData.getRespondent2OrganisationPolicy(), organisationService) + ); } } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandlerTest.java index 92c9ebff9dc..5561b0d64c8 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/NotifyDefendant2ClaimDiscontinuedNotificationHandlerTest.java @@ -12,16 +12,22 @@ import uk.gov.hmcts.reform.civil.callback.CaseEvent; import uk.gov.hmcts.reform.civil.handler.callback.BaseCallbackHandlerTest; import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.notify.NotificationService; import uk.gov.hmcts.reform.civil.notify.NotificationsProperties; import uk.gov.hmcts.reform.civil.prd.model.Organisation; import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; import uk.gov.hmcts.reform.civil.service.OrganisationService; +import java.util.Map; import java.util.Optional; import static org.mockito.Mockito.anyString; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; +import static uk.gov.hmcts.reform.civil.handler.callback.camunda.notification.NotificationData.CLAIM_REFERENCE_NUMBER; +import static uk.gov.hmcts.reform.civil.handler.callback.camunda.notification.NotificationData.LEGAL_ORG_NAME; @SpringBootTest(classes = { NotifyDefendant2ClaimDiscontinuedNotificationHandler.class, @@ -34,6 +40,9 @@ class NotifyDefendant2ClaimDiscontinuedNotificationHandlerTest extends BaseCallb private static final String REFERENCE_NUMBER = "8372942374"; + @MockBean + private NotificationService notificationService; + @MockBean private NotificationsProperties notificationsProperties; @@ -51,7 +60,7 @@ void setup() { when(notificationsProperties.getNotifyClaimDiscontinuedLRTemplate()).thenReturn( TEMPLATE_ID); when(organisationService.findOrganisationById(anyString())) - .thenReturn(Optional.of(Organisation.builder().name("Test Org Name").build())); + .thenReturn(Optional.of(Organisation.builder().name("Test Org Name 2").build())); } @Test @@ -66,12 +75,26 @@ void shouldNotifyDefendant2ClaimDiscontinued_whenInvoked() { .caseData(caseData) .type(ABOUT_TO_SUBMIT) .request(CallbackRequest.builder() - .eventId(CaseEvent.NOTIFY_DISCONTINUANCE_DEFENDANT1.name()) + .eventId(CaseEvent.NOTIFY_DISCONTINUANCE_DEFENDANT2.name()) .build()) .build(); handler.handle(params); + verify(notificationService, times(1)).sendMail( + "respondentsolicitor2@example.com", + TEMPLATE_ID, + addProperties(caseData), + "defendant2-claim-discontinued-000DC001" + ); + + } + + public Map addProperties(CaseData caseData) { + return Map.of( + CLAIM_REFERENCE_NUMBER, caseData.getLegacyCaseReference(), + LEGAL_ORG_NAME, "Test Org Name 2" + ); } } } From c05c11485f526107906948f359a8d374bc18a661 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Fri, 19 Jul 2024 13:05:13 +0100 Subject: [PATCH 56/59] CIV-14259 template updated --- .../templates/CV-CMC-GNO-ENG-SD0001.docx | Bin 124128 -> 122615 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docker/docmosis/templates/CV-CMC-GNO-ENG-SD0001.docx b/docker/docmosis/templates/CV-CMC-GNO-ENG-SD0001.docx index 5283009d2ebfcdac2b923e8530458928572ca38c..9a6192cfb01a094e608f2eb117003840f39ede29 100644 GIT binary patch delta 8402 zcmZ8`b9fy}^zAvZ(b%@_q+yfBw$&t!&C^&78lBj-ZQHh!292#>?|bii_uV&t%{Q}V z*6jHPd+ohF0{hSbi>o9H355xO0l)zO05X7g-;bkaAON5MSA$Ci0jf`0i&$et3%Nk_ zh0R<0#IP2r@-@BV7>FRm=<))((JUN`YPXf*Nq@gc(=hqHt_ zso|bn3*U*Zd8em#tUf(hMR4_UKX%qp%UoLAeu5^^y-JfLp%-# zUep3I-rvv~j$^KiUvAM{;FjSv^KEi$^(WEUKs z$b!nQ6(eT0sy)u4IQS(c)r1G;R2lBpi##Oo zM*H-~Z|hX`ZWk%xqn^=SOsI}KTBs{v^v2C~;__O0#QtO&rpX~9+1pS(>XEzhlt(W* zM#`Lk5M}M%0Ow7g6W6!-sR@lWxgLGOt(A0=cOrOBv|;;dv6qFW9V96Cu!=v=1Q2u`ckhO(0esER+!>{N_v(q&+?W;9chcD}V}T+;|_bG#I%UUx&>JdV~{` zz~dU38F6o_x>kPr@YLyihp;o;ASSWG=Z@ZAd$psFjtM}0pJ}4m@@=!`g>DM#Onoi^ z;S-XG1`!UqcI53^GYjvZlvsT-4<_71xQ@b4_)j@X7t~RFct2H^;c2BGg&Pl#IUjosAy-F_uxl~O!<@Mmy&PoR!q#dD~ppDGyCGrm^j*B z5BHXywduD`<&#uB{544O?x*o4Fioy<5#F~9qq{%z7G~9xpjze^LVAaNl4ofZIbsbF zl^&;#6hUT2tuEwfi0EM;z&<=&@Arg$Pu!{gEqC*lm@1H&?(!~n$tlTNl9gyi)e@*l z_86vDE9yni$j8vAnYf+*b#o!bUjuvd{6V6LX@~>=*M0X}rgkIK(L8_y`Lwc6U#+f9 zL(=udx8sT1jb_%p4MirV$|wM7X(8;BxqkU+Q$I3hJNKev0GcI8{5vr_9!@iRPy_cx z3tC&XUY|=R?r$4(h02@Ykdpa6y=KYC^9~Bd!WUQMK2AbNZc^VS2f9s45THvPQK z*XiUt@#agRLw$}hVOZMdKvbR?6Z4{yVTor0!i*mk4Q$7SGz_a(z9&O1aBkUEFKiXn z5S3)*yjn$!Lve7Rx78x?HPci|By*czcU<})9?!Z;ppMRkpnvhx@AFNfOf1xjg3KRptTX6RfzO0fmuACyuOvPm&9POB&SnPRytRsuf$3XEglTvsN4 z&+{dxBnC1QRyr~$y$vAAt0}fzKRCW0Z5-Zhm?G8RFjorpGDYlv`StNo=H56Bk!Ww&_emJpEF8pg!CO}?8+ZmFryP`h@p|Uu4 zgf~2QU!&9_nypmz+-du0w`Jh>P>Bm3?o}%sn;~nGrc{6f-BovcS+Tlx{l7!JGBSJ?z&a#^&grRCJ5EF1=}^{S5ulN4wKM$ z5ef{pGp^s97OjP!PVb@{UtamH>t4nBRqW8yUoeaddOs?Rb6!~Z&pYgZ@B@{bVfuY@ z$+iGH4}4WulqutNr+aOsb8ZFMx|%&YF3maUZ=T$s`%6{aqpY>UyS56rXqQjUyP=Lr zx-x!D>P-4taTyl2dmoN8iOH$ITO{z#Zth(-s#_Em7c@|8=P;ee#L8=|N{vI<%oG!- z#(Cs5H}{4pfUmQlA0(2bTKv;MFh1u5mrD%SWg1^}V75Bw>>ykFHB;FEG!AY_PopN> zzmx+NVeY9!pd88~xqKeSSxc3f2ywI~#2fB`{CT73bfq+Mf5<&R?f}uSz}~oSa6X&P z^+$;y09`)NIZ{OCS*Nl~dx|>B+J<+T_G@hhq|e#OriD~!27$5|a-!R9-Ymzqtn@X1 zz&Mx8I!;?!pxm)>pG`SNUA7F8eZhw>#kVMs_L~z?bfxAQe2}l)X>18rBeMQp)G)HX zwEoyyd`$iEyG-#yniivYe-gUMMgJ&k%UA@{ggze60q^ z6ql_z`e)*wKe~n+qbLJf0(U=JOuZd|rf(Jtg`vcCC-Z%7>4@5xt%Ip1t44LRoO{{4 z;6J3tpETv`QyWsHi^_-1n_!nh)$1r{u6sPNB}rxc6S(aiDj^Sbrb95V4><~xb>)T} zx`|hE9GDjNCYDQ>bWLAVy%(?d#!#m~iIHS-LPR|<{qCeN#?iLrqDWr6dPr-`1!3IN zDp;MiQ?GGu)6ZvWQjyjzEd?*C!g?JW?|R-dWv+#3&yUpVjSZ#e9=Po-iJAoSpQnG6 zWuz=xuY#r~BFEe(f9t+XtQ`DaQ9MjJA1%}GYs8vI>G*1q!d~D+@S>xb0aw2bVp&9< zXbcs)5j2Vy&6DLr38+yvkuF}qmlU(MVs?`Sl0XOOmYPA!$_^epO$?*je~t}X^wOp$ z7tx&hOyV>!K7fg@k;e!m(*4qpuavYr<2>bU>1eH<2KV7Jf=4#*NK^|m@YP{^Hm_z5 z73CW#FK)A-!aVD!3_gr~kzYG52vr1Fjq&HR9rmuedT%qdYvGA-jA^krudb~patwK+ zQ+|@NS6%powoXn)F|Gr4p z+j7=5-+{%f73&Ad!Pfm3khgA7S3Iaq_3ZDjg%^V4&+) z&e-^R>-=Q(RBtfQoIqF7ME^X();*e(WQ!wzg6{i-A-1rtX)4W;HnrLK#brGCbn>l{ zBG;7Np{{V@UO=1&RKqtPyGXfi3sv$iAmiMh(ssIQGSKt_(y-D&;K&+P|4rnk5uu}} zZp3Ln?={A?fmNQdDHqSF8Pl6i<;nZ0N@x0yaHZq-6UoKSM6t%FjFN_*H4B}Dhn|}z zM^8QXcdUcUR)*Fjv*ypSOfMn)uxToE2C#@~XLh2m8b1}zK?@rT9vS3e*N7sWkW0Oa z3&45WaZG}Ck}M)vyZUxgY<+Bv`03hIt^q)N0(KpUPfjuL#;rg|Y^ zAB?cOvuZDJ13f;?f$}Q~uG27su9}S|PdsjiHANZ$gCmS6`#6%C0zM>C+k)~^#JA0y~m7Qg(*rv<{N7I1qz=kg9{$yU>luUtEq0j)$psT zJfUY|Mz>2JW@PR_GyPRMZx5}0ARqJjnLfd(un3rSBp%-w zuA?ER2ZG8I#uWNk(Ig+FU&Z%@996Of=kp1I=9z*}9pXmB`}c-3A>O>pr93es271R@ zeq9K)-ka6E#pz!HSL+clutU)i0f_32S~O=&-kq(M{$&0I$CzThC`QZN9qr5QpJ|4P z+2z;Lx?8hlw8ZB{oa`cC@>z3Efal<^R&>MBt)RmW+D%DhA1q0mN-!~_&=r!KdGBpy z{nJWL=!ZvHsWqa9%76jHYzmwKon&@J-ZYm|ZwMbs1^V96O_lE<0cq_-YKoDX9-O-{ zx{lRp)(urc1#Um@Ss@Ce_!z?T(wj;;Ww=d}ES^*B zGTzYs8982w9usQ*Wq>liijovG;grUTHgu8kTY$Ay0OGr8T6l)|hKtiF=Wj?_G49mt zm|sCPTb-W{%X%gNDbJ*r5pTb{7|wg&`clj{!)fKAw*s~&VTpINC=*DUwjaj!z9S3T zqA4m-^R5IS&TJb$+>QC7lLWEq;pPgBZSylzZU)Tb;)xeKe#M=2|7k)MuRw(dx+K`8 z$rlaoJ2I}9$m!)5*oN4}q!XWHqQFJg?nTyn5Z!@_jbcT5E`Iu^29;4t{EZFXO#M!J z%qpLtM{-WuIIBKYD)m9;)GB||(c}%1nR3VNniNxf@Lm1OaIDwZ!FT`_`)#7dydL9R zj5Sj3t8D=J=>poaAfCLIDD|f}&_sMHc_XQ&VCAc2R98H);ai#Po@lM{*y;gyY`T1* z{CQc({-2Xh9A3+yzaFX5ukk}=hYXb!7g+8@3z|86r)OFqP13>?7CWw%^@p|X%PDt# zH`#Srhv|y?(@=jmNp%{^j0e)M%ZJp4PZo*}ZI}7;E^!1%--WqI&w%7|@#fSNAl@q1 z=1Av@Y8R6@7sAR-iesN&qI9$JGrZ(@INP;7`dTzw*N-i^&p8szy7+H|=OwmP!7sCT zJ*5$KYpl0N{enf(tCeF8uP*yyIZNa8wFQSO)>orM4tYW@e^fT(oUPow&+X#Yo%IpV z_(`k{(92ZBO-iW_~#D+pmP9}|yqM-zR-eR~TLAwa|*Bj22 z*RY;bd(m)RL%qbO$sWL2p{4|FvF*e$TS1kl!tVV{*=zBD5fRSNIwUNaE!nnN%JQld z=ROaQ%sx6B908ZPDT`OfP|~e6N_s|!=<1I;*_E7 z^BPsj4Z`;3pb7wy)oc|7<%$*KLT6qia+E;j==Av+vWb|SYw$Xqe2K(j{=5Ql6h^6q z=VgueZZr%bl&y|~`4iwD>c1s90h5#`b-?ik~!OL6?~ZkhGj%WtEi5!P)^bkLsZV5g4O?G|YoxqBrf0N0xmycn7UdWrt*6y-3ZiAIjq@F8WRQEM;SKdO1;~164W-VvB#BI|Da8$|U$Et~nyM}31D9(ltimi_ ztUzuNI75fsh=v(ytQnJNyhRk4V$k$CxJJh=48YK6@kpA6yCerj!nj*#UL}RbU@f>) zIjzjj#>`}{-RmqzP69O4)0dFNLF36_DB0uIpAw)cSY}MWiEeUQF4)omIu4^Rye{|3 z3cpJd*7Vk7(ghlATGH+_4>5o7$!>q6uj!Sd#gVx0SA4w|f{(Zvt`rJ%Xn}h(Y6(2e zO6=8~*0R!iE2m$_+sm?9y6LUB2wjt^FYr#cENr{(i#UulLQ!kWsTDUxUKPw$fyrYW z8oeaf6-MikAHBKmyS&~cxd;)+`JmD|@3sF}%Sa2^aIDBUo%rXxB0wMgWYT~H0LGBx z?dY*V^JW)2(=j)=v!#pl*w1N= z2v!dP8Fd$JHyKmhIADRKY^Fr|!{6gh&yB&~@Gn^vcsNd{`f7P+aRG z!8cWg%ub*RDu{EnrxrL1jr@j7HVsh;JY`=HHf$V2=i=KBj`5{a-fZ3@_I}8BTX1tc-QXUaB^3&Ona2mW0sk9H@6GEdj zk*BLM;M%QYr8cCi7$;Aq@Hu7n>?oULQe7yx8Zm6_9GJf$1llm;&0Ny)B%?nigcJV& zLC;*7ruTcH%B_{LQYvKedqC-M`M2z>1hH8N=7$q#U<%iH8C2NoJ;=U^tJ+NG zXK1tX47e0w6fo$oP`ed8BcrlQsp?B0%cg!N^eoNQnlFMp{TkR)9PoV$u{()sphHbK~;g>vEoK>w>+;=Rf zmq_v5C7c>v*>wh&T*%%(55LKh<_bIQ?*UdE;c(0!Aj#VxidkB3cbqgLinzH2bt{oL zTVSCBi7JmtD6Xt|&k0wR!-4VPUC=~`Vhhvh5fX~tvu8p`$I5g_bOs8%_EKKNH!BV{Kj(Yami1x>+ zX5rivk?27tI;rho$-3DWD7`yS6BKha)luqK#58nm1tn0K=nwYuaM!ToOSTFe2Y2ZR;%{P-P*a8^E0wksmfN{CLbWqZ zhJ?g}-uZkwqqtro(+R9Me4oaXX9{Y_N#kzrDmW3Ry@7li(!Cn^26&+w)js#5om~#u z+?RZh@4AnQV@NV_+-&XgeIFR2sxzIRC;{SPD$r>GI?iSWAq1s92}howzNWV`c-U>5 zDnbvIlch-yUZ$~pQ>A&1_L9h5ocD-{4`3iUM-w>*u*Dx?{^|+o0v-UMrENN>2mXKt zaab4;aTz$LM^R%~p7@Wbg*@=Zr$ANBvttRCkE-U4?tEn`>V?#_ZW%GbU(uUZws@O>OE z=&Ydsnpf6jmn*OZE%JC=CLIEY4>wpV6{(J1LxS%(P;15tLy9aq#Whx-CQqDwJeap& z6tV@wo8R21tmCT#ES{y9Ct#!@*ET4$oSsJx;Oih%WZUJB&AR=On8@ zIfOyQ$ORC94OOXzM1gZm>YvpJljDn^jdgnqbBwf0nK?wCX|(o@rAJ6bTAP?mnU@2#636YhhNE>UR`sTo*vvTX`?M>$5Dw;SN z`{1yMMt_b5&iuo7>)ajoHfPE`bg6cXNsbsLaH7#-%5_z^qR9UiOm&%ZY()- zura2swyNxYZ{lF?fV1=WNvk()B#FW!jyNpMIEn7-OchJCJ80?2w28!UUBGy5q795+ zSoK}n2W0_qCuO(ldx|iRwx-0;+R)*jTda|^z#UhvpG^nM7dJJhIA_evBXQs)iB5HU?O$V3{hGS7x=FpXBqa#Nt*NPAKjY$5h-3 zT)*o2Ff!S$e!vS*|Gp02YWslvM?W#iGL8&Sg8cG8u7#keAyG2wCfxrUkz|oDTB|Y2q0I|Lo7+c zxaIGPsZ!b(R1Lt=>47@$&PjW{rQD-FSnZ8pfGG!W=YCdUKClST*i6GT9nw@{=RrWg zN=3Al1s#f8gO^!5Eo8gl$#9yXrl4++mb#a3CF;K*Y*I`NVk3WcK!Q%lZtruExDq|> zN&0jAdG4uzv0w|2m;OAp<9ThwKudk0nBOMf7!~`{*!;Ekq0D z+LN9Y+{R29wx<8yjbM=yH{*g8ZIcqnRfl{ZQ=QpRop=X3V#RL9=}WfuvQY_7jv!o6 zQKo-%{@shG>x-vY+)c9H;J%l_&~H8&_@`nXqH&TR2Y$gIG%M0s&Kz+Q*l!c~?+dT6 z0PtKV5CclxUaYix1QF68Bc+P&WDn=qB5BD?>ROv)6i5e{1vMLP6{wXtrKx(P z`a1BwWHtLfFlVs`k@+O_82Qy&?(vyNkqbI9f-we zaS?N?9Vbxep0JLTiK>Hn^QsG^_rwsx$E%Mjt?GLPiVSq>!&we*KsM1;@U~HR!6fi2 z-OVSn-ZC~twVjV@L_$|G%EqV2lnGlm@)VE9Xo<2$^c%T)%q(=QsV0ctKb^=P0sVD| zt_k4Cf^A65G)O3=@Ku_zG=|Z1-hRuAD2>?Sy6ZHJ9?7Nr-5jv48AMMJUBK7n94~l& zq659l61q-nS%gsrP!FucD#RJ&qj=Ieq@_B(48L#% z;nkokoRN5CSnMX&bzlJ`!oL}D@YWVk8F&R|+XfO7{NL1SKLCLKH+BARQ3hLY11X9B z4IKdhg#Y&btzD1-0P#%Zgy7+AAR56xQISfBzb%LWz^DJjvJ2UXdHV}{gU%>zXp#5huYWn|!wXnB$F?V7EzwH2-AxfFROuIl) zh_A(9hg~2I;lCcx|IejZ1+Lo#3PISmfUkFf!pP1Y!2iwd?Be+yEV={42A56)(UATn zWg7$A?*TtUkWPYY_JEXx|LfuU8%ulqYs-J_IGP4u?ExtW|G7yUe-Z0{CC`6XpF0O; l-3JOnG%SMc_JJZ03@hNOeINzOr@vbk4g~;ct^OSb_#a~I@{<4n delta 9855 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 From 461dee67268dde1e53744a0376df7ff988cd25dc Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Mon, 22 Jul 2024 10:14:49 +0100 Subject: [PATCH 57/59] CIV-14385 code updated --- ...ostNoticeOfDiscontinuanceLetterLiPDefendant1Handler.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) 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 index 7ee3b99943a..b0a764a3cf0 100644 --- 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 @@ -49,16 +49,12 @@ public List handledEvents() { private CallbackResponse sendNoticeOfDiscontinuanceLetterToLiPDefendant1(CallbackParams callbackParams) { CaseData caseData = callbackParams.getCaseData(); - if (isRespondent1Lip(caseData)) { + if (caseData.isRespondent1LiP()) { generateNoticeOfDiscontinuanceLiPDefendantLetter(callbackParams); } return AboutToStartOrSubmitCallbackResponse.builder().build(); } - private boolean isRespondent1Lip(CaseData caseData) { - return YesOrNo.NO.equals(caseData.getRespondent1Represented()); - } - private void generateNoticeOfDiscontinuanceLiPDefendantLetter(CallbackParams callbackParams) { CaseData caseData = callbackParams.getCaseData(); lipLetterGenerator.printNoticeOfDiscontinuanceLetter(caseData, callbackParams.getParams().get(BEARER_TOKEN).toString()); From f3edea8eb52fef5a5b5164e4db1618ec63bb7516 Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Mon, 22 Jul 2024 10:27:21 +0100 Subject: [PATCH 58/59] CIV-14385 checkstyle fixed --- .../PostNoticeOfDiscontinuanceLetterLiPDefendant1Handler.java | 1 - 1 file changed, 1 deletion(-) 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 index b0a764a3cf0..7986062f9a5 100644 --- 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 @@ -8,7 +8,6 @@ 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.enums.YesOrNo; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.service.docmosis.settlediscontinue.NoticeOfDiscontinuanceLiPLetterGenerator; From 636ec517f4b13c3e8ee8ded4e78ae9fec6bd6c6c Mon Sep 17 00:00:00 2001 From: kalachandrasekar1 Date: Mon, 22 Jul 2024 13:08:38 +0100 Subject: [PATCH 59/59] CIV-14259 ConfirmOrderGivesPermission changes --- ...eVisibilityNoticeOfDiscontinuanceHandler.java | 16 +++++++++++++++- ...ibilityNoticeOfDiscontinuanceHandlerTest.java | 12 +++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/UpdateVisibilityNoticeOfDiscontinuanceHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/UpdateVisibilityNoticeOfDiscontinuanceHandler.java index ad0509131f1..1e9faecbf94 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/UpdateVisibilityNoticeOfDiscontinuanceHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/UpdateVisibilityNoticeOfDiscontinuanceHandler.java @@ -1,5 +1,6 @@ package uk.gov.hmcts.reform.civil.handler.callback.camunda.notification; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import org.camunda.bpm.engine.RuntimeService; import org.springframework.stereotype.Service; @@ -9,8 +10,10 @@ 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.enums.DocCategory; import uk.gov.hmcts.reform.civil.enums.settlediscontinue.ConfirmOrderGivesPermission; import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.utils.AssignCategoryId; import java.util.List; import java.util.Map; @@ -26,6 +29,8 @@ public class UpdateVisibilityNoticeOfDiscontinuanceHandler extends CallbackHandl public static final String TASK_ID = "UpdateVisibilityNoticeOfDiscontinuance"; private final RuntimeService runTimeService; + private final AssignCategoryId assignCategoryId; + private final ObjectMapper objectMapper; @Override protected Map callbacks() { @@ -47,8 +52,17 @@ public List handledEvents() { private CallbackResponse updateVisibilityNoticeDiscontinuance(CallbackParams callbackParams) { CaseData caseData = callbackParams.getCaseData(); - //TODO add update visibility implementation here updateCamundaVars(caseData); + if (ConfirmOrderGivesPermission.YES.equals(caseData.getConfirmOrderGivesPermission())) { + CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); + caseDataBuilder.noticeOfDiscontinueAllParitiesDoc(caseData.getNoticeOfDiscontinueCWDoc()); + caseDataBuilder.noticeOfDiscontinueCWDoc(null); + CaseData updatedData = caseDataBuilder.build(); + assignCategoryId.assignCategoryIdToCaseDocument(updatedData.getNoticeOfDiscontinueAllParitiesDoc(), DocCategory.NOTICE_OF_DISCONTINUE.getValue()); + return AboutToStartOrSubmitCallbackResponse.builder() + .data(updatedData.toMap(objectMapper)) + .build(); + } return AboutToStartOrSubmitCallbackResponse.builder().build(); } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/UpdateVisibilityNoticeOfDiscontinuanceHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/UpdateVisibilityNoticeOfDiscontinuanceHandlerTest.java index c9bf555f44f..559a61a6aeb 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/UpdateVisibilityNoticeOfDiscontinuanceHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/notification/UpdateVisibilityNoticeOfDiscontinuanceHandlerTest.java @@ -11,17 +11,22 @@ import uk.gov.hmcts.reform.ccd.client.model.CallbackRequest; import uk.gov.hmcts.reform.civil.callback.CallbackParams; import uk.gov.hmcts.reform.civil.callback.CaseEvent; +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.settlediscontinue.ConfirmOrderGivesPermission; import uk.gov.hmcts.reform.civil.handler.callback.BaseCallbackHandlerTest; import uk.gov.hmcts.reform.civil.model.BusinessProcess; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; +import uk.gov.hmcts.reform.civil.sampledata.CaseDocumentBuilder; +import uk.gov.hmcts.reform.civil.utils.AssignCategoryId; import static org.mockito.Mockito.verify; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_SUBMIT; @SpringBootTest(classes = { UpdateVisibilityNoticeOfDiscontinuanceHandler.class, - JacksonAutoConfiguration.class + JacksonAutoConfiguration.class, + AssignCategoryId.class }) class UpdateVisibilityNoticeOfDiscontinuanceHandlerTest extends BaseCallbackHandlerTest { @@ -32,6 +37,10 @@ class UpdateVisibilityNoticeOfDiscontinuanceHandlerTest extends BaseCallbackHand private UpdateVisibilityNoticeOfDiscontinuanceHandler handler; private static final String processId = "process-id"; + private static final CaseDocument caseDocument = CaseDocumentBuilder.builder() + .documentName("document name") + .documentType(DocumentType.NOTICE_OF_DISCONTINUANCE) + .build(); @Nested class AboutToSubmitCallback { @@ -44,6 +53,7 @@ void shouldUpdateCamundaVariables_whenInvoked(Boolean toggleState) { .businessProcess(BusinessProcess.builder().processInstanceId(processId).build()).build(); caseData.setConfirmOrderGivesPermission( toggleState ? ConfirmOrderGivesPermission.YES : ConfirmOrderGivesPermission.NO); + caseData.setNoticeOfDiscontinueCWDoc(caseDocument); CallbackParams params = CallbackParams.builder() .caseData(caseData)