Skip to content

Commit

Permalink
Fikset eu/eoes regler
Browse files Browse the repository at this point in the history
  • Loading branch information
nilsmsa committed Sep 4, 2024
1 parent 0fb2e02 commit d217dd7
Show file tree
Hide file tree
Showing 10 changed files with 84 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysni
import no.nav.paw.arbeidssokerregisteret.plugins.configureHTTP
import no.nav.paw.arbeidssokerregisteret.plugins.configureSerialization
import no.nav.paw.arbeidssokerregisteret.routes.apiRegel
import no.nav.paw.arbeidssokerregisteret.routes.arbeidssokerRoutes
import no.nav.paw.arbeidssokerregisteret.routes.arbeidssokerRoutesV2
import no.nav.paw.arbeidssokerregisteret.routes.feilmeldingVedAvvist

Expand All @@ -39,7 +38,7 @@ class ApplicationPeriodeTest : FunSpec({
} returns muligGrunnlagForAvvisning(
regel = Regel(
id = Under18Aar,
opplysninger = listOf(DomeneOpplysning.ErUnder18Aar),
kritierier = listOf(DomeneOpplysning.ErUnder18Aar),
vedTreff = ::skalAvises
),
opplysninger = listOf(DomeneOpplysning.ErUnder18Aar, DomeneOpplysning.BosattEtterFregLoven)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ import no.nav.paw.arbeidssokerregisteret.auth.configureAuthentication
import no.nav.paw.arbeidssokerregisteret.domain.Identitetsnummer
import no.nav.paw.arbeidssokerregisteret.plugins.configureHTTP
import no.nav.paw.arbeidssokerregisteret.plugins.configureSerialization
import no.nav.paw.arbeidssokerregisteret.routes.arbeidssokerRoutes
import no.nav.paw.arbeidssokerregisteret.routes.arbeidssokerRoutesV2
import no.nav.security.mock.oauth2.MockOAuth2Server

Expand All @@ -50,7 +49,7 @@ class InngagnSomVeilederTest : FreeSpec({
} returns GrunnlagForGodkjenning(
regel = Regel(
id = AnsattHarTilgangTilBruker,
opplysninger = emptyList(),
kritierier = emptyList(),
vedTreff = ::grunnlagForGodkjenning
),
opplysning = emptySet()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package no.nav.paw.arbeidssokerregisteret

import arrow.core.left
import arrow.core.nonEmptyListOf
import arrow.core.right
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
Expand All @@ -24,7 +23,6 @@ import no.nav.paw.arbeidssokerregisteret.auth.configureAuthentication
import no.nav.paw.arbeidssokerregisteret.domain.Identitetsnummer
import no.nav.paw.arbeidssokerregisteret.plugins.configureHTTP
import no.nav.paw.arbeidssokerregisteret.plugins.configureSerialization
import no.nav.paw.arbeidssokerregisteret.routes.arbeidssokerRoutes
import no.nav.paw.arbeidssokerregisteret.routes.arbeidssokerRoutesV2
import no.nav.security.mock.oauth2.MockOAuth2Server

Expand All @@ -49,7 +47,7 @@ class InngangSomBrukerTest : FreeSpec({
} returns GrunnlagForGodkjenning(
regel = Regel(
id = Over18AarOgBosattEtterFregLoven,
opplysninger = emptyList(),
kritierier = emptyList(),
vedTreff = ::grunnlagForGodkjenning
),
opplysning = emptySet()
Expand Down Expand Up @@ -110,7 +108,7 @@ class InngangSomBrukerTest : FreeSpec({
} returns skalAvises(
regel = Regel(
id = IkkeAnsattOgForhaandsgodkjentAvAnsatt,
opplysninger = emptyList(),
kritierier = emptyList(),
vedTreff = ::skalAvises
),
opplysninger = emptySet()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ data object SvenskBrukerBosattISverigeUnder18aar : TestCase {
Opplysning.IKKE_ANSATT,
Opplysning.SAMME_SOM_INNLOGGET_BRUKER,
Opplysning.INGEN_INFORMASJON_OM_OPPHOLDSTILLATELSE,
Opplysning.ER_NORSK_STATSBORGER,
Opplysning.DNUMMER,
Opplysning.INGEN_FLYTTE_INFORMASJON
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.paw.arbeidssokerregisteret.application

import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysning.*
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.Opplysning

object InngangsRegler: Regler {
override val regler: List<Regel> = listOf(
Expand Down Expand Up @@ -49,6 +50,7 @@ object InngangsRegler: Regler {
),
IkkeBosattINorgeIHenholdTilFolkeregisterloven(
!BosattEtterFregLoven,
ErNorskEllerTredjelandsborger,
vedTreff = ::muligGrunnlagForAvvisning
)
)
Expand All @@ -57,3 +59,9 @@ object InngangsRegler: Regler {
vedTreff = ::muligGrunnlagForAvvisning
)
}

data object ErNorskEllerTredjelandsborger: Condition {
override fun eval(opplysninger: Iterable<Opplysning>): Boolean =
ErNorskStatsborger in opplysninger || ErEuEoesStatsborger !in opplysninger
}

Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import no.nav.paw.arbeidssokerregisteret.application.opplysninger.Opplysning
data class Regel(
val id: RegelId,
/**
* Opplysninger som må være tilstede for at regelen skal være sann
* Kritieries som må være oppfylt for at regelen skal være sann
*/
val opplysninger: List<Opplysning>,
val kritierier: List<Condition>,

private val vedTreff: (Regel, Iterable<Opplysning>) -> Either<Problem, GrunnlagForGodkjenning>
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,18 @@ import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.Opplysning as HendelseOppl


operator fun RegelId.invoke(
vararg opplysninger: Opplysning,
vararg kriterier: Condition,
vedTreff: (Regel, Iterable<Opplysning>) -> Either<Problem, GrunnlagForGodkjenning>
) = Regel(
id = this,
vedTreff = vedTreff,
opplysninger = opplysninger.toList()
kritierier = kriterier.toList()
)

fun Regel.evaluer(samletOpplysning: Iterable<Opplysning>): Boolean =
opplysninger
.filterNot { it is Not<*> }
.all { samletOpplysning.contains(it) } &&
opplysninger
.filterIsInstance<Not<Opplysning>>()
.none { samletOpplysning.contains(it.value) }
kritierier.all {
it.eval(samletOpplysning)
}

/**
* Evaluerer en liste med regler mot en liste med opplysninger. Returnerer første regel som evalueres til sann,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ interface Regler {
operator fun Opplysning.not(): Opplysning = HarIkke(this)
}

interface Not<A> {
val value: A
}

data class HarIkke(override val value: Opplysning) : Not<Opplysning>, Opplysning {
data class HarIkke( val value: Opplysning) : Opplysning {
override val id: String get() = "IKKE_${value.id}"
override val beskrivelse: String get() = "IKKE_${value.beskrivelse}"
override fun eval(opplysninger: Iterable<Opplysning>): Boolean = value !in opplysninger
}

interface Condition {
fun eval(opplysninger: Iterable<Opplysning>): Boolean
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package no.nav.paw.arbeidssokerregisteret.application.opplysninger

interface Opplysning {
import no.nav.paw.arbeidssokerregisteret.application.Condition

interface Opplysning: Condition {
val id: String
val beskrivelse: String
override fun eval(opplysninger: Iterable<Opplysning>): Boolean = this in opplysninger
}


infix operator fun Opplysning.plus(opplysning: Opplysning): Set<Opplysning> = setOf(this, opplysning)
sealed interface DomeneOpplysning: Opplysning {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder
import io.kotest.matchers.should
import io.kotest.matchers.types.shouldBeInstanceOf
import no.nav.paw.arbeidssokerregisteret.application.opplysninger.DomeneOpplysning
import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.Opplysning

typealias Avvist = Either.Left<NonEmptyList<Problem>>
typealias Godkjent = Either.Right<GrunnlagForGodkjenning>
Expand Down Expand Up @@ -44,6 +45,59 @@ class RegelEvalTest : FreeSpec({
)
}
}
"eu/eoes(men ikke Norsk statsborger) avvises med 'under 18 år' og 'ikke bosatt' når ikke bosatt etter f.reg. loven" {
InngangsRegler.evaluer(
listOf(
DomeneOpplysning.ErUnder18Aar,
DomeneOpplysning.IkkeBosatt,
DomeneOpplysning.ErEuEoesStatsborger
)
) should { result ->
result.shouldBeInstanceOf<Avvist>()
result.value.map { problem -> problem.regel.id } shouldContainExactlyInAnyOrder listOf(
Under18Aar,
EuEoesStatsborgerMenHarStatusIkkeBosatt
)
}
}
}
"er ikke norsk EU/EØS statsborger under 18 år med dnummer og ikke utflyttet" {
InngangsRegler.evaluer(
listOf(
DomeneOpplysning.ErUnder18Aar,
DomeneOpplysning.ErEuEoesStatsborger,
DomeneOpplysning.HarUtenlandskAdresse,
DomeneOpplysning.HarRegistrertAdresseIEuEoes,
DomeneOpplysning.IngenInformasjonOmOppholdstillatelse,
DomeneOpplysning.Dnummer,
DomeneOpplysning.IngenFlytteInformasjon
)
) should { result ->
result.shouldBeInstanceOf<Avvist>()
result.value.map { problem -> problem.regel.id } shouldContainExactlyInAnyOrder listOf(
Under18Aar
)
}
}
"er ikke norsl EU/EØS statsborger under 18 år med dnummer og utflyttet" {
InngangsRegler.evaluer(
listOf(
DomeneOpplysning.ErUnder18Aar,
DomeneOpplysning.ErEuEoesStatsborger,
DomeneOpplysning.HarUtenlandskAdresse,
DomeneOpplysning.HarRegistrertAdresseIEuEoes,
DomeneOpplysning.IngenInformasjonOmOppholdstillatelse,
DomeneOpplysning.Dnummer,
DomeneOpplysning.IngenFlytteInformasjon,
DomeneOpplysning.IkkeBosatt
)
) should { result ->
result.shouldBeInstanceOf<Avvist>()
result.value.map { problem -> problem.regel.id } shouldContainExactlyInAnyOrder listOf(
Under18Aar,
EuEoesStatsborgerMenHarStatusIkkeBosatt
)
}
}
"og er forhåndsgodkjent av veileder" - {
"skal avvises når" - {
Expand Down Expand Up @@ -157,8 +211,7 @@ class RegelEvalTest : FreeSpec({
) should { result ->
result.shouldBeInstanceOf<Avvist>()
result.value.map { it.regel.id } shouldContainExactlyInAnyOrder listOf(
EuEoesStatsborgerMenHarStatusIkkeBosatt,
IkkeBosattINorgeIHenholdTilFolkeregisterloven
EuEoesStatsborgerMenHarStatusIkkeBosatt
)
}
}
Expand Down

0 comments on commit d217dd7

Please sign in to comment.