From ce6df6112bee104673ddd1fcbb27afe3e50d90e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Fri, 23 Aug 2024 16:21:13 +0200 Subject: [PATCH] =?UTF-8?q?EY-3992=20Hente=20trygdetid=20pesys=20AP=20og?= =?UTF-8?q?=20uf=C3=B8repensjon=20(#5586)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * EY-3992 Hente trygdetid pesys AP og uførepensjon * EY-3992 Legg til egn typer for trygdetidsperioder fra pesys * Oppdater gamle tester med pesysklientmock * Fikse type for trygdetidene fra trygdetid * EY-3992 Oppdatere til lister av trygdetidsperioder * Fjern kap20 da dette ikke er interessant * Fom og tom er ikke nullable egentlig * Eks --- .../kotlin/common/klienter/PesysKlient.kt | 4 +- .../client/src/shared/api/trygdetid.ts | 27 ++ apps/etterlatte-trygdetid/.nais/dev.yaml | 5 + apps/etterlatte-trygdetid/.nais/prod.yaml | 5 + .../main/kotlin/trygdetid/TrygdetidRoutes.kt | 344 +++++++++--------- .../main/kotlin/trygdetid/TrygdetidService.kt | 51 +++ .../trygdetid/config/ApplicationContext.kt | 2 + .../trygdetid/klienter/BehandlingKlient.kt | 10 +- .../kotlin/trygdetid/klienter/PesysKlient.kt | 98 +++++ .../src/main/resources/application.conf | 5 +- .../TrygdetidServiceIntegrationTest.kt | 2 + .../trygdetid/TrygdetidServiceTest.kt | 2 + 12 files changed, 389 insertions(+), 166 deletions(-) create mode 100644 apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/klienter/PesysKlient.kt diff --git a/apps/etterlatte-behandling/src/main/kotlin/common/klienter/PesysKlient.kt b/apps/etterlatte-behandling/src/main/kotlin/common/klienter/PesysKlient.kt index 7500260cb7d..718b91d5e73 100644 --- a/apps/etterlatte-behandling/src/main/kotlin/common/klienter/PesysKlient.kt +++ b/apps/etterlatte-behandling/src/main/kotlin/common/klienter/PesysKlient.kt @@ -23,11 +23,11 @@ interface PesysKlient { class PesysKlientImpl( config: Config, - pen: HttpClient, + httpClient: HttpClient, ) : PesysKlient { private val logger = LoggerFactory.getLogger(this::class.java) private val azureAdClient = AzureAdClient(config) - private val downstreamResourceClient = DownstreamResourceClient(azureAdClient, pen) + private val downstreamResourceClient = DownstreamResourceClient(azureAdClient, httpClient) private val clientId = config.getString("pen.client.id") private val resourceUrl = config.getString("pen.client.url") diff --git a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/trygdetid.ts b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/trygdetid.ts index 5ec9b1ec065..1433040b30b 100644 --- a/apps/etterlatte-saksbehandling-ui/client/src/shared/api/trygdetid.ts +++ b/apps/etterlatte-saksbehandling-ui/client/src/shared/api/trygdetid.ts @@ -1,6 +1,33 @@ import { apiClient, ApiResponse } from '~shared/api/apiClient' import { JaNei } from '~shared/types/ISvar' +export const hentTrygdetidUfoeretrygdOgAlderspensjon = async ( + fnr: string +): Promise> => + apiClient.post('trygdetid_v2/pesys/grunnlag', { foedselsnummer: fnr }) + +export interface TrygdetidsperioderPesys { + ufoeretrygd: TrygdetidsperiodeListe + alderspensjon: TrygdetidsperiodeListe +} + +export interface TrygdetidsperiodeListe { + trygdetidsGrunnlagListe?: TrygdetidPeriodePesys[] +} + +export interface TrygdetidPeriodePesys { + isoCountryCode: String // ISO 3166-1 alpha-3 code feks: "NOR" "SWE" + fra: String //TODO: eller date? kommer i steg 2 da vi dette skal brukes i frontend + til: String + poengInnAar?: Boolean + poengUtAar?: Boolean + prorata?: Boolean + kilde: { + tidspunkt: string + type: string + } +} + export const hentTrygdetider = async (behandlingId: string): Promise> => apiClient.get(`/trygdetid_v2/${behandlingId}`) diff --git a/apps/etterlatte-trygdetid/.nais/dev.yaml b/apps/etterlatte-trygdetid/.nais/dev.yaml index 72312a6a033..999b8dee725 100644 --- a/apps/etterlatte-trygdetid/.nais/dev.yaml +++ b/apps/etterlatte-trygdetid/.nais/dev.yaml @@ -76,6 +76,10 @@ spec: value: http://etterlatte-grunnlag - name: ETTERLATTE_GRUNNLAG_CLIENT_ID value: dev-gcp.etterlatte.etterlatte-grunnlag + - name: PEN_URL + value: https://pensjon-pen-q2.dev-fss-pub.nais.io/pen/springapi + - name: PEN_CLIENT_ID + value: ddd52335-cfe8-4ee9-9e68-416a5ab26efa envFrom: - secret: my-application-unleash-api-token accessPolicy: @@ -97,3 +101,4 @@ spec: - application: etterlatte-grunnlag external: - host: etterlatte-unleash-api.nav.cloud.nais.io + - host: pensjon-pen-q2.dev-fss-pub.nais.io diff --git a/apps/etterlatte-trygdetid/.nais/prod.yaml b/apps/etterlatte-trygdetid/.nais/prod.yaml index 2fb73e0f8a8..daf384341ce 100644 --- a/apps/etterlatte-trygdetid/.nais/prod.yaml +++ b/apps/etterlatte-trygdetid/.nais/prod.yaml @@ -85,6 +85,10 @@ spec: value: http://etterlatte-grunnlag - name: ETTERLATTE_GRUNNLAG_CLIENT_ID value: prod-gcp.etterlatte.etterlatte-grunnlag + - name: PEN_URL + value: https://pensjon-pen.prod-fss-pub.nais.io/pen/springapi + - name: PEN_CLIENT_ID + value: 53eaf67f-d7b2-46e9-8ffe-3da7cf0ac955 envFrom: - secret: my-application-unleash-api-token accessPolicy: @@ -101,3 +105,4 @@ spec: - application: etterlatte-grunnlag external: - host: etterlatte-unleash-api.nav.cloud.nais.io + - host: pensjon-pen.prod-fss-pub.nais.io diff --git a/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/TrygdetidRoutes.kt b/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/TrygdetidRoutes.kt index b6ac7fe20f9..c728c48f0e0 100644 --- a/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/TrygdetidRoutes.kt +++ b/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/TrygdetidRoutes.kt @@ -29,6 +29,7 @@ import no.nav.etterlatte.libs.ktor.route.BEHANDLINGID_CALL_PARAMETER import no.nav.etterlatte.libs.ktor.route.behandlingId import no.nav.etterlatte.libs.ktor.route.uuid import no.nav.etterlatte.libs.ktor.route.withBehandlingId +import no.nav.etterlatte.libs.ktor.route.withFoedselsnummer import no.nav.etterlatte.libs.ktor.route.withParam import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo import no.nav.etterlatte.libs.ktor.token.Systembruker @@ -56,109 +57,96 @@ fun Route.trygdetid( trygdetidService: TrygdetidService, behandlingKlient: BehandlingKlient, ) { - route("/api/trygdetid_v2/{$BEHANDLINGID_CALL_PARAMETER}") { - get { - withBehandlingId(behandlingKlient) { - logger.info("Henter trygdetid for behandling $behandlingId") - val trygdetider = trygdetidService.hentTrygdetiderIBehandling(behandlingId, brukerTokenInfo) - if (trygdetider.isNotEmpty()) { - call.respond(trygdetider.map { it.toDto() }) - } else { - call.respond(HttpStatusCode.NoContent) - } - } - } - - post { - withBehandlingId(behandlingKlient, skrivetilgang = true) { - logger.info("Oppretter trygdetid(er) for behandling $behandlingId") - trygdetidService.opprettTrygdetiderForBehandling(behandlingId, brukerTokenInfo) + route("/api/trygdetid_v2") { + post("/pesys") { + withFoedselsnummer(behandlingKlient, skrivetilgang = false) { fnr -> call.respond( - trygdetidService - .hentTrygdetiderIBehandling(behandlingId, brukerTokenInfo) - .map { it.toDto() }, + trygdetidService.hentTrygdetidsgrunnlagUforeOgAlderspensjon( + fnr = fnr.value, + brukerTokenInfo = brukerTokenInfo + ) ) } } + route("/{$BEHANDLINGID_CALL_PARAMETER}") { + get { + withBehandlingId(behandlingKlient) { + logger.info("Henter trygdetid for behandling $behandlingId") + val trygdetider = trygdetidService.hentTrygdetiderIBehandling(behandlingId, brukerTokenInfo) + if (trygdetider.isNotEmpty()) { + call.respond(trygdetider.map { it.toDto() }) + } else { + call.respond(HttpStatusCode.NoContent) + } + } + } - post("oppdater-opplysningsgrunnlag") { - withBehandlingId(behandlingKlient, skrivetilgang = true) { - logger.info("Oppdaterer opplysningsgrunnlag på trygdetider for behandling $behandlingId") - - trygdetidService.oppdaterOpplysningsgrunnlagForTrygdetider(behandlingId, brukerTokenInfo) - call.respond( - trygdetidService - .hentTrygdetiderIBehandling(behandlingId, brukerTokenInfo) - .minBy { it.ident } - .toDto(), - ) + post { + withBehandlingId(behandlingKlient, skrivetilgang = true) { + logger.info("Oppretter trygdetid(er) for behandling $behandlingId") + trygdetidService.opprettTrygdetiderForBehandling(behandlingId, brukerTokenInfo) + call.respond( + trygdetidService + .hentTrygdetiderIBehandling(behandlingId, brukerTokenInfo) + .map { it.toDto() }, + ) + } } - } - post("overstyr") { - withBehandlingId(behandlingKlient, skrivetilgang = true) { - logger.info("Oppdater trygdetid (overstyring) for behandling $behandlingId") - val trygdetidOverstyringDto = call.receive() + post("oppdater-opplysningsgrunnlag") { + withBehandlingId(behandlingKlient, skrivetilgang = true) { + logger.info("Oppdaterer opplysningsgrunnlag på trygdetider for behandling $behandlingId") - trygdetidService.overstyrNorskPoengaaarForTrygdetid( - trygdetidOverstyringDto.id, - behandlingId, - trygdetidOverstyringDto.overstyrtNorskPoengaar, - brukerTokenInfo, - ) - call.respond( - trygdetidService - .hentTrygdetidIBehandlingMedId( - behandlingId, - trygdetidOverstyringDto.id, - brukerTokenInfo, - )!! - .toDto(), - ) + trygdetidService.oppdaterOpplysningsgrunnlagForTrygdetider(behandlingId, brukerTokenInfo) + call.respond( + trygdetidService + .hentTrygdetiderIBehandling(behandlingId, brukerTokenInfo) + .minBy { it.ident } + .toDto(), + ) + } } - } - post("yrkesskade") { - withBehandlingId(behandlingKlient, skrivetilgang = true) { - logger.info("Oppdater trygdetid (yrkesskade) for behandling $behandlingId") - val trygdetidYrkesskadeDto = call.receive() - - trygdetidService.setYrkesskade( - trygdetidYrkesskadeDto.id, - behandlingId, - trygdetidYrkesskadeDto.yrkesskade, - brukerTokenInfo, - ) + post("overstyr") { + withBehandlingId(behandlingKlient, skrivetilgang = true) { + logger.info("Oppdater trygdetid (overstyring) for behandling $behandlingId") + val trygdetidOverstyringDto = call.receive() - call.respond( - trygdetidService - .hentTrygdetidIBehandlingMedId( - behandlingId, - trygdetidYrkesskadeDto.id, - brukerTokenInfo, - )!! - .toDto(), - ) + trygdetidService.overstyrNorskPoengaaarForTrygdetid( + trygdetidOverstyringDto.id, + behandlingId, + trygdetidOverstyringDto.overstyrtNorskPoengaar, + brukerTokenInfo, + ) + call.respond( + trygdetidService + .hentTrygdetidIBehandlingMedId( + behandlingId, + trygdetidOverstyringDto.id, + brukerTokenInfo, + )!! + .toDto(), + ) + } } - } - route("{$TRYGDETIDID_CALL_PARAMETER}") { - post("grunnlag") { + post("yrkesskade") { withBehandlingId(behandlingKlient, skrivetilgang = true) { - logger.info("Legger til trygdetidsgrunnlag for behandling $behandlingId") - val trygdetidgrunnlagDto = call.receive() + logger.info("Oppdater trygdetid (yrkesskade) for behandling $behandlingId") + val trygdetidYrkesskadeDto = call.receive() - trygdetidService.lagreTrygdetidGrunnlagForTrygdetidMedIdIBehandlingMedSjekk( + trygdetidService.setYrkesskade( + trygdetidYrkesskadeDto.id, behandlingId, - trygdetidId(), - trygdetidgrunnlagDto.toTrygdetidGrunnlag(brukerTokenInfo), + trygdetidYrkesskadeDto.yrkesskade, brukerTokenInfo, ) + call.respond( trygdetidService .hentTrygdetidIBehandlingMedId( behandlingId, - trygdetidId(), + trygdetidYrkesskadeDto.id, brukerTokenInfo, )!! .toDto(), @@ -166,14 +154,16 @@ fun Route.trygdetid( } } - delete("/grunnlag/{trygdetidGrunnlagId}") { - withBehandlingId(behandlingKlient, skrivetilgang = true) { - withParam("trygdetidGrunnlagId") { trygdetidGrunnlagId -> - logger.info("Sletter trygdetidsgrunnlag for behandling $behandlingId") - trygdetidService.slettTrygdetidGrunnlagForTrygdetid( + route("{$TRYGDETIDID_CALL_PARAMETER}") { + post("grunnlag") { + withBehandlingId(behandlingKlient, skrivetilgang = true) { + logger.info("Legger til trygdetidsgrunnlag for behandling $behandlingId") + val trygdetidgrunnlagDto = call.receive() + + trygdetidService.lagreTrygdetidGrunnlagForTrygdetidMedIdIBehandlingMedSjekk( behandlingId, trygdetidId(), - trygdetidGrunnlagId, + trygdetidgrunnlagDto.toTrygdetidGrunnlag(brukerTokenInfo), brukerTokenInfo, ) call.respond( @@ -187,102 +177,102 @@ fun Route.trygdetid( ) } } - } - } - - post("/oppdater-status") { - withBehandlingId(behandlingKlient, skrivetilgang = true) { behandlingId -> - val statusOppdatert = - trygdetidService.sjekkGyldighetOgOppdaterBehandlingStatus(behandlingId, brukerTokenInfo) - call.respond(HttpStatusCode.OK, StatusOppdatertDto(statusOppdatert)) - } - } - post("/kopier/{forrigeBehandlingId}") { - withBehandlingId(behandlingKlient, skrivetilgang = true) { - logger.info("Oppretter kopi av forrige trygdetider for behandling $behandlingId") - val forrigeBehandlingId = call.uuid("forrigeBehandlingId") - trygdetidService.kopierSisteTrygdetidberegninger(behandlingId, forrigeBehandlingId, brukerTokenInfo) - call.respond(HttpStatusCode.OK) + delete("/grunnlag/{trygdetidGrunnlagId}") { + withBehandlingId(behandlingKlient, skrivetilgang = true) { + withParam("trygdetidGrunnlagId") { trygdetidGrunnlagId -> + logger.info("Sletter trygdetidsgrunnlag for behandling $behandlingId") + trygdetidService.slettTrygdetidGrunnlagForTrygdetid( + behandlingId, + trygdetidId(), + trygdetidGrunnlagId, + brukerTokenInfo, + ) + call.respond( + trygdetidService + .hentTrygdetidIBehandlingMedId( + behandlingId, + trygdetidId(), + brukerTokenInfo, + )!! + .toDto(), + ) + } + } + } } - } - route("/migrering") { - post { - withBehandlingId(behandlingKlient, skrivetilgang = true) { - logger.info("Migrering overstyrer trygdetid for behandling $behandlingId") - val overstyringDto = call.receive() - trygdetidService.overstyrBeregnetTrygdetidForAvdoed( - behandlingId, - overstyringDto.ident, - overstyringDto.detaljertBeregnetTrygdetidResultat, - ) - call.respond( - trygdetidService - .hentTrygdetiderIBehandling(behandlingId, brukerTokenInfo) - .first { trygdetid -> trygdetid.ident == overstyringDto.ident } - .toDto(), - ) + post("/oppdater-status") { + withBehandlingId(behandlingKlient, skrivetilgang = true) { behandlingId -> + val statusOppdatert = + trygdetidService.sjekkGyldighetOgOppdaterBehandlingStatus(behandlingId, brukerTokenInfo) + call.respond(HttpStatusCode.OK, StatusOppdatertDto(statusOppdatert)) } } - post("/manuell/opprett") { + post("/kopier/{forrigeBehandlingId}") { withBehandlingId(behandlingKlient, skrivetilgang = true) { - val overskriv = call.request.queryParameters["overskriv"]?.toBoolean() ?: false - - logger.info("Oppretter trygdetid med overstyrt for behandling $behandlingId (overskriv: $overskriv)") - trygdetidService.opprettOverstyrtBeregnetTrygdetid(behandlingId, overskriv, brukerTokenInfo) + logger.info("Oppretter kopi av forrige trygdetider for behandling $behandlingId") + val forrigeBehandlingId = call.uuid("forrigeBehandlingId") + trygdetidService.kopierSisteTrygdetidberegninger(behandlingId, forrigeBehandlingId, brukerTokenInfo) call.respond(HttpStatusCode.OK) } } - route("/{$TRYGDETIDID_CALL_PARAMETER}") { - post("/manuell/lagre") { + route("/migrering") { + post { withBehandlingId(behandlingKlient, skrivetilgang = true) { - logger.info("Oppdaterer trygdetid med overstyrt for behandling $behandlingId") - val beregnetTrygdetid = call.receive() - - val eksisterendeTygdetid = - trygdetidService.hentTrygdetidIBehandlingMedId( - behandlingId, - trygdetidId(), - brukerTokenInfo, - ) ?: throw GenerellIkkeFunnetException() - - val trygdetid = - trygdetidService.overstyrBeregnetTrygdetidForAvdoed( - behandlingId, - eksisterendeTygdetid.ident, - beregnetTrygdetid, - ) - - behandlingKlient.settBehandlingStatusTrygdetidOppdatert(trygdetid.behandlingId, brukerTokenInfo) - + logger.info("Migrering overstyrer trygdetid for behandling $behandlingId") + val overstyringDto = call.receive() + trygdetidService.overstyrBeregnetTrygdetidForAvdoed( + behandlingId, + overstyringDto.ident, + overstyringDto.detaljertBeregnetTrygdetidResultat, + ) call.respond( trygdetidService - .hentTrygdetidIBehandlingMedId( - behandlingId, - trygdetidId(), - brukerTokenInfo, - )!! + .hentTrygdetiderIBehandling(behandlingId, brukerTokenInfo) + .first { trygdetid -> trygdetid.ident == overstyringDto.ident } .toDto(), ) } } - post("/uten_fremtidig") { + post("/manuell/opprett") { withBehandlingId(behandlingKlient, skrivetilgang = true) { - logger.info("Beregn trygdetid uten fremtidig trygdetid for behandling $behandlingId") + val overskriv = call.request.queryParameters["overskriv"]?.toBoolean() ?: false + + logger.info("Oppretter trygdetid med overstyrt for behandling $behandlingId (overskriv: $overskriv)") + trygdetidService.opprettOverstyrtBeregnetTrygdetid(behandlingId, overskriv, brukerTokenInfo) + call.respond(HttpStatusCode.OK) + } + } - val trygdetid = - trygdetidService.hentTrygdetidIBehandlingMedId(behandlingId, trygdetidId(), brukerTokenInfo) + route("/{$TRYGDETIDID_CALL_PARAMETER}") { + post("/manuell/lagre") { + withBehandlingId(behandlingKlient, skrivetilgang = true) { + logger.info("Oppdaterer trygdetid med overstyrt for behandling $behandlingId") + val beregnetTrygdetid = call.receive() - if (trygdetid != null) { - trygdetidService.reberegnUtenFremtidigTrygdetid( - behandlingId, - trygdetid.id, - brukerTokenInfo, + val eksisterendeTygdetid = + trygdetidService.hentTrygdetidIBehandlingMedId( + behandlingId, + trygdetidId(), + brukerTokenInfo, + ) ?: throw GenerellIkkeFunnetException() + + val trygdetid = + trygdetidService.overstyrBeregnetTrygdetidForAvdoed( + behandlingId, + eksisterendeTygdetid.ident, + beregnetTrygdetid, + ) + + behandlingKlient.settBehandlingStatusTrygdetidOppdatert( + trygdetid.behandlingId, + brukerTokenInfo ) + call.respond( trygdetidService .hentTrygdetidIBehandlingMedId( @@ -292,8 +282,38 @@ fun Route.trygdetid( )!! .toDto(), ) - } else { - call.respond(HttpStatusCode.NoContent) + } + } + + post("/uten_fremtidig") { + withBehandlingId(behandlingKlient, skrivetilgang = true) { + logger.info("Beregn trygdetid uten fremtidig trygdetid for behandling $behandlingId") + + val trygdetid = + trygdetidService.hentTrygdetidIBehandlingMedId( + behandlingId, + trygdetidId(), + brukerTokenInfo + ) + + if (trygdetid != null) { + trygdetidService.reberegnUtenFremtidigTrygdetid( + behandlingId, + trygdetid.id, + brukerTokenInfo, + ) + call.respond( + trygdetidService + .hentTrygdetidIBehandlingMedId( + behandlingId, + trygdetidId(), + brukerTokenInfo, + )!! + .toDto(), + ) + } else { + call.respond(HttpStatusCode.NoContent) + } } } } diff --git a/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/TrygdetidService.kt b/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/TrygdetidService.kt index 20230cfc531..46a266b86b5 100644 --- a/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/TrygdetidService.kt +++ b/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/TrygdetidService.kt @@ -17,6 +17,7 @@ import no.nav.etterlatte.libs.common.grunnlag.hentFoedselsdato import no.nav.etterlatte.libs.common.grunnlag.hentFoedselsnummer import no.nav.etterlatte.libs.common.objectMapper import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt +import no.nav.etterlatte.libs.common.tidspunkt.norskTidssone import no.nav.etterlatte.libs.common.toJsonNode import no.nav.etterlatte.libs.common.trygdetid.DetaljertBeregnetTrygdetidResultat import no.nav.etterlatte.libs.common.trygdetid.GrunnlagOpplysningerDto @@ -26,7 +27,11 @@ import no.nav.etterlatte.libs.common.trygdetid.land.LandNormalisert import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo import no.nav.etterlatte.trygdetid.klienter.BehandlingKlient import no.nav.etterlatte.trygdetid.klienter.GrunnlagKlient +import no.nav.etterlatte.trygdetid.klienter.PesysKlient +import no.nav.etterlatte.trygdetid.klienter.Trygdetidsgrunnlag +import no.nav.etterlatte.trygdetid.klienter.TrygdetidsgrunnlagUfoeretrygdOgAlderspensjon import org.slf4j.LoggerFactory +import java.time.Instant import java.time.LocalDate import java.time.temporal.TemporalAdjusters import java.util.UUID @@ -109,13 +114,57 @@ interface TrygdetidService { overskriv: Boolean, brukerTokenInfo: BrukerTokenInfo, ) + + suspend fun hentTrygdetidsgrunnlagUforeOgAlderspensjon( + fnr: String, + brukerTokenInfo: BrukerTokenInfo, + ): TrygdetidsperioderPesys } +data class TrygdetidsperioderPesys( + val ufoeretrygd: TrygdetidsPeriodeListe?, + val alderspensjon: TrygdetidsPeriodeListe?, +) + +fun TrygdetidsgrunnlagUfoeretrygdOgAlderspensjon.tilTrygdetidsperioder () = + TrygdetidsperioderPesys( + ufoeretrygd = TrygdetidsPeriodeListe(trygdetidUfoeretrygdpensjon?.trygdetidsgrunnlag?.trygdetidsgrunnlagListe?.map { it.tilTrygdetidsPeriode() }), + alderspensjon = TrygdetidsPeriodeListe(trygdetidAlderspensjon?.trygdetidsgrunnlag?.trygdetidsgrunnlagListe?.map { it.tilTrygdetidsPeriode() }) + ) + +data class TrygdetidsPeriodeListe( + val trygdetidsGrunnlagListe: List?, +) + +data class TrygdetidPeriodePesys( + val isoCode: String, // ISO 3166-1 alpha-3 code: + val fra: LocalDate, + val til: LocalDate, + val poengInnAar: Boolean?, + val poengUtAar: Boolean?, + val prorata: Boolean?, + val kilde: Grunnlagsopplysning.Kilde, +) + +fun Trygdetidsgrunnlag.tilTrygdetidsPeriode() = + TrygdetidPeriodePesys( + isoCode = land!!, + fra = toNorskLocalDate(fomDato.toInstant()), + til = toNorskLocalDate(fomDato.toInstant()), + poengInnAar = poengIInnAr, + poengUtAar = poengIUtAr, + prorata = ikkeProRata?.not(), + kilde = Grunnlagsopplysning.Pesys(Tidspunkt.now()) + ) + +fun toNorskLocalDate(instant: Instant): LocalDate = LocalDate.ofInstant(instant, norskTidssone) + class TrygdetidServiceImpl( private val trygdetidRepository: TrygdetidRepository, private val behandlingKlient: BehandlingKlient, private val grunnlagKlient: GrunnlagKlient, private val beregnTrygdetidService: TrygdetidBeregningService, + private val pesysKlient: PesysKlient ) : TrygdetidService { private val logger = LoggerFactory.getLogger(this::class.java) @@ -123,6 +172,8 @@ class TrygdetidServiceImpl( private const val SIST_FREMTIDIG_TRYGDETID_ALDER = 66L } + override suspend fun hentTrygdetidsgrunnlagUforeOgAlderspensjon(fnr: String, brukerTokenInfo: BrukerTokenInfo) = pesysKlient.hentTrygdetidsgrunnlag(fnr, brukerTokenInfo).tilTrygdetidsperioder() + override suspend fun hentTrygdetiderIBehandling( behandlingId: UUID, brukerTokenInfo: BrukerTokenInfo, diff --git a/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/config/ApplicationContext.kt b/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/config/ApplicationContext.kt index 7aa75f52959..e4beb3ee59f 100644 --- a/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/config/ApplicationContext.kt +++ b/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/config/ApplicationContext.kt @@ -13,6 +13,7 @@ import no.nav.etterlatte.trygdetid.avtale.AvtaleRepository import no.nav.etterlatte.trygdetid.avtale.AvtaleService import no.nav.etterlatte.trygdetid.klienter.BehandlingKlient import no.nav.etterlatte.trygdetid.klienter.GrunnlagKlient +import no.nav.etterlatte.trygdetid.klienter.PesysKlientImpl class ApplicationContext { val config: Config = ConfigFactory.load() @@ -31,6 +32,7 @@ class ApplicationContext { behandlingKlient = behandlingKlient, grunnlagKlient = grunnlagKlient, beregnTrygdetidService = TrygdetidBeregningService, + pesysKlient = PesysKlientImpl(config, httpClient()), ) private val avtaleRepository = AvtaleRepository(dataSource) val avtaleService = AvtaleService(avtaleRepository) diff --git a/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/klienter/BehandlingKlient.kt b/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/klienter/BehandlingKlient.kt index 8146d2a852c..016217290a4 100644 --- a/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/klienter/BehandlingKlient.kt +++ b/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/klienter/BehandlingKlient.kt @@ -9,11 +9,13 @@ import no.nav.etterlatte.libs.common.behandling.DetaljertBehandling import no.nav.etterlatte.libs.common.behandling.SisteIverksatteBehandling import no.nav.etterlatte.libs.common.deserialize import no.nav.etterlatte.libs.common.objectMapper +import no.nav.etterlatte.libs.common.person.Folkeregisteridentifikator import no.nav.etterlatte.libs.common.retry import no.nav.etterlatte.libs.ktor.ktor.ktorobo.AzureAdClient import no.nav.etterlatte.libs.ktor.ktor.ktorobo.DownstreamResourceClient import no.nav.etterlatte.libs.ktor.ktor.ktorobo.Resource import no.nav.etterlatte.libs.ktor.route.BehandlingTilgangsSjekk +import no.nav.etterlatte.libs.ktor.route.PersonTilgangsSjekk import no.nav.etterlatte.libs.ktor.route.Tilgangssjekker import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo import no.nav.etterlatte.libs.ktor.token.Saksbehandler @@ -28,7 +30,7 @@ class BehandlingKlientException( class BehandlingKlient( config: Config, httpClient: HttpClient, -) : BehandlingTilgangsSjekk { +) : BehandlingTilgangsSjekk, PersonTilgangsSjekk { private val logger = LoggerFactory.getLogger(this::class.java) private val tilgangssjekker = Tilgangssjekker(config, httpClient) @@ -43,6 +45,12 @@ class BehandlingKlient( bruker: Saksbehandler, ): Boolean = tilgangssjekker.harTilgangTilBehandling(behandlingId, skrivetilgang, bruker) + override suspend fun harTilgangTilPerson( + foedselsnummer: Folkeregisteridentifikator, + skrivetilgang: Boolean, + bruker: Saksbehandler + ): Boolean = tilgangssjekker.harTilgangTilPerson(foedselsnummer, skrivetilgang, bruker) + suspend fun kanOppdatereTrygdetid( behandlingId: UUID, brukerTokenInfo: BrukerTokenInfo, diff --git a/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/klienter/PesysKlient.kt b/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/klienter/PesysKlient.kt new file mode 100644 index 00000000000..179ef520a49 --- /dev/null +++ b/apps/etterlatte-trygdetid/src/main/kotlin/trygdetid/klienter/PesysKlient.kt @@ -0,0 +1,98 @@ +package no.nav.etterlatte.trygdetid.klienter + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.fasterxml.jackson.module.kotlin.readValue +import com.github.michaelbull.result.mapBoth +import com.typesafe.config.Config +import io.ktor.client.HttpClient +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope +import no.nav.etterlatte.libs.common.objectMapper +import no.nav.etterlatte.libs.common.person.maskerFnr +import no.nav.etterlatte.libs.ktor.ktor.ktorobo.AzureAdClient +import no.nav.etterlatte.libs.ktor.ktor.ktorobo.DownstreamResourceClient +import no.nav.etterlatte.libs.ktor.ktor.ktorobo.Resource +import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo +import org.slf4j.LoggerFactory +import java.time.LocalDate +import java.util.Date + +interface PesysKlient { + suspend fun hentTrygdetidsgrunnlag(fnr: String, brukerTokenInfo: BrukerTokenInfo): TrygdetidsgrunnlagUfoeretrygdOgAlderspensjon +} + +data class TrygdetidsgrunnlagRequest(val fnr: String, val dato: LocalDate) + +@JsonIgnoreProperties(ignoreUnknown = true) +data class Trygdetidsgrunnlag( + val land: String? = null, //ISO 3166-1 alpha-3 code + val fomDato: Date, + val tomDato: Date, + val poengIInnAr: Boolean? = null, + val poengIUtAr: Boolean? = null, + val ikkeProRata: Boolean? = null +) + +data class TrygdetidsgrunnlagListe( + val trygdetidsgrunnlagListe: List, +) + +data class SakIdTrygdetidsgrunnlagListePairResponse(val sakId: Long, val trygdetidsgrunnlag: TrygdetidsgrunnlagListe) + +data class TrygdetidsgrunnlagUfoeretrygdOgAlderspensjon( + val trygdetidUfoeretrygdpensjon: SakIdTrygdetidsgrunnlagListePairResponse?, + val trygdetidAlderspensjon: SakIdTrygdetidsgrunnlagListePairResponse? +) + +class PesysKlientImpl( + config: Config, + httpClient: HttpClient, +) : PesysKlient { + private val logger = LoggerFactory.getLogger(this::class.java) + private val azureAdClient = AzureAdClient(config) + private val downstreamResourceClient = DownstreamResourceClient(azureAdClient, httpClient) + + private val clientId = config.getString("pen.client.id") + private val resourceUrl = config.getString("pen.client.url") + + override suspend fun hentTrygdetidsgrunnlag(fnr: String, brukerTokenInfo: BrukerTokenInfo): TrygdetidsgrunnlagUfoeretrygdOgAlderspensjon { + logger.info("Henter trygdetidsgrunnlag(uføre og AP) for ${fnr.maskerFnr()} fra PEN") + + val (trygdetidUfoerepensjon, trygdetidAlderspensjon) = coroutineScope { + val ufoereTrygd = async { hentTrygdetidsgrunnlagListeForLopendeUforetrygd(fnr, brukerTokenInfo) } + val alderspensjon = async { hentTrygdetidslisteForLoependeAlderspensjon(fnr, brukerTokenInfo) } + + awaitAll(ufoereTrygd, alderspensjon) + } + return TrygdetidsgrunnlagUfoeretrygdOgAlderspensjon(trygdetidUfoerepensjon, trygdetidAlderspensjon) + } + + private suspend fun hentTrygdetidsgrunnlagListeForLopendeUforetrygd(fnr: String, brukerTokenInfo: BrukerTokenInfo): SakIdTrygdetidsgrunnlagListePairResponse? { + return downstreamResourceClient.post( + resource = Resource( + clientId = clientId, + url = "$resourceUrl/api/uforetrygd/grunnlag/trygdetidsgrunnlagListeForLopendeUforetrygd", + ), + brukerTokenInfo = brukerTokenInfo, + postBody = TrygdetidsgrunnlagRequest(fnr, LocalDate.now()) + ).mapBoth( + success = { resource -> objectMapper.readValue(resource.response.toString()) }, + failure = { errorResponse -> throw errorResponse }, + ) + } + + private suspend fun hentTrygdetidslisteForLoependeAlderspensjon(fnr: String, brukerTokenInfo: BrukerTokenInfo): SakIdTrygdetidsgrunnlagListePairResponse? { + return downstreamResourceClient.post( + resource = Resource( + clientId = clientId, + url = "$resourceUrl/api/alderspensjon/grunnlag/trygdetidsgrunnlagListeForLopendeAlderspensjon" + ), + brukerTokenInfo = brukerTokenInfo, + postBody = TrygdetidsgrunnlagRequest(fnr, LocalDate.now()) + ).mapBoth( + success = { resource -> objectMapper.readValue(resource.response.toString()) }, + failure = { errorResponse -> throw errorResponse }, + ) + } +} \ No newline at end of file diff --git a/apps/etterlatte-trygdetid/src/main/resources/application.conf b/apps/etterlatte-trygdetid/src/main/resources/application.conf index 0b385469248..44bb6a19506 100644 --- a/apps/etterlatte-trygdetid/src/main/resources/application.conf +++ b/apps/etterlatte-trygdetid/src/main/resources/application.conf @@ -20,4 +20,7 @@ grunnlag.resource.url = ${?ETTERLATTE_GRUNNLAG_URL} funksjonsbrytere.unleash.applicationName = ${?NAIS_APP_NAME} funksjonsbrytere.unleash.host = ${?UNLEASH_SERVER_API_URL} -funksjonsbrytere.unleash.token = ${?UNLEASH_SERVER_API_TOKEN} \ No newline at end of file +funksjonsbrytere.unleash.token = ${?UNLEASH_SERVER_API_TOKEN} + +pen.client.id = ${?PEN_CLIENT_ID} +pen.client.url = ${?PEN_URL} \ No newline at end of file diff --git a/apps/etterlatte-trygdetid/src/test/kotlin/no/nav/etterlatte/trygdetid/TrygdetidServiceIntegrationTest.kt b/apps/etterlatte-trygdetid/src/test/kotlin/no/nav/etterlatte/trygdetid/TrygdetidServiceIntegrationTest.kt index 9f107435250..1c98553524a 100644 --- a/apps/etterlatte-trygdetid/src/test/kotlin/no/nav/etterlatte/trygdetid/TrygdetidServiceIntegrationTest.kt +++ b/apps/etterlatte-trygdetid/src/test/kotlin/no/nav/etterlatte/trygdetid/TrygdetidServiceIntegrationTest.kt @@ -22,6 +22,7 @@ import no.nav.etterlatte.libs.testdata.grunnlag.GrunnlagTestData import no.nav.etterlatte.libs.testdata.grunnlag.kilde import no.nav.etterlatte.trygdetid.klienter.BehandlingKlient import no.nav.etterlatte.trygdetid.klienter.GrunnlagKlient +import no.nav.etterlatte.trygdetid.klienter.PesysKlient import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.Test @@ -59,6 +60,7 @@ internal class TrygdetidServiceIntegrationTest( mockk(), grunnlagKlient, TrygdetidBeregningService, + mockk() ) } diff --git a/apps/etterlatte-trygdetid/src/test/kotlin/no/nav/etterlatte/trygdetid/TrygdetidServiceTest.kt b/apps/etterlatte-trygdetid/src/test/kotlin/no/nav/etterlatte/trygdetid/TrygdetidServiceTest.kt index 04bbd9b5d1a..9a62d48ed4c 100644 --- a/apps/etterlatte-trygdetid/src/test/kotlin/no/nav/etterlatte/trygdetid/TrygdetidServiceTest.kt +++ b/apps/etterlatte-trygdetid/src/test/kotlin/no/nav/etterlatte/trygdetid/TrygdetidServiceTest.kt @@ -41,6 +41,7 @@ import no.nav.etterlatte.libs.testdata.grunnlag.GrunnlagTestData import no.nav.etterlatte.libs.testdata.grunnlag.eldreAvdoedTestopplysningerMap import no.nav.etterlatte.trygdetid.klienter.BehandlingKlient import no.nav.etterlatte.trygdetid.klienter.GrunnlagKlient +import no.nav.etterlatte.trygdetid.klienter.PesysKlient import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue @@ -62,6 +63,7 @@ internal class TrygdetidServiceTest { behandlingKlient, grunnlagKlient, beregningService, + mockk() ) @BeforeEach