Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,8 @@ public static List<DefendantProblem> validateDefendantErrors(final CaseDetails c
final DefendantsWithReferenceData defendantsWithReferenceData,
final ReferenceDataQueryService referenceDataQueryService,
final Stream.Builder<Object> builder,
final Boolean isGroupCase, final boolean isMCCWithListNewHearing, final boolean isInactiveMigratedCase,final Boolean isCivil) {
final boolean isMCCWithListNewHearing, final boolean isInactiveMigratedCase,final Boolean isCivil,
final Boolean isGroupCase) {
final List<DefendantProblem> defendantErrors = new ArrayList<>();

defendantsWithReferenceData.getDefendants().forEach(defendant -> {
Expand All @@ -228,7 +229,7 @@ public static List<DefendantProblem> validateDefendantErrors(final CaseDetails c
final String initiationCode = defendantInitiationCode != null && isValidInitiationCode(defendantInitiationCode) ? defendant.getInitiationCode() : caseDetails.getInitiationCode();

final List<Problem> defendantProblemList =
validate(defendantWithReferenceData, referenceDataQueryService, getDefendantValidationRules(initiationCode, channel,isCivil));
validate(defendantWithReferenceData, referenceDataQueryService, getDefendantValidationRules(initiationCode, channel, isCivil, isGroupCase));

if (!defendantProblemList.isEmpty()) {
defendantErrors.add(defendantProblem()
Expand Down Expand Up @@ -258,7 +259,7 @@ private static boolean isValidInitiationCode(final String initiationCode) {
.anyMatch(code -> initiationCode.equalsIgnoreCase(String.valueOf(code)));
}

public static List<DefendantProblem> validateDefendantWarnings(final DefendantsWithReferenceData defendantsWithReferenceData, final String initiationCode) {
public static List<DefendantProblem> validateDefendantWarnings(final DefendantsWithReferenceData defendantsWithReferenceData, final String initiationCode, final Channel channel) {

final ReferenceDataValidationContext referenceDataValidationContext = ReferenceDataValidationContext.newInstance(defendantsWithReferenceData.getReferenceDataVO().getOffenceReferenceData(), defendantsWithReferenceData.getReferenceDataVO().getCountryNationalityReferenceData());

Expand All @@ -269,7 +270,7 @@ public static List<DefendantProblem> validateDefendantWarnings(final DefendantsW
final List<Problem> validationWarnings = validate(
defendant,
referenceDataValidationContext,
CcProsecutionWarningRuleProvider.getWarningRules(initiationCode));
CcProsecutionWarningRuleProvider.getWarningRules(initiationCode, channel));
if (!validationWarnings.isEmpty()) {
defendantProblems.add(defendantProblem()
.withProblems(validationWarnings)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ private List<DefendantProblem> validateDefendants(final GroupProsecutionList gro
return groupProsecutionList.getGroupProsecutionWithReferenceDataList().stream()
.flatMap(groupProsecutionWithReferenceData -> {
final DefendantsWithReferenceData defendantsWithReferenceData = defendantsWithReferenceDataMap.get(groupProsecutionWithReferenceData.getGroupProsecution().getCaseDetails().getCaseId());
final List<DefendantProblem> errors = validateDefendantErrors(groupProsecutionWithReferenceData.getGroupProsecution().getCaseDetails(), groupProsecutionList.getChannel(), defendantsWithReferenceData, referenceDataQueryService, builder, Boolean.TRUE, false, false,isCivil);
final List<DefendantProblem> errors = validateDefendantErrors(groupProsecutionWithReferenceData.getGroupProsecution().getCaseDetails(), groupProsecutionList.getChannel(), defendantsWithReferenceData, referenceDataQueryService, builder, false, false,isCivil, Boolean.TRUE);
return errors.stream();
}).toList();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ public Stream<Object> receiveSjpProsecution(ProsecutionWithReferenceData prosecu
caseProblems.add(newProblem(DUPLICATED_PROSECUTION, "urn", prosecution.getCaseDetails().getProsecutorCaseReference()));
}
final Boolean isCivil = prosecution.getIsCivil();
final List<Problem> defendantProblems = validate(defendantWithReferenceData, referenceDataQueryService, getDefendantValidationRules(caseInitiationCode, prosecutionChannel,isCivil));
final List<Problem> defendantProblems = validate(defendantWithReferenceData, referenceDataQueryService, getDefendantValidationRules(caseInitiationCode, prosecutionChannel,isCivil, Boolean.FALSE));
final List<Problem> rejections = newArrayList(concat(caseProblems, defendantProblems));
if (!rejections.isEmpty()) {
builder.accept(new SjpProsecutionRejected(rejections, prosecutionWithReferenceData.getExternalId(), prosecution));
Expand Down Expand Up @@ -508,7 +508,7 @@ private Stream<Object> receiveCCCase(final ProsecutionWithReferenceData received

final Boolean isCivil = Optional.ofNullable(receivedProsecutionWithReferenceData.getProsecution().getIsCivil()).orElse(false);

final List<Problem> caseProblems = validate(prosecutionWithReferenceData, referenceDataQueryService, getCaseValidationRules(receivedInitiationCode));
final List<Problem> caseProblems = validate(prosecutionWithReferenceData, referenceDataQueryService, getCaseValidationRules(receivedInitiationCode, isCivil));
boolean isMCCWithListNewHearing = MCC.equals(prosecutionChannel) && Objects.nonNull(prosecutionWithReferenceData.getProsecution().getListNewHearing());

//ACTIVE // INACTIVE
Expand All @@ -519,7 +519,7 @@ private Stream<Object> receiveCCCase(final ProsecutionWithReferenceData received
.filter(status -> MigrationCaseStatus.INACTIVE == status)
.isPresent();

final List<DefendantProblem> defendantErrors = validateDefendantErrors(prosecution.getCaseDetails(), prosecutionChannel, defendantsWithReferenceData, referenceDataQueryService, builder, Boolean.FALSE, isMCCWithListNewHearing,isStandaloneCaseWithoutHearing, isCivil);
final List<DefendantProblem> defendantErrors = validateDefendantErrors(prosecution.getCaseDetails(), prosecutionChannel, defendantsWithReferenceData, referenceDataQueryService, builder, isMCCWithListNewHearing,isStandaloneCaseWithoutHearing, isCivil, Boolean.FALSE);

if ((messageFromCppiOrMccOrCivil && prosecutionReceived) || !noDefendantsParkedForSummonsApplicationApproval) {
caseProblems.add(newProblem(DUPLICATED_PROSECUTION, "urn", prosecution.getCaseDetails().getProsecutorCaseReference()));
Expand Down Expand Up @@ -755,7 +755,7 @@ private Stream<Object> processWithoutProblems(final ProsecutionWithReferenceData
final Prosecution prosecution = prosecutionWithReferenceData.getProsecution();
final String incomingInitiationCode = prosecution.getCaseDetails().getInitiationCode();
final Channel prosecutionChannel = prosecution.getChannel();
final List<DefendantProblem> defendantWarningsForIncomingMessage = prosecutionChannel == SPI ? List.of() : validateDefendantWarnings(defendantsWithReferenceData, incomingInitiationCode);
final List<DefendantProblem> defendantWarningsForIncomingMessage = prosecutionChannel == SPI ? List.of() : validateDefendantWarnings(defendantsWithReferenceData, incomingInitiationCode, prosecutionChannel);

if (incomingInitiationCode.equals(SUMMONS_INITIATION_CODE)) {
return apply(builder.add(defendantsParkedForSummonsApplicationApproval()
Expand Down Expand Up @@ -786,7 +786,7 @@ public Stream<Object> associateEnterpriseId(final String enterpriseId) {
}

private Stream<Object> addDefendants(final UUID caseId, final UUID externalId, final DefendantsWithReferenceData defendantsWithReferenceData, List<DefendantProblem> defendantProblemList, final Builder<Object> builder) {
final List<DefendantProblem> defendantWarningsList = channel == CPPI ? validateDefendantWarnings(defendantsWithReferenceData, this.caseDetails.getInitiationCode()) : null;
final List<DefendantProblem> defendantWarningsList = channel == CPPI ? validateDefendantWarnings(defendantsWithReferenceData, this.caseDetails.getInitiationCode(), channel) : null;
final List<Defendant> validDefendantList = channel == SPI ? validDefendants(defendantsWithReferenceData, defendantProblemList) : defendantsWithReferenceData.getDefendants();
final String initiationCodeForSameCaseWithNewDefendant = defendantsWithReferenceData.getCaseDetails().getInitiationCode();
if (!validDefendantList.isEmpty()) {
Expand Down Expand Up @@ -839,7 +839,7 @@ private List<Defendant> validDefendants(final DefendantsWithReferenceData defend

public Stream<Object> addErrorCorrectedDefendantsForSPI(final UUID caseId, final UUID externalId, final DefendantsWithReferenceData defendantsWithReferenceData, final ReferenceDataQueryService referenceDataQueryService,final Boolean isCivil) {
final Builder<Object> builder = builder();
final List<DefendantProblem> defendantErrors = validateDefendantErrors(this.caseDetails, SPI, defendantsWithReferenceData, referenceDataQueryService, builder, Boolean.FALSE, false, false,isCivil);
final List<DefendantProblem> defendantErrors = validateDefendantErrors(this.caseDetails, SPI, defendantsWithReferenceData, referenceDataQueryService, builder, false, false,isCivil, Boolean.FALSE);
return addDefendants(caseId, externalId, defendantsWithReferenceData, defendantErrors, builder);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public enum ProblemCode {
DATE_OF_HEARING_IN_THE_PAST,
DATE_OF_HEARING_EARLIER_THAN_OFFENCE_COMMITTED_DATE,
DATE_OF_HEARING_NOT_AVAILABLE,
DATE_OF_HEARING_MORE_THAN_31DAYS_IN_PAST,
COURT_HEARING_LOCATION_OUCODE_INVALID,
DEFENDANT_ADDITIONAL_NATIONALITY_INVALID,
DEFENDANT_PRIMARY_EMAIL_ADDRESS_INVALID,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import uk.gov.moj.cpp.prosecution.casefile.validation.rules.defendant.CroNumberSpiValidationRule;
import uk.gov.moj.cpp.prosecution.casefile.validation.rules.defendant.CroNumberValidationRule;
import uk.gov.moj.cpp.prosecution.casefile.validation.rules.defendant.CustodyStatusValidationAndEnricherRule;
import uk.gov.moj.cpp.prosecution.casefile.validation.rules.defendant.DateOfHearingMoreThan31DaysInPastValidationAndEnricherRule;
import uk.gov.moj.cpp.prosecution.casefile.validation.rules.defendant.DateOfHearingPastDateValidationAndEnricherRule;
import uk.gov.moj.cpp.prosecution.casefile.validation.rules.defendant.DateOfHearingValidationAndEnricherRule;
import uk.gov.moj.cpp.prosecution.casefile.validation.rules.defendant.DefendantDateOfBirthValidationRule;
Expand Down Expand Up @@ -276,6 +277,27 @@ public class CcProsecutionValidationRuleProvider {
SUMMONS.getCode(), GROUP_CIVIL_DEFENDANT_RULE_SET,
OTHER.getCode(), GROUP_CIVIL_DEFENDANT_RULE_SET);

private static final List<ValidationRule<DefendantWithReferenceData, ReferenceDataQueryService>> SINGLE_CIVIL_CASE_ONLY_RULE_SET = unmodifiableList(asList(
new ArrestDateValidationRuleForCivil(),
new DefendantDateOfBirthValidationRule(),
new ParentGuardianDateOfBirthValidationRule(),
new CourtHearingLocationValidationRule(),
new OffenderCodeValidationAndEnricherRule(),
new OffenceLocationValidationAndEnricherRule(),
new NationalityValidationAndEnricherRule(),
new VehicleCodeValidationAndEnricherRule(),
new OffenceCodeValidationAndEnricherRule(),
new CourtReceivedFromCodeCourtValidationRules(),
new CourtReceivedToCodeCourtValidationRules(),
new HearingTypeCodeValidationRule(),
new LaidDateValidationRule(),
new DateOfHearingMoreThan31DaysInPastValidationAndEnricherRule()
));

private static final Map<String, List<ValidationRule<DefendantWithReferenceData, ReferenceDataQueryService>>> defendantValidationMapForSingleCivilCases = of(
SUMMONS.getCode(), Stream.of(SINGLE_CIVIL_CASE_ONLY_RULE_SET, COMMON_DEFENDANT_RULE_SET, SPI_DEFENDANT_RULE_SET).flatMap(Collection::stream).toList(),
OTHER.getCode(), Stream.of(SINGLE_CIVIL_CASE_ONLY_RULE_SET, COMMON_DEFENDANT_RULE_SET, SPI_DEFENDANT_RULE_SET).flatMap(Collection::stream).toList());

private static final Map<String, List<ValidationRule<DefendantWithReferenceData, ReferenceDataQueryService>>> defendantValidationMapMCCCivil = of(
SUMMONS.getCode(), Stream.of(GROUP_CIVIL_DEFENDANT_RULE_SET,COMMON_DEFENDANT_RULE_SET, NON_POLICE_DEFENDANT_RULE_SET, SUMMONS_DEFENDANT_RULE_MCC_SET).flatMap(Collection::stream).toList(),
OTHER.getCode(), Stream.of(GROUP_CIVIL_DEFENDANT_RULE_SET,COMMON_DEFENDANT_RULE_SET, NON_POLICE_DEFENDANT_RULE_SET, CHARGE_DEFENDANT_RULE_SET_CIVIL).flatMap(Collection::stream).toList());
Expand All @@ -296,9 +318,12 @@ public static List<ValidationRule<ProsecutionWithReferenceData, ReferenceDataQue

public static List<ValidationRule<DefendantWithReferenceData, ReferenceDataQueryService>> getDefendantValidationRules(final String defendantInitiationCode,
final Channel channel,
final Boolean isCivil) {
final Boolean isCivil,
final Boolean isGroupCase) {
if (nonNull(channel) && CIVIL.equals(channel) && nonNull(isCivil) && (isCivil)) {
return getValidationRules(defendantInitiationCode, COMMON_DEFENDANT_RULE_SET, SPI_DEFENDANT_RULE_SET, defendantValidationMapForGroupCivilCases);
final Map<String, List<ValidationRule<DefendantWithReferenceData, ReferenceDataQueryService>>> civilMap =
(nonNull(isGroupCase) && isGroupCase) ? defendantValidationMapForGroupCivilCases : defendantValidationMapForSingleCivilCases;
return getValidationRules(defendantInitiationCode, COMMON_DEFENDANT_RULE_SET, SPI_DEFENDANT_RULE_SET, civilMap);
} else if (nonNull(channel) && MCC.equals(channel) && nonNull(isCivil) && (isCivil)) {
return getValidationRules(defendantInitiationCode, COMMON_DEFENDANT_RULE_SET, SPI_DEFENDANT_RULE_SET, defendantValidationMapMCCCivil);
} else if (nonNull(channel) && SPI.equals(channel)) {
Expand Down Expand Up @@ -334,6 +359,13 @@ public static List<ValidationRule<ProsecutionWithReferenceData, ReferenceDataQue
));
}

public static List<ValidationRule<ProsecutionWithReferenceData, ReferenceDataQueryService>> getCaseValidationRules(final String caseInitiationCode, final Boolean isCivil) {
if (nonNull(isCivil) && isCivil) {
return getCaseValidationRulesForCivil(caseInitiationCode);
}
return getCaseValidationRules(caseInitiationCode);
}

private static List<ValidationRule<DefendantWithReferenceData, ReferenceDataQueryService>> getValidationRules(
final String defendantInitiationCode,
final List<ValidationRule<DefendantWithReferenceData, ReferenceDataQueryService>> commonDefendantRules,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@


import static java.util.Collections.emptyList;
import static uk.gov.moj.cpp.prosecution.casefile.json.schemas.Channel.CIVIL;

import uk.gov.moj.cpp.prosecution.casefile.json.schemas.Channel;
import uk.gov.moj.cpp.prosecution.casefile.json.schemas.Defendant;
import uk.gov.moj.cpp.prosecution.casefile.validation.context.ReferenceDataValidationContext;
import uk.gov.moj.cpp.prosecution.casefile.validation.rules.ValidationRule;
import uk.gov.moj.cpp.prosecution.casefile.validation.rules.warning.ImprisonableOffenceValidationRule;
import uk.gov.moj.cpp.prosecution.casefile.validation.rules.warning.OffenceInEffectOnOffenceCommittedDateValidationRule;
import uk.gov.moj.cpp.prosecution.casefile.validation.rules.warning.OffenceOutOfTimeValidationRule;

Expand All @@ -20,11 +23,19 @@ public class CcProsecutionWarningRuleProvider {
OffenceOutOfTimeValidationRule.INSTANCE,
OffenceInEffectOnOffenceCommittedDateValidationRule.INSTANCE);

private static final List<ValidationRule<Defendant, ReferenceDataValidationContext>> CIVIL_WARNING_RULES =
ImmutableList.of(
OffenceOutOfTimeValidationRule.INSTANCE,
OffenceInEffectOnOffenceCommittedDateValidationRule.INSTANCE,
ImprisonableOffenceValidationRule.INSTANCE);

private CcProsecutionWarningRuleProvider() {
}

public static List<ValidationRule<Defendant, ReferenceDataValidationContext>> getWarningRules(final String caseInitiationCode) {
if("C".equals(caseInitiationCode) || "Q".equals(caseInitiationCode)) {
public static List<ValidationRule<Defendant, ReferenceDataValidationContext>> getWarningRules(final String caseInitiationCode, final Channel channel) {
if (CIVIL.equals(channel) && ("O".equals(caseInitiationCode) || "S".equals(caseInitiationCode))) {
return CIVIL_WARNING_RULES;
} else if ("C".equals(caseInitiationCode) || "Q".equals(caseInitiationCode)) {
return WARNING_RULES;
} else {
return emptyList();
Expand Down
Loading
Loading