diff --git a/pom.xml b/pom.xml index 5f7d8661..c932bb04 100644 --- a/pom.xml +++ b/pom.xml @@ -144,6 +144,16 @@ felles ${kontrakt.version} + + no.nav.familie.kontrakter + kontantstotte + ${kontrakt.version} + + + no.nav.familie.kontrakter + barnetrygd + ${kontrakt.version} + diff --git "a/src/main/java/no/nav/familie/integrasjoner/baks/s\303\270knad/BaksVersjonertS\303\270knadService.kt" "b/src/main/java/no/nav/familie/integrasjoner/baks/s\303\270knad/BaksVersjonertS\303\270knadService.kt" new file mode 100644 index 00000000..234a00e4 --- /dev/null +++ "b/src/main/java/no/nav/familie/integrasjoner/baks/s\303\270knad/BaksVersjonertS\303\270knadService.kt" @@ -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(hentSøknadJson(journalpost, Tema.BAR)) + + fun hentVersjonertKontantstøtteSøknad( + journalpost: Journalpost, + ): VersjonertKontantstøtteSøknad = objectMapper.readValue(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() + } +} diff --git a/src/main/java/no/nav/familie/integrasjoner/dokarkiv/metadata/Dokumentmetadata.kt b/src/main/java/no/nav/familie/integrasjoner/dokarkiv/metadata/Dokumentmetadata.kt index 93dc1d37..fcf9d2ac 100644 --- a/src/main/java/no/nav/familie/integrasjoner/dokarkiv/metadata/Dokumentmetadata.kt +++ b/src/main/java/no/nav/familie/integrasjoner/dokarkiv/metadata/Dokumentmetadata.kt @@ -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 } diff --git a/src/main/java/no/nav/familie/integrasjoner/journalpost/BaksTilgangsstyrtJournalpostService.kt b/src/main/java/no/nav/familie/integrasjoner/journalpost/BaksTilgangsstyrtJournalpostService.kt new file mode 100644 index 00000000..0beed49c --- /dev/null +++ b/src/main/java/no/nav/familie/integrasjoner/journalpost/BaksTilgangsstyrtJournalpostService.kt @@ -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): List = + 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") + } +} diff --git a/src/main/java/no/nav/familie/integrasjoner/journalpost/HentJournalpostController.kt b/src/main/java/no/nav/familie/integrasjoner/journalpost/HentJournalpostController.kt index a1092e2e..aef74a0b 100644 --- a/src/main/java/no/nav/familie/integrasjoner/journalpost/HentJournalpostController.kt +++ b/src/main/java/no/nav/familie/integrasjoner/journalpost/HentJournalpostController.kt @@ -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 @@ -82,6 +83,11 @@ class HentJournalpostController( @RequestBody journalposterForBrukerRequest: JournalposterForBrukerRequest, ): ResponseEntity>> = ResponseEntity.ok(success(journalpostService.finnJournalposter(journalposterForBrukerRequest), "OK")) + @PostMapping("tilgangsstyrt/baks") + fun hentTilgangsstyrteJournalposterForBruker( + @RequestBody journalposterForBrukerRequest: JournalposterForBrukerRequest, + ): ResponseEntity>> = ResponseEntity.ok(success(journalpostService.finnTilgangsstyrteBaksJournalposter(journalposterForBrukerRequest), "OK")) + @PostMapping("temaer") fun hentJournalpostForBrukerOgTema( @RequestBody journalposterForVedleggRequest: JournalposterForVedleggRequest, diff --git a/src/main/java/no/nav/familie/integrasjoner/journalpost/JournalpostService.kt b/src/main/java/no/nav/familie/integrasjoner/journalpost/JournalpostService.kt index 97abbf50..dc3f929e 100644 --- a/src/main/java/no/nav/familie/integrasjoner/journalpost/JournalpostService.kt +++ b/src/main/java/no/nav/familie/integrasjoner/journalpost/JournalpostService.kt @@ -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 @@ -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 = safRestClient.finnJournalposter(journalposterForBrukerRequest) + fun finnTilgangsstyrteBaksJournalposter(journalposterForBrukerRequest: JournalposterForBrukerRequest): List { + val journalposter = safRestClient.finnJournalposter(journalposterForBrukerRequest) + return baksTilgangsstyrtJournalpostService.mapTilTilgangsstyrteJournalposter(journalposter) + } + fun finnJournalposter(journalposterForVedleggRequest: JournalposterForVedleggRequest): List = safRestClient.finnJournalposter(journalposterForVedleggRequest) fun hentDokument( diff --git a/src/main/resources/application-preprod.yaml b/src/main/resources/application-preprod.yaml index 23fe633d..77fcce04 100755 --- a/src/main/resources/application-preprod.yaml +++ b/src/main/resources/application-preprod.yaml @@ -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 \ No newline at end of file diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml index f3cd3949..3bfa9d1e 100755 --- a/src/main/resources/application-prod.yaml +++ b/src/main/resources/application-prod.yaml @@ -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 \ No newline at end of file diff --git "a/src/test/java/no/nav/familie/integrasjoner/baks/s\303\270knad/BaksS\303\270knad.kt" "b/src/test/java/no/nav/familie/integrasjoner/baks/s\303\270knad/BaksS\303\270knad.kt" new file mode 100644 index 00000000..380bfb1b --- /dev/null +++ "b/src/test/java/no/nav/familie/integrasjoner/baks/s\303\270knad/BaksS\303\270knad.kt" @@ -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( + sø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 lagStringSøknadsfelt(verdi: T): Søknadsfelt = + 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( + sø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(), + ) diff --git "a/src/test/java/no/nav/familie/integrasjoner/baks/s\303\270knad/BaksVersjonertS\303\270knadServiceTest.kt" "b/src/test/java/no/nav/familie/integrasjoner/baks/s\303\270knad/BaksVersjonertS\303\270knadServiceTest.kt" new file mode 100644 index 00000000..88a0bd7b --- /dev/null +++ "b/src/test/java/no/nav/familie/integrasjoner/baks/s\303\270knad/BaksVersjonertS\303\270knadServiceTest.kt" @@ -0,0 +1,86 @@ +package no.nav.familie.integrasjoner.baks.søknad + +import io.mockk.every +import io.mockk.mockk +import no.nav.familie.integrasjoner.client.rest.SafHentDokumentRestClient +import no.nav.familie.kontrakter.felles.Tema +import no.nav.familie.kontrakter.felles.journalpost.DokumentInfo +import no.nav.familie.kontrakter.felles.journalpost.Dokumentvariantformat +import no.nav.familie.kontrakter.felles.journalpost.Journalpost +import no.nav.familie.kontrakter.felles.objectMapper +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows + +class BaksVersjonertSøknadServiceTest { + private val safHentDokumentRestClient: SafHentDokumentRestClient = mockk() + private val baksVersjonertSøknadService: BaksVersjonertSøknadService = + BaksVersjonertSøknadService( + safHentDokumentRestClient = safHentDokumentRestClient, + ) + + @Nested + inner class HentBaksSøknadBase { + @Test + fun `skal hente journalpost og deserialisere tilknyttet KontantstøtteSøknad når tema er KON`() { + // Arrange + val journalpost = mockk() + val dokumentInfo = mockk() + + every { journalpost.journalpostId } returns "1" + every { journalpost.dokumenter } returns listOf(dokumentInfo) + every { dokumentInfo.dokumentInfoId } returns "1" + every { dokumentInfo.erDigitalSøknad(any()) } returns true + + val søkerFnr = "12345678910" + val barnFnr = "12345678911" + + val kontantstøtteSøknad = lagKontantstøtteSøknad(søkerFnr = søkerFnr, barnFnr = barnFnr) + + every { safHentDokumentRestClient.hentDokument("1", "1", Dokumentvariantformat.ORIGINAL.name) } returns objectMapper.writeValueAsBytes(kontantstøtteSøknad) + + // Act + val baksSøknadBase = baksVersjonertSøknadService.hentBaksSøknadBase(journalpost, Tema.KON) + + // Assert + assertThat(baksSøknadBase).isNotNull + assertThat(baksSøknadBase.kontraktVersjon).isEqualTo(5) + assertThat(baksSøknadBase.personerISøknad()).isEqualTo(listOf(søkerFnr, barnFnr)) + } + + @Test + fun `skal hente journalpost og deserialisere tilknyttet BarnetrygdSøknad når tema er BAR`() { + // Arrange + val journalpost = mockk() + val dokumentInfo = mockk() + + every { journalpost.journalpostId } returns "1" + every { journalpost.dokumenter } returns listOf(dokumentInfo) + every { dokumentInfo.dokumentInfoId } returns "1" + every { dokumentInfo.erDigitalSøknad(any()) } returns true + + val søkerFnr = "12345678910" + val barnFnr = "12345678911" + + val barnetrygdSøknad = lagBarnetrygdSøknad(søkerFnr = søkerFnr, barnFnr = barnFnr) + + every { safHentDokumentRestClient.hentDokument("1", "1", Dokumentvariantformat.ORIGINAL.name) } returns objectMapper.writeValueAsBytes(barnetrygdSøknad) + + // Act + val baksSøknadBase = baksVersjonertSøknadService.hentBaksSøknadBase(journalpost, Tema.BAR) + + // Assert + assertThat(baksSøknadBase).isNotNull + assertThat(baksSøknadBase.kontraktVersjon).isEqualTo(9) + assertThat(baksSøknadBase.personerISøknad()).isEqualTo(listOf(søkerFnr, barnFnr)) + } + + @Test + fun`skal kaste feil dersom tema ikke er BAR eller KON`() { + // Act & Assert + val exception = assertThrows { baksVersjonertSøknadService.hentBaksSøknadBase(mockk(), Tema.ENF) } + assertThat(exception.message).isEqualTo("Støtter ikke deserialisering av søknad for tema ${Tema.ENF.name}") + } + } +} diff --git a/src/test/java/no/nav/familie/integrasjoner/egenansatt/EgenAnsattTestConfig.kt b/src/test/java/no/nav/familie/integrasjoner/egenansatt/EgenAnsattTestConfig.kt index 6e9eafc2..d20ebbcb 100755 --- a/src/test/java/no/nav/familie/integrasjoner/egenansatt/EgenAnsattTestConfig.kt +++ b/src/test/java/no/nav/familie/integrasjoner/egenansatt/EgenAnsattTestConfig.kt @@ -18,4 +18,13 @@ class EgenAnsattTestConfig { every { egenAnsattClient.erEgenAnsatt(any()) } returns true return egenAnsattClient } + + @Bean + @Profile("mock-egenansatt-false") + @Primary + fun egenAnssattClientMockDefaultFalse(): EgenAnsattRestClient { + val egenAnsattClient: EgenAnsattRestClient = mockk(relaxed = true) + every { egenAnsattClient.erEgenAnsatt(any()) } returns false + return egenAnsattClient + } } diff --git a/src/test/java/no/nav/familie/integrasjoner/journalpost/BaksTilgangsstyrtJournalpostServiceTest.kt b/src/test/java/no/nav/familie/integrasjoner/journalpost/BaksTilgangsstyrtJournalpostServiceTest.kt new file mode 100644 index 00000000..f584170d --- /dev/null +++ b/src/test/java/no/nav/familie/integrasjoner/journalpost/BaksTilgangsstyrtJournalpostServiceTest.kt @@ -0,0 +1,163 @@ +package no.nav.familie.integrasjoner.journalpost + +import io.mockk.every +import io.mockk.mockk +import no.nav.familie.integrasjoner.baks.søknad.BaksVersjonertSøknadService +import no.nav.familie.integrasjoner.baks.søknad.lagKontantstøtteSøknad +import no.nav.familie.integrasjoner.tilgangskontroll.TilgangskontrollService +import no.nav.familie.kontrakter.felles.Tema +import no.nav.familie.kontrakter.felles.journalpost.DokumentInfo +import no.nav.familie.kontrakter.felles.journalpost.Journalpost +import no.nav.familie.kontrakter.felles.søknad.MissingVersionException +import no.nav.familie.kontrakter.felles.søknad.UnsupportedVersionException +import no.nav.familie.kontrakter.felles.tilgangskontroll.Tilgang +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test + +class BaksTilgangsstyrtJournalpostServiceTest { + private val baksVersjonertSøknadService: BaksVersjonertSøknadService = mockk() + private val tilgangskontrollService: TilgangskontrollService = mockk() + + private val baksTilgangsstyrtJournalpostService: BaksTilgangsstyrtJournalpostService = + BaksTilgangsstyrtJournalpostService( + baksVersjonertSøknadService = baksVersjonertSøknadService, + tilgangskontrollService = tilgangskontrollService, + ) + + @Test + fun `skal mappe om liste av Journalpost til liste av TilgangsstyrtJournalpost med harTilgang satt til true dersom digital søknad og saksbehandler har tilgang til personer i søknad`() { + // Arrange + val journalpost1 = mockk() + val dokumentInfo = mockk() + + every { journalpost1.journalpostId } returns "1" + every { journalpost1.tema } returns Tema.KON.name + every { journalpost1.harDigitalSøknad(any()) } returns true + every { journalpost1.dokumenter } returns listOf(dokumentInfo) + every { dokumentInfo.dokumentInfoId } returns "1" + every { dokumentInfo.erDigitalSøknad(any()) } returns true + + val søkerFnr = "12345678910" + val barnFnr = "12345678911" + + val kontantstøtteSøknad = lagKontantstøtteSøknad(søkerFnr, barnFnr) + + every { baksVersjonertSøknadService.hentBaksSøknadBase(any(), any()) } returns kontantstøtteSøknad + every { tilgangskontrollService.sjekkTilgangTilBrukere(any(), any()) } returns listOf(Tilgang(søkerFnr, true), Tilgang(barnFnr, true)) + + // Act + val tilgangsstyrteJournalposter = baksTilgangsstyrtJournalpostService.mapTilTilgangsstyrteJournalposter(listOf(journalpost1)) + + // Assert + assertThat(tilgangsstyrteJournalposter).hasSize(1) + val tilgangsstyrtJournalpost = tilgangsstyrteJournalposter.find { it.journalpost.journalpostId == journalpost1.journalpostId && it.harTilgang } + assertThat(tilgangsstyrtJournalpost).isNotNull + } + + @Test + fun `skal mappe om liste av Journalpost til liste av TilgangsstyrtJournalpost med harTilgang satt til false dersom digital søknad og saksbehandler ikke har tilgang til personer i søknad`() { + // Arrange + val journalpost1 = mockk() + val dokumentInfo = mockk() + + every { journalpost1.journalpostId } returns "1" + every { journalpost1.tema } returns Tema.KON.name + every { journalpost1.harDigitalSøknad(any()) } returns true + every { journalpost1.dokumenter } returns listOf(dokumentInfo) + every { dokumentInfo.dokumentInfoId } returns "1" + every { dokumentInfo.erDigitalSøknad(any()) } returns true + + val søkerFnr = "12345678910" + val barnFnr = "12345678911" + + val kontantstøtteSøknad = lagKontantstøtteSøknad(søkerFnr, barnFnr) + + every { baksVersjonertSøknadService.hentBaksSøknadBase(any(), any()) } returns kontantstøtteSøknad + every { tilgangskontrollService.sjekkTilgangTilBrukere(any(), any()) } returns listOf(Tilgang(søkerFnr, false), Tilgang(barnFnr, false)) + + // Act + val tilgangsstyrteJournalposter = baksTilgangsstyrtJournalpostService.mapTilTilgangsstyrteJournalposter(listOf(journalpost1)) + + // Assert + assertThat(tilgangsstyrteJournalposter).hasSize(1) + val tilgangsstyrtJournalpost = tilgangsstyrteJournalposter.find { it.journalpost.journalpostId == journalpost1.journalpostId && !it.harTilgang } + assertThat(tilgangsstyrtJournalpost).isNotNull + } + + @Test + fun `skal mappe om liste av Journalpost til liste av TilgangsstyrtJournalpost med harTilgang satt til true dersom ikke digital søknad`() { + // Arrange + val journalpost = mockk() + + every { journalpost.journalpostId } returns "1" + every { journalpost.tema } returns Tema.BAR.name + every { journalpost.harDigitalSøknad(any()) } returns false + + // Act + val tilgangsstyrteJournalposter = baksTilgangsstyrtJournalpostService.mapTilTilgangsstyrteJournalposter(listOf(journalpost)) + + // Assert + assertThat(tilgangsstyrteJournalposter).hasSize(1) + val tilgangsstyrtJournalpost = tilgangsstyrteJournalposter.find { it.journalpost.journalpostId == journalpost.journalpostId && it.harTilgang } + assertThat(tilgangsstyrtJournalpost).isNotNull + } + + @Test + fun `skal mappe om liste av Journalpost til liste av TilgangsstyrtJournalpost med harTilgang satt til true dersom tema ikke er satt`() { + // Arrange + val journalpost = mockk() + + every { journalpost.journalpostId } returns "1" + every { journalpost.tema } returns null + + // Act + val tilgangsstyrteJournalposter = baksTilgangsstyrtJournalpostService.mapTilTilgangsstyrteJournalposter(listOf(journalpost)) + + // Assert + assertThat(tilgangsstyrteJournalposter).hasSize(1) + val tilgangsstyrtJournalpost = tilgangsstyrteJournalposter.find { it.journalpost.journalpostId == journalpost.journalpostId && it.harTilgang } + assertThat(tilgangsstyrtJournalpost).isNotNull + } + + @Test + fun `skal mappe om liste av Journalpost til liste av TilgangsstyrtJournalpost med harTilgang satt til true dersom digital søknad og feilen UnsupportedVersionException kastes ved deserialisering`() { + // Arrange + val journalpost = mockk() + val dokumentInfo = mockk() + + every { journalpost.journalpostId } returns "1" + every { journalpost.tema } returns Tema.KON.name + every { journalpost.harDigitalSøknad(any()) } returns true + every { journalpost.dokumenter } returns listOf(dokumentInfo) + + every { baksVersjonertSøknadService.hentBaksSøknadBase(any(), any()) } throws MissingVersionException("JSON-String inneholder ikke feltet 'kontraktVersjon'") + // Act + val tilgangsstyrteJournalposter = baksTilgangsstyrtJournalpostService.mapTilTilgangsstyrteJournalposter(listOf(journalpost)) + + // Assert + assertThat(tilgangsstyrteJournalposter).hasSize(1) + val tilgangsstyrtJournalpost = tilgangsstyrteJournalposter.find { it.journalpost.journalpostId == journalpost.journalpostId && it.harTilgang } + assertThat(tilgangsstyrtJournalpost).isNotNull + } + + @Test + fun `skal mappe om liste av Journalpost til liste av TilgangsstyrtJournalpost med harTilgang satt til false dersom digital søknad og feilen MissingVersionImplementationException kastes ved deserialisering`() { + // Arrange + val journalpost = mockk() + val dokumentInfo = mockk() + + every { journalpost.journalpostId } returns "1" + every { journalpost.tema } returns Tema.KON.name + every { journalpost.harDigitalSøknad(any()) } returns true + every { journalpost.dokumenter } returns listOf(dokumentInfo) + + every { baksVersjonertSøknadService.hentBaksSøknadBase(any(), any()) } throws UnsupportedVersionException("Har ikke implementert støtte for deserialisering av søknadsversjonen") + // Act + val tilgangsstyrteJournalposter = baksTilgangsstyrtJournalpostService.mapTilTilgangsstyrteJournalposter(listOf(journalpost)) + + // Assert + assertThat(tilgangsstyrteJournalposter).hasSize(1) + val tilgangsstyrtJournalpost = tilgangsstyrteJournalposter.find { it.journalpost.journalpostId == journalpost.journalpostId && !it.harTilgang } + assertThat(tilgangsstyrtJournalpost).isNotNull + } +} diff --git a/src/test/java/no/nav/familie/integrasjoner/journalpost/HentJournalpostControllerTest.kt b/src/test/java/no/nav/familie/integrasjoner/journalpost/HentJournalpostControllerTest.kt index fd30b8c5..720c091f 100644 --- a/src/test/java/no/nav/familie/integrasjoner/journalpost/HentJournalpostControllerTest.kt +++ b/src/test/java/no/nav/familie/integrasjoner/journalpost/HentJournalpostControllerTest.kt @@ -2,10 +2,13 @@ package no.nav.familie.integrasjoner.journalpost import ch.qos.logback.classic.Logger import no.nav.familie.integrasjoner.OppslagSpringRunnerTest +import no.nav.familie.integrasjoner.baks.søknad.lagBarnetrygdSøknad import no.nav.familie.integrasjoner.felles.graphqlCompatible import no.nav.familie.integrasjoner.felles.graphqlQuery import no.nav.familie.integrasjoner.journalpost.internal.SafJournalpostRequest import no.nav.familie.integrasjoner.journalpost.internal.SafRequestForBruker +import no.nav.familie.integrasjoner.personopplysning.internal.PdlPersonRequest +import no.nav.familie.integrasjoner.personopplysning.internal.PdlPersonRequestVariables import no.nav.familie.kontrakter.felles.BrukerIdType import no.nav.familie.kontrakter.felles.Ressurs import no.nav.familie.kontrakter.felles.Tema @@ -14,6 +17,7 @@ import no.nav.familie.kontrakter.felles.journalpost.Journalpost import no.nav.familie.kontrakter.felles.journalpost.JournalposterForBrukerRequest import no.nav.familie.kontrakter.felles.journalpost.Journalposttype import no.nav.familie.kontrakter.felles.journalpost.Journalstatus +import no.nav.familie.kontrakter.felles.journalpost.TilgangsstyrtJournalpost import no.nav.familie.kontrakter.felles.journalpost.Utsendingsmåte import no.nav.familie.kontrakter.felles.journalpost.VarselType import no.nav.familie.kontrakter.felles.objectMapper @@ -40,7 +44,7 @@ import org.springframework.test.context.ActiveProfiles import org.springframework.web.util.UriComponentsBuilder import java.time.LocalDateTime -@ActiveProfiles("integrasjonstest", "mock-sts", "mock-oauth") +@ActiveProfiles("integrasjonstest", "mock-sts", "mock-oauth", "mock-egenansatt-false") @ExtendWith(MockServerExtension::class) @MockServerSettings(ports = [OppslagSpringRunnerTest.MOCK_SERVER_PORT]) class HentJournalpostControllerTest( @@ -50,6 +54,7 @@ class HentJournalpostControllerTest( private lateinit var uriHentSaksnummer: String private lateinit var uriHentJournalpost: String + private lateinit var uriHentTilgangsstyrtJournalpost: String private lateinit var uriHentDokument: String @BeforeEach @@ -67,6 +72,11 @@ class HentJournalpostControllerTest( .fromHttpUrl(localhost(JOURNALPOST_BASE_URL)) .queryParam("journalpostId", JOURNALPOST_ID) .toUriString() + uriHentTilgangsstyrtJournalpost = + UriComponentsBuilder + .fromHttpUrl(localhost(JOURNALPOST_BASE_URL) + "/tilgangsstyrt/baks") + .queryParam("journalpostId", JOURNALPOST_ID) + .toUriString() uriHentDokument = localhost(JOURNALPOST_BASE_URL) + "/hentdokument/$JOURNALPOST_ID/$DOKUMENTINFO_ID" } @@ -81,7 +91,7 @@ class HentJournalpostControllerTest( .withBody(gyldigJournalPostIdRequest()), ).respond( response() - .withBody(json(lesFil("gyldigjournalpostresponse.json"))) + .withBody(json(lesFil("saf/gyldigjournalpostresponse.json"))) .withHeaders(Header("Content-Type", "application/json")), ) @@ -108,7 +118,7 @@ class HentJournalpostControllerTest( .withMethod("POST") .withPath("/rest/saf/graphql") .withBody(objectMapper.writeValueAsString(gyldigBrukerRequest())), - ).respond(response().withBody(json(lesFil("gyldigJournalposterResponse.json")))) + ).respond(response().withBody(json(lesFil("saf/gyldigJournalposterResponse.json")))) val response: ResponseEntity>> = restTemplate.exchange( @@ -159,6 +169,84 @@ class HentJournalpostControllerTest( assertThat(utsendingsinfo.varselSendt.first().type).isEqualTo(VarselType.SMS) } + @Test + fun `hentTilgangsstyrteJournalposterForBruker skal returnere tilgangsstyrte journalposter og status ok`() { + val barnetrygdSøknad = lagBarnetrygdSøknad("12345678910", "12345678911") + client + .`when`( + HttpRequest + .request() + .withMethod("POST") + .withPath("/rest/saf/graphql") + .withBody(objectMapper.writeValueAsString(gyldigBrukerRequest())), + ).respond(response().withBody(json(lesFil("saf/gyldigJournalposterResponseBarnetrygd.json")))) + + client + .`when`( + HttpRequest + .request() + .withMethod("GET") + .withPath("/soknad/hent-personer-i-digital-soknad/BAR/453492634"), + ).respond(response().withBody(json(lesFil("mottak/gyldigPersonerIDigitalSøknadResponse.json")))) + + client + .`when`( + HttpRequest + .request() + .withMethod("POST") + .withPath("/rest/pdl/graphql") + .withBody(objectMapper.writeValueAsString(gyldigPdlPersonRequest("12345678910"))), + ).respond(response().withBody(json(lesFil("pdl/pdlAdressebeskyttelseResponse.json")))) + + client + .`when`( + HttpRequest + .request() + .withMethod("POST") + .withPath("/rest/pdl/graphql") + .withBody(objectMapper.writeValueAsString(gyldigPdlPersonRequest("12345678911"))), + ).respond(response().withBody(json(lesFil("pdl/pdlAdressebeskyttelseResponse.json")))) + + client + .`when`( + HttpRequest + .request() + .withMethod("GET") + .withPath("/rest/saf/rest/hentdokument/453492634/453871494/ORIGINAL"), + ).respond(HttpResponse().withBody(objectMapper.writeValueAsBytes(barnetrygdSøknad)).withHeaders(Header("Content-Type", "application/json"))) + + val response: ResponseEntity>> = + restTemplate.exchange( + uriHentTilgangsstyrtJournalpost, + HttpMethod.POST, + HttpEntity( + JournalposterForBrukerRequest( + Bruker("12345678901", BrukerIdType.FNR), + 10, + listOf(Tema.BAR), + listOf(Journalposttype.I), + ), + headers, + ), + ) + + assertThat(response.statusCode).isEqualTo(HttpStatus.OK) + assertThat(response.body?.status).isEqualTo(Ressurs.Status.SUKSESS) + assertThat( + response.body + ?.data + ?.first() + ?.journalpost + ?.journalpostId, + ).isEqualTo("453492634") + assertThat( + response.body + ?.data + ?.first() + ?.harTilgang, + ).isEqualTo(true) + } + @Test fun `hent dokument skal returnere dokument og status ok`() { client @@ -180,10 +268,10 @@ class HentJournalpostControllerTest( } private fun gyldigJournalPostIdRequest(): String = - lesFil("gyldigJournalpostIdRequest.json") + lesFil("saf/gyldigJournalpostIdRequest.json") .replace( "GRAPHQL-PLACEHOLDER", - lesFil("journalpostForId.graphql").graphqlCompatible(), + lesFil("saf/journalpostForId.graphql").graphqlCompatible(), ) private fun gyldigBrukerRequest(): SafJournalpostRequest = @@ -198,7 +286,13 @@ class HentJournalpostControllerTest( graphqlQuery("/saf/journalposterForBruker.graphql"), ) - private fun lesFil(filnavn: String): String = ClassPathResource("saf/$filnavn").url.readText() + private fun gyldigPdlPersonRequest(ident: String): PdlPersonRequest = + PdlPersonRequest( + variables = PdlPersonRequestVariables(ident), + query = graphqlQuery("/pdl/adressebeskyttelse.graphql"), + ) + + private fun lesFil(path: String): String = ClassPathResource(path).url.readText() companion object { const val JOURNALPOST_ID = "12345678" diff --git a/src/test/java/no/nav/familie/integrasjoner/journalpost/JournalpostServiceTest.kt b/src/test/java/no/nav/familie/integrasjoner/journalpost/JournalpostServiceTest.kt new file mode 100644 index 00000000..b3e02438 --- /dev/null +++ b/src/test/java/no/nav/familie/integrasjoner/journalpost/JournalpostServiceTest.kt @@ -0,0 +1,49 @@ +package no.nav.familie.integrasjoner.journalpost + +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import no.nav.familie.integrasjoner.client.rest.SafHentDokumentRestClient +import no.nav.familie.integrasjoner.client.rest.SafRestClient +import no.nav.familie.kontrakter.felles.BrukerIdType +import no.nav.familie.kontrakter.felles.Tema +import no.nav.familie.kontrakter.felles.journalpost.Bruker +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.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test + +class JournalpostServiceTest { + private val safRestClient: SafRestClient = mockk() + + private val safHentDokumentRestClient: SafHentDokumentRestClient = mockk() + + private val baksTilgangsstyrtJournalpostService: BaksTilgangsstyrtJournalpostService = mockk() + + private val journalpostService = + JournalpostService( + safRestClient = safRestClient, + safHentDokumentRestClient = safHentDokumentRestClient, + baksTilgangsstyrtJournalpostService = baksTilgangsstyrtJournalpostService, + ) + + @Nested + inner class FinnTilgangsstyrteJournalposter { + @Test + fun`skal hente journalposter fra saf og deretter mappe om lista til tilgangsstyrte journalposter`() { + // Arrange + val journalposterForBrukerRequest = JournalposterForBrukerRequest(brukerId = Bruker("1", BrukerIdType.FNR), antall = 100, tema = listOf(Tema.BAR)) + val journalposter = listOf(mockk()) + every { safRestClient.finnJournalposter(journalposterForBrukerRequest) } returns journalposter + every { baksTilgangsstyrtJournalpostService.mapTilTilgangsstyrteJournalposter(journalposter) } returns listOf(mockk()) + + // Act + journalpostService.finnTilgangsstyrteBaksJournalposter(journalposterForBrukerRequest) + + // Assert + verify(exactly = 1) { safRestClient.finnJournalposter(journalposterForBrukerRequest) } + verify(exactly = 1) { baksTilgangsstyrtJournalpostService.mapTilTilgangsstyrteJournalposter(journalposter) } + } + } +} diff --git "a/src/test/resources/mottak/gyldigPersonerIDigitalS\303\270knadResponse.json" "b/src/test/resources/mottak/gyldigPersonerIDigitalS\303\270knadResponse.json" new file mode 100644 index 00000000..45446d38 --- /dev/null +++ "b/src/test/resources/mottak/gyldigPersonerIDigitalS\303\270knadResponse.json" @@ -0,0 +1,4 @@ +[ + "12345678910", + "12345678911" +] \ No newline at end of file diff --git a/src/test/resources/saf/gyldigJournalposterResponseBarnetrygd.json b/src/test/resources/saf/gyldigJournalposterResponseBarnetrygd.json new file mode 100644 index 00000000..57c6b8d2 --- /dev/null +++ b/src/test/resources/saf/gyldigJournalposterResponseBarnetrygd.json @@ -0,0 +1,43 @@ +{ + "data": { + "dokumentoversiktBruker": { + "journalposter": [ + { + "journalpostId": "453492634", + "journalposttype": "I", + "journalstatus": "JOURNALFOERT", + "tema": "BAR", + "kanal": "NAV_NO", + "dokumenter": [ + { + "dokumentInfoId": "453871494", + "tittel": "Søknad om ordinær barnetrygd", + "brevkode": "NAV 33-00.07", + "dokumentstatus": null, + "dokumentvarianter": [ + { + "variantformat": "ARKIV" + } + ], + "logiskeVedlegg": [] + } + ], + "relevanteDatoer": [ + { + "dato": "2020-01-31T08:00:17", + "datotype": "DATO_DOKUMENT" + }, + { + "dato": "2020-03-11T09:09:15", + "datotype": "DATO_JOURNALFOERT" + }, + { + "dato": "2020-01-31T08:00:17", + "datotype": "DATO_REGISTRERT" + } + ] + } + ] + } + } +}