Skip to content

Commit b81bf00

Browse files
Tildel enhet on active oppfolgingsoppgave (#351)
1 parent 2daa2fb commit b81bf00

File tree

7 files changed

+134
-27
lines changed

7 files changed

+134
-27
lines changed

src/main/kotlin/no/nav/syfo/App.kt

+13
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import no.nav.syfo.application.cache.RedisStore
1313
import no.nav.syfo.application.database.database
1414
import no.nav.syfo.application.database.databaseModule
1515
import no.nav.syfo.client.azuread.AzureAdClient
16+
import no.nav.syfo.client.behandlendeenhet.BehandlendeEnhetClient
1617
import no.nav.syfo.client.pdl.PdlClient
18+
import no.nav.syfo.cronjob.behandlendeenhet.PersonBehandlendeEnhetService
1719
import no.nav.syfo.cronjob.launchCronjobModule
1820
import no.nav.syfo.kafka.launchKafkaModule
1921
import no.nav.syfo.personstatus.PersonoversiktStatusService
@@ -45,7 +47,12 @@ fun main() {
4547
azureAdClient = azureAdClient,
4648
clientEnvironment = environment.clients.pdl,
4749
)
50+
val behandlendeEnhetClient = BehandlendeEnhetClient(
51+
azureAdClient = azureAdClient,
52+
clientEnvironment = environment.clients.syfobehandlendeenhet,
53+
)
4854

55+
lateinit var personBehandlendeEnhetService: PersonBehandlendeEnhetService
4956
lateinit var personoversiktStatusService: PersonoversiktStatusService
5057

5158
val applicationEngineEnvironment = applicationEngineEnvironment {
@@ -64,6 +71,10 @@ fun main() {
6471
database = database,
6572
pdlClient = pdlClient,
6673
)
74+
personBehandlendeEnhetService = PersonBehandlendeEnhetService(
75+
database = database,
76+
behandlendeEnhetClient = behandlendeEnhetClient,
77+
)
6778
apiModule(
6879
applicationState = applicationState,
6980
database = database,
@@ -92,13 +103,15 @@ fun main() {
92103
environment = environment,
93104
azureAdClient = azureAdClient,
94105
personoversiktStatusService = personoversiktStatusService,
106+
personBehandlendeEnhetService = personBehandlendeEnhetService,
95107
)
96108
launchCronjobModule(
97109
applicationState = applicationState,
98110
database = database,
99111
environment = environment,
100112
redisStore = redisStore,
101113
azureAdClient = azureAdClient,
114+
personBehandlendeEnhetService = personBehandlendeEnhetService,
102115
)
103116
}
104117

src/main/kotlin/no/nav/syfo/cronjob/CronjobModule.kt

+1-9
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import no.nav.syfo.application.backgroundtask.launchBackgroundTask
66
import no.nav.syfo.application.cache.RedisStore
77
import no.nav.syfo.application.database.DatabaseInterface
88
import no.nav.syfo.client.azuread.AzureAdClient
9-
import no.nav.syfo.client.behandlendeenhet.BehandlendeEnhetClient
109
import no.nav.syfo.client.ereg.EregClient
1110
import no.nav.syfo.client.veiledertilgang.VeilederTilgangskontrollClient
1211
import no.nav.syfo.cronjob.behandlendeenhet.PersonBehandlendeEnhetCronjob
@@ -24,6 +23,7 @@ fun launchCronjobModule(
2423
environment: Environment,
2524
redisStore: RedisStore,
2625
azureAdClient: AzureAdClient,
26+
personBehandlendeEnhetService: PersonBehandlendeEnhetService,
2727
) {
2828
val eregClient = EregClient(
2929
clientEnvironment = environment.clients.ereg,
@@ -37,14 +37,6 @@ fun launchCronjobModule(
3737
personOppfolgingstilfelleVirksomhetsnavnService = personOppfolgingstilfelleVirksomhetsnavnService,
3838
)
3939

40-
val behandlendeEnhetClient = BehandlendeEnhetClient(
41-
azureAdClient = azureAdClient,
42-
clientEnvironment = environment.clients.syfobehandlendeenhet,
43-
)
44-
val personBehandlendeEnhetService = PersonBehandlendeEnhetService(
45-
database = database,
46-
behandlendeEnhetClient = behandlendeEnhetClient,
47-
)
4840
val personBehandlendeEnhetCronjob = PersonBehandlendeEnhetCronjob(
4941
personBehandlendeEnhetService = personBehandlendeEnhetService,
5042
intervalDelayMinutes = environment.cronjobBehandlendeEnhetIntervalDelayMinutes,

src/main/kotlin/no/nav/syfo/kafka/KafkaModule.kt

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import no.nav.syfo.aktivitetskravvurdering.kafka.launchKafkaTaskAktivitetskravVu
44
import no.nav.syfo.application.ApplicationState
55
import no.nav.syfo.application.Environment
66
import no.nav.syfo.client.azuread.AzureAdClient
7+
import no.nav.syfo.cronjob.behandlendeenhet.PersonBehandlendeEnhetService
78
import no.nav.syfo.dialogmotekandidat.kafka.launchKafkaTaskDialogmotekandidatEndring
89
import no.nav.syfo.dialogmotestatusendring.kafka.launchKafkaTaskDialogmoteStatusendring
910
import no.nav.syfo.trengeroppfolging.kafka.launchTrengerOppfolgingConsumer
@@ -18,6 +19,7 @@ fun launchKafkaModule(
1819
environment: Environment,
1920
azureAdClient: AzureAdClient,
2021
personoversiktStatusService: PersonoversiktStatusService,
22+
personBehandlendeEnhetService: PersonBehandlendeEnhetService,
2123
) {
2224
launchKafkaTaskPersonoppgavehendelse(
2325
applicationState = applicationState,
@@ -56,5 +58,6 @@ fun launchKafkaModule(
5658
launchTrengerOppfolgingConsumer(
5759
applicationState = applicationState,
5860
kafkaEnvironment = environment.kafka,
61+
personBehandlendeEnhetService = personBehandlendeEnhetService,
5962
)
6063
}

src/main/kotlin/no/nav/syfo/trengeroppfolging/TrengerOppfolgingService.kt

+35
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package no.nav.syfo.trengeroppfolging
22

3+
import kotlinx.coroutines.Dispatchers
4+
import kotlinx.coroutines.launch
5+
import kotlinx.coroutines.runBlocking
36
import no.nav.syfo.application.database.DatabaseInterface
7+
import no.nav.syfo.cronjob.behandlendeenhet.PersonBehandlendeEnhetService
8+
import no.nav.syfo.domain.PersonIdent
49
import no.nav.syfo.trengeroppfolging.domain.TrengerOppfolging
510
import no.nav.syfo.trengeroppfolging.kafka.COUNT_KAFKA_CONSUMER_TRENGER_OPPFOLGING_READ
611
import no.nav.syfo.personstatus.db.createPersonOversiktStatus
@@ -11,8 +16,19 @@ import org.slf4j.LoggerFactory
1116

1217
class TrengerOppfolgingService(
1318
private val database: DatabaseInterface,
19+
private val personBehandlendeEnhetService: PersonBehandlendeEnhetService,
1420
) {
1521
fun processTrengerOppfolging(records: List<TrengerOppfolging>) {
22+
createOrUpdatePersonOversiktStatus(records)
23+
records.filter { it.isActive }.forEach {
24+
val personOversiktStatus = database.getPersonOversiktStatusList(
25+
fnr = it.personIdent.value,
26+
).first()
27+
updateBehandlendeEnhet(it.personIdent, personOversiktStatus.enhet)
28+
}
29+
}
30+
31+
private fun createOrUpdatePersonOversiktStatus(records: List<TrengerOppfolging>) {
1632
database.connection.use { connection ->
1733
records.forEach { trengerOppfolging ->
1834
val existingPersonOversiktStatus = connection.getPersonOversiktStatusList(
@@ -36,6 +52,25 @@ class TrengerOppfolgingService(
3652
}
3753
}
3854

55+
private fun updateBehandlendeEnhet(
56+
personIdent: PersonIdent,
57+
existingEnhet: String?
58+
) {
59+
try {
60+
runBlocking {
61+
launch(Dispatchers.IO) {
62+
personBehandlendeEnhetService.updateBehandlendeEnhet(
63+
personIdent = personIdent,
64+
tildeltEnhet = existingEnhet
65+
)
66+
log.info("Updated Behandlende Enhet of person after received active oppfolgingsoppgave")
67+
}
68+
}
69+
} catch (ex: Exception) {
70+
log.error("Exception caught while attempting to update Behandlende Enhet of person after received active oppfolgingsoppgave", ex)
71+
}
72+
}
73+
3974
companion object {
4075
val log: Logger = LoggerFactory.getLogger(this::class.java)
4176
}

src/main/kotlin/no/nav/syfo/trengeroppfolging/kafka/TrengerOppfolgingTask.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import no.nav.syfo.application.ApplicationState
44
import no.nav.syfo.application.database.database
55
import no.nav.syfo.application.kafka.KafkaEnvironment
66
import no.nav.syfo.application.kafka.kafkaAivenConsumerConfig
7+
import no.nav.syfo.cronjob.behandlendeenhet.PersonBehandlendeEnhetService
78
import no.nav.syfo.trengeroppfolging.TrengerOppfolgingService
89
import no.nav.syfo.kafka.launchKafkaTask
910
import no.nav.syfo.util.configuredJacksonMapper
@@ -17,9 +18,11 @@ const val HUSKELAPP_TOPIC =
1718
fun launchTrengerOppfolgingConsumer(
1819
applicationState: ApplicationState,
1920
kafkaEnvironment: KafkaEnvironment,
21+
personBehandlendeEnhetService: PersonBehandlendeEnhetService,
2022
) {
2123
val trengerOppfolgingService = TrengerOppfolgingService(
22-
database = database
24+
database = database,
25+
personBehandlendeEnhetService = personBehandlendeEnhetService,
2326
)
2427
val trengerOppfolgingConsumer = TrengerOppfolgingConsumer(
2528
trengerOppfolgingService = trengerOppfolgingService,

src/test/kotlin/no/nav/syfo/testutil/InternalMockEnvironment.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class InternalMockEnvironment private constructor() {
3636
redisStore = redisStore,
3737
)
3838

39-
private val personBehandlendeEnhetService = PersonBehandlendeEnhetService(
39+
internal val personBehandlendeEnhetService = PersonBehandlendeEnhetService(
4040
database = database,
4141
behandlendeEnhetClient = behandlendeEnhetClient,
4242
)

src/test/kotlin/no/nav/syfo/trengeroppfolging/kafka/TrengerOppfolgingConsumerSpek.kt

+77-16
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,14 @@ import io.mockk.clearMocks
55
import io.mockk.every
66
import io.mockk.mockk
77
import io.mockk.verify
8-
import kotlinx.coroutines.isActive
98
import no.nav.syfo.trengeroppfolging.TrengerOppfolgingService
109
import no.nav.syfo.personstatus.db.getPersonOversiktStatusList
1110
import no.nav.syfo.personstatus.domain.PersonOversiktStatus
12-
import no.nav.syfo.testutil.ExternalMockEnvironment
13-
import no.nav.syfo.testutil.UserConstants
14-
import no.nav.syfo.testutil.createPersonOversiktStatus
15-
import no.nav.syfo.testutil.dropData
11+
import no.nav.syfo.testutil.*
1612
import no.nav.syfo.testutil.generator.generateKafkaHuskelapp
1713
import no.nav.syfo.testutil.generator.huskelappConsumerRecord
1814
import no.nav.syfo.testutil.generator.huskelappTopicPartition
19-
import org.amshove.kluent.shouldBeEqualTo
20-
import org.amshove.kluent.shouldBeFalse
21-
import org.amshove.kluent.shouldBeNull
22-
import org.amshove.kluent.shouldBeTrue
15+
import org.amshove.kluent.*
2316
import org.apache.kafka.clients.consumer.ConsumerRecords
2417
import org.apache.kafka.clients.consumer.KafkaConsumer
2518
import org.spekframework.spek2.Spek
@@ -32,10 +25,14 @@ class TrengerOppfolgingConsumerSpek : Spek({
3225
start()
3326

3427
val externalMockEnvironment = ExternalMockEnvironment.instance
28+
val internalMockEnvironment = InternalMockEnvironment.instance
3529
val database = externalMockEnvironment.database
3630

3731
val kafkaConsumerMock = mockk<KafkaConsumer<String, KafkaHuskelapp>>()
38-
val trengerOppfolgingService = TrengerOppfolgingService(database)
32+
val trengerOppfolgingService = TrengerOppfolgingService(
33+
database = database,
34+
personBehandlendeEnhetService = internalMockEnvironment.personBehandlendeEnhetService
35+
)
3936
val trengerOppfolgingConsumer = TrengerOppfolgingConsumer(trengerOppfolgingService)
4037

4138
val frist = LocalDate.now().plusWeeks(1)
@@ -95,6 +92,70 @@ class TrengerOppfolgingConsumerSpek : Spek({
9592
pPersonOversiktStatus.trengerOppfolging.shouldBeTrue()
9693
pPersonOversiktStatus.trengerOppfolgingFrist.shouldBeNull()
9794
}
95+
it("updates PersonOversiktStatus tildeltEnhet for personident from kafka record with active huskelapp") {
96+
val activeHuskelappNoFrist = generateKafkaHuskelapp(isActive = true, frist = null)
97+
mockIncomingKafkaRecord(
98+
kafkaRecord = activeHuskelappNoFrist,
99+
kafkaConsumerMock = kafkaConsumerMock,
100+
)
101+
102+
trengerOppfolgingConsumer.pollAndProcessRecords(
103+
kafkaConsumer = kafkaConsumerMock,
104+
)
105+
106+
verify(exactly = 1) {
107+
kafkaConsumerMock.commitSync()
108+
}
109+
110+
val pPersonOversiktStatusList =
111+
database.connection.use { it.getPersonOversiktStatusList(UserConstants.ARBEIDSTAKER_FNR) }
112+
pPersonOversiktStatusList.size shouldBeEqualTo 1
113+
val pPersonOversiktStatus = pPersonOversiktStatusList.first()
114+
pPersonOversiktStatus.enhet.shouldNotBeNull()
115+
}
116+
it("does not update PersonOversiktStatus tildeltEnhet for personident from kafka record with inactive huskelapp") {
117+
val inactiveHuskelappNoFrist = generateKafkaHuskelapp(isActive = false, frist = null)
118+
mockIncomingKafkaRecord(
119+
kafkaRecord = inactiveHuskelappNoFrist,
120+
kafkaConsumerMock = kafkaConsumerMock,
121+
)
122+
123+
trengerOppfolgingConsumer.pollAndProcessRecords(
124+
kafkaConsumer = kafkaConsumerMock,
125+
)
126+
127+
verify(exactly = 1) {
128+
kafkaConsumerMock.commitSync()
129+
}
130+
131+
val pPersonOversiktStatusList =
132+
database.connection.use { it.getPersonOversiktStatusList(UserConstants.ARBEIDSTAKER_FNR) }
133+
pPersonOversiktStatusList.size shouldBeEqualTo 1
134+
val pPersonOversiktStatus = pPersonOversiktStatusList.first()
135+
pPersonOversiktStatus.enhet.shouldBeNull()
136+
}
137+
it("does not update PersonOversiktStatus tildeltEnhet for personident from kafka record with active huskelapp and failing call to behandlende enhet") {
138+
val personIdent = UserConstants.ARBEIDSTAKER_ENHET_ERROR_PERSONIDENT.value
139+
val activeHuskelappNoFrist = generateKafkaHuskelapp(isActive = true, frist = null, personIdent = personIdent)
140+
mockIncomingKafkaRecord(
141+
kafkaRecord = activeHuskelappNoFrist,
142+
kafkaConsumerMock = kafkaConsumerMock,
143+
)
144+
145+
trengerOppfolgingConsumer.pollAndProcessRecords(
146+
kafkaConsumer = kafkaConsumerMock,
147+
)
148+
149+
verify(exactly = 1) {
150+
kafkaConsumerMock.commitSync()
151+
}
152+
153+
val pPersonOversiktStatusList =
154+
database.connection.use { it.getPersonOversiktStatusList(personIdent) }
155+
pPersonOversiktStatusList.size shouldBeEqualTo 1
156+
val pPersonOversiktStatus = pPersonOversiktStatusList.first()
157+
pPersonOversiktStatus.enhet.shouldBeNull()
158+
}
98159
}
99160
describe("existing PersonOversikStatus for personident") {
100161
it("updates trenger_oppfolging and trenger_oppfolging_frist from kafka record with active huskelapp and frist") {
@@ -124,7 +185,7 @@ class TrengerOppfolgingConsumerSpek : Spek({
124185
pPersonOversiktStatus.trengerOppfolgingFrist shouldBeEqualTo frist
125186
}
126187
it("updates to trenger_oppfolging false and trenger_oppfolging_frist null from kafka record with inactive huskelapp and frist") {
127-
val inActiveHuskelappWithFrist = generateKafkaHuskelapp(isActive = false, frist = frist)
188+
val inactiveHuskelappWithFrist = generateKafkaHuskelapp(isActive = false, frist = frist)
128189
val personident = UserConstants.ARBEIDSTAKER_FNR
129190
database.createPersonOversiktStatus(
130191
personOversiktStatus = PersonOversiktStatus(
@@ -134,7 +195,7 @@ class TrengerOppfolgingConsumerSpek : Spek({
134195
)
135196
)
136197
mockIncomingKafkaRecord(
137-
kafkaRecord = inActiveHuskelappWithFrist,
198+
kafkaRecord = inactiveHuskelappWithFrist,
138199
kafkaConsumerMock = kafkaConsumerMock,
139200
)
140201

@@ -149,12 +210,12 @@ class TrengerOppfolgingConsumerSpek : Spek({
149210
database.connection.use { it.getPersonOversiktStatusList(personident) }
150211
pPersonOversiktStatusList.size shouldBeEqualTo 1
151212
val pPersonOversiktStatus = pPersonOversiktStatusList.first()
152-
pPersonOversiktStatus.fnr shouldBeEqualTo inActiveHuskelappWithFrist.personIdent
213+
pPersonOversiktStatus.fnr shouldBeEqualTo inactiveHuskelappWithFrist.personIdent
153214
pPersonOversiktStatus.trengerOppfolging.shouldBeFalse()
154215
pPersonOversiktStatus.trengerOppfolgingFrist.shouldBeNull()
155216
}
156217
it("updates to trenger_oppfolging false and trenger_oppfolging_frist null from kafka record with inactive huskelapp and no frist") {
157-
val inActiveHuskelappNoFrist = generateKafkaHuskelapp(isActive = false, frist = null)
218+
val inactiveHuskelappNoFrist = generateKafkaHuskelapp(isActive = false, frist = null)
158219
val personident = UserConstants.ARBEIDSTAKER_FNR
159220
database.createPersonOversiktStatus(
160221
personOversiktStatus = PersonOversiktStatus(
@@ -164,7 +225,7 @@ class TrengerOppfolgingConsumerSpek : Spek({
164225
)
165226
)
166227
mockIncomingKafkaRecord(
167-
kafkaRecord = inActiveHuskelappNoFrist,
228+
kafkaRecord = inactiveHuskelappNoFrist,
168229
kafkaConsumerMock = kafkaConsumerMock,
169230
)
170231

@@ -179,7 +240,7 @@ class TrengerOppfolgingConsumerSpek : Spek({
179240
database.connection.use { it.getPersonOversiktStatusList(personident) }
180241
pPersonOversiktStatusList.size shouldBeEqualTo 1
181242
val pPersonOversiktStatus = pPersonOversiktStatusList.first()
182-
pPersonOversiktStatus.fnr shouldBeEqualTo inActiveHuskelappNoFrist.personIdent
243+
pPersonOversiktStatus.fnr shouldBeEqualTo inactiveHuskelappNoFrist.personIdent
183244
pPersonOversiktStatus.trengerOppfolging.shouldBeFalse()
184245
pPersonOversiktStatus.trengerOppfolgingFrist.shouldBeNull()
185246
}

0 commit comments

Comments
 (0)