From c59837461527fd4c645d72284f9a014db4bdfd20 Mon Sep 17 00:00:00 2001 From: bytesize-hq Date: Thu, 2 Apr 2026 14:15:52 +0100 Subject: [PATCH 1/4] fix: preserve original booking scheduledFor when processing COPY migration records --- .../services/migration/EntityCreationService.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java index b1135043b..8bb742916 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java @@ -27,6 +27,7 @@ import uk.gov.hmcts.reform.preapi.enums.RecordingOrigin; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; import uk.gov.hmcts.reform.preapi.repositories.PortalAccessRepository; +import uk.gov.hmcts.reform.preapi.services.BookingService; import uk.gov.hmcts.reform.preapi.services.RecordingService; import uk.gov.hmcts.reform.preapi.services.UserService; @@ -48,6 +49,7 @@ public class EntityCreationService { private final RecordingService recordingService; private final MigrationRecordService migrationRecordService; private final UserService userService; + private final BookingService bookingService; private final PortalAccessRepository portalAccessRepository; @Value("${vodafone-user-email}") @@ -96,7 +98,11 @@ public CreateBookingDTO createBooking(ProcessedRecording cleansedData, CreateCas CreateBookingDTO bookingDTO = new CreateBookingDTO(); bookingDTO.setId(bookingId); bookingDTO.setCaseId(aCase.getId()); - bookingDTO.setScheduledFor(cleansedData.getRecordingTimestamp()); + bookingDTO.setScheduledFor( + version != null && version.equalsIgnoreCase("COPY") + ? bookingService.findById(bookingId).getScheduledFor() + : cleansedData.getRecordingTimestamp() + ); Set filteredParticipants = aCase.getParticipants().stream() .filter(p -> (p.getFirstName() != null && p.getFirstName().equalsIgnoreCase(cleansedData.getWitnessFirstName())) From 53e61c1f05f78ff2ed478a2c83471e3501c80b5f Mon Sep 17 00:00:00 2001 From: bytesize-hq Date: Thu, 2 Apr 2026 14:30:30 +0100 Subject: [PATCH 2/4] update tests --- .../services/migration/EntityCreationServiceTest.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java index fd6954ea1..c8d017d69 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java @@ -34,6 +34,7 @@ import uk.gov.hmcts.reform.preapi.enums.RecordingOrigin; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; import uk.gov.hmcts.reform.preapi.repositories.PortalAccessRepository; +import uk.gov.hmcts.reform.preapi.services.BookingService; import uk.gov.hmcts.reform.preapi.services.RecordingService; import uk.gov.hmcts.reform.preapi.services.UserService; @@ -77,6 +78,9 @@ public class EntityCreationServiceTest { @MockitoBean private UserService userService; + @MockitoBean + private BookingService bookingService; + @MockitoBean private PortalAccessRepository portalAccessRepository; @@ -203,6 +207,7 @@ public void createBookingReturnsNullIfCopyHasNoOrigBookingId() { public void createBookingShouldUseExistingBookingIdForCopy() { UUID archiveId = UUID.randomUUID(); UUID existingBookingId = UUID.randomUUID(); + Timestamp originalScheduledFor = Timestamp.from(Instant.now().minus(Duration.ofDays(30))); MigrationRecord copyRecord = new MigrationRecord(); copyRecord.setArchiveId(archiveId.toString()); @@ -210,6 +215,10 @@ public void createBookingShouldUseExistingBookingIdForCopy() { MigrationRecord origRecord = new MigrationRecord(); origRecord.setBookingId(existingBookingId); + BookingDTO existingBooking = new BookingDTO(); + existingBooking.setScheduledFor(originalScheduledFor); + when(bookingService.findById(existingBookingId)).thenReturn(existingBooking); + when(migrationRecordService.findByArchiveId(archiveId.toString())) .thenReturn(Optional.of(copyRecord)); when(migrationRecordService.getOrigFromCopy(copyRecord)) @@ -230,7 +239,7 @@ public void createBookingShouldUseExistingBookingIdForCopy() { assertThat(result).isNotNull(); assertThat(result.getId()).isEqualTo(existingBookingId); assertThat(result.getCaseId()).isEqualTo(caseDTO.getId()); - assertThat(result.getScheduledFor()).isEqualTo(recording.getRecordingTimestamp()); + assertThat(result.getScheduledFor()).isEqualTo(originalScheduledFor); } @Test From a37bd529abbe2ac1326aeaca75a280713794db1a Mon Sep 17 00:00:00 2001 From: bytesize-hq Date: Thu, 2 Apr 2026 16:13:40 +0100 Subject: [PATCH 3/4] fix: preserve original capture session data when processing COPY migration records --- .../migration/EntityCreationService.java | 21 +++++++++++--- .../migration/EntityCreationServiceTest.java | 29 ++++++++++++++----- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java index 8bb742916..f35cb80ae 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java @@ -28,6 +28,7 @@ import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; import uk.gov.hmcts.reform.preapi.repositories.PortalAccessRepository; import uk.gov.hmcts.reform.preapi.services.BookingService; +import uk.gov.hmcts.reform.preapi.services.CaptureSessionService; import uk.gov.hmcts.reform.preapi.services.RecordingService; import uk.gov.hmcts.reform.preapi.services.UserService; @@ -50,6 +51,7 @@ public class EntityCreationService { private final MigrationRecordService migrationRecordService; private final UserService userService; private final BookingService bookingService; + private final CaptureSessionService captureSessionService; private final PortalAccessRepository portalAccessRepository; @Value("${vodafone-user-email}") @@ -133,15 +135,26 @@ public CreateCaptureSessionDTO createCaptureSession(ProcessedRecording cleansedD captureSessionId = UUID.randomUUID(); } + boolean isCopy = version != null && version.equalsIgnoreCase("COPY"); + CreateCaptureSessionDTO captureSessionDTO = new CreateCaptureSessionDTO(); captureSessionDTO.setId(captureSessionId); captureSessionDTO.setBookingId(booking.getId()); - captureSessionDTO.setStartedAt(cleansedData.getRecordingTimestamp()); UUID vodafoneUser = getUserByEmail(vodafoneUserEmail); - captureSessionDTO.setStartedByUserId(vodafoneUser); - captureSessionDTO.setFinishedAt(cleansedData.getFinishedAt()); - captureSessionDTO.setFinishedByUserId(vodafoneUser); + + if (isCopy) { + var existing = captureSessionService.findById(captureSessionId); + captureSessionDTO.setStartedAt(existing.getStartedAt()); + captureSessionDTO.setStartedByUserId(existing.getStartedByUserId()); + captureSessionDTO.setFinishedAt(existing.getFinishedAt()); + captureSessionDTO.setFinishedByUserId(existing.getFinishedByUserId()); + } else { + captureSessionDTO.setStartedAt(cleansedData.getRecordingTimestamp()); + captureSessionDTO.setStartedByUserId(vodafoneUser); + captureSessionDTO.setFinishedAt(cleansedData.getFinishedAt()); + captureSessionDTO.setFinishedByUserId(vodafoneUser); + } captureSessionDTO.setStatus(RecordingStatus.NO_RECORDING); captureSessionDTO.setOrigin(RecordingOrigin.VODAFONE); diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java index c8d017d69..17d992ee0 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java @@ -14,6 +14,7 @@ import uk.gov.hmcts.reform.preapi.batch.entities.ProcessedRecording; import uk.gov.hmcts.reform.preapi.dto.AccessDTO; import uk.gov.hmcts.reform.preapi.dto.BookingDTO; +import uk.gov.hmcts.reform.preapi.dto.CaptureSessionDTO; import uk.gov.hmcts.reform.preapi.dto.CaseDTO; import uk.gov.hmcts.reform.preapi.dto.CreateBookingDTO; import uk.gov.hmcts.reform.preapi.dto.CreateCaptureSessionDTO; @@ -35,6 +36,7 @@ import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; import uk.gov.hmcts.reform.preapi.repositories.PortalAccessRepository; import uk.gov.hmcts.reform.preapi.services.BookingService; +import uk.gov.hmcts.reform.preapi.services.CaptureSessionService; import uk.gov.hmcts.reform.preapi.services.RecordingService; import uk.gov.hmcts.reform.preapi.services.UserService; @@ -81,6 +83,9 @@ public class EntityCreationServiceTest { @MockitoBean private BookingService bookingService; + @MockitoBean + private CaptureSessionService captureSessionService; + @MockitoBean private PortalAccessRepository portalAccessRepository; @@ -299,7 +304,7 @@ public void createCaptureSessionOrigMissingId() { public void createCaptureSessionShouldUseExistingCaptureSessionIdForCopy() { UUID archiveId = UUID.randomUUID(); UUID existingCaptureSessionId = UUID.randomUUID(); - + MigrationRecord copyRecord = new MigrationRecord(); copyRecord.setArchiveId(archiveId.toString()); @@ -311,11 +316,17 @@ public void createCaptureSessionShouldUseExistingCaptureSessionIdForCopy() { when(migrationRecordService.getOrigFromCopy(copyRecord)) .thenReturn(Optional.of(origRecord)); - BaseUserDTO user = new UserDTO(); - user.setId(UUID.randomUUID()); - AccessDTO accessDTO = new AccessDTO(); - accessDTO.setUser(user); - when(userService.findByEmail(VODAFONE_EMAIL)).thenReturn(accessDTO); + Timestamp originalStartedAt = Timestamp.from(Instant.now().minus(Duration.ofDays(30))); + Timestamp originalFinishedAt = Timestamp.from(Instant.now().minus(Duration.ofDays(29))); + UUID originalStartedByUserId = UUID.randomUUID(); + UUID originalFinishedByUserId = UUID.randomUUID(); + + CaptureSessionDTO existingCaptureSession = new CaptureSessionDTO(); + existingCaptureSession.setStartedAt(originalStartedAt); + existingCaptureSession.setStartedByUserId(originalStartedByUserId); + existingCaptureSession.setFinishedAt(originalFinishedAt); + existingCaptureSession.setFinishedByUserId(originalFinishedByUserId); + when(captureSessionService.findById(existingCaptureSessionId)).thenReturn(existingCaptureSession); ProcessedRecording processedRecording = ProcessedRecording.builder() .archiveId(archiveId.toString()) @@ -331,8 +342,10 @@ public void createCaptureSessionShouldUseExistingCaptureSessionIdForCopy() { assertThat(result).isNotNull(); assertThat(result.getId()).isEqualTo(existingCaptureSessionId); assertThat(result.getBookingId()).isEqualTo(booking.getId()); - assertThat(result.getStartedAt()).isEqualTo(processedRecording.getRecordingTimestamp()); - assertThat(result.getStartedByUserId()).isEqualTo(user.getId()); + assertThat(result.getStartedAt()).isEqualTo(originalStartedAt); + assertThat(result.getStartedByUserId()).isEqualTo(originalStartedByUserId); + assertThat(result.getFinishedAt()).isEqualTo(originalFinishedAt); + assertThat(result.getFinishedByUserId()).isEqualTo(originalFinishedByUserId); assertThat(result.getStatus()).isEqualTo(RecordingStatus.NO_RECORDING); assertThat(result.getOrigin()).isEqualTo(RecordingOrigin.VODAFONE); } From af618f93e72e9fdad98ef495cab4b32b5ef54251 Mon Sep 17 00:00:00 2001 From: bytesize-hq Date: Thu, 2 Apr 2026 17:50:20 +0100 Subject: [PATCH 4/4] Fix COPY batch rollback by using BookingRepository directly --- .../services/migration/EntityCreationService.java | 8 +++++--- .../services/migration/EntityCreationServiceTest.java | 10 ++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java index f35cb80ae..7e30616fc 100644 --- a/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java +++ b/src/main/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationService.java @@ -26,8 +26,8 @@ import uk.gov.hmcts.reform.preapi.enums.ParticipantType; import uk.gov.hmcts.reform.preapi.enums.RecordingOrigin; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; +import uk.gov.hmcts.reform.preapi.repositories.BookingRepository; import uk.gov.hmcts.reform.preapi.repositories.PortalAccessRepository; -import uk.gov.hmcts.reform.preapi.services.BookingService; import uk.gov.hmcts.reform.preapi.services.CaptureSessionService; import uk.gov.hmcts.reform.preapi.services.RecordingService; import uk.gov.hmcts.reform.preapi.services.UserService; @@ -50,7 +50,7 @@ public class EntityCreationService { private final RecordingService recordingService; private final MigrationRecordService migrationRecordService; private final UserService userService; - private final BookingService bookingService; + private final BookingRepository bookingRepository; private final CaptureSessionService captureSessionService; private final PortalAccessRepository portalAccessRepository; @@ -102,7 +102,9 @@ public CreateBookingDTO createBooking(ProcessedRecording cleansedData, CreateCas bookingDTO.setCaseId(aCase.getId()); bookingDTO.setScheduledFor( version != null && version.equalsIgnoreCase("COPY") - ? bookingService.findById(bookingId).getScheduledFor() + ? bookingRepository.findByIdAndDeletedAtIsNull(bookingId) + .map(b -> b.getScheduledFor()) + .orElse(cleansedData.getRecordingTimestamp()) : cleansedData.getRecordingTimestamp() ); Set filteredParticipants = aCase.getParticipants().stream() diff --git a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java index 17d992ee0..c0f7cb902 100644 --- a/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java +++ b/src/test/java/uk/gov/hmcts/reform/preapi/batch/application/services/migration/EntityCreationServiceTest.java @@ -34,8 +34,9 @@ import uk.gov.hmcts.reform.preapi.enums.ParticipantType; import uk.gov.hmcts.reform.preapi.enums.RecordingOrigin; import uk.gov.hmcts.reform.preapi.enums.RecordingStatus; +import uk.gov.hmcts.reform.preapi.entities.Booking; +import uk.gov.hmcts.reform.preapi.repositories.BookingRepository; import uk.gov.hmcts.reform.preapi.repositories.PortalAccessRepository; -import uk.gov.hmcts.reform.preapi.services.BookingService; import uk.gov.hmcts.reform.preapi.services.CaptureSessionService; import uk.gov.hmcts.reform.preapi.services.RecordingService; import uk.gov.hmcts.reform.preapi.services.UserService; @@ -81,7 +82,7 @@ public class EntityCreationServiceTest { private UserService userService; @MockitoBean - private BookingService bookingService; + private BookingRepository bookingRepository; @MockitoBean private CaptureSessionService captureSessionService; @@ -220,9 +221,10 @@ public void createBookingShouldUseExistingBookingIdForCopy() { MigrationRecord origRecord = new MigrationRecord(); origRecord.setBookingId(existingBookingId); - BookingDTO existingBooking = new BookingDTO(); + Booking existingBooking = new Booking(); existingBooking.setScheduledFor(originalScheduledFor); - when(bookingService.findById(existingBookingId)).thenReturn(existingBooking); + when(bookingRepository.findByIdAndDeletedAtIsNull(existingBookingId)) + .thenReturn(Optional.of(existingBooking)); when(migrationRecordService.findByArchiveId(archiveId.toString())) .thenReturn(Optional.of(copyRecord));