Skip to content

Commit

Permalink
Compare factors against the months that are eligible for auto-godskri…
Browse files Browse the repository at this point in the history
…ving where appropriate

- Retain the actual months used for the evaluation of the vilkår in vilkår grunnlag.
  • Loading branch information
jacob-meidell committed Nov 8, 2024
1 parent 467a5eb commit 78795bc
Show file tree
Hide file tree
Showing 23 changed files with 708 additions and 156 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,8 @@ sealed class AntallMånederRegel {

fun Int.oppfyller(antallMånederRegel: AntallMånederRegel): Boolean {
return this >= antallMånederRegel.antall
}

fun Set<*>.oppfyller(antallMånederRegel: AntallMånederRegel): Boolean {
return count().oppfyller(antallMånederRegel)
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ data class Behandling(
vurderVilkår.OmsorgsyterErMedlemIFolketrygden(),
vurderVilkår.OmsorgsyterErIkkeOmsorgsmottaker(),
vurderVilkår.OmsorgsyterHarIkkeDødsdato(),
vurderVilkår.OmsorgsyterMottarPensjonEllerUføretrygdIEøs(),
vurderVilkår.OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs(),
vurderVilkår.OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn(),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,16 @@ sealed class Omsorgsmåneder {
}
}

abstract fun kvalifisererForAutomatiskBehandling(): Omsorgsmåneder
fun erKvalifisertForAutomatiskBehandling(antallMånederRegel: AntallMånederRegel): Boolean {
return kvalifisererForAutomatiskBehandling().antall().oppfyller(antallMånederRegel)
}

abstract fun kvalifisererForManuellBehandling(): Omsorgsmåneder
fun erKvalifisertForManuellBehandling(antallMånederRegel: AntallMånederRegel): Boolean {
return kvalifisererForManuellBehandling().antall().oppfyller(antallMånederRegel)
}

data class Barnetrygd(
val omsorgsmåneder: Set<Omsorgsmåned>
) : Omsorgsmåneder() {
Expand All @@ -31,6 +41,14 @@ sealed class Omsorgsmåneder {

override val måneder: Set<YearMonth> = omsorgsmåneder.map { it.måned }.toSortedSet()

override fun kvalifisererForAutomatiskBehandling(): Omsorgsmåneder {
return Barnetrygd(full())
}

override fun kvalifisererForManuellBehandling(): Omsorgsmåneder {
return Barnetrygd(full() + delt())
}

fun merge(other: Barnetrygd): Barnetrygd {
return Barnetrygd((omsorgsmåneder + other.omsorgsmåneder).toSet())
}
Expand Down Expand Up @@ -67,6 +85,17 @@ sealed class Omsorgsmåneder {

override val måneder = omsorgsmåneder.map { it.måned }.toSortedSet()

//TODO et hull her ift full vs delt barnetrygd
override fun kvalifisererForAutomatiskBehandling(): Omsorgsmåneder {
return this
}

//TODO et hull her ift full vs delt barnetrygd
override fun kvalifisererForManuellBehandling(): Omsorgsmåneder {
return this
}


fun merge(other: Hjelpestønad): Hjelpestønad {
return Hjelpestønad((omsorgsmåneder + other.omsorgsmåneder).toSet())
}
Expand All @@ -82,4 +111,8 @@ sealed class Omsorgsmåneder {
valned: YearMonth,
val omsorgstype: DomainOmsorgstype
)
}

fun Set<Omsorgsmåneder.Omsorgsmåned>.måneder(): Set<YearMonth> {
return map { it.måned }.toSet()
}
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ sealed class OmsorgsopptjeningGrunnlag {

fun forTilstrekkeligOmsorgsarbeid(): OmsorgsyterHarTilstrekkeligOmsorgsarbeid.Grunnlag {
return OmsorgsyterHarTilstrekkeligOmsorgsarbeid.Grunnlag(
omsorgsytersOmsorgsmånederForOmsorgsmottaker = omsorgsmånederForOmsorgsmottakerPerOmsorgsyter()[omsorgsyter]!!,
omsorgsmåneder = omsorgsmånederForOmsorgsmottakerPerOmsorgsyter()[omsorgsyter]!!,
antallMånederRegel = antallMånederRegel()
)
}
Expand All @@ -106,15 +106,15 @@ sealed class OmsorgsopptjeningGrunnlag {
fun forGyldigOmsorgsarbeid(omsorgsyter: Person): OmsorgsyterHarGyldigOmsorgsarbeid.Grunnlag {
return OmsorgsyterHarGyldigOmsorgsarbeid.Grunnlag(
omsorgsytersUtbetalingsmåneder = utbetalingsmånederForOmsorgsmottakerPerOmsorgsyter()[omsorgsyter]!!,
omsorgsytersOmsorgsmåneder = omsorgsmånederForOmsorgsmottakerPerOmsorgsyter()[omsorgsyter]!!,
omsorgsmåneder = omsorgsmånederForOmsorgsmottakerPerOmsorgsyter()[omsorgsyter]!!,
antallMånederRegel = antallMånederRegel()
)
}

fun forMedlemskapIFolketrygden(): OmsorgsyterErMedlemIFolketrygden.Grunnlag {
return OmsorgsyterErMedlemIFolketrygden.Grunnlag(
medlemskapsgrunnlag = grunnlag.omsorgsytersPersongrunnlag.medlemskapsgrunnlag,
omsorgsytersOmsorgsmåneder = omsorgsmånederForOmsorgsmottakerPerOmsorgsyter()[omsorgsyter]!!,
omsorgsmåneder = omsorgsmånederForOmsorgsmottakerPerOmsorgsyter()[omsorgsyter]!!,
antallMånederRegel = antallMånederRegel(),
landstilknytningMåneder = landstilknytningForOmsorgsmottakerPerOmsorgsyter()[omsorgsyter]!!
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ object OmsorgsyterErMedlemIFolketrygden : ParagrafVilkår<OmsorgsyterErMedlemIFo
}

override fun <T : Vilkar<Grunnlag>> T.bestemUtfall(grunnlag: Grunnlag): VilkårsvurderingUtfall {
return when (grunnlag.omsorgsytersOmsorgsmåneder.omsorgstype()) {
return when (grunnlag.omsorgstype()) {
DomainOmsorgskategori.BARNETRYGD -> {
setOf(
JuridiskHenvisning.Folketrygdloven_Kap_20_Paragraf_8_Første_Ledd_Bokstav_a_Første_Punktum
Expand Down Expand Up @@ -54,7 +54,7 @@ object OmsorgsyterErMedlemIFolketrygden : ParagrafVilkår<OmsorgsyterErMedlemIFo
data class Vurdering(
override val grunnlag: Grunnlag,
override val utfall: VilkårsvurderingUtfall
) : ParagrafVurdering<Grunnlag>(){
) : ParagrafVurdering<Grunnlag>() {

override fun hentOppgaveopplysninger(behandling: FullførtBehandling): Oppgaveopplysninger {
return Oppgaveopplysninger.Generell(
Expand All @@ -65,15 +65,22 @@ object OmsorgsyterErMedlemIFolketrygden : ParagrafVilkår<OmsorgsyterErMedlemIFo
}

data class Grunnlag(
val medlemskapsgrunnlag: Medlemskapsgrunnlag,
val omsorgsytersOmsorgsmåneder: Omsorgsmåneder,
val medlemskapsgrunnlag: Medlemskapsgrunnlag, //TODO recfactor ut
private var omsorgsmåneder: Omsorgsmåneder,
val antallMånederRegel: AntallMånederRegel,
val landstilknytningMåneder: Landstilknytningmåneder,
) : ParagrafGrunnlag() {

init {
omsorgsmåneder = if (omsorgsmåneder.erKvalifisertForAutomatiskBehandling(antallMånederRegel)) {
omsorgsmåneder.kvalifisererForAutomatiskBehandling()
} else {
omsorgsmåneder.kvalifisererForManuellBehandling()
}
}

private val ikkeMedlem = medlemskapsgrunnlag.alleMånederUtenMedlemskap()
private val medlem = medlemskapsgrunnlag.alleMånederMedMedlemskap()
private val omsorgsmåneder = omsorgsytersOmsorgsmåneder.alle()

/**
* Bygger på en antakelse om at personer som mottar barnetrygd til å begynne med er vurdert etter
Expand All @@ -83,8 +90,8 @@ object OmsorgsyterErMedlemIFolketrygden : ParagrafVilkår<OmsorgsyterErMedlemIFo
* grad sannnsynliggjør medlemskap i folketrygden.
*/
fun erInnvilget(): Boolean {
val antattMedlem = omsorgsmåneder.minus(ikkeMedlem).minus(medlem)
return (ikkeMedlem.isEmpty() && medlem.isEmpty()) || antattMedlem.count().oppfyller(antallMånederRegel)
val antattMedlem = omsorgsmåneder.alle().minus(ikkeMedlem).minus(medlem)
return (ikkeMedlem.isEmpty() && medlem.isEmpty()) || antattMedlem.oppfyller(antallMånederRegel)
}

/**
Expand All @@ -93,8 +100,8 @@ object OmsorgsyterErMedlemIFolketrygden : ParagrafVilkår<OmsorgsyterErMedlemIFo
*/
fun erInnvilgetTilTrossForPerioderUtenMedlemskap(): Boolean {
require(!erInnvilget()) { "Rekkefølgeavhengig" }
val antattMedlem = omsorgsmåneder.minus(ikkeMedlem)
return medlem.isEmpty() && antattMedlem.count().oppfyller(antallMånederRegel)
val antattMedlem = omsorgsmåneder.alle().minus(ikkeMedlem)
return medlem.isEmpty() && antattMedlem.oppfyller(antallMånederRegel)
}

/**
Expand All @@ -103,8 +110,8 @@ object OmsorgsyterErMedlemIFolketrygden : ParagrafVilkår<OmsorgsyterErMedlemIFo
*/
fun erInnvilgetTilTrossForPerioderMedFrivilligEllerPliktigMedlemskap(): Boolean {
require(!erInnvilget() && !erInnvilgetTilTrossForPerioderUtenMedlemskap()) { "Rekkefølgeavhengig" }
val antattMedlem = omsorgsmåneder.minus(medlem)
return ikkeMedlem.isEmpty() && antattMedlem.count().oppfyller(antallMånederRegel)
val antattMedlem = omsorgsmåneder.alle().minus(medlem)
return ikkeMedlem.isEmpty() && antattMedlem.oppfyller(antallMånederRegel)
}

/**
Expand All @@ -115,8 +122,16 @@ object OmsorgsyterErMedlemIFolketrygden : ParagrafVilkår<OmsorgsyterErMedlemIFo
*/
fun manuell(): Boolean {
require(!erInnvilget() && !erInnvilgetTilTrossForPerioderUtenMedlemskap() && !erInnvilgetTilTrossForPerioderMedFrivilligEllerPliktigMedlemskap()) { "Rekkefølgeavhengig" }
val antattMedlem = omsorgsmåneder.minus(ikkeMedlem).minus(medlem).plus(omsorgsmåneder.intersect(medlem))
return landstilknytningMåneder.erNorge(antattMedlem) && antattMedlem.count().oppfyller(antallMånederRegel)
val antattMedlem = omsorgsmåneder.alle().minus(ikkeMedlem).minus(medlem).plus(omsorgsmåneder.alle().intersect(medlem))
return landstilknytningMåneder.erNorge(antattMedlem) && antattMedlem.oppfyller(antallMånederRegel)
}

fun omsorgstype(): DomainOmsorgskategori {
return omsorgsmåneder.omsorgstype()
}

fun omsorgsmåneder(): Omsorgsmåneder {
return omsorgsmåneder
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model

import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.persongrunnlag.model.DomainOmsorgskategori
import java.time.YearMonth


object OmsorgsyterHarGyldigOmsorgsarbeid : ParagrafVilkår<OmsorgsyterHarGyldigOmsorgsarbeid.Grunnlag>() {
Expand Down Expand Up @@ -68,18 +67,28 @@ object OmsorgsyterHarGyldigOmsorgsarbeid : ParagrafVilkår<OmsorgsyterHarGyldigO

data class Grunnlag(
val omsorgsytersUtbetalingsmåneder: Utbetalingsmåneder,
val omsorgsytersOmsorgsmåneder: Omsorgsmåneder,
private var omsorgsmåneder: Omsorgsmåneder,
val antallMånederRegel: AntallMånederRegel,
) : ParagrafGrunnlag() {
val gyldigeOmsorgsmåneder: Set<YearMonth> =
omsorgsytersOmsorgsmåneder.alle().intersect(omsorgsytersUtbetalingsmåneder.alle())

init {
omsorgsmåneder = if (omsorgsmåneder.erKvalifisertForAutomatiskBehandling(antallMånederRegel)) {
omsorgsmåneder.kvalifisererForAutomatiskBehandling()
} else {
omsorgsmåneder.kvalifisererForManuellBehandling()
}
}

fun erOppfyllt(): Boolean {
return gyldigeOmsorgsmåneder.count().oppfyller(antallMånederRegel)
return omsorgsmåneder.alle().intersect(omsorgsytersUtbetalingsmåneder.alle()).oppfyller(antallMånederRegel)
}

fun omsorgstype(): DomainOmsorgskategori {
return omsorgsytersOmsorgsmåneder.omsorgstype()
return omsorgsmåneder.omsorgstype()
}

fun omsorgsmåneder(): Omsorgsmåneder {
return omsorgsmåneder
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ object OmsorgsyterHarMestOmsorgAvAlleOmsorgsytere :
val omsorgsyter: String,
val data: Set<OmsorgsmånederForMottakerOgÅr> // Det er teoretisk mulig med flere mottakere, men i praksis kun en
) : ParagrafGrunnlag() {

val omsorgsytereGruppertEtterOmsorgsmånederMedFull = data
.groupBy { it.antallFull() }
.filter { it.key > 0 }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,28 +83,25 @@ object OmsorgsyterHarTilstrekkeligOmsorgsarbeid : ParagrafVilkår<OmsorgsyterHar


data class Grunnlag(
val omsorgsytersOmsorgsmånederForOmsorgsmottaker: Omsorgsmåneder,
private var omsorgsmåneder: Omsorgsmåneder,
val antallMånederRegel: AntallMånederRegel,
) : ParagrafGrunnlag() {

fun erOppfyllt(): Boolean {
return when (omsorgsytersOmsorgsmånederForOmsorgsmottaker) {
is Omsorgsmåneder.Barnetrygd -> {
omsorgsytersOmsorgsmånederForOmsorgsmottaker.antallFull().oppfyller(antallMånederRegel)
}

is Omsorgsmåneder.Hjelpestønad -> {
//TODO et hull her ift full vs delt barnetrygd
omsorgsytersOmsorgsmånederForOmsorgsmottaker.antall().oppfyller(antallMånederRegel)
}
return if (omsorgsmåneder.erKvalifisertForAutomatiskBehandling(antallMånederRegel)) {
omsorgsmåneder = omsorgsmåneder.kvalifisererForAutomatiskBehandling()
omsorgsmåneder.alle().oppfyller(antallMånederRegel)
} else {
false
}
}

fun erManuell(): Boolean {
require(!erOppfyllt()) { "Rekkefølgeavhengig" }
return when (omsorgsytersOmsorgsmånederForOmsorgsmottaker) {
return when (omsorgsmåneder) {
is Omsorgsmåneder.Barnetrygd -> {
(omsorgsytersOmsorgsmånederForOmsorgsmottaker.antallFull() + omsorgsytersOmsorgsmånederForOmsorgsmottaker.antallDelt()).oppfyller(antallMånederRegel)
omsorgsmåneder = omsorgsmåneder.kvalifisererForManuellBehandling()
omsorgsmåneder.alle().oppfyller(antallMånederRegel)
}

is Omsorgsmåneder.Hjelpestønad -> {
Expand All @@ -115,7 +112,11 @@ object OmsorgsyterHarTilstrekkeligOmsorgsarbeid : ParagrafVilkår<OmsorgsyterHar
}

fun omsorgstype(): DomainOmsorgskategori {
return omsorgsytersOmsorgsmånederForOmsorgsmottaker.omsorgstype()
return omsorgsmåneder.omsorgstype()
}

fun omsorgsmåneder(): Omsorgsmåneder {
return omsorgsmåneder
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ object OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs :
}

override fun <T : Vilkar<Grunnlag>> T.bestemUtfall(grunnlag: Grunnlag): VilkårsvurderingUtfall {
return when (grunnlag.omsorgsmåneder.omsorgstype()) {
return when (grunnlag.omsorgstype()) {
DomainOmsorgskategori.BARNETRYGD -> emptySet<JuridiskHenvisning>()
DomainOmsorgskategori.HJELPESTØNAD -> emptySet<JuridiskHenvisning>()
}.let {
Expand Down Expand Up @@ -51,12 +51,19 @@ object OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs :
}

data class Grunnlag(
val omsorgsmåneder: Omsorgsmåneder,
private var omsorgsmåneder: Omsorgsmåneder,
val ytelsemåneder: Ytelsemåneder,
val landstilknytningmåneder: Landstilknytningmåneder,
val antallMånederRegel: AntallMånederRegel,
) : ParagrafGrunnlag() {

init {
omsorgsmåneder = if (omsorgsmåneder.erKvalifisertForAutomatiskBehandling(antallMånederRegel)) {
omsorgsmåneder.kvalifisererForAutomatiskBehandling()
} else {
omsorgsmåneder.kvalifisererForManuellBehandling()
}
}

fun erInnvilget(): Boolean {
return ytelsemåneder.alle().intersect(landstilknytningmåneder.alleEøsMåneder()).isEmpty()
Expand All @@ -76,9 +83,16 @@ object OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs :
fun manuell(): Boolean {
require(!erInnvilget() && !erInnvilgetTilTrossForPerioderMedYtelseIEøs()) { "Rekkefølgeavhengig" }
val ytelseOgEøs = ytelsemåneder.alle().intersect(landstilknytningmåneder.alleEøsMåneder())
val omsorgOgYtelseEøs =
omsorgsmåneder.alle().minus(ytelseOgEøs).plus(omsorgsmåneder.alle().intersect(ytelseOgEøs))
val omsorgOgYtelseEøs = omsorgsmåneder.alle().minus(ytelseOgEøs).plus(omsorgsmåneder.alle().intersect(ytelseOgEøs))
return ytelseOgEøs.isNotEmpty() && omsorgOgYtelseEøs.count().oppfyller(antallMånederRegel)
}

fun omsorgstype(): DomainOmsorgskategori {
return omsorgsmåneder.omsorgstype()
}

fun omsorgsmåneder(): Omsorgsmåneder {
return omsorgsmåneder
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ interface VurderVilkår {
fun OmsorgsyterErMedlemIFolketrygden(): OmsorgsyterErMedlemIFolketrygden.Vurdering
fun OmsorgsyterErIkkeOmsorgsmottaker(): OmsorgsyterErikkeOmsorgsmottaker.Vurdering
fun OmsorgsyterHarIkkeDødsdato(): OmsorgsyterHarIkkeDødsdato.Vurdering
fun OmsorgsyterMottarPensjonEllerUføretrygdIEøs(): OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs.Vurdering
fun OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs(): OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs.Vurdering
fun OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn(): OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Vurdering
}

Expand Down Expand Up @@ -64,6 +64,7 @@ internal class VilkårsvurderingFactory(
return OmsorgsyterErForelderTilMottakerAvHjelpestønad.vilkarsVurder(grunnlag.forFamilierelasjon())
}

//TODO dette gir i praksis ikke noe ut over det vi får fra gyldig omsorgsarbeid - vurder å slett
override fun OmsorgsyterMottarBarnetrgyd(): OmsorgsyterMottarBarnetrgyd.Vurdering {
return OmsorgsyterMottarBarnetrgyd.vilkarsVurder(grunnlag.forMottarBarnetrygd())
}
Expand All @@ -84,7 +85,7 @@ internal class VilkårsvurderingFactory(
return OmsorgsyterHarIkkeDødsdato.vilkarsVurder(grunnlag.forOmsorgsyterHarIkkeDødsdato())
}

override fun OmsorgsyterMottarPensjonEllerUføretrygdIEøs(): OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs.Vurdering {
override fun OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs(): OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs.Vurdering {
return OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs.vilkarsVurder(grunnlag.forOmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs())
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ internal data class MedlemIFolketrygden(
internal fun MedlemIFolketrygden.toDomain(): OmsorgsyterErMedlemIFolketrygden.Grunnlag {
return OmsorgsyterErMedlemIFolketrygden.Grunnlag(
medlemskapsgrunnlag = medlemskapsvurdering.toDomain(),
omsorgsytersOmsorgsmåneder = omsorgsytersOmsorgsmåneder.toDomain(),
omsorgsmåneder = omsorgsytersOmsorgsmåneder.toDomain(),
antallMånederRegel = antallMånederRegel.toDomain(),
landstilknytningMåneder = Landstilknytningmåneder(landstilknytningmåneder.toDomain())
)
Expand All @@ -44,7 +44,7 @@ internal fun MedlemIFolketrygden.toDomain(): OmsorgsyterErMedlemIFolketrygden.Gr
internal fun OmsorgsyterErMedlemIFolketrygden.Grunnlag.toDb(): MedlemIFolketrygden {
return MedlemIFolketrygden(
medlemskapsvurdering = medlemskapsgrunnlag.toDb(),
omsorgsytersOmsorgsmåneder = omsorgsytersOmsorgsmåneder.toDb(),
omsorgsytersOmsorgsmåneder = omsorgsmåneder().toDb(),
antallMånederRegel = antallMånederRegel.toDb(),
landstilknytningmåneder = landstilknytningMåneder.toDb()
)
Expand Down
Loading

0 comments on commit 78795bc

Please sign in to comment.