Skip to content

Commit

Permalink
WIP need to add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
davidatkinsuk committed Jan 9, 2025
1 parent 1adbd53 commit 2c2bd76
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.stereotype.Repository
import java.time.LocalDate
import java.time.OffsetDateTime
Expand All @@ -12,7 +13,38 @@ import java.util.UUID
@Repository
interface Cas1DeliusBookingImportRepository : JpaRepository<Cas1DeliusBookingImportEntity, UUID> {
fun findByBookingId(id: UUID): Cas1DeliusBookingImportEntity?
fun findByBookingIdIsNullAndPremisesQcode(qCode: String): List<Cas1DeliusBookingImportEntity>

/**
* Returns all bookings created in delius that were not created in CAS1
*
* We only return bookings that may require management in the future e.g.
* record arrival/departure/non arrival
*
* We filter out any booking with a departure after 2035 as we've found
* several old/inactive bookings with departure dates in the later half
* of the century that we do not want to import
*
* Note that the [Cas1DeliusBookingImportEntity] table only includes
* accepted bookings (i.e. not rejected)
*/
@Query(
"""
FROM Cas1DeliusBookingImportEntity i
WHERE
i.bookingId IS NULL AND
i.premisesQcode = :qCode AND
i.departureDate IS NULL AND
i.nonArrivalReasonCode IS NULL AND
i.expectedDepartureDate > :minExpectedDepartureDate AND
i.expectedDepartureDate < :maxExpectedDepartureDate
""",
)
fun findOpenBookingsCreatedInDelius(
qCode: String,
minExpectedDepartureDate: LocalDate,
maxExpectedDepartureDate: LocalDate,
): List<Cas1DeliusBookingImportEntity>
}

@Entity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import uk.gov.justice.digital.hmpps.approvedpremisesapi.model.PersonSummaryInfoR
import uk.gov.justice.digital.hmpps.approvedpremisesapi.seed.SeedJob
import uk.gov.justice.digital.hmpps.approvedpremisesapi.service.EnvironmentService
import uk.gov.justice.digital.hmpps.approvedpremisesapi.service.OffenderService
import java.time.LocalDate
import java.time.OffsetDateTime
import java.util.UUID

Expand Down Expand Up @@ -58,25 +59,27 @@ class Cas1BackfillSpaceBookingsCreatedInDelius(
}
}

