Skip to content

Commit b3fdb81

Browse files
PI-2733 Only ignore historical updates to status/location for IRC and Secure Hospital releases (#4540)
* PI-2733 Only ignore historical updates to status/location for IRC and Secure Hospital releases * Formatting changes --------- Co-authored-by: probation-integration-bot[bot] <177347787+probation-integration-bot[bot]@users.noreply.github.com>
1 parent 93fdd97 commit b3fdb81

File tree

5 files changed

+24
-47
lines changed

5 files changed

+24
-47
lines changed

projects/prison-custody-status-to-delius/src/dev/kotlin/uk/gov/justice/digital/hmpps/data/generator/NotificationGenerator.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@ object NotificationGenerator {
2525
val PRISONER_ETR_IN_CUSTODY = ResourceLoader.notification<HmppsDomainEvent>("prisoner-received-etr-custody")
2626
val PRISONER_ECSLIRC_IN_CUSTODY = ResourceLoader.notification<HmppsDomainEvent>("prisoner-received-ecslirc-custody")
2727
val PRISONER_ADMIN_MERGE = ResourceLoader.notification<HmppsDomainEvent>("prisoner-released-admin-merge")
28-
val PRISONER_RELEASED_HISTORIC = ResourceLoader.notification<HmppsDomainEvent>("prisoner-released-historic")
28+
val PRISONER_RELEASED_HISTORIC =
29+
ResourceLoader.notification<HmppsDomainEvent>("prisoner-released-hospital-historic")
2930
}

projects/prison-custody-status-to-delius/src/dev/resources/messages/prisoner-released-historic.json renamed to projects/prison-custody-status-to-delius/src/dev/resources/messages/prisoner-released-hospital-historic.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"Type": "Notification",
33
"MessageId": "682dd2a4-c193-461c-a8e9-cc976a961aa5",
44
"TopicArn": "",
5-
"Message": "{\"eventType\":\"prison-offender-events.prisoner.released\",\"additionalInformation\":{\"nomsNumber\":\"A0001AA\",\"reason\":\"RELEASED\",\"details\":\"Movement reason code NCS\",\"nomisMovementReasonCode\":\"NCS\",\"currentLocation\":\"OUTSIDE_PRISON\",\"prisonId\":\"WSI\",\"currentPrisonStatus\":\"NOT_UNDER_PRISON_CARE\"},\"version\":1,\"occurredAt\":\"2010-01-01T07:03:50.912169+01:00\",\"publishedAt\":\"2010-01-01T08:00:33.477735848+01:00\",\"description\":\"A prisoner has been released from prison\",\"personReference\":{\"identifiers\":[{\"type\":\"NOMS\",\"value\":\"A0001AA\"}]}}",
5+
"Message": "{\"eventType\":\"prison-offender-events.prisoner.released\",\"additionalInformation\":{\"nomsNumber\":\"A0001AA\",\"reason\":\"RELEASED\",\"source\":\"PRISON\",\"nomisMovementReasonCode\":\"HO\",\"details\":\"ACTIVE IN:REL-HO\",\"currentLocation\":\"OUTSIDE_PRISON\",\"prisonId\": null,\"currentPrisonStatus\":\"NOT_UNDER_PRISON_CARE\"},\"version\":1,\"occurredAt\":\"2010-01-01T07:03:50.912169+01:00\",\"publishedAt\":\"2010-01-01T08:00:33.477735848+01:00\",\"description\":\"A prisoner has been released to hospital\", \"personReference\":{\"identifiers\":[{\"type\":\"NOMS\",\"value\":\"A0001AA\"}]}}",
66
"Timestamp": "2022-05-04T07:00:33.487Z",
77
"SignatureVersion": "1",
88
"Signature": "",

projects/prison-custody-status-to-delius/src/main/kotlin/uk/gov/justice/digital/hmpps/messaging/PrisonerMovement.kt

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package uk.gov.justice.digital.hmpps.messaging
22

33
import uk.gov.justice.digital.hmpps.integrations.delius.custody.entity.Custody
4+
import java.time.LocalDate
45
import java.time.ZonedDateTime
56

67
sealed interface PrisonerMovement {
@@ -77,8 +78,13 @@ fun PrisonerMovement.receivedDateValid(custody: Custody): Boolean {
7778
return occurredAt <= ZonedDateTime.now() && (releaseDate == null || occurredAt >= releaseDate)
7879
}
7980

80-
fun PrisonerMovement.statusDateValid(custody: Custody): Boolean =
81-
occurredAt <= ZonedDateTime.now() && occurredAt.toLocalDate() >= custody.statusChangeDate
81+
fun PrisonerMovement.occurredAfter(date: LocalDate?): Boolean =
82+
occurredAt <= ZonedDateTime.now() && (date == null || occurredAt.toLocalDate() >= date)
8283

83-
fun PrisonerMovement.locationDateValid(custody: Custody): Boolean =
84-
occurredAt <= ZonedDateTime.now() && (custody.locationChangeDate == null || occurredAt.toLocalDate() >= custody.locationChangeDate)
84+
fun PrisonerMovement.isReceived() = this is PrisonerMovement.Received
85+
86+
fun PrisonerMovement.isReleased() = this is PrisonerMovement.Released &&
87+
!(isHospitalRelease() || isIrcRelease() || isAbsconded())
88+
89+
fun PrisonerMovement.isToSecureUnitOutsidePrison() = this is PrisonerMovement.Released &&
90+
(isHospitalRelease() || isIrcRelease())

projects/prison-custody-status-to-delius/src/main/kotlin/uk/gov/justice/digital/hmpps/messaging/actions/UpdateLocationAction.kt

+6-21
Original file line numberDiff line numberDiff line change
@@ -116,26 +116,11 @@ class UpdateLocationAction(
116116
}
117117
}
118118

119-
private fun checkPreconditions(prisonerMovement: PrisonerMovement, custody: Custody): ActionResult? {
120-
if (prisonerMovement is PrisonerMovement.Received && custody.institution?.nomisCdeCode == prisonerMovement.toPrisonId) {
121-
return ActionResult.Ignored("PrisonerLocationCorrect", prisonerMovement.telemetryProperties())
122-
}
123-
124-
if (prisonerMovement is PrisonerMovement.Received && !prisonerMovement.receivedDateValid(custody)) {
125-
return ActionResult.Ignored("PrisonerLocationCorrect", prisonerMovement.telemetryProperties())
126-
}
119+
private fun checkPreconditions(movement: PrisonerMovement, custody: Custody) = if (
120+
(movement.isReceived() && !(movement.locationChanged(custody) && movement.receivedDateValid(custody))) ||
121+
(movement.isReleased() && !movement.releaseDateValid(custody)) ||
122+
(movement.isToSecureUnitOutsidePrison() && !movement.occurredAfter(custody.locationChangeDate))
123+
) ActionResult.Ignored("PrisonerLocationCorrect", movement.telemetryProperties()) else null
127124

128-
if (prisonerMovement is PrisonerMovement.Released &&
129-
!(prisonerMovement.isHospitalRelease() || prisonerMovement.isIrcRelease() || prisonerMovement.isAbsconded()) &&
130-
!prisonerMovement.releaseDateValid(custody)
131-
) {
132-
return ActionResult.Ignored("PrisonerLocationCorrect", prisonerMovement.telemetryProperties())
133-
}
134-
135-
if (!prisonerMovement.locationDateValid(custody)) {
136-
return ActionResult.Ignored("PrisonerLocationCorrect", prisonerMovement.telemetryProperties())
137-
}
138-
139-
return null
140-
}
125+
private fun PrisonerMovement.locationChanged(custody: Custody) = custody.institution?.nomisCdeCode != toPrisonId
141126
}

