Skip to content

Commit

Permalink
IS-2595: Bulk manglende medvirkning (#426)
Browse files Browse the repository at this point in the history
  • Loading branch information
geir-waagboe committed Aug 30, 2024
1 parent dc2c877 commit dc48aea
Show file tree
Hide file tree
Showing 22 changed files with 302 additions and 0 deletions.
5 changes: 5 additions & 0 deletions .nais/naiserator-dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ spec:
- application: syfooversiktsrv-redis
- application: isarbeidsuforhet
- application: isaktivitetskrav
- application: ismanglendemedvirkning
- application: istilgangskontroll
- application: ishuskelapp
azure:
Expand Down Expand Up @@ -102,6 +103,10 @@ spec:
value: "dev-gcp.teamsykefravr.isaktivitetskrav"
- name: AKTIVITETSKRAV_URL
value: "http://isaktivitetskrav"
- name: MANGLENDEMEDVIRKNING_CLIENT_ID
value: "dev-gcp.teamsykefravr.ismanglendemedvirkning"
- name: MANGLENDEMEDVIRKNING_URL
value: "http://ismanglendemedvirkning"
- name: ISTILGANGSKONTROLL_CLIENT_ID
value: "dev-gcp.teamsykefravr.istilgangskontroll"
- name: ISTILGANGSKONTROLL_HOST
Expand Down
5 changes: 5 additions & 0 deletions .nais/naiserator-prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ spec:
- application: syfooversiktsrv-redis
- application: isarbeidsuforhet
- application: isaktivitetskrav
- application: ismanglendemedvirkning
- application: istilgangskontroll
- application: ishuskelapp
azure:
Expand Down Expand Up @@ -103,6 +104,10 @@ spec:
value: "prod-gcp.teamsykefravr.isaktivitetskrav"
- name: AKTIVITETSKRAV_URL
value: "http://isaktivitetskrav"
- name: MANGLENDEMEDVIRKNING_CLIENT_ID
value: "prod-gcp.teamsykefravr.ismanglendemedvirkning"
- name: MANGLENDEMEDVIRKNING_URL
value: "http://ismanglendemedvirkning"
- name: ISTILGANGSKONTROLL_CLIENT_ID
value: "prod-gcp.teamsykefravr.istilgangskontroll"
- name: ISTILGANGSKONTROLL_HOST
Expand Down
6 changes: 6 additions & 0 deletions src/main/kotlin/no/nav/syfo/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import no.nav.syfo.personstatus.api.v2.apiModule
import no.nav.syfo.personstatus.api.v2.auth.getWellKnown
import no.nav.syfo.personstatus.infrastructure.clients.AktivitetskravClient
import no.nav.syfo.personstatus.infrastructure.clients.arbeidsuforhet.ArbeidsuforhetvurderingClient
import no.nav.syfo.personstatus.infrastructure.clients.arbeidsuforhet.ManglendeMedvirkningClient
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
Expand Down Expand Up @@ -66,6 +67,10 @@ fun main() {
azureAdClient = azureAdClient,
clientEnvironment = environment.clients.aktivitetskrav,
)
val manglendeMedvirkningClient = ManglendeMedvirkningClient(
azureAdClient = azureAdClient,
clientEnvironment = environment.clients.manglendeMedvirkning,
)
val veilederTilgangskontrollClient = VeilederTilgangskontrollClient(
azureAdClient = azureAdClient,
istilgangskontrollEnv = environment.clients.istilgangskontroll,
Expand Down Expand Up @@ -94,6 +99,7 @@ fun main() {
personoversiktStatusRepository = personoversiktStatusRepository,
oppfolgingsoppgaveClient = oppfolgingsoppgaveClient,
aktivitetskravClient = aktivitetskravClient,
manglendeMedvirkningClient = manglendeMedvirkningClient,
)
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 @@ -60,6 +60,10 @@ data class Environment(
baseUrl = getEnvVar("ARBEIDSUFORHETVURDERING_URL"),
clientId = getEnvVar("ARBEIDSUFORHETVURDERING_CLIENT_ID"),
),
manglendeMedvirkning = ClientEnvironment(
baseUrl = getEnvVar("MANGLENDEMEDVIRKNING_URL"),
clientId = getEnvVar("MANGLENDEMEDVIRKNING_CLIENT_ID"),
),
istilgangskontroll = ClientEnvironment(
baseUrl = getEnvVar("ISTILGANGSKONTROLL_HOST"),
clientId = getEnvVar("ISTILGANGSKONTROLL_CLIENT_ID"),
Expand Down
1 change: 1 addition & 0 deletions src/main/kotlin/no/nav/syfo/BackgroundTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import kotlin.coroutines.CoroutineContext

private val log: Logger = LoggerFactory.getLogger("no.nav.syfo")

@OptIn(DelicateCoroutinesApi::class)
fun launchBackgroundTask(
applicationState: ApplicationState,
action: suspend CoroutineScope.() -> Unit,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ 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
import no.nav.syfo.personstatus.application.manglendemedvirkning.IManglendeMedvirkningClient
import no.nav.syfo.personstatus.application.manglendemedvirkning.ManglendeMedvirkningResponseDTO
import no.nav.syfo.personstatus.application.oppfolgingsoppgave.IOppfolgingsoppgaveClient
import no.nav.syfo.personstatus.application.oppfolgingsoppgave.OppfolgingsoppgaverResponseDTO
import no.nav.syfo.personstatus.db.*
Expand All @@ -26,6 +28,7 @@ class PersonoversiktStatusService(
private val database: DatabaseInterface,
private val pdlClient: PdlClient,
private val arbeidsuforhetvurderingClient: IArbeidsuforhetvurderingClient,
private val manglendeMedvirkningClient: IManglendeMedvirkningClient,
private val aktivitetskravClient: IAktivitetskravClient,
private val oppfolgingsoppgaveClient: IOppfolgingsoppgaveClient,
private val personoversiktStatusRepository: IPersonOversiktStatusRepository,
Expand Down Expand Up @@ -69,6 +72,11 @@ class PersonoversiktStatusService(
token = token,
personStatuser = personStatusOversikt,
)
val manglendeMedvirkning = getManglendeMedvirkningVurderinger(
callId = callId,
token = token,
personStatuser = personStatusOversikt,
)
val activeAktivitetskrav = getActiveAktivitetskravForPersons(
callId = callId,
token = token,
Expand All @@ -86,6 +94,9 @@ class PersonoversiktStatusService(
aktivitetskravvurdering = activeAktivitetskrav.await()
?.aktivitetskravvurderinger
?.get(personStatus.fnr),
manglendeMedvirkning = manglendeMedvirkning.await()
?.vurderinger
?.get(personStatus.fnr),
)
}
}
Expand All @@ -110,6 +121,26 @@ class PersonoversiktStatusService(
}
}

private fun getManglendeMedvirkningVurderinger(
callId: String,
token: String,
personStatuser: List<PersonOversiktStatus>,
): Deferred<ManglendeMedvirkningResponseDTO?> =
CoroutineScope(Dispatchers.IO).async {
val personidenterWithManglendeMedvirkningVurdering = personStatuser
.filter { it.isAktivManglendeMedvirkningVurdering }
.map { PersonIdent(it.fnr) }
if (personidenterWithManglendeMedvirkningVurdering.isNotEmpty()) {
manglendeMedvirkningClient.getLatestVurderinger(
callId = callId,
token = token,
personidenter = personidenterWithManglendeMedvirkningVurdering,
)
} else {
null
}
}

private fun getActiveOppfolgingsoppgaver(
callId: String,
token: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ 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.manglendemedvirkning.ManglendeMedvirkningDTO
import no.nav.syfo.personstatus.application.oppfolgingsoppgave.OppfolgingsoppgaveDTO
import java.time.LocalDate

Expand All @@ -23,6 +24,7 @@ data class PersonOversiktStatusDTO(
val oppfolgingsoppgave: OppfolgingsoppgaveDTO?,
val isAktivSenOppfolgingKandidat: Boolean,
val aktivitetskravvurdering: AktivitetskravDTO?,
val manglendeMedvirkning: ManglendeMedvirkningDTO?,
)

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

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

interface IManglendeMedvirkningClient {

suspend fun getLatestVurderinger(
callId: String,
token: String,
personidenter: List<PersonIdent>,
): ManglendeMedvirkningResponseDTO?
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package no.nav.syfo.personstatus.application.manglendemedvirkning

import java.time.LocalDate
import java.time.LocalDateTime
import java.util.*

data class ManglendeMedvirkningRequestDTO(
val personidenter: List<String>
)

data class ManglendeMedvirkningResponseDTO(
val vurderinger: Map<String, ManglendeMedvirkningDTO>
)

data class ManglendeMedvirkningDTO(
val uuid: UUID,
val personident: String,
val createdAt: LocalDateTime,
val type: ManglendeMedvirkningVurderingType,
val begrunnelse: String,
val varsel: ManglendeMedvirkningVarselDTO?,
)

data class ManglendeMedvirkningVarselDTO(
val uuid: UUID,
val createdAt: LocalDateTime,
val svarfrist: LocalDate,
)

enum class ManglendeMedvirkningVurderingType {
FORHANDSVARSEL, OPPFYLT, STANS, IKKE_AKTUELL,
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ 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.manglendemedvirkning.ManglendeMedvirkningDTO
import no.nav.syfo.personstatus.application.oppfolgingsoppgave.OppfolgingsoppgaveDTO
import no.nav.syfo.util.isBeforeOrEqual
import no.nav.syfo.util.toLocalDateOslo
Expand Down Expand Up @@ -89,6 +90,7 @@ fun PersonOversiktStatus.toPersonOversiktStatusDTO(
arbeidsuforhetvurdering: ArbeidsuforhetvurderingDTO?,
oppfolgingsoppgave: OppfolgingsoppgaveDTO?,
aktivitetskravvurdering: AktivitetskravDTO?,
manglendeMedvirkning: ManglendeMedvirkningDTO?,
) =
PersonOversiktStatusDTO(
veilederIdent = veilederIdent,
Expand All @@ -108,6 +110,7 @@ fun PersonOversiktStatus.toPersonOversiktStatusDTO(
oppfolgingsoppgave = oppfolgingsoppgave,
isAktivSenOppfolgingKandidat = isAktivSenOppfolgingKandidat,
aktivitetskravvurdering = aktivitetskravvurdering,
manglendeMedvirkning = manglendeMedvirkning,
)

fun PersonOversiktStatus.hasActiveBehandlerdialogOppgave(): Boolean {
Expand Down
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 manglendeMedvirkning: ClientEnvironment,
val aktivitetskrav: ClientEnvironment,
val istilgangskontroll: ClientEnvironment,
val ishuskelapp: ClientEnvironment,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package no.nav.syfo.personstatus.infrastructure.clients.arbeidsuforhet

import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.plugins.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.http.*
import io.micrometer.core.instrument.Counter
import net.logstash.logback.argument.StructuredArguments
import no.nav.syfo.personstatus.infrastructure.clients.ClientEnvironment
import no.nav.syfo.personstatus.infrastructure.clients.azuread.AzureAdClient
import no.nav.syfo.personstatus.infrastructure.clients.httpClientDefault
import no.nav.syfo.personstatus.domain.PersonIdent
import no.nav.syfo.personstatus.infrastructure.METRICS_NS
import no.nav.syfo.personstatus.infrastructure.METRICS_REGISTRY
import no.nav.syfo.personstatus.application.manglendemedvirkning.IManglendeMedvirkningClient
import no.nav.syfo.personstatus.application.manglendemedvirkning.ManglendeMedvirkningRequestDTO
import no.nav.syfo.personstatus.application.manglendemedvirkning.ManglendeMedvirkningResponseDTO
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 ManglendeMedvirkningClient(
private val azureAdClient: AzureAdClient,
private val clientEnvironment: ClientEnvironment,
private val httpClient: HttpClient = httpClientDefault(),
) : IManglendeMedvirkningClient {

private val manglendeMedvirkningUrl = "${clientEnvironment.baseUrl}$MANGLENDE_MEDVIRKNING_API_PATH"

override suspend fun getLatestVurderinger(
callId: String,
token: String,
personidenter: List<PersonIdent>,
): ManglendeMedvirkningResponseDTO? {
val oboToken = azureAdClient.getOnBehalfOfToken(
scopeClientId = clientEnvironment.clientId,
token,
)?.accessToken ?: throw RuntimeException("Failed to get OBO-token for manglende medvirkning vurdering")
val requestDTO = ManglendeMedvirkningRequestDTO(personidenter.map { it.value })
return try {
val response = httpClient.post(manglendeMedvirkningUrl) {
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 -> {
COUNT_CALL_MANGLENDE_MEDVIRKNING_SUCCESS.increment()
response.body<ManglendeMedvirkningResponseDTO>()
}
HttpStatusCode.NotFound -> {
log.error("Resource not found")
COUNT_CALL_MANGLENDE_MEDVIRKNING_FAIL.increment()
null
}
else -> {
log.error("Unhandled status code: ${response.status}")
COUNT_CALL_MANGLENDE_MEDVIRKNING_FAIL.increment()
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 ismanglendemedvirkning with {}, {}",
StructuredArguments.keyValue("statusCode", response.status.value.toString()),
callIdArgument(callId)
)
COUNT_CALL_MANGLENDE_MEDVIRKNING_FAIL.increment()
}

companion object {
const val MANGLENDE_MEDVIRKNING_API_PATH = "/api/internad/v1/manglende-medvirkning/get-vurderinger"
private val log = LoggerFactory.getLogger(ManglendeMedvirkningClient::class.java)

const val CALL_MANGLENDE_MEDVIRKNING_BASE = "${METRICS_NS}_call_ismanglendemedvirkning"
const val CALL_MANGLENDE_MEDVIRKNING_SUCCESS = "${CALL_MANGLENDE_MEDVIRKNING_BASE}_success_count"
const val CALL_MANGLENDE_MEDVIRKNING_FAIL = "${CALL_MANGLENDE_MEDVIRKNING_BASE}_fail_count"

val COUNT_CALL_MANGLENDE_MEDVIRKNING_SUCCESS: Counter = Counter
.builder(CALL_MANGLENDE_MEDVIRKNING_SUCCESS)
.description("Counts the number of successful calls to ismanglendemedvirkning")
.register(METRICS_REGISTRY)
val COUNT_CALL_MANGLENDE_MEDVIRKNING_FAIL: Counter = Counter
.builder(CALL_MANGLENDE_MEDVIRKNING_FAIL)
.description("Counts the number of failed calls to ismanglendemedvirkning")
.register(METRICS_REGISTRY)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ 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.manglendemedvirkning.IManglendeMedvirkningClient
import no.nav.syfo.personstatus.application.oppfolgingsoppgave.IOppfolgingsoppgaveClient
import no.nav.syfo.personstatus.db.*
import no.nav.syfo.personstatus.domain.PersonOversiktStatus
Expand Down Expand Up @@ -34,6 +35,7 @@ class AktivitetskravVurderingConsumerSpek : Spek({
database = database,
pdlClient = externalMockEnvironment.pdlClient,
arbeidsuforhetvurderingClient = mockk<IArbeidsuforhetvurderingClient>(),
manglendeMedvirkningClient = mockk<IManglendeMedvirkningClient>(),
oppfolgingsoppgaveClient = mockk<IOppfolgingsoppgaveClient>(),
aktivitetskravClient = mockk<IAktivitetskravClient>(),
personoversiktStatusRepository = personOppgaveRepository,
Expand Down
Loading

0 comments on commit dc48aea

Please sign in to comment.