1
1
package uk.gov.justice.digital.hmpps.messaging
2
2
3
3
import org.springframework.stereotype.Component
4
+ import org.springframework.transaction.annotation.Transactional
4
5
import uk.gov.justice.digital.hmpps.client.ManageOffencesClient
5
6
import uk.gov.justice.digital.hmpps.client.Offence
6
7
import uk.gov.justice.digital.hmpps.converter.NotificationConverter
7
8
import uk.gov.justice.digital.hmpps.entity.DetailedOffence
9
+ import uk.gov.justice.digital.hmpps.entity.OffenceRepository
10
+ import uk.gov.justice.digital.hmpps.entity.ReferenceOffence
8
11
import uk.gov.justice.digital.hmpps.exception.NotFoundException
12
+ import uk.gov.justice.digital.hmpps.flags.FeatureFlags
9
13
import uk.gov.justice.digital.hmpps.message.HmppsDomainEvent
10
14
import uk.gov.justice.digital.hmpps.message.Notification
11
15
import uk.gov.justice.digital.hmpps.repository.DetailedOffenceRepository
@@ -14,18 +18,26 @@ import uk.gov.justice.digital.hmpps.repository.findCourtCategory
14
18
import uk.gov.justice.digital.hmpps.telemetry.TelemetryService
15
19
import uk.gov.justice.digital.hmpps.telemetry.notificationReceived
16
20
21
+ const val FF_CREATE_OFFENCE = " manage-offences-create-offence"
22
+
17
23
@Component
18
24
class Handler (
19
25
override val converter : NotificationConverter <HmppsDomainEvent >,
20
26
private val telemetryService : TelemetryService ,
21
27
private val manageOffencesClient : ManageOffencesClient ,
22
28
private val detailedOffenceRepository : DetailedOffenceRepository ,
23
- private val referenceDataRepository : ReferenceDataRepository
29
+ private val offenceRepository : OffenceRepository ,
30
+ private val referenceDataRepository : ReferenceDataRepository ,
31
+ private val featureFlags : FeatureFlags
24
32
) : NotificationHandler<HmppsDomainEvent> {
25
33
34
+ @Transactional
26
35
override fun handle (notification : Notification <HmppsDomainEvent >) {
27
36
telemetryService.notificationReceived(notification)
28
37
val offence = manageOffencesClient.getOffence(notification.message.offenceCode)
38
+ if (featureFlags.enabled(FF_CREATE_OFFENCE )) {
39
+ offence.createOrMerge()
40
+ }
29
41
val existingEntity = detailedOffenceRepository.findByCode(offence.code)
30
42
detailedOffenceRepository.save(existingEntity.mergeWith(offence.newEntity))
31
43
telemetryService.trackEvent(
@@ -57,6 +69,52 @@ class Handler(
57
69
legislation = newEntity.legislation,
58
70
category = newEntity.category
59
71
) ? : newEntity
72
+
73
+ private fun Offence.createOrMerge () {
74
+ if (homeOfficeStatsCode != null && homeOfficeDescription != null ) {
75
+ val highLevelOffence = checkNotNull(offenceRepository.findOffenceByCode(highLevelCode!! )) {
76
+ " High Level Offence not found: $highLevelCode "
77
+ }
78
+
79
+ val offence = offenceRepository.findOffenceByCode(homeOfficeCode).mergeWith(asReference(highLevelOffence))
80
+ offenceRepository.save(offence)
81
+ }
82
+ }
60
83
}
61
84
62
85
val HmppsDomainEvent .offenceCode get() = additionalInformation[" offenceCode" ] as String
86
+
87
+ val Offence .mainCategoryCode get() = homeOfficeStatsCode?.take(3 )
88
+ val Offence .subCategoryCode get() = homeOfficeStatsCode?.takeLast(2 )
89
+ val Offence .highLevelCode get() = mainCategoryCode?.let { it + " 00" }
90
+ val Offence .homeOfficeCode get() = mainCategoryCode + subCategoryCode
91
+ fun Offence.asReference (highLevelOffence : ReferenceOffence ) = ReferenceOffence (
92
+ code = homeOfficeCode,
93
+ description = homeOfficeDescription!! ,
94
+ mainCategoryCode = mainCategoryCode!! ,
95
+ selectable = false ,
96
+ mainCategoryDescription = highLevelOffence.description,
97
+ mainCategoryAbbreviation = highLevelOffence.description.take(50 ),
98
+ ogrsOffenceCategoryId = highLevelOffence.ogrsOffenceCategoryId,
99
+ subCategoryCode = subCategoryCode!! ,
100
+ subCategoryDescription = " $homeOfficeDescription - $subCategoryCode " ,
101
+ form20Code = highLevelOffence.form20Code,
102
+ childAbduction = null ,
103
+ schedule15SexualOffence = null ,
104
+ schedule15ViolentOffence = null
105
+ )
106
+
107
+ fun ReferenceOffence?.mergeWith (referenceOffence : ReferenceOffence ) = this ?.copy(
108
+ code = code,
109
+ description = description,
110
+ mainCategoryCode = mainCategoryCode,
111
+ mainCategoryDescription = mainCategoryDescription,
112
+ mainCategoryAbbreviation = mainCategoryAbbreviation,
113
+ ogrsOffenceCategoryId = ogrsOffenceCategoryId,
114
+ subCategoryCode = subCategoryCode,
115
+ subCategoryDescription = subCategoryDescription,
116
+ form20Code = form20Code,
117
+ schedule15SexualOffence = schedule15SexualOffence,
118
+ schedule15ViolentOffence = schedule15ViolentOffence,
119
+ childAbduction = childAbduction
120
+ ) ? : referenceOffence
0 commit comments