projects/prison-custody-status-to-delius/src/main/kotlin/uk/gov/justice/digital/hmpps/messaging/actions/UpdateStatusAction.kt

+5-20
Original file line numberDiff line numberDiff line change
@@ -76,26 +76,11 @@ class UpdateStatusAction(
7676
ActionResult.Success(ActionResult.Type.StatusUpdated, prisonerMovement.telemetryProperties())
7777
}
7878

79-
private fun checkPreconditions(prisonerMovement: PrisonerMovement, custody: Custody): ActionResult? {
80-
if (prisonerMovement is PrisonerMovement.Received &&
81-
!(custody.status.canChange() && prisonerMovement.receivedDateValid(custody))
82-
) {
83-
return ActionResult.Ignored("PrisonerStatusCorrect", prisonerMovement.telemetryProperties())
84-
}
85-
86-
if (prisonerMovement is PrisonerMovement.Released &&
87-
!(prisonerMovement.isHospitalRelease() || prisonerMovement.isIrcRelease() || prisonerMovement.isAbsconded()) &&
88-
!(custody.canBeReleased() && prisonerMovement.releaseDateValid(custody))
89-
) {
90-
return ActionResult.Ignored("PrisonerStatusCorrect", prisonerMovement.telemetryProperties())
91-
}
92-
93-
if (!prisonerMovement.statusDateValid(custody)) {
94-
return ActionResult.Ignored("PrisonerStatusCorrect", prisonerMovement.telemetryProperties())
95-
}
96-
97-
return null
98-
}
79+
private fun checkPreconditions(movement: PrisonerMovement, custody: Custody) = if (
80+
(movement.isReceived() && !(custody.status.canChange() && movement.receivedDateValid(custody))) ||
81+
(movement.isReleased() && !(custody.canBeReleased() && movement.releaseDateValid(custody))) ||
82+
(movement.isToSecureUnitOutsidePrison() && !movement.occurredAfter(custody.statusChangeDate))
83+
) ActionResult.Ignored("PrisonerStatusCorrect", movement.telemetryProperties()) else null
9984
}
10085

10186
private fun ReferenceData.canChange() = !NO_CHANGE_STATUSES.map { it.code }.contains(code)

0 commit comments

Comments
 (0)