Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Api vedtaksdata for EESSI #6781

Merged
merged 18 commits into from
Jan 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions apps/etterlatte-api/.nais/dev-api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,34 @@ spec:
roles:
- les-oms-sak
- les-bp-sak
- application: eessi-pensjon-prefill-q1
namespace: eessipensjon
cluster: dev-gcp
permissions:
roles:
- les-oms-vedtak
- les-bp-vedtak
- application: eessi-pensjon-journalforing-q1
namespace: eessipensjon
cluster: dev-gcp
permissions:
roles:
- les-oms-vedtak
- les-bp-vedtak
- application: eessi-pensjon-prefill-q2
namespace: eessipensjon
cluster: dev-gcp
permissions:
roles:
- les-oms-vedtak
- les-bp-vedtak
- application: eessi-pensjon-journalforing-q2
namespace: eessipensjon
cluster: dev-gcp
permissions:
roles:
- les-oms-vedtak
- les-bp-vedtak
outbound:
rules:
- application: etterlatte-vedtaksvurdering
Expand Down
14 changes: 14 additions & 0 deletions apps/etterlatte-api/.nais/prod-api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,20 @@ spec:
roles:
- les-oms-sak
- les-bp-sak
- application: eessi-pensjon-prefill
namespace: eessipensjon
cluster: prod-gcp
permissions:
roles:
- les-oms-vedtak
- les-bp-vedtak
- application: eessi-pensjon-journalforing
namespace: eessipensjon
cluster: prod-gcp
permissions:
roles:
- les-oms-vedtak
- les-bp-vedtak
outbound:
rules:
- application: etterlatte-vedtaksvurdering
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import no.nav.etterlatte.samordning.serverRequestLoggerPlugin
import no.nav.etterlatte.samordning.userIdMdcPlugin
import no.nav.etterlatte.samordning.vedtak.barnepensjonVedtakRoute
import no.nav.etterlatte.samordning.vedtak.samordningVedtakRoute
import no.nav.etterlatte.vedtak.vedtakRoute

