diff --git a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/CaseListedProcessor.java b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/CaseListedProcessor.java index 141ddb48e..db2860c6a 100644 --- a/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/CaseListedProcessor.java +++ b/sjp-event/sjp-event-processor/src/main/java/uk/gov/moj/cpp/sjp/event/processor/CaseListedProcessor.java @@ -17,6 +17,8 @@ import javax.inject.Inject; import javax.json.JsonObject; +import java.time.ZoneId; + import static uk.gov.justice.hearing.courts.HearingResulted.hearingResulted; import static uk.gov.justice.services.core.enveloper.Enveloper.envelop; import static uk.gov.moj.cpp.sjp.event.processor.results.converter.judicialresult.JCaseResultsConstants.DATE_FORMAT; @@ -37,6 +39,7 @@ public class CaseListedProcessor { private static final String PUBLIC_EVENTS_HEARING_RESULTED = "public.events.hearing.hearing-resulted"; public static final String SJP_COMMAND_SAVE_APPLICATION_OFFENCES_RESULTS = "sjp.command.save-application-offences-results"; + private static final String LONDON_ZONE_ID = "Europe/London"; @Handles(CaseListedInCriminalCourtsV2.EVENT_NAME) public void handleCaseListedInCCReferToCourt(final JsonEnvelope caseListedInCcForReferToCourtEnvelope) { @@ -47,9 +50,10 @@ public void handleCaseListedInCCReferToCourt(final JsonEnvelope caseListedInCcFo LOGGER.info("Received CaseListedInCcForReferToCourt for caseId {}", caseId); final PublicHearingResulted publicHearingResulted = sjpToHearingConverter.convertCaseDecisionInCcForReferToCourt(caseListedInCcForReferToCourtEnvelope); + ZoneId zoneId = ZoneId.of(LONDON_ZONE_ID); final Envelope publicHearingResultedEnvelope = envelop(hearingResulted() .withHearing(publicHearingResulted.getHearing()) - .withHearingDay(publicHearingResulted.getSharedTime().format(DATE_FORMAT)) + .withHearingDay(publicHearingResulted.getSharedTime().withZoneSameInstant(zoneId).format(DATE_FORMAT)) .withSharedTime(publicHearingResulted.getSharedTime()) .withIsReshare(false) .build()) @@ -60,7 +64,7 @@ public void handleCaseListedInCCReferToCourt(final JsonEnvelope caseListedInCcFo final Envelope hearingResultedEnvelope = envelop(HearingResulted .hearingResulted() .withHearing(publicHearingResulted.getHearing()) - .withHearingDay(publicHearingResulted.getSharedTime().format(DATE_FORMAT)) + .withHearingDay(publicHearingResulted.getSharedTime().withZoneSameInstant(zoneId).format(DATE_FORMAT)) .withSharedTime(publicHearingResulted.getSharedTime()) .withIsReshare(false) .build()) diff --git a/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/CaseListedProcessorTest.java b/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/CaseListedProcessorTest.java index f3daaa2ae..64c9d6ded 100644 --- a/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/CaseListedProcessorTest.java +++ b/sjp-event/sjp-event-processor/src/test/java/uk/gov/moj/cpp/sjp/event/processor/CaseListedProcessorTest.java @@ -154,6 +154,49 @@ public void handleCaseListedInCC_shouldInitiatePublicHearingResultedEvent() { .withName(PUBLIC_EVENTS_HEARING_RESULTED)); } + @Test + public void shouldHandleCaseListedInCCReferToCourtIfTheHearingDateInMidNight() { + final UUID caseId = randomUUID(); + + final JsonEnvelope privateEvent = createEnvelope(PRIVATE_CASE_LISTED_IN_REFER_TO_COURT_EVENT, + createObjectBuilder() + .add(CASE_ID, caseId.toString()) + .add("courtCentre", createObjectBuilder() + .add("id", "cf73207f-3ced-488a-82a0-3fba79c2ce04") + .add("name", "Carmarthen Magistrates' Court") + .add("roomId", "d7020fe0-cd97-4ce0-84c2-fd00ff0bc48a") + .add("roomName", "JK2Y7hu0Tc") + .add("welshName", "${welshName}") + .add("welshRoomName", "hm60SAXokc") + .add("roomId", "d7020fe0-cd97-4ce0-84c2-fd00ff0bc48a")) + .add("hearingDays", populateCorrectedHearingDaysWithHearingDate()) + .add("jurisdictionType", "MAGISTRATES") + .build()); + + when(sjpToHearingConverter.convertCaseDecisionInCcForReferToCourt(privateEvent)).thenReturn(publicHearingResultedPayload); + when(publicHearingResultedPayload.getSharedTime()).thenReturn(ZonedDateTime.parse("2026-06-30T23:55:03.166Z")); + + caseListedProcessor.handleCaseListedInCCReferToCourt(privateEvent); + + verify(sender, times(2)).send(jsonEnvelopeCaptor.capture()); + + final List eventEnvelopes = jsonEnvelopeCaptor.getAllValues(); + final Envelope publicHearingResultedEvent = eventEnvelopes.get(0); + + assertThat(publicHearingResultedEvent.metadata(), + withMetadataEnvelopedFrom(privateEvent) + .withName(PUBLIC_EVENTS_HEARING_RESULTED)); + } + + private JsonArray populateCorrectedHearingDaysWithHearingDate() { + return createArrayBuilder() + .add(createObjectBuilder() + .add("listedDurationMinutes", 1531791578) + .add("listingSequence", 810249414) + .add("sittingDay", "2026-06-30T23:55:03.166Z")) + .build(); + } + private JsonArray populateCorrectedHearingDays() { return createArrayBuilder() .add(createObjectBuilder()