Skip to content

Commit

Permalink
NAV-22361: Nytt endepunkt for å hente tilgangsstyrte journalposter (#…
Browse files Browse the repository at this point in the history
…1017)

* Setter opp integrasjon mot familie-baks-mottak

* Legger til Dokumenttype.KONTANTSTØTTE_VEDTAK_ENDRET i Dokumenttype.tilMetadata() etter oppdatering av familie-kontrakter

* Nytt endepunkt for å hente alle journalposter for bruker med tilgangsstyring

* Renamet MottakRestClient -> BaksMottakRestClient og MottakService -> BaksMottakService

* Fjerner integrasjon mot baks-mottak og henter søknad fra journalpost isteden

* Oppdatert familie-kontrakter versjon og gjort nødvendige endringer etter oppdatering

* Liten justering

* Justeringer etter tilbakemelding

* Erstatter assertNotNull og assertEquals med assertThat
  • Loading branch information
bragejahren authored Oct 23, 2024
1 parent 4a17c8f commit 3cfb7f6
Show file tree
Hide file tree
Showing 16 changed files with 766 additions and 8 deletions.
10 changes: 10 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,16 @@
<artifactId>felles</artifactId>
<version>${kontrakt.version}</version>
</dependency>
<dependency>
<groupId>no.nav.familie.kontrakter</groupId>
<artifactId>kontantstotte</artifactId>
<version>${kontrakt.version}</version>
</dependency>
<dependency>
<groupId>no.nav.familie.kontrakter</groupId>
<artifactId>barnetrygd</artifactId>
<version>${kontrakt.version}</version>
</dependency>

<!-- Logging -->
<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package no.nav.familie.integrasjoner.baks.søknad

import com.fasterxml.jackson.module.kotlin.readValue
import no.nav.familie.integrasjoner.client.rest.SafHentDokumentRestClient
import no.nav.familie.kontrakter.ba.søknad.VersjonertBarnetrygdSøknad
import no.nav.familie.kontrakter.felles.Tema
import no.nav.familie.kontrakter.felles.journalpost.Dokumentvariantformat
import no.nav.familie.kontrakter.felles.journalpost.Journalpost
import no.nav.familie.kontrakter.felles.objectMapper
import no.nav.familie.kontrakter.felles.søknad.BaksSøknadBase
import no.nav.familie.kontrakter.ks.søknad.VersjonertKontantstøtteSøknad
import org.springframework.stereotype.Service

