Skip to content

Commit

Permalink
IS-2711: Historikk for veilederknytning
Browse files Browse the repository at this point in the history
  • Loading branch information
geir-waagboe committed Oct 24, 2024
1 parent 52152ed commit 173e994
Show file tree
Hide file tree
Showing 11 changed files with 170 additions and 97 deletions.
2 changes: 2 additions & 0 deletions src/main/kotlin/no/nav/syfo/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ fun main() {
arbeidsuforhetvurderingClient = arbeidsuforhetvurderingClient,
merOppfolgingClient = merOppfolgingClient,
),
personBehandlendeEnhetService = personBehandlendeEnhetService,
personoversiktStatusRepository = personoversiktStatusRepository,
)
}
}
Expand Down
27 changes: 17 additions & 10 deletions src/main/kotlin/no/nav/syfo/personstatus/PersonTildelingService.kt
Original file line number Diff line number Diff line change
@@ -1,18 +1,25 @@
package no.nav.syfo.personstatus

import no.nav.syfo.personstatus.infrastructure.database.DatabaseInterface
import no.nav.syfo.personstatus.db.lagreVeilederForBruker
import no.nav.syfo.personstatus.application.IPersonOversiktStatusRepository
import no.nav.syfo.personstatus.domain.PersonIdent
import no.nav.syfo.personstatus.domain.VeilederBrukerKnytning
import no.nav.syfo.personstatus.infrastructure.cronjob.behandlendeenhet.PersonBehandlendeEnhetService

