diff --git a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/ApplicationPeriodeTest.kt b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/ApplicationPeriodeTest.kt index 919afa0c..2d5a56fd 100644 --- a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/ApplicationPeriodeTest.kt +++ b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/ApplicationPeriodeTest.kt @@ -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 @@ -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) diff --git a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/InngagnSomVeilederTest.kt b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/InngagnSomVeilederTest.kt index 77207e26..576657ed 100644 --- a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/InngagnSomVeilederTest.kt +++ b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/InngagnSomVeilederTest.kt @@ -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 @@ -50,7 +49,7 @@ class InngagnSomVeilederTest : FreeSpec({ } returns GrunnlagForGodkjenning( regel = Regel( id = AnsattHarTilgangTilBruker, - opplysninger = emptyList(), + kritierier = emptyList(), vedTreff = ::grunnlagForGodkjenning ), opplysning = emptySet() diff --git a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/InngangSomBrukerTest.kt b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/InngangSomBrukerTest.kt index e28028c6..814c47df 100644 --- a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/InngangSomBrukerTest.kt +++ b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/InngangSomBrukerTest.kt @@ -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 @@ -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 @@ -49,7 +47,7 @@ class InngangSomBrukerTest : FreeSpec({ } returns GrunnlagForGodkjenning( regel = Regel( id = Over18AarOgBosattEtterFregLoven, - opplysninger = emptyList(), + kritierier = emptyList(), vedTreff = ::grunnlagForGodkjenning ), opplysning = emptySet() @@ -110,7 +108,7 @@ class InngangSomBrukerTest : FreeSpec({ } returns skalAvises( regel = Regel( id = IkkeAnsattOgForhaandsgodkjentAvAnsatt, - opplysninger = emptyList(), + kritierier = emptyList(), vedTreff = ::skalAvises ), opplysninger = emptySet() diff --git a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/testdata/SvenskBrukerBosattISverigeUnder18aar.kt b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/testdata/SvenskBrukerBosattISverigeUnder18aar.kt index f07edd3d..347e7ecc 100644 --- a/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/testdata/SvenskBrukerBosattISverigeUnder18aar.kt +++ b/apps/api-start-stopp-perioder/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/testdata/SvenskBrukerBosattISverigeUnder18aar.kt @@ -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 ) diff --git a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/InngangsRegler.kt b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/InngangsRegler.kt index 9b86b940..2c20a8ff 100644 --- a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/InngangsRegler.kt +++ b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/InngangsRegler.kt @@ -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 = listOf( @@ -49,6 +50,7 @@ object InngangsRegler: Regler { ), IkkeBosattINorgeIHenholdTilFolkeregisterloven( !BosattEtterFregLoven, + ErNorskEllerTredjelandsborger, vedTreff = ::muligGrunnlagForAvvisning ) ) @@ -57,3 +59,9 @@ object InngangsRegler: Regler { vedTreff = ::muligGrunnlagForAvvisning ) } + +data object ErNorskEllerTredjelandsborger: Condition { + override fun eval(opplysninger: Iterable): Boolean = + ErNorskStatsborger in opplysninger || ErEuEoesStatsborger !in opplysninger +} + diff --git a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regel.kt b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regel.kt index 3b34b15c..854dea0f 100644 --- a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regel.kt +++ b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regel.kt @@ -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, + val kritierier: List, private val vedTreff: (Regel, Iterable) -> Either ) { diff --git a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelExtensions.kt b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelExtensions.kt index f7c47b67..ca6ee10f 100644 --- a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelExtensions.kt +++ b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelExtensions.kt @@ -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) -> Either ) = Regel( id = this, vedTreff = vedTreff, - opplysninger = opplysninger.toList() + kritierier = kriterier.toList() ) fun Regel.evaluer(samletOpplysning: Iterable): Boolean = - opplysninger - .filterNot { it is Not<*> } - .all { samletOpplysning.contains(it) } && - opplysninger - .filterIsInstance>() - .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, diff --git a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regler.kt b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regler.kt index a5669a3d..027c8025 100644 --- a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regler.kt +++ b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/Regler.kt @@ -8,11 +8,12 @@ interface Regler { operator fun Opplysning.not(): Opplysning = HarIkke(this) } -interface Not { - val value: A -} - -data class HarIkke(override val value: Opplysning) : Not, 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): Boolean = value !in opplysninger +} + +interface Condition { + fun eval(opplysninger: Iterable): Boolean } diff --git a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/opplysninger/Opplysninger.kt b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/opplysninger/Opplysninger.kt index eb3c67bd..70d099ee 100644 --- a/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/opplysninger/Opplysninger.kt +++ b/domain/arbeidssoeker-regler/src/main/kotlin/no/nav/paw/arbeidssokerregisteret/application/opplysninger/Opplysninger.kt @@ -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): Boolean = this in opplysninger } - infix operator fun Opplysning.plus(opplysning: Opplysning): Set = setOf(this, opplysning) sealed interface DomeneOpplysning: Opplysning { diff --git a/domain/arbeidssoeker-regler/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelEvalTest.kt b/domain/arbeidssoeker-regler/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelEvalTest.kt index 650f9784..9ed19fd6 100644 --- a/domain/arbeidssoeker-regler/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelEvalTest.kt +++ b/domain/arbeidssoeker-regler/src/test/kotlin/no/nav/paw/arbeidssokerregisteret/application/RegelEvalTest.kt @@ -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> typealias Godkjent = Either.Right @@ -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() + 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() + 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() + result.value.map { problem -> problem.regel.id } shouldContainExactlyInAnyOrder listOf( + Under18Aar, + EuEoesStatsborgerMenHarStatusIkkeBosatt + ) + } } "og er forhåndsgodkjent av veileder" - { "skal avvises når" - { @@ -157,8 +211,7 @@ class RegelEvalTest : FreeSpec({ ) should { result -> result.shouldBeInstanceOf() result.value.map { it.regel.id } shouldContainExactlyInAnyOrder listOf( - EuEoesStatsborgerMenHarStatusIkkeBosatt, - IkkeBosattINorgeIHenholdTilFolkeregisterloven + EuEoesStatsborgerMenHarStatusIkkeBosatt ) } }