From ac9f24b3427d20e198ef0bc1266be6cb5895aaea Mon Sep 17 00:00:00 2001 From: neeta-hmcts <115545612+neeta-hmcts@users.noreply.github.com> Date: Mon, 13 Nov 2023 09:31:01 +0000 Subject: [PATCH 1/6] CIV-11514 - Full admit pay immediately 5 working days calculation(EXUI) (#3554) * updated logic to calculate workingDays. * fxied review comment. * added dto * fixed unit test. * CIV-11514: Deadline Calculator * CIV-11514: Service Class problem * fixed payment by date in sealed form. * fixed payment by date in sealed form. * fixed checkstyle. * fixed unit tests. * fixed judgment by admission logic * fixed code smell and coverage. --------- Co-authored-by: kenneth-hmcts Co-authored-by: jarekPierchala <118526007+jarekPierchala@users.noreply.github.com> --- .../cases/CasesControllerTest.java | 8 ++-- .../controllers/cases/CasesController.java | 6 ++- ...tByAdmissionForSpecCuiCallbackHandler.java | 7 +--- .../RespondToClaimSpecCallbackHandler.java | 7 +++- .../RespondToDefenceSpecCallbackHandler.java | 10 ++--- .../hmcts/reform/civil/model/CaseData.java | 6 +-- .../citizenui/dto/ExtendedDeadlineDto.java | 18 ++++++++ .../ResponseRepaymentDetailsForm.java | 12 +++--- .../DeadlineExtensionCalculatorService.java | 20 +++++++-- .../SealedClaimLipResponseFormGenerator.java | 40 +----------------- ...dmissionForSpecCuiCallbackHandlerTest.java | 20 ++++----- ...RespondToClaimSpecCallbackHandlerTest.java | 14 ++++--- ...spondToDefenceSpecCallbackHandlerTest.java | 12 +++--- ...eadlineExtensionCalculatorServiceTest.java | 42 +++++++++++++++---- ...aledClaimLipResponseFormGeneratorTest.java | 32 +++++++++++--- 15 files changed, 145 insertions(+), 109 deletions(-) create mode 100644 src/main/java/uk/gov/hmcts/reform/civil/model/citizenui/dto/ExtendedDeadlineDto.java diff --git a/src/integrationTest/java/uk/gov/hmcts/reform/civil/controllers/cases/CasesControllerTest.java b/src/integrationTest/java/uk/gov/hmcts/reform/civil/controllers/cases/CasesControllerTest.java index 4f9174d907a..627fda38600 100644 --- a/src/integrationTest/java/uk/gov/hmcts/reform/civil/controllers/cases/CasesControllerTest.java +++ b/src/integrationTest/java/uk/gov/hmcts/reform/civil/controllers/cases/CasesControllerTest.java @@ -12,13 +12,12 @@ import uk.gov.hmcts.reform.civil.exceptions.CaseDataInvalidException; import uk.gov.hmcts.reform.civil.exceptions.CaseNotFoundException; import uk.gov.hmcts.reform.civil.exceptions.UserNotFoundOnCaseException; -import uk.gov.hmcts.reform.civil.exceptions.CaseNotFoundException; -import uk.gov.hmcts.reform.civil.exceptions.UserNotFoundOnCaseException; import uk.gov.hmcts.reform.civil.helpers.CaseDetailsConverter; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.bulkclaims.CaseworkerSubmitEventDTo; import uk.gov.hmcts.reform.civil.model.citizenui.DashboardClaimInfo; import uk.gov.hmcts.reform.civil.model.citizenui.DashboardResponse; +import uk.gov.hmcts.reform.civil.model.citizenui.dto.ExtendedDeadlineDto; import uk.gov.hmcts.reform.civil.model.citizenui.dto.EventDto; import uk.gov.hmcts.reform.civil.model.repaymentplan.ClaimantProposedPlan; import uk.gov.hmcts.reform.civil.service.CoreCaseDataService; @@ -42,6 +41,7 @@ import java.util.Map; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; @@ -228,10 +228,10 @@ void shouldSubmitEventSuccessfully() { @SneakyThrows void shouldCalculateDeadlineSuccessfully() { LocalDate extensionDate = LocalDate.of(2022, 6, 6); - when(deadlineExtensionCalculatorService.calculateExtendedDeadline(any())).thenReturn(extensionDate); + when(deadlineExtensionCalculatorService.calculateExtendedDeadline(any(), anyInt())).thenReturn(extensionDate); doPost( BEARER_TOKEN, - extensionDate, + ExtendedDeadlineDto.builder().responseDate(extensionDate).plusDays(5).build(), CALCULATE_DEADLINE_URL ) .andExpect(content().json(toJson(extensionDate))) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/controllers/cases/CasesController.java b/src/main/java/uk/gov/hmcts/reform/civil/controllers/cases/CasesController.java index 47814b87877..b83ea9be12c 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/controllers/cases/CasesController.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/controllers/cases/CasesController.java @@ -24,6 +24,7 @@ import uk.gov.hmcts.reform.civil.exceptions.CaseDataInvalidException; import uk.gov.hmcts.reform.civil.model.bulkclaims.CaseworkerSubmitEventDTo; import uk.gov.hmcts.reform.civil.model.citizenui.DashboardResponse; +import uk.gov.hmcts.reform.civil.model.citizenui.dto.ExtendedDeadlineDto; import uk.gov.hmcts.reform.civil.model.citizenui.dto.EventDto; import uk.gov.hmcts.reform.civil.model.citizenui.dto.RepaymentDecisionType; import uk.gov.hmcts.reform.civil.model.repaymentplan.ClaimantProposedPlan; @@ -174,8 +175,9 @@ public ResponseEntity submitEvent( @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "401", description = "Not Authorized")}) - public ResponseEntity calculateNewResponseDeadline(@RequestBody LocalDate extendedDeadline) { - LocalDate calculatedDeadline = deadlineExtensionCalculatorService.calculateExtendedDeadline(extendedDeadline); + public ResponseEntity calculateNewResponseDeadline(@RequestBody ExtendedDeadlineDto deadlineDateDetails) { + LocalDate calculatedDeadline = deadlineExtensionCalculatorService.calculateExtendedDeadline( + deadlineDateDetails.getResponseDate(), deadlineDateDetails.getPlusDays()); return new ResponseEntity<>(calculatedDeadline, HttpStatus.OK); } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RequestJudgementByAdmissionForSpecCuiCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RequestJudgementByAdmissionForSpecCuiCallbackHandler.java index 9ebf5ff394e..aebd58fee07 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RequestJudgementByAdmissionForSpecCuiCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RequestJudgementByAdmissionForSpecCuiCallbackHandler.java @@ -18,9 +18,7 @@ import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.service.FeatureToggleService; import uk.gov.hmcts.reform.civil.service.JudgementService; -import uk.gov.hmcts.reform.civil.service.citizenui.responsedeadline.DeadlineExtensionCalculatorService; -import java.time.LocalDate; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -43,7 +41,6 @@ public class RequestJudgementByAdmissionForSpecCuiCallbackHandler extends Callba private final JudgementService judgementService; private final CaseDetailsConverter caseDetailsConverter; private final FeatureToggleService featureToggleService; - private final DeadlineExtensionCalculatorService deadlineCalculatorService; @Override protected Map callbacks() { @@ -67,9 +64,7 @@ private CallbackResponse validateDefaultJudgementEligibility(CallbackParams call CaseData.CaseDataBuilder caseDataBuilder = caseData.toBuilder(); ArrayList errors = new ArrayList<>(); if (caseData.isJudgementDateNotPermitted()) { - LocalDate extendedResponseDate = caseData.getRespondent1ResponseDate().toLocalDate().plusDays(5); - LocalDate extendedRespondent1ResponseDate = deadlineCalculatorService.calculateExtendedDeadline(extendedResponseDate); - errors.add(format(NOT_VALID_DJ_BY_ADMISSION, caseData.setUpJudgementFormattedPermittedDate(extendedRespondent1ResponseDate))); + errors.add(format(NOT_VALID_DJ_BY_ADMISSION, caseData.setUpJudgementFormattedPermittedDate(caseData.getRespondToClaimAdmitPartLRspec().getWhenWillThisAmountBePaid()))); } return AboutToStartOrSubmitCallbackResponse.builder() diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandler.java index 691bf0b241a..5640b94350a 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandler.java @@ -20,6 +20,7 @@ import uk.gov.hmcts.reform.civil.enums.DocCategory; import uk.gov.hmcts.reform.civil.enums.MultiPartyResponseTypeFlags; import uk.gov.hmcts.reform.civil.enums.MultiPartyScenario; +import uk.gov.hmcts.reform.civil.enums.RespondentResponsePartAdmissionPaymentTimeLRspec; import uk.gov.hmcts.reform.civil.enums.RespondentResponseTypeSpec; import uk.gov.hmcts.reform.civil.enums.RespondentResponseTypeSpecPaidStatus; import uk.gov.hmcts.reform.civil.enums.TimelineUploadTypeSpec; @@ -55,6 +56,7 @@ import uk.gov.hmcts.reform.civil.service.FeatureToggleService; import uk.gov.hmcts.reform.civil.service.Time; import uk.gov.hmcts.reform.civil.service.UserService; +import uk.gov.hmcts.reform.civil.service.citizenui.responsedeadline.DeadlineExtensionCalculatorService; import uk.gov.hmcts.reform.civil.service.flowstate.StateFlowEngine; import uk.gov.hmcts.reform.civil.utils.AssignCategoryId; import uk.gov.hmcts.reform.civil.utils.CaseFlagsInitialiser; @@ -164,6 +166,7 @@ public class RespondToClaimSpecCallbackHandler extends CallbackHandler private final CourtLocationUtils courtLocationUtils; private final CaseFlagsInitialiser caseFlagsInitialiser; private final AssignCategoryId assignCategoryId; + private final DeadlineExtensionCalculatorService deadlineCalculatorService; @Override public List handledEvents() { @@ -1383,7 +1386,9 @@ && ofNullable(caseData.getRespondent2Copy()).isPresent()) { if (caseData.getDefenceAdmitPartPaymentTimeRouteRequired() != null && caseData.getDefenceAdmitPartPaymentTimeRouteRequired() == IMMEDIATELY && ifResponseTypeIsPartOrFullAdmission(caseData)) { - LocalDate whenBePaid = deadlinesCalculator.calculateWhenToBePaid(responseDate); + LocalDate whenBePaid = deadlineCalculatorService.calculateExtendedDeadline( + LocalDate.now(), + RespondentResponsePartAdmissionPaymentTimeLRspec.DAYS_TO_PAY_IMMEDIATELY); updatedData.respondToClaimAdmitPartLRspec(RespondToClaimAdmitPartLRspec.builder() .whenWillThisAmountBePaid(whenBePaid).build()); } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToDefenceSpecCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToDefenceSpecCallbackHandler.java index 49a3a85d317..ecbac578256 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToDefenceSpecCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToDefenceSpecCallbackHandler.java @@ -16,6 +16,7 @@ import uk.gov.hmcts.reform.civil.enums.AllocatedTrack; import uk.gov.hmcts.reform.civil.enums.CaseCategory; import uk.gov.hmcts.reform.civil.enums.CaseState; +import uk.gov.hmcts.reform.civil.enums.RespondentResponsePartAdmissionPaymentTimeLRspec; import uk.gov.hmcts.reform.civil.enums.RespondentResponseTypeSpec; import uk.gov.hmcts.reform.civil.enums.YesOrNo; import uk.gov.hmcts.reform.civil.handler.callback.user.spec.CaseDataToTextGenerator; @@ -568,11 +569,10 @@ private String setUpPayDateToString(CaseData caseData) { .format(DateTimeFormatter.ofPattern(datePattern, Locale.ENGLISH)); } if (caseData.getRespondent1ResponseDate() != null) { - LocalDate extendedResponseDate = caseData.getRespondent1ResponseDate().toLocalDate().plusDays(5); - return deadlineCalculatorService.calculateExtendedDeadline(extendedResponseDate).format(DateTimeFormatter.ofPattern( - datePattern, - Locale.ENGLISH - )); + return deadlineCalculatorService.calculateExtendedDeadline( + caseData.getRespondent1ResponseDate().toLocalDate(), + RespondentResponsePartAdmissionPaymentTimeLRspec.DAYS_TO_PAY_IMMEDIATELY) + .format(DateTimeFormatter.ofPattern(datePattern, Locale.ENGLISH)); } return null; } 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 63d6365fd37..953b02321d3 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 @@ -874,9 +874,9 @@ && isApplicant1NotRepresented() @JsonIgnore public boolean isJudgementDateNotPermitted() { - return nonNull(getRespondent1ResponseDate()) - && getRespondent1ResponseDate() - .toLocalDate().plusDays(5).atTime(DeadlinesCalculator.END_OF_BUSINESS_DAY).isAfter(LocalDateTime.now()); + return nonNull(getRespondToClaimAdmitPartLRspec().getWhenWillThisAmountBePaid()) + && getRespondToClaimAdmitPartLRspec().getWhenWillThisAmountBePaid() + .atTime(DeadlinesCalculator.END_OF_BUSINESS_DAY).isAfter(LocalDateTime.now()); } @JsonIgnore diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/citizenui/dto/ExtendedDeadlineDto.java b/src/main/java/uk/gov/hmcts/reform/civil/model/citizenui/dto/ExtendedDeadlineDto.java new file mode 100644 index 00000000000..58c4a1182de --- /dev/null +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/citizenui/dto/ExtendedDeadlineDto.java @@ -0,0 +1,18 @@ +package uk.gov.hmcts.reform.civil.model.citizenui.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ExtendedDeadlineDto { + + private LocalDate responseDate; + private Integer plusDays; +} diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/sealedclaim/ResponseRepaymentDetailsForm.java b/src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/sealedclaim/ResponseRepaymentDetailsForm.java index ecacb8ca9f9..ae474fb8326 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/sealedclaim/ResponseRepaymentDetailsForm.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/docmosis/sealedclaim/ResponseRepaymentDetailsForm.java @@ -78,9 +78,9 @@ public static ResponseRepaymentDetailsForm toSealedClaimResponseCommonContent(Ca .build(); } - private static void addRepaymentMethod(CaseData caseData, ResponseRepaymentDetailsForm.ResponseRepaymentDetailsFormBuilder builder, BigDecimal totalAmount) { + private static void addRepaymentMethod(CaseData caseData, ResponseRepaymentDetailsFormBuilder builder, BigDecimal totalAmount) { if (caseData.isPayImmediately()) { - addPayByDatePayImmediately(builder, totalAmount); + addPayByDatePayImmediately(builder, totalAmount, caseData.getRespondToClaimAdmitPartLRspec().getWhenWillThisAmountBePaid()); } else if (caseData.isPayByInstallment()) { addRepaymentPlan(caseData, builder, totalAmount); } else if (caseData.isPayBySetDate()) { @@ -94,10 +94,8 @@ private static void addPayBySetDate(CaseData caseData, ResponseRepaymentDetailsF .whyNotPayImmediately(caseData.getResponseToClaimAdmitPartWhyNotPayLRspec()); } - private static void addPayByDatePayImmediately(ResponseRepaymentDetailsForm.ResponseRepaymentDetailsFormBuilder builder, BigDecimal totalClaimAmount) { - builder.payBy(LocalDate.now() - .plusDays(RespondentResponsePartAdmissionPaymentTimeLRspec.DAYS_TO_PAY_IMMEDIATELY)) - .amountToPay(totalClaimAmount + ""); + private static void addPayByDatePayImmediately(ResponseRepaymentDetailsFormBuilder builder, BigDecimal totalClaimAmount, LocalDate responseDate) { + builder.payBy(responseDate).amountToPay(totalClaimAmount + ""); } private static void addRepaymentPlan(CaseData caseData, ResponseRepaymentDetailsForm.ResponseRepaymentDetailsFormBuilder builder, BigDecimal totalClaimAmount) { @@ -142,7 +140,7 @@ private static void fullDefenceData(CaseData caseData, ResponseRepaymentDetailsF } } - private static void partAdmissionData(CaseData caseData, ResponseRepaymentDetailsForm.ResponseRepaymentDetailsFormBuilder builder) { + private static void partAdmissionData(CaseData caseData, ResponseRepaymentDetailsFormBuilder builder) { addDetailsOnWhyClaimIsRejected(caseData, builder); if (caseData.getSpecDefenceAdmittedRequired() == YesOrNo.YES) { alreadyPaid(caseData, builder); diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/citizenui/responsedeadline/DeadlineExtensionCalculatorService.java b/src/main/java/uk/gov/hmcts/reform/civil/service/citizenui/responsedeadline/DeadlineExtensionCalculatorService.java index 0e6e5479803..71bf64f61c1 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/citizenui/responsedeadline/DeadlineExtensionCalculatorService.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/citizenui/responsedeadline/DeadlineExtensionCalculatorService.java @@ -6,16 +6,28 @@ import java.time.LocalDate; +import static java.util.Objects.requireNonNull; + @Service @RequiredArgsConstructor public class DeadlineExtensionCalculatorService { private final WorkingDayIndicator workingDayIndicator; + int workingDaysCounter; - public LocalDate calculateExtendedDeadline(LocalDate dateProposed) { - return workingDayIndicator.isWorkingDay(dateProposed) - ? dateProposed - : workingDayIndicator.getNextWorkingDay(dateProposed); + public LocalDate calculateExtendedDeadline(LocalDate responseDate, int plusDays) { + workingDaysCounter = 0; + requireNonNull(responseDate); + if (plusDays == 0) { + return workingDayIndicator.getNextWorkingDay(responseDate); + } + return calculateWorkingDays(responseDate.plusDays(1), plusDays); } + public LocalDate calculateWorkingDays(LocalDate responseDate, int plusDays) { + if (workingDayIndicator.isWorkingDay(responseDate)) { + workingDaysCounter++; + } + return workingDaysCounter == plusDays ? responseDate : calculateWorkingDays(responseDate.plusDays(1), plusDays); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/sealedclaim/SealedClaimLipResponseFormGenerator.java b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/sealedclaim/SealedClaimLipResponseFormGenerator.java index 42a5ae911ac..bc971235285 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/sealedclaim/SealedClaimLipResponseFormGenerator.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/docmosis/sealedclaim/SealedClaimLipResponseFormGenerator.java @@ -1,27 +1,17 @@ package uk.gov.hmcts.reform.civil.service.docmosis.sealedclaim; import lombok.RequiredArgsConstructor; - 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.RespondentResponsePartAdmissionPaymentTimeLRspec; -import uk.gov.hmcts.reform.civil.enums.YesOrNo; 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.sealedclaim.ResponseRepaymentDetailsForm; import uk.gov.hmcts.reform.civil.model.docmosis.sealedclaim.SealedClaimLipResponseForm; import uk.gov.hmcts.reform.civil.service.docmosis.DocumentGeneratorService; -import uk.gov.hmcts.reform.civil.service.citizenui.responsedeadline.DeadlineExtensionCalculatorService; import uk.gov.hmcts.reform.civil.service.docmosis.TemplateDataGenerator; -import java.time.LocalDate; -import java.util.Objects; - -import static uk.gov.hmcts.reform.civil.enums.RespondentResponseTypeSpec.FULL_ADMISSION; -import static uk.gov.hmcts.reform.civil.enums.RespondentResponseTypeSpec.PART_ADMISSION; import static uk.gov.hmcts.reform.civil.service.docmosis.DocmosisTemplates.DEFENDANT_RESPONSE_LIP_SPEC; @Service @@ -30,12 +20,10 @@ public class SealedClaimLipResponseFormGenerator implements TemplateDataGenerato private final DocumentGeneratorService documentGeneratorService; private final DocumentManagementService documentManagementService; - private final DeadlineExtensionCalculatorService deadlineCalculatorService; @Override public SealedClaimLipResponseForm getTemplateData(CaseData caseData) { - SealedClaimLipResponseForm templateData = SealedClaimLipResponseForm.toTemplate(caseData); - return getRespondent1RepaymentDate(caseData, templateData); + return SealedClaimLipResponseForm.toTemplate(caseData); } public CaseDocument generate(final CaseData caseData, final String authorization) { @@ -54,30 +42,4 @@ public CaseDocument generate(final CaseData caseData, final String authorization new PDF(fileName, docmosisDocument.getBytes(), DocumentType.DEFENDANT_DEFENCE) ); } - - private SealedClaimLipResponseForm getRespondent1RepaymentDate(final CaseData caseData, SealedClaimLipResponseForm templateData) { - if (!Objects.isNull(caseData.getRespondent1ClaimResponseTypeForSpec())) { - if (hasPayByDatePayImmediately(caseData)) { - return addPayByDatePayImmediately(caseData, templateData); - } - } - return templateData; - } - - private SealedClaimLipResponseForm addPayByDatePayImmediately(CaseData caseData, SealedClaimLipResponseForm templateData) { - if (caseData.isPayImmediately()) { - LocalDate extendedDate = LocalDate.now().plusDays(RespondentResponsePartAdmissionPaymentTimeLRspec.DAYS_TO_PAY_IMMEDIATELY); - LocalDate payDeadlineDate = deadlineCalculatorService.calculateExtendedDeadline(extendedDate); - ResponseRepaymentDetailsForm responseRepaymentDetailsForm = templateData.getCommonDetails().toBuilder().payBy( - payDeadlineDate).build(); - SealedClaimLipResponseForm.SealedClaimLipResponseFormBuilder templateFormData = templateData.toBuilder(); - return templateFormData.commonDetails(responseRepaymentDetailsForm).build(); - } - return templateData; - } - - private boolean hasPayByDatePayImmediately(CaseData caseData) { - return (FULL_ADMISSION.equals(caseData.getRespondent1ClaimResponseTypeForSpec()) || (PART_ADMISSION.equals( - caseData.getRespondent1ClaimResponseTypeForSpec()) && caseData.getSpecDefenceAdmittedRequired() == YesOrNo.NO)); - } } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RequestJudgementByAdmissionForSpecCuiCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RequestJudgementByAdmissionForSpecCuiCallbackHandlerTest.java index 3f906a4b330..4587d7afc7a 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RequestJudgementByAdmissionForSpecCuiCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RequestJudgementByAdmissionForSpecCuiCallbackHandlerTest.java @@ -11,7 +11,6 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import uk.gov.hmcts.reform.ccd.client.model.AboutToStartOrSubmitCallbackResponse; import uk.gov.hmcts.reform.ccd.client.model.SubmittedCallbackResponse; -import uk.gov.hmcts.reform.civil.bankholidays.WorkingDayIndicator; import uk.gov.hmcts.reform.civil.callback.CallbackParams; import uk.gov.hmcts.reform.civil.enums.CaseState; import uk.gov.hmcts.reform.civil.enums.RespondentResponseTypeSpec; @@ -21,26 +20,24 @@ import uk.gov.hmcts.reform.civil.model.CCJPaymentDetails; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.Fee; +import uk.gov.hmcts.reform.civil.model.RespondToClaimAdmitPartLRspec; import uk.gov.hmcts.reform.civil.sampledata.CallbackParamsBuilder; import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; import uk.gov.hmcts.reform.civil.service.FeatureToggleService; import uk.gov.hmcts.reform.civil.service.JudgementService; -import uk.gov.hmcts.reform.civil.service.citizenui.responsedeadline.DeadlineExtensionCalculatorService; import uk.gov.hmcts.reform.civil.utils.MonetaryConversions; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; import static java.lang.String.format; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.when; 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.MID; import static uk.gov.hmcts.reform.civil.callback.CallbackType.SUBMITTED; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.REQUEST_JUDGEMENT_ADMISSION_SPEC; import static uk.gov.hmcts.reform.civil.enums.CaseState.AWAITING_APPLICANT_INTENTION; @@ -70,23 +67,18 @@ public class RequestJudgementByAdmissionForSpecCuiCallbackHandlerTest extends Ba @MockBean private CaseDetailsConverter caseDetailsConverter; - @MockBean - private DeadlineExtensionCalculatorService deadlineCalculatorService; - @MockBean - private WorkingDayIndicator workingDayIndicator; @Nested class AboutToStartCallback { @Test void shouldReturnError_WhenAboutToStartIsInvoked() { + LocalDate whenWillPay = LocalDate.now().plusDays(5); CaseData caseData = CaseDataBuilder.builder().atStateClaimDetailsNotified().build().toBuilder() .respondent1ResponseDate(LocalDateTime.now()) .respondent1ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_ADMISSION) .ccdState(AWAITING_APPLICANT_INTENTION) + .respondToClaimAdmitPartLRspec(RespondToClaimAdmitPartLRspec.builder().whenWillThisAmountBePaid(whenWillPay).build()) .build(); - given(workingDayIndicator.isWorkingDay(any())).willReturn(true); - LocalDate proposedExtensionDeadline = LocalDate.now(); - given(deadlineCalculatorService.calculateExtendedDeadline(any())).willReturn(proposedExtensionDeadline); CallbackParams params = CallbackParamsBuilder.builder().of(ABOUT_TO_START, caseData).build(); AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler .handle(params); @@ -95,10 +87,12 @@ void shouldReturnError_WhenAboutToStartIsInvoked() { @Test void shouldNotReturnError_WhenAboutToStartIsInvokedOneDefendant() { + LocalDate whenWillPay = LocalDate.of(2023, 10, 11); CaseData caseData = CaseDataBuilder.builder().atStateClaimDetailsNotified().build().toBuilder() .respondent1ResponseDate(LocalDateTime.now().minusDays(15)) .respondent1ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_ADMISSION) .ccdState(AWAITING_APPLICANT_INTENTION) + .respondToClaimAdmitPartLRspec(RespondToClaimAdmitPartLRspec.builder().whenWillThisAmountBePaid(whenWillPay).build()) .build(); CallbackParams params = CallbackParamsBuilder.builder().of(ABOUT_TO_START, caseData).build(); AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandlerTest.java index ac9d11481ef..6fbfc1fb527 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandlerTest.java @@ -72,6 +72,7 @@ import uk.gov.hmcts.reform.civil.service.FeatureToggleService; import uk.gov.hmcts.reform.civil.service.Time; import uk.gov.hmcts.reform.civil.service.UserService; +import uk.gov.hmcts.reform.civil.service.citizenui.responsedeadline.DeadlineExtensionCalculatorService; import uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag; import uk.gov.hmcts.reform.civil.service.flowstate.StateFlowEngine; import uk.gov.hmcts.reform.civil.stateflow.StateFlow; @@ -100,6 +101,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; @@ -162,6 +164,8 @@ class RespondToClaimSpecCallbackHandlerTest extends BaseCallbackHandlerTest { private CourtLocationUtils courtLocationUtils; @Mock private CaseFlagsInitialiser caseFlagsInitialiser; + @Mock + private DeadlineExtensionCalculatorService deadlineExtensionCalculatorService; @Spy private List confirmationTextGenerators = List.of( @@ -751,8 +755,6 @@ void updateRespondent2AddressWhenUpdated() { when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); - Address changedAddress = AddressBuilder.maximal().build(); - CaseData caseData = CaseDataBuilder.builder().atStateApplicantRespondToDefenceAndProceed() .respondent2DQ() .respondent1Copy(PartyBuilder.builder().individual().build()) @@ -1084,7 +1086,6 @@ void oneVTwo_SecondDefendantRepliesSameLegalRep() { DefendantResponseShowTag.CAN_ANSWER_RESPONDENT_2 )) .build(); - CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); List locations = List.of(LocationRefData.builder().build()); when(locationRefDataService.getCourtLocationsForDefaultJudgments(any())) @@ -1104,10 +1105,13 @@ void oneVTwo_SecondDefendantRepliesSameLegalRep() { .thenReturn(true); UserInfo userInfo = UserInfo.builder().uid("798").build(); when(userService.getUserInfo(anyString())).thenReturn(userInfo); + LocalDate whenWillPay = LocalDate.now().plusDays(5); + given(deadlineExtensionCalculatorService.calculateExtendedDeadline(any(), anyInt())).willReturn(whenWillPay); + + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); // When - AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler - .handle(params); + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); // Then AbstractObjectAssert sent2 = assertThat(response.getData()) diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToDefenceSpecCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToDefenceSpecCallbackHandlerTest.java index 9eae8beac2d..9b5371b1f9f 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToDefenceSpecCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToDefenceSpecCallbackHandlerTest.java @@ -94,6 +94,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.civil.callback.CallbackType.ABOUT_TO_START; @@ -1369,8 +1370,8 @@ void shouldSetUpPaymentDateToString() { when(featureToggleService.isPinInPostEnabled()).thenReturn(true); given(workingDayIndicator.isWorkingDay(any())).willReturn(true); - LocalDate whenWillPay = LocalDate.now().plusDays(5); - given(deadlineCalculatorService.calculateExtendedDeadline(any())).willReturn(whenWillPay); + LocalDate whenWillPay = LocalDate.now(); + given(deadlineCalculatorService.calculateExtendedDeadline(any(), anyInt())).willReturn(whenWillPay); RespondToClaimAdmitPartLRspec respondToClaimAdmitPartLRspec = RespondToClaimAdmitPartLRspec.builder() @@ -1397,9 +1398,8 @@ void shouldSetUpPaymentDateToString() { void shouldSetUpPaymentDateToStringForPartAdmitPaid() { when(featureToggleService.isPinInPostEnabled()).thenReturn(true); - given(workingDayIndicator.isWorkingDay(any())).willReturn(true); LocalDate whenWillPay = LocalDate.now().plusDays(5); - given(deadlineCalculatorService.calculateExtendedDeadline(any())).willReturn(whenWillPay); + given(deadlineCalculatorService.calculateExtendedDeadline(any(), anyInt())).willReturn(whenWillPay); RespondToClaim respondToAdmittedClaim = RespondToClaim.builder() @@ -1428,8 +1428,8 @@ void shouldSetUpPaymentDateForResponseDateToString() { when(featureToggleService.isPinInPostEnabled()).thenReturn(true); given(workingDayIndicator.isWorkingDay(any())).willReturn(true); - LocalDate whenWillPay = LocalDate.now().plusDays(5); - given(deadlineCalculatorService.calculateExtendedDeadline(any())).willReturn(whenWillPay); + LocalDate whenWillPay = LocalDate.now(); + given(deadlineCalculatorService.calculateExtendedDeadline(any(), anyInt())).willReturn(whenWillPay); CaseData caseData = CaseData.builder() .respondent1ResponseDate(LocalDateTime.now()) diff --git a/src/test/java/uk/gov/hmcts/reform/civil/service/citizenui/responsedeadline/DeadlineExtensionCalculatorServiceTest.java b/src/test/java/uk/gov/hmcts/reform/civil/service/citizenui/responsedeadline/DeadlineExtensionCalculatorServiceTest.java index 736974f4cce..dcc0e6f718c 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/service/citizenui/responsedeadline/DeadlineExtensionCalculatorServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/service/citizenui/responsedeadline/DeadlineExtensionCalculatorServiceTest.java @@ -26,30 +26,54 @@ public class DeadlineExtensionCalculatorServiceTest { @Test void shouldReturnTheSameGivenDateWhenDateIsWorkday() { - given(workingDayIndicator.isWorkingDay(any())).willReturn(true); + given(workingDayIndicator.getNextWorkingDay(any())).willReturn(LocalDate.now()); LocalDate proposedExtensionDeadline = LocalDate.now(); LocalDate calculatedDeadline = deadlineExtensionCalculatorService.calculateExtendedDeadline( - proposedExtensionDeadline); + proposedExtensionDeadline, 0); assertThat(calculatedDeadline).isEqualTo(proposedExtensionDeadline); - verify(workingDayIndicator).isWorkingDay(proposedExtensionDeadline); - verify(workingDayIndicator, never()).getNextWorkingDay(proposedExtensionDeadline); + verify(workingDayIndicator).getNextWorkingDay(proposedExtensionDeadline); + verify(workingDayIndicator, never()).isWorkingDay(proposedExtensionDeadline); } @Test void shouldReturnNextWorkingDayWhenDateIsHoliday() { - given(workingDayIndicator.isWorkingDay(any())).willReturn(false); + LocalDate proposedExtensionDeadline = LocalDate.of(2022, 6, 3); LocalDate calculatedNextWorkingDay = LocalDate.of(2022, 6, 4); + given(workingDayIndicator.getNextWorkingDay(any())).willReturn(calculatedNextWorkingDay); - LocalDate proposedExtensionDeadline = LocalDate.of(2022, 6, 3); LocalDate calculatedDeadline = deadlineExtensionCalculatorService.calculateExtendedDeadline( - proposedExtensionDeadline); + proposedExtensionDeadline, 0); assertThat(calculatedDeadline).isEqualTo(calculatedNextWorkingDay); - verify(workingDayIndicator).isWorkingDay(proposedExtensionDeadline); - verify(workingDayIndicator).getNextWorkingDay(proposedExtensionDeadline); + verify(workingDayIndicator, never()).isWorkingDay(calculatedNextWorkingDay); + } + + @Test + void shouldReturnFifthWorkingDayFromTheGivenDateWhen_NoHoliday_NoWeekend_InBetween() { + given(workingDayIndicator.isWorkingDay(any())).willReturn(true); + LocalDate proposedExtensionDeadline = LocalDate.of(2023, 11, 17); + LocalDate expectedExtensionDeadline = LocalDate.of(2023, 11, 22); + + LocalDate calculatedDeadline = deadlineExtensionCalculatorService.calculateExtendedDeadline( + proposedExtensionDeadline, 5); + + assertThat(calculatedDeadline).isEqualTo(expectedExtensionDeadline); + } + + @Test + void shouldReturnFifthWorkingDayFromTheGivenDateWhen_Holiday_InBetween() { + given(workingDayIndicator.isWorkingDay(any())).willReturn(true); + given(workingDayIndicator.isWorkingDay(LocalDate.of(2023, 11, 19))).willReturn(false); + LocalDate proposedExtensionDeadline = LocalDate.of(2023, 11, 17); + LocalDate expectedExtensionDeadline = LocalDate.of(2023, 11, 23); + + LocalDate calculatedDeadline = deadlineExtensionCalculatorService.calculateExtendedDeadline( + proposedExtensionDeadline, 5); + + assertThat(calculatedDeadline).isEqualTo(expectedExtensionDeadline); } } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/sealedclaim/SealedClaimLipResponseFormGeneratorTest.java b/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/sealedclaim/SealedClaimLipResponseFormGeneratorTest.java index 299d334a0e7..ab25f0fbe0e 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/sealedclaim/SealedClaimLipResponseFormGeneratorTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/service/docmosis/sealedclaim/SealedClaimLipResponseFormGeneratorTest.java @@ -118,15 +118,20 @@ void shouldGenerateDocumentSuccessfully() { @Test void admitPayImmediate() { - CaseData caseData = commonData() + LocalDate whenWillPay = LocalDate.now().plusDays(5); + CaseData.CaseDataBuilder builder = commonData() .respondent1(company("B")) .respondent2(individual("C")) .respondent1ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_ADMISSION) .defenceAdmitPartPaymentTimeRouteRequired(RespondentResponsePartAdmissionPaymentTimeLRspec.IMMEDIATELY) - .build(); + .respondToClaimAdmitPartLRspec( + RespondToClaimAdmitPartLRspec.builder() + .whenWillThisAmountBePaid(whenWillPay) + .build() + ); SealedClaimLipResponseForm templateData = generator - .getTemplateData(caseData); + .getTemplateData(builder.build()); Assertions.assertEquals(LocalDate.now(), templateData.getGenerationDate()); } @@ -174,6 +179,7 @@ void admitPayByDate() { @Test void partAdmitPayImmediate() { + LocalDate whenWillPay = LocalDate.now().plusDays(5); CaseData.CaseDataBuilder builder = commonData() .respondent1(company("B")) .respondent2(individual("C")) @@ -181,7 +187,12 @@ void partAdmitPayImmediate() { .specDefenceAdmittedRequired(YesOrNo.NO) .respondToAdmittedClaimOwingAmount(BigDecimal.valueOf(2000)) .detailsOfWhyDoesYouDisputeTheClaim("Reason to dispute the claim") - .defenceAdmitPartPaymentTimeRouteRequired(RespondentResponsePartAdmissionPaymentTimeLRspec.IMMEDIATELY); + .defenceAdmitPartPaymentTimeRouteRequired(RespondentResponsePartAdmissionPaymentTimeLRspec.IMMEDIATELY) + .respondToClaimAdmitPartLRspec( + RespondToClaimAdmitPartLRspec.builder() + .whenWillThisAmountBePaid(whenWillPay) + .build() + ); CaseData caseData = timeline(financialDetails(builder)) .build(); @@ -340,11 +351,17 @@ void counterClaim() { @Test void shouldGenerateDocumentSuccessfullyForFullAdmit() { //Given + LocalDate whenWillPay = LocalDate.now().plusDays(5); CaseData caseData = commonData() .respondent1(company("B")) .respondent2(individual("C")) .respondent1ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_ADMISSION) .defenceAdmitPartPaymentTimeRouteRequired(RespondentResponsePartAdmissionPaymentTimeLRspec.IMMEDIATELY) + .respondToClaimAdmitPartLRspec( + RespondToClaimAdmitPartLRspec.builder() + .whenWillThisAmountBePaid(whenWillPay) + .build() + ) .build(); String fileName = "someName"; DocmosisDocument docmosisDocument = mock(DocmosisDocument.class); @@ -365,6 +382,7 @@ void shouldGenerateDocumentSuccessfullyForFullAdmit() { @Test void shouldGenerateDocumentSuccessfullyForPartAdmit() { //Given + LocalDate whenWillPay = LocalDate.now().plusDays(5); CaseData caseData = commonData() .respondent1(company("B")) .respondent2(individual("C")) @@ -373,7 +391,11 @@ void shouldGenerateDocumentSuccessfullyForPartAdmit() { .respondToAdmittedClaimOwingAmount(BigDecimal.valueOf(2000)) .detailsOfWhyDoesYouDisputeTheClaim("Reason to dispute the claim") .defenceAdmitPartPaymentTimeRouteRequired(RespondentResponsePartAdmissionPaymentTimeLRspec.IMMEDIATELY) - .build(); + .respondToClaimAdmitPartLRspec( + RespondToClaimAdmitPartLRspec.builder() + .whenWillThisAmountBePaid(whenWillPay) + .build() + ).build(); String fileName = "someName"; DocmosisDocument docmosisDocument = mock(DocmosisDocument.class); byte[] bytes = {}; From d17824f6442dbb56ae87e64b24c83fe8da938c33 Mon Sep 17 00:00:00 2001 From: drummondjm <93932689+drummondjm@users.noreply.github.com> Date: Mon, 13 Nov 2023 11:07:36 +0000 Subject: [PATCH 2/6] CIV-11342 categories for DocumentCosts (#3537) * updated categories for DocumentCosts * checkstyle * removed unused categories * reapply 11342 changes --------- Co-authored-by: vasudevganesanhmcts <100689363+vasudevganesanhmcts@users.noreply.github.com> --- .../user/EvidenceUploadHandlerBase.java | 21 +++++++++---------- .../EvidenceUploadApplicantHandlerTest.java | 2 +- .../EvidenceUploadRespondentHandlerTest.java | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadHandlerBase.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadHandlerBase.java index e69ffd03ba7..5277c8351c6 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadHandlerBase.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadHandlerBase.java @@ -118,23 +118,22 @@ abstract class EvidenceUploadHandlerBase extends CallbackHandler { protected static final String RESPONDENT_ONE_PRE_TRIAL_SUMMARY = "RespondentOnePreTrialSummary"; protected static final String RESPONDENT_ONE_TRIAL_SKELETON = "RespondentOneTrialSkeleton"; protected static final String RESPONDENT_ONE_PRECEDENT_H = "RespondentOneUploadedPrecedentH"; - protected static final String RESPONDENT_ONE_ANY_PRECEDENT_H = "respondentOneAnyPrecedentH"; protected static final String RESPONDENT_TWO_DISCLOSURE_LIST = "RespondentTwoDisclosureList"; protected static final String RESPONDENT_TWO_PRE_TRIAL_SUMMARY = "RespondentTwoPreTrialSummary"; protected static final String RESPONDENT_TWO_TRIAL_SKELETON = "RespondentTwoTrialSkeleton"; protected static final String RESPONDENT_TWO_PRECEDENT_H = "RespondentTwoUploadedPrecedentH"; - protected static final String RESPONDENT_TWO_ANY_PRECEDENT_H = "respondentTwoAnyPrecedentH"; + protected static final String RESPONDENT_ONE_SCHEDULE_OF_COSTS = "RespondentSchedulesOfCost"; + protected static final String RESPONDENT_TWO_SCHEDULE_OF_COSTS = "RespondentTwoSchedulesOfCost"; protected static final String APPLICANT_DISCLOSURE_LIST = "ApplicantDisclosureList"; protected static final String APPLICANT_PRE_TRIAL_SUMMARY = "ApplicantPreTrialSummary"; protected static final String APPLICANT_TRIAL_SKELETON = "ApplicantTrialSkeleton"; protected static final String APPLICANT_PRECEDENT_H = "ApplicantUploadedPrecedentH"; - protected static final String APPLICANT_ANY_PRECEDENT_H = "ApplicantAnyPrecedentH"; protected static final String APPLICANT_TWO_DISCLOSURE_LIST = "ApplicantTwoDisclosureList"; protected static final String APPLICANT_TWO_PRE_TRIAL_SUMMARY = "ApplicantTwoPreTrialSummary"; protected static final String APPLICANT_TWO_TRIAL_SKELETON = "ApplicantTwoTrialSkeleton"; protected static final String APPLICANT_TWO_PRECEDENT_H = "ApplicantTwoUploadedPrecedentH"; - protected static final String APPLICANT_TWO_ANY_PRECEDENT_H = "ApplicantTwoAnyPrecedentH"; - + protected static final String APPLICANT_SCHEDULE_OF_COSTS = "ApplicantSchedulesOfCost"; + protected static final String APPLICANT_TWO_SCHEDULE_OF_COSTS = "ApplicantTwoSchedulesOfCost"; // Notification Strings used for email protected static StringBuilder notificationString = new StringBuilder(); protected static final String DISCLOSURE_LIST_TEXT = "%s - Disclosure list"; @@ -635,7 +634,7 @@ CallbackResponse documentUploadTime(CallbackParams callbackParams) { TRIAL_SKELETON_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), defendantString); setCategoryIdAndRenameDoc(caseData.getDocumentAuthoritiesRes(), document -> document.getValue().getDocumentUpload(), RESPONDENT_ONE_PRECEDENT_H, TRIAL_AUTHORITIES_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), defendantString); - setCategoryIdAndRenameDoc(caseData.getDocumentCostsRes(), document -> document.getValue().getDocumentUpload(), RESPONDENT_ONE_ANY_PRECEDENT_H, + setCategoryIdAndRenameDoc(caseData.getDocumentCostsRes(), document -> document.getValue().getDocumentUpload(), RESPONDENT_ONE_SCHEDULE_OF_COSTS, TRIAL_COSTS_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), defendantString); setCategoryIdAndRenameDoc(caseData.getDocumentEvidenceForTrialRes(), document -> document.getValue().getDocumentUpload(), RESPONDENT_ONE_TRIAL_DOC_CORRESPONDENCE, TRIAL_DOC_CORRESPONDENCE_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), defendantString); @@ -671,7 +670,7 @@ CallbackResponse documentUploadTime(CallbackParams callbackParams) { TRIAL_SKELETON_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), defendantString); setCategoryIdAndRenameDoc(caseData.getDocumentAuthoritiesRes2(), document -> document.getValue().getDocumentUpload(), RESPONDENT_TWO_PRECEDENT_H, TRIAL_AUTHORITIES_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), defendantString); - setCategoryIdAndRenameDoc(caseData.getDocumentCostsRes2(), document -> document.getValue().getDocumentUpload(), RESPONDENT_TWO_ANY_PRECEDENT_H, + setCategoryIdAndRenameDoc(caseData.getDocumentCostsRes2(), document -> document.getValue().getDocumentUpload(), RESPONDENT_TWO_SCHEDULE_OF_COSTS, TRIAL_COSTS_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), defendantString); setCategoryIdAndRenameDoc(caseData.getDocumentEvidenceForTrialRes2(), document -> document.getValue().getDocumentUpload(), RESPONDENT_TWO_TRIAL_DOC_CORRESPONDENCE, TRIAL_DOC_CORRESPONDENCE_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), defendantString); @@ -708,7 +707,7 @@ CallbackResponse documentUploadTime(CallbackParams callbackParams) { TRIAL_SKELETON_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), claimantString); setCategoryIdAndRenameDoc(caseData.getDocumentAuthorities(), document -> document.getValue().getDocumentUpload(), APPLICANT_PRECEDENT_H, TRIAL_AUTHORITIES_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), claimantString); - setCategoryIdAndRenameDoc(caseData.getDocumentCosts(), document -> document.getValue().getDocumentUpload(), APPLICANT_ANY_PRECEDENT_H, + setCategoryIdAndRenameDoc(caseData.getDocumentCosts(), document -> document.getValue().getDocumentUpload(), APPLICANT_SCHEDULE_OF_COSTS, TRIAL_COSTS_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), claimantString); setCategoryIdAndRenameDoc(caseData.getDocumentEvidenceForTrial(), document -> document.getValue().getDocumentUpload(), APPLICANT_TRIAL_DOC_CORRESPONDENCE, TRIAL_DOC_CORRESPONDENCE_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), claimantString); @@ -745,7 +744,7 @@ CallbackResponse documentUploadTime(CallbackParams callbackParams) { TRIAL_SKELETON_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), claimantString); setCategoryIdAndRenameDoc(caseData.getDocumentAuthoritiesApp2(), document -> document.getValue().getDocumentUpload(), APPLICANT_TWO_PRECEDENT_H, TRIAL_AUTHORITIES_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), claimantString); - setCategoryIdAndRenameDoc(caseData.getDocumentCostsApp2(), document -> document.getValue().getDocumentUpload(), APPLICANT_TWO_ANY_PRECEDENT_H, + setCategoryIdAndRenameDoc(caseData.getDocumentCostsApp2(), document -> document.getValue().getDocumentUpload(), APPLICANT_TWO_SCHEDULE_OF_COSTS, TRIAL_COSTS_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), claimantString); setCategoryIdAndRenameDoc(caseData.getDocumentEvidenceForTrialApp2(), document -> document.getValue().getDocumentUpload(), APPLICANT_TWO_TRIAL_DOC_CORRESPONDENCE, TRIAL_DOC_CORRESPONDENCE_TEXT, documentDateTime -> documentDateTime.getValue().getCreatedDatetime(), claimantString); @@ -872,7 +871,7 @@ private CaseData copyResp1ChangesToResp2(CaseData caseData, CaseData.CaseDataBui evidenceDocToCopy = compareAndCopy(caseDataBefore.getDocumentCostsRes(), caseData.getDocumentCostsRes(), caseData.getDocumentCostsRes2()); - evidenceDocToAdd = deepCopyUploadEvidenceDocumentType(evidenceDocToCopy, RESPONDENT_TWO_ANY_PRECEDENT_H); + evidenceDocToAdd = deepCopyUploadEvidenceDocumentType(evidenceDocToCopy, RESPONDENT_TWO_SCHEDULE_OF_COSTS); builder.documentCostsRes2(evidenceDocToAdd); evidenceDocToCopy = compareAndCopy(caseDataBefore.getDocumentEvidenceForTrialRes(), @@ -984,7 +983,7 @@ private CaseData copyApp1ChangesToApp2(CaseData caseData, CaseData.CaseDataBuild evidenceDocToCopy = compareAndCopy(caseDataBefore.getDocumentCosts(), caseData.getDocumentCosts(), caseData.getDocumentCostsApp2()); - evidenceDocToAdd = deepCopyUploadEvidenceDocumentType(evidenceDocToCopy, APPLICANT_TWO_ANY_PRECEDENT_H); + evidenceDocToAdd = deepCopyUploadEvidenceDocumentType(evidenceDocToCopy, APPLICANT_TWO_SCHEDULE_OF_COSTS); builder.documentCostsApp2(evidenceDocToAdd); evidenceDocToCopy = compareAndCopy(caseDataBefore.getDocumentEvidenceForTrial(), diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadApplicantHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadApplicantHandlerTest.java index cda6fc74fc7..3704297d425 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadApplicantHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadApplicantHandlerTest.java @@ -843,7 +843,7 @@ void should_do_naming_convention(String selected) { assertThat(updatedData.getDocumentCostsApp2().get(0).getValue() .getDocumentUpload().getDocumentFileName()).isEqualTo(TEST_FILE_NAME); assertThat(updatedData.getDocumentCostsApp2().get(0).getValue() - .getDocumentUpload().getCategoryID()).isEqualTo(EvidenceUploadHandlerBase.APPLICANT_TWO_ANY_PRECEDENT_H); + .getDocumentUpload().getCategoryID()).isEqualTo(EvidenceUploadHandlerBase.APPLICANT_TWO_SCHEDULE_OF_COSTS); assertThat(updatedData.getNotificationText()).isEqualTo(NotificationWhenBothClaimant); } } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadRespondentHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadRespondentHandlerTest.java index 455cd043a2e..d5c32eeac09 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadRespondentHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/EvidenceUploadRespondentHandlerTest.java @@ -1451,7 +1451,7 @@ void should_do_naming_convention_resp1(String selected) { assertThat(updatedData.getDocumentCostsRes2().get(0).getValue() .getDocumentUpload().getDocumentFileName()).isEqualTo(TEST_FILE_NAME); assertThat(updatedData.getDocumentCostsRes2().get(0).getValue() - .getDocumentUpload().getCategoryID()).isEqualTo(EvidenceUploadHandlerBase.RESPONDENT_TWO_ANY_PRECEDENT_H); + .getDocumentUpload().getCategoryID()).isEqualTo(EvidenceUploadHandlerBase.RESPONDENT_TWO_SCHEDULE_OF_COSTS); assertThat(updatedData.getNotificationText()).contains(NotificationWhenBothDefendant); } } From e3851f09da9a8575ee449275c0779debd3b0c902 Mon Sep 17 00:00:00 2001 From: sankaviv1 <95748224+sankaviv1@users.noreply.github.com> Date: Mon, 13 Nov 2023 13:40:41 +0000 Subject: [PATCH 3/6] CIV-10094 Case flags updates for new parties (#3229) * Added new ManageContactInformation callback handler and event and whitelisted it within the AllowedFlowState service. * Added new ManageContactInformation callback handler and event and whitelisted it within the AllowedFlowState service. * CIV-9992 add options for manage contact information * revert accidental commit * add utils test * update utils test * add test scenarios for handler * update handler tests * add IDs to party options * changed name of some variables * added chosenpartytype and chosenpartyid to determine what to show on page 2, wip on applicant/defendant pages * adding tests ManageContactInformationUtilsTest * changed some keys, updated tests * experts and witnesses form wip * show experts on ui * make id fields public * CIV-10094 create/update case flags names for new/edited individuals * add unit tests * Cherry picked the 3 main commits from CIV-3216 Added partyID to dq witness and expert objects. Enabled the initialisation on party Ids in DQ witnesses and experts and copied partyIDs into their relative case level counterparts Moved changes behind hmc toggle Fixed duplicate append call * Updated experts and witnesses to have mappings * changed utils class back to static and removed mocks * Fixed witnesses * fixed litigation friend * append with party ID * remove unnecessary changes * remove unnecessary tests * update tests for party ids * fixed capability to delete all experts/witnesses and add new expert/witnesses when never existed before * postcode * removed unnecessary lines and imports * fix conflicts * fixed data going missing for applicant 1 for party id * fixed claim details tab * added ccd data store image in charts * fixed test * sonar fix --------- Co-authored-by: GarethLancaster <31533575+Gareth40342@users.noreply.github.com> Co-authored-by: sherlynkhaw Co-authored-by: Gareth Lancaster <90632240+Gareth40343@users.noreply.github.com> Co-authored-by: TurkingtonL Co-authored-by: AhsanZX97 --- ...nageContactInformationCallbackHandler.java | 5 + .../reform/civil/utils/CaseFlagUtils.java | 180 ++++- .../civil/utils/CaseFlagsInitialiser.java | 31 +- ...ContactInformationCallbackHandlerTest.java | 4 + .../civil/sampledata/CaseDataBuilder.java | 135 ++++ .../reform/civil/utils/CaseFlagUtilsTest.java | 692 ++++++++++++++++++ .../civil/utils/CaseFlagsInitialiserTest.java | 35 +- 7 files changed, 1064 insertions(+), 18 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/ManageContactInformationCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/ManageContactInformationCallbackHandler.java index f7570b2557a..1ce5e75b370 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/ManageContactInformationCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/ManageContactInformationCallbackHandler.java @@ -27,6 +27,7 @@ import uk.gov.hmcts.reform.civil.model.dq.Witness; import uk.gov.hmcts.reform.civil.service.CoreCaseUserService; import uk.gov.hmcts.reform.civil.service.UserService; +import uk.gov.hmcts.reform.civil.utils.CaseFlagsInitialiser; import uk.gov.hmcts.reform.civil.validation.PostcodeValidator; import uk.gov.hmcts.reform.idam.client.models.UserInfo; @@ -97,6 +98,7 @@ public class ManageContactInformationCallbackHandler extends CallbackHandler { private final UserService userService; private final ObjectMapper objectMapper; private final CaseDetailsConverter caseDetailsConverter; + private final CaseFlagsInitialiser caseFlagsInitialiser; private final PostcodeValidator postcodeValidator; @Override @@ -345,6 +347,9 @@ private CallbackResponse submitChanges(CallbackParams callbackParams) { updateExperts(caseData.getUpdateDetailsForm().getPartyChosenId(), caseData, builder); updateWitnesses(caseData.getUpdateDetailsForm().getPartyChosenId(), caseData, builder); + // last step before clearing update details form + caseFlagsInitialiser.initialiseCaseFlags(MANAGE_CONTACT_INFORMATION, builder); + // clear updateDetailsForm builder.updateDetailsForm(UpdateDetailsForm.builder().manageContactDetailsEventUsed(YES).build()); diff --git a/src/main/java/uk/gov/hmcts/reform/civil/utils/CaseFlagUtils.java b/src/main/java/uk/gov/hmcts/reform/civil/utils/CaseFlagUtils.java index 62a60317e95..cfc0249f777 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/utils/CaseFlagUtils.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/utils/CaseFlagUtils.java @@ -1,5 +1,6 @@ package uk.gov.hmcts.reform.civil.utils; +import uk.gov.hmcts.reform.ccd.model.OrganisationPolicy; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.PartyFlagStructure; import uk.gov.hmcts.reform.civil.model.caseflags.FlagDetail; @@ -22,18 +23,45 @@ import static uk.gov.hmcts.reform.civil.enums.YesOrNo.NO; import static uk.gov.hmcts.reform.civil.utils.ElementUtils.element; import static uk.gov.hmcts.reform.civil.utils.ElementUtils.unwrapElements; +import static uk.gov.hmcts.reform.civil.utils.ElementUtils.wrapElements; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_ONE_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_ONE_LEGAL_REP_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_ONE_LITIGATION_FRIEND_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_ONE_ORG_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_TWO_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_TWO_LITIGATION_FRIEND_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_TWO_ORG_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_ONE_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_ONE_LEGAL_REP_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_ONE_LITIGATION_FRIEND_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_ONE_ORG_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_TWO_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_TWO_LEGAL_REP_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_TWO_LITIGATION_FRIEND_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_TWO_ORG_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.PartyUtils.appendWithNewPartyId; import uk.gov.hmcts.reform.civil.model.LitigationFriend; import uk.gov.hmcts.reform.civil.model.Party; +import uk.gov.hmcts.reform.civil.prd.model.Organisation; +import uk.gov.hmcts.reform.civil.service.OrganisationService; public class CaseFlagUtils { - public static String RESPONDENT_SOLICITOR_ONE_WITNESS = "Respondent solicitor 1 witness"; - public static String RESPONDENT_SOLICITOR_ONE_EXPERT = "Respondent solicitor 1 expert"; - public static String RESPONDENT_SOLICITOR_TWO_WITNESS = "Respondent solicitor 2 witness"; - public static String RESPONDENT_SOLICITOR_TWO_EXPERT = "Respondent solicitor 2 expert"; - public static String APPLICANT_SOLICITOR_WITNESS = "Applicant solicitor witness"; - public static String APPLICANT_SOLICITOR_EXPERT = "Applicant solicitor expert"; + public static final String RESPONDENT_SOLICITOR_ONE_WITNESS = "Respondent solicitor 1 witness"; + public static final String RESPONDENT_SOLICITOR_ONE_EXPERT = "Respondent solicitor 1 expert"; + public static final String RESPONDENT_SOLICITOR_TWO_WITNESS = "Respondent solicitor 2 witness"; + public static final String RESPONDENT_SOLICITOR_TWO_EXPERT = "Respondent solicitor 2 expert"; + public static final String APPLICANT_SOLICITOR_WITNESS = "Applicant solicitor witness"; + public static final String APPLICANT_SOLICITOR_EXPERT = "Applicant solicitor expert"; + public static final String APPLICANT_ONE = "Applicant 1"; + public static final String APPLICANT_TWO = "Applicant 2"; + public static final String APPLICANT_ONE_LITIGATION_FRIEND = "Applicant 1 Litigation Friend"; + public static final String APPLICANT_TWO_LITIGATION_FRIEND = "Applicant 2 Litigation Friend"; + public static final String RESPONDENT_ONE = "Respondent 1"; + public static final String RESPONDENT_TWO = "Respondent 2"; + public static final String RESPONDENT_ONE_LITIGATION_FRIEND = "Respondent 1 Litigation Friend"; + public static final String RESPONDENT_TWO_LITIGATION_FRIEND = "Respondent 2 Litigation Friend"; private CaseFlagUtils() { //NO-OP @@ -49,7 +77,7 @@ public static Flags createFlags(String flagsPartyName, String roleOnCase) { private static PartyFlagStructure createPartiesCaseFlagsField(String partyId, String firstName, String lastName, String email, String phone, String roleOnCase) { - String partyName = String.format("%s %s", firstName, lastName); + String partyName = formattedPartyNameForFlags(firstName, lastName); return PartyFlagStructure.builder() .partyID(partyId) .firstName(firstName) @@ -72,7 +100,7 @@ public static LitigationFriend updateLitFriend(String roleOnCase, LitigationFrie // ToDo: Remove the use of fullName after H&L changes are default ===================================== litFriendToUpdate.getFullName() != null ? litFriendToUpdate.getFullName() // ==================================================================================================== - : String.format("%s %s", litFriendToUpdate.getFirstName(), litFriendToUpdate.getLastName()), + : formattedPartyNameForFlags(litFriendToUpdate.getFirstName(), litFriendToUpdate.getLastName()), roleOnCase)).build() : null; } @@ -171,6 +199,129 @@ public static void addApplicantExpertAndWitnessFlagsStructure(CaseData.CaseDataB } } + public static void createOrUpdateFlags(CaseData.CaseDataBuilder builder, CaseData caseData, OrganisationService organisationService) { + String partyChosen = caseData.getUpdateDetailsForm().getPartyChosenId(); + // claimant/defendant + updatePartyFlags(builder, caseData, partyChosen); + // litigation friend + updateLitigationFriendFlags(builder, caseData, partyChosen); + // attending for org/company + updateOrgIndividualsFlags(builder, caseData, partyChosen); + // attending for legal rep + updateLRIndividualsFlags(builder, caseData, partyChosen, organisationService); + } + + private static void updateLRIndividualsFlags(CaseData.CaseDataBuilder builder, CaseData caseData, String partyChosen, OrganisationService organisationService) { + if ((CLAIMANT_ONE_LEGAL_REP_INDIVIDUALS_ID).equals(partyChosen)) { + String legalRepFirmName = getLegalRepFirmName( + caseData.getApplicant1OrganisationPolicy(), + organisationService, + APPLICANT_ONE); + builder.applicant1LRIndividuals(updatePartyNameForPartyFlagStructures(caseData.getApplicant1LRIndividuals(), legalRepFirmName)); + } + if ((DEFENDANT_ONE_LEGAL_REP_INDIVIDUALS_ID).equals(partyChosen)) { + String legalRepFirmName = getLegalRepFirmName( + caseData.getRespondent1OrganisationPolicy(), + organisationService, + RESPONDENT_ONE); + builder.respondent1LRIndividuals(updatePartyNameForPartyFlagStructures(caseData.getRespondent1LRIndividuals(), legalRepFirmName)); + } + if ((DEFENDANT_TWO_LEGAL_REP_INDIVIDUALS_ID).equals(partyChosen)) { + String legalRepFirmName = getLegalRepFirmName( + caseData.getRespondent2OrganisationPolicy(), + organisationService, + RESPONDENT_TWO); + builder.respondent2LRIndividuals(updatePartyNameForPartyFlagStructures(caseData.getRespondent2LRIndividuals(), legalRepFirmName)); + } + } + + private static void updateOrgIndividualsFlags(CaseData.CaseDataBuilder builder, CaseData caseData, String partyChosen) { + if ((CLAIMANT_ONE_ORG_INDIVIDUALS_ID).equals(partyChosen)) { + builder.applicant1OrgIndividuals(updatePartyNameForPartyFlagStructures(caseData.getApplicant1OrgIndividuals(), caseData.getApplicant1().getPartyName())); + } + if ((CLAIMANT_TWO_ORG_INDIVIDUALS_ID).equals(partyChosen)) { + builder.applicant2OrgIndividuals(updatePartyNameForPartyFlagStructures(caseData.getApplicant2OrgIndividuals(), caseData.getApplicant2().getPartyName())); + } + if ((DEFENDANT_ONE_ORG_INDIVIDUALS_ID).equals(partyChosen)) { + builder.respondent1OrgIndividuals(updatePartyNameForPartyFlagStructures(caseData.getRespondent1OrgIndividuals(), caseData.getRespondent1().getPartyName())); + } + if ((DEFENDANT_TWO_ORG_INDIVIDUALS_ID).equals(partyChosen)) { + builder.respondent2OrgIndividuals(updatePartyNameForPartyFlagStructures(caseData.getRespondent2OrgIndividuals(), caseData.getRespondent2().getPartyName())); + } + } + + private static void updateLitigationFriendFlags(CaseData.CaseDataBuilder builder, CaseData caseData, String partyChosen) { + if ((CLAIMANT_ONE_LITIGATION_FRIEND_ID).equals(partyChosen)) { + builder.applicant1LitigationFriend(updatePartyNameForLitigationFriendFlags(caseData.getApplicant1LitigationFriend())); + } + if ((CLAIMANT_TWO_LITIGATION_FRIEND_ID).equals(partyChosen)) { + builder.applicant2LitigationFriend(updatePartyNameForLitigationFriendFlags(caseData.getApplicant2LitigationFriend())); + } + if ((DEFENDANT_ONE_LITIGATION_FRIEND_ID).equals(partyChosen)) { + builder.respondent1LitigationFriend(updatePartyNameForLitigationFriendFlags(caseData.getRespondent1LitigationFriend())); + } + if ((DEFENDANT_TWO_LITIGATION_FRIEND_ID).equals(partyChosen)) { + builder.respondent2LitigationFriend(updatePartyNameForLitigationFriendFlags(caseData.getRespondent2LitigationFriend())); + } + } + + private static void updatePartyFlags(CaseData.CaseDataBuilder builder, CaseData caseData, String partyChosen) { + if ((CLAIMANT_ONE_ID).equals(partyChosen)) { + builder.applicant1(updatePartyNameForFlags(caseData.getApplicant1())); + } + if ((CLAIMANT_TWO_ID).equals(partyChosen)) { + builder.applicant2(updatePartyNameForFlags(caseData.getApplicant2())); + } + if ((DEFENDANT_ONE_ID).equals(partyChosen)) { + builder.respondent1(updatePartyNameForFlags(caseData.getRespondent1())); + } + if ((DEFENDANT_TWO_ID).equals(partyChosen)) { + builder.respondent2(updatePartyNameForFlags(caseData.getRespondent2())); + } + } + + private static List> updatePartyNameForPartyFlagStructures(List> individuals, + String roleOnCase) { + if (individuals != null && !individuals.isEmpty()) { + List partyFlagStructures = unwrapElements(individuals); + List updatedList = new ArrayList<>(); + for (PartyFlagStructure partyFlagStructure : partyFlagStructures) { + String formattedPartyNameForFlags = formattedPartyNameForFlags(partyFlagStructure.getFirstName(), partyFlagStructure.getLastName()); + if (partyFlagStructure.getFlags() == null) { + // new party so initialise flags and party ID + updatedList.add( + appendWithNewPartyId(partyFlagStructure + .toBuilder() + .flags(createFlags(formattedPartyNameForFlags, roleOnCase)).build())); + } else { + // existing party with flags so just update the name + updatedList.add( + partyFlagStructure + .toBuilder() + .flags(partyFlagStructure.getFlags().toBuilder() + .partyName(formattedPartyNameForFlags) + .build()).build()); + } + } + return wrapElements(updatedList); + } + return null; + } + + private static Party updatePartyNameForFlags(Party party) { + return party.toBuilder().flags(party.getFlags().toBuilder() + .partyName(party.getPartyName()) + .build()).build(); + } + + private static LitigationFriend updatePartyNameForLitigationFriendFlags(LitigationFriend litigationFriend) { + return litigationFriend.toBuilder() + .flags(litigationFriend.getFlags().toBuilder() + .partyName(litigationFriend.getFullName() != null ? litigationFriend.getFullName() + : formattedPartyNameForFlags(litigationFriend.getFirstName(), litigationFriend.getLastName())) + .build()).build(); + } + public static List getAllCaseFlags(CaseData caseData) { var flagCollection = new ArrayList(); flagCollection.addAll(getFlagDetails(caseData.getCaseFlags())); @@ -222,4 +373,17 @@ public static List filter(List flagDetails, Predicate true)) .collect(Collectors.toList()); } + + private static String formattedPartyNameForFlags(String firstName, String lastName) { + return String.format("%s %s", firstName, lastName); + } + + private static String getLegalRepFirmName(OrganisationPolicy organisationPolicy, + OrganisationService organisationService, + String party) { + String organisationID = organisationPolicy.getOrganisation().getOrganisationID(); + return organisationService.findOrganisationById(organisationID) + .map(Organisation::getName) + .orElse(String.format("legal representative for %s", party.toLowerCase())); + } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/utils/CaseFlagsInitialiser.java b/src/main/java/uk/gov/hmcts/reform/civil/utils/CaseFlagsInitialiser.java index 8955dff6ea4..708b197e462 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/utils/CaseFlagsInitialiser.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/utils/CaseFlagsInitialiser.java @@ -5,16 +5,27 @@ import uk.gov.hmcts.reform.civil.callback.CaseEvent; import uk.gov.hmcts.reform.civil.service.FeatureToggleService; import uk.gov.hmcts.reform.civil.model.CaseData; +import uk.gov.hmcts.reform.civil.service.OrganisationService; import static uk.gov.hmcts.reform.civil.enums.YesOrNo.YES; +import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.APPLICANT_ONE; +import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.APPLICANT_ONE_LITIGATION_FRIEND; +import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.APPLICANT_TWO; +import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.APPLICANT_TWO_LITIGATION_FRIEND; +import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.RESPONDENT_ONE; +import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.RESPONDENT_ONE_LITIGATION_FRIEND; +import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.RESPONDENT_TWO; +import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.RESPONDENT_TWO_LITIGATION_FRIEND; import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.addApplicantExpertAndWitnessFlagsStructure; import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.addRespondentDQPartiesFlagStructure; +import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.createOrUpdateFlags; @Component @AllArgsConstructor public class CaseFlagsInitialiser { private final FeatureToggleService featureToggleService; + private final OrganisationService organisationService; public void initialiseCaseFlags(CaseEvent caseEvent, CaseData.CaseDataBuilder dataBuilder) { if (!featureToggleService.isCaseFlagsEnabled()) { @@ -42,6 +53,10 @@ public void initialiseCaseFlags(CaseEvent caseEvent, CaseData.CaseDataBuilder da addApplicantExpertAndWitnessFlagsStructure(dataBuilder, caseData); break; } + case MANAGE_CONTACT_INFORMATION: { + createOrUpdateFlags(dataBuilder, caseData, organisationService); + break; + } default: } } @@ -62,26 +77,26 @@ private void initialiseRespondentLitigationFriendFlags(CaseData.CaseDataBuilder dataBuilder .respondent1LitigationFriend( CaseFlagUtils.updateLitFriend( - "Respondent 1 Litigation Friend", + RESPONDENT_ONE_LITIGATION_FRIEND, caseData.getRespondent1LitigationFriend() )) .respondent2LitigationFriend( CaseFlagUtils.updateLitFriend( - "Respondent 2 Litigation Friend", + RESPONDENT_TWO_LITIGATION_FRIEND, caseData.getRespondent2LitigationFriend() )); } private void initialiseApplicantAndRespondentFlags(CaseData.CaseDataBuilder dataBuilder, CaseData caseData) { dataBuilder - .applicant1(CaseFlagUtils.updateParty("Applicant 1", caseData.getApplicant1())) - .applicant2(CaseFlagUtils.updateParty("Applicant 2", caseData.getApplicant2())) - .respondent1(CaseFlagUtils.updateParty("Respondent 1", caseData.getRespondent1())) - .respondent2(CaseFlagUtils.updateParty("Respondent 2", caseData.getRespondent2())) + .applicant1(CaseFlagUtils.updateParty(APPLICANT_ONE, caseData.getApplicant1())) + .applicant2(CaseFlagUtils.updateParty(APPLICANT_TWO, caseData.getApplicant2())) + .respondent1(CaseFlagUtils.updateParty(RESPONDENT_ONE, caseData.getRespondent1())) + .respondent2(CaseFlagUtils.updateParty(RESPONDENT_TWO, caseData.getRespondent2())) .applicant1LitigationFriend(CaseFlagUtils.updateLitFriend( - "Applicant 1 Litigation Friend", caseData.getApplicant1LitigationFriend())) + APPLICANT_ONE_LITIGATION_FRIEND, caseData.getApplicant1LitigationFriend())) .applicant2LitigationFriend(CaseFlagUtils.updateLitFriend( - "Applicant 2 Litigation Friend", caseData.getApplicant2LitigationFriend())); + APPLICANT_TWO_LITIGATION_FRIEND, caseData.getApplicant2LitigationFriend())); } private boolean shouldReinitialiseRespondentDQFlags(CaseData caseData) { diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/ManageContactInformationCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/ManageContactInformationCallbackHandlerTest.java index de083369ffa..8ff9b667be7 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/ManageContactInformationCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/ManageContactInformationCallbackHandlerTest.java @@ -36,6 +36,7 @@ import uk.gov.hmcts.reform.civil.model.dq.Witnesses; import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; import uk.gov.hmcts.reform.civil.service.CoreCaseUserService; +import uk.gov.hmcts.reform.civil.utils.CaseFlagsInitialiser; import uk.gov.hmcts.reform.civil.validation.PostcodeValidator; import uk.gov.hmcts.reform.idam.client.models.UserInfo; import java.time.LocalDate; @@ -86,6 +87,9 @@ class ManageContactInformationCallbackHandlerTest extends BaseCallbackHandlerTes @Autowired private ObjectMapper mapper; + @MockBean + private CaseFlagsInitialiser caseFlagInitialiser; + @MockBean private CoreCaseUserService coreCaseUserService; diff --git a/src/test/java/uk/gov/hmcts/reform/civil/sampledata/CaseDataBuilder.java b/src/test/java/uk/gov/hmcts/reform/civil/sampledata/CaseDataBuilder.java index 4b2a4a05581..df35ed83ab4 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/sampledata/CaseDataBuilder.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/sampledata/CaseDataBuilder.java @@ -488,6 +488,15 @@ public class CaseDataBuilder { private NotSuitableSdoOptions notSuitableSdoOptions; + private List> applicant1LRIndividuals; + private List> respondent1LRIndividuals; + private List> respondent2LRIndividuals; + + private List> applicant1OrgIndividuals; + private List> applicant2OrgIndividuals; + private List> respondent1OrgIndividuals; + private List> respondent2OrgIndividuals; + protected String hearingReference; protected ListingOrRelisting listingOrRelisting; @@ -6131,6 +6140,125 @@ public CaseDataBuilder atTrialHearingWitnessOfFactWithNegativeInputs() { return this; } + public CaseDataBuilder addApplicantLRIndividual(String firstName, String lastName) { + List> individual = + wrapElements(PartyFlagStructure.builder() + .partyID("app-lr-ind-party-id") + .firstName(firstName) + .lastName(lastName) + .email("abc@def.ghi") + .phone("07777777777") + .build()); + if (this.applicant1LRIndividuals != null && !this.applicant1LRIndividuals.isEmpty()) { + this.applicant1LRIndividuals.addAll(individual); + } else { + this.applicant1LRIndividuals = individual; + } + return this; + } + + public CaseDataBuilder addRespondent1LRIndividual(String firstName, String lastName) { + List> individual = + wrapElements(PartyFlagStructure.builder() + .partyID("res-1-lr-ind-party-id") + .firstName(firstName) + .lastName(lastName) + .email("abc@def.ghi") + .phone("07777777777") + .build()); + if (this.respondent1LRIndividuals != null && !this.respondent1LRIndividuals.isEmpty()) { + this.respondent1LRIndividuals.addAll(individual); + } else { + this.respondent1LRIndividuals = individual; + } + return this; + } + + public CaseDataBuilder addRespondent2LRIndividual(String firstName, String lastName) { + List> individual = + wrapElements(PartyFlagStructure.builder() + .partyID("res-2-lr-ind-party-id") + .firstName(firstName) + .lastName(lastName) + .email("abc@def.ghi") + .phone("07777777777") + .build()); + if (this.respondent2LRIndividuals != null && !this.respondent2LRIndividuals.isEmpty()) { + this.respondent2LRIndividuals.addAll(individual); + } else { + this.respondent2LRIndividuals = individual; + } + return this; + } + + public CaseDataBuilder addApplicant1OrgIndividual(String firstName, String lastName) { + List> individual = + wrapElements(PartyFlagStructure.builder() + .partyID("app-1-org-ind-party-id") + .firstName(firstName) + .lastName(lastName) + .email("abc@def.ghi") + .phone("07777777777") + .build()); + if (this.applicant1OrgIndividuals != null && !this.applicant1OrgIndividuals.isEmpty()) { + this.applicant1OrgIndividuals.addAll(individual); + } else { + this.applicant1OrgIndividuals = individual; + } + return this; + } + + public CaseDataBuilder addApplicant2OrgIndividual(String firstName, String lastName) { + List> individual = + wrapElements(PartyFlagStructure.builder() + .partyID("app-2-org-ind-party-id") + .firstName(firstName) + .lastName(lastName) + .email("abc@def.ghi") + .phone("07777777777") + .build()); + if (this.applicant2OrgIndividuals != null && !this.applicant2OrgIndividuals.isEmpty()) { + this.applicant2OrgIndividuals.addAll(individual); + } else { + this.applicant2OrgIndividuals = individual; + } + return this; + } + + public CaseDataBuilder addRespondent1OrgIndividual(String firstName, String lastName) { + List> individual = + wrapElements(PartyFlagStructure.builder() + .partyID("res-1-org-ind-party-id") + .firstName(firstName) + .lastName(lastName) + .email("abc@def.ghi") + .phone("07777777777") + .build()); + if (this.respondent1OrgIndividuals != null && !this.respondent1OrgIndividuals.isEmpty()) { + this.respondent1OrgIndividuals.addAll(individual); + } else { + this.respondent1OrgIndividuals = individual; + } + return this; + } + + public CaseDataBuilder addRespondent2OrgIndividual(String firstName, String lastName) { + List> individual = + wrapElements(PartyFlagStructure.builder() + .partyID("res-2-org-ind-party-id") + .firstName(firstName) + .lastName(lastName) + .email("abc@def.ghi") + .phone("07777777777") + .build()); + if (this.respondent2OrgIndividuals != null && !this.respondent2OrgIndividuals.isEmpty()) { + this.respondent2OrgIndividuals.addAll(individual); + } else { + this.respondent2OrgIndividuals = individual; + } + return this; + } + public static CaseDataBuilder builder() { return new CaseDataBuilder(); } @@ -6416,6 +6544,13 @@ public CaseData build() { .drawDirectionsOrderRequired(drawDirectionsOrderRequired) .transferCourtLocationList(transferCourtLocationList) .reasonForTransfer(reasonForTransfer) + .applicant1LRIndividuals(applicant1LRIndividuals) + .respondent1LRIndividuals(respondent1LRIndividuals) + .respondent2LRIndividuals(respondent2LRIndividuals) + .applicant1OrgIndividuals(applicant1OrgIndividuals) + .applicant2OrgIndividuals(applicant2OrgIndividuals) + .respondent1OrgIndividuals(respondent1OrgIndividuals) + .respondent2OrgIndividuals(respondent2OrgIndividuals) .build(); } } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/utils/CaseFlagUtilsTest.java b/src/test/java/uk/gov/hmcts/reform/civil/utils/CaseFlagUtilsTest.java index cca5bf3657e..aae666611d3 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/utils/CaseFlagUtilsTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/utils/CaseFlagUtilsTest.java @@ -1,5 +1,6 @@ package uk.gov.hmcts.reform.civil.utils; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -7,6 +8,7 @@ import uk.gov.hmcts.reform.civil.model.PartyFlagStructure; import uk.gov.hmcts.reform.civil.model.LitigationFriend; import uk.gov.hmcts.reform.civil.model.Party; +import uk.gov.hmcts.reform.civil.model.UpdateDetailsForm; import uk.gov.hmcts.reform.civil.model.caseflags.FlagDetail; import uk.gov.hmcts.reform.civil.model.caseflags.Flags; import uk.gov.hmcts.reform.civil.model.common.Element; @@ -18,15 +20,21 @@ import uk.gov.hmcts.reform.civil.model.dq.Respondent2DQ; import uk.gov.hmcts.reform.civil.model.dq.Witness; import uk.gov.hmcts.reform.civil.model.dq.Witnesses; +import uk.gov.hmcts.reform.civil.prd.model.Organisation; import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; import uk.gov.hmcts.reform.civil.sampledata.PartyBuilder; +import uk.gov.hmcts.reform.civil.service.OrganisationService; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.civil.enums.YesOrNo.NO; import static uk.gov.hmcts.reform.civil.enums.YesOrNo.YES; import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.APPLICANT_SOLICITOR_EXPERT; @@ -39,10 +47,35 @@ import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.addRespondentDQPartiesFlagStructure; import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.filter; import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.getAllCaseFlags; +import static uk.gov.hmcts.reform.civil.utils.ElementUtils.unwrapElements; import static uk.gov.hmcts.reform.civil.utils.ElementUtils.wrapElements; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_ONE_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_ONE_LEGAL_REP_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_ONE_LITIGATION_FRIEND_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_ONE_ORG_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_TWO_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_TWO_LITIGATION_FRIEND_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_TWO_ORG_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_ONE_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_ONE_LEGAL_REP_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_ONE_LITIGATION_FRIEND_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_ONE_ORG_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_TWO_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_TWO_LEGAL_REP_INDIVIDUALS_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_TWO_LITIGATION_FRIEND_ID; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.DEFENDANT_TWO_ORG_INDIVIDUALS_ID; class CaseFlagUtilsTest { + private OrganisationService organisationService; + + @BeforeEach + void setUp() { + organisationService = mock(OrganisationService.class); + when(organisationService.findOrganisationById(anyString())) + .thenReturn(Optional.of(Organisation.builder().name("Civil - Organisation").build())); + } + @Nested class CreateFlags { @@ -648,4 +681,663 @@ private List hearingRelevantFlagDetails() { return List.of(details1, details2, details3); } } + + @Nested + class CreateAndUpdateFlagNamesAfterManageContactInformationEvent { + + @Nested + class Parties { + + @Test + void shouldUpdateFlagName_whenClaimant1NameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(CLAIMANT_ONE_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .applicant1(caseData.getApplicant1().toBuilder() + .flags(Flags.builder() + .partyName("Mr. John Rambo") + .roleOnCase("applicant") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .individualFirstName("Johnny") + .individualLastName("Rambo new").build()); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + Flags actual = builder.build().getApplicant1().getFlags(); + Flags expected = Flags.builder().partyName("Mr. Johnny Rambo new") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("applicant").build(); + + assertThat(actual).isEqualTo(expected); + } + + @Test + void shouldUpdateFlagName_whenClaimant2NameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .multiPartyClaimTwoApplicants() + .atStateClaimIssued() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(CLAIMANT_TWO_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .applicant2(caseData.getApplicant2().toBuilder() + .flags(Flags.builder() + .partyName("Mr. Jason Rambo") + .roleOnCase("applicant") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .individualFirstName("JJ") + .individualLastName("Rambo edited").build()); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + Flags actual = builder.build().getApplicant2().getFlags(); + Flags expected = Flags.builder().partyName("Mr. JJ Rambo edited") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("applicant").build(); + + assertThat(actual).isEqualTo(expected); + } + + @Test + void shouldUpdateFlagName_whenRespondent1NameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimIssued() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_ONE_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent1(caseData.getRespondent1().toBuilder() + .flags(Flags.builder() + .partyName("Mr. Sole Trader") + .roleOnCase("respondent") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .soleTraderFirstName("Solo") + .soleTraderLastName("New trader").build()); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + Flags actual = builder.build().getRespondent1().getFlags(); + Flags expected = Flags.builder().partyName("Mr. Solo New trader") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("respondent").build(); + + assertThat(actual).isEqualTo(expected); + } + + @Test + void shouldUpdateFlagName_whenRespondent2NameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimIssued() + .multiPartyClaimTwoDefendantSolicitors() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_TWO_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent2(caseData.getRespondent2().toBuilder() + .flags(Flags.builder() + .partyName("Mr. John Rambo") + .roleOnCase("respondent") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .individualTitle("Miss") + .individualFirstName("Jenny") + .individualLastName("Rombo").build()); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + Flags actual = builder.build().getRespondent2().getFlags(); + Flags expected = Flags.builder().partyName("Miss Jenny Rombo") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("respondent").build(); + + assertThat(actual).isEqualTo(expected); + } + } + + @Nested + class LitigationFriend { + + @Test + void shouldUpdateFlagName_whenClaimant1LitigationFriendNameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .addApplicant1LitigationFriend() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(CLAIMANT_ONE_LITIGATION_FRIEND_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .applicant1LitigationFriend(caseData.getApplicant1LitigationFriend().toBuilder() + .flags(Flags.builder() + .partyName("Mr. Applicant Litigation Friend") + .roleOnCase("litigation friend") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .fullName(null) + .firstName("Johnny").lastName("Rambo new") + .build()); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + Flags actual = builder.build().getApplicant1LitigationFriend().getFlags(); + Flags expected = Flags.builder().partyName("Johnny Rambo new") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("litigation friend").build(); + + assertThat(actual).isEqualTo(expected); + } + + @Test + void shouldUpdateFlagName_whenClaimant2LitigationFriendNameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .addApplicant2LitigationFriend() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(CLAIMANT_TWO_LITIGATION_FRIEND_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .applicant2LitigationFriend(caseData.getApplicant2LitigationFriend().toBuilder() + .flags(Flags.builder() + .partyName("Applicant Two Litigation Friend") + .roleOnCase("litigation friend") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .fullName(null) + .firstName("Johnny").lastName("Rambo new") + .build()); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + Flags actual = builder.build().getApplicant2LitigationFriend().getFlags(); + Flags expected = Flags.builder().partyName("Johnny Rambo new") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("litigation friend").build(); + + assertThat(actual).isEqualTo(expected); + } + + @Test + void shouldUpdateFlagName_whenRespondent1LitigationFriendNameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .addRespondent1LitigationFriend() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_ONE_LITIGATION_FRIEND_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent1LitigationFriend(caseData.getRespondent1LitigationFriend().toBuilder() + .flags(Flags.builder() + .partyName("Litigation Friend") + .roleOnCase("litigation friend") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .fullName(null) + .firstName("Johnny").lastName("Rambo new") + .build()); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + Flags actual = builder.build().getRespondent1LitigationFriend().getFlags(); + Flags expected = Flags.builder().partyName("Johnny Rambo new") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("litigation friend").build(); + + assertThat(actual).isEqualTo(expected); + } + + @Test + void shouldUpdateFlagName_whenRespondent2LitigationFriendNameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .multiPartyClaimTwoDefendantSolicitors() + .atStateApplicantRespondToDefenceAndProceed() + .addRespondent2LitigationFriend() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_TWO_LITIGATION_FRIEND_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent2LitigationFriend(caseData.getRespondent2LitigationFriend().toBuilder() + .flags(Flags.builder() + .partyName("Litigation Friend") + .roleOnCase("litigation friend") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .fullName(null) + .firstName("Johnny").lastName("Rambo new") + .build()); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + Flags actual = builder.build().getRespondent2LitigationFriend().getFlags(); + Flags expected = Flags.builder().partyName("Johnny Rambo new") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("litigation friend").build(); + + assertThat(actual).isEqualTo(expected); + } + } + + @Nested + class LegalRepIndividuals { + + @Test + void shouldCreateFlag_whenClaimantLRIndividualAdded() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(CLAIMANT_ONE_LEGAL_REP_INDIVIDUALS_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .applicant1LRIndividuals(wrapElements(PartyFlagStructure.builder() + .firstName("Legally").lastName("Rep") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getApplicant1LRIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Legally Rep") + .details(List.of()) + .roleOnCase("Civil - Organisation").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isNotNull(); + } + + @Test + void shouldUpdateFlagName_whenClaimantLRIndividualNameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .addApplicantLRIndividual("Legal", "Rep") + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(CLAIMANT_ONE_LEGAL_REP_INDIVIDUALS_ID).build()) + .build(); + + PartyFlagStructure lrIndividual = unwrapElements(caseData.getApplicant1LRIndividuals()).get(0); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .applicant1LRIndividuals(wrapElements(lrIndividual.toBuilder() + .flags(Flags.builder() + .partyName("Legal Rep") + .roleOnCase("Civil - Organisation") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .firstName("Legally").lastName("Rep") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getApplicant1LRIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Legally Rep") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("Civil - Organisation").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isEqualTo("app-lr-ind-party-id"); + } + + @Test + void shouldCreateFlag_whenRespondent1LRIndividualAdded() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_ONE_LEGAL_REP_INDIVIDUALS_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent1LRIndividuals(wrapElements(PartyFlagStructure.builder() + .firstName("Legally").lastName("Rep") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getRespondent1LRIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Legally Rep") + .details(List.of()) + .roleOnCase("Civil - Organisation").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isNotNull(); + } + + @Test + void shouldUpdateFlagName_whenRespondent1LRIndividualNameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .addRespondent1LRIndividual("Legal", "Rep") + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_ONE_LEGAL_REP_INDIVIDUALS_ID).build()) + .build(); + + PartyFlagStructure lrIndividual = unwrapElements(caseData.getRespondent1LRIndividuals()).get(0); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent1LRIndividuals(wrapElements(lrIndividual.toBuilder() + .flags(Flags.builder() + .partyName("Legal Rep") + .roleOnCase("Civil - Organisation") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .firstName("Legally").lastName("Rep") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getRespondent1LRIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Legally Rep") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("Civil - Organisation").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isEqualTo("res-1-lr-ind-party-id"); + } + + @Test + void shouldCreateFlag_whenRespondent2LRIndividualAdded() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_TWO_LEGAL_REP_INDIVIDUALS_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent2LRIndividuals(wrapElements(PartyFlagStructure.builder() + .firstName("Legally").lastName("Rep") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getRespondent2LRIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Legally Rep") + .details(List.of()) + .roleOnCase("Civil - Organisation").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isNotNull(); + } + + @Test + void shouldUpdateFlagName_whenRespondent2LRIndividualNameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .addRespondent2LRIndividual("Legal", "Rep") + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_TWO_LEGAL_REP_INDIVIDUALS_ID).build()) + .build(); + + PartyFlagStructure lrIndividual = unwrapElements(caseData.getRespondent2LRIndividuals()).get(0); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent2LRIndividuals(wrapElements(lrIndividual.toBuilder() + .flags(Flags.builder() + .partyName("Legal Rep") + .roleOnCase("Civil - Organisation") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .firstName("Legally").lastName("Rep") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getRespondent2LRIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Legally Rep") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("Civil - Organisation").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isEqualTo("res-2-lr-ind-party-id"); + } + } + + @Nested + class OrgIndividuals { + + @Test + void shouldCreateFlag_whenClaimant1OrgIndividualAdded() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(CLAIMANT_ONE_ORG_INDIVIDUALS_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .applicant1OrgIndividuals(wrapElements(PartyFlagStructure.builder() + .firstName("Org").lastName("Ind") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getApplicant1OrgIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Org Ind") + .details(List.of()) + .roleOnCase("Mr. John Rambo").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isNotNull(); + } + + @Test + void shouldUpdateFlagName_whenClaimant1OrgIndividualNameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .addApplicant1OrgIndividual("Org", "Person") + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(CLAIMANT_ONE_ORG_INDIVIDUALS_ID).build()) + .build(); + + PartyFlagStructure orgIndividual = unwrapElements(caseData.getApplicant1OrgIndividuals()).get(0); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .applicant1OrgIndividuals(wrapElements(orgIndividual.toBuilder() + .flags(Flags.builder() + .partyName("Org Person") + .roleOnCase("Mr. John Rambo") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .firstName("Org").lastName("Ind") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getApplicant1OrgIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Org Ind") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("Mr. John Rambo").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isEqualTo("app-1-org-ind-party-id"); + } + + @Test + void shouldCreateFlag_whenClaimant2OrgIndividualAdded() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimIssued() + .multiPartyClaimTwoApplicants() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(CLAIMANT_TWO_ORG_INDIVIDUALS_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .applicant2OrgIndividuals(wrapElements(PartyFlagStructure.builder() + .firstName("Org").lastName("Ind") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getApplicant2OrgIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Org Ind") + .details(List.of()) + .roleOnCase("Mr. Jason Rambo").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isNotNull(); + } + + @Test + void shouldUpdateFlagName_whenClaimant2OrgIndividualNameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimIssued() + .multiPartyClaimTwoApplicants() + .addApplicant2OrgIndividual("Org", "Person") + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(CLAIMANT_TWO_ORG_INDIVIDUALS_ID).build()) + .build(); + + PartyFlagStructure orgIndividual = unwrapElements(caseData.getApplicant2OrgIndividuals()).get(0); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .applicant2OrgIndividuals(wrapElements(orgIndividual.toBuilder() + .flags(Flags.builder() + .partyName("Org Person") + .roleOnCase("Mr. Jason Rambo") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .firstName("Org").lastName("Ind") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getApplicant2OrgIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Org Ind") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("Mr. Jason Rambo").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isEqualTo("app-2-org-ind-party-id"); + } + + @Test + void shouldCreateFlag_whenRespondent1OrgIndividualAdded() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_ONE_ORG_INDIVIDUALS_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent1OrgIndividuals(wrapElements(PartyFlagStructure.builder() + .firstName("Org").lastName("Ind") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getRespondent1OrgIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Org Ind") + .details(List.of()) + .roleOnCase("Mr. Sole Trader").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isNotNull(); + } + + @Test + void shouldUpdateFlagName_whenRespondent1OrgIndividualNameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateApplicantRespondToDefenceAndProceed() + .addRespondent1OrgIndividual("Org", "Person") + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_ONE_ORG_INDIVIDUALS_ID).build()) + .build(); + + PartyFlagStructure orgIndividual = unwrapElements(caseData.getRespondent1OrgIndividuals()).get(0); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent1OrgIndividuals(wrapElements(orgIndividual.toBuilder() + .flags(Flags.builder() + .partyName("Org Person") + .roleOnCase("Mr. Sole Trader") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .firstName("Org").lastName("Ind") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getRespondent1OrgIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Org Ind") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("Mr. Sole Trader").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isEqualTo("res-1-org-ind-party-id"); + } + + @Test + void shouldCreateFlag_whenRespondent2OrgIndividualAdded() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimIssued() + .multiPartyClaimTwoDefendantSolicitors() + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_TWO_ORG_INDIVIDUALS_ID).build()) + .build(); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent2OrgIndividuals(wrapElements(PartyFlagStructure.builder() + .firstName("Org").lastName("Ind") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getRespondent2OrgIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Org Ind") + .details(List.of()) + .roleOnCase("Mr. John Rambo").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isNotNull(); + } + + @Test + void shouldUpdateFlagName_whenRespondent2OrgIndividualNameUpdated() { + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimIssued() + .multiPartyClaimTwoDefendantSolicitors() + .addRespondent2OrgIndividual("Org", "Person") + .updateDetailsForm(UpdateDetailsForm.builder().partyChosenId(DEFENDANT_TWO_ORG_INDIVIDUALS_ID).build()) + .build(); + + PartyFlagStructure lrIndividual = unwrapElements(caseData.getRespondent2OrgIndividuals()).get(0); + + CaseData.CaseDataBuilder builder = caseData.toBuilder() + .respondent2OrgIndividuals(wrapElements(lrIndividual.toBuilder() + .flags(Flags.builder() + .partyName("Org Person") + .roleOnCase("Mr. John Rambo") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))).build()) + .firstName("Org").lastName("Ind") + .build())); + + CaseFlagUtils.createOrUpdateFlags(builder, builder.build(), organisationService); + + PartyFlagStructure individual = unwrapElements(builder.build().getRespondent2OrgIndividuals()).get(0); + Flags actualFlags = individual.getFlags(); + Flags expectedFlags = Flags.builder().partyName("Org Ind") + .details(wrapElements(List.of( + FlagDetail.builder().name("flag name").build()))) + .roleOnCase("Mr. John Rambo").build(); + + assertThat(actualFlags).isEqualTo(expectedFlags); + assertThat(individual.getPartyID()).isEqualTo("res-2-org-ind-party-id"); + } + } + } } diff --git a/src/test/java/uk/gov/hmcts/reform/civil/utils/CaseFlagsInitialiserTest.java b/src/test/java/uk/gov/hmcts/reform/civil/utils/CaseFlagsInitialiserTest.java index bb546a4f699..334bb719764 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/utils/CaseFlagsInitialiserTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/utils/CaseFlagsInitialiserTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import uk.gov.hmcts.reform.ccd.model.OrganisationPolicy; import uk.gov.hmcts.reform.civil.callback.CaseEvent; import uk.gov.hmcts.reform.civil.model.Party; import uk.gov.hmcts.reform.civil.model.PartyFlagStructure; @@ -14,17 +15,23 @@ import uk.gov.hmcts.reform.civil.model.dq.Respondent2DQ; import uk.gov.hmcts.reform.civil.model.dq.Witness; import uk.gov.hmcts.reform.civil.model.dq.Witnesses; -import uk.gov.hmcts.reform.civil.service.FeatureToggleService; +import uk.gov.hmcts.reform.civil.model.UpdateDetailsForm; import uk.gov.hmcts.reform.civil.model.CaseData; import uk.gov.hmcts.reform.civil.model.LitigationFriend; import uk.gov.hmcts.reform.civil.model.caseflags.Flags; +import uk.gov.hmcts.reform.civil.prd.model.Organisation; import uk.gov.hmcts.reform.civil.sampledata.PartyBuilder; +import uk.gov.hmcts.reform.civil.service.FeatureToggleService; +import uk.gov.hmcts.reform.civil.service.OrganisationService; import java.util.List; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static uk.gov.hmcts.reform.civil.enums.YesOrNo.YES; import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.APPLICANT_SOLICITOR_EXPERT; @@ -35,6 +42,7 @@ import static uk.gov.hmcts.reform.civil.utils.CaseFlagUtils.RESPONDENT_SOLICITOR_TWO_WITNESS; import static uk.gov.hmcts.reform.civil.utils.ElementUtils.unwrapElements; import static uk.gov.hmcts.reform.civil.utils.ElementUtils.wrapElements; +import static uk.gov.hmcts.reform.civil.utils.ManageContactInformationUtils.CLAIMANT_ONE_LEGAL_REP_INDIVIDUALS_ID; class CaseFlagsInitialiserTest { @@ -42,11 +50,16 @@ class CaseFlagsInitialiserTest { private FeatureToggleService featureToggleService; + private OrganisationService organisationService; + @BeforeEach void setup() { featureToggleService = mock(FeatureToggleService.class); - caseFlagsInitialiser = new CaseFlagsInitialiser(featureToggleService); + organisationService = mock(OrganisationService.class); + caseFlagsInitialiser = new CaseFlagsInitialiser(featureToggleService, organisationService); when(featureToggleService.isCaseFlagsEnabled()).thenReturn(true); + when(organisationService.findOrganisationById(anyString())) + .thenReturn(Optional.of(Organisation.builder().name("Civil - Organisation 1").build())); } @Test @@ -178,6 +191,24 @@ void shouldNotInitialiseCaseFlagsWhenCaseFlagsToggleIsOff() { assertEquals(expected, actual.build()); } + @Test + void shouldInitialiseCaseFlagsForManageContactInformationEvent() { + CaseData caseData = CaseData.builder() + .applicant1OrganisationPolicy(OrganisationPolicy.builder() + .organisation(uk.gov.hmcts.reform.ccd.model.Organisation.builder() + .organisationID("id") + .build()) + .build()) + .updateDetailsForm(UpdateDetailsForm.builder() + .partyChosenId(CLAIMANT_ONE_LEGAL_REP_INDIVIDUALS_ID) + .build()) + .build(); + + caseFlagsInitialiser.initialiseCaseFlags(CaseEvent.MANAGE_CONTACT_INFORMATION, caseData.toBuilder()); + + verify(organisationService).findOrganisationById("id"); + } + @Test void shouldReinitialiseMissingCaseFlags() { Party applicant1 = PartyBuilder.builder().individual().build(); From 31f15428b359337b03b3ac2d6c0aff747039ead8 Mon Sep 17 00:00:00 2001 From: pliao-hmcts <113367232+pliao-hmcts@users.noreply.github.com> Date: Mon, 13 Nov 2023 14:44:40 +0000 Subject: [PATCH 4/6] CIV-11440 Assisted Order - Costs default value (#3548) * CIV-11440 set default value for costs * CIV-11440 Interim payment required set to No * CIV-11440 unit test --------- Co-authored-by: Madhan Mahadevan Co-authored-by: vasudevganesanhmcts <100689363+vasudevganesanhmcts@users.noreply.github.com> --- .../user/GenerateDirectionOrderCallbackHandler.java | 8 ++++++++ .../GenerateDirectionOrderCallbackHandlerTest.java | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/GenerateDirectionOrderCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/GenerateDirectionOrderCallbackHandler.java index 57967679b5d..91e5960c66b 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/GenerateDirectionOrderCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/GenerateDirectionOrderCallbackHandler.java @@ -14,6 +14,7 @@ import uk.gov.hmcts.reform.civil.enums.CaseState; import uk.gov.hmcts.reform.civil.enums.MultiPartyScenario; import uk.gov.hmcts.reform.civil.enums.YesOrNo; +import uk.gov.hmcts.reform.civil.enums.finalorders.CostEnums; import uk.gov.hmcts.reform.civil.enums.finalorders.FinalOrderToggle; import uk.gov.hmcts.reform.civil.enums.finalorders.HearingLengthFinalOrderList; import uk.gov.hmcts.reform.civil.model.BusinessProcess; @@ -66,6 +67,9 @@ import static uk.gov.hmcts.reform.civil.enums.MultiPartyScenario.TWO_V_ONE; import static uk.gov.hmcts.reform.civil.enums.MultiPartyScenario.getMultiPartyScenario; import static uk.gov.hmcts.reform.civil.enums.caseprogression.FinalOrderSelection.ASSISTED_ORDER; +import static uk.gov.hmcts.reform.civil.enums.finalorders.CostEnums.CLAIMANT; +import static uk.gov.hmcts.reform.civil.enums.finalorders.CostEnums.STANDARD_BASIS; +import static uk.gov.hmcts.reform.civil.enums.finalorders.CostEnums.SUBJECT_DETAILED_ASSESSMENT; import static uk.gov.hmcts.reform.civil.enums.finalorders.FinalOrderRepresentationList.CLAIMANT_AND_DEFENDANT; import static uk.gov.hmcts.reform.civil.model.common.DynamicList.fromList; import static uk.gov.hmcts.reform.civil.utils.ElementUtils.element; @@ -289,6 +293,10 @@ private DynamicList populateCurrentHearingLocation(CaseData caseData, String aut .assistedOrderCostsFirstDropdownDate(advancedDate) .assistedOrderAssessmentThirdDropdownDate(advancedDate) .makeAnOrderForCostsYesOrNo(YesOrNo.NO) + .makeAnOrderForCostsList(CLAIMANT) + .assistedOrderClaimantDefendantFirstDropdown(SUBJECT_DETAILED_ASSESSMENT) + .assistedOrderAssessmentSecondDropdownList1(STANDARD_BASIS) + .assistedOrderAssessmentSecondDropdownList2(CostEnums.NO) .build()) .publicFundingCostsProtection(YesOrNo.NO) .finalOrderAppealComplex(FinalOrderAppeal.builder() diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/GenerateDirectionOrderCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/GenerateDirectionOrderCallbackHandlerTest.java index ca123fb867f..9891b5f8586 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/GenerateDirectionOrderCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/GenerateDirectionOrderCallbackHandlerTest.java @@ -275,6 +275,18 @@ void shouldPopulateFields_whenIsCalledAfterSdo() { assertThat(response.getData()).extracting("assistedOrderMakeAnOrderForCosts") .extracting("makeAnOrderForCostsQOCSYesOrNo") .isEqualTo("No"); + assertThat(response.getData()).extracting("assistedOrderMakeAnOrderForCosts") + .extracting("makeAnOrderForCostsList") + .isEqualTo("CLAIMANT"); + assertThat(response.getData()).extracting("assistedOrderMakeAnOrderForCosts") + .extracting("assistedOrderClaimantDefendantFirstDropdown") + .isEqualTo("SUBJECT_DETAILED_ASSESSMENT"); + assertThat(response.getData()).extracting("assistedOrderMakeAnOrderForCosts") + .extracting("assistedOrderAssessmentSecondDropdownList1") + .isEqualTo("STANDARD_BASIS"); + assertThat(response.getData()).extracting("assistedOrderMakeAnOrderForCosts") + .extracting("assistedOrderAssessmentSecondDropdownList2") + .isEqualTo("NO"); assertThat(response.getData()).extracting("publicFundingCostsProtection") .isEqualTo("No"); assertThat(response.getData()).extracting("finalOrderAppealComplex") From c3af6666841de65a3310d3937abbdc039465d3af Mon Sep 17 00:00:00 2001 From: Deepthi Doppalapudi <107422736+deepthidoppalapudihmcts@users.noreply.github.com> Date: Tue, 14 Nov 2023 08:30:55 +0000 Subject: [PATCH 5/6] CIV-11205 Add new fields in GA to store court address and postcode (#3557) * CIV-11205 populated full address for after sdo scenarios * CIV-11205 update TriggerGenApp to update address * CIV-11205 Updated address during TriggerLocationUpdate Event * CIV-11205 Unit tests covered for location update * CIV-11205 updated templates with court full address * CIV-11205 Code smell corrected --- .../templates/CV-UNS-GAP-ENG-01067.docx | Bin 23905 -> 24221 bytes .../templates/CV-UNS-GAP-ENG-01068.docx | Bin 23663 -> 23801 bytes .../templates/CV-UNS-GAP-ENG-01069.docx | Bin 23669 -> 23492 bytes .../templates/CV-UNS-GAP-ENG-01073.docx | Bin 24133 -> 24314 bytes .../templates/CV-UNS-GAP-ENG-01075.docx | Bin 23180 -> 23120 bytes .../templates/CV-UNS-GAP-ENG-01076.docx | Bin 33657 -> 34163 bytes .../templates/CV-UNS-GAP-ENG-01078.docx | Bin 23432 -> 23270 bytes ...erGenAppLocationUpdateCallbackHandler.java | 4 +- .../genapplication/CaseLocationCivil.java | 2 + .../service/GenAppStateHelperService.java | 9 +- .../InitiateGeneralApplicationService.java | 18 ++++ ...nAppLocationUpdateCallbackHandlerTest.java | 8 +- .../service/GenAppStateHelperServiceTest.java | 39 +++++++- ...InitiateGeneralApplicationServiceTest.java | 90 +++++++++++++++++- 14 files changed, 160 insertions(+), 10 deletions(-) diff --git a/docker/docmosis/templates/CV-UNS-GAP-ENG-01067.docx b/docker/docmosis/templates/CV-UNS-GAP-ENG-01067.docx index 1016e0a18c4e8b1898fa37ba0f047f0dfe7187e2..bf518dcc5e41c904dac10e9e72ad59c63f7341b4 100644 GIT binary patch delta 8606 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 D^J{U0 delta 8306 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 L3(~0mzk>e-as$B+ diff --git a/docker/docmosis/templates/CV-UNS-GAP-ENG-01068.docx b/docker/docmosis/templates/CV-UNS-GAP-ENG-01068.docx index ca7751745025d2e5c61198098820dee8066e2b45..07e3a3b1e8c7687cfd69cbb16303146dd1f74521 100644 GIT binary patch delta 8385 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 delta 8238 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 diff --git a/docker/docmosis/templates/CV-UNS-GAP-ENG-01069.docx b/docker/docmosis/templates/CV-UNS-GAP-ENG-01069.docx index fe1a842c34ee4f3c4cc40586e506bec4acdb2fad..8a359232e14bb1a8b76346fc3e11be39adae6e12 100644 GIT binary patch delta 8971 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 LIvk_!e~SMHsuB?u delta 9100 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 MFyPnp{$ud}0DhTOLI3~& diff --git a/docker/docmosis/templates/CV-UNS-GAP-ENG-01073.docx b/docker/docmosis/templates/CV-UNS-GAP-ENG-01073.docx index e44df45adc1521e91b91cc02e27fbbe90742800e..75da4c61c2c89f9ea2091980a527a354e4feb9d3 100644 GIT binary patch delta 8401 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 diff --git a/docker/docmosis/templates/CV-UNS-GAP-ENG-01076.docx b/docker/docmosis/templates/CV-UNS-GAP-ENG-01076.docx index 9d6e2d9cb1d7caa3da3926d6b2ef70c0f6decb01..8c4163027d4dabdd48d09146d1d90c583bc2b0b7 100644 GIT binary patch delta 17188 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 XbX3)3mR1|4qT0z$t=eq!>p+440_KGH diff --git a/docker/docmosis/templates/CV-UNS-GAP-ENG-01078.docx b/docker/docmosis/templates/CV-UNS-GAP-ENG-01078.docx index 6ebdfc6bb623ce45e682e48e0bafe0f6e916bbb6..40d0ed386278f7fdc7de187b3c92eb0e0a9c1ee9 100644 GIT binary patch delta 7890 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

Kxp}o71%3N)k z&Det$DT6H>$@Q`SS)UO|$sBr3KlD4A#iPA9EIjth6Y~l*2z1!WC2>!N<{2Lpm&v?kt zgZ1RJOl1D^M9E9ZW%xiQ9u}IWG%gDdEOdBWT}`y8)04QViGg!Xb$emm$1raS<&4$P zpft<%2S@A9JkG=GoieBCIEm&+gGJWz>4>V;QcycZ|8Bq%dK7W1!NwFq9&^9KeZ7bp zlO6pngaml+*Fo_%FL%Y zj_~J<-mJ8K+~ZootD_w~^?toGZb#bVVpr454d=c0_UrX|Jv}+=XcLeoMTN2PLBK?j6}azD|FL;2a+dd~M~(AzRS z%fi6nGRi1mfmIZ1oXL|!Jg;XBf@8WT40~4Rc+rXAGx=eB!`WQ6|02zsdoQ*wc=u?z}k9??Tx&L;gD$p@FNPgn&TVfvPHIv zSmPq^-Bp?xnm>#5h3aw)rouc*^P*Mf(D%m|M;utrs|EAo|As5(3Y^ZmSsPSE%6&dc zy01zWvjpJrP`HVDk~!$qw%CrCokMtSB@ETRif`mQMmbf>qT$2V zx<{Z4YzFZLOe!2ET&ptU98jTY_*5-uFcUMMn;t(SqglAHjwlwWuQ)dN*hHjVF81JN z{%cyAI7tOp>I^Vfag>O)q=+~KH`v&6GRShHW0SHPxexNpnmUxX8OV7dqGJ@C%$pi7GEW|)Z*W6uXSZbWgT6{XvTs5@w}j}u zt;m-cWlj--1LI2j2!UVm(305T!rB@HRXRbc;4^RMUox;8{)TPrL)}T(3jb)E~+pty5NVNB16uqd#YEwxwg9 z9bfXpAPWYS(=*jNO9miX)cSS^3rj@(KD3mSSgvXv2O zeNP|C!^6vW>%TjyFJm+gTUwcnv(zl3YMLOyW-8pb&57B0%!TTUSfcB_eMfn)%obs% zPbsjl@@|M*gpR0xw2Es|*i-qaIw;Jv+#}q@JhjpzQq>z=%x zpUhHSjsp-x`m-57PEP%dq{+e__C2eMjmh?!F+{JFBSpPMQg$f})i_Lk_cl%f<9>U# zy_NG+^Er&e12AXYZP|>ZYYzcC+CZ0*KXXRL<9N2XCb|yi2%atldln-4N81yfvk7k zKtHwi8&c~F=6^wSScD%3SzcmDCm03h!I&sZ)fsMj@@naq=2N~!pt7;j4dNgg>{KYKTdf$# z8nu6ou)zMIo$E}XlOHHoaa2o@a9!XA};?nJaG}9eolXF>G(!ek!rhqrT|;aLZ>*hAZ|RVnVkC@ z@P-N7zKGA)L%=$ae4$kGU~_|8{Z1P5^rHiioNvxHx53_Ukh!OZJhCFH(a27S3ewALU+@;|0fsY)1yKs-9{`J4_ z0~9hV>1Ce}(7tmXzCrw@qMLRA+;@Zh zrdxN>e3z7Yq)92lWOERpjdW=UOreOvOP{DOF1brtm zw+~)zyJW?IKe8bHzKuB>br#?jIKO$*MAjVh$Za0@D@4h<+w%?m_7RMaQqif z# zlIqcs{Fll9=|cZ>?Eew}&DfwudZMt8_jqmS;y?Yr1^mxb=HWn~f4Tox;6RBCMPMnkp{v>?1Zs-#2>;P={*9n_Adr&I He^&noH@Fm# delta 8013 zcmY+JWl$YVv#o*P?gV$=xJz(%2<{#>?hYHb;2S5ndvFQv?(R--cf0TVovQELGry*) zYo=CJKh?9Q`>+u*q8akH7#w1WZOaP^Is}AN8CU`CD@b3@VT~8p-^lngco9j#C?g~P zB3l-&j@d5ImdEN3$8t$f0#HwHgKR{0-Sp#?L=8{C9dpeYz*qLAKcDXA>PlaTL~ZEf z{BeyHy&9PD?Bu$MwUwJKLdin%JhR{an8R|BzKK=$OM()!ALHBQ1aR^7{e0{5VQs<~ z+owKW3e*Zgm2c|^_B`qUX43}y3*Q!VQmtf8KhE<09C{{XL4CdUJo9M)VU-jJNm1+; zQN?`Auwc!W%(qFrmvi1ccb}J{Zw;J`&Ru^jrkXfD4+?AHz$kLKyLS_7fh12O$6b<@ z6#%QfMptl&Ia7*tFAz`{;TQSPlyDb>EYSleKyi{teAJXgGV7=lDYKpE#2 zMcViH!Y#`Yd~_w53!~@2oT)$>HAeRSxK6HZc<%*lF<=7+Ocm)MC4o#ql$`HoX3Nny^?Eq_yIz zU@6-9v7e~X${^OXaaxaYTanwYUu?1CB7_!j-opjC{n=Z5#|$H1lktfV2O*7IXd=ax zL(6(F!&FA-8zCi$<@$L`E`x5W?2kvgAc7&0QR(;4ah68iUtqEFGx+NwCi~c4kb=mN zSADjYQ}&QaeP@|)Iycc`oXE=^=v^r5(`vT0i{_?cJ7|0lKT|p{vlb+echV8D=dd6m z!_7BQn`8N0@>QLoZY?0m<7c=g(YRPsYH79>PP;627iq73e&=gJ3l<*o;^2@%3=XX$ z3;`4mRV9IQ&vuqIKI2oiHNezOw3Q;Qq&Kl^x#$&uavrvaUr+@vqP)nK} zmseI?JfAF|>)6Z(2U8dsR^)OB4oYumZ*fZcF`ZDbXYGC)D=+xp4zu)zG*f0%dUbvS}c|k(G%(`T|MJ>0KS3anf zmE*`ToZDOjf$Fl9#h!;0^Z%+Vcx-TU`u$BCHfTgq#YdG){SL{faQ300`E)SMcOZ#q zyeeL6lWSo0%oxeO;o7Bo$>A-(2-nmZp}CiFGD-T0t&5Xgtf3{uE0-A$)YIkEBO#03 z;PCKT>-#uvXd5sss_&=ehZPoRshUCirPSZ2A^216RI9uRYOE2>dC?gmnVGc%P^mSX z!-O%4g%P6UW6wrGcFQxwn@@{&l$|y8;d7o0R04@Bp64}* zaU9s_!oIlfR|$mYh7ceCZU;v9N|BZRlyS*-+z^8$oIiXPqSa+&`*q-oIr^~|>)H*m zj=e+q@D99L<;Z;Pt0QL^wf_7;Pp~{~)RHOW&*<^f(AXMGIB+9f6t>aM~!9 zp$Rl)zbfdCD`mZ@e;ecTksp%lYjagiO>_2s>$ne)*yL17hn1|1tYhH#VS@H|_$Ug8 z`1^eAN!>Gu`pY!8JfS(he|hy^_+ii6w(*t_?mf19=MpRYtGqOCA1JVX46o?{?8LgsFJ+j*LC1*WXNE|e?TA)Sy2FP%8bs~5 zL7teOH&c4IS|29$AO5|V@z4(xTvV->31n$VSOhbmr2T`}S@UhbcK_5w^AjI?M19tg z#2)jqLyCt^3k_JUVCY})%Z7<-SFrGmJVm_Bs z#=0rDfv52=LDJ;mxV;E=k?ghxxVtJ{VgTOkXPH&ZSVgz8zA${6qmGUY94jkKbx*Q7 zv&%NY0w~s?!bTK`e^JtvY{9HjimWEOXk7?%R=RNFarp5S)j4`dh z1=QN1P4X-=y8+_dUcksk^%Q=2^{)YcHiSW&loHOz;!57IXFn(brk8oN7FOKbA0GHa zlI$(SCFFmg2z!|x@4fh}$f08iVA<6>Bx3SG`p7D7O0xiv^qz__Ogyb)_knD6;8H$t zq0qeeYc}3aPO~=q)4^-+8e-Z$nQj5?m-*xa=dBhDsBhA9Jm)e?dxO?}*_|cGFBJ<) zYDv~Q)w*ZsCUr;h$CMs(KeQ3mRgUtnCJCKYaT`dGvEsQo!<*JL&h8b&mLBedYD+0V zie`~NO46P%SlU=9SXiw!*$Xo-cevj( zF4iScdwuO5;O90kxOVy#sZj`Eh9tbw4zj@i)ap_!aLd7liOO?tu+zj?SrZ^od^lJ!sZ^*8cLf%Nthh zwW4v|%J!6kn|}?h{kO=iDBBowiUojMNsuozBrZIpn%mXR?&$k`2|R)Z1|>`dC9*O0_Q_#L;cQe8HT*LQlt&=0x^9dJH;S1;)XmfA^zjJHab`8nKVDiy^+jI< zz@-~>^gQXH`c6+LUa4Ffjqh+$U{9pFo?iVP|W)_zOa&kDmm@fQ#3gz2BToET7Rb(Xg?-;e! zWDCdp-Lkb*8nwx=Yb|r2*z*Q6z3j1Sfu_bGa8ii0&`^zVh_%Hsrw(_f*$T-Hj%A!` z!{b{NuvyJ#+r#3pk!;2qRbX)$0rMdDk?#@c$rp~0?t5p#E4zur zGbO&z@5zbtOR)X3c)BZTU&GQ&0$ppmD=;UD@$8`sP5dGADN;?-0K6tSOk_wERePE2tinFN71?6svA#_%}h6S82uizLQQ(al+Y2T22+=)`JsFlQm-RRt%&*gU@q-yY!6wuM?>eZ45qXKU3)${Psb zs+@)p^lDYL5012wf8y}tw+0@B?{5-G4E zqPM==-^raU2I|Ow-a}&iF*Ho`)cFFyogYpMOQQ$mDAG(z*RNfpHoje&S?P6l>QZ=b zYvt2EuVep8s9Itku5-%hgq)vjRcDxmgFnnHiUP-|K+G*16Yd2h^#OphGXa)v6!`U5 ztuJSlD$NQjb$-PS9BJB3?&wG;rE7uUM61kB+5yK=`u%-5W0~N&=pp%cEBU8J4v^!Y z{JBwwJA-$rvx_;do{2lQrWgYuA{7IxmEF@Y9Cbs(GL^C@P1Wb{>2x2N;{m@p^RIPm zAb7BvdTfu_$GD7HYVdFoLHO}$dG)gJwE7TyN|M+zB>e6koyKi~I4mD^RMj2O5WU=& z1UWI{QoNX`eOddS=)i1r5rA)}13IkGb08bi`0Z-IHN&hkNp37#mO`VTSZTIx|EzLI zcj%>=FUZK}z<}_{f`iX5Q~5hQ-Ywb4BVdSCJ!D78Xpsnk#EQS0+x$LM;D)sz1AVe! zHbX#jW-O2<@zV8zLMlK)rGiy&P4Qe=_;h?0UcQQFslanXG#L{14dgC@!t>AK4g2Oa5^_^Y2e8de-X3{cU!uyD9Ps0b-m!W;vnS( zZ}aDu`c>RSD43s1$(7k)Cwx-SntcH)df27bs)xvW39K_fPOVJT;NHIRTqwZimoW~h zxd6G>D=`-8N@5lK!eMV9+wJqCr={_;<9@40?kX$2roSiN6A6w)vBH_=$K_JVOz&g# z0L4Hnw(CJo={4!%Ru|JxPsSpgS+zY#@w65d^MfCYDYIxvOySLfopzP~mV(kPj~XT;5AP-uM^{%pA+ z<@!+a_I;@NAVAA_)Wc2rBYkJ(VrFBsLF@kGQ6lkMNpFg(c*Y^RG`+&0`W*3-3W0(p z*Z!3b1gc<74x{>V{rtzmYT_+hL$}aPMg88h&ht?}>tCk~)EUn^P{P$?Mk6LF{yMWD z9VcE7iVt@V0lFImhnP<%zlx$YBdGB|&g@(&y$u4gtitTbeoIkb;Bx{*seI}hM zvDUtC?EpTvV!i-HhvIxgPu7!U^!$ZQ=#}_bhc)obrs1fG8u#LKA68RCB~{YClje}R z50Rgm_WD*yCT7bSqyl}gBO2y&fY5@0Iq;sGdZ)d*q2p6M^mO`jilHXrTo$rdC6ud4 z?bX;Bfgf=U4u@CSl;;t7@Cx|WB3m43q`OmOk>zIi{)^Ffuc%AYA3a1CnG)`8TM}MMU4m9nBbtOW zU9+AP9iULj1UvtC`*&ST>u5cPm;p#am7U>QQl^C#$4L_2K&rmgS+g+_5AotF4Cc06 zD~RE9RxyM5C;NG1Zw=yUbM${;jW6z#(cOHXU@D*C`97GYR!xPlRd({?I0#@!>Q@6U=jZI3@L(D{yTDq7}7{ zRE81R!)$lozO;(vWfwivET;U5%Y%7HFv=pHni_S$QeEET{FZj#h>Pq5!ZPH+S7$z2av-3v%6`h^+gSPGFXaIjZ9?t&|HbsrznK2@`yWhw zC_0q?i>XWKmBD{7b!kZb2h)$eeboQKREYMFt8dgzPH8taE1sb1Kq&#l7}ss#sgfN) zYLNdV?N@>IL0@IH*1T{M;vuGoEf1NK*xapc-+?fj?_Xq{mAxH$OhsGR4Ph(Q^lBMP_bV z=xa&@$lE-Hjt)?HB8+BGn<4D!Y(Vh=%1v235gV6(bYwG85$b5TFos$?w4dez!wi)l zD`ViIbj0PP_%`5ym~#_hNuEzdOw00b4>b5pk0|z`H@rVu!oFIKc@*wtR6VP5LwIED z@AzbTT3J_l{KjQjz6h*4F~3f{Dij^EisTFbVr@-K29zGU;K&DGGG2YNRRyUAwl=C% z+zxjvVJuIGv}2jF^Mo|G3Z;{`%-6V8l#HOX#X;u8{P|S4L-VNXX`*6P5BsqLsfUa#nYnydSPZj?~J5%*e0Ryw#e1;UE|=E?4}^&uTAu zMgT|SkNpEK3KVs2fP+lN3`QtkU;^US2&GY^SqzfQVU+K{Skp_(Q4mDINtQ51&m&ZK z)!iF@)ZNAM4isf=xY?`Zq`Cz**RefwW9;H+%VZ)1(MaSOMh)Wn%Q}bK#KQdt#PtdXe9?(d%3~me1UJS|xxRBs+$c9QwerjZCn~E z#db&FIuLfjtU7oc<=474Tsj_A8UFK@USiQhFPl`BMRf@6(drAiG8z@;(Bh_(^+z7KX&xKJv_I7vzDm-z-Fapzn&B5{S%wZ zMrwLr6Lr_6tk&`o0m#)k$a=o*V%}(EoGWTAVvs{q4S&hru6p`{TYEk% zV8vR1ZJ82B%gp!1;Z>az-tnH(9h9Tt?HKhhyEsX}Gqg}0 zd;OUkSbNOMm;6z`E#-}m51s6cq|gkg?e(s0R>dIRYFLF#?~Y?0LXxO;gj<~i-W@=Y zlz=?ZR!(TFotG;1VJPXlfWF#0X<+jwWIf(D1x$p{sI=5bNC=4MdRt{mNKo9|zpuT_ zTlnzfyb}X1w_N>f&;wL*d=q@X-R~cIb5G(AuJzB4yt0{?4ZGZ=mx2UcdoLFQ4J#aB zrCA%SwG7%}n*2rQ{(YV2BsXY)pU|43rvQ8HxP%QZhpqWpty!2if?q=-1ZF8R+?ulv z%YnmMzoflHzBnagb93eBgIGoAQG6~$NlfC}0a1kZ@gk6rqyeotk!R8B&QdSmt)v4I ziS#(F=$&gZ-^!_xX*&5?-9OX_6g!5ric$|N{Ug0`-3^*g77IAfS)Ss~Q-`k0TAPBk zFm=8&>Le87W@Z@mVGqpJY|#N3revcmM9AZ`D!u+&j~ z|7tOvJ&R9!mmfdRB(YljM+m6?=y!_`Mcg20spkQKbe+UZ)E&JID(rLZ{_)K>p;$jI zk*{VdOxY)YG*NZI{IuxS@BMo2B9O~MHO1>%2(MXyoWV&CXJE=?Vc-qNYLf6Rr)4s9 z_-De?g{5pe1Wj{F4pHOtmwy{FUm#TEzd&O{z(T{t zNe#rC{x#A2(r-7Fp+MVfE*r02u(A}_M5wjmU9NnYFh7SS+czO^6NM^1KUuxvt62wC z<=oix%H>nqX#mi{05>#pPVQz9v(*t^KV#Vj-+oOT)Q%5{v2m9fso{+~38;$ZkkcFG zWNu)`_$MD3QjG0xC#{m1Px&A~4PPf!1J@#+Kc;!XZn-=uPF2>)`@qo2Us+|5&?+AG zyr-2M&h8Qjb!OS`$G8J^g-`v)jE`Rjh@RlLM?(3d4lti0j9ubI%OxhTv<{#=2X`tS zr5Mvot9HXRdnA_%cm1z)?~VeGs6{?JO0$ENq(!-%5w{wPUReU;0-`}Mt!T5Ph8v2= z?s5d{(_@m9iW1unkS*dX%5IEqmo@Sgs2a|B5ie*HZaq;(?50~aT&L#Kvozc(G3MQa zL)a2UVDj@wG**_e+Rih@*zI;lvS7I0ql+-YT|aRL`OCDdBTG26f`xIVi!;|D;c~(y zZ(v!Muh{(d)^(58MU$ja%o0g9Tz#4FvFox|nH7!J7|ZipJ@Oe{6c>tX#t3$RfVU`X zhfr3dPo*-~C+$m&H__*Jwyx~tI}}FOs2K_c;rJ({dVGxz$p3$kysfDW<%kDn(_$w4 z&mR#A0zwoC0s`}&?Emk&0DEgu6B7Pw&HsrD{1eCc-{3#Hc5s`P5L5&y_(e+)iiQHr zt1SrG2X@o`24zAEzNEnek7+YNDY1bcwP}g|{Lq+)CqVbQ6|9kiz%%e*M^B-Kn#=1C=jbL}(Z%{oN SU;zz6@U$*E?1kpPlK&sC8F#7x diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/caseevents/TriggerGenAppLocationUpdateCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/caseevents/TriggerGenAppLocationUpdateCallbackHandler.java index 6b392415a0c..6a7c730596d 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/caseevents/TriggerGenAppLocationUpdateCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/caseevents/TriggerGenAppLocationUpdateCallbackHandler.java @@ -16,6 +16,7 @@ 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.TRIGGER_LOCATION_UPDATE; import static uk.gov.hmcts.reform.civil.callback.CaseEvent.TRIGGER_UPDATE_GA_LOCATION; @@ -44,9 +45,10 @@ public List handledEvents() { private CallbackResponse triggerGaEvent(CallbackParams callbackParams) { CaseData caseData = callbackParams.getCaseData(); + String authToken = callbackParams.getParams().get(BEARER_TOKEN).toString(); try { if (caseData.getGeneralApplications() != null && !caseData.getGeneralApplications().isEmpty()) { - caseData = helperService.updateApplicationLocationDetailsInClaim(caseData); + caseData = helperService.updateApplicationLocationDetailsInClaim(caseData, authToken); helperService.triggerEvent(caseData, TRIGGER_LOCATION_UPDATE); } } catch (Exception e) { diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/genapplication/CaseLocationCivil.java b/src/main/java/uk/gov/hmcts/reform/civil/model/genapplication/CaseLocationCivil.java index edc224ba820..20bc4d13f5a 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/genapplication/CaseLocationCivil.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/genapplication/CaseLocationCivil.java @@ -14,4 +14,6 @@ public class CaseLocationCivil { private String region; private String siteName; private String baseLocation; + private String address; + private String postcode; } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/GenAppStateHelperService.java b/src/main/java/uk/gov/hmcts/reform/civil/service/GenAppStateHelperService.java index 2569a7ad87b..f0d0abaf206 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/GenAppStateHelperService.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/GenAppStateHelperService.java @@ -14,6 +14,7 @@ import uk.gov.hmcts.reform.civil.model.genapplication.GADetailsRespondentSol; import uk.gov.hmcts.reform.civil.model.genapplication.GeneralApplication; import uk.gov.hmcts.reform.civil.model.genapplication.GeneralApplicationsDetails; +import uk.gov.hmcts.reform.civil.referencedata.model.LocationRefData; import java.util.ArrayList; import java.util.HashMap; @@ -31,6 +32,7 @@ public class GenAppStateHelperService { private final CoreCaseDataService coreCaseDataService; private final CaseDetailsConverter caseDetailsConverter; + private final InitiateGeneralApplicationService genAppService; private final ObjectMapper objectMapper; @@ -69,16 +71,19 @@ public boolean triggerEvent(CaseData caseData, CaseEvent event) { return true; } - public CaseData updateApplicationLocationDetailsInClaim(CaseData caseData) { + public CaseData updateApplicationLocationDetailsInClaim(CaseData caseData, String authToken) { if (!Collections.isEmpty(caseData.getGeneralApplications())) { List genApps = new ArrayList<>(); CaseData finalCaseData = caseData; + LocationRefData locationDetails = genAppService.getWorkAllocationLocationDetails(finalCaseData.getCaseManagementLocation().getBaseLocation(), authToken); caseData.getGeneralApplications().forEach(generalApplicationElement -> { GeneralApplication generalApplication = generalApplicationElement.getValue(); generalApplication.getCaseManagementLocation().setBaseLocation(finalCaseData.getCaseManagementLocation().getBaseLocation()); generalApplication.getCaseManagementLocation().setRegion(finalCaseData.getCaseManagementLocation().getRegion()); - generalApplication.getCaseManagementLocation().setSiteName(finalCaseData.getLocationName()); + generalApplication.getCaseManagementLocation().setSiteName(locationDetails.getSiteName()); + generalApplication.getCaseManagementLocation().setAddress(locationDetails.getCourtAddress()); + generalApplication.getCaseManagementLocation().setPostcode(locationDetails.getPostcode()); Map genAppMap = generalApplication.toMap(objectMapper); genAppMap.put("isCcmccLocation", YesOrNo.NO); generalApplication = objectMapper.convertValue(genAppMap, GeneralApplication.class); diff --git a/src/main/java/uk/gov/hmcts/reform/civil/service/InitiateGeneralApplicationService.java b/src/main/java/uk/gov/hmcts/reform/civil/service/InitiateGeneralApplicationService.java index a6191151527..f70a80f9ad5 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/service/InitiateGeneralApplicationService.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/service/InitiateGeneralApplicationService.java @@ -179,6 +179,13 @@ private GeneralApplication buildApplication(CaseData.CaseDataBuilder dataBuilder Pair caseLocation = getWorkAllocationLocation(caseData, authToken); //Setting Work Allocation location and location name + if (Objects.isNull(caseLocation.getLeft().getSiteName()) + && Objects.nonNull(caseLocation.getLeft().getBaseLocation())) { + LocationRefData locationDetails = getWorkAllocationLocationDetails(caseLocation.getLeft().getBaseLocation(), authToken); + caseLocation.getLeft().setSiteName(locationDetails.getSiteName()); + caseLocation.getLeft().setAddress(locationDetails.getCourtAddress()); + caseLocation.getLeft().setPostcode(locationDetails.getPostcode()); + } applicationBuilder.caseManagementLocation(caseLocation.getLeft()); applicationBuilder.isCcmccLocation(caseLocation.getRight() ? YES : NO); applicationBuilder.locationName(hasSDOBeenMade(caseData.getCcdState()) @@ -343,6 +350,8 @@ public Pair getWorkAllocationLocation(CaseData caseD .region(ccmccLocation.getRegionId()) .baseLocation(ccmccLocation.getEpimmsId()) .siteName(ccmccLocation.getSiteName()) + .address(ccmccLocation.getCourtAddress()) + .postcode(ccmccLocation.getPostcode()) .build(); return Pair.of(courtLocation, true); } @@ -369,6 +378,15 @@ private CaseLocationCivil getClaimant1PreferredLocation(CaseData caseData) { .build(); } + public LocationRefData getWorkAllocationLocationDetails(String baseLocation, String authToken) { + List locationDetails = locationRefDataService.getCourtLocationsByEpimmsId(authToken, baseLocation); + if (locationDetails != null && !locationDetails.isEmpty()) { + return locationDetails.get(0); + } else { + return LocationRefData.builder().build(); + } + } + private boolean isDefendant1RespondedFirst(CaseData caseData) { return caseData.getRespondent2ResponseDate() == null || (caseData.getRespondent1ResponseDate() != null diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/caseevents/TriggerGenAppLocationUpdateCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/caseevents/TriggerGenAppLocationUpdateCallbackHandlerTest.java index e82e3a302b3..53cd99df257 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/caseevents/TriggerGenAppLocationUpdateCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/camunda/caseevents/TriggerGenAppLocationUpdateCallbackHandlerTest.java @@ -46,6 +46,8 @@ class TriggerGenAppLocationUpdateCallbackHandlerTest extends BaseCallbackHandler @MockBean private GenAppStateHelperService helperService; + private static final String authToken = "Bearer TestAuthToken"; + @Test void handleEventsReturnsTheExpectedCallbackEvent() { assertThat(handler.handledEvents()).contains(TRIGGER_UPDATE_GA_LOCATION); @@ -60,12 +62,12 @@ void shouldTriggerGeneralApplicationEvent_whenCaseHasGeneralApplication() { true, true, getOriginalStatusOfGeneralApplication() ); - when(helperService.updateApplicationLocationDetailsInClaim(caseData)).thenReturn(caseData); + when(helperService.updateApplicationLocationDetailsInClaim(any(), any())).thenReturn(caseData); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); assertThat(response.getErrors()).isNull(); - verify(helperService, times(1)).updateApplicationLocationDetailsInClaim(caseData); + verify(helperService, times(1)).updateApplicationLocationDetailsInClaim(any(), any()); verify(helperService, times(1)).triggerEvent(caseData, TRIGGER_LOCATION_UPDATE); verify(helperService, times(1)).triggerEvent(caseData, TRIGGER_LOCATION_UPDATE); verifyNoMoreInteractions(helperService); @@ -93,7 +95,7 @@ void triggerGeneralApplicationEventThrowsException_HandleFailure() { ); String expectedErrorMessage = "Could not trigger event to update location on application under case: " + caseData.getCcdCaseReference(); - when(helperService.updateApplicationLocationDetailsInClaim(caseData)).thenReturn(caseData); + when(helperService.updateApplicationLocationDetailsInClaim(any(), any())).thenReturn(caseData); when(helperService.triggerEvent(any(CaseData.class), eq(TRIGGER_LOCATION_UPDATE))) .thenThrow(new RuntimeException()); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); diff --git a/src/test/java/uk/gov/hmcts/reform/civil/service/GenAppStateHelperServiceTest.java b/src/test/java/uk/gov/hmcts/reform/civil/service/GenAppStateHelperServiceTest.java index 6aa26270c72..f6626efde69 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/service/GenAppStateHelperServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/service/GenAppStateHelperServiceTest.java @@ -18,14 +18,19 @@ import uk.gov.hmcts.reform.civil.model.genapplication.CaseLocationCivil; import uk.gov.hmcts.reform.civil.model.genapplication.GADetailsRespondentSol; import uk.gov.hmcts.reform.civil.model.genapplication.GeneralApplicationsDetails; +import uk.gov.hmcts.reform.civil.referencedata.LocationRefDataService; +import uk.gov.hmcts.reform.civil.referencedata.model.LocationRefData; import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; import uk.gov.hmcts.reform.civil.sampledata.GeneralApplicationDetailsBuilder; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; @@ -50,13 +55,19 @@ class GenAppStateHelperServiceTest { @MockBean private CoreCaseDataService coreCaseDataService; + @MockBean + private InitiateGeneralApplicationService genAppService; @Autowired private CaseDetailsConverter caseDetailsConverter; + @MockBean + private LocationRefDataService locationRefDataService; + private static final String APPLICATION_CLOSED_TEXT = "Application Closed"; private static final String APPLICATION_OFFLINE_TEXT = "Proceeds In Heritage"; private static final String SET_DATE = "2022-08-31T22:50:11.2509019"; + private static final String authToken = "Bearer TestAuthToken"; @Nested class StatusChangeInApplicationDetailsInClaim { @@ -393,6 +404,10 @@ private CaseDetails getCaseDetails( @Test void updateApplicationLocationDetailsLists() { + when(locationRefDataService.getCourtLocationsByEpimmsId(any(), any())) + .thenReturn(getSampleCourLocationsRefObject()); + when(genAppService.getWorkAllocationLocationDetails(any(), any())) + .thenReturn(getSampleCourLocationsRefObject1()); CaseData caseData = GeneralApplicationDetailsBuilder.builder() .getTestCaseDataWithDetails(CaseData.builder().build(), true, @@ -404,8 +419,10 @@ void updateApplicationLocationDetailsLists() { Pair caseLocation = Pair.of(CaseLocationCivil.builder() .region("2") .baseLocation("00000").siteName("locationOfRegion2") + .address("Prince William House, Peel Cross Road, Salford") + .postcode("M5 4RR") .build(), false); - CaseData updatedData = service.updateApplicationLocationDetailsInClaim(caseData); + CaseData updatedData = service.updateApplicationLocationDetailsInClaim(caseData, authToken); assertThat(getGADetailsFromUpdatedCaseData(updatedData, "1234")).isNotNull(); assertThat(updatedData.getGeneralApplications().get(0).getValue().getCaseManagementLocation()).isEqualTo(caseLocation.getLeft()); @@ -416,6 +433,23 @@ void updateApplicationLocationDetailsLists() { assertThat(updatedData.getGeneralApplications().get(2).getValue().getIsCcmccLocation()).isEqualTo(YesOrNo.NO); } + protected List getSampleCourLocationsRefObject() { + return new ArrayList<>(List.of( + LocationRefData.builder() + .epimmsId("00000").siteName("locationOfRegion2").courtAddress("Prince William House, Peel Cross Road, Salford") + .postcode("M5 4RR") + .courtLocationCode("court1").build() + )); + } + + protected LocationRefData getSampleCourLocationsRefObject1() { + return + LocationRefData.builder() + .epimmsId("00000").siteName("locationOfRegion2").courtAddress("Prince William House, Peel Cross Road, Salford") + .postcode("M5 4RR") + .courtLocationCode("court1").build(); + } + @Test void noLocationUpdatesToCaseDataIfThereAreNoGeneralApplications() { setupForApplicationOffline(); @@ -427,8 +461,7 @@ void noLocationUpdatesToCaseDataIfThereAreNoGeneralApplications() { Map.of() ); - CaseData response = service.updateApplicationLocationDetailsInClaim( - caseData); + CaseData response = service.updateApplicationLocationDetailsInClaim(caseData, authToken); CaseData updatedData = mapper.convertValue(response, CaseData.class); diff --git a/src/test/java/uk/gov/hmcts/reform/civil/service/InitiateGeneralApplicationServiceTest.java b/src/test/java/uk/gov/hmcts/reform/civil/service/InitiateGeneralApplicationServiceTest.java index 3eabd89f790..c4e659ce307 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/service/InitiateGeneralApplicationServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/service/InitiateGeneralApplicationServiceTest.java @@ -901,7 +901,8 @@ void shouldPopulateApplicantDetails() { CaseData caseData = GeneralApplicationDetailsBuilder.builder() .getTestCaseDataForConsentUnconsentCheck(GARespondentOrderAgreement.builder().hasAgreed(NO).build()); when(locationRefDataService.getCcmccLocation(any())) - .thenReturn(LocationRefData.builder().regionId("9").epimmsId("574546").siteName("CCMCC").build()); + .thenReturn(LocationRefData.builder().regionId("9").epimmsId("574546").siteName("CCMCC") + .courtAddress("Prince William House, Peel Cross Road, Salford").postcode("M5 4RR").build()); CaseData result = service.buildCaseData(caseData.toBuilder(), caseData, UserDetails.builder() .email(APPLICANT_EMAIL_ID_CONSTANT).id(STRING_NUM_CONSTANT).build(), CallbackParams.builder().toString()); @@ -914,11 +915,98 @@ void shouldPopulateApplicantDetails() { assertThat(result.getGeneralApplications().get(0).getValue().getLocationName()) .isEqualTo("CCMCC"); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getAddress()) + .isEqualTo("Prince William House, Peel Cross Road, Salford"); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getPostcode()) + .isEqualTo("M5 4RR"); assertThat(result.getGeneralApplications().get(0).getValue().getGeneralAppRespondentSolicitors() .stream().filter(e -> STRING_NUM_CONSTANT.equals(e.getValue().getId())).count()).isEqualTo(0); } + @Test + void shouldPopulateLocationDetailsForBaseLocation() { + when(locationRefDataService.getCourtLocationsByEpimmsId(any(), any())).thenReturn(getSampleCourLocationsRefObject()); + CaseData caseData = GeneralApplicationDetailsBuilder.builder() + .getCaseDataForWorkAllocation(null, null, INDIVIDUAL, applicant1DQ, respondent1DQ, + respondent2DQ); + CaseData result = service.buildCaseData(caseData.toBuilder(), caseData, UserDetails.builder() + .email(APPLICANT_EMAIL_ID_CONSTANT).build(), CallbackParams.builder().toString()); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getBaseLocation()) + .isEqualTo("11111"); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getSiteName()) + .isEqualTo("locationOfRegion2"); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getAddress()) + .isEqualTo("Prince William House, Peel Cross Road, Salford"); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getPostcode()) + .isEqualTo("M5 4RR"); + } + + protected List getSampleCourLocationsRefObject() { + return new ArrayList<>(List.of( + LocationRefData.builder() + .epimmsId("11111").siteName("locationOfRegion2").courtAddress("Prince William House, Peel Cross Road, Salford") + .postcode("M5 4RR") + .courtLocationCode("court1").build() + )); + } + + protected List getEmptyCourLocationsRefObject() { + return new ArrayList<>(List.of( + LocationRefData.builder().build() + )); + } + + protected List getSampleCourtLocationsRefObjectMultipleValues() { + return new ArrayList<>(List.of( + LocationRefData.builder() + .epimmsId("11111").siteName("locationOfRegion2").courtAddress("Prince William House, Peel Cross Road, Salford") + .postcode("M5 4RR") + .courtLocationCode("court1").build(), + + LocationRefData.builder() + .epimmsId("11111").siteName("locationOfRegion2").courtAddress("Prince William House, Peel Cross Road, Salford") + .postcode("M5 4RR") + .courtLocationCode("court1").build() + )); + } + + @Test + void shouldPopulateLocationDetailsForBaseLocationWhereListIsEmpty() { + when(locationRefDataService.getCourtLocationsByEpimmsId(any(), any())).thenReturn(getEmptyCourLocationsRefObject()); + CaseData caseData = GeneralApplicationDetailsBuilder.builder() + .getCaseDataForWorkAllocation(null, null, INDIVIDUAL, applicant1DQ, respondent1DQ, + respondent2DQ); + CaseData result = service.buildCaseData(caseData.toBuilder(), caseData, UserDetails.builder() + .email(APPLICANT_EMAIL_ID_CONSTANT).build(), CallbackParams.builder().toString()); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getBaseLocation()) + .isEqualTo("11111"); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getSiteName()) + .isNull(); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getAddress()) + .isNull(); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getPostcode()) + .isNull(); + } + + @Test + void shouldPopulateLocationDetailsForBaseLocationWithMultipleListValues() { + when(locationRefDataService.getCourtLocationsByEpimmsId(any(), any())).thenReturn(getSampleCourtLocationsRefObjectMultipleValues()); + CaseData caseData = GeneralApplicationDetailsBuilder.builder() + .getCaseDataForWorkAllocation(null, null, INDIVIDUAL, applicant1DQ, respondent1DQ, + respondent2DQ); + CaseData result = service.buildCaseData(caseData.toBuilder(), caseData, UserDetails.builder() + .email(APPLICANT_EMAIL_ID_CONSTANT).build(), CallbackParams.builder().toString()); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getBaseLocation()) + .isEqualTo("11111"); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getSiteName()) + .isEqualTo("locationOfRegion2"); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getAddress()) + .isEqualTo("Prince William House, Peel Cross Road, Salford"); + assertThat(result.getGeneralApplications().get(0).getValue().getCaseManagementLocation().getPostcode()) + .isEqualTo("M5 4RR"); + } + @Test void shouldPopulateWorkAllocationLocationOnAboutToSubmit_beforeSDOHasBeenMade() { when(locationRefDataService.getCcmccLocation(any())) From f8969cd124e507a5239387c1625d8bf051de2914 Mon Sep 17 00:00:00 2001 From: UshaPanneerselvam1 <122611188+UshaPanneerselvam1@users.noreply.github.com> Date: Tue, 14 Nov 2023 10:09:11 +0000 Subject: [PATCH 6/6] CIV-8923 specAoSApplicantCorrespondenceAddressdetails is being updated when defendant updates address (#3547) * CIV-8923 specAoSApplicantCorrespondenceAddressdetails is being updated when defendant updates address --------- Co-authored-by: TortolaNavarroD Co-authored-by: asthamalviya <104994907+asthamalviya@users.noreply.github.com> Co-authored-by: kdaHMCTS <128375235+kdaHMCTS@users.noreply.github.com> Co-authored-by: dtortolaV1 <93722198+dtortolaV1@users.noreply.github.com> --- .../RespondToClaimSpecCallbackHandler.java | 90 +- .../reform/civil/model/CaseDataParent.java | 17 + .../civil/utils/UnavailabilityDatesUtils.java | 2 +- ...RespondToClaimSpecCallbackHandlerTest.java | 1378 ++++++++++++----- 4 files changed, 1024 insertions(+), 463 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandler.java b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandler.java index 5640b94350a..701d9c1c912 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandler.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandler.java @@ -184,7 +184,7 @@ protected Map callbacks() { .put(callbackKey(MID, "upload"), this::emptyCallbackResponse) .put(callbackKey(MID, "statement-of-truth"), this::resetStatementOfTruth) .put(callbackKey(MID, "validate-payment-date"), this::validateRespondentPaymentDate) - .put(callbackKey(MID, "specCorrespondenceAddress"), this::validateCorrespondenceApplicantAddress) + .put(callbackKey(MID, "specCorrespondenceAddress"), this::validateCorrespondenceAddress) .put(callbackKey(MID, "determineLoggedInSolicitor"), this::determineLoggedInSolicitor) .put(callbackKey(MID, "track"), this::handleDefendAllClaim) .put(callbackKey(MID, "specHandleResponseType"), this::handleRespondentResponseTypeForSpec) @@ -1060,12 +1060,26 @@ private AllocatedTrack getAllocatedTrack(CaseData caseData) { ); } - private CallbackResponse validateCorrespondenceApplicantAddress(CallbackParams callbackParams) { - if (SpecJourneyConstantLRSpec.DEFENDANT_RESPONSE_SPEC.equals(callbackParams.getRequest().getEventId())) { - return validateCorrespondenceApplicantAddress(callbackParams, postcodeValidator); + private CallbackResponse validateCorrespondenceAddress(CallbackParams callbackParams) { + CaseData caseData = callbackParams.getCaseData(); + if (caseData.getIsRespondent1() == YES + && caseData.getRespondentSolicitor1ServiceAddressRequired() == NO) { + List errors = postcodeValidator.validate( + caseData.getRespondentSolicitor1ServiceAddress().getPostCode()); + + return AboutToStartOrSubmitCallbackResponse.builder() + .errors(errors) + .build(); + } else if (caseData.getIsRespondent2() == YES + && caseData.getRespondentSolicitor2ServiceAddressRequired() == NO) { + List errors = postcodeValidator.validate( + caseData.getRespondentSolicitor2ServiceAddress().getPostCode()); + + return AboutToStartOrSubmitCallbackResponse.builder() + .errors(errors) + .build(); } - return AboutToStartOrSubmitCallbackResponse.builder() - .build(); + return AboutToStartOrSubmitCallbackResponse.builder().build(); } private CallbackResponse determineLoggedInSolicitor(CallbackParams callbackParams) { @@ -1118,6 +1132,10 @@ private CallbackResponse populateRespondent1Copy(CallbackParams callbackParams) .respondent1Copy(caseData.getRespondent1()) .respondent1ClaimResponseTestForSpec(caseData.getRespondent1ClaimResponseTypeForSpec()) .respondent2ClaimResponseTestForSpec(caseData.getRespondent2ClaimResponseTypeForSpec()) + .respondentSolicitor1ServiceAddress(Address.builder().build()) + .respondentSolicitor2ServiceAddress(Address.builder().build()) + .respondentSolicitor1ServiceAddressRequired(null) + .respondentSolicitor2ServiceAddressRequired(null) .showConditionFlags(initialShowTags); updatedCaseData.respondent1DetailsForClaimDetailsTab(caseData.getRespondent1().toBuilder().flags(null).build()); @@ -1265,9 +1283,9 @@ private CallbackResponse validateUnavailableDates(CallbackParams callbackParams) } private CallbackResponse validateDateOfBirth(CallbackParams callbackParams) { - Party respondent = callbackParams.getCaseData().getRespondent1(); - if (respondent == null && callbackParams.getCaseData().getRespondent2() != null) { - respondent = callbackParams.getCaseData().getRespondent2(); + Party respondent = callbackParams.getCaseData().getRespondent1Copy(); + if (respondent == null && callbackParams.getCaseData().getRespondent2Copy() != null) { + respondent = callbackParams.getCaseData().getRespondent2Copy(); } List errors = dateOfBirthValidator.validate(respondent); @@ -1345,9 +1363,9 @@ private CallbackResponse setApplicantResponseDeadline(CallbackParams callbackPar AllocatedTrack allocatedTrack = caseData.getAllocatedTrack(); Party updatedRespondent1; - if (NO.equals(caseData.getSpecAoSApplicantCorrespondenceAddressRequired())) { + if (NO.equals(caseData.getTempAddress1Required())) { updatedRespondent1 = caseData.getRespondent1().toBuilder() - .primaryAddress(caseData.getSpecAoSApplicantCorrespondenceAddressdetails()).build(); + .primaryAddress(caseData.getTempAddress1()).build(); } else { updatedRespondent1 = caseData.getRespondent1().toBuilder() .primaryAddress(caseData.getRespondent1Copy().getPrimaryAddress()) @@ -1424,21 +1442,8 @@ && ifResponseTypeIsPartOrFullAdmission(caseData)) { .businessProcess(BusinessProcess.ready(DEFENDANT_RESPONSE_SPEC)); if (caseData.getRespondent2() != null && caseData.getRespondent2Copy() != null) { - Party updatedRespondent2; - - if (NO.equals(caseData.getSpecAoSRespondent2HomeAddressRequired())) { - updatedRespondent2 = caseData.getRespondent2().toBuilder() - .primaryAddress(caseData.getSpecAoSRespondent2HomeAddressDetails()).build(); - } else { - updatedRespondent2 = caseData.getRespondent2().toBuilder() - .primaryAddress(caseData.getRespondent2Copy().getPrimaryAddress()).build(); - } - - updatedData - .respondent2(updatedRespondent2.toBuilder() - .flags(caseData.getRespondent2Copy().getFlags()).build()) - .respondent2Copy(null); - updatedData.respondent2DetailsForClaimDetailsTab(updatedRespondent2.toBuilder().flags(null).build()); + Party updatedRespondent2 = applyRespondent2Address(caseData, updatedData); + updatedData.respondent2DetailsForClaimDetailsTab(updatedRespondent2); } // moving statement of truth value to correct field, this was not possible in mid event. @@ -1495,8 +1500,10 @@ && ifResponseTypeIsPartOrFullAdmission(caseData)) { .build()); } - UnavailabilityDatesUtils.rollUpUnavailabilityDatesForRespondent(updatedData, - toggleService.isUpdateContactDetailsEnabled()); + UnavailabilityDatesUtils.rollUpUnavailabilityDatesForRespondent( + updatedData, + toggleService.isUpdateContactDetailsEnabled() + ); updatedData.respondent1DetailsForClaimDetailsTab(updatedData.build().getRespondent1().toBuilder().flags(null).build()); if (ofNullable(caseData.getRespondent2()).isPresent()) { @@ -1568,6 +1575,21 @@ && isAwaitingAnotherDefendantResponse(caseData)) { .build(); } + private static Party applyRespondent2Address(CaseData caseData, CaseData.CaseDataBuilder updatedData) { + Party updatedRespondent2; + + if (NO.equals(caseData.getTempAddress2Required())) { + updatedRespondent2 = caseData.getRespondent2().toBuilder() + .primaryAddress(caseData.getTempAddress2()).build(); + } else { + updatedRespondent2 = caseData.getRespondent2().toBuilder() + .primaryAddress(caseData.getRespondent2Copy().getPrimaryAddress()).build(); + } + + updatedData.respondent2(updatedRespondent2).respondent2Copy(null); + return updatedRespondent2; + } + private boolean ifResponseTypeIsPartOrFullAdmission(CaseData caseData) { return (RespondentResponseTypeSpec.PART_ADMISSION.equals(caseData.getRespondent1ClaimResponseTypeForSpec()) || RespondentResponseTypeSpec.PART_ADMISSION.equals( @@ -1582,19 +1604,19 @@ private void updateCorrespondenceAddress(CallbackParams callbackParams, CaseData.CaseDataBuilder updatedCaseData, CaseData caseData) { if (solicitorHasCaseRole(callbackParams, RESPONDENTSOLICITORONE) - && caseData.getSpecAoSRespondentCorrespondenceAddressRequired() == YesOrNo.NO) { - Address newAddress = caseData.getSpecAoSRespondentCorrespondenceAddressdetails(); + && caseData.getRespondentSolicitor1ServiceAddressRequired() == YesOrNo.NO) { + Address newAddress = caseData.getRespondentSolicitor1ServiceAddress(); updatedCaseData.specRespondentCorrespondenceAddressdetails(newAddress) - .specAoSRespondentCorrespondenceAddressdetails(Address.builder().build()); + .respondentSolicitor1ServiceAddress(Address.builder().build()); if (getMultiPartyScenario(caseData) == ONE_V_TWO_ONE_LEGAL_REP) { // to keep with heading tab updatedCaseData.specRespondent2CorrespondenceAddressdetails(newAddress); } } else if (solicitorHasCaseRole(callbackParams, RESPONDENTSOLICITORTWO) - && caseData.getSpecAoSRespondent2CorrespondenceAddressRequired() == YesOrNo.NO) { + && caseData.getRespondentSolicitor2ServiceAddressRequired() == YesOrNo.NO) { updatedCaseData.specRespondent2CorrespondenceAddressdetails( - caseData.getSpecAoSRespondent2CorrespondenceAddressdetails()) - .specAoSRespondent2CorrespondenceAddressdetails(Address.builder().build()); + caseData.getRespondentSolicitor2ServiceAddress()) + .respondentSolicitor2ServiceAddress(Address.builder().build()); } } diff --git a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseDataParent.java b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseDataParent.java index 7d2a5546ce9..08b9556caf8 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/model/CaseDataParent.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/model/CaseDataParent.java @@ -723,6 +723,23 @@ public boolean isApplicantNotRepresented() { private FastTrackAllocation fastTrackAllocation; + /** + * used to temporary hold addresses. + */ + private final Address tempAddress1; + /** + * used with tempAddress1. + */ + private final YesOrNo tempAddress1Required; + /** + * used to temporary hold addresses. + */ + private final Address tempAddress2; + /** + * used with tempAddress1. + */ + private final YesOrNo tempAddress2Required; + @JsonIgnore public boolean isResponseAcceptedByClaimant() { return applicant1AcceptAdmitAmountPaidSpec == YesOrNo.YES diff --git a/src/main/java/uk/gov/hmcts/reform/civil/utils/UnavailabilityDatesUtils.java b/src/main/java/uk/gov/hmcts/reform/civil/utils/UnavailabilityDatesUtils.java index 5c394d09ee5..81a5e845f2e 100644 --- a/src/main/java/uk/gov/hmcts/reform/civil/utils/UnavailabilityDatesUtils.java +++ b/src/main/java/uk/gov/hmcts/reform/civil/utils/UnavailabilityDatesUtils.java @@ -76,7 +76,7 @@ public static void rollUpUnavailabilityDatesForRespondent(CaseData.CaseDataBuild .getUnavailableDates(); List> updatedUnavailableDates = addEventAndDate( - caseData.getRespondent1ResponseDate().toLocalDate(), + caseData.getRespondent2ResponseDate().toLocalDate(), DEFENDANT_RESPONSE_EVENT, respondent2DQUnavailableDates ); diff --git a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandlerTest.java b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandlerTest.java index 6fbfc1fb527..1ae04095de2 100644 --- a/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandlerTest.java +++ b/src/test/java/uk/gov/hmcts/reform/civil/handler/callback/user/RespondToClaimSpecCallbackHandlerTest.java @@ -19,6 +19,7 @@ import uk.gov.hmcts.reform.ccd.client.model.CallbackRequest; 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.CallbackException; import uk.gov.hmcts.reform.civil.callback.CallbackParams; import uk.gov.hmcts.reform.civil.callback.CallbackType; import uk.gov.hmcts.reform.civil.constants.SpecJourneyConstantLRSpec; @@ -55,23 +56,26 @@ import uk.gov.hmcts.reform.civil.model.UnavailableDate; import uk.gov.hmcts.reform.civil.model.common.DynamicList; import uk.gov.hmcts.reform.civil.model.common.Element; -import uk.gov.hmcts.reform.civil.model.dq.RequestedCourt; import uk.gov.hmcts.reform.civil.model.dq.Respondent1DQ; import uk.gov.hmcts.reform.civil.model.dq.Respondent2DQ; -import uk.gov.hmcts.reform.civil.model.dq.SmallClaimHearing; import uk.gov.hmcts.reform.civil.model.dq.Witness; import uk.gov.hmcts.reform.civil.model.dq.Witnesses; +import uk.gov.hmcts.reform.civil.model.dq.RequestedCourt; +import uk.gov.hmcts.reform.civil.model.dq.Expert; +import uk.gov.hmcts.reform.civil.model.dq.Experts; +import uk.gov.hmcts.reform.civil.model.dq.ExpertDetails; +import uk.gov.hmcts.reform.civil.model.dq.SmallClaimHearing; import uk.gov.hmcts.reform.civil.referencedata.LocationRefDataService; import uk.gov.hmcts.reform.civil.referencedata.model.LocationRefData; import uk.gov.hmcts.reform.civil.sampledata.AddressBuilder; import uk.gov.hmcts.reform.civil.sampledata.CaseDataBuilder; import uk.gov.hmcts.reform.civil.sampledata.PartyBuilder; -import uk.gov.hmcts.reform.civil.service.CoreCaseUserService; import uk.gov.hmcts.reform.civil.service.DeadlinesCalculator; import uk.gov.hmcts.reform.civil.service.ExitSurveyContentService; import uk.gov.hmcts.reform.civil.service.FeatureToggleService; import uk.gov.hmcts.reform.civil.service.Time; import uk.gov.hmcts.reform.civil.service.UserService; +import uk.gov.hmcts.reform.civil.service.CoreCaseUserService; import uk.gov.hmcts.reform.civil.service.citizenui.responsedeadline.DeadlineExtensionCalculatorService; import uk.gov.hmcts.reform.civil.service.flowstate.FlowFlag; import uk.gov.hmcts.reform.civil.service.flowstate.StateFlowEngine; @@ -79,8 +83,8 @@ import uk.gov.hmcts.reform.civil.utils.AssignCategoryId; import uk.gov.hmcts.reform.civil.utils.CaseFlagsInitialiser; import uk.gov.hmcts.reform.civil.utils.CourtLocationUtils; -import uk.gov.hmcts.reform.civil.utils.ElementUtils; import uk.gov.hmcts.reform.civil.utils.MonetaryConversions; +import uk.gov.hmcts.reform.civil.utils.ElementUtils; import uk.gov.hmcts.reform.civil.validation.DateOfBirthValidator; import uk.gov.hmcts.reform.civil.validation.PaymentDateValidator; import uk.gov.hmcts.reform.civil.validation.PostcodeValidator; @@ -99,7 +103,9 @@ import static java.lang.String.format; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -119,6 +125,7 @@ import static uk.gov.hmcts.reform.civil.enums.CaseRole.RESPONDENTSOLICITORTWO; import static uk.gov.hmcts.reform.civil.enums.RespondentResponsePartAdmissionPaymentTimeLRspec.IMMEDIATELY; import static uk.gov.hmcts.reform.civil.enums.RespondentResponseTypeSpec.FULL_ADMISSION; +import static uk.gov.hmcts.reform.civil.enums.RespondentResponseTypeSpec.FULL_DEFENCE; import static uk.gov.hmcts.reform.civil.enums.YesOrNo.NO; import static uk.gov.hmcts.reform.civil.enums.YesOrNo.YES; import static uk.gov.hmcts.reform.civil.helpers.DateFormatHelper.DATE; @@ -198,15 +205,82 @@ public void setup() { ); } + @Test + void whenCallBackEventNotImplementedOrEventInvalid() { + // Given + String postCode = "postCode"; + CaseData caseData = CaseData.builder() + .build().toBuilder() + .respondentSolicitor1ServiceAddressRequired(NO) + .respondentSolicitor1ServiceAddress(Address.builder().postCode(postCode).build()) + .isRespondent1(YES) + .build(); + CallbackParams callbackParams = callbackParamsOf(caseData, CallbackType.MID, " ").toBuilder() + .request(CallbackRequest.builder().eventId(SpecJourneyConstantLRSpec.DEFENDANT_RESPONSE_SPEC) + .build()).build(); + + //When + CallbackException ex = assertThrows(CallbackException.class, () -> handler.handle(callbackParams), + + "A CallbackException was expected to be thrown but wasn't."); + // Then + assertThat(ex.getMessage()).contains("Callback for event"); + } + + @Test + void resetStatementOfTruth() { + CaseData caseData = CaseDataBuilder.builder().build(); + CallbackParams params = callbackParamsOf(caseData, CallbackType.MID, "statement-of-truth"); + CallbackRequest request = CallbackRequest.builder() + .eventId(SpecJourneyConstantLRSpec.DEFENDANT_RESPONSE_SPEC) + .build(); + params = params.toBuilder().request(request).build(); + + // When + CallbackResponse response = handler.handle(params); + + // Then + assertNotNull(response); + } + @Test void midSpecCorrespondenceAddress_checkAddressIfWasIncorrect() { // Given String postCode = "postCode"; CaseData caseData = CaseData.builder() - .specAoSApplicantCorrespondenceAddressRequired(YesOrNo.NO) - .specAoSApplicantCorrespondenceAddressdetails(Address.builder() - .postCode(postCode) - .build()) + .build().toBuilder() + .respondentSolicitor1ServiceAddressRequired(NO) + .respondentSolicitor1ServiceAddress(Address.builder().postCode(postCode).build()) + .isRespondent1(YES) + .build(); + CallbackParams params = callbackParamsOf(caseData, CallbackType.MID, "specCorrespondenceAddress"); + CallbackRequest request = CallbackRequest.builder() + .eventId(SpecJourneyConstantLRSpec.DEFENDANT_RESPONSE_SPEC) + .build(); + params = params.toBuilder().request(request).build(); + + List errors = Collections.singletonList("error 1"); + Mockito.when(postcodeValidator.validate(postCode)).thenReturn(errors); + + // When + CallbackResponse response = handler.handle(params); + + // Then + assertEquals(errors, ((AboutToStartOrSubmitCallbackResponse) response).getErrors()); + } + + @Test + void midSpecCorrespondenceAddress_checkAddressIfWasIncorrectForSol2() { + // Given + String postCode = "postCode"; + CaseData caseData = CaseData.builder() + .build().toBuilder() + .respondentSolicitor1ServiceAddressRequired(YES) + .respondentSolicitor1ServiceAddress(Address.builder().postCode(postCode).build()) + .isRespondent1(YES) + .isRespondent2(YES) + .respondentSolicitor2ServiceAddressRequired(NO) + .respondentSolicitor2ServiceAddress(Address.builder().postCode(postCode).build()) .build(); CallbackParams params = callbackParamsOf(caseData, CallbackType.MID, "specCorrespondenceAddress"); CallbackRequest request = CallbackRequest.builder() @@ -314,10 +388,8 @@ void testSpecDefendantResponseFastTrackOneVTwoLegalRep() { assertThat(response.getData()).isNotNull(); assertThat(response.getData()).containsEntry("responseClaimTrack", AllocatedTrack.FAST_CLAIM.name()); assertThat(response.getData()).containsEntry("specDisputesOrPartAdmission", "No"); - assertThat(response.getData()).containsEntry( - "specPaidLessAmountOrDisputesOrPartAdmission", - "No" - ); + assertThat(response.getData()).containsEntry("specPaidLessAmountOrDisputesOrPartAdmission", + "No"); } @Test @@ -347,10 +419,8 @@ void testSpecDefendantResponseFastTrackOneVTwoSameLegalRep() { assertThat(response.getData()).isNotNull(); assertThat(response.getData()).containsEntry("responseClaimTrack", AllocatedTrack.FAST_CLAIM.name()); assertThat(response.getData()).containsEntry("specDisputesOrPartAdmission", "No"); - assertThat(response.getData()).containsEntry( - "specPaidLessAmountOrDisputesOrPartAdmission", - "No" - ); + assertThat(response.getData()).containsEntry("specPaidLessAmountOrDisputesOrPartAdmission", + "No"); } @Test @@ -376,10 +446,8 @@ void testSpecDefendantResponseFastTrackTwoVOne() { assertThat(response.getData()).isNotNull(); assertThat(response.getData()).containsEntry("responseClaimTrack", AllocatedTrack.FAST_CLAIM.name()); assertThat(response.getData()).containsEntry("specDisputesOrPartAdmission", "No"); - assertThat(response.getData()).containsEntry( - "specPaidLessAmountOrDisputesOrPartAdmission", - "No" - ); + assertThat(response.getData()).containsEntry("specPaidLessAmountOrDisputesOrPartAdmission", + "No"); } @Test @@ -662,9 +730,6 @@ public void testValidateRespondentPaymentDate() { AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler .handle(params); - List expectedErrorArray = new ArrayList<>(); - expectedErrorArray.add("Date for when will the amount be paid must be today or in the future."); - // Then assertThat(response).isNotNull(); /* @@ -723,8 +788,9 @@ void updateRespondent1AddressWhenUpdated() { CaseData caseData = CaseDataBuilder.builder() .respondent1(PartyBuilder.builder().individual().build()) .atStateApplicantRespondToDefenceAndProceed() - .atSpecAoSApplicantCorrespondenceAddressRequired(NO) - .atSpecAoSApplicantCorrespondenceAddressDetails(AddressBuilder.maximal().build()) + .build().toBuilder() + .tempAddress1Required(NO) + .tempAddress1(AddressBuilder.maximal().build()) .build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); @@ -755,15 +821,21 @@ void updateRespondent2AddressWhenUpdated() { when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); + Address newAddress2 = AddressBuilder.defaults().build(); CaseData caseData = CaseDataBuilder.builder().atStateApplicantRespondToDefenceAndProceed() .respondent2DQ() .respondent1Copy(PartyBuilder.builder().individual().build()) - .atSpecAoSApplicantCorrespondenceAddressRequired(YES) .addRespondent2(YES) .respondent2(PartyBuilder.builder().individual().build()) .respondent2Copy(PartyBuilder.builder().individual().build()) - .atSpecAoSRespondent2HomeAddressRequired(NO) - .atSpecAoSRespondent2HomeAddressDetails(AddressBuilder.maximal().build()) + .build().toBuilder() + .tempAddress1Required(YES) + .tempAddress1(Address.builder().build()) + .build().toBuilder() + .tempAddress2Required(NO) + .tempAddress2(newAddress2) + .respondentSolicitor2ServiceAddressRequired(NO) + .respondentSolicitor2ServiceAddress(newAddress2) .build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); @@ -777,28 +849,52 @@ void updateRespondent2AddressWhenUpdated() { // Then assertThat(response.getData()) .extracting("respondent2").extracting("primaryAddress") - .extracting("AddressLine1").isEqualTo("address line 1"); + .extracting("AddressLine1").isEqualTo(newAddress2.getAddressLine1()); assertThat(response.getData()) .extracting("respondent2").extracting("primaryAddress") - .extracting("AddressLine2").isEqualTo("address line 2"); + .extracting("AddressLine2").isEqualTo(newAddress2.getAddressLine2()); assertThat(response.getData()) .extracting("respondent2").extracting("primaryAddress") - .extracting("AddressLine3").isEqualTo("address line 3"); + .extracting("AddressLine3").isEqualTo(newAddress2.getAddressLine3()); } @Test - void updateRespondent2AddressWhenSpecAoSRespondent2HomeAddressRequiredIsNO() { + void defendantResponsePopulatesWitnessesData() { // Given + LocalDateTime dateTime = LocalDateTime.of(2023, 6, 6, 6, 6, 6); + LocalDate date = dateTime.toLocalDate(); when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); + when(time.now()).thenReturn(dateTime); when(mockedStateFlow.isFlagSet(any())).thenReturn(true); when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); - - Party partyWithPrimaryAddress = PartyBuilder.builder().individual().build(); - partyWithPrimaryAddress.setPrimaryAddress(AddressBuilder.maximal() - .addressLine1("address line 1") - .addressLine2("address line 2") - .addressLine3("address line 3") - .build()); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); + when(toggleService.isHmcEnabled()).thenReturn(true); + + Witnesses res1witnesses = Witnesses.builder().details( + wrapElements( + Witness.builder() + .firstName("Witness") + .lastName("One") + .emailAddress("test-witness-one@example.com") + .phoneNumber("07865456789") + .reasonForWitness("great reasons") + .eventAdded("Defendant Response Event") + .dateAdded(date) + .build()) + ).build(); + + Witnesses res2witnesses = Witnesses.builder().details( + wrapElements( + Witness.builder() + .firstName("Witness") + .lastName("Two") + .emailAddress("test-witness-two@example.com") + .phoneNumber("07532628263") + .reasonForWitness("good reasons") + .eventAdded("Defendant Response Event") + .dateAdded(date) + .build()) + ).build(); CaseData caseData = CaseDataBuilder.builder().atStateApplicantRespondToDefenceAndProceed() .respondent2DQ() @@ -806,422 +902,693 @@ void updateRespondent2AddressWhenSpecAoSRespondent2HomeAddressRequiredIsNO() { .addRespondent2(YES) .respondent2(PartyBuilder.builder().individual().build()) .respondent2Copy(PartyBuilder.builder().individual().build()) - .atSpecAoSRespondent2HomeAddressRequired(NO) - .atSpecAoSRespondent2HomeAddressDetails(AddressBuilder.maximal() - .addressLine1("new address line 1") - .build()) + .build().toBuilder() + .respondent1DQWitnessesSmallClaim(res1witnesses) + .respondent2DQWitnessesSmallClaim(res2witnesses) + .build().toBuilder() + .tempAddress1Required(YES) + .tempAddress1(Address.builder().build()) + .respondent2ResponseDate(dateTime) + .respondent1ResponseDate(dateTime).build().toBuilder() + .tempAddress2Required(NO) + .tempAddress2(AddressBuilder.maximal().build()) .build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + when(deadlinesCalculator.calculateApplicantResponseDeadlineSpec(any(), any())) + .thenReturn(LocalDateTime.now()); + // When - AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler.handle( - callbackParamsOf(caseData, ABOUT_TO_SUBMIT)); + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); + + var objectMapper = new ObjectMapper(); + objectMapper.findAndRegisterModules(); + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); // Then - assertThat(response.getData()) - .extracting("respondent2") - .extracting("primaryAddress") - .extracting("AddressLine1") - .isEqualTo("new address line 1"); + + Witnesses actualRespondent1DQWitnesses = objectMapper.convertValue(response.getData().get("respondent1DQWitnesses"), new TypeReference<>() {}); + Witness actualRespondent1Witness = unwrapElements(actualRespondent1DQWitnesses.getDetails()).get(0); + assertThat(actualRespondent1Witness.getPartyID()).isNotNull(); + assertThat(actualRespondent1Witness.getFirstName()).isEqualTo("Witness"); + assertThat(actualRespondent1Witness.getLastName()).isEqualTo("One"); + assertThat(actualRespondent1Witness.getEmailAddress()).isEqualTo("test-witness-one@example.com"); + assertThat(actualRespondent1Witness.getPhoneNumber()).isEqualTo("07865456789"); + assertThat(actualRespondent1Witness.getReasonForWitness()).isEqualTo("great reasons"); + assertThat(actualRespondent1Witness.getEventAdded()).isEqualTo("Defendant Response Event"); + assertThat(actualRespondent1Witness.getDateAdded()).isEqualTo(date); + + Witnesses actualRespondent2DQWitnesses = objectMapper.convertValue(response.getData().get("respondent2DQWitnesses"), new TypeReference<>() {}); + Witness respondent2Witness = unwrapElements(actualRespondent2DQWitnesses.getDetails()).get(0); + assertThat(respondent2Witness.getPartyID()).isNotNull(); + assertThat(respondent2Witness.getFirstName()).isEqualTo("Witness"); + assertThat(respondent2Witness.getLastName()).isEqualTo("Two"); + assertThat(respondent2Witness.getEmailAddress()).isEqualTo("test-witness-two@example.com"); + assertThat(respondent2Witness.getPhoneNumber()).isEqualTo("07532628263"); + assertThat(respondent2Witness.getReasonForWitness()).isEqualTo("good reasons"); + assertThat(respondent2Witness.getEventAdded()).isEqualTo("Defendant Response Event"); + assertThat(respondent2Witness.getDateAdded()).isEqualTo(date); + } - @Test - void updateRespondent2AddressWhenSpecAoSRespondent2HomeAddressRequiredIsNotNO() { - // Given - when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); - when(mockedStateFlow.isFlagSet(any())).thenReturn(true); - when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); + @Nested + class HandleLocations { + + @Test + void oneVOne() { + // Given + DynamicList locationValues = DynamicList.fromList(List.of("Value 1")); + DynamicList preferredCourt = DynamicList.builder() + .listItems(locationValues.getListItems()) + .value(locationValues.getListItems().get(0)) + .build(); + Party defendant1 = Party.builder() + .type(Party.Type.COMPANY) + .companyName("company") + .build(); + CaseData caseData = CaseData.builder() + .caseAccessCategory(SPEC_CLAIM) + .ccdCaseReference(354L) + .respondent1(defendant1) + .respondent1Copy(defendant1) + .respondent1DQ( + Respondent1DQ.builder() + .respondToCourtLocation( + RequestedCourt.builder() + .responseCourtLocations(preferredCourt) + .reasonForHearingAtSpecificCourt("Reason") + .build() + ) + .build() + ) + .showConditionFlags(EnumSet.of( + DefendantResponseShowTag.CAN_ANSWER_RESPONDENT_1 + )) + .build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + List locations = List.of(LocationRefData.builder().build()); + when(locationRefDataService.getCourtLocationsForDefaultJudgments(any())) + .thenReturn(locations); + LocationRefData completePreferredLocation = LocationRefData.builder() + .regionId("regionId") + .epimmsId("epimms") + .courtLocationCode("code") + .build(); + when(courtLocationUtils.findPreferredLocationData( + locations, preferredCourt + )).thenReturn(completePreferredLocation); + StateFlow flow = mock(StateFlow.class); + when(flow.isFlagSet(FlowFlag.TWO_RESPONDENT_REPRESENTATIVES)).thenReturn(false); + when(stateFlowEngine.evaluate(caseData)) + .thenReturn(flow); + when(coreCaseUserService.userHasCaseRole(anyString(), anyString(), any(CaseRole.class))) + .thenReturn(true); + UserInfo userInfo = UserInfo.builder().uid("798").build(); + when(userService.getUserInfo(anyString())).thenReturn(userInfo); + + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); + + // Then + AbstractObjectAssert sent1 = assertThat(response.getData()) + .extracting("respondent1DQRequestedCourt"); + sent1.extracting("caseLocation") + .extracting("region") + .isEqualTo(completePreferredLocation.getRegionId()); + sent1.extracting("caseLocation") + .extracting("baseLocation") + .isEqualTo(completePreferredLocation.getEpimmsId()); + sent1.extracting("responseCourtCode") + .isEqualTo(completePreferredLocation.getCourtLocationCode()); + sent1.extracting("reasonForHearingAtSpecificCourt") + .isEqualTo("Reason"); + } + + @Test + void oneVTwo_SecondDefendantRepliesSameLegalRep() { + // Given + DynamicList locationValues = DynamicList.fromList(List.of("Value 1")); + DynamicList preferredCourt = DynamicList.builder() + .listItems(locationValues.getListItems()) + .value(locationValues.getListItems().get(0)) + .build(); + Party defendant1 = Party.builder() + .type(Party.Type.COMPANY) + .companyName("company") + .build(); + Party defendant2 = Party.builder() + .type(Party.Type.COMPANY) + .companyName("company2") + .build(); + CaseData caseData = CaseData.builder() + .respondent2SameLegalRepresentative(YES) + .caseAccessCategory(SPEC_CLAIM) + .ccdCaseReference(354L) + .defenceAdmitPartPaymentTimeRouteRequired(IMMEDIATELY) + .respondent2ClaimResponseTypeForSpec(FULL_ADMISSION) + .respondent1(defendant1) + .respondent1Copy(defendant1) + .respondent2(defendant2) + .respondent2Copy(defendant2) + .respondent1DQ( + Respondent1DQ.builder() + .respondToCourtLocation( + RequestedCourt.builder() + .responseCourtLocations(preferredCourt) + .reasonForHearingAtSpecificCourt("Reason") + .build() + ) + .build() + ) + .respondent2DQ( + Respondent2DQ.builder() + .respondToCourtLocation2( + RequestedCourt.builder() + .responseCourtLocations(preferredCourt) + .reasonForHearingAtSpecificCourt("Reason123") + .build() + ) + .build() + ) + .showConditionFlags(EnumSet.of( + DefendantResponseShowTag.CAN_ANSWER_RESPONDENT_1, + DefendantResponseShowTag.CAN_ANSWER_RESPONDENT_2 + )) + .build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + List locations = List.of(LocationRefData.builder().build()); + when(locationRefDataService.getCourtLocationsForDefaultJudgments(any())) + .thenReturn(locations); + LocationRefData completePreferredLocation = LocationRefData.builder() + .regionId("regionId") + .epimmsId("epimms") + .courtLocationCode("code") + .build(); + when(courtLocationUtils.findPreferredLocationData( + locations, preferredCourt + )).thenReturn(completePreferredLocation); + StateFlow flow = mock(StateFlow.class); + when(flow.isFlagSet(FlowFlag.TWO_RESPONDENT_REPRESENTATIVES)).thenReturn(true); + when(stateFlowEngine.evaluate(caseData)).thenReturn(flow); + when(coreCaseUserService.userHasCaseRole(anyString(), anyString(), any(CaseRole.class))) + .thenReturn(true); + UserInfo userInfo = UserInfo.builder().uid("798").build(); + when(userService.getUserInfo(anyString())).thenReturn(userInfo); + LocalDate whenWillPay = LocalDate.now().plusDays(5); + given(deadlineExtensionCalculatorService.calculateExtendedDeadline(any(), anyInt())).willReturn(whenWillPay); + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + // Then + AbstractObjectAssert sent2 = assertThat(response.getData()) + .extracting("respondent2DQRequestedCourt"); + sent2.extracting("caseLocation") + .extracting("region") + .isEqualTo(completePreferredLocation.getRegionId()); + sent2.extracting("caseLocation") + .extracting("baseLocation") + .isEqualTo(completePreferredLocation.getEpimmsId()); + sent2.extracting("responseCourtCode") + .isEqualTo(completePreferredLocation.getCourtLocationCode()); + sent2.extracting("reasonForHearingAtSpecificCourt") + .isEqualTo("Reason123"); + } + + @Test + void oneVTwo_SecondDefendantReplies() { + // Given + DynamicList locationValues = DynamicList.fromList(List.of("Value 1")); + DynamicList preferredCourt = DynamicList.builder() + .listItems(locationValues.getListItems()) + .value(locationValues.getListItems().get(0)) + .build(); + Party defendant1 = Party.builder() + .type(Party.Type.COMPANY) + .companyName("company") + .build(); + Party defendant2 = Party.builder() + .type(Party.Type.COMPANY) + .companyName("company 2") + .build(); + CaseData caseData = CaseData.builder() + .caseAccessCategory(SPEC_CLAIM) + .ccdCaseReference(354L) + .respondent1(defendant1) + .respondent1Copy(defendant1) + .respondent2(defendant2) + .respondent2Copy(defendant2) + .respondent1DQ( + Respondent1DQ.builder() + .respondToCourtLocation( + RequestedCourt.builder() + .responseCourtLocations(preferredCourt) + .reasonForHearingAtSpecificCourt("Reason") + .build() + ) + .build() + ) + .respondent2DQ( + Respondent2DQ.builder() + .respondToCourtLocation2( + RequestedCourt.builder() + .responseCourtLocations(preferredCourt) + .reasonForHearingAtSpecificCourt("Reason123") + .build() + ) + .build() + ) + .showConditionFlags(EnumSet.of( + DefendantResponseShowTag.CAN_ANSWER_RESPONDENT_1, + DefendantResponseShowTag.CAN_ANSWER_RESPONDENT_2 + )) + .build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + List locations = List.of(LocationRefData.builder().build()); + when(locationRefDataService.getCourtLocationsForDefaultJudgments(any())) + .thenReturn(locations); + LocationRefData completePreferredLocation = LocationRefData.builder() + .regionId("regionId") + .epimmsId("epimms") + .courtLocationCode("code") + .build(); + when(courtLocationUtils.findPreferredLocationData( + locations, preferredCourt + )).thenReturn(completePreferredLocation); + StateFlow flow = mock(StateFlow.class); + when(flow.isFlagSet(FlowFlag.TWO_RESPONDENT_REPRESENTATIVES)).thenReturn(true); + when(stateFlowEngine.evaluate(caseData)).thenReturn(flow); + when(coreCaseUserService.userHasCaseRole(anyString(), anyString(), any(CaseRole.class))) + .thenReturn(true); + UserInfo userInfo = UserInfo.builder().uid("798").build(); + when(userService.getUserInfo(anyString())).thenReturn(userInfo); + + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); + + // Then + AbstractObjectAssert sent2 = assertThat(response.getData()) + .extracting("respondent2DQRequestedCourt"); + sent2.extracting("caseLocation") + .extracting("region") + .isEqualTo(completePreferredLocation.getRegionId()); + sent2.extracting("caseLocation") + .extracting("baseLocation") + .isEqualTo(completePreferredLocation.getEpimmsId()); + sent2.extracting("responseCourtCode") + .isEqualTo(completePreferredLocation.getCourtLocationCode()); + sent2.extracting("reasonForHearingAtSpecificCourt") + .isEqualTo("Reason123"); + } + } - Party partyWithPrimaryAddress = PartyBuilder.builder().individual().build(); - partyWithPrimaryAddress.setPrimaryAddress(AddressBuilder.maximal() - .addressLine1("address line 1") - .addressLine2("address line 2") - .addressLine3("address line 3") - .build()); + } - CaseData caseData = CaseDataBuilder.builder().atStateApplicantRespondToDefenceAndProceed() - .respondent2DQ() - .respondent1Copy(PartyBuilder.builder().individual().build()) - .addRespondent2(YES) - .respondent2(PartyBuilder.builder().individual().build()) - .respondent2Copy(PartyBuilder.builder().individual().build()) - .atSpecAoSRespondent2HomeAddressRequired(YES) - .build(); + @Test + void shouldNullDocuments_whenInvokedAndCaseFileEnabled() { + // Given + when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); + when(mockedStateFlow.isFlagSet(any())).thenReturn(true); + when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); + when(toggleService.isCaseFileViewEnabled()).thenReturn(true); + var testDocument = ResponseDocument.builder() + .file(Document.builder().documentUrl("fake-url").documentFileName("file-name").documentBinaryUrl("binary-url").build()).build(); - // When - AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler.handle( - callbackParamsOf(caseData, ABOUT_TO_SUBMIT)); + CaseData caseData = CaseData.builder() + .respondent1(PartyBuilder.builder().individual().build()) + .respondent1Copy(PartyBuilder.builder().individual().build()) + .respondent1DQ(Respondent1DQ.builder().build()) + .respondent2(PartyBuilder.builder().individual().build()) + .respondent2Copy(PartyBuilder.builder().individual().build()) + .respondent2DQ(Respondent2DQ.builder().build()) + .respondent1ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_DEFENCE) + .respondent2ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_DEFENCE) + .ccdCaseReference(354L) + .respondent1SpecDefenceResponseDocument(testDocument) + .respondent2SpecDefenceResponseDocument(testDocument) + .build(); - // Then - assertThat(response.getData()) - .extracting("respondent2") - .extracting("primaryAddress") - .extracting("AddressLine1") - .isEqualTo("address line 1"); - assertThat(response.getData()) - .extracting("respondent2") - .extracting("primaryAddress") - .extracting("AddressLine2") - .isEqualTo("address line 2"); - assertThat(response.getData()) - .extracting("respondent2") - .extracting("primaryAddress") - .extracting("AddressLine3") - .isEqualTo("address line 3"); - } + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); + + // Then + assertThat(response.getData().get("respondent1SpecDefenceResponseDocument")).isNull(); + assertThat(response.getData().get("respondent2SpecDefenceResponseDocument")).isNull(); } @Test - void defendantResponsePopulatesWitnessesData() { + void shouldUpdateExpertEvents_whenInvokedAndUpdateContactDetailsEnabled_For2DivergeResponse() { // Given LocalDateTime dateTime = LocalDateTime.of(2023, 6, 6, 6, 6, 6); - LocalDate date = dateTime.toLocalDate(); when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); - when(time.now()).thenReturn(dateTime); when(mockedStateFlow.isFlagSet(any())).thenReturn(true); when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); - when(toggleService.isHmcEnabled()).thenReturn(true); - - Witnesses res1witnesses = Witnesses.builder().details( - wrapElements( - Witness.builder() - .firstName("Witness") - .lastName("One") - .emailAddress("test-witness-one@example.com") - .phoneNumber("07865456789") - .reasonForWitness("great reasons") - .eventAdded("Defendant Response Event") - .dateAdded(date) - .build()) - ).build(); - - Witnesses res2witnesses = Witnesses.builder().details( - wrapElements( - Witness.builder() - .firstName("Witness") - .lastName("Two") - .emailAddress("test-witness-two@example.com") - .phoneNumber("07532628263") - .reasonForWitness("good reasons") - .eventAdded("Defendant Response Event") - .dateAdded(date) - .build()) - ).build(); - - CaseData caseData = CaseDataBuilder.builder().atStateApplicantRespondToDefenceAndProceed() - .respondent2DQ() + when(toggleService.isUpdateContactDetailsEnabled()).thenReturn(true); + + CaseData caseData = CaseData.builder() + .respondent1(PartyBuilder.builder().individual().build()) .respondent1Copy(PartyBuilder.builder().individual().build()) - .atSpecAoSApplicantCorrespondenceAddressRequired(YES) - .addRespondent2(YES) + .respondent1DQ(Respondent1DQ.builder() + .respondent1DQExperts(Experts.builder() + .details(wrapElements(Expert.builder().build())).build()) + .build()) .respondent2(PartyBuilder.builder().individual().build()) .respondent2Copy(PartyBuilder.builder().individual().build()) - .atSpecAoSRespondent2HomeAddressRequired(NO) - .atSpecAoSRespondent2HomeAddressDetails(AddressBuilder.maximal().build()) - .build().toBuilder() - .respondent1DQWitnessesSmallClaim(res1witnesses) - .respondent2DQWitnessesSmallClaim(res2witnesses) - .build().toBuilder() - .respondent2ResponseDate(dateTime) - .respondent1ResponseDate(dateTime).build(); + .respondent2DQ(Respondent2DQ.builder().build()) + .claimant1ClaimResponseTypeForSpec(FULL_DEFENCE) + .claimant2ClaimResponseTypeForSpec(FULL_ADMISSION) + .ccdCaseReference(354L) + .respondent1ResponseDate(dateTime).build().toBuilder() + .respondent2SameLegalRepresentative(YES) + .build(); + + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); + + // Then + assertThat(response.getData().get("respondent1DQExperts")).isNotNull(); + assertThat(response.getData().get("respondent2DQExperts")).isNull(); + + } + + @Test + void shouldUpdateExpertEvents_whenInvokedAndUpdateContactDetailsEnabled_CanAddApplicant2() { + // Given + LocalDateTime dateTime = LocalDateTime.of(2023, 6, 6, 6, 6, 6); + when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); + when(mockedStateFlow.isFlagSet(any())).thenReturn(true); + when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); + when(toggleService.isUpdateContactDetailsEnabled()).thenReturn(true); + + CaseData caseData = CaseData.builder() + .respondent1(PartyBuilder.builder().individual().build()) + .respondent1Copy(PartyBuilder.builder().individual().build()) + .respondent1DQ(Respondent1DQ.builder() + .respondent1DQExperts(Experts.builder() + .details(wrapElements(Expert.builder().build())).build()) + .build()) + .respondent2(PartyBuilder.builder().individual().build()) + .respondent2Copy(PartyBuilder.builder().individual().build()) + .respondent2DQ(Respondent2DQ.builder().build()) + .claimant1ClaimResponseTypeForSpec(FULL_DEFENCE) + .claimant2ClaimResponseTypeForSpec(FULL_ADMISSION) + .ccdCaseReference(354L) + .respondent1ResponseDate(dateTime).build().toBuilder() + .addApplicant2(YES) + .build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); - when(deadlinesCalculator.calculateApplicantResponseDeadlineSpec(any(), any())) - .thenReturn(LocalDateTime.now()); // When AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler .handle(params); - var objectMapper = new ObjectMapper(); - objectMapper.findAndRegisterModules(); - objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + // Then + assertThat(response.getData().get("respondent1DQExperts")).isNotNull(); + assertThat(response.getData().get("respondent2DQExperts")).isNull(); + + } + + @Test + void shouldUpdateExpertEvents_whenInvokedAndUpdateContactDetailsEnabled_FullAdmission() { + // Given + LocalDateTime dateTime = LocalDateTime.of(2023, 6, 6, 6, 6, 6); + when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); + when(mockedStateFlow.isFlagSet(any())).thenReturn(true); + when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); + when(toggleService.isUpdateContactDetailsEnabled()).thenReturn(true); + + CaseData caseData = CaseData.builder() + .respondent1(PartyBuilder.builder().individual().build()) + .respondent1Copy(PartyBuilder.builder().individual().build()) + .respondent1DQ(Respondent1DQ.builder() + .respondent1DQExperts(Experts.builder() + .details(wrapElements(Expert.builder().build())).build()) + .build()) + .respondent2(PartyBuilder.builder().individual().build()) + .respondent2Copy(PartyBuilder.builder().individual().build()) + .respondent2DQ(Respondent2DQ.builder().build()) + .respondent1ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_ADMISSION) + .respondent2ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_ADMISSION) + .ccdCaseReference(354L) + .respondent1ResponseDate(dateTime).build().toBuilder() + .build(); + + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); // Then + assertThat(response.getData().get("respondent1DQExperts")).isNotNull(); + assertThat(response.getData().get("respondent2DQExperts")).isNull(); + + } + + @Test + void shouldUpdateExpertEvents_whenInvokedAndUpdateContactDetailsEnabled() { + // Given + LocalDateTime dateTime = LocalDateTime.of(2023, 6, 6, 6, 6, 6); + when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); + when(mockedStateFlow.isFlagSet(any())).thenReturn(true); + when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); + when(toggleService.isUpdateContactDetailsEnabled()).thenReturn(true); + + CaseData caseData = CaseData.builder() + .respondent1(PartyBuilder.builder().individual().build()) + .respondent1Copy(PartyBuilder.builder().individual().build()) + .respondent1DQ(Respondent1DQ.builder() + .respondent1DQExperts(Experts.builder() + .details(wrapElements(Expert.builder().build())).build()) + .build()) + .respondent2(PartyBuilder.builder().individual().build()) + .respondent2Copy(PartyBuilder.builder().individual().build()) + .respondent2DQ(Respondent2DQ.builder().build()) + .respondent1ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_DEFENCE) + .respondent2ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_DEFENCE) + .ccdCaseReference(354L) + .respondent1ResponseDate(dateTime).build().toBuilder() + .build(); - Witnesses actualRespondent1DQWitnesses = objectMapper.convertValue(response.getData().get( - "respondent1DQWitnesses"), new TypeReference<>() { - }); - Witness actualRespondent1Witness = unwrapElements(actualRespondent1DQWitnesses.getDetails()).get(0); - assertThat(actualRespondent1Witness.getPartyID()).isNotNull(); - assertThat(actualRespondent1Witness.getFirstName()).isEqualTo("Witness"); - assertThat(actualRespondent1Witness.getLastName()).isEqualTo("One"); - assertThat(actualRespondent1Witness.getEmailAddress()).isEqualTo("test-witness-one@example.com"); - assertThat(actualRespondent1Witness.getPhoneNumber()).isEqualTo("07865456789"); - assertThat(actualRespondent1Witness.getReasonForWitness()).isEqualTo("great reasons"); - assertThat(actualRespondent1Witness.getEventAdded()).isEqualTo("Defendant Response Event"); - assertThat(actualRespondent1Witness.getDateAdded()).isEqualTo(date); - - Witnesses actualRespondent2DQWitnesses = objectMapper.convertValue(response.getData().get( - "respondent2DQWitnesses"), new TypeReference<>() { - }); - Witness respondent2Witness = unwrapElements(actualRespondent2DQWitnesses.getDetails()).get(0); - assertThat(respondent2Witness.getPartyID()).isNotNull(); - assertThat(respondent2Witness.getFirstName()).isEqualTo("Witness"); - assertThat(respondent2Witness.getLastName()).isEqualTo("Two"); - assertThat(respondent2Witness.getEmailAddress()).isEqualTo("test-witness-two@example.com"); - assertThat(respondent2Witness.getPhoneNumber()).isEqualTo("07532628263"); - assertThat(respondent2Witness.getReasonForWitness()).isEqualTo("good reasons"); - assertThat(respondent2Witness.getEventAdded()).isEqualTo("Defendant Response Event"); - assertThat(respondent2Witness.getDateAdded()).isEqualTo(date); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); + + // Then + assertThat(response.getData().get("respondent1DQExperts")).isNotNull(); + assertThat(response.getData().get("respondent2DQExperts")).isNull(); } - @Nested - class HandleLocations { + @Test + void shouldUpdateExpertEvents_whenInvokedAndUpdateContactDetailsEnabled_V2DraftDirections() { + // Given + LocalDateTime dateTime = LocalDateTime.of(2023, 6, 6, 6, 6, 6); + when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); + when(mockedStateFlow.isFlagSet(any())).thenReturn(true); + when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); + when(toggleService.isUpdateContactDetailsEnabled()).thenReturn(true); - @Test - void oneVOne() { - // Given - DynamicList locationValues = DynamicList.fromList(List.of("Value 1")); - DynamicList preferredCourt = DynamicList.builder() - .listItems(locationValues.getListItems()) - .value(locationValues.getListItems().get(0)) - .build(); - Party defendant1 = Party.builder() - .type(Party.Type.COMPANY) - .companyName("company") - .build(); - CaseData caseData = CaseData.builder() - .caseAccessCategory(SPEC_CLAIM) - .ccdCaseReference(354L) - .respondent1(defendant1) - .respondent1Copy(defendant1) - .respondent1DQ( - Respondent1DQ.builder() - .respondToCourtLocation( - RequestedCourt.builder() - .responseCourtLocations(preferredCourt) - .reasonForHearingAtSpecificCourt("Reason") - .build() - ) - .build() - ) - .showConditionFlags(EnumSet.of( - DefendantResponseShowTag.CAN_ANSWER_RESPONDENT_1 - )) - .build(); - CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + CaseData caseData = CaseData.builder() + .respondent1(PartyBuilder.builder().individual().build()) + .respondent1Copy(PartyBuilder.builder().individual().build()) + .respondent1DQ(Respondent1DQ.builder() + .respondent1DQExperts(Experts.builder() + .details(wrapElements(Expert.builder().build())).build()) + .build()) + .respondent2(PartyBuilder.builder().individual().build()) + .respondent2Copy(PartyBuilder.builder().individual().build()) + .respondent2DQ(Respondent2DQ.builder() + .respondent2DQDraftDirections(Document.builder().build()).build()) + .respondent1ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_DEFENCE) + .respondent2ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_DEFENCE) + .ccdCaseReference(354L) + .respondent1ResponseDate(dateTime).build().toBuilder() + .build(); - List locations = List.of(LocationRefData.builder().build()); - when(locationRefDataService.getCourtLocationsForDefaultJudgments(any())) - .thenReturn(locations); - LocationRefData completePreferredLocation = LocationRefData.builder() - .regionId("regionId") - .epimmsId("epimms") - .courtLocationCode("code") - .build(); - when(courtLocationUtils.findPreferredLocationData( - locations, preferredCourt - )).thenReturn(completePreferredLocation); - StateFlow flow = mock(StateFlow.class); - when(flow.isFlagSet(FlowFlag.TWO_RESPONDENT_REPRESENTATIVES)).thenReturn(false); - when(stateFlowEngine.evaluate(caseData)) - .thenReturn(flow); - when(coreCaseUserService.userHasCaseRole(anyString(), anyString(), any(CaseRole.class))) - .thenReturn(true); - UserInfo userInfo = UserInfo.builder().uid("798").build(); - when(userService.getUserInfo(anyString())).thenReturn(userInfo); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); - // When - AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler - .handle(params); + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); - // Then - AbstractObjectAssert sent1 = assertThat(response.getData()) - .extracting("respondent1DQRequestedCourt"); - sent1.extracting("caseLocation") - .extracting("region") - .isEqualTo(completePreferredLocation.getRegionId()); - sent1.extracting("caseLocation") - .extracting("baseLocation") - .isEqualTo(completePreferredLocation.getEpimmsId()); - sent1.extracting("responseCourtCode") - .isEqualTo(completePreferredLocation.getCourtLocationCode()); - sent1.extracting("reasonForHearingAtSpecificCourt") - .isEqualTo("Reason"); - } + // Then + assertThat(response.getData().get("respondent1DQExperts")).isNotNull(); + assertThat(response.getData().get("respondent2DQExperts")).isNull(); - @Test - void oneVTwo_SecondDefendantRepliesSameLegalRep() { - // Given - DynamicList locationValues = DynamicList.fromList(List.of("Value 1")); - DynamicList preferredCourt = DynamicList.builder() - .listItems(locationValues.getListItems()) - .value(locationValues.getListItems().get(0)) - .build(); - Party defendant1 = Party.builder() - .type(Party.Type.COMPANY) - .companyName("company") - .build(); - CaseData caseData = CaseData.builder() - .respondent2SameLegalRepresentative(YES) - .caseAccessCategory(SPEC_CLAIM) - .ccdCaseReference(354L) - .defenceAdmitPartPaymentTimeRouteRequired(IMMEDIATELY) - .respondent2ClaimResponseTypeForSpec(FULL_ADMISSION) - .respondent1(defendant1) - .respondent1Copy(defendant1) - .respondent1DQ( - Respondent1DQ.builder() - .respondToCourtLocation( - RequestedCourt.builder() - .responseCourtLocations(preferredCourt) - .reasonForHearingAtSpecificCourt("Reason") - .build() - ) - .build() - ) - .respondent2DQ( - Respondent2DQ.builder() - .respondToCourtLocation2( - RequestedCourt.builder() - .responseCourtLocations(preferredCourt) - .reasonForHearingAtSpecificCourt("Reason123") - .build() - ) - .build() - ) - .showConditionFlags(EnumSet.of( - DefendantResponseShowTag.CAN_ANSWER_RESPONDENT_1, - DefendantResponseShowTag.CAN_ANSWER_RESPONDENT_2 - )) - .build(); + } + + @Test + void shouldUpdateWitnessEvents_whenInvokedAndUpdateContactDetailsEnabled() { + // Given + LocalDateTime dateTime = LocalDateTime.of(2023, 6, 6, 6, 6, 6); + when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); + when(mockedStateFlow.isFlagSet(any())).thenReturn(true); + when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); + when(toggleService.isUpdateContactDetailsEnabled()).thenReturn(true); + + CaseData caseData = CaseData.builder() + .respondent1(PartyBuilder.builder().individual().build()) + .respondent1Copy(PartyBuilder.builder().individual().build()) + .respondent1DQ(Respondent1DQ.builder() + .respondent1DQWitnesses(Witnesses.builder() + .details(wrapElements(Witness.builder().build())).build()) + .build()) + + .respondent2(PartyBuilder.builder().individual().build()) + .respondent2Copy(PartyBuilder.builder().individual().build()) + .respondent2DQ(Respondent2DQ.builder().build()) + .respondent1ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_DEFENCE) + .respondent2ClaimResponseTypeForSpec(RespondentResponseTypeSpec.FULL_DEFENCE) + .ccdCaseReference(354L) + .respondent1ResponseDate(dateTime).build().toBuilder() + .build(); + + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); + + // Then + assertThat(response.getData().get("respondent1DQWitnesses")).isNotNull(); + assertThat(response.getData().get("respondent2DQWitnesses")).isNull(); + + } + + @Test + void shouldUpdateCorrespondence1_whenProvided() { + // Given + when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); + when(mockedStateFlow.isFlagSet(any())).thenReturn(true); + when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORONE))).thenReturn(true); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(false); + when(toggleService.isCaseFileViewEnabled()).thenReturn(true); + var testDocument = ResponseDocument.builder() + .file(Document.builder().documentUrl("fake-url").documentFileName("file-name").documentBinaryUrl("binary-url").build()).build(); + + CaseData caseData = CaseData.builder() + .respondent1(PartyBuilder.builder().individual().build()) + .respondent1Copy(PartyBuilder.builder().individual().build()) + .respondent1DQ(Respondent1DQ.builder().build()) + .respondent2DQ(Respondent2DQ.builder().build()) + .ccdCaseReference(354L) + .respondent1SpecDefenceResponseDocument(testDocument) + .respondent2SpecDefenceResponseDocument(testDocument) + .isRespondent1(YesOrNo.YES) + .respondentSolicitor1ServiceAddressRequired(YesOrNo.NO) + .respondentSolicitor1ServiceAddress( + Address.builder() + .postCode("new postcode") + .build() + ) + .build(); - List locations = List.of(LocationRefData.builder().build()); - when(locationRefDataService.getCourtLocationsForDefaultJudgments(any())) - .thenReturn(locations); - LocationRefData completePreferredLocation = LocationRefData.builder() - .regionId("regionId") - .epimmsId("epimms") - .courtLocationCode("code") - .build(); - when(courtLocationUtils.findPreferredLocationData( - locations, preferredCourt - )).thenReturn(completePreferredLocation); - StateFlow flow = mock(StateFlow.class); - when(flow.isFlagSet(FlowFlag.TWO_RESPONDENT_REPRESENTATIVES)).thenReturn(true); - when(stateFlowEngine.evaluate(caseData)).thenReturn(flow); - when(coreCaseUserService.userHasCaseRole(anyString(), anyString(), any(CaseRole.class))) - .thenReturn(true); - UserInfo userInfo = UserInfo.builder().uid("798").build(); - when(userService.getUserInfo(anyString())).thenReturn(userInfo); - LocalDate whenWillPay = LocalDate.now().plusDays(5); - given(deadlineExtensionCalculatorService.calculateExtendedDeadline(any(), anyInt())).willReturn(whenWillPay); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); - CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); - // When - AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + // Then + assertThat(response.getData().get("specRespondentCorrespondenceAddressdetails")) + .extracting("PostCode") + .isEqualTo("new postcode"); + assertThat(response.getData().get("respondentSolicitor1ServiceAddress")) + .extracting("PostCode") + .isNull(); + } - // Then - AbstractObjectAssert sent2 = assertThat(response.getData()) - .extracting("respondent2DQRequestedCourt"); - sent2.extracting("caseLocation") - .extracting("region") - .isEqualTo(completePreferredLocation.getRegionId()); - sent2.extracting("caseLocation") - .extracting("baseLocation") - .isEqualTo(completePreferredLocation.getEpimmsId()); - sent2.extracting("responseCourtCode") - .isEqualTo(completePreferredLocation.getCourtLocationCode()); - sent2.extracting("reasonForHearingAtSpecificCourt") - .isEqualTo("Reason123"); - } + @Test + void shouldUpdateCorrespondence1_whenProvided1v2ss() { + // Given + when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); + when(mockedStateFlow.isFlagSet(any())).thenReturn(true); + when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORONE))).thenReturn(true); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(false); + when(toggleService.isCaseFileViewEnabled()).thenReturn(true); + var testDocument = ResponseDocument.builder() + .file(Document.builder().documentUrl("fake-url").documentFileName("file-name").documentBinaryUrl("binary-url").build()).build(); - @Test - void oneVTwo_SecondDefendantReplies() { - // Given - DynamicList locationValues = DynamicList.fromList(List.of("Value 1")); - DynamicList preferredCourt = DynamicList.builder() - .listItems(locationValues.getListItems()) - .value(locationValues.getListItems().get(0)) - .build(); - Party defendant1 = Party.builder() - .type(Party.Type.COMPANY) - .companyName("company") - .build(); - CaseData caseData = CaseData.builder() - .caseAccessCategory(SPEC_CLAIM) - .ccdCaseReference(354L) - .respondent1(defendant1) - .respondent1Copy(defendant1) - .respondent1DQ( - Respondent1DQ.builder() - .respondToCourtLocation( - RequestedCourt.builder() - .responseCourtLocations(preferredCourt) - .reasonForHearingAtSpecificCourt("Reason") - .build() - ) - .build() - ) - .respondent2DQ( - Respondent2DQ.builder() - .respondToCourtLocation2( - RequestedCourt.builder() - .responseCourtLocations(preferredCourt) - .reasonForHearingAtSpecificCourt("Reason123") - .build() - ) - .build() - ) - .showConditionFlags(EnumSet.of( - DefendantResponseShowTag.CAN_ANSWER_RESPONDENT_1, - DefendantResponseShowTag.CAN_ANSWER_RESPONDENT_2 - )) - .build(); - CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + CaseData caseData = CaseData.builder() + .respondent1(PartyBuilder.builder().individual().build()) + .respondent1Copy(PartyBuilder.builder().individual().build()) + .respondent1DQ(Respondent1DQ.builder().build()) + .respondent2DQ(Respondent2DQ.builder().build()) + .ccdCaseReference(354L) + .respondent1SpecDefenceResponseDocument(testDocument) + .respondent2SpecDefenceResponseDocument(testDocument) + .isRespondent1(YesOrNo.YES) + .respondentSolicitor1ServiceAddressRequired(YesOrNo.NO) + .respondentSolicitor1ServiceAddress( + Address.builder() + .postCode("new postcode") + .build() + ) + .respondent2(Party.builder() + .type(Party.Type.COMPANY) + .companyName("Company 3") + .build()) + .respondent2SameLegalRepresentative(YES) + .build(); - List locations = List.of(LocationRefData.builder().build()); - when(locationRefDataService.getCourtLocationsForDefaultJudgments(any())) - .thenReturn(locations); - LocationRefData completePreferredLocation = LocationRefData.builder() - .regionId("regionId") - .epimmsId("epimms") - .courtLocationCode("code") - .build(); - when(courtLocationUtils.findPreferredLocationData( - locations, preferredCourt - )).thenReturn(completePreferredLocation); - StateFlow flow = mock(StateFlow.class); - when(flow.isFlagSet(FlowFlag.TWO_RESPONDENT_REPRESENTATIVES)).thenReturn(true); - when(stateFlowEngine.evaluate(caseData)).thenReturn(flow); - when(coreCaseUserService.userHasCaseRole(anyString(), anyString(), any(CaseRole.class))) - .thenReturn(true); - UserInfo userInfo = UserInfo.builder().uid("798").build(); - when(userService.getUserInfo(anyString())).thenReturn(userInfo); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); - // When - AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler - .handle(params); + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); - // Then - AbstractObjectAssert sent2 = assertThat(response.getData()) - .extracting("respondent2DQRequestedCourt"); - sent2.extracting("caseLocation") - .extracting("region") - .isEqualTo(completePreferredLocation.getRegionId()); - sent2.extracting("caseLocation") - .extracting("baseLocation") - .isEqualTo(completePreferredLocation.getEpimmsId()); - sent2.extracting("responseCourtCode") - .isEqualTo(completePreferredLocation.getCourtLocationCode()); - sent2.extracting("reasonForHearingAtSpecificCourt") - .isEqualTo("Reason123"); - } + // Then + assertThat(response.getData().get("specRespondentCorrespondenceAddressdetails")) + .extracting("PostCode") + .isEqualTo("new postcode"); + assertThat(response.getData().get("respondentSolicitor1ServiceAddress")) + .extracting("PostCode") + .isNull(); + assertEquals( + response.getData().get("specRespondentCorrespondenceAddressdetails"), + response.getData().get("specRespondent2CorrespondenceAddressdetails") + ); + assertEquals( + response.getData().get("specRespondentCorrespondenceAddressRequired"), + response.getData().get("specRespondent2CorrespondenceAddressRequired") + ); } @Test - void shouldNullDocuments_whenInvokedAndCaseFileEnabled() { + void shouldUpdateCorrespondence1_whenProvided1v2ss_withSameResponse() { // Given when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); when(mockedStateFlow.isFlagSet(any())).thenReturn(true); when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); - when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORONE))).thenReturn(true); + when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(false); when(toggleService.isCaseFileViewEnabled()).thenReturn(true); var testDocument = ResponseDocument.builder() - .file(Document.builder().documentUrl("fake-url").documentFileName("file-name").documentBinaryUrl( - "binary-url").build()).build(); + .file(Document.builder().documentUrl("fake-url").documentFileName("file-name").documentBinaryUrl("binary-url").build()).build(); CaseData caseData = CaseData.builder() .respondent1(PartyBuilder.builder().individual().build()) @@ -1231,6 +1598,19 @@ void shouldNullDocuments_whenInvokedAndCaseFileEnabled() { .ccdCaseReference(354L) .respondent1SpecDefenceResponseDocument(testDocument) .respondent2SpecDefenceResponseDocument(testDocument) + .isRespondent1(YesOrNo.YES) + .respondentResponseIsSame(YES) + .respondentSolicitor1ServiceAddressRequired(YesOrNo.NO) + .respondentSolicitor1ServiceAddress( + Address.builder() + .postCode("new postcode") + .build() + ) + .respondent2(Party.builder() + .type(Party.Type.COMPANY) + .companyName("Company 3") + .build()) + .respondent2SameLegalRepresentative(YES) .build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); @@ -1240,12 +1620,24 @@ void shouldNullDocuments_whenInvokedAndCaseFileEnabled() { .handle(params); // Then - assertThat(response.getData().get("respondent1SpecDefenceResponseDocument")).isNull(); - assertThat(response.getData().get("respondent2SpecDefenceResponseDocument")).isNull(); + assertThat(response.getData().get("specRespondentCorrespondenceAddressdetails")) + .extracting("PostCode") + .isEqualTo("new postcode"); + assertThat(response.getData().get("respondentSolicitor1ServiceAddress")) + .extracting("PostCode") + .isNull(); + assertEquals( + response.getData().get("specRespondentCorrespondenceAddressdetails"), + response.getData().get("specRespondent2CorrespondenceAddressdetails") + ); + assertEquals( + response.getData().get("specRespondentCorrespondenceAddressRequired"), + response.getData().get("specRespondent2CorrespondenceAddressRequired") + ); } @Test - void shouldUpdateCorrespondence1_whenProvided() { + void shouldUpdateCorrespondence1_whenProvided1v2ss_withSameResponse_withv2copy() { // Given when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); when(mockedStateFlow.isFlagSet(any())).thenReturn(true); @@ -1254,8 +1646,7 @@ void shouldUpdateCorrespondence1_whenProvided() { when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(false); when(toggleService.isCaseFileViewEnabled()).thenReturn(true); var testDocument = ResponseDocument.builder() - .file(Document.builder().documentUrl("fake-url").documentFileName("file-name").documentBinaryUrl( - "binary-url").build()).build(); + .file(Document.builder().documentUrl("fake-url").documentFileName("file-name").documentBinaryUrl("binary-url").build()).build(); CaseData caseData = CaseData.builder() .respondent1(PartyBuilder.builder().individual().build()) @@ -1266,12 +1657,19 @@ void shouldUpdateCorrespondence1_whenProvided() { .respondent1SpecDefenceResponseDocument(testDocument) .respondent2SpecDefenceResponseDocument(testDocument) .isRespondent1(YesOrNo.YES) - .specAoSRespondentCorrespondenceAddressRequired(YesOrNo.NO) - .specAoSRespondentCorrespondenceAddressdetails( + .respondentResponseIsSame(YES) + .respondentSolicitor1ServiceAddressRequired(YesOrNo.NO) + .respondentSolicitor1ServiceAddress( Address.builder() .postCode("new postcode") .build() ) + .respondent2(Party.builder() + .type(Party.Type.COMPANY) + .companyName("Company 3") + .build()) + .respondent2Copy(PartyBuilder.builder().individual().build()) + .respondent2SameLegalRepresentative(YES) .build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); @@ -1284,13 +1682,21 @@ void shouldUpdateCorrespondence1_whenProvided() { assertThat(response.getData().get("specRespondentCorrespondenceAddressdetails")) .extracting("PostCode") .isEqualTo("new postcode"); - assertThat(response.getData().get("specAoSRespondentCorrespondenceAddressdetails")) + assertThat(response.getData().get("respondentSolicitor1ServiceAddress")) .extracting("PostCode") .isNull(); + assertEquals( + response.getData().get("specRespondentCorrespondenceAddressdetails"), + response.getData().get("specRespondent2CorrespondenceAddressdetails") + ); + assertEquals( + response.getData().get("specRespondentCorrespondenceAddressRequired"), + response.getData().get("specRespondent2CorrespondenceAddressRequired") + ); } @Test - void shouldUpdateCorrespondence1_whenProvided1v2ss() { + void shouldUpdateCorrespondence1_whenProvided1v2ss_withSameResponse_withv2copyAndNoTempAdr() { // Given when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); when(mockedStateFlow.isFlagSet(any())).thenReturn(true); @@ -1299,8 +1705,7 @@ void shouldUpdateCorrespondence1_whenProvided1v2ss() { when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(false); when(toggleService.isCaseFileViewEnabled()).thenReturn(true); var testDocument = ResponseDocument.builder() - .file(Document.builder().documentUrl("fake-url").documentFileName("file-name").documentBinaryUrl( - "binary-url").build()).build(); + .file(Document.builder().documentUrl("fake-url").documentFileName("file-name").documentBinaryUrl("binary-url").build()).build(); CaseData caseData = CaseData.builder() .respondent1(PartyBuilder.builder().individual().build()) @@ -1311,8 +1716,9 @@ void shouldUpdateCorrespondence1_whenProvided1v2ss() { .respondent1SpecDefenceResponseDocument(testDocument) .respondent2SpecDefenceResponseDocument(testDocument) .isRespondent1(YesOrNo.YES) - .specAoSRespondentCorrespondenceAddressRequired(YesOrNo.NO) - .specAoSRespondentCorrespondenceAddressdetails( + .respondentResponseIsSame(YES) + .respondentSolicitor1ServiceAddressRequired(YesOrNo.NO) + .respondentSolicitor1ServiceAddress( Address.builder() .postCode("new postcode") .build() @@ -1321,7 +1727,9 @@ void shouldUpdateCorrespondence1_whenProvided1v2ss() { .type(Party.Type.COMPANY) .companyName("Company 3") .build()) + .respondent2Copy(PartyBuilder.builder().individual().build()) .respondent2SameLegalRepresentative(YES) + .tempAddress2Required(NO) .build(); CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); @@ -1334,7 +1742,7 @@ void shouldUpdateCorrespondence1_whenProvided1v2ss() { assertThat(response.getData().get("specRespondentCorrespondenceAddressdetails")) .extracting("PostCode") .isEqualTo("new postcode"); - assertThat(response.getData().get("specAoSRespondentCorrespondenceAddressdetails")) + assertThat(response.getData().get("respondentSolicitor1ServiceAddress")) .extracting("PostCode") .isNull(); assertEquals( @@ -1356,20 +1764,21 @@ void shouldUpdateCorrespondence2_whenProvided() { when(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).thenReturn(true); when(toggleService.isCaseFileViewEnabled()).thenReturn(true); var testDocument = ResponseDocument.builder() - .file(Document.builder().documentUrl("fake-url").documentFileName("file-name").documentBinaryUrl( - "binary-url").build()).build(); + .file(Document.builder().documentUrl("fake-url").documentFileName("file-name").documentBinaryUrl("binary-url").build()).build(); CaseData caseData = CaseData.builder() .respondent1(PartyBuilder.builder().individual().build()) .respondent1Copy(PartyBuilder.builder().individual().build()) .respondent1DQ(Respondent1DQ.builder().build()) + .respondent2(PartyBuilder.builder().individual().build()) + .respondent2Copy(PartyBuilder.builder().individual().build()) .respondent2DQ(Respondent2DQ.builder().build()) .ccdCaseReference(354L) .respondent1SpecDefenceResponseDocument(testDocument) .respondent2SpecDefenceResponseDocument(testDocument) .isRespondent2(YesOrNo.YES) - .specAoSRespondent2CorrespondenceAddressRequired(YesOrNo.NO) - .specAoSRespondent2CorrespondenceAddressdetails( + .respondentSolicitor2ServiceAddressRequired(YesOrNo.NO) + .respondentSolicitor2ServiceAddress( Address.builder() .postCode("new postcode") .build() @@ -1386,7 +1795,7 @@ void shouldUpdateCorrespondence2_whenProvided() { assertThat(response.getData().get("specRespondent2CorrespondenceAddressdetails")) .extracting("PostCode") .isEqualTo("new postcode"); - assertThat(response.getData().get("specAoSRespondent2CorrespondenceAddressdetails")) + assertThat(response.getData().get("respondentSolicitor2ServiceAddress")) .extracting("PostCode") .isNull(); } @@ -1416,6 +1825,58 @@ void shouldPopulateRespondent2Flag_WhenInvoked() { assertThat(response.getData().get("respondent2DocumentGeneration")).isEqualTo("userRespondent2"); } + @Test + void shouldPopulateRespondent2Flag_WhenInvokedWithSmallClaimExperts_1DQ() { + // Given + when(toggleService.isCaseFileViewEnabled()).thenReturn(true); + when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); + when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); + given(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).willReturn(true); + given(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORONE))).willReturn(false); + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimDetailsNotified() + .respondent2(PartyBuilder.builder().individual().build()) + .addRespondent2(YES) + .respondent1(PartyBuilder.builder().individual().build()) + .respondent1Copy(PartyBuilder.builder().individual().build()) + .respondent1DQ(Respondent1DQ.builder() + .respondToClaimExperts(ExpertDetails.builder().build()).build()) + .respondent2DQ(Respondent2DQ.builder().build()) + .build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); + // Given + assertThat(response.getData().get("respondent2DocumentGeneration")).isEqualTo("userRespondent2"); + } + + @Test + void shouldPopulateRespondent2Flag_WhenInvokedWithSmallClaimExperts_2DQ() { + // Given + when(toggleService.isCaseFileViewEnabled()).thenReturn(true); + when(userService.getUserInfo(anyString())).thenReturn(UserInfo.builder().uid("uid").build()); + when(stateFlowEngine.evaluate(any(CaseData.class))).thenReturn(mockedStateFlow); + given(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORTWO))).willReturn(true); + given(coreCaseUserService.userHasCaseRole(any(), any(), eq(RESPONDENTSOLICITORONE))).willReturn(false); + CaseData caseData = CaseDataBuilder.builder() + .atStateClaimDetailsNotified() + .respondent2(PartyBuilder.builder().individual().build()) + .addRespondent2(YES) + .respondent1(PartyBuilder.builder().individual().build()) + .respondent1Copy(PartyBuilder.builder().individual().build()) + .respondent2DQ(Respondent2DQ.builder() + .respondToClaimExperts2(ExpertDetails.builder().build()).build()) + .respondent1DQ(Respondent1DQ.builder().build()) + .build(); + CallbackParams params = callbackParamsOf(caseData, ABOUT_TO_SUBMIT); + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); + // Given + assertThat(response.getData().get("respondent2DocumentGeneration")).isEqualTo("userRespondent2"); + } + @Test void shouldNotPopulateRespondent2Flag_WhenInvoked() { // Given @@ -1478,6 +1939,26 @@ void shouldSetMultiPartyResponseTypeFlags_Counter_Admit_OR_Admit_Part_combinatio .isEqualTo("COUNTER_ADMIT_OR_ADMIT_PART"); } + @Test + void shouldSetMultiPartyResponseTypeFlags_Counter_Admit_OR_Admit_Part_combination2_CanAddApplicant2() { + // Given + CaseData caseData = CaseDataBuilder.builder().atStateRespondent2v1BothNotFullDefence_CounterClaimX2() + .addApplicant2(YES) + .respondent1ClaimResponseTypeForSpec(FULL_ADMISSION) + .respondent1ClaimResponseTypeForSpec(FULL_ADMISSION) + .build(); + + CallbackParams params = callbackParamsOf(caseData, MID, PAGE_ID); + + // When + var response = (AboutToStartOrSubmitCallbackResponse) handler.handle(params); + + // Then + assertThat(response.getData()).extracting("multiPartyResponseTypeFlags") + .isEqualTo("COUNTER_ADMIT_OR_ADMIT_PART"); + } + + /** * if solicitor says that each defendant gets their response but then chooses the same * option from full defence/part admit/full admit/counterclaim, then it is not different response. @@ -1568,7 +2049,6 @@ void shouldReturnError_whenWitnessRequiredAndNullDetails() { void shouldReturnNoError_whenWitnessRequiredAndDetailsProvided() { // Given List> testWitness = wrapElements(Witness.builder().name("test witness").build()); - Witnesses witnesses = Witnesses.builder().witnessesToAppear(YES).details(testWitness).build(); CaseData caseData = CaseDataBuilder.builder() .respondent1DQ(Respondent1DQ.builder().build()) .respondent1DQWitnessesRequiredSpec(YES) @@ -1657,9 +2137,6 @@ void specificSummary_whenPartialAdmitNotPay() { // When SubmittedCallbackResponse response = (SubmittedCallbackResponse) handler.handle(params); - LocalDateTime responseDeadline = caseData.getApplicant1ResponseDeadline(); - String claimNumber = caseData.getLegacyCaseReference(); - // Then assertThat(response.getConfirmationBody()) .contains(caseData.getApplicant1().getPartyName()) @@ -2067,12 +2544,12 @@ void whenProvided_thenValidateCorrespondence1() { CaseData caseData = CaseDataBuilder.builder().atStateClaimDetailsNotified().build() .toBuilder() .isRespondent1(YES) - .specAoSRespondentCorrespondenceAddressRequired(YesOrNo.NO) - .specAoSRespondentCorrespondenceAddressdetails(Address.builder() + .respondentSolicitor1ServiceAddressRequired(YesOrNo.NO) + .respondentSolicitor1ServiceAddress(Address.builder() .postCode("postal code") .build()) .build(); - CallbackParams params = callbackParamsOf(caseData, MID, "confirm-details"); + CallbackParams params = callbackParamsOf(caseData, MID, "specCorrespondenceAddress"); when(postcodeValidator.validate("postal code")).thenReturn(Collections.emptyList()); // When @@ -2089,12 +2566,12 @@ void whenProvided_thenValidateCorrespondence2() { CaseData caseData = CaseDataBuilder.builder().atStateClaimDetailsNotified().build() .toBuilder() .isRespondent2(YES) - .specAoSRespondent2CorrespondenceAddressRequired(YesOrNo.NO) - .specAoSRespondent2CorrespondenceAddressdetails(Address.builder() - .postCode("postal code") - .build()) + .respondentSolicitor2ServiceAddressRequired(YesOrNo.NO) + .respondentSolicitor2ServiceAddress(Address.builder() + .postCode("postal code") + .build()) .build(); - CallbackParams params = callbackParamsOf(caseData, MID, "confirm-details"); + CallbackParams params = callbackParamsOf(caseData, MID, "specCorrespondenceAddress"); when(postcodeValidator.validate("postal code")).thenReturn(Collections.emptyList()); // When @@ -2324,10 +2801,55 @@ public void shouldThrowError_whenValidateRespondentExpertsMultipartyWithNoUnavai // Then assertThat(response.getErrors()).isNotEmpty(); } + + @Test + public void shouldThrowError_whenValidateRespondentExpertsMultipartyWithNoUnavailableDates_DisputesTheClaim() { + // Given + CaseData caseData = CaseDataBuilder.builder().atStateClaimDetailsNotified() + .responseClaimTrack(SpecJourneyConstantLRSpec.DISPUTES_THE_CLAIM) + .respondent1DQ(Respondent1DQ.builder() + .respondent1DQHearingSmallClaim(SmallClaimHearing.builder().unavailableDatesRequired( + YES).build()).build()) + .build(); + List errors = Collections.singletonList("error 1"); + Mockito.when(dateValidator.validateFastClaimHearing(any())).thenReturn(errors); + CallbackParams params = callbackParamsOf(caseData, MID, "validate-unavailable-dates"); + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); + + // Then + assertThat(response.getErrors()).isNotEmpty(); + } + + @Test + public void shouldThrowError_whenValidateRespondentExpertsMultipartyWithNoUnavailableDates_V2() { + // Given + CaseData caseData = CaseDataBuilder.builder().atStateClaimDetailsNotified() + .responseClaimTrack(SpecJourneyConstantLRSpec.SMALL_CLAIM) + .respondent1DQ(Respondent1DQ.builder() + .respondent1DQHearingSmallClaim(SmallClaimHearing.builder().unavailableDatesRequired( + YES).build()).build()) + .respondent2DQ(Respondent2DQ.builder() + .respondent2DQHearingSmallClaim(SmallClaimHearing.builder().unavailableDatesRequired( + YES).build()).build()) + .isRespondent2(YES) + .build(); + List errors = Collections.singletonList("error 1"); + Mockito.when(dateValidator.validateSmallClaimsHearing(any())).thenReturn(errors); + CallbackParams params = callbackParamsOf(caseData, MID, "validate-unavailable-dates"); + // When + AboutToStartOrSubmitCallbackResponse response = (AboutToStartOrSubmitCallbackResponse) handler + .handle(params); + + // Then + assertThat(response.getErrors()).isNotEmpty(); + } } @Test void handleEventsReturnsTheExpectedCallbackEvents() { assertThat(handler.handledEvents()).containsOnly(DEFENDANT_RESPONSE_SPEC); } + }