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 @@ -1035,7 +1035,7 @@ private String generateApplicationReference(final CourtApplication courtApplicat
@SuppressWarnings({"java:S2245"})
private String generateUrn() {
return RandomStringUtils.random(4, 0, 0, true, true, null, SECURE_RANDOM).toUpperCase() +
RandomStringUtils.random(7, 0, 0, false, true, null, SECURE_RANDOM);
RandomStringUtils.random(7, 0, 0, false, true, null, SECURE_RANDOM);
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SuppressWarnings({"squid:S1948", "squid:S1172", "squid:S1188", "squid:S3655", "java:S6204"})
@SuppressWarnings({"squid:S1948", "squid:S1172", "squid:S1188", "squid:S3655", "java:S6204", "squid:S1168"})
public class HearingAggregate implements Aggregate {
private static final Logger LOGGER = LoggerFactory.getLogger(HearingAggregate.class);
private static final long serialVersionUID = 8888819367477517209L;
Expand All @@ -147,7 +147,7 @@ public class HearingAggregate implements Aggregate {
private final List<AddedOffencesMovedToHearing> addedOffencesMovedToHearings = new ArrayList<>();
private Boolean isHearingInitiateEnriched = false;
private List<ProsecutionCase> seededProsecutionCases = null;
private MarkedHearingConfirmedForReplay markedHearingConfirmedForReplay =null;
private MarkedHearingConfirmedForReplay markedHearingConfirmedForReplay = null;

private ZonedDateTime resultSharedDateTime;

Expand Down Expand Up @@ -179,8 +179,8 @@ public class HearingAggregate implements Aggregate {
);

private static final UUID REMAND_STATUS_PROMPT_ID = UUID.fromString("9403f0d7-90b5-4377-84b4-f06a77811362");
private static final String[] onBailStatusValues = new String[]{ "Conditional Bail", "Unconditional Bail"};
private static final String[] onBailStatusCodes = new String[]{ "B", "U"};
private static final String[] onBailStatusValues = new String[]{"Conditional Bail", "Unconditional Bail"};
private static final String[] onBailStatusCodes = new String[]{"B", "U"};
private static final UUID DEFENDANT_FOUND_UNDER_A_DISABILITY = UUID.fromString("d3d94468-02a4-3259-b55d-38e6d163e820");

@VisibleForTesting
Expand Down Expand Up @@ -335,7 +335,7 @@ public Object apply(final Object event) {

private void handleAddedOffencesMovedToHearing(AddedOffencesMovedToHearing addedOffencesMovedToHearing) {
newOffences.addAll(addedOffencesMovedToHearing.getNewOffences().stream().map(Offence::getId).collect(Collectors.toSet()));
if(isHearingInitiateEnriched){
if (isHearingInitiateEnriched) {
return;
}
if (!addedOffencesMovedToHearings.contains(addedOffencesMovedToHearing)) {
Expand Down Expand Up @@ -457,13 +457,24 @@ public Stream<Object> amendSummonsData(final SummonsApprovedOutcome summonsAppro
.withConfirmedProsecutionCaseIds(confirmedProsecutionCaseIdsToSend)
.withListDefendantRequests(listDefendantRequestsToSend)
.withCourtApplicationPartyListingNeeds(courtApplicationPartyListingNeedsToSend)
.withConfirmedApplicationIds(collectApplicationIds(courtApplicationPartyListingNeedsToSend))
.build())
.withIsSummonsAmended(true)
.build());
}
return apply(streamBuilder.build());
}

private List<UUID> collectApplicationIds(final List<CourtApplicationPartyListingNeeds> courtApplicationPartyListingNeedsToSend) {
if (isNull(courtApplicationPartyListingNeedsToSend)) {
return null;
}
return courtApplicationPartyListingNeedsToSend.stream()
.map(CourtApplicationPartyListingNeeds::getCourtApplicationId)
.filter(Objects::nonNull)
.collect(toList());
}

private static CourtCentre getCourtCentre(final CourtCentre courtCentre) {
return CourtCentre.courtCentre()
.withCode(courtCentre.getCode())
Expand Down Expand Up @@ -1182,7 +1193,7 @@ private void setHearing(final Hearing hearing) {
}
}

private Hearing getDeDupHearing(final Hearing hearing){
private Hearing getDeDupHearing(final Hearing hearing) {
Hearing updatedHearing = dedupAllReportingRestrictions(hearing);
updatedHearing = deDupAllApplications(updatedHearing);
return updatedHearing;
Expand Down Expand Up @@ -1395,11 +1406,11 @@ public Stream<Object> deleteHearing(final UUID hearingId) {

public Stream<Object> unallocateHearingWhenCourtroomIsRemoved(final UUID hearingId, final Integer estimatedMinutes) {

if (this.deleted || this.duplicate || (HearingListingStatus.HEARING_RESULTED.equals(hearingListingStatus))) {
if (this.deleted || this.duplicate || (HearingListingStatus.HEARING_RESULTED.equals(hearingListingStatus))) {
return empty();
}

if (hearing == null || JurisdictionType.MAGISTRATES.equals(hearing.getJurisdictionType()) || hearing.getCourtCentre() ==null) {
if (hearing == null || JurisdictionType.MAGISTRATES.equals(hearing.getJurisdictionType()) || hearing.getCourtCentre() == null) {
return empty();
}

Expand Down Expand Up @@ -1561,7 +1572,8 @@ public Stream<Object> updateApplicationHearing(final DefendantUpdate defendantUp
/**
* DO NOT USE THIS FUNCTION EXCEPT FOR THE PURPOSE MENTIONED BELOW. The aggregate function is
* being added to be invoked only by the BDF, purpose of this function to raise
* 'progression.event.hearing.remove.duplicate.application.bdf' event to remove the duplicate application from hearing.
* 'progression.event.hearing.remove.duplicate.application.bdf' event to remove the duplicate
* application from hearing.
*
* @return The Stream object
*/
Expand Down Expand Up @@ -1876,7 +1888,7 @@ private void onOffencesRemovedFromHearing(final OffencesRemovedFromHearing offen
// update newOffences when an offence was deleted from the hearing.
final Set<UUID> offences = hearing.getProsecutionCases().stream().flatMap(pc -> pc.getDefendants().stream())
.flatMap(def -> def.getOffences().stream()).map(Offence::getId).collect(Collectors.toSet());
newOffences.removeIf( off -> !offences.contains(off));
newOffences.removeIf(off -> !offences.contains(off));
addedOffencesMovedToHearings.clear();
}
final List<UUID> offencesToBeRemoved = offencesRemovedFromHearing.getOffenceIds();
Expand Down Expand Up @@ -1960,7 +1972,7 @@ public Stream<Object> processHearingResults(final Hearing hearing, final ZonedDa
.withCourtApplications(updatedCourtApplications)
.withProsecutionCases(updatedProsecutionCasesForOriginalHearing).build();
final Set<UUID> ctlExpiredOffenceIds = stopCTLExpiryForV2(hearing, resultIdList);
if(isNotEmpty(ctlExpiredOffenceIds)) {
if (isNotEmpty(ctlExpiredOffenceIds)) {
updatedHearing = Hearing.hearing().withValuesFrom(updatedHearing)
.withProsecutionCases(ofNullable(updatedHearing.getProsecutionCases()).map(Collection::stream).orElseGet(Stream::empty)
.map(prosecutionCase -> ProsecutionCase.prosecutionCase().withValuesFrom(prosecutionCase)
Expand Down Expand Up @@ -2012,7 +2024,6 @@ public Stream<Object> processHearingResults(final Hearing hearing, final ZonedDa
}



if (isNotEmpty(hearing.getCourtApplications())) {
streamBuilder.add(applicationsResulted()
.withHearing(getHearingWithUpdatedProsecutionCases(updatedHearing))
Expand All @@ -2038,7 +2049,7 @@ public Stream<Object> updateRelatedHearing(final HearingListingNeeds hearingList
final Stream.Builder<Object> streamBuilder = Stream.builder();
final HearingListingNeeds newHearingListingNeeds = HearingListingNeeds.hearingListingNeeds().withValuesFrom(hearingListingNeeds).build();

if (! HearingListingStatus.HEARING_RESULTED.equals(this.hearingListingStatus)) {
if (!HearingListingStatus.HEARING_RESULTED.equals(this.hearingListingStatus)) {
final Set<ProsecutionCase> resultCases = new HashSet<>();
getProsecutionCasesAfterMergeAtDifferentLevel(hearingListingNeeds, resultCases);

Expand Down Expand Up @@ -2087,7 +2098,7 @@ public Stream<Object> updateRelatedHearingForAdhocHearing(final HearingListingNe

final Stream.Builder<Object> streamBuilder = Stream.builder();
final HearingListingNeeds newHearingListingNeeds = HearingListingNeeds.hearingListingNeeds().withValuesFrom(hearingListingNeeds).build();
if (! HearingListingStatus.HEARING_RESULTED.equals(this.hearingListingStatus)) {
if (!HearingListingStatus.HEARING_RESULTED.equals(this.hearingListingStatus)) {

final Set<ProsecutionCase> resultCases = new HashSet<>();
getProsecutionCasesAfterMergeAtDifferentLevel(hearingListingNeeds, resultCases);
Expand Down Expand Up @@ -2125,7 +2136,7 @@ public Stream<Object> updateRelatedHearingForAdhocHearing(final HearingListingNe
final Stream events = apply(streamBuilder.build());
return Stream.concat(Stream.concat(events, populateHearingToProbationCaseWorker()), populateHearingToVEP());

} else {
} else {
return Stream.empty();
}

Expand Down Expand Up @@ -3531,7 +3542,7 @@ public Stream<Object> moveOffencesFromHearing(final MoveOffencesFromOldNextHeari
// So we need to move new offences to new next hearing
// because seeded hearing does not have new offences, and it can't create new next hearing with new offences.
final List<ProsecutionCase> prosecutionCases = ofNullable(seededProsecutionCases).orElse(this.hearing.getProsecutionCases());
if(isEmpty(prosecutionCases)){
if (isEmpty(prosecutionCases)) {
return Stream.empty();
}

Expand All @@ -3558,19 +3569,19 @@ public Stream<Object> moveOffencesFromHearing(final MoveOffencesFromOldNextHeari
.build())
.filter(seededCase -> nonNull(seededCase.getSeededDefendants()))
.collect(toList()))
.build()).filter(event -> ! event.getSeededCase().isEmpty()).map(o -> o));
.build()).filter(event -> !event.getSeededCase().isEmpty()).map(o -> o));
}


public Stream<Object> moveOffencesToHearing(final MoveOffencesToNewNextHearing moveOffencesToNewNextHearing) {
final Stream.Builder<Object> streamBuilder = Stream.builder();

moveOffencesToNewNextHearing.getSeededCase().forEach(seededCase ->
ofNullable(seededCase.getSeededDefendants()).stream().flatMap(Collection::stream).filter(def-> this.hearing.getProsecutionCases().stream()
ofNullable(seededCase.getSeededDefendants()).stream().flatMap(Collection::stream).filter(def -> this.hearing.getProsecutionCases().stream()
.filter(pcase -> pcase.getId().equals(seededCase.getId()))
.flatMap(pcase -> pcase.getDefendants().stream())
.filter(pdef -> pdef.getId().equals(def.getId()))
.anyMatch(pdef -> def.getSeededOffences().stream().anyMatch( off -> notInHearingState(seededCase.getId(), pdef.getId(), off.getId()))))
.anyMatch(pdef -> def.getSeededOffences().stream().anyMatch(off -> notInHearingState(seededCase.getId(), pdef.getId(), off.getId()))))
.forEach(def -> {
streamBuilder.add(AddedOffencesMovedToHearing.addedOffencesMovedToHearing()
.withHearingId(moveOffencesToNewNextHearing.getHearingId())
Expand All @@ -3588,33 +3599,33 @@ public Stream<Object> moveOffencesToHearing(final MoveOffencesToNewNextHearing m
}

public Stream<Object> addCasesToHearingBdf(final UUID hearingId, final List<ProsecutionCase> cases) {
final Stream<Object> events = apply(Stream.of(CaseAddedToHearingBdf.caseAddedToHearingBdf()
final Stream<Object> events = apply(Stream.of(CaseAddedToHearingBdf.caseAddedToHearingBdf()
.withHearingId(hearingId)
.withProsecutionCases(cases)
.build()));

return Stream.concat(Stream.concat(events, populateHearingToProbationCaseWorker()), populateHearingToVEP());
}

private boolean notInHearingState(final UUID caseId, final UUID defId){
private boolean notInHearingState(final UUID caseId, final UUID defId) {
return this.hearing.getProsecutionCases().stream()
.filter(pcase -> pcase.getId().equals(caseId))
.flatMap(pcase -> pcase.getDefendants().stream())
.noneMatch(pdef -> pdef.getId().equals(defId));
}

private boolean notInHearingState(final UUID caseId, final UUID defId, final UUID offId) {
return this.hearing.getProsecutionCases().stream().filter(pcase -> pcase.getId().equals(caseId))
return this.hearing.getProsecutionCases().stream().filter(pcase -> pcase.getId().equals(caseId))
.flatMap(pcase -> pcase.getDefendants().stream())
.filter(def -> def.getId().equals(defId))
.flatMap(def-> def.getOffences().stream())
.flatMap(def -> def.getOffences().stream())
.noneMatch(off -> off.getId().equals(offId));

}



private void addNewOffencesToHearing(final Hearing hearing) {
if (addedOffencesMovedToHearings.isEmpty()){
if (addedOffencesMovedToHearings.isEmpty()) {
return;
}
addedOffencesMovedToHearings.forEach(addedOffencesMovedToHearing ->
Expand Down Expand Up @@ -3674,11 +3685,11 @@ private static boolean isGuiltyAndHasCTLExpiry(final Offence offence) {
isCTLExpiryExists(offence);
}

private static boolean isGuilty(final Offence offence) {
private static boolean isGuilty(final Offence offence) {
return (nonNull(offence.getPlea())
&& GUILTY_PLEA_VALUES.stream()
.anyMatch(value -> value.equalsIgnoreCase(offence.getPlea().getPleaValue()))) ||
(nonNull(offence.getVerdict()) && isGuiltyVerdict(offence.getVerdict().getVerdictType())) ;
(nonNull(offence.getVerdict()) && isGuiltyVerdict(offence.getVerdict().getVerdictType()));
}

private static boolean isCTLExpiryExists(final Offence offence) {
Expand All @@ -3705,7 +3716,7 @@ private static boolean isOnBailAndHasCTLExpiryForV2(final Offence offence) {
}

private static boolean isResultNotDeleted(final JudicialResult result) {
return !result.getIsDeleted() ;
return !result.getIsDeleted();
}

private static boolean isDefendantOnBail(final Defendant defendant) {
Expand All @@ -3727,7 +3738,7 @@ private static boolean isAnyDefendantsOffencesVerdictIsDefendantFoundUnderADisab
}

public Stream<Object> replayHearingConfirmed(final ReplayHearingConfirmed replayHearingConfirmed) {
if(isNull(this.getHearing())) {
if (isNull(this.getHearing())) {
return apply(Stream.of(MarkedHearingConfirmedForReplay.markedHearingConfirmedForReplay()
.withConfirmedHearing(replayHearingConfirmed.getConfirmedHearing())
.withSendNotificationToParties(replayHearingConfirmed.getSendNotificationToParties())
Expand All @@ -3742,7 +3753,7 @@ public Stream<Object> replayHearingConfirmed(final ReplayHearingConfirmed replay
}

private void addReplayEvent(final Stream.Builder<Object> streamBuilder, final Hearing hearing) {
if(!isNull(this.markedHearingConfirmedForReplay)){
if (!isNull(this.markedHearingConfirmedForReplay)) {
streamBuilder.add(HearingConfirmedReplayed.hearingConfirmedReplayed()
.withConfirmedHearing(this.markedHearingConfirmedForReplay.getConfirmedHearing())
.withSendNotificationToParties(this.markedHearingConfirmedForReplay.getSendNotificationToParties())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6881,6 +6881,37 @@ public void shouldAmendSummonsDataAndProduceSummonsDataPreparedEvent() {
assertThat(prepared.getIsSummonsAmended(), is(true));
}

@Test
public void shouldAmendSummonsDataAndPopulateConfirmedApplicationIds() {
final UUID applicationId = randomUUID();

final List<CourtApplicationPartyListingNeeds> list = new ArrayList<>();
list.add(CourtApplicationPartyListingNeeds.courtApplicationPartyListingNeeds()
.withCourtApplicationId(applicationId)
.build());

hearingAggregate.createHearingApplicationRequest(list).collect(toList());

setField(hearingAggregate, "hearing",
Hearing.hearing()
.withCourtCentre(CourtCentre.courtCentre().withId(randomUUID()).withCode("testCode").build())
.withHearingDays(of(HearingDay.hearingDay().withSittingDay(ZonedDateTime.now()).build()))
.build());

final SummonsApprovedOutcome summonsApprovedOutcome = SummonsApprovedOutcome.summonsApprovedOutcome()
.withPersonalService(true)
.withSummonsSuppressed(false)
.build();

final List<Object> events = hearingAggregate.amendSummonsData(summonsApprovedOutcome).collect(toList());

assertThat(events.size(), is(1));
final SummonsDataPrepared prepared = (SummonsDataPrepared) events.get(0);
assertThat(prepared.getSummonsData().getConfirmedApplicationIds(), notNullValue());
assertThat(prepared.getSummonsData().getConfirmedApplicationIds().size(), is(1));
assertThat(prepared.getSummonsData().getConfirmedApplicationIds().get(0), is(applicationId));
}

@Test
public void shouldReturnEmptyStreamWhenNoListDefendantRequestsAndNoApplicationListingNeeds() {
setField(hearingAggregate, "hearing",
Expand Down
Loading
Loading