@SuppressWarnings("TooGenericExceptionCaught")
@SuppressWarnings("TooGenericExceptionCaught", "MagicNumber")
private fun migratePremise(qCode: String) {
val premises = approvedPremisesRepository.findByQCode(qCode) ?: error("Premises with qcode $qCode not found")

if (!premises.supportsSpaceBookings) {
error("premise ${premises.name} doesn't support space bookings, can't migrate bookings")
}

val referrals = cas1DeliusBookingImportRepository.findByBookingIdIsNullAndPremisesQcode(qCode)
val referrals = cas1DeliusBookingImportRepository.findOpenBookingsCreatedInDelius(
qCode = qCode,
minExpectedDepartureDate = LocalDate.of(2025, 1, 1),
maxExpectedDepartureDate = LocalDate.of(2035, 1, 1),
)

log.info("Will create ${referrals.size} space bookings for premise ${premises.name} ($qCode)")

if (referrals.isEmpty()) {
return
}

// TODO: we need a version of this that will segment calls to the backend
// can use for CAS3 report that does that?
val crnToName = offenderService.getPersonSummaryInfoResults(
val crnToName = offenderService.getPersonSummaryInfoResultsInBatches(
crns = referrals.map { it.crn }.toSet(),
limitedAccessStrategy = OffenderService.LimitedAccessStrategy.IgnoreLimitedAccess,
).associate { personSummaryInfoResult ->
Expand Down Expand Up @@ -106,6 +109,8 @@ class Cas1BackfillSpaceBookingsCreatedInDelius(
crnToName = crnToName,
)
}

log.info("Have crated ${referrals.size} space bookings for premise ${premises.name} ($qCode)")
}

private fun createSpaceBooking(
Expand Down Expand Up @@ -146,10 +151,10 @@ class Cas1BackfillSpaceBookingsCreatedInDelius(
expectedDepartureDate = deliusReferral.expectedDepartureDate!!,
actualArrivalDate = managementInfo.arrivedAtDate,
actualArrivalTime = managementInfo.arrivedAtTime,
actualDepartureDate = managementInfo.departedAtDate,
actualDepartureTime = managementInfo.departedAtTime,
actualDepartureDate = null,
actualDepartureTime = null,
canonicalArrivalDate = managementInfo.arrivedAtDate ?: deliusReferral.expectedArrivalDate,
canonicalDepartureDate = managementInfo.departedAtDate ?: deliusReferral.expectedDepartureDate!!,
canonicalDepartureDate = deliusReferral.expectedDepartureDate!!,
crn = deliusReferral.crn,
keyWorkerStaffCode = managementInfo.keyWorkerStaffCode,
keyWorkerName = managementInfo.keyWorkerName,
Expand All @@ -158,13 +163,13 @@ class Cas1BackfillSpaceBookingsCreatedInDelius(
cancellationRecordedAt = null,
cancellationReason = null,
cancellationReasonNotes = null,
departureMoveOnCategory = managementInfo.departureMoveOnCategory,
departureReason = managementInfo.departureReason,
departureNotes = managementInfo.departureNotes,
departureMoveOnCategory = null,
departureReason = null,
departureNotes = null,
criteria = emptyList<CharacteristicEntity>().toMutableList(),
nonArrivalReason = managementInfo.nonArrivalReason,
nonArrivalConfirmedAt = managementInfo.nonArrivalConfirmedAt?.toInstant(),
nonArrivalNotes = managementInfo.nonArrivalNotes,
nonArrivalReason = null,
nonArrivalConfirmedAt = null,
nonArrivalNotes = null,
deliusEventNumber = deliusReferral.eventNumber,
migratedManagementInfoFrom = managementInfo.source,
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import uk.gov.justice.digital.hmpps.approvedpremisesapi.repository.Cas1SpaceBook
import uk.gov.justice.digital.hmpps.approvedpremisesapi.seed.CsvBuilder
import uk.gov.justice.digital.hmpps.approvedpremisesapi.seed.cas1.Cas1CreateMissingReferralsSeedCsvRow
import uk.gov.justice.digital.hmpps.approvedpremisesapi.util.isWithinTheLastMinute
import java.time.Instant
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.OffsetDateTime
Expand Down Expand Up @@ -107,11 +106,11 @@ class SeedCas1BackfillSpaceBookingsCreatedInDeliusTest : SeedTestBase() {
moveOnCategoryDescription = null,
expectedArrivalDate = LocalDate.of(2024, 5, 9),
arrivalDate = LocalDate.of(2024, 5, 2),
expectedDepartureDate = LocalDate.of(2024, 6, 2),
departureDate = LocalDate.of(2024, 5, 4),
expectedDepartureDate = LocalDate.of(2025, 6, 2),
departureDate = null,
nonArrivalDate = LocalDate.of(3000, 1, 1),
nonArrivalContactDatetime = OffsetDateTime.of(LocalDateTime.of(2024, 2, 1, 9, 58, 23), ZoneOffset.UTC),
nonArrivalReasonCode = "narc1",
nonArrivalReasonCode = null,
nonArrivalReasonDescription = null,
nonArrivalNotes = "the non arrival notes",
premisesQcode = premises.qCode,
Expand Down Expand Up @@ -139,6 +138,24 @@ class SeedCas1BackfillSpaceBookingsCreatedInDeliusTest : SeedTestBase() {
),
)

// booking with non arrival recorded is ignored
deliusBookingImportRepository.save(
deliusBooking.copy(
id = UUID.randomUUID(),
nonArrivalReasonCode = "narc1",
),
)

// booking with departure recorded is ignore
deliusBookingImportRepository.save(
deliusBooking.copy(
id = UUID.randomUUID(),
departureDate = LocalDate.of(2025, 5, 4),
),
)

// TODO: test bookings outside of acceptable date ranges, double check SQL predicates against tests

withCsv(
"valid-csv",
rowsToCsv(listOf(Cas1CreateMissingReferralsSeedCsvRow(premises.qCode))),
Expand All @@ -157,13 +174,13 @@ class SeedCas1BackfillSpaceBookingsCreatedInDeliusTest : SeedTestBase() {
assertThat(migratedBooking1.placementRequest).isNull()
assertThat(migratedBooking1.createdBy).isNull()
assertThat(migratedBooking1.expectedArrivalDate).isEqualTo(LocalDate.of(2024, 5, 9))
assertThat(migratedBooking1.expectedDepartureDate).isEqualTo(LocalDate.of(2024, 6, 2))
assertThat(migratedBooking1.expectedDepartureDate).isEqualTo(LocalDate.of(2025, 6, 2))
assertThat(migratedBooking1.actualArrivalDate).isEqualTo(LocalDate.parse("2024-05-02"))
assertThat(migratedBooking1.actualArrivalTime).isNull()
assertThat(migratedBooking1.actualDepartureDate).isEqualTo(LocalDate.parse("2024-05-04"))
assertThat(migratedBooking1.actualDepartureDate).isNull()
assertThat(migratedBooking1.actualDepartureTime).isNull()
assertThat(migratedBooking1.canonicalArrivalDate).isEqualTo(LocalDate.of(2024, 5, 2))
assertThat(migratedBooking1.canonicalDepartureDate).isEqualTo(LocalDate.of(2024, 5, 4))
assertThat(migratedBooking1.canonicalDepartureDate).isEqualTo(LocalDate.of(2025, 6, 2))
assertThat(migratedBooking1.keyWorkerName).isEqualTo("kay werker")
assertThat(migratedBooking1.keyWorkerStaffCode).isEqualTo("kw001")
assertThat(migratedBooking1.keyWorkerAssignedAt).isNull()
Expand All @@ -172,12 +189,13 @@ class SeedCas1BackfillSpaceBookingsCreatedInDeliusTest : SeedTestBase() {
assertThat(migratedBooking1.cancellationOccurredAt).isNull()
assertThat(migratedBooking1.cancellationRecordedAt).isNull()
assertThat(migratedBooking1.cancellationReasonNotes).isNull()
assertThat(migratedBooking1.departureReason).isEqualTo(departureReasonActive)
assertThat(migratedBooking1.departureMoveOnCategory).isEqualTo(moveOnCategory)
assertThat(migratedBooking1.departureReason).isNull()
assertThat(migratedBooking1.departureMoveOnCategory).isNull()
assertThat(migratedBooking1.departureNotes).isNull()
assertThat(migratedBooking1.criteria).isEmpty()
assertThat(migratedBooking1.nonArrivalReason).isEqualTo(nonArrivalReasonCode)
assertThat(migratedBooking1.nonArrivalConfirmedAt).isEqualTo(Instant.parse("2024-02-01T09:58:23.00Z"))
assertThat(migratedBooking1.nonArrivalNotes).isEqualTo("the non arrival notes")
assertThat(migratedBooking1.nonArrivalReason).isNull()
assertThat(migratedBooking1.nonArrivalConfirmedAt).isNull()
assertThat(migratedBooking1.nonArrivalNotes).isNull()
assertThat(migratedBooking1.migratedManagementInfoFrom).isEqualTo(ManagementInfoSource.DELIUS)

val offlineApplication1 = migratedBooking1.offlineApplication!!
Expand Down

0 comments on commit 2c2bd76

Please sign in to comment.