Skip to content

Commit

Permalink
IS-2329: Add getting aktivitetskrav for persons with active vurdering
Browse files Browse the repository at this point in the history
  • Loading branch information
vetlesolgaard committed Jul 12, 2024
1 parent 35981d9 commit bc7485e
Show file tree
Hide file tree
Showing 17 changed files with 232 additions and 13 deletions.
4 changes: 4 additions & 0 deletions .nais/naiserator-dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ spec:
value: "dev-gcp.teamsykefravr.isarbeidsuforhet"
- name: ARBEIDSUFORHETVURDERING_URL
value: "http://isarbeidsuforhet"
- name: AKTIVITETSKRAV_CLIENT_ID
value: "dev-gcp.teamsykefravr.isaktivitetskrav"
- name: AKTIVITETSKRAV_URL
value: "http://isaktivitetskrav"
- name: ISTILGANGSKONTROLL_CLIENT_ID
value: "dev-gcp.teamsykefravr.istilgangskontroll"
- name: ISTILGANGSKONTROLL_HOST
Expand Down
4 changes: 4 additions & 0 deletions .nais/naiserator-prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,10 @@ spec:
value: "prod-gcp.teamsykefravr.isarbeidsuforhet"
- name: ARBEIDSUFORHETVURDERING_URL
value: "http://isarbeidsuforhet"
- name: AKTIVITETSKRAV_CLIENT_ID
value: "prod-gcp.teamsykefravr.isaktivitetskrav"
- name: AKTIVITETSKRAV_URL
value: "http://isaktivitetskrav"
- name: ISTILGANGSKONTROLL_CLIENT_ID
value: "prod-gcp.teamsykefravr.istilgangskontroll"
- name: ISTILGANGSKONTROLL_HOST
Expand Down
22 changes: 14 additions & 8 deletions src/main/kotlin/no/nav/syfo/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,22 @@ import io.ktor.server.application.*
import io.ktor.server.config.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import no.nav.syfo.application.cache.RedisStore
import no.nav.syfo.personstatus.PersonoversiktStatusService
import no.nav.syfo.personstatus.api.v2.apiModule
import no.nav.syfo.personstatus.api.v2.auth.getWellKnown
import no.nav.syfo.application.cache.RedisStore
import no.nav.syfo.personstatus.infrastructure.database.database
import no.nav.syfo.personstatus.infrastructure.database.databaseModule
import no.nav.syfo.personstatus.infrastructure.clients.AktivitetskravClient
import no.nav.syfo.personstatus.infrastructure.clients.arbeidsuforhet.ArbeidsuforhetvurderingClient
import no.nav.syfo.personstatus.infrastructure.clients.azuread.AzureAdClient
import no.nav.syfo.personstatus.infrastructure.clients.behandlendeenhet.BehandlendeEnhetClient
import no.nav.syfo.personstatus.infrastructure.clients.oppfolgingsoppgave.OppfolgingsoppgaveClient
import no.nav.syfo.personstatus.infrastructure.clients.pdl.PdlClient
import no.nav.syfo.personstatus.infrastructure.cronjob.behandlendeenhet.PersonBehandlendeEnhetService
import no.nav.syfo.personstatus.infrastructure.cronjob.launchCronjobModule
import no.nav.syfo.personstatus.infrastructure.kafka.launchKafkaModule
import no.nav.syfo.personstatus.PersonoversiktStatusService
import no.nav.syfo.personstatus.infrastructure.clients.arbeidsuforhet.ArbeidsuforhetvurderingClient
import no.nav.syfo.personstatus.infrastructure.clients.azuread.AzureAdClient
import no.nav.syfo.personstatus.infrastructure.clients.oppfolgingsoppgave.OppfolgingsoppgaveClient
import no.nav.syfo.personstatus.infrastructure.database.database
import no.nav.syfo.personstatus.infrastructure.database.databaseModule
import no.nav.syfo.personstatus.infrastructure.database.repository.PersonOversiktStatusRepository
import no.nav.syfo.personstatus.infrastructure.kafka.launchKafkaModule
import org.slf4j.LoggerFactory
import java.util.concurrent.TimeUnit

Expand Down Expand Up @@ -60,6 +61,10 @@ fun main() {
azureAdClient = azureAdClient,
clientEnvironment = environment.clients.ishuskelapp,
)
val aktivitetskravClient = AktivitetskravClient(
azureAdClient = azureAdClient,
clientEnvironment = environment.clients.aktivitetskrav,
)

