Skip to content

Commit 3b455d7

Browse files
CCT-2357 code merge (#101)
1 parent b736e66 commit 3b455d7

File tree

235 files changed

+10607
-1211
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

235 files changed

+10607
-1211
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
<sonar.report.export.path>sonar-report.json</sonar.report.export.path>
3838
<sonar.scm.provider>git</sonar.scm.provider>
3939
<mvn.site.url>file://${project.build.directory}/site</mvn.site.url>
40-
<coredomain.version>17.103.10</coredomain.version>
40+
<coredomain.version>17.103.11</coredomain.version>
4141
<referencedata.version>17.103.122</referencedata.version>
4242
<notification.notify.version>17.0.38</notification.notify.version>
4343
<systemdocgenerator.version>17.103.103</systemdocgenerator.version>

results-domain/results-domain-aggregate/src/main/java/uk/gov/moj/cpp/results/domain/aggregate/HearingFinancialResultsAggregate.java

Lines changed: 66 additions & 71 deletions
Large diffs are not rendered by default.

results-domain/results-domain-aggregate/src/main/java/uk/gov/moj/cpp/results/domain/aggregate/MarkedAggregateSendEmailEventBuilder.java

Lines changed: 35 additions & 54 deletions
Large diffs are not rendered by default.

results-domain/results-domain-aggregate/src/main/java/uk/gov/moj/cpp/results/domain/aggregate/NCESDecisionHelper.java

Lines changed: 66 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,21 @@
77
import static org.apache.commons.lang3.ObjectUtils.isNotEmpty;
88
import static uk.gov.justice.hearing.courts.OffenceResultsDetails.offenceResultsDetails;
99
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.AACA;
10+
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.AACD;
1011
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.AASA;
1112
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.AASD;
13+
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.ACSD;
1214
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.APA;
1315
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.APPEAL;
1416
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.ASV;
1517
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.AW;
1618
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.DISM;
1719
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.G;
20+
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.REOPEN;
1821
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.RFSD;
1922
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.ROPENED;
2023
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.SENTENCE_VARIED;
24+
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.STAT_DEC;
2125
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.STDEC;
2226
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.SV_SENTENCE_VARIED;
2327
import static uk.gov.moj.cpp.results.domain.aggregate.application.NCESDecisionConstants.WDRN;
@@ -36,10 +40,18 @@
3640
import java.util.Objects;
3741
import java.util.UUID;
3842

43+
import com.google.common.collect.ImmutableMap;
44+
3945
public class NCESDecisionHelper {
4046

41-
public static boolean hasSentenceVaried(final List<NewOffenceByResult> newResultByOffence) {
42-
return newResultByOffence.stream().anyMatch(newOffenceByResult ->
47+
private static final List<String> application_accepted_result_codes = asList(G, STDEC, ROPENED, AACA, AASA);
48+
private static final List<String> stadec_reoopen_denied_result_codes = asList(DISM, RFSD, WDRN);
49+
private static final List<String> appeal_denied_result_codes = asList(ASV, APA, AW, AASD, RFSD, DISM, AACD, ACSD, WDRN);
50+
private static final List<String> application_denied_result_codes = asList(APA, AW, AASD, RFSD, DISM, AACD, ACSD, WDRN);
51+
52+
53+
public static boolean hasSentenceVaried(final List<NewOffenceByResult> newOffenceByResults) {
54+
return newOffenceByResults.stream().anyMatch(newOffenceByResult ->
4355
newOffenceByResult.getDetails().contains(SV_SENTENCE_VARIED));
4456
}
4557

@@ -84,7 +96,7 @@ public static boolean isNewAppealApplicationDenied(final HearingFinancialResultR
8496
.filter(offence -> nonNull(offence.getApplicationType()) && APPEAL.equalsIgnoreCase(offence.getApplicationType()))
8597
.filter(offence -> nonNull(offence.getApplicationId()) && NCESDecisionConstants.APPLICATION_SUBJECT.get(offence.getApplicationType()).containsKey(offence.getResultCode()))
8698
.filter(offence -> Objects.isNull(offence.getAmendmentDate()))
87-
.anyMatch(offence -> asList(ASV, APA, AW, AASD, RFSD, DISM).contains(offence.getResultCode()));
99+
.anyMatch(offence -> appeal_denied_result_codes.contains(offence.getResultCode()));
88100
}
89101

90102
public static boolean isNewApplicationGranted(final HearingFinancialResultRequest hearingFinancialResultRequest) {
@@ -93,28 +105,65 @@ public static boolean isNewApplicationGranted(final HearingFinancialResultReques
93105
.filter(offence -> nonNull(offence.getApplicationType()))
94106
.filter(offence -> NCESDecisionConstants.APPLICATION_SUBJECT.get(offence.getApplicationType()).containsKey(offence.getResultCode()))
95107
.filter(offence -> Objects.isNull(offence.getAmendmentDate()))
96-
.anyMatch(offence -> asList(G, STDEC, ROPENED, AACA, AASA).contains(offence.getResultCode()));
108+
.anyMatch(offence -> application_accepted_result_codes.contains(offence.getResultCode()));
97109
}
98110

99-
public static boolean isApplicationDenied(final List<OffenceResultsDetails> offenceResultsDetails) {
100-
return isNotEmpty(offenceResultsDetails) && offenceResultsDetails.stream()
101-
.filter(offence -> nonNull(offence.getApplicationType()))
102-
.filter(offence -> !APPEAL.equalsIgnoreCase(offence.getApplicationType()))
103-
.anyMatch(offence -> asList(RFSD, WDRN, DISM).contains(offence.getResultCode()));
111+
public static boolean isNewStatdecReopenApplicationDenied(final HearingFinancialResultRequest hearingFinancialResultRequest) {
112+
return hearingFinancialResultRequest
113+
.getOffenceResults().stream()
114+
.filter(result -> nonNull(result.getApplicationId()))
115+
.filter(offence -> nonNull(offence.getApplicationType()) && STAT_DEC.equalsIgnoreCase(offence.getApplicationType()) || REOPEN.equalsIgnoreCase(offence.getApplicationType()))
116+
.filter(offence -> NCESDecisionConstants.APPLICATION_SUBJECT.get(offence.getApplicationType()).containsKey(offence.getResultCode()))
117+
.filter(offence -> Objects.isNull(offence.getAmendmentDate()))
118+
.anyMatch(offence -> stadec_reoopen_denied_result_codes.contains(offence.getResultCode()));
104119
}
105120

106-
public static boolean isAppealApplicationWithNoOffenceResults(
107-
final UUID currentApplicationId,
108-
final Map<UUID, List<OffenceResultsDetails>> prevApplicationOffenceResultsMap,
109-
final Map<UUID, List<OffenceResultsDetails>> prevApplicationResultsDetails) {
121+
/**
122+
* Overloaded check which also checks previous application results to avoid sending duplicate application notifications
123+
* when a notification for the same application has already been generated from aggregate state.
124+
*/
125+
public static boolean isNewApplicationGranted(final HearingFinancialResultRequest hearingFinancialResultRequest,
126+
final Map<UUID, List<OffenceResultsDetails>> applicationResultsDetails) {
127+
128+
final boolean incomingRequestIndicatesGrant = isNewApplicationGranted(hearingFinancialResultRequest);
129+
if (!incomingRequestIndicatesGrant) {
130+
return false;
131+
}
132+
133+
if (applicationResultsDetails == null || applicationResultsDetails.isEmpty()) {
134+
return true;
135+
}
136+
137+
138+
final boolean notificationAlreadySent = hearingFinancialResultRequest.getOffenceResults().stream()
139+
.filter(result -> nonNull(result.getApplicationId()))
140+
.filter(result -> Objects.isNull(result.getAmendmentDate()))
141+
.filter(result -> nonNull(result.getApplicationType()))
142+
.filter(result -> NCESDecisionConstants.APPLICATION_SUBJECT.get(result.getApplicationType()).containsKey(result.getResultCode()))
143+
.anyMatch(result -> {
144+
return isApplicationAlreadyGranted(applicationResultsDetails, result);
145+
});
146+
147+
return !notificationAlreadySent;
148+
}
110149

111-
final List<OffenceResultsDetails> offenceResultsDetails = prevApplicationResultsDetails.get(currentApplicationId);
150+
private static boolean isApplicationAlreadyGranted(final Map<UUID, List<OffenceResultsDetails>> applicationResultsDetails, final OffenceResults result) {
112151

113-
final List<OffenceResultsDetails> offenceResultsOnTheApplication = prevApplicationOffenceResultsMap.get(currentApplicationId);
152+
final List<OffenceResultsDetails> prevAppList = applicationResultsDetails.get(result.getApplicationId());
153+
if (prevAppList == null || prevAppList.isEmpty()) {
154+
return false;
155+
}
156+
return prevAppList.stream()
157+
.map(OffenceResultsDetails::getResultCode)
158+
.filter(Objects::nonNull)
159+
.anyMatch(application_accepted_result_codes::contains);
160+
}
161+
162+
public static boolean isApplicationDenied(final List<OffenceResultsDetails> offenceResultsDetails) {
114163
return isNotEmpty(offenceResultsDetails) && offenceResultsDetails.stream()
115164
.filter(offence -> nonNull(offence.getApplicationType()))
116-
.anyMatch(offence -> APPEAL.equalsIgnoreCase(offence.getApplicationType()))
117-
&& (isNull(offenceResultsOnTheApplication) || offenceResultsOnTheApplication.isEmpty());
165+
.filter(offence -> NCESDecisionConstants.APPLICATION_SUBJECT.get(offence.getApplicationType()).containsKey(offence.getResultCode()))
166+
.anyMatch(offence -> application_denied_result_codes.contains(offence.getResultCode()));
118167
}
119168

120169
public static NewOffenceByResult buildNewImpositionOffenceDetailsFromRequest(final OffenceResults offencesFromRequest, final Map<UUID, String> offenceDateMap) {

results-domain/results-domain-aggregate/src/main/java/uk/gov/moj/cpp/results/domain/aggregate/finresultsnotifications/ResultNotificationRule.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import uk.gov.moj.cpp.results.domain.event.MarkedAggregateSendEmailWhenAccountReceived;
1414
import uk.gov.moj.cpp.results.domain.event.NewOffenceByResult;
1515

16-
import java.util.Collection;
1716
import java.util.LinkedList;
1817
import java.util.List;
1918
import java.util.Map;
@@ -91,12 +90,12 @@ public boolean isAmendmentFlow() {
9190
return request.getOffenceResults().stream().anyMatch(o -> nonNull(o.getAmendmentDate()));
9291
}
9392

94-
public boolean hasFinancialAmendments() {
93+
public boolean hasAccountCorrelation() {
9594
return nonNull(request.getAccountCorrelationId());
9695
}
9796

9897
public boolean isFinancial() {
99-
return request.getOffenceResults().stream().anyMatch(o -> o.getIsFinancial());
98+
return request.getOffenceResults().stream().anyMatch(OffenceResults::getIsFinancial);
10099
}
101100

102101
public boolean isCaseAmendment() {

results-domain/results-domain-aggregate/src/main/java/uk/gov/moj/cpp/results/domain/aggregate/finresultsnotifications/ResultNotificationRuleEngine.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import uk.gov.moj.cpp.results.domain.aggregate.finresultsnotifications.rules.applications.result.NewNonAppealAppsDeniedNotificationRule;
1313
import uk.gov.moj.cpp.results.domain.aggregate.finresultsnotifications.rules.cases.amendments.CaseAmendmentACONNotificationRule;
1414
import uk.gov.moj.cpp.results.domain.aggregate.finresultsnotifications.rules.cases.amendments.CaseAmendmentDeemedServedNotificationRule;
15-
import uk.gov.moj.cpp.results.domain.aggregate.finresultsnotifications.rules.cases.amendments.CaseAmendmentFinToFinAccWriteOffRule;
16-
import uk.gov.moj.cpp.results.domain.aggregate.finresultsnotifications.rules.cases.amendments.CaseAmendmentFinToNonFinAccWriteOffRule;
15+
import uk.gov.moj.cpp.results.domain.aggregate.finresultsnotifications.rules.cases.CaseFinToFinAccWriteOffRule;
16+
import uk.gov.moj.cpp.results.domain.aggregate.finresultsnotifications.rules.cases.CaseFinToNonFinAccWriteOffRule;
1717
import uk.gov.moj.cpp.results.domain.aggregate.finresultsnotifications.rules.cases.result.CaseACONNotificationRule;
1818
import uk.gov.moj.cpp.results.domain.aggregate.finresultsnotifications.rules.cases.result.CaseDeemedServedNotificationRule;
1919
import uk.gov.moj.cpp.results.domain.event.MarkedAggregateSendEmailWhenAccountReceived;
@@ -40,9 +40,9 @@ private ResultNotificationRuleEngine() {
4040
rules.add(new ApplicationACONNotificationRule());
4141
rules.add(new ApplicationAmendmentACONNotificationRule());
4242
rules.add(new ApplicationAmendmentFinToFinAccWriteOffRule());
43-
rules.add(new CaseAmendmentFinToFinAccWriteOffRule());
4443
rules.add(new ApplicationAmendmentFinToNonFinAccWriteOffRule());
45-
rules.add(new CaseAmendmentFinToNonFinAccWriteOffRule());
44+
rules.add(new CaseFinToFinAccWriteOffRule());
45+
rules.add(new CaseFinToNonFinAccWriteOffRule());
4646
rules.add(new CaseAmendmentACONNotificationRule());
4747
rules.add(new CaseACONNotificationRule());
4848
rules.add(new CaseAmendmentDeemedServedNotificationRule());

results-domain/results-domain-aggregate/src/main/java/uk/gov/moj/cpp/results/domain/aggregate/finresultsnotifications/rules/applications/AbstractApplicationResultNotificationRule.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package uk.gov.moj.cpp.results.domain.aggregate.finresultsnotifications.rules.applications;
22

3+
import static java.lang.Boolean.TRUE;
34
import static java.util.Comparator.comparing;
45
import static java.util.Objects.isNull;
56
import static java.util.Objects.nonNull;
@@ -29,6 +30,7 @@
2930
*/
3031
public abstract class AbstractApplicationResultNotificationRule implements ResultNotificationRule {
3132
private static final Predicate<OffenceResults> isApplicationAmended = o -> nonNull(o.getApplicationType()) && nonNull(o.getAmendmentDate());
33+
private static final Boolean IS_FINANCIAL = TRUE;
3234

3335
protected HearingFinancialResultRequest filteredApplicationResults(HearingFinancialResultRequest request) {
3436
final HearingFinancialResultRequest filtered = HearingFinancialResultRequest.hearingFinancialResultRequest()
@@ -99,15 +101,16 @@ protected Optional<OriginalApplicationResults> getOriginalApplicationResults(fin
99101
*/
100102
protected boolean isFineToFineApplicationAmendment(final RuleInput input, final HearingFinancialResultRequest request, final UUID currentApplicationId) {
101103
return request.getOffenceResults().stream()
102-
.filter(isApplicationAmended)
103-
.filter(OffenceResults::getIsFinancial)
104-
.anyMatch(offenceFromRequest ->
105-
ofNullable(getPreviousOffenceResultsDetails(offenceFromRequest.getOffenceId(),
104+
.anyMatch(o -> TRUE.equals(o.getIsFinancial()))
105+
&&
106+
request.getOffenceResults().stream()
107+
.map(offenceFromRequest -> getPreviousOffenceResultsDetails(offenceFromRequest.getOffenceId(),
106108
currentApplicationId,
107109
input.prevOffenceResultsDetails(),
108110
input.prevApplicationOffenceResultsMap(),
109111
input.prevApplicationResultsDetails()))
110-
.map(OffenceResultsDetails::getIsFinancial).orElse(false));
112+
.filter(Objects::nonNull)
113+
.anyMatch(o -> TRUE.equals(o.getIsFinancial()));
111114
}
112115

113116
/**
@@ -182,8 +185,7 @@ protected boolean hasACONAmendmentOffences(HearingFinancialResultRequest request
182185
.anyMatch(o -> isValidApplicationOffence(o) &&
183186
o.getIsFinancial() &&
184187
nonNull(o.getImpositionOffenceDetails()) &&
185-
o.getImpositionOffenceDetails().contains("ACON") &&
186-
Objects.nonNull(o.getAmendmentDate()));
188+
o.getImpositionOffenceDetails().contains("ACON"));
187189
}
188190

189191
protected boolean hasDeemedServedAmendmentOffences(HearingFinancialResultRequest request) {

results-domain/results-domain-aggregate/src/main/java/uk/gov/moj/cpp/results/domain/aggregate/finresultsnotifications/rules/applications/amendments/ApplicationAmendmentDeemedServedNotificationRule.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public Optional<MarkedAggregateSendEmailWhenAccountReceived> apply(final RuleInp
4747
.filter(or -> Objects.nonNull(or.getAmendmentDate()))
4848
.map(or -> buildImpositionOffenceDetailsFromRequest(or, input.offenceDateMap())).distinct()
4949
.toList();
50-
50+
5151
return Optional.of(
5252
markedAggregateSendEmailEventBuilder(input.ncesEmail(), input.correlationItemList())
5353
.buildMarkedAggregateWithoutOlds(request, WRITE_OFF_ONE_DAY_DEEMED_SERVED_REMOVED,

0 commit comments

Comments
 (0)