Skip to content

Commit 7a229d9

Browse files
authored
Dev/dd 41915 (#116)
1 parent 948a755 commit 7a229d9

File tree

8 files changed

+294
-45
lines changed

8 files changed

+294
-45
lines changed

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
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>
41-
<referencedata.version>17.103.125</referencedata.version>
40+
<coredomain.version>17.102.19-DLRM7-SNAPSHOT</coredomain.version>
41+
<referencedata.version>17.103.128</referencedata.version>
4242
<notification.notify.version>17.0.38</notification.notify.version>
4343
<systemdocgenerator.version>17.103.104</systemdocgenerator.version>
4444
<progression.version>17.0.210-DLRM7-SNAPSHOT</progression.version>
@@ -49,7 +49,7 @@
4949
<netty.version>4.1.113.Final</netty.version>
5050
<!-- Downgrade h2 until deltaspike tests have been updated to work with latest h2 version -->
5151
<h2.version>1.4.196</h2.version>
52-
<sjp.version>17.103.148</sjp.version>
52+
<sjp.version>17.103.166</sjp.version>
5353
<staging.dcs.version>17.103.8</staging.dcs.version>
5454
<sonar.coverage.exclusions>
5555
**/uk/gov/moj/cpp/results/command/api/accesscontrol/**/*,

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import uk.gov.moj.cpp.results.domain.event.MigratedInactiveNcesEmailNotification;
1515
import uk.gov.moj.cpp.results.domain.event.MigratedInactiveNcesEmailNotificationRequested;
1616
import uk.gov.moj.cpp.results.domain.event.MigratedInactiveNcesEmailNotificationRequestedExists;
17+
import uk.gov.moj.cpp.results.domain.event.MigratedInactiveNcesFineAcccountNumberAbsent;
1718

1819
import java.io.Serial;
1920
import java.util.List;
@@ -29,9 +30,10 @@ public class MigratedInactiveHearingFinancialResultsAggregate implements Aggrega
2930
private String sendToAddress;
3031
private String subject;
3132
private boolean isEventRaisedEarlier = false;
33+
public static final String FINE_ACCOUNT_NOT_PRESENT = "FINE_ACCOUNT_NOT_PRESENT";
3234

3335
@Serial
34-
private static final long serialVersionUID = 1L;
36+
private static final long serialVersionUID = 101L;
3537
private UUID caseId;
3638

3739

@@ -71,6 +73,15 @@ public Stream<Object> sendNcesEmailForMigratedApplication(
7173
return apply(Stream.of(event));
7274
}
7375

76+
if(FINE_ACCOUNT_NOT_PRESENT.equals(migratedCaseDetails.fineAccountNumber())){
77+
final MigratedInactiveNcesFineAcccountNumberAbsent event = MigratedInactiveNcesFineAcccountNumberAbsent.migratedInactiveNcesFineAcccountNumberAbsent()
78+
.withMasterDefendantId(fromString(migratedCaseDetails.masterDefendantId()))
79+
.withDefendantId(fromString(migratedCaseDetails.masterDefendantId()))
80+
.withCaseId(fromString(migratedCaseDetails.caseId()))
81+
.build();
82+
return apply(Stream.of(event));
83+
}
84+
7485
final String subject = APPLICATION_TYPES.get(applicationType);
7586
final MigratedInactiveNcesEmailNotificationRequested requested = migratedInactiveNcesEmailNotificationRequested()
7687
.withNotificationId(randomUUID())

results-domain/results-domain-aggregate/src/test/java/uk/gov/moj/cpp/results/domain/aggregate/MigratedInactiveHearingFinancialResultsAggregateTest.java

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

33
import static java.util.Collections.singletonList;
4+
import static java.util.UUID.fromString;
45
import static java.util.UUID.randomUUID;
56
import static java.util.stream.Collectors.toList;
67
import static org.hamcrest.CoreMatchers.is;
@@ -12,6 +13,7 @@
1213
import uk.gov.moj.cpp.domains.results.MigratedMasterDefendantCaseDetails;
1314
import uk.gov.moj.cpp.results.domain.event.MigratedInactiveNcesEmailNotificationRequested;
1415
import uk.gov.moj.cpp.results.domain.event.MigratedInactiveNcesEmailNotificationRequestedExists;
16+
import uk.gov.moj.cpp.results.domain.event.MigratedInactiveNcesFineAcccountNumberAbsent;
1517

1618
import java.util.List;
1719
import java.util.UUID;
@@ -158,6 +160,42 @@ public void shouldReturnEmptyStreamWhenEventRaisedEarlier() {
158160
is(EVENT_EARLIER_OR_MIGRATED_CASE_DETAILS_IS_NULL));
159161
}
160162

