From dc48aea8e9a883762e32f3aa32ec736681026626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Geir=20Arne=20Waagb=C3=B8?= <79845894+geir-waagboe@users.noreply.github.com> Date: Fri, 30 Aug 2024 14:43:06 +0200 Subject: [PATCH] IS-2595: Bulk manglende medvirkning (#426) --- .nais/naiserator-dev.yaml | 5 + .nais/naiserator-prod.yaml | 5 + src/main/kotlin/no/nav/syfo/App.kt | 6 + .../no/nav/syfo/ApplicationEnvironment.kt | 4 + src/main/kotlin/no/nav/syfo/BackgroundTask.kt | 1 + .../PersonoversiktStatusService.kt | 31 ++++++ .../api/v2/model/PersonOversiktStatusDTO.kt | 2 + .../IManglendeMedvirkningClient.kt | 12 ++ .../ManglendeMedvirkningDTO.kt | 32 ++++++ .../domain/PersonOversiktStatus.kt | 3 + .../clients/ClientEnvironment.kt | 1 + .../ManglendeMedvirkningClient.kt | 105 ++++++++++++++++++ .../AktivitetskravVurderingConsumerSpek.kt | 2 + .../api/v2/PersonoversiktStatusApiV2Spek.kt | 31 ++++++ .../ArbeidsuforhetvurderingConsumerSpek.kt | 2 + ...nglendeMedvirkningVurderingConsumerSpek.kt | 3 + ...SenOppfolgingKandidatStatusConsumerSpek.kt | 2 + .../syfo/testutil/InternalMockEnvironment.kt | 7 ++ .../no/nav/syfo/testutil/TestApiModule.kt | 7 ++ .../no/nav/syfo/testutil/TestEnvironment.kt | 5 + .../testutil/mock/ManglendeMedvirkningMock.kt | 35 ++++++ .../nav/syfo/testutil/mock/MockHttpClient.kt | 1 + 22 files changed, 302 insertions(+) create mode 100644 src/main/kotlin/no/nav/syfo/personstatus/application/manglendemedvirkning/IManglendeMedvirkningClient.kt create mode 100644 src/main/kotlin/no/nav/syfo/personstatus/application/manglendemedvirkning/ManglendeMedvirkningDTO.kt create mode 100644 src/main/kotlin/no/nav/syfo/personstatus/infrastructure/clients/manglendemedvirkning/ManglendeMedvirkningClient.kt create mode 100644 src/test/kotlin/no/nav/syfo/testutil/mock/ManglendeMedvirkningMock.kt diff --git a/.nais/naiserator-dev.yaml b/.nais/naiserator-dev.yaml index 1466b682..3b77773c 100644 --- a/.nais/naiserator-dev.yaml +++ b/.nais/naiserator-dev.yaml @@ -54,6 +54,7 @@ spec: - application: syfooversiktsrv-redis - application: isarbeidsuforhet - application: isaktivitetskrav + - application: ismanglendemedvirkning - application: istilgangskontroll - application: ishuskelapp azure: @@ -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 diff --git a/.nais/naiserator-prod.yaml b/.nais/naiserator-prod.yaml index 8d3e0979..8b6c13f0 100644 --- a/.nais/naiserator-prod.yaml +++ b/.nais/naiserator-prod.yaml @@ -55,6 +55,7 @@ spec: - application: syfooversiktsrv-redis - application: isarbeidsuforhet - application: isaktivitetskrav + - application: ismanglendemedvirkning - application: istilgangskontroll - application: ishuskelapp azure: @@ -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 diff --git a/src/main/kotlin/no/nav/syfo/App.kt b/src/main/kotlin/no/nav/syfo/App.kt index 2f778481..8614ea28 100644 --- a/src/main/kotlin/no/nav/syfo/App.kt +++ b/src/main/kotlin/no/nav/syfo/App.kt @@ -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 @@ -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, @@ -94,6 +99,7 @@ fun main() { personoversiktStatusRepository = personoversiktStatusRepository, oppfolgingsoppgaveClient = oppfolgingsoppgaveClient, aktivitetskravClient = aktivitetskravClient, + manglendeMedvirkningClient = manglendeMedvirkningClient, ) personBehandlendeEnhetService = PersonBehandlendeEnhetService( database = database, diff --git a/src/main/kotlin/no/nav/syfo/ApplicationEnvironment.kt b/src/main/kotlin/no/nav/syfo/ApplicationEnvironment.kt index 90bb31e2..7aef3ab1 100644 --- a/src/main/kotlin/no/nav/syfo/ApplicationEnvironment.kt +++ b/src/main/kotlin/no/nav/syfo/ApplicationEnvironment.kt @@ -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"), diff --git a/src/main/kotlin/no/nav/syfo/BackgroundTask.kt b/src/main/kotlin/no/nav/syfo/BackgroundTask.kt index 468fa8ad..60b4fb01 100644 --- a/src/main/kotlin/no/nav/syfo/BackgroundTask.kt +++ b/src/main/kotlin/no/nav/syfo/BackgroundTask.kt @@ -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, diff --git a/src/main/kotlin/no/nav/syfo/personstatus/PersonoversiktStatusService.kt b/src/main/kotlin/no/nav/syfo/personstatus/PersonoversiktStatusService.kt index c66a4fa1..ef0f2543 100644 --- a/src/main/kotlin/no/nav/syfo/personstatus/PersonoversiktStatusService.kt +++ b/src/main/kotlin/no/nav/syfo/personstatus/PersonoversiktStatusService.kt @@ -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.* @@ -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, @@ -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, @@ -86,6 +94,9 @@ class PersonoversiktStatusService( aktivitetskravvurdering = activeAktivitetskrav.await() ?.aktivitetskravvurderinger ?.get(personStatus.fnr), + manglendeMedvirkning = manglendeMedvirkning.await() + ?.vurderinger + ?.get(personStatus.fnr), ) } } @@ -110,6 +121,26 @@ class PersonoversiktStatusService( } } + private fun getManglendeMedvirkningVurderinger( + callId: String, + token: String, + personStatuser: List, + ): Deferred = + 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, diff --git a/src/main/kotlin/no/nav/syfo/personstatus/api/v2/model/PersonOversiktStatusDTO.kt b/src/main/kotlin/no/nav/syfo/personstatus/api/v2/model/PersonOversiktStatusDTO.kt index 93d10030..6e4b10d1 100644 --- a/src/main/kotlin/no/nav/syfo/personstatus/api/v2/model/PersonOversiktStatusDTO.kt +++ b/src/main/kotlin/no/nav/syfo/personstatus/api/v2/model/PersonOversiktStatusDTO.kt @@ -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 @@ -23,6 +24,7 @@ data class PersonOversiktStatusDTO( val oppfolgingsoppgave: OppfolgingsoppgaveDTO?, val isAktivSenOppfolgingKandidat: Boolean, val aktivitetskravvurdering: AktivitetskravDTO?, + val manglendeMedvirkning: ManglendeMedvirkningDTO?, ) data class PersonOppfolgingstilfelleDTO( diff --git a/src/main/kotlin/no/nav/syfo/personstatus/application/manglendemedvirkning/IManglendeMedvirkningClient.kt b/src/main/kotlin/no/nav/syfo/personstatus/application/manglendemedvirkning/IManglendeMedvirkningClient.kt new file mode 100644 index 00000000..540d1fe1 --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/personstatus/application/manglendemedvirkning/IManglendeMedvirkningClient.kt @@ -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, + ): ManglendeMedvirkningResponseDTO? +} diff --git a/src/main/kotlin/no/nav/syfo/personstatus/application/manglendemedvirkning/ManglendeMedvirkningDTO.kt b/src/main/kotlin/no/nav/syfo/personstatus/application/manglendemedvirkning/ManglendeMedvirkningDTO.kt new file mode 100644 index 00000000..8a163471 --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/personstatus/application/manglendemedvirkning/ManglendeMedvirkningDTO.kt @@ -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 +) + +data class ManglendeMedvirkningResponseDTO( + val vurderinger: Map +) + +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, +} diff --git a/src/main/kotlin/no/nav/syfo/personstatus/domain/PersonOversiktStatus.kt b/src/main/kotlin/no/nav/syfo/personstatus/domain/PersonOversiktStatus.kt index a4c42df9..c48ee0bb 100644 --- a/src/main/kotlin/no/nav/syfo/personstatus/domain/PersonOversiktStatus.kt +++ b/src/main/kotlin/no/nav/syfo/personstatus/domain/PersonOversiktStatus.kt @@ -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 @@ -89,6 +90,7 @@ fun PersonOversiktStatus.toPersonOversiktStatusDTO( arbeidsuforhetvurdering: ArbeidsuforhetvurderingDTO?, oppfolgingsoppgave: OppfolgingsoppgaveDTO?, aktivitetskravvurdering: AktivitetskravDTO?, + manglendeMedvirkning: ManglendeMedvirkningDTO?, ) = PersonOversiktStatusDTO( veilederIdent = veilederIdent, @@ -108,6 +110,7 @@ fun PersonOversiktStatus.toPersonOversiktStatusDTO( oppfolgingsoppgave = oppfolgingsoppgave, isAktivSenOppfolgingKandidat = isAktivSenOppfolgingKandidat, aktivitetskravvurdering = aktivitetskravvurdering, + manglendeMedvirkning = manglendeMedvirkning, ) fun PersonOversiktStatus.hasActiveBehandlerdialogOppgave(): Boolean { diff --git a/src/main/kotlin/no/nav/syfo/personstatus/infrastructure/clients/ClientEnvironment.kt b/src/main/kotlin/no/nav/syfo/personstatus/infrastructure/clients/ClientEnvironment.kt index afe5447b..53c069cd 100644 --- a/src/main/kotlin/no/nav/syfo/personstatus/infrastructure/clients/ClientEnvironment.kt +++ b/src/main/kotlin/no/nav/syfo/personstatus/infrastructure/clients/ClientEnvironment.kt @@ -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, diff --git a/src/main/kotlin/no/nav/syfo/personstatus/infrastructure/clients/manglendemedvirkning/ManglendeMedvirkningClient.kt b/src/main/kotlin/no/nav/syfo/personstatus/infrastructure/clients/manglendemedvirkning/ManglendeMedvirkningClient.kt new file mode 100644 index 00000000..48678432 --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/personstatus/infrastructure/clients/manglendemedvirkning/ManglendeMedvirkningClient.kt @@ -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, + ): 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() + } + 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) + } +} diff --git a/src/test/kotlin/no/nav/syfo/aktivitetskravvurdering/kafka/AktivitetskravVurderingConsumerSpek.kt b/src/test/kotlin/no/nav/syfo/aktivitetskravvurdering/kafka/AktivitetskravVurderingConsumerSpek.kt index 4195c90a..e4472be4 100644 --- a/src/test/kotlin/no/nav/syfo/aktivitetskravvurdering/kafka/AktivitetskravVurderingConsumerSpek.kt +++ b/src/test/kotlin/no/nav/syfo/aktivitetskravvurdering/kafka/AktivitetskravVurderingConsumerSpek.kt @@ -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 @@ -34,6 +35,7 @@ class AktivitetskravVurderingConsumerSpek : Spek({ database = database, pdlClient = externalMockEnvironment.pdlClient, arbeidsuforhetvurderingClient = mockk(), + manglendeMedvirkningClient = mockk(), oppfolgingsoppgaveClient = mockk(), aktivitetskravClient = mockk(), personoversiktStatusRepository = personOppgaveRepository, diff --git a/src/test/kotlin/no/nav/syfo/personstatus/api/v2/PersonoversiktStatusApiV2Spek.kt b/src/test/kotlin/no/nav/syfo/personstatus/api/v2/PersonoversiktStatusApiV2Spek.kt index df5e2570..ebc9926e 100644 --- a/src/test/kotlin/no/nav/syfo/personstatus/api/v2/PersonoversiktStatusApiV2Spek.kt +++ b/src/test/kotlin/no/nav/syfo/personstatus/api/v2/PersonoversiktStatusApiV2Spek.kt @@ -15,6 +15,7 @@ import no.nav.syfo.oppfolgingstilfelle.domain.PersonOppfolgingstilfelleVirksomhe import no.nav.syfo.personoppgavehendelse.kafka.KPersonoppgavehendelse import no.nav.syfo.personstatus.api.v2.endpoints.personOversiktApiV2Path 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 @@ -935,6 +936,7 @@ object PersonoversiktStatusApiV2Spek : Spek({ with( handleRequest(HttpMethod.Get, url) { addHeader(HttpHeaders.Authorization, bearerHeader(validToken)) } ) { + response.status() shouldBeEqualTo HttpStatusCode.OK val personOversiktStatus = @@ -947,6 +949,35 @@ object PersonoversiktStatusApiV2Spek : Spek({ } } + describe("manglendemedvirkning") { + it("returns person with active manglendemedvirkning") { + val newPersonOversiktStatus = PersonOversiktStatus(fnr = ARBEIDSTAKER_FNR) + .copy(isAktivManglendeMedvirkningVurdering = true) + database.connection.use { connection -> + connection.createPersonOversiktStatus(commit = true, personOversiktStatus = newPersonOversiktStatus) + } + database.setTildeltEnhet( + ident = PersonIdent(ARBEIDSTAKER_FNR), + enhet = NAV_ENHET, + ) + + with( + handleRequest(HttpMethod.Get, url) { addHeader(HttpHeaders.Authorization, bearerHeader(validToken)) } + ) { + + response.status() shouldBeEqualTo HttpStatusCode.OK + + val personOversiktStatus = + objectMapper.readValue>(response.content!!).first() + personOversiktStatus.fnr shouldBeEqualTo ARBEIDSTAKER_FNR + personOversiktStatus.manglendeMedvirkning shouldNotBe null + personOversiktStatus.manglendeMedvirkning?.varsel shouldNotBe null + personOversiktStatus.manglendeMedvirkning?.type shouldBeEqualTo ManglendeMedvirkningVurderingType.FORHANDSVARSEL + personOversiktStatus.manglendeMedvirkning?.begrunnelse shouldBeEqualTo "begrunnelse" + } + } + } + describe("aktivitetskrav") { it("return person when isAktivAktivitetskravvurdering true") { val personident = ARBEIDSTAKER_FNR diff --git a/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/ArbeidsuforhetvurderingConsumerSpek.kt b/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/ArbeidsuforhetvurderingConsumerSpek.kt index 783e3b5f..dc4e038e 100644 --- a/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/ArbeidsuforhetvurderingConsumerSpek.kt +++ b/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/ArbeidsuforhetvurderingConsumerSpek.kt @@ -8,6 +8,7 @@ import no.nav.syfo.personstatus.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.manglendemedvirkning.IManglendeMedvirkningClient import no.nav.syfo.personstatus.application.oppfolgingsoppgave.IOppfolgingsoppgaveClient import no.nav.syfo.personstatus.db.createPersonOversiktStatus import no.nav.syfo.personstatus.db.getPersonOversiktStatusList @@ -37,6 +38,7 @@ class ArbeidsuforhetvurderingConsumerSpek : Spek({ database = database, pdlClient = externalMockEnvironment.pdlClient, arbeidsuforhetvurderingClient = arbeidsuforhervurderingClient, + manglendeMedvirkningClient = mockk(), personoversiktStatusRepository = personOppgaveRepository, oppfolgingsoppgaveClient = oppfolgingsoppgaveClient, aktivitetskravClient = mockk(), diff --git a/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/manglendemedvirkning/ManglendeMedvirkningVurderingConsumerSpek.kt b/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/manglendemedvirkning/ManglendeMedvirkningVurderingConsumerSpek.kt index 0434da74..018c8303 100644 --- a/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/manglendemedvirkning/ManglendeMedvirkningVurderingConsumerSpek.kt +++ b/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/manglendemedvirkning/ManglendeMedvirkningVurderingConsumerSpek.kt @@ -7,6 +7,7 @@ import io.mockk.verify 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.createPersonOversiktStatus import no.nav.syfo.personstatus.domain.PersonIdent @@ -30,11 +31,13 @@ class ManglendeMedvirkningVurderingConsumerSpek : Spek({ val kafkaConsumer = mockk>() val personOversiktStatusRepository = PersonOversiktStatusRepository(database = database) val arbeidsuforhervurderingClient = mockk() + val manglendeMedvirkningClient = mockk() val oppfolgingsoppgaveClient = mockk() val personoversiktStatusService = PersonoversiktStatusService( database = database, pdlClient = externalMockEnvironment.pdlClient, arbeidsuforhetvurderingClient = arbeidsuforhervurderingClient, + manglendeMedvirkningClient = manglendeMedvirkningClient, personoversiktStatusRepository = personOversiktStatusRepository, oppfolgingsoppgaveClient = oppfolgingsoppgaveClient, aktivitetskravClient = mockk(), diff --git a/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/meroppfolging/SenOppfolgingKandidatStatusConsumerSpek.kt b/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/meroppfolging/SenOppfolgingKandidatStatusConsumerSpek.kt index 2e21bd67..109a7c3e 100644 --- a/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/meroppfolging/SenOppfolgingKandidatStatusConsumerSpek.kt +++ b/src/test/kotlin/no/nav/syfo/personstatus/infrastructure/kafka/meroppfolging/SenOppfolgingKandidatStatusConsumerSpek.kt @@ -7,6 +7,7 @@ import io.mockk.verify 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.createPersonOversiktStatus import no.nav.syfo.personstatus.db.getPersonOversiktStatusList @@ -33,6 +34,7 @@ class SenOppfolgingKandidatStatusConsumerSpek : Spek({ database = database, pdlClient = externalMockEnvironment.pdlClient, arbeidsuforhetvurderingClient = mockk(), + manglendeMedvirkningClient = mockk(), oppfolgingsoppgaveClient = mockk(), aktivitetskravClient = mockk(), personoversiktStatusRepository = personOppgaveRepository, diff --git a/src/test/kotlin/no/nav/syfo/testutil/InternalMockEnvironment.kt b/src/test/kotlin/no/nav/syfo/testutil/InternalMockEnvironment.kt index 3ea73ebb..96a6be23 100644 --- a/src/test/kotlin/no/nav/syfo/testutil/InternalMockEnvironment.kt +++ b/src/test/kotlin/no/nav/syfo/testutil/InternalMockEnvironment.kt @@ -11,6 +11,7 @@ import no.nav.syfo.personstatus.infrastructure.cronjob.virksomhetsnavn.PersonOpp import no.nav.syfo.personstatus.PersonoversiktStatusService 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.oppfolgingsoppgave.OppfolgingsoppgaveClient import no.nav.syfo.personstatus.infrastructure.database.repository.PersonOversiktStatusRepository @@ -43,6 +44,11 @@ class InternalMockEnvironment private constructor() { clientEnvironment = environment.clients.arbeidsuforhetvurdering, httpClient = externalMockEnvironment.mockHttpClient ) + private val manglendeMedvirkningClient = ManglendeMedvirkningClient( + azureAdClient = azureAdClient, + clientEnvironment = environment.clients.manglendeMedvirkning, + httpClient = externalMockEnvironment.mockHttpClient + ) private val oppfolgingsoppgaveClient = OppfolgingsoppgaveClient( azureAdClient = azureAdClient, clientEnvironment = environment.clients.ishuskelapp, @@ -80,6 +86,7 @@ class InternalMockEnvironment private constructor() { database = database, pdlClient = pdlClient, arbeidsuforhetvurderingClient = arbeidsuforhetvurderingClient, + manglendeMedvirkningClient = manglendeMedvirkningClient, personoversiktStatusRepository = personoversiktRepository, oppfolgingsoppgaveClient = oppfolgingsoppgaveClient, aktivitetskravClient = aktivitetskravClient, diff --git a/src/test/kotlin/no/nav/syfo/testutil/TestApiModule.kt b/src/test/kotlin/no/nav/syfo/testutil/TestApiModule.kt index fcb9d5ed..2557ec45 100644 --- a/src/test/kotlin/no/nav/syfo/testutil/TestApiModule.kt +++ b/src/test/kotlin/no/nav/syfo/testutil/TestApiModule.kt @@ -7,6 +7,7 @@ import no.nav.syfo.personstatus.infrastructure.clients.pdl.PdlClient import no.nav.syfo.personstatus.PersonoversiktStatusService import no.nav.syfo.personstatus.api.v2.apiModule 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.oppfolgingsoppgave.OppfolgingsoppgaveClient import no.nav.syfo.personstatus.infrastructure.clients.azuread.AzureAdClient import no.nav.syfo.personstatus.infrastructure.clients.veiledertilgang.VeilederTilgangskontrollClient @@ -32,6 +33,11 @@ fun Application.testApiModule( clientEnvironment = externalMockEnvironment.environment.clients.arbeidsuforhetvurdering, httpClient = externalMockEnvironment.mockHttpClient ) + val manglendeMedvirkningClient = ManglendeMedvirkningClient( + azureAdClient = azureAdClient, + clientEnvironment = externalMockEnvironment.environment.clients.manglendeMedvirkning, + httpClient = externalMockEnvironment.mockHttpClient + ) val oppfolgingsoppgaveClient = OppfolgingsoppgaveClient( azureAdClient = azureAdClient, clientEnvironment = externalMockEnvironment.environment.clients.ishuskelapp, @@ -48,6 +54,7 @@ fun Application.testApiModule( pdlClient = pdlClient, personoversiktStatusRepository = personoversiktRepository, arbeidsuforhetvurderingClient = arbeidsuforhetvurderingClient, + manglendeMedvirkningClient = manglendeMedvirkningClient, oppfolgingsoppgaveClient = oppfolgingsoppgaveClient, aktivitetskravClient = mockk(relaxed = true), ) diff --git a/src/test/kotlin/no/nav/syfo/testutil/TestEnvironment.kt b/src/test/kotlin/no/nav/syfo/testutil/TestEnvironment.kt index 715e11de..96b83556 100644 --- a/src/test/kotlin/no/nav/syfo/testutil/TestEnvironment.kt +++ b/src/test/kotlin/no/nav/syfo/testutil/TestEnvironment.kt @@ -17,6 +17,7 @@ fun testEnvironment( syfobehandlendeenhetUrl: String = "syfobehandlendeenhet", arbeidsuforhetvurderingUrl: String = "arbeidsuforhetvurdering", isaktivitetskravUrl: String = "isaktivitetskrav", + ismanglendemedvirkningUrl: String = "ismanglendemedvirkning", istilgangskontrollUrl: String = "istilgangskontroll", ishuskelappUrl: String = "ishuskelapp", ) = Environment( @@ -66,6 +67,10 @@ fun testEnvironment( baseUrl = isaktivitetskravUrl, clientId = "dev-gcp.teamsykefravr.isaktivitetskrav", ), + manglendeMedvirkning = ClientEnvironment( + baseUrl = ismanglendemedvirkningUrl, + clientId = "dev-gcp.teamsykefravr.ismanglendemedvirkning", + ), istilgangskontroll = ClientEnvironment( baseUrl = istilgangskontrollUrl, clientId = "dev-gcp.teamsykefravr.istilgangskontroll", diff --git a/src/test/kotlin/no/nav/syfo/testutil/mock/ManglendeMedvirkningMock.kt b/src/test/kotlin/no/nav/syfo/testutil/mock/ManglendeMedvirkningMock.kt new file mode 100644 index 00000000..b04ded5c --- /dev/null +++ b/src/test/kotlin/no/nav/syfo/testutil/mock/ManglendeMedvirkningMock.kt @@ -0,0 +1,35 @@ +package no.nav.syfo.testutil.mock + +import io.ktor.client.engine.mock.* +import io.ktor.client.request.* +import no.nav.syfo.personstatus.application.manglendemedvirkning.ManglendeMedvirkningDTO +import no.nav.syfo.personstatus.application.manglendemedvirkning.ManglendeMedvirkningResponseDTO +import no.nav.syfo.personstatus.application.manglendemedvirkning.ManglendeMedvirkningVarselDTO +import no.nav.syfo.personstatus.application.manglendemedvirkning.ManglendeMedvirkningVurderingType +import no.nav.syfo.testutil.UserConstants +import java.time.LocalDate +import java.time.LocalDateTime +import java.util.* + +fun MockRequestHandleScope.manglendeMedvirkningMockResponse(): HttpResponseData = + respondOk( + ManglendeMedvirkningResponseDTO( + mapOf( + Pair( + UserConstants.ARBEIDSTAKER_FNR, + ManglendeMedvirkningDTO( + uuid = UUID.randomUUID(), + personident = UserConstants.ARBEIDSTAKER_FNR, + createdAt = LocalDateTime.now().minusDays(1), + type = ManglendeMedvirkningVurderingType.FORHANDSVARSEL, + begrunnelse = "begrunnelse", + varsel = ManglendeMedvirkningVarselDTO( + uuid = UUID.randomUUID(), + createdAt = LocalDateTime.now().minusDays(1), + svarfrist = LocalDate.now().plusDays(1), + ) + ), + ), + ), + ) + ) diff --git a/src/test/kotlin/no/nav/syfo/testutil/mock/MockHttpClient.kt b/src/test/kotlin/no/nav/syfo/testutil/mock/MockHttpClient.kt index e718fb5b..95899e4d 100644 --- a/src/test/kotlin/no/nav/syfo/testutil/mock/MockHttpClient.kt +++ b/src/test/kotlin/no/nav/syfo/testutil/mock/MockHttpClient.kt @@ -22,6 +22,7 @@ fun mockHttpClient(environment: Environment) = HttpClient(MockEngine) { requestUrl.startsWith("/${environment.clients.ereg.baseUrl}") -> eregMockResponse(request) requestUrl.startsWith("/${environment.clients.arbeidsuforhetvurdering.baseUrl}") -> arbeidsuforhetVurderingMockResponse() requestUrl.startsWith("/${environment.clients.ishuskelapp.baseUrl}") -> oppfolgingsoppgaveMockResponse() + requestUrl.startsWith("/${environment.clients.manglendeMedvirkning.baseUrl}") -> manglendeMedvirkningMockResponse() else -> error("Unhandled ${request.url.encodedPath}") }