fun main() {
Server(ApplicationContext(Miljoevariabler.systemEnv())).run()
Expand Down Expand Up @@ -44,6 +45,8 @@ class Server(
config = applicationContext.config,
)

vedtakRoute(vedtakService = applicationContext.vedtakService)

install(userIdMdcPlugin)
install(serverRequestLoggerPlugin)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ import no.nav.etterlatte.libs.ktor.AzureEnums.AZURE_APP_WELL_KNOWN_URL
import no.nav.etterlatte.libs.ktor.httpClientClientCredentials
import no.nav.etterlatte.samordning.vedtak.SamordningVedtakService
import no.nav.etterlatte.samordning.vedtak.TjenestepensjonKlient
import no.nav.etterlatte.samordning.vedtak.VedtaksvurderingKlient
import no.nav.etterlatte.samordning.vedtak.VedtaksvurderingSamordningKlient
import no.nav.etterlatte.vedtak.VedtakService
import no.nav.etterlatte.vedtak.VedtaksvurderingKlient

class ApplicationContext(
env: Miljoevariabler,
Expand All @@ -28,7 +30,7 @@ class ApplicationContext(
azureAppScope = config.getString("vedtak.outbound"),
)
}
private val vedtaksvurderingKlient = VedtaksvurderingKlient(config, vedtaksvurderingHttpClient)
private val vedtaksvurderingSamordningKlient = VedtaksvurderingSamordningKlient(config, vedtaksvurderingHttpClient)

private val tpHttpClient =
httpClientClientCredentials(
Expand All @@ -39,7 +41,7 @@ class ApplicationContext(
)
private val tpKlient = TjenestepensjonKlient(config, tpHttpClient)

val samordningVedtakService = SamordningVedtakService(vedtaksvurderingKlient, tpKlient)
val samordningVedtakService = SamordningVedtakService(vedtaksvurderingSamordningKlient, tpKlient)

private val behandlingHttpClient =
httpClientClientCredentials(
Expand All @@ -50,4 +52,7 @@ class ApplicationContext(
)
private val behandlingKlient = BehandlingKlient(config, behandlingHttpClient)
val behandlingService = BehandlingService(behandlingKlient)

val vedtakKlient = VedtaksvurderingKlient(config, vedtaksvurderingHttpClient)
val vedtakService = VedtakService(vedtakKlient)
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import java.time.LocalDate
import java.time.YearMonth

class SamordningVedtakService(
private val vedtaksvurderingKlient: VedtaksvurderingKlient,
private val vedtaksvurderingKlient: VedtaksvurderingSamordningKlient,
private val tjenestepensjonKlient: TjenestepensjonKlient,
) {
private val logger = LoggerFactory.getLogger(SamordningVedtakService::class.java)
Expand Down Expand Up @@ -49,7 +49,12 @@ class SamordningVedtakService(
fnr: Folkeregisteridentifikator,
context: CallerContext,
): List<SamordningVedtakDto> {
if (context is MaskinportenTpContext && !tjenestepensjonKlient.harTpYtelseOnDate(fnr.value, context.tpnr, fomDato)
if (context is MaskinportenTpContext &&
!tjenestepensjonKlient.harTpYtelseOnDate(
fnr.value,
context.tpnr,
fomDato,
)
) {
logger.info("Avslår forespørsel, manglende/ikke gyldig TP-ytelse")
throw TjenestepensjonManglendeTilgangException("Ikke gyldig tpytelse")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ import no.nav.etterlatte.libs.ktor.route.FoedselsnummerDTO
import org.slf4j.LoggerFactory
import java.time.LocalDate

class VedtaksvurderingKlient(
class VedtaksvurderingSamordningKlient(
config: Config,
private val httpClient: HttpClient,
) {
private val logger = LoggerFactory.getLogger(VedtaksvurderingKlient::class.java)
private val logger = LoggerFactory.getLogger(VedtaksvurderingSamordningKlient::class.java)

private val vedtaksvurderingUrl = "${config.getString("vedtak.url")}/api/samordning/vedtak"

Expand All @@ -41,7 +41,10 @@ class VedtaksvurderingKlient(
.get {
url("$vedtaksvurderingUrl/$vedtakId")
if (callerContext is MaskinportenTpContext) {
header("orgnr", callerContext.organisasjonsnr).also { logger.info("Henter vedtak med orgnr $it") }
header(
"orgnr",
callerContext.organisasjonsnr,
).also { logger.info("Henter vedtak med orgnr $it") }
}
}.body()
} catch (e: ClientRequestException) {
Expand All @@ -68,7 +71,10 @@ class VedtaksvurderingKlient(
parameter("sakstype", sakType)
parameter("fomDato", fomDato)
if (callerContext is MaskinportenTpContext) {
header("orgnr", callerContext.organisasjonsnr).also { logger.info("Henter vedtaksliste med orgnr $it") }
header(
"orgnr",
callerContext.organisasjonsnr,
).also { logger.info("Henter vedtaksliste med orgnr $it") }
}
contentType(ContentType.Application.Json)
setBody(FoedselsnummerDTO(fnr))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package no.nav.etterlatte.vedtak

import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call
import io.ktor.server.application.install
import io.ktor.server.request.receive
import io.ktor.server.response.respond
import io.ktor.server.response.respondNullable
import io.ktor.server.routing.Route
import io.ktor.server.routing.post
import io.ktor.server.routing.route
import no.nav.etterlatte.AuthorizationPlugin
import no.nav.etterlatte.libs.common.person.Folkeregisteridentifikator
import no.nav.etterlatte.libs.common.vedtak.Periode
import no.nav.etterlatte.libs.ktor.route.FoedselsnummerDTO
import no.nav.etterlatte.libs.ktor.token.Issuer
import java.math.BigDecimal
import java.time.YearMonth

fun Route.vedtakRoute(vedtakService: VedtakService) {
// Tiltenkt for eksternt for etterlatte men internt i Nav. Initelt gjelder dette EESSI.
route("api/v1/vedtak") {
install(AuthorizationPlugin) {
accessPolicyRolesEllerAdGrupper = setOf("les-bp-vedtak", "les-oms-vedtak")
issuers = setOf(Issuer.AZURE.issuerName)
}

post {
try {
val request = call.receive<FoedselsnummerDTO>()
val fnr = Folkeregisteridentifikator.of(request.foedselsnummer)
val vedtak = vedtakService.hentVedtak(fnr)
call.respond(vedtak)
} catch (e: IllegalArgumentException) {
call.respondNullable(HttpStatusCode.BadRequest, e.message)
}
}
}
}

data class VedtakForEksterntDto(
val vedtak: List<VedtakEksternt>,
)

data class VedtakEksternt(
val sakId: Long,
val sakType: String,
val virkningstidspunkt: YearMonth,
val type: VedtakTypeEksternt,
val utbetaling: List<VedtakEksterntUtbetaling>,
)

enum class VedtakTypeEksternt {
INNVILGELSE,
OPPHOER,
AVSLAG,
ENDRING,
}

data class VedtakEksterntUtbetaling(
val periode: Periode,
val beloep: BigDecimal?,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package no.nav.etterlatte.vedtak

import no.nav.etterlatte.libs.common.person.Folkeregisteridentifikator
import no.nav.etterlatte.libs.common.vedtak.VedtakDto
import no.nav.etterlatte.libs.common.vedtak.VedtakInnholdDto

class VedtakService(
private val vedtaksvurderingKlient: VedtaksvurderingKlient,
) {
suspend fun hentVedtak(fnr: Folkeregisteridentifikator): VedtakForEksterntDto {
val vedtak = vedtaksvurderingKlient.hentVedtak(fnr)
return VedtakForEksterntDto(
vedtak = vedtak.filter { it.type.vanligBehandling }.map { it.toEksternDto() },
)
}
}

fun VedtakDto.toEksternDto(): VedtakEksternt {
val vedtakInnhold = (innhold as VedtakInnholdDto.VedtakBehandlingDto)
return VedtakEksternt(
sakId = sak.id.sakId,
sakType = sak.sakType.name,
virkningstidspunkt = vedtakInnhold.virkningstidspunkt,
type = VedtakTypeEksternt.valueOf(type.name),
utbetaling =
vedtakInnhold.utbetalingsperioder.map { utbetaling ->
VedtakEksterntUtbetaling(
periode = utbetaling.periode,
beloep = utbetaling.beloep,
)
},
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package no.nav.etterlatte.vedtak

import com.typesafe.config.Config
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.plugins.ClientRequestException
import io.ktor.client.request.post
import io.ktor.client.request.setBody
import io.ktor.client.request.url
import io.ktor.http.HttpStatusCode
import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException
import no.nav.etterlatte.libs.common.feilhaandtering.IkkeTillattException
import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException
import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException
import no.nav.etterlatte.libs.common.logging.sikkerlogger
import no.nav.etterlatte.libs.common.person.Folkeregisteridentifikator
import no.nav.etterlatte.libs.common.vedtak.VedtakDto
import org.slf4j.LoggerFactory

class VedtaksvurderingKlient(
config: Config,
private val httpClient: HttpClient,
) {
private val logger = LoggerFactory.getLogger(VedtaksvurderingKlient::class.java)

private val vedtaksvurderingUrl = "${config.getString("vedtak.url")}/api/vedtak/for/eksternt"

suspend fun hentVedtak(request: Folkeregisteridentifikator): List<VedtakDto> {
sikkerlogger().info("Henter vedtak med fnr=$request")

return try {
httpClient
.post {
url(vedtaksvurderingUrl)
setBody(request)
}.body()
} catch (e: ClientRequestException) {
logger.error("Det oppstod feil i kall til vedtak API", e)
when (e.response.status) {
HttpStatusCode.Unauthorized -> throw IkkeTillattException("VEDTAK-TILGANG", "Vedtak: Ikke tilgang")
HttpStatusCode.BadRequest -> throw UgyldigForespoerselException(
"VEDTAK-FORESPOERSEL",
"Vedtak: Ugyldig forespørsel",
)

HttpStatusCode.NotFound -> throw IkkeFunnetException(
"VEDTAK-IKKE-FUNNET",
"Vedtak: Ressurs ikke funnet",
)

else -> throw InternfeilException("Intern feil ved uthenting av vedtak")
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ const val FNR = "10518209200"
const val TPNR_SPK = "3010"

class SamordningVedtakServiceTest {
private val vedtakKlient = mockk<VedtaksvurderingKlient>()
private val vedtakKlient = mockk<VedtaksvurderingSamordningKlient>()
private val tpKlient = mockk<TjenestepensjonKlient>()
private val samordningVedtakService = SamordningVedtakService(vedtakKlient, tpKlient)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class VedtakvurderingKlientTest {
else -> error("Unhandled ${request.url.fullPath}")
}
}
val vedtaksvurderingKlient = VedtaksvurderingKlient(config, client)
val vedtaksvurderingKlient = VedtaksvurderingSamordningKlient(config, client)
runBlocking {
vedtaksvurderingKlient.hentVedtak(vedtakId, MaskinportenTpContext(Tjenestepensjonnummer(""), "orgnr"))
}
Expand Down Expand Up @@ -71,7 +71,7 @@ class VedtakvurderingKlientTest {
}
}

val vedtaksvurderingKlient = VedtaksvurderingKlient(config, client)
val vedtaksvurderingKlient = VedtaksvurderingSamordningKlient(config, client)

runBlocking {
vedtaksvurderingKlient.hentVedtaksliste(
Expand Down
Loading