163+
@Test
164+
public void shouldEmitMigratedInactiveNcesFinAccountNumberAbsentWhenFineAccountNotPresent() {
165+
final MigratedMasterDefendantCaseDetails migratedCaseDetails = MigratedMasterDefendantCaseDetails.builder()
166+
.withMasterDefendantId(MASTER_DEFENDANT_ID)
167+
.withCaseId(CASE_ID)
168+
.withFineAccountNumber(MigratedInactiveHearingFinancialResultsAggregate.FINE_ACCOUNT_NOT_PRESENT)
169+
.withCourtEmail(COURT_EMAIL)
170+
.withDivision(DIVISION)
171+
.withDefendantId(DEFENDANT_ID)
172+
.withDefendantName(DEFENDANT_NAME)
173+
.withDefendantAddress(DEFENDANT_ADDRESS)
174+
.withOriginalDateOfConviction(ORIGINAL_DATE_OF_CONVICTION)
175+
.withDefendantEmail(DEFENDANT_EMAIL)
176+
.withDefendantDateOfBirth(DEFENDANT_DATE_OF_BIRTH)
177+
.withDefendantContactNumber(DEFENDANT_CONTACT_NUMBER)
178+
.withMigrationSourceSystemCaseIdentifier("CASE123")
179+
.withCaseURN("caseUrn1")
180+
.build();
181+
182+
final Stream<Object> result = aggregate.sendNcesEmailForMigratedApplication(
183+
STAT_DEC,
184+
LISTING_DATE,
185+
singletonList("caseUrn"),
186+
HEARING_COURT_CENTRE_NAME,
187+
migratedCaseDetails);
188+
189+
final List<Object> events = result.collect(toList());
190+
assertThat(events.size(), is(1));
191+
assertThat(events.get(0).getClass(), is(MigratedInactiveNcesFineAcccountNumberAbsent.class));
192+
193+
final MigratedInactiveNcesFineAcccountNumberAbsent event = (MigratedInactiveNcesFineAcccountNumberAbsent) events.get(0);
194+
assertThat(event.getMasterDefendantId(), is(fromString(MASTER_DEFENDANT_ID)));
195+
assertThat(event.getDefendantId(), is(fromString(MASTER_DEFENDANT_ID)));
196+
assertThat(event.getCaseId(), is(fromString(CASE_ID)));
197+
}
198+
161199
@Test
162200
public void shouldSaveMigratedInactiveNcesEmailNotificationDetails() {
163201
final UUID masterDefendantId = randomUUID();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"$schema": "http://json-schema.org/draft-04/schema#",
3+
"id": "http://moj.gov.uk/cpp/results/domain/event/results.event.migrated-inactive-nces-fine-acccount-number-absent.json",
4+
"type": "object",
5+
"properties": {
6+
"masterDefendantId": {
7+
"$ref": "http://justice.gov.uk/domain/core/common/definitions.json#/definitions/uuid"
8+
},
9+
"defendantId": {
10+
"$ref": "http://justice.gov.uk/domain/core/common/definitions.json#/definitions/uuid"
11+
},
12+
"caseId": {
13+
"$ref": "http://justice.gov.uk/domain/core/common/definitions.json#/definitions/uuid"
14+
}
15+
}
16+
}

results-event/results-event-processor/src/main/java/uk/gov/moj/cpp/results/event/processor/StagingEnforcementAcknowledgmentEventProcessor.java

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.util.stream.Stream;
3636