@Service
class BaksVersjonertSøknadService(
private val safHentDokumentRestClient: SafHentDokumentRestClient,
) {
fun hentBaksSøknadBase(
journalpost: Journalpost,
tema: Tema,
): BaksSøknadBase =
when (tema) {
Tema.KON -> hentVersjonertKontantstøtteSøknad(journalpost).baksSøknadBase
Tema.BAR -> hentVersjonertBarnetrygdSøknad(journalpost).baksSøknadBase
else -> throw IllegalArgumentException("Støtter ikke deserialisering av søknad for tema $tema")
}

fun hentVersjonertBarnetrygdSøknad(
journalpost: Journalpost,
): VersjonertBarnetrygdSøknad = objectMapper.readValue<VersjonertBarnetrygdSøknad>(hentSøknadJson(journalpost, Tema.BAR))

fun hentVersjonertKontantstøtteSøknad(
journalpost: Journalpost,
): VersjonertKontantstøtteSøknad = objectMapper.readValue<VersjonertKontantstøtteSøknad>(hentSøknadJson(journalpost, Tema.KON))

private fun hentSøknadJson(
journalpost: Journalpost,
tema: Tema,
): String {
val dokumentInfoId = journalpost.dokumenter!!.single { it.erDigitalSøknad(tema) }.dokumentInfoId
return safHentDokumentRestClient.hentDokument(journalpostId = journalpost.journalpostId, dokumentInfoId = dokumentInfoId, variantFormat = Dokumentvariantformat.ORIGINAL.name).decodeToString()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,5 @@ fun Dokumenttype.tilMetadata(): Dokumentmetadata =
Dokumenttype.VEDTAKSBREV_BARNETILSYN -> BarnetilsynVedtaksbrevMetadata
Dokumenttype.VEDTAKSBREV_OVERGANGSSTØNAD -> OvergangsstønadVedtaksbrevMetadata
Dokumenttype.VEDTAKSBREV_SKOLEPENGER -> SkolepengerVedtaksbrevMetadata
Dokumenttype.KONTANTSTØTTE_VEDTAK_ENDRET -> KontantstøtteVedtakMetadata
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package no.nav.familie.integrasjoner.journalpost

import no.nav.familie.integrasjoner.baks.søknad.BaksVersjonertSøknadService
import no.nav.familie.integrasjoner.tilgangskontroll.TilgangskontrollService
import no.nav.familie.kontrakter.felles.Tema
import no.nav.familie.kontrakter.felles.journalpost.Journalpost
import no.nav.familie.kontrakter.felles.journalpost.TilgangsstyrtJournalpost
import no.nav.familie.kontrakter.felles.søknad.MissingVersionException
import no.nav.familie.kontrakter.felles.søknad.UnsupportedVersionException
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service

@Service
class BaksTilgangsstyrtJournalpostService(
private val baksVersjonertSøknadService: BaksVersjonertSøknadService,
private val tilgangskontrollService: TilgangskontrollService,
) {
fun mapTilTilgangsstyrteJournalposter(journalposter: List<Journalpost>): List<TilgangsstyrtJournalpost> =
journalposter.map { journalpost ->
TilgangsstyrtJournalpost(
journalpost = journalpost,
harTilgang = harTilgangTilJournalpost(journalpost = journalpost),
)
}

private fun harTilgangTilJournalpost(journalpost: Journalpost): Boolean {
val tema = journalpost.tema?.let { tema -> Tema.valueOf(tema) }
if (tema == null) {
return true
}
return if (journalpost.harDigitalSøknad(tema)) {
try {
val baksSøknadBase = baksVersjonertSøknadService.hentBaksSøknadBase(journalpost, tema)
tilgangskontrollService
.sjekkTilgangTilBrukere(
personIdenter = baksSøknadBase.personerISøknad(),
tema = tema,
).all { tilgang -> tilgang.harTilgang }
} catch (e: MissingVersionException) {
logger.warn("Får ikke sjekket tilgang til digital søknad tilknyttet journalpost ${journalpost.journalpostId}.")
secureLogger.warn("Feil ved deserialisering av digital søknad.", e)
// For gamle søknader, før 'kontraktVersjon' ble innført, har vi ingen måte å bestemme konkret klasse å deserialisere til.
// Gir tilgang basert på antagelsen om at fagsak relatert til gamle søknader allerede er satt til Vikafossen dersom det finnes kode 6, 7 eller 19 personer i søknad.
true
} catch (e: UnsupportedVersionException) {
logger.error("Får ikke sjekket tilgang til digital søknad tilknyttet journalpost ${journalpost.journalpostId}, da vi mangler støtte for kontraktversjon.")
secureLogger.error("Feil ved deserialisering av digital søknad.", e)
// Hindrer tilgang og logger Error da vi burde kunne deserialisere alle baks-søknader med feltet `kontraktVersjon`.
false
}
} else {
// Vi har kun mulighet til å sjekke tilganger for digitale søknader, da innholdet i papirsøknader er ukjent.
true
}
}

companion object {
private val logger = LoggerFactory.getLogger(BaksTilgangsstyrtJournalpostService::class.java)
private val secureLogger = LoggerFactory.getLogger("secureLogger")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import no.nav.familie.kontrakter.felles.Ressurs.Companion.failure
import no.nav.familie.kontrakter.felles.Ressurs.Companion.success
import no.nav.familie.kontrakter.felles.journalpost.Journalpost
import no.nav.familie.kontrakter.felles.journalpost.JournalposterForBrukerRequest
import no.nav.familie.kontrakter.felles.journalpost.TilgangsstyrtJournalpost
import no.nav.security.token.support.core.api.ProtectedWithClaims
import org.slf4j.LoggerFactory
import org.springframework.http.HttpStatus
Expand Down Expand Up @@ -82,6 +83,11 @@ class HentJournalpostController(
@RequestBody journalposterForBrukerRequest: JournalposterForBrukerRequest,
): ResponseEntity<Ressurs<List<Journalpost>>> = ResponseEntity.ok(success(journalpostService.finnJournalposter(journalposterForBrukerRequest), "OK"))

@PostMapping("tilgangsstyrt/baks")
fun hentTilgangsstyrteJournalposterForBruker(
@RequestBody journalposterForBrukerRequest: JournalposterForBrukerRequest,
): ResponseEntity<Ressurs<List<TilgangsstyrtJournalpost>>> = ResponseEntity.ok(success(journalpostService.finnTilgangsstyrteBaksJournalposter(journalposterForBrukerRequest), "OK"))

@PostMapping("temaer")
fun hentJournalpostForBrukerOgTema(
@RequestBody journalposterForVedleggRequest: JournalposterForVedleggRequest,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import no.nav.familie.integrasjoner.client.rest.SafRestClient
import no.nav.familie.integrasjoner.journalpost.internal.JournalposterForVedleggRequest
import no.nav.familie.kontrakter.felles.journalpost.Journalpost
import no.nav.familie.kontrakter.felles.journalpost.JournalposterForBrukerRequest
import no.nav.familie.kontrakter.felles.journalpost.TilgangsstyrtJournalpost
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service

Expand All @@ -14,11 +15,17 @@ class JournalpostService
constructor(
private val safRestClient: SafRestClient,
private val safHentDokumentRestClient: SafHentDokumentRestClient,
private val baksTilgangsstyrtJournalpostService: BaksTilgangsstyrtJournalpostService,
) {
fun hentJournalpost(journalpostId: String): Journalpost = safRestClient.hentJournalpost(journalpostId)

fun finnJournalposter(journalposterForBrukerRequest: JournalposterForBrukerRequest): List<Journalpost> = safRestClient.finnJournalposter(journalposterForBrukerRequest)

fun finnTilgangsstyrteBaksJournalposter(journalposterForBrukerRequest: JournalposterForBrukerRequest): List<TilgangsstyrtJournalpost> {
val journalposter = safRestClient.finnJournalposter(journalposterForBrukerRequest)
return baksTilgangsstyrtJournalpostService.mapTilTilgangsstyrteJournalposter(journalposter)
}

fun finnJournalposter(journalposterForVedleggRequest: JournalposterForVedleggRequest): List<Journalpost> = safRestClient.finnJournalposter(journalposterForVedleggRequest)

fun hentDokument(
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/application-preprod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -192,4 +192,4 @@ SKYGGE_SAK_URL: https://sak-q2.dev.intern.nav.no
NORG2_URL: https://norg2.dev.adeo.no/norg2/
REGOPPSLAG_URL: https://regoppslag.dev.intern.nav.no
SFTP_HOST: b27apvl00364.preprod.local
AXSYS_URL: https://axsys.dev.intern.nav.no/api
AXSYS_URL: https://axsys.dev.intern.nav.no/api
2 changes: 1 addition & 1 deletion src/main/resources/application-prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -184,4 +184,4 @@ OPPGAVE_URL: https://oppgave.nais.adeo.no
NORG2_URL: https://norg2.nais.adeo.no/norg2/
REGOPPSLAG_URL: https://regoppslag.intern.nav.no
SFTP_HOST: a01drvl099.adeo.no
AXSYS_URL: https://axsys.intern.nav.no/api
AXSYS_URL: https://axsys.intern.nav.no/api
182 changes: 182 additions & 0 deletions src/test/java/no/nav/familie/integrasjoner/baks/søknad/BaksSøknad.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
package no.nav.familie.integrasjoner.baks.søknad

import no.nav.familie.kontrakter.ba.søknad.v4.Søknadstype
import no.nav.familie.kontrakter.ba.søknad.v9.BarnetrygdSøknad
import no.nav.familie.kontrakter.felles.søknad.Søknadsfelt
import no.nav.familie.kontrakter.ks.søknad.v1.RegistrertBostedType
import no.nav.familie.kontrakter.ks.søknad.v1.SIVILSTANDTYPE
import no.nav.familie.kontrakter.ks.søknad.v1.SøknadAdresse
import no.nav.familie.kontrakter.ks.søknad.v5.KontantstøtteSøknad
import no.nav.familie.kontrakter.ba.søknad.v8.Barn as BarnetrygdBarn
import no.nav.familie.kontrakter.ba.søknad.v8.Søker as BarnetrygdSøker
import no.nav.familie.kontrakter.ks.søknad.v4.Barn as KontantstøtteBarn
import no.nav.familie.kontrakter.ks.søknad.v4.Søker as KontantstøtteSøker

fun lagKontantstøtteSøknad(
kerFnr: String,
barnFnr: String,
): KontantstøtteSøknad =
KontantstøtteSøknad(
kontraktVersjon = 5,
søker = lagKontantstøtteSøker(søkerFnr),
barn = listOf(lagKontantstøtteBarn(barnFnr)),
antallEøsSteg = 0,
dokumentasjon = emptyList(),
teksterTilPdf = emptyMap(),
originalSpråk = "NB",
finnesPersonMedAdressebeskyttelse = false,
erNoenAvBarnaFosterbarn = lagStringSøknadsfelt("Nei"),
søktAsylForBarn = lagStringSøknadsfelt("Nei"),
oppholderBarnSegIInstitusjon = lagStringSøknadsfelt("Nei"),
barnOppholdtSegTolvMndSammenhengendeINorge = lagStringSøknadsfelt("Ja"),
erBarnAdoptert = lagStringSøknadsfelt("Nei"),
mottarKontantstøtteForBarnFraAnnetEøsland = lagStringSøknadsfelt("Nei"),
harEllerTildeltBarnehageplass = lagStringSøknadsfelt("Nei"),
erAvdødPartnerForelder = null,
)

fun <T> lagStringSøknadsfelt(verdi: T): Søknadsfelt<T> =
Søknadsfelt(
label = mapOf("no" to ""),
verdi = mapOf("no" to verdi),
)

fun lagKontantstøtteSøker(fnr: String): KontantstøtteSøker =
KontantstøtteSøker(
harEøsSteg = false,
ident = lagStringSøknadsfelt(fnr),
navn = lagStringSøknadsfelt("Navn"),
statsborgerskap = lagStringSøknadsfelt(listOf("Norge")),
adresse =
lagStringSøknadsfelt(
SøknadAdresse(
adressenavn = "Gate",
postnummer = null,
husbokstav = null,
bruksenhetsnummer = null,
husnummer = null,
poststed = null,
),
),
adressebeskyttelse = false,
sivilstand = lagStringSøknadsfelt(SIVILSTANDTYPE.UOPPGITT),
borPåRegistrertAdresse = null,
værtINorgeITolvMåneder = lagStringSøknadsfelt("Ja"),
planleggerÅBoINorgeTolvMnd = lagStringSøknadsfelt("Ja"),
yrkesaktivFemÅr = lagStringSøknadsfelt("Ja"),
erAsylsøker = lagStringSøknadsfelt("Nei"),
utenlandsoppholdUtenArbeid = lagStringSøknadsfelt("Nei"),
utenlandsperioder = emptyList(),
arbeidIUtlandet = lagStringSøknadsfelt("Nei"),
arbeidsperioderUtland = emptyList(),
mottarUtenlandspensjon = lagStringSøknadsfelt("Nei"),
pensjonsperioderUtland = emptyList(),
arbeidINorge = lagStringSøknadsfelt("Nei"),
arbeidsperioderNorge = emptyList(),
pensjonNorge = lagStringSøknadsfelt("Nei"),
pensjonsperioderNorge = emptyList(),
andreUtbetalingsperioder = emptyList(),
idNummer = emptyList(),
andreUtbetalinger = null,
adresseISøkeperiode = null,
)

fun lagKontantstøtteBarn(fnr: String): KontantstøtteBarn =
KontantstøtteBarn(
harEøsSteg = false,
ident = lagStringSøknadsfelt(fnr),
navn = lagStringSøknadsfelt(""),
registrertBostedType = lagStringSøknadsfelt(RegistrertBostedType.REGISTRERT_SOKERS_ADRESSE),
alder = null,
teksterTilPdf = emptyMap(),
erFosterbarn = lagStringSøknadsfelt("Nei"),
oppholderSegIInstitusjon = lagStringSøknadsfelt("Nei"),
erAdoptert = lagStringSøknadsfelt("Nei"),
erAsylsøker = lagStringSøknadsfelt("Nei"),
boddMindreEnn12MndINorge = lagStringSøknadsfelt("Nei"),
kontantstøtteFraAnnetEøsland = lagStringSøknadsfelt("Nei"),
harBarnehageplass = lagStringSøknadsfelt("Nei"),
andreForelderErDød = null,
utbetaltForeldrepengerEllerEngangsstønad = null,
mottarEllerMottokEøsKontantstøtte = null,
pågåendeSøknadFraAnnetEøsLand = null,
pågåendeSøknadHvilketLand = null,
planleggerÅBoINorge12Mnd = null,
eøsKontantstøttePerioder = emptyList(),
barnehageplassPerioder = emptyList(),
borFastMedSøker = lagStringSøknadsfelt("Ja"),
foreldreBorSammen = null,
søkerDeltKontantstøtte = null,
andreForelder = null,
utenlandsperioder = emptyList(),
søkersSlektsforhold = null,
søkersSlektsforholdSpesifisering = null,
borMedAndreForelder = null,
borMedOmsorgsperson = null,
adresse = null,
omsorgsperson = null,
idNummer = emptyList(),
)

fun lagBarnetrygdSøknad(
kerFnr: String,
barnFnr: String,
): BarnetrygdSøknad =
BarnetrygdSøknad(
kontraktVersjon = 9,
søker = lagBarnetrygdSøker(søkerFnr),
barn = listOf(lagBarnetrygdBarn(barnFnr)),
antallEøsSteg = 0,
dokumentasjon = emptyList(),
originalSpråk = "NB",
finnesPersonMedAdressebeskyttelse = false,
søknadstype = Søknadstype.ORDINÆR,
spørsmål = emptyMap(),
teksterUtenomSpørsmål = emptyMap(),
)

fun lagBarnetrygdSøker(fnr: String): BarnetrygdSøker =
BarnetrygdSøker(
harEøsSteg = false,
ident = lagStringSøknadsfelt(fnr),
navn = lagStringSøknadsfelt("Navn"),
statsborgerskap = lagStringSøknadsfelt(listOf("Norge")),
adresse =
lagStringSøknadsfelt(
no.nav.familie.kontrakter.ba.søknad.v1.SøknadAdresse(
adressenavn = "Gate",
postnummer = null,
husbokstav = null,
bruksenhetsnummer = null,
husnummer = null,
poststed = null,
),
),
adressebeskyttelse = false,
sivilstand = lagStringSøknadsfelt(no.nav.familie.kontrakter.ba.søknad.v1.SIVILSTANDTYPE.UOPPGITT),
utenlandsperioder = emptyList(),
arbeidsperioderUtland = emptyList(),
pensjonsperioderUtland = emptyList(),
arbeidsperioderNorge = emptyList(),
pensjonsperioderNorge = emptyList(),
andreUtbetalingsperioder = emptyList(),
idNummer = emptyList(),
spørsmål = emptyMap(),
nåværendeSamboer = null,
tidligereSamboere = emptyList(),
)

fun lagBarnetrygdBarn(fnr: String): BarnetrygdBarn =
BarnetrygdBarn(
harEøsSteg = false,
ident = lagStringSøknadsfelt(fnr),
navn = lagStringSøknadsfelt(""),
registrertBostedType = lagStringSøknadsfelt(no.nav.familie.kontrakter.ba.søknad.v5.RegistrertBostedType.REGISTRERT_SOKERS_ADRESSE),
alder = null,
andreForelder = null,
utenlandsperioder = emptyList(),
omsorgsperson = null,
idNummer = emptyList(),
spørsmål = emptyMap(),
eøsBarnetrygdsperioder = emptyList(),
)
Loading

0 comments on commit 3cfb7f6

Please sign in to comment.