lateinit var personBehandlendeEnhetService: PersonBehandlendeEnhetService
lateinit var personoversiktStatusService: PersonoversiktStatusService
Expand All @@ -83,6 +88,7 @@ fun main() {
arbeidsuforhetvurderingClient = arbeidsuforhetvurderingClient,
personoversiktStatusRepository = personoversiktStatusRepository,
oppfolgingsoppgaveClient = oppfolgingsoppgaveClient,
aktivitetskravClient = aktivitetskravClient,
)
personBehandlendeEnhetService = PersonBehandlendeEnhetService(
database = database,
Expand Down
4 changes: 4 additions & 0 deletions src/main/kotlin/no/nav/syfo/ApplicationEnvironment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,10 @@ data class Environment(
baseUrl = getEnvVar("ISHUSKELAPP_URL"),
clientId = getEnvVar("ISHUSKELAPP_CLIENT_ID"),
),
aktivitetskrav = ClientEnvironment(
baseUrl = getEnvVar("AKTIVITETSKRAV_URL"),
clientId = getEnvVar("AKTIVITETSKRAV_CLIENT_ID"),
),
),

val redis: RedisEnvironment = RedisEnvironment(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import no.nav.syfo.domain.PersonIdent
import no.nav.syfo.oppfolgingstilfelle.domain.PersonOppfolgingstilfelleVirksomhet
import no.nav.syfo.personoppgavehendelse.kafka.*
import no.nav.syfo.personstatus.api.v2.model.PersonOversiktStatusDTO
import no.nav.syfo.personstatus.application.GetAktivitetskravForPersonsResponseDTO
import no.nav.syfo.personstatus.application.IAktivitetskravClient
import no.nav.syfo.personstatus.application.IPersonOversiktStatusRepository
import no.nav.syfo.personstatus.application.arbeidsuforhet.ArbeidsuforhetvurderingerResponseDTO
import no.nav.syfo.personstatus.application.arbeidsuforhet.IArbeidsuforhetvurderingClient
Expand All @@ -25,8 +27,9 @@ class PersonoversiktStatusService(
private val database: DatabaseInterface,
private val pdlClient: PdlClient,
private val arbeidsuforhetvurderingClient: IArbeidsuforhetvurderingClient,
private val personoversiktStatusRepository: IPersonOversiktStatusRepository,
private val aktivitetskravClient: IAktivitetskravClient,
private val oppfolgingsoppgaveClient: IOppfolgingsoppgaveClient,
private val personoversiktStatusRepository: IPersonOversiktStatusRepository,
) {
private val isUbehandlet = true
private val isBehandlet = false
Expand Down Expand Up @@ -69,6 +72,11 @@ class PersonoversiktStatusService(
token = token,
personStatuser = personStatusOversikt,
)
val activeAktivitetskrav = getActiveAktivitetskravForPersons(
callId = callId,
token = token,
personStatuser = personStatusOversikt,
)

return personStatusOversikt.map { personStatus ->
personStatus.toPersonOversiktStatusDTO(
Expand All @@ -79,6 +87,9 @@ class PersonoversiktStatusService(
oppfolgingsoppgave = activeOppfolgingsoppgaver.await()
?.oppfolgingsoppgaver
?.get(personStatus.fnr),
aktivitetskravvurdering = activeAktivitetskrav.await()
?.aktivitetskravvurderinger
?.get(personStatus.fnr),
)
}
}
Expand Down Expand Up @@ -127,6 +138,26 @@ class PersonoversiktStatusService(
}
}

private suspend fun getActiveAktivitetskravForPersons(
callId: String,
token: String,
personStatuser: List<PersonOversiktStatus>,
): Deferred<GetAktivitetskravForPersonsResponseDTO?> =
CoroutineScope(Dispatchers.IO).async {
val personidenterWithActiveAktivitetskrav = personStatuser
.filter { it.isAktivAktivitetskravvurdering }
.map { PersonIdent(it.fnr) }
if (personidenterWithActiveAktivitetskrav.isNotEmpty()) {
aktivitetskravClient.getAktivitetskravForPersons(
callId = callId,
token = token,
personidenter = personidenterWithActiveAktivitetskrav,
)
} else {
null
}
}

private fun getPersonOppfolgingstilfelleVirksomhetMap(
pPersonOversikStatusIds: List<Int>,
): Map<Int, List<PersonOppfolgingstilfelleVirksomhet>> =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package no.nav.syfo.personstatus.api.v2.model

import no.nav.syfo.personstatus.application.AktivitetskravDTO
import no.nav.syfo.personstatus.application.arbeidsuforhet.ArbeidsuforhetvurderingDTO
import no.nav.syfo.personstatus.application.oppfolgingsoppgave.OppfolgingsoppgaveDTO
import java.time.LocalDate
Expand All @@ -25,6 +26,7 @@ data class PersonOversiktStatusDTO(
val friskmeldingTilArbeidsformidlingFom: LocalDate?,
val oppfolgingsoppgave: OppfolgingsoppgaveDTO?,
val isAktivSenOppfolgingKandidat: Boolean,
val aktivitetskravvurdering: AktivitetskravDTO?,
)

data class PersonOppfolgingstilfelleDTO(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package no.nav.syfo.personstatus.application

import java.time.LocalDate
import java.time.LocalDateTime

data class AktivitetskravRequestDTO(
val personidenter: List<String>,
)

data class GetAktivitetskravForPersonsResponseDTO(
val aktivitetskravvurderinger: Map<String, AktivitetskravDTO>,
)

data class AktivitetskravDTO(
val uuid: String,
val createdAt: LocalDateTime,
val status: AktivitetskravStatus,
val vurderinger: List<AktivitetskravvurderingDTO>,
)

data class AktivitetskravvurderingDTO(
val createdAt: LocalDateTime,
val status: AktivitetskravStatus,
val frist: LocalDate?,
val varsel: AktivitetskravVarselDTO?,
)

data class AktivitetskravVarselDTO(
val createdAt: LocalDateTime,
val svarfrist: LocalDate,
)

enum class AktivitetskravStatus {
NY,
NY_VURDERING,
AVVENT,
UNNTAK,
OPPFYLT,
AUTOMATISK_OPPFYLT,
FORHANDSVARSEL,
STANS,
IKKE_OPPFYLT,
IKKE_AKTUELL,
LUKKET,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package no.nav.syfo.personstatus.application

import no.nav.syfo.domain.PersonIdent

interface IAktivitetskravClient {
suspend fun getAktivitetskravForPersons(
callId: String,
token: String,
personidenter: List<PersonIdent>,
): GetAktivitetskravForPersonsResponseDTO?
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import no.nav.syfo.dialogmotestatusendring.domain.DialogmoteStatusendringType
import no.nav.syfo.oppfolgingstilfelle.domain.Oppfolgingstilfelle
import no.nav.syfo.oppfolgingstilfelle.domain.toPersonOppfolgingstilfelleDTO
import no.nav.syfo.personstatus.api.v2.model.PersonOversiktStatusDTO
import no.nav.syfo.personstatus.application.AktivitetskravDTO
import no.nav.syfo.personstatus.application.arbeidsuforhet.ArbeidsuforhetvurderingDTO
import no.nav.syfo.personstatus.application.oppfolgingsoppgave.OppfolgingsoppgaveDTO
import no.nav.syfo.util.isBeforeOrEqual
Expand Down Expand Up @@ -96,6 +97,7 @@ fun PersonOversiktStatus.toPersonOversiktStatusDTO(
arenaCutoff: LocalDate,
arbeidsuforhetvurdering: ArbeidsuforhetvurderingDTO?,
oppfolgingsoppgave: OppfolgingsoppgaveDTO?,
aktivitetskravvurdering: AktivitetskravDTO?,
) =
PersonOversiktStatusDTO(
veilederIdent = veilederIdent,
Expand All @@ -118,6 +120,7 @@ fun PersonOversiktStatus.toPersonOversiktStatusDTO(
friskmeldingTilArbeidsformidlingFom = friskmeldingTilArbeidsformidlingFom,
oppfolgingsoppgave = oppfolgingsoppgave,
isAktivSenOppfolgingKandidat = isAktivSenOppfolgingKandidat,
aktivitetskravvurdering = aktivitetskravvurdering,
)

fun PersonOversiktStatus.hasActiveBehandlerdialogOppgave(): Boolean {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package no.nav.syfo.personstatus.infrastructure.clients

import io.ktor.client.call.body
import io.ktor.client.plugins.ClientRequestException
import io.ktor.client.plugins.ServerResponseException
import io.ktor.client.request.accept
import io.ktor.client.request.header
import io.ktor.client.request.post
import io.ktor.client.request.setBody
import io.ktor.client.statement.HttpResponse
import io.ktor.http.*
import net.logstash.logback.argument.StructuredArguments
import no.nav.syfo.domain.PersonIdent
import no.nav.syfo.personstatus.application.AktivitetskravRequestDTO
import no.nav.syfo.personstatus.application.GetAktivitetskravForPersonsResponseDTO
import no.nav.syfo.personstatus.application.IAktivitetskravClient
import no.nav.syfo.personstatus.infrastructure.clients.azuread.AzureAdClient
import no.nav.syfo.util.NAV_CALL_ID_HEADER
import no.nav.syfo.util.bearerHeader
import no.nav.syfo.util.callIdArgument
import org.slf4j.LoggerFactory

class AktivitetskravClient(
private val azureAdClient: AzureAdClient,
private val clientEnvironment: ClientEnvironment,
) : IAktivitetskravClient {

private val httpClient = httpClientDefault()

override suspend fun getAktivitetskravForPersons(
callId: String,
token: String,
personidenter: List<PersonIdent>,
): GetAktivitetskravForPersonsResponseDTO? {
val oboToken = azureAdClient.getOnBehalfOfToken(
scopeClientId = clientEnvironment.clientId,
token,
)?.accessToken ?: throw RuntimeException("Failed to get OBO-token for aktivitetskrav vurdering")
val requestDTO = AktivitetskravRequestDTO(personidenter.map { it.value })
return try {
val response = httpClient.post("$ISAKTIVITETSKRAV_BASE_PATH/get-vurderinger") {
header(HttpHeaders.Authorization, bearerHeader(oboToken))
header(NAV_CALL_ID_HEADER, callId)
accept(ContentType.Application.Json)
contentType(ContentType.Application.Json)
setBody(requestDTO)
}
when (response.status) {
HttpStatusCode.OK -> {
response.body<GetAktivitetskravForPersonsResponseDTO>()
}
HttpStatusCode.NotFound -> {
log.error("Resource not found")
null
}
else -> {
log.error("Unhandled status code: ${response.status}")
null
}
}
} catch (e: ClientRequestException) {
handleUnexpectedResponseException(e.response, callId)
throw e
} catch (e: ServerResponseException) {
handleUnexpectedResponseException(e.response, callId)
throw e
}
}

private fun handleUnexpectedResponseException(
response: HttpResponse,
callId: String,
) {
log.error(
"Error while requesting from isaktivitetskrav with {}, {}",
StructuredArguments.keyValue("statusCode", response.status.value.toString()),
callIdArgument(callId)
)
}

companion object {
private const val ISAKTIVITETSKRAV_BASE_PATH = "/api/internad/v1/aktivitetskrav"
private val log = LoggerFactory.getLogger(AktivitetskravClient::class.java)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ data class ClientsEnvironment(
val pdl: ClientEnvironment,
val syfobehandlendeenhet: ClientEnvironment,
val arbeidsuforhetvurdering: ClientEnvironment,
val aktivitetskrav: ClientEnvironment,
val istilgangskontroll: ClientEnvironment,
val ishuskelapp: ClientEnvironment,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import io.mockk.*
import no.nav.syfo.aktivitetskravvurdering.domain.AktivitetskravStatus
import no.nav.syfo.oppfolgingstilfelle.kafka.toPersonOversiktStatus
import no.nav.syfo.personstatus.PersonoversiktStatusService
import no.nav.syfo.personstatus.application.IAktivitetskravClient
import no.nav.syfo.personstatus.application.arbeidsuforhet.IArbeidsuforhetvurderingClient
import no.nav.syfo.personstatus.application.oppfolgingsoppgave.IOppfolgingsoppgaveClient
import no.nav.syfo.personstatus.db.*
Expand All @@ -18,7 +19,7 @@ import org.spekframework.spek2.Spek
import org.spekframework.spek2.style.specification.describe
import java.time.*

class KafkaAktivitetskravVurderingConsumerSpek : Spek({
class AktivitetskravVurderingConsumerSpek : Spek({
with(TestApplicationEngine()) {
start()

Expand All @@ -30,9 +31,10 @@ class KafkaAktivitetskravVurderingConsumerSpek : Spek({
val personoversiktStatusService = PersonoversiktStatusService(
database = database,
pdlClient = externalMockEnvironment.pdlClient,
arbeidsuforhetvurderingClient = mockk<IArbeidsuforhetvurderingClient>(),
personoversiktStatusRepository = personOppgaveRepository,
arbeidsuforhetvurderingClient = mockk<IArbeidsuforhetvurderingClient>(),
oppfolgingsoppgaveClient = mockk<IOppfolgingsoppgaveClient>(),
aktivitetskravClient = mockk<IAktivitetskravClient>(),
)
val aktivitetskravVurderingConsumer =
AktivitetskravVurderingConsumer(database = database, personoversiktStatusService = personoversiktStatusService)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import io.mockk.every
import io.mockk.mockk
import no.nav.syfo.domain.PersonIdent
import no.nav.syfo.personstatus.PersonoversiktStatusService
import no.nav.syfo.personstatus.application.IAktivitetskravClient
import no.nav.syfo.personstatus.application.arbeidsuforhet.IArbeidsuforhetvurderingClient
import no.nav.syfo.personstatus.application.oppfolgingsoppgave.IOppfolgingsoppgaveClient
import no.nav.syfo.personstatus.db.createPersonOversiktStatus
Expand Down Expand Up @@ -38,6 +39,7 @@ class ArbeidsuforhetvurderingConsumerSpek : Spek({
arbeidsuforhetvurderingClient = arbeidsuforhervurderingClient,
personoversiktStatusRepository = personOppgaveRepository,
oppfolgingsoppgaveClient = oppfolgingsoppgaveClient,
aktivitetskravClient = mockk<IAktivitetskravClient>(),
)

val arbeidsuforhetvurderingConsumer = ArbeidsuforhetvurderingConsumer(
Expand Down
Loading

0 comments on commit bc7485e

Please sign in to comment.