3737
import javax.inject.Inject;
38+
import javax.json.JsonArray;
3839
import javax.json.JsonObject;
3940
import javax.json.JsonObjectBuilder;
4041
import javax.json.JsonString;
@@ -61,6 +62,7 @@ public class StagingEnforcementAcknowledgmentEventProcessor {
6162
private static final String HEARING_FINANCIAL_RESULT_REQUEST = "hearingFinancialResultRequest";
6263
private static final DateTimeFormatter ISO_FORMATTER = ofPattern("yyyy-MM-dd");
6364
private static final DateTimeFormatter OUTPUT_FORMATTER = ofPattern("dd/MM/yyyy");
65+
public static final String FINE_ACCOUNT_NOT_PRESENT = "FINE_ACCOUNT_NOT_PRESENT";
6466

6567
private record NcesNotificationDetails(String email, String division) {
6668
}
@@ -149,7 +151,7 @@ public void processSendNcesMailForNewApplication(final JsonEnvelope event) { //A
149151
ncesNotificationDetails = extractNcesNotificationEmail(event, payload);
150152
}
151153

152-
if (isNotEmpty(enrichedDetails) && nonNull(ncesNotificationDetails) && nonNull(ncesNotificationDetails.email())) {
154+
if (nonNull(ncesNotificationDetails) && nonNull(ncesNotificationDetails.email())) {
153155
for (EnrichedFineDetail item : enrichedDetails) {
154156

155157
final JsonObjectBuilder builder = createObjectBuilder()
@@ -225,32 +227,46 @@ private List<EnrichedFineDetail> extractAllEnrichedData(JsonObject json, String
225227
.map(JsonValue::asJsonObject)
226228
.filter(obj -> obj.containsKey(InactiveMigratedCase.INACTIVE_CASE_SUMMARY))
227229
.map(obj -> obj.getJsonObject(InactiveMigratedCase.INACTIVE_CASE_SUMMARY))
228-
.flatMap(caseSummary -> {
229-
String caseId = caseSummary.getString(InactiveMigratedCase.ID);
230-
String caseURN = caseSummary.getString(Case.URN);
231-
232-
JsonObject sourceSystem = caseSummary.getJsonObject(InactiveMigratedCase.MIGRATION_SOURCE_SYSTEM);
233-
String caseIdentifier = sourceSystem.getString(InactiveMigratedCase.MIGRATION_SOURCE_SYSTEM_CASE_IDENTIFIER);
234-
235-
return caseSummary.getJsonArray(Defendant.DEFENDANTS).stream()
236-
.map(JsonValue::asJsonObject)
237-
.filter(def -> masterId.equals(def.getString(MASTER_DEFENDANT_ID)))
238-
.flatMap(def -> {
239-
String currentDefId = def.getString(Defendant.ID);
240-
DefendantDetails details = mapToDefendantDetails(def);
241-
242-
return sourceSystem.getJsonArray(InactiveMigratedCase.DEFENDANT_FINE_ACCOUNT_NUMBERS).stream()
243-
.map(JsonValue::asJsonObject)
244-
.filter(fa -> currentDefId.equals(fa.getString(Defendant.ID)))
245-
.map(fa -> new EnrichedFineDetail(
246-
new FineAccount(caseId, fa.getString(MigrationConstants.FineAccount.FINE_ACCOUNT_NUMBER), caseIdentifier, caseURN),
247-
details)
248-
);
249-
});
250-
})
230+
.flatMap(caseSummary -> processCaseSummary(caseSummary, masterId))
251231
.toList();
252232
}
253233

234+
private Stream<EnrichedFineDetail> processCaseSummary(JsonObject caseSummary, String masterId) {
235+
String caseId = caseSummary.getString(InactiveMigratedCase.ID);
236+
String caseURN = caseSummary.getString(Case.URN);
237+
238+
JsonObject sourceSystem = caseSummary.getJsonObject(InactiveMigratedCase.MIGRATION_SOURCE_SYSTEM);
239+
String caseIdentifier = sourceSystem.getString(InactiveMigratedCase.MIGRATION_SOURCE_SYSTEM_CASE_IDENTIFIER);
240+
241+
return caseSummary.getJsonArray(Defendant.DEFENDANTS).stream()
242+
.map(JsonValue::asJsonObject)
243+
.filter(def -> masterId.equals(def.getString(MASTER_DEFENDANT_ID)))
244+
.flatMap(def -> enrichFineDetails(def, sourceSystem, caseId, caseURN, caseIdentifier));
245+
}
246+
247+
private Stream<EnrichedFineDetail> enrichFineDetails(JsonObject def, JsonObject sourceSystem,
248+
String caseId, String caseURN, String caseIdentifier) {
249+
String currentDefId = def.getString(Defendant.ID);
250+
DefendantDetails details = mapToDefendantDetails(def);
251+
252+
List<JsonObject> fineAccountList = Optional.ofNullable(sourceSystem.getJsonArray(InactiveMigratedCase.DEFENDANT_FINE_ACCOUNT_NUMBERS))
253+
.stream()
254+
.flatMap(JsonArray::stream)
255+
.map(JsonValue::asJsonObject)
256+
.toList();
257+
258+
String accountNumber = fineAccountList.stream()
259+
.filter(fa -> currentDefId.equals(fa.getString(Defendant.ID)))
260+
.map(fa -> fa.getString(MigrationConstants.FineAccount.FINE_ACCOUNT_NUMBER))
261+
.findFirst()
262+
.orElse(FINE_ACCOUNT_NOT_PRESENT);
263+
264+
return Stream.of(new EnrichedFineDetail(
265+
new FineAccount(caseId, accountNumber, caseIdentifier, caseURN),
266+
details)
267+
);
268+
}
269+
254270
private DefendantDetails mapToDefendantDetails(JsonObject defendantJson) {
255271
if (defendantJson == null) {
256272
return new DefendantDetails("", "", "", "", "", "", "");

results-event/results-event-processor/src/test/java/uk/gov/moj/cpp/results/event/processor/StagingEnforcementAcknowledgmentEventProcessorTest.java

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import static org.hamcrest.CoreMatchers.allOf;
88
import static org.hamcrest.CoreMatchers.is;
99
import static org.hamcrest.MatcherAssert.assertThat;
10+
import static org.hamcrest.Matchers.containsString;
1011
import static org.junit.jupiter.api.Assertions.fail;
1112
import static org.mockito.ArgumentMatchers.any;
1213
import static org.mockito.ArgumentMatchers.eq;
@@ -18,6 +19,7 @@
1819
import static uk.gov.justice.services.test.utils.core.matchers.JsonEnvelopeMetadataMatcher.metadata;
1920
import static uk.gov.justice.services.test.utils.core.matchers.JsonEnvelopePayloadMatcher.payloadIsJson;
2021
import static uk.gov.justice.services.test.utils.core.messaging.MetadataBuilderFactory.metadataWithRandomUUID;
22+
import static uk.gov.moj.cpp.results.event.processor.StagingEnforcementAcknowledgmentEventProcessor.FINE_ACCOUNT_NOT_PRESENT;
2123

2224
import uk.gov.justice.services.core.sender.Sender;
2325
import uk.gov.justice.services.messaging.Envelope;
@@ -186,6 +188,7 @@ public void shouldCallUpdatecorrelationId() {
186188

187189
}
188190

191+
189192
@Test
190193
void shouldProcessSendNcesMailForNewApplication() {
191194
// GIVEN
@@ -218,7 +221,8 @@ void shouldProcessSendNcesMailForNewApplication() {
218221
// THEN
219222
verify(progressionService).getInactiveMigratedCasesByCaseIds(List.of(caseId1, caseId2, caseId3));
220223

221-
verify(sender, times(4)).sendAsAdmin(envelopeArgumentCaptor.capture());
224+
// Updated to 5: (3 from Case1 + 1 from Case2 + 1 Final Notification)
225+
verify(sender, times(5)).sendAsAdmin(envelopeArgumentCaptor.capture());
222226

223227
List<Envelope<JsonObject>> allEnvelopes = envelopeArgumentCaptor.getAllValues();
224228

@@ -248,6 +252,16 @@ void shouldProcessSendNcesMailForNewApplication() {
248252
))));
249253

250254
assertThat(JsonEnvelope.envelopeFrom(allEnvelopes.get(2).metadata(), allEnvelopes.get(2).payload()),
255+
jsonEnvelope(
256+
metadata().withName("result.command.send-migrated-inactive-nces-email-for-application"),
257+
payloadIsJson(allOf(
258+
withJsonPath("$.migratedMasterDefendantCourtEmailAndFineAccount.caseId", is(caseId1)),
259+
withJsonPath("$.migratedMasterDefendantCourtEmailAndFineAccount.fineAccountNumber", is(FINE_ACCOUNT_NOT_PRESENT)),
260+
withJsonPath("$.migratedMasterDefendantCourtEmailAndFineAccount.defendantName", is("Jane Dare")),
261+
withJsonPath("$.migratedMasterDefendantCourtEmailAndFineAccount.defendantEmail", is("jane.dare@gmail.com"))
262+
))));
263+
264+
assertThat(JsonEnvelope.envelopeFrom(allEnvelopes.get(3).metadata(), allEnvelopes.get(3).payload()),
251265
jsonEnvelope(
252266
metadata().withName("result.command.send-migrated-inactive-nces-email-for-application"),
253267
payloadIsJson(allOf(
@@ -256,6 +270,59 @@ void shouldProcessSendNcesMailForNewApplication() {
256270
withJsonPath("$.migratedMasterDefendantCourtEmailAndFineAccount.defendantName", is("Garfield Dare"))
257271
))));
258272

273+
assertThat(allEnvelopes.get(4).metadata().name(), is("result.command.send-nces-email-for-application"));
274+
}
275+
276+
@Test
277+
void shouldProcessSendNcesMailForNewApplicationWhenDefendantFineAccountNumbersMissing() {
278+
// GIVEN
279+
final String masterDefendantId = "1a9176f4-3adc-4ea1-a808-26c4632f38ab";
280+
final String caseId1 = "b00acc1c-eb69-4b3c-960e-76be9153125a";
281+
final String caseId2 = "7776f4-3adc-4ea1-a808-26c4632f38ab";
282+
final String caseId3 = "b10acc1c-eb69-4b3c-960e-76be9153125a";
283+
final String hearingCourtCentreId = "faa91bb2-19cb-384b-bcc1-06d31d12cc67";
284+
285+
final JsonObject notificationPayload = createObjectBuilder()
286+
.add("masterDefendantId", masterDefendantId)
287+
.add("caseIds", createCaseIds(caseId1, caseId2, caseId3))
288+
.add("hearingCourtCentreId", hearingCourtCentreId)
289+
.build();
290+
291+
final JsonObject progressionResponse = getPayload("inactive-migrated-cases-without-defendant-fine-account-numbers.json");
292+
293+
when(progressionService.getInactiveMigratedCasesByCaseIds(List.of(caseId1, caseId2, caseId3)))
294+
.thenReturn(Optional.of(progressionResponse));
295+
296+
final JsonObject payload = getPayload("organisation-units.json");
297+
when(referenceDataService.getOrganisationUnit(eq(hearingCourtCentreId), any())).thenReturn(payload);
298+
299+
final JsonEnvelope event = JsonEnvelope.envelopeFrom(
300+
metadataWithRandomUUID("public.hearing.nces-email-notification-for-application"), notificationPayload);
301+
302+
// WHEN
303+
stagingEnforcementAcknowledgmentEventProcessor.processSendNcesMailForNewApplication(event);
304+
305+
// THEN
306+
verify(progressionService).getInactiveMigratedCasesByCaseIds(List.of(caseId1, caseId2, caseId3));
307+
308+
verify(sender, times(4)).sendAsAdmin(envelopeArgumentCaptor.capture());
309+
310+
List<Envelope<JsonObject>> allEnvelopes = envelopeArgumentCaptor.getAllValues();
311+
312+
assertThat(allEnvelopes.get(0).payload().getJsonObject("migratedMasterDefendantCourtEmailAndFineAccount").getString("fineAccountNumber"), is(FINE_ACCOUNT_NOT_PRESENT));
313+
assertThat(allEnvelopes.get(0).payload().getJsonObject("migratedMasterDefendantCourtEmailAndFineAccount").getString("caseId"), is(caseId1));
314+
315+
assertThat(allEnvelopes.get(1).payload().getJsonObject("migratedMasterDefendantCourtEmailAndFineAccount").getString("fineAccountNumber"), is(FINE_ACCOUNT_NOT_PRESENT));
316+
assertThat(allEnvelopes.get(1).payload().getJsonObject("migratedMasterDefendantCourtEmailAndFineAccount").getString("defendantName"), containsString("Junior"));
317+
318+
assertThat(JsonEnvelope.envelopeFrom(allEnvelopes.get(2).metadata(), allEnvelopes.get(2).payload()),
319+
jsonEnvelope(
320+
metadata().withName("result.command.send-migrated-inactive-nces-email-for-application"),
321+
payloadIsJson(allOf(
322+
withJsonPath("$.migratedMasterDefendantCourtEmailAndFineAccount.caseId", is(caseId2)),
323+
withJsonPath("$.migratedMasterDefendantCourtEmailAndFineAccount.fineAccountNumber", is("67890"))
324+
))));
325+
259326
assertThat(allEnvelopes.get(3).metadata().name(), is("result.command.send-nces-email-for-application"));
260327
}
261328

0 commit comments

Comments
 (0)