class PersonTildelingService(private val database: DatabaseInterface) {

fun lagreKnytningMellomVeilederOgBruker(
class PersonTildelingService(
private val personoversiktStatusRepository: IPersonOversiktStatusRepository,
private val personBehandlendeEnhetService: PersonBehandlendeEnhetService,
) {
suspend fun lagreKnytningMellomVeilederOgBruker(
veilederBrukerKnytninger: List<VeilederBrukerKnytning>,
tildeltAv: String,
) = veilederBrukerKnytninger.map {
database.lagreVeilederForBruker(
veilederBrukerKnytning = it,
tildeltAv = tildeltAv,
)
) {
veilederBrukerKnytninger.map {
personoversiktStatusRepository.createPersonOversiktStatusIfMissing(PersonIdent(it.fnr))
personBehandlendeEnhetService.updateBehandlendeEnhet(PersonIdent(it.fnr))
personoversiktStatusRepository.lagreVeilederForBruker(
veilederBrukerKnytning = it,
tildeltAv = tildeltAv,
)
}
}
}
7 changes: 6 additions & 1 deletion src/main/kotlin/no/nav/syfo/personstatus/api/v2/ApiModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ import no.nav.syfo.personstatus.api.v2.auth.JwtIssuerType
import no.nav.syfo.personstatus.api.v2.auth.WellKnown
import no.nav.syfo.personstatus.api.v2.endpoints.registerPersonTildelingApiV2
import no.nav.syfo.personstatus.api.v2.endpoints.registerPersonoversiktApiV2
import no.nav.syfo.personstatus.application.IPersonOversiktStatusRepository
import no.nav.syfo.personstatus.infrastructure.cronjob.behandlendeenhet.PersonBehandlendeEnhetService

fun Application.apiModule(
applicationState: ApplicationState,
Expand All @@ -31,6 +33,8 @@ fun Application.apiModule(
personoversiktStatusService: PersonoversiktStatusService,
tilgangskontrollClient: VeilederTilgangskontrollClient,
personoversiktOppgaverService: PersonoversiktOppgaverService,
personBehandlendeEnhetService: PersonBehandlendeEnhetService,
personoversiktStatusRepository: IPersonOversiktStatusRepository,
) {
installCallId()
installContentNegotiation()
Expand All @@ -48,7 +52,8 @@ fun Application.apiModule(
)

val personTildelingService = PersonTildelingService(
database = database,
personoversiktStatusRepository = personoversiktStatusRepository,
personBehandlendeEnhetService = personBehandlendeEnhetService,
)

routing {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package no.nav.syfo.personstatus.application

import no.nav.syfo.personstatus.domain.PersonIdent
import no.nav.syfo.personstatus.domain.PersonOversiktStatus
import no.nav.syfo.personstatus.domain.VeilederBrukerKnytning

interface IPersonOversiktStatusRepository {

Expand All @@ -14,4 +15,11 @@ interface IPersonOversiktStatusRepository {
fun upsertManglendeMedvirkningStatus(personident: PersonIdent, isAktivVurdering: Boolean): Result<Int>

fun getPersonOversiktStatus(personident: PersonIdent): PersonOversiktStatus?

fun createPersonOversiktStatusIfMissing(personident: PersonIdent)

fun lagreVeilederForBruker(
veilederBrukerKnytning: VeilederBrukerKnytning,
tildeltAv: String,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,8 @@ import no.nav.syfo.oppfolgingstilfelle.domain.Oppfolgingstilfelle
import no.nav.syfo.personstatus.domain.*
import no.nav.syfo.util.nowUTC
import java.sql.*
import java.sql.Date
import java.sql.Types.NULL
import java.time.Instant
import java.time.LocalDate
import java.util.*

const val queryCreatePersonOversiktStatus =
Expand Down Expand Up @@ -169,74 +167,6 @@ fun Connection.updatePersonOversiktStatusOppfolgingstilfelle(
)
}

const val getTildeltVeilederQuery =
"""
SELECT id,tildelt_veileder,tildelt_enhet FROM PERSON_OVERSIKT_STATUS
WHERE fnr = ?
"""

const val updateTildeltVeilederQuery =
"""
UPDATE PERSON_OVERSIKT_STATUS
SET tildelt_veileder = ?, sist_endret = ?
WHERE fnr = ?
"""

const val createVeilederHistorikk =
"""
INSERT INTO VEILEDER_HISTORIKK (
id,uuid,person_oversikt_status_id,fra_dato,tildelt_veileder,tildelt_enhet,tildelt_av
) VALUES(DEFAULT,?,?,?,?,?,?)
"""

fun DatabaseInterface.lagreVeilederForBruker(
veilederBrukerKnytning: VeilederBrukerKnytning,
tildeltAv: String,
) {
val existingVeilederAndEnhet = this.connection.use {
connection.prepareStatement(getTildeltVeilederQuery).use {
it.setString(1, veilederBrukerKnytning.fnr)
it.executeQuery().toList {
Triple(
getInt("id"),
getString("tildelt_veileder"),
getString("tildelt_enhet")
)
}
}.firstOrNull()
}
if (
existingVeilederAndEnhet != null && (
existingVeilederAndEnhet.second == null ||
existingVeilederAndEnhet.second != veilederBrukerKnytning.veilederIdent
)
) {
this.connection.use { connection ->
val rowCount = connection.prepareStatement(updateTildeltVeilederQuery).use {
it.setString(1, veilederBrukerKnytning.veilederIdent)
it.setObject(2, Timestamp.from(Instant.now()))
it.setString(3, veilederBrukerKnytning.fnr)
it.executeUpdate()
}
if (rowCount != 1) {
throw SQLException("lagreVeilederForBruker failed, expected single row to be updated.")
}
connection.prepareStatement(createVeilederHistorikk).use {
it.setString(1, UUID.randomUUID().toString())
it.setInt(2, existingVeilederAndEnhet.first)
it.setDate(3, Date.valueOf(LocalDate.now()))
it.setString(4, veilederBrukerKnytning.veilederIdent)
it.setString(5, existingVeilederAndEnhet.third)
it.setString(6, tildeltAv)
it.execute()
}
connection.commit()
}
} else if (existingVeilederAndEnhet == null) {
throw SQLException("Kan ikke tildele personer som ikke finnes fra før")
}
}

const val queryUpdatePersonOversiktStatusNavn =
"""
UPDATE PERSON_OVERSIKT_STATUS
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class PersonBehandlendeEnhetService(

suspend fun updateBehandlendeEnhet(
personIdent: PersonIdent,
tildeltEnhet: String?,
tildeltEnhet: String? = null,
) {
val maybeNewBehandlendeEnhet = behandlendeEnhetClient.getEnhet(
callId = UUID.randomUUID().toString(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package no.nav.syfo.personstatus.infrastructure.database.repository

import no.nav.syfo.personstatus.domain.PersonIdent
import no.nav.syfo.personstatus.application.IPersonOversiktStatusRepository
import no.nav.syfo.personstatus.domain.PPersonOversiktStatus
import no.nav.syfo.personstatus.domain.PersonOversiktStatus
import no.nav.syfo.personstatus.domain.toPersonOversiktStatus
import no.nav.syfo.personstatus.db.*
import no.nav.syfo.personstatus.domain.*
import no.nav.syfo.personstatus.infrastructure.database.DatabaseInterface
import no.nav.syfo.personstatus.infrastructure.database.toList
import java.lang.RuntimeException
import java.sql.Date
import java.sql.ResultSet
import java.sql.SQLException
import java.sql.Timestamp
import java.time.Instant
import java.time.LocalDate
Expand Down Expand Up @@ -140,6 +140,63 @@ class PersonOversiktStatusRepository(private val database: DatabaseInterface) :
}
}

override fun createPersonOversiktStatusIfMissing(personident: PersonIdent) {
database.connection.use { connection ->
val existing = connection.prepareStatement(GET_PERSON_OVERSIKT_STATUS).use {
it.setString(1, personident.value)
it.executeQuery().toList { toPPersonOversiktStatus() }
}
if (existing.isEmpty()) {
connection.createPersonOversiktStatus(false, PersonOversiktStatus(fnr = personident.value))
connection.commit()
}
}
}

override fun lagreVeilederForBruker(
veilederBrukerKnytning: VeilederBrukerKnytning,
tildeltAv: String,
) {
database.connection.use { connection ->
val existingVeilederAndEnhet = connection.prepareStatement(GET_TILDELT_VEILEDER_QUERY).use {
it.setString(1, veilederBrukerKnytning.fnr)
it.executeQuery().toList {
Triple(
getInt("id"),
getString("tildelt_veileder"),
getString("tildelt_enhet")
)
}
}.firstOrNull()
if (
existingVeilederAndEnhet != null && (
existingVeilederAndEnhet.second == null ||
existingVeilederAndEnhet.second != veilederBrukerKnytning.veilederIdent
)
) {
val rowCount = connection.prepareStatement(UPDATE_TILDELT_VEILEDER_QUERY).use {
it.setString(1, veilederBrukerKnytning.veilederIdent)
it.setObject(2, Timestamp.from(Instant.now()))
it.setString(3, veilederBrukerKnytning.fnr)
it.executeUpdate()
}
if (rowCount != 1) {
throw SQLException("lagreVeilederForBruker failed, expected single row to be updated.")
}
connection.prepareStatement(CREATE_VEILEDER_HISTORIKK).use {
it.setString(1, UUID.randomUUID().toString())
it.setInt(2, existingVeilederAndEnhet.first)
it.setDate(3, Date.valueOf(LocalDate.now()))
it.setString(4, veilederBrukerKnytning.veilederIdent)
it.setString(5, existingVeilederAndEnhet.third)
it.setString(6, tildeltAv)
it.execute()
}
connection.commit()
}
}
}

companion object {
private const val GET_PERSON_OVERSIKT_STATUS =
"""
Expand Down Expand Up @@ -211,6 +268,26 @@ class PersonOversiktStatusRepository(private val database: DatabaseInterface) :
is_aktiv_manglende_medvirkning_vurdering = EXCLUDED.is_aktiv_manglende_medvirkning_vurdering,
sist_endret = EXCLUDED.sist_endret
"""

private const val GET_TILDELT_VEILEDER_QUERY =
"""
SELECT id,tildelt_veileder,tildelt_enhet FROM PERSON_OVERSIKT_STATUS
WHERE fnr = ?
"""

private const val UPDATE_TILDELT_VEILEDER_QUERY =
"""
UPDATE PERSON_OVERSIKT_STATUS
SET tildelt_veileder = ?, sist_endret = ?
WHERE fnr = ?
"""

const val CREATE_VEILEDER_HISTORIKK =
"""
INSERT INTO VEILEDER_HISTORIKK (
id,uuid,person_oversikt_status_id,fra_dato,tildelt_veileder,tildelt_enhet,tildelt_av
) VALUES(DEFAULT,?,?,?,?,?,?)
"""
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ object PersonBehandlendeEnhetCronjobSpek : Spek({
veilederIdent = UserConstants.VEILEDER_ID,
fnr = oversikthendelse.personident,
)
database.lagreVeilederForBruker(
personOversiktStatusRepository.lagreVeilederForBruker(
veilederBrukerKnytning = veilederBrukerKnytning,
tildeltAv = UserConstants.VEILEDER_ID,
)
Expand Down Expand Up @@ -352,7 +352,7 @@ object PersonBehandlendeEnhetCronjobSpek : Spek({
veilederIdent = UserConstants.VEILEDER_ID,
fnr = oversikthendelse.personident,
)
database.lagreVeilederForBruker(
personOversiktStatusRepository.lagreVeilederForBruker(
veilederBrukerKnytning = veilederBrukerKnytning,
tildeltAv = UserConstants.VEILEDER_ID,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ import no.nav.syfo.personstatus.api.v2.model.PersonOversiktStatusDTO
import no.nav.syfo.personstatus.application.manglendemedvirkning.ManglendeMedvirkningVurderingType
import no.nav.syfo.personstatus.db.createPersonOversiktStatus
import no.nav.syfo.personstatus.db.getPersonOversiktStatusList
import no.nav.syfo.personstatus.db.lagreVeilederForBruker
import no.nav.syfo.personstatus.domain.*
import no.nav.syfo.personstatus.infrastructure.database.repository.PersonOversiktStatusRepository
import no.nav.syfo.testutil.*
import no.nav.syfo.testutil.UserConstants.ARBEIDSTAKER_FNR
import no.nav.syfo.testutil.UserConstants.ARBEIDSTAKER_NO_NAME_FNR
Expand Down Expand Up @@ -60,6 +60,7 @@ object PersonoversiktStatusApiV2Spek : Spek({

val personoversiktStatusService = internalMockEnvironment.personoversiktStatusService
val kafkaOppfolgingstilfellePersonService = TestKafkaModule.kafkaOppfolgingstilfellePersonService
val personOversiktStatusRepository = PersonOversiktStatusRepository(database)

val personIdentDefault = PersonIdent(ARBEIDSTAKER_FNR)

Expand Down Expand Up @@ -185,7 +186,7 @@ object PersonoversiktStatusApiV2Spek : Spek({
)

val tilknytning = VeilederBrukerKnytning(VEILEDER_ID, ARBEIDSTAKER_FNR)
database.lagreVeilederForBruker(tilknytning, VEILEDER_ID)
personOversiktStatusRepository.lagreVeilederForBruker(tilknytning, VEILEDER_ID)

with(
handleRequest(HttpMethod.Get, url) {
Expand Down Expand Up @@ -218,7 +219,7 @@ object PersonoversiktStatusApiV2Spek : Spek({
)

val tilknytning = VeilederBrukerKnytning(VEILEDER_ID, ARBEIDSTAKER_FNR)
database.lagreVeilederForBruker(tilknytning, VEILEDER_ID)
personOversiktStatusRepository.lagreVeilederForBruker(tilknytning, VEILEDER_ID)

with(
handleRequest(HttpMethod.Get, url) {
Expand Down Expand Up @@ -382,7 +383,7 @@ object PersonoversiktStatusApiV2Spek : Spek({
)

val tilknytning = VeilederBrukerKnytning(VEILEDER_ID, ARBEIDSTAKER_FNR)
database.lagreVeilederForBruker(tilknytning, VEILEDER_ID)
personOversiktStatusRepository.lagreVeilederForBruker(tilknytning, VEILEDER_ID)

with(
handleRequest(HttpMethod.Get, url) {
Expand Down Expand Up @@ -437,7 +438,7 @@ object PersonoversiktStatusApiV2Spek : Spek({
)

val tilknytning = VeilederBrukerKnytning(VEILEDER_ID, ARBEIDSTAKER_FNR)
database.lagreVeilederForBruker(tilknytning, VEILEDER_ID)
personOversiktStatusRepository.lagreVeilederForBruker(tilknytning, VEILEDER_ID)

with(
handleRequest(HttpMethod.Get, url) {
Expand Down Expand Up @@ -676,7 +677,7 @@ object PersonoversiktStatusApiV2Spek : Spek({
ident = personIdent,
enhet = NAV_ENHET,
)
database.lagreVeilederForBruker(tilknytning, VEILEDER_ID)
personOversiktStatusRepository.lagreVeilederForBruker(tilknytning, VEILEDER_ID)
with(
handleRequest(HttpMethod.Get, url) {
addHeader(HttpHeaders.Authorization, bearerHeader(validToken))
Expand Down
Loading

0 comments on commit 173e994

Please sign in to comment.