Skip to content

Commit

Permalink
EY-4753 Sette høyeste gradering basert på 3-parter ved opprett behand… (
Browse files Browse the repository at this point in the history
#6861)

* EY-4753 Sette høyeste gradering basert på 3-parter ved opprett behandling

* PR feedback
  • Loading branch information
sebassonav authored Jan 24, 2025
1 parent 0606484 commit 3c91a96
Show file tree
Hide file tree
Showing 18 changed files with 256 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ import no.nav.etterlatte.libs.ktor.token.HardkodaSystembruker
import no.nav.etterlatte.libs.ktor.token.Saksbehandler
import no.nav.etterlatte.oppgave.OppgaveService
import no.nav.etterlatte.sak.SakService
import no.nav.etterlatte.tilgangsstyring.OppdaterTilgangService
import no.nav.etterlatte.vilkaarsvurdering.service.VilkaarsvurderingService
import org.slf4j.LoggerFactory
import java.time.LocalDateTime
Expand All @@ -68,6 +69,7 @@ class BehandlingFactory(
private val kommerBarnetTilGodeService: KommerBarnetTilGodeService,
private val vilkaarsvurderingService: VilkaarsvurderingService,
private val behandlingInfoService: BehandlingInfoService,
private val tilgangsService: OppdaterTilgangService,
) {
private val logger = LoggerFactory.getLogger(this::class.java)

Expand Down Expand Up @@ -258,6 +260,8 @@ class BehandlingFactory(
},
gruppeId = persongalleri.avdoed.firstOrNull(),
)

tilgangsService.haandtergraderingOgEgenAnsatt(sakId, persongalleri)
return BehandlingOgOppgave(behandling, oppgave) {
behandlingHendelser.sendMeldingForHendelseStatistikk(
behandling.toStatistikkBehandling(persongalleri),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo
import no.nav.etterlatte.libs.ktor.token.Saksbehandler
import no.nav.etterlatte.libs.ktor.token.Systembruker
import no.nav.etterlatte.libs.ktor.token.brukerTokenInfo
import no.nav.etterlatte.sak.TilgangService
import no.nav.etterlatte.sak.TilgangServiceSjekker
import no.nav.etterlatte.tilgangsstyring.TILGANG_ROUTE_PATH
import no.nav.etterlatte.tilgangsstyring.sjekkSkrivetilgang

Expand All @@ -29,7 +29,7 @@ inline val PipelineContext<*, ApplicationCall>.berOmSkrivetilgang: Boolean
"Skrivetilgangparameter er ikke i query params",
)

internal fun Route.tilgangRoutes(tilgangService: TilgangService) {
internal fun Route.tilgangRoutes(tilgangService: TilgangServiceSjekker) {
route("/$TILGANG_ROUTE_PATH") {
post("/person") {
val fnr = call.receive<String>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,11 +144,12 @@ import no.nav.etterlatte.sak.SakServiceImpl
import no.nav.etterlatte.sak.SakSkrivDao
import no.nav.etterlatte.sak.SakTilgangDao
import no.nav.etterlatte.sak.SakendringerDao
import no.nav.etterlatte.sak.TilgangServiceImpl
import no.nav.etterlatte.sak.TilgangServiceSjekkerImpl
import no.nav.etterlatte.saksbehandler.SaksbehandlerInfoDao
import no.nav.etterlatte.saksbehandler.SaksbehandlerService
import no.nav.etterlatte.saksbehandler.SaksbehandlerServiceImpl
import no.nav.etterlatte.tilgangsstyring.AzureGroup
import no.nav.etterlatte.tilgangsstyring.OppdaterTilgangService
import no.nav.etterlatte.vilkaarsvurdering.dao.DelvilkaarDao
import no.nav.etterlatte.vilkaarsvurdering.dao.VilkaarsvurderingDao
import no.nav.etterlatte.vilkaarsvurdering.service.AldersovergangService
Expand Down Expand Up @@ -445,7 +446,7 @@ internal class ApplicationContext(
oppgaveService = oppgaveService,
)

val tilgangService = TilgangServiceImpl(sakTilgangDao)
val tilgangService = TilgangServiceSjekkerImpl(sakTilgangDao)

val externalServices: List<Pingable> =
listOf(
Expand Down Expand Up @@ -584,6 +585,12 @@ internal class ApplicationContext(
behandlingsStatusService,
)
val aldersovergangService = AldersovergangService(vilkaarsvurderingService)
val oppdaterTilgangService =
OppdaterTilgangService(
sakService = sakService,
skjermingKlient = skjermingKlient,
pdltjenesterKlient = pdlTjenesterKlient,
)
val behandlingFactory =
BehandlingFactory(
oppgaveService = oppgaveService,
Expand All @@ -598,6 +605,7 @@ internal class ApplicationContext(
kommerBarnetTilGodeService = kommerBarnetTilGodeService,
vilkaarsvurderingService = vilkaarsvurderingService,
behandlingInfoService = behandlingInfoService,
tilgangsService = oppdaterTilgangService,
)

val migreringService =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class EgenAnsattService(
fun haandterSkjerming(skjermetHendelse: EgenAnsattSkjermet) {
val saker = sakService.finnSaker(skjermetHendelse.fnr)
val sakerMedGradering = sakService.sjekkOmSakerErGradert(saker.map(Sak::id))
val sakerSomHarGradering = sakerMedGradering.filter { it.adressebeskyttelseGradering?.erGradert() ?: false }
val sakerSomHarGradering = sakerMedGradering.filter { it.adressebeskyttelseGradering?.harAdressebeskyttelse() ?: false }
if (sakerSomHarGradering.isNotEmpty()) return
val maskerFnr = skjermetHendelse.fnr.maskerFnr()
if (saker.isEmpty()) {
Expand Down
4 changes: 2 additions & 2 deletions apps/etterlatte-behandling/src/main/kotlin/sak/SakRoutes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ const val ANTALL = "antall"
const val PLEIEFORHOLDET_OPPHOERTE_PARAMETER = "opphoerte"

internal fun Route.sakSystemRoutes(
tilgangService: TilgangService,
tilgangService: TilgangServiceSjekker,
sakService: SakService,
behandlingService: BehandlingService,
requestLogger: BehandlingRequestLogger,
Expand Down Expand Up @@ -205,7 +205,7 @@ class SakIkkeFunnetException(
)

internal fun Route.sakWebRoutes(
tilgangService: TilgangService,
tilgangService: TilgangServiceSjekker,
sakService: SakService,
behandlingService: BehandlingService,
grunnlagsendringshendelseService: GrunnlagsendringshendelseService,
Expand Down
16 changes: 14 additions & 2 deletions apps/etterlatte-behandling/src/main/kotlin/sak/SakService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,13 @@ interface SakService {
adressebeskyttelseGradering: AdressebeskyttelseGradering,
): Int

fun sjekkSkjerming(
fnr: String,
sakId: SakId,
type: SakType,
overstyrendeEnhet: Enhetsnummer?,
)

fun hentEnkeltSakForPerson(fnr: String): Sak

suspend fun finnNavkontorForPerson(fnr: String): Navkontor
Expand All @@ -109,6 +116,11 @@ interface SakService {
): Sak

fun hentSakerMedPleieforholdetOpphoerte(maanedOpphoerte: YearMonth): List<SakId>

fun settEnhetOmAdresebeskyttet(
sak: Sak,
gradering: AdressebeskyttelseGradering,
)
}

class ManglerTilgangTilEnhet(
Expand Down Expand Up @@ -370,7 +382,7 @@ class SakServiceImpl(
return sak
}

private fun settEnhetOmAdresebeskyttet(
override fun settEnhetOmAdresebeskyttet(
sak: Sak,
gradering: AdressebeskyttelseGradering,
) {
Expand Down Expand Up @@ -477,7 +489,7 @@ class SakServiceImpl(
adressebeskyttelseGradering: AdressebeskyttelseGradering,
): Int = dao.oppdaterAdresseBeskyttelse(sakId, adressebeskyttelseGradering)

private fun sjekkSkjerming(
override fun sjekkSkjerming(
fnr: String,
sakId: SakId,
type: SakType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import no.nav.etterlatte.libs.common.sak.SakId
import no.nav.etterlatte.libs.common.sak.SakMedGraderingOgSkjermet
import no.nav.etterlatte.tilgangsstyring.SaksbehandlerMedRoller

interface TilgangService {
interface TilgangServiceSjekker {
fun harTilgangTilBehandling(
behandlingId: String,
saksbehandlerMedRoller: SaksbehandlerMedRoller,
Expand Down Expand Up @@ -48,9 +48,9 @@ data class SakMedGradering(
val adressebeskyttelseGradering: AdressebeskyttelseGradering?,
)

class TilgangServiceImpl(
class TilgangServiceSjekkerImpl(
private val dao: SakTilgangDao,
) : TilgangService {
) : TilgangServiceSjekker {
override fun harTilgangTilPerson(
fnr: String,
saksbehandlerMedRoller: SaksbehandlerMedRoller,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package no.nav.etterlatte.tilgangsstyring

import kotlinx.coroutines.runBlocking
import no.nav.etterlatte.common.Enheter
import no.nav.etterlatte.common.klienter.PdlTjenesterKlient
import no.nav.etterlatte.common.klienter.SkjermingKlient
import no.nav.etterlatte.grunnlagsendring.SakMedEnhet
import no.nav.etterlatte.libs.common.behandling.Persongalleri
import no.nav.etterlatte.libs.common.person.AdressebeskyttelseGradering
import no.nav.etterlatte.libs.common.person.HentAdressebeskyttelseRequest
import no.nav.etterlatte.libs.common.person.PersonIdent
import no.nav.etterlatte.libs.common.person.hentPrioritertGradering
import no.nav.etterlatte.libs.common.sak.Sak
import no.nav.etterlatte.libs.common.sak.SakId
import no.nav.etterlatte.sak.PersonManglerSak
import no.nav.etterlatte.sak.SakService

class OppdaterTilgangService(
private val sakService: SakService,
private val skjermingKlient: SkjermingKlient,
private val pdltjenesterKlient: PdlTjenesterKlient,
) {
/**
* Her skal den høyeste graderingen aldri bli overskredet
* Fra høyeste til lavest: STRENGT_FORTROLIG_UTLAND/STRENGT_FORTROLIG, FORTROLIG, EGEN_ANSATT
* NB: Saker uten behandling vil ikke trenge dette
**/
fun haandtergraderingOgEgenAnsatt(
sakId: SakId,
persongalleri: Persongalleri,
) {
val sak = sakService.finnSak(sakId) ?: throw PersonManglerSak()
val alleIdenter = persongalleri.hentAlleIdentifikatorer()

val identerMedGradering = alleIdenter.map { hentGraderingForIdent(it, sak) }

if (identerMedGradering.any { it.harAdressebeskyttelse() }) {
val hoyesteGradering = identerMedGradering.hentPrioritertGradering()
sakService.oppdaterAdressebeskyttelse(sakId, hoyesteGradering)
sakService.settEnhetOmAdresebeskyttet(sak, hoyesteGradering)
} else {
val egenAnsattSkjerming = alleIdenter.map { fnr -> sjekkOmIdentErSkjermet(fnr) }
if (egenAnsattSkjerming.any { it }) {
sakService.markerSakerMedSkjerming(listOf(sakId), true)
sakService.oppdaterEnhetForSaker(listOf(SakMedEnhet(sakId, Enheter.EGNE_ANSATTE.enhetNr)))
}
}
}

private fun hentGraderingForIdent(
fnr: String,
sak: Sak,
): AdressebeskyttelseGradering =
runBlocking {
pdltjenesterKlient.hentAdressebeskyttelseForPerson(
HentAdressebeskyttelseRequest(
PersonIdent(fnr),
sak.sakType,
),
)
}

private fun sjekkOmIdentErSkjermet(fnr: String): Boolean =
runBlocking {
skjermingKlient.personErSkjermet(fnr)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import no.nav.etterlatte.libs.ktor.route.FoedselsnummerDTO
import no.nav.etterlatte.libs.ktor.token.Saksbehandler
import no.nav.etterlatte.libs.ktor.token.Systembruker
import no.nav.etterlatte.libs.ktor.token.brukerTokenInfo
import no.nav.etterlatte.sak.TilgangService
import no.nav.etterlatte.sak.TilgangServiceSjekker

class PluginConfiguration {
var harTilgangBehandling: (behandlingId: String, saksbehandlerMedRoller: SaksbehandlerMedRoller)
Expand Down Expand Up @@ -158,7 +158,7 @@ val adressebeskyttelsePlugin: RouteScopedPlugin<PluginConfiguration> =

// Disse extension funksjonene er ikke gjort i hooken ovenfor pga casting overhead
suspend inline fun PipelineContext<*, ApplicationCall>.withFoedselsnummerInternal(
tilgangService: TilgangService,
tilgangService: TilgangServiceSjekker,
onSuccess: (fnr: Folkeregisteridentifikator) -> Unit,
) {
val foedselsnummerDTO = call.receive<FoedselsnummerDTO>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ import no.nav.etterlatte.sak.SakServiceImpl
import no.nav.etterlatte.sak.SakSkrivDao
import no.nav.etterlatte.sak.SakTilgangDao
import no.nav.etterlatte.sak.SakendringerDao
import no.nav.etterlatte.sak.TilgangService
import no.nav.etterlatte.sak.TilgangServiceImpl
import no.nav.etterlatte.sak.TilgangServiceSjekker
import no.nav.etterlatte.sak.TilgangServiceSjekkerImpl
import no.nav.etterlatte.tilgangsstyring.AzureGroup
import no.nav.etterlatte.tilgangsstyring.SaksbehandlerMedRoller
import org.junit.jupiter.api.Assertions
Expand All @@ -58,7 +58,7 @@ import javax.sql.DataSource
internal class TilgangServiceTest(
val dataSource: DataSource,
) {
private lateinit var tilgangService: TilgangService
private lateinit var tilgangService: TilgangServiceSjekker
private lateinit var sakService: SakService
private lateinit var sakRepo: SakSkrivDao
private lateinit var sakLesDao: SakLesDao
Expand All @@ -74,7 +74,7 @@ internal class TilgangServiceTest(

@BeforeAll
fun beforeAll() {
tilgangService = TilgangServiceImpl(SakTilgangDao(dataSource))
tilgangService = TilgangServiceSjekkerImpl(SakTilgangDao(dataSource))
sakLesDao = SakLesDao(ConnectionAutoclosingTest(dataSource))
sakRepo = SakSkrivDao(SakendringerDao(ConnectionAutoclosingTest(dataSource)) { sakLesDao.hentSak(it) })

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ import no.nav.etterlatte.nyKontekstMedBruker
import no.nav.etterlatte.oppgave.OppgaveService
import no.nav.etterlatte.revurdering
import no.nav.etterlatte.sak.SakService
import no.nav.etterlatte.tilgangsstyring.OppdaterTilgangService
import no.nav.etterlatte.vilkaarsvurdering.service.VilkaarsvurderingService
import no.nav.etterlatte.vilkaarsvurdering.vilkaar.BarnepensjonVilkaar1967
import org.junit.jupiter.api.AfterEach
Expand Down Expand Up @@ -129,6 +130,7 @@ internal class BehandlingFactoryTest {
vilkaarsvurderingService = vilkaarsvurderingService,
kommerBarnetTilGodeService = kommerBarnetTilGodeServiceMock,
behandlingInfoService = mockk(),
tilgangsService = OppdaterTilgangService(sakServiceMock, mockk(relaxed = true), mockk(relaxed = true)),
)

@BeforeEach
Expand Down Expand Up @@ -233,8 +235,10 @@ internal class BehandlingFactoryTest {
Assertions.assertEquals(sakId1, behandlingOpprettes.captured.sakId)
Assertions.assertEquals(behandlingHentes.captured, behandlingOpprettes.captured.id)

verify(exactly = 1) {
verify(exactly = 2) {
sakServiceMock.finnSak(any())
}
verify(exactly = 1) {
behandlingDaoMock.hentBehandling(any())
behandlingDaoMock.opprettBehandling(any())
hendelseDaoMock.behandlingOpprettet(any())
Expand Down Expand Up @@ -326,8 +330,10 @@ internal class BehandlingFactoryTest {

Assertions.assertTrue(foerstegangsbehandling is Foerstegangsbehandling)

verify(exactly = 1) {
verify(exactly = 2) {
sakServiceMock.finnSak(any())
}
verify(exactly = 1) {
behandlingDaoMock.hentBehandling(any())
behandlingDaoMock.opprettBehandling(any())
hendelseDaoMock.behandlingOpprettet(any())
Expand Down Expand Up @@ -437,8 +443,10 @@ internal class BehandlingFactoryTest {
user.brukerTokenInfo,
)
}
verify(exactly = 2) {
verify(exactly = 3) {
sakServiceMock.finnSak(any())
}
verify(exactly = 2) {
behandlingDaoMock.hentBehandlingerForSak(any())
}
verify(exactly = 1) {
Expand Down Expand Up @@ -880,14 +888,17 @@ internal class BehandlingFactoryTest {
)
}
coVerify { grunnlagService.leggInnNyttGrunnlag(any(), any(), any()) }

verify(exactly = 2) {
sakServiceMock.finnSak(any())
behandlingDaoMock.hentBehandling(any())
behandlingDaoMock.opprettBehandling(any())
hendelseDaoMock.behandlingOpprettet(any())
behandlingDaoMock.hentBehandlingerForSak(any())
behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatistikk(any(), any())
}
verify(exactly = 4) {
sakServiceMock.finnSak(any())
}
}

@Test
Expand Down Expand Up @@ -1052,13 +1063,15 @@ internal class BehandlingFactoryTest {
}
coVerify { grunnlagService.leggInnNyttGrunnlag(any(), any(), any()) }
verify(exactly = 2) {
sakServiceMock.finnSak(any())
behandlingDaoMock.hentBehandling(any())
behandlingDaoMock.opprettBehandling(any())
hendelseDaoMock.behandlingOpprettet(any())
behandlingDaoMock.hentBehandlingerForSak(any())
behandlingHendelserKafkaProducerMock.sendMeldingForHendelseStatistikk(any(), any())
}
verify(exactly = 3) {
sakServiceMock.finnSak(any())
}
}

@Test
Expand Down Expand Up @@ -1138,9 +1151,11 @@ internal class BehandlingFactoryTest {
Assertions.assertEquals(sakId1, behandlingOpprettes.captured.sakId)
Assertions.assertEquals(behandlingHentes.captured, behandlingOpprettes.captured.id)

verify(exactly = 2) {
sakServiceMock.finnSak(any())
}
verify(exactly = 1) {
sakServiceMock.finnEllerOpprettSakMedGrunnlag(persongalleri.soeker, SakType.BARNEPENSJON)
sakServiceMock.finnSak(sak.id)
behandlingDaoMock.opprettBehandling(any())
hendelseDaoMock.behandlingOpprettet(any())
behandlingDaoMock.hentBehandling(any())
Expand Down
Loading

0 comments on commit 3c91a96

Please sign in to comment.