Skip to content

Commit

Permalink
Initial implementation of manuell for fellesbarn
Browse files Browse the repository at this point in the history
  • Loading branch information
jacob-meidell committed Nov 7, 2024
1 parent eeeec76 commit 37b6504
Show file tree
Hide file tree
Showing 17 changed files with 546 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,24 @@ class KontrollbehandlingRepo(
).toDomain()
}

fun finnForOmsorgsytersAndreBarn(
omsorgsyter: String,
ar: Int,
andreBarnEnnOmsorgsmottaker: List<String>,
referanse: String,
): List<FullførtBehandling> {
return jdbcTemplate.query(
"""select * from kontrollbehandling where omsorgsyter <> :omsorgsyter and omsorgs_ar = :ar and omsorgsmottaker in (:andrebarn) and referanse = :referanse""",
mapOf(
"omsorgsyter" to omsorgsyter,
"ar" to ar,
"andrebarn" to andreBarnEnnOmsorgsmottaker.ifEmpty { "('')" },
"referanse" to referanse,
),
BehandlingRowMapper()
).toDomain()
}


internal class KontrollbehandlingRowMapper : RowMapper<Kontrollbehandling> {
override fun mapRow(rs: ResultSet, rowNum: Int): Kontrollbehandling {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,18 +38,27 @@ class KontrollbehandlingServiceImpl(
grunnlag = it,
finnForOmsorgsyterOgÅr = {
kontrollbehandlingRepo.finnForOmsorgsyterOgAr(
it.omsorgsyter.fnr,
it.omsorgsAr,
kontrollbehandling.referanse,
fnr = it.omsorgsyter.fnr,
ar = it.omsorgsAr,
referanse = kontrollbehandling.referanse,
)
},
finnForOmsorgsmottakerOgÅr = {
kontrollbehandlingRepo.finnForOmsorgsmottakerOgAr(
it.omsorgsmottaker.fnr,
it.omsorgsAr,
kontrollbehandling.referanse,
omsorgsmottaker = it.omsorgsmottaker.fnr,
ar = it.omsorgsAr,
referanse = kontrollbehandling.referanse,
)
},
finnForOmsorgsytersAndreBarnOgÅr = {
kontrollbehandlingRepo.finnForOmsorgsytersAndreBarn(
omsorgsyter = it.omsorgsyter.fnr,
ar = it.omsorgsAr,
andreBarnEnnOmsorgsmottaker = it.omsorgsyter.finnAndreBarnEnn(it.omsorgsmottaker.fnr)
.map { it.ident },
referanse = kontrollbehandling.referanse,
)
}
),
meldingId = kontrollbehandling.kontrollmeldingId
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oms
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.OgVurdering
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.OmsorgsmottakerOppfyllerAlderskravForBarnetrygd
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.OmsorgsmottakerOppfyllerAlderskravForHjelpestønad
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.OmsorgsopptjeningKanKunGodskrivesEnOmsorgsyterPerÅr
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.OmsorgsopptjeningKanKunGodskrivesForEtBarnPerÅr
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.OmsorgsyterErForelderTilMottakerAvHjelpestønad
Expand Down Expand Up @@ -53,6 +54,7 @@ class OmsorgsarbeidProcessingMetrikker(registry: MeterRegistry) : Metrikker<List
private val omsorgsyterHarDødsdato = registry.counter("avslag", "antall", "OmsorgsyterHarIkkeDodsdato")
private val omsorgsyterMottarIkkePensjonEllerUføretrygdIEøs = registry.counter("avslag", "antall", "omsorgsyterMottarIkkePensjonEllerUføretrygdIEøs")

private val omsorgsytersBarnIkkeGodskrevetAndreOmsorgsytere = registry.counter("avslag", "antall", "OmsorgsyterHarIkkeBarnGodskrevetAndreOmsorgsytere")


override fun oppdater(lambda: () -> List<FullførteBehandlinger?>?): List<FullførteBehandlinger?>? {
Expand Down Expand Up @@ -80,6 +82,7 @@ class OmsorgsarbeidProcessingMetrikker(registry: MeterRegistry) : Metrikker<List
is OmsorgsyterErikkeOmsorgsmottaker.Vurdering -> omsorgsyterErIkkeOmsorgsmottaker.increment()
is OmsorgsyterHarIkkeDødsdato.Vurdering -> omsorgsyterHarDødsdato.increment()
is OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs.Vurdering -> omsorgsyterMottarIkkePensjonEllerUføretrygdIEøs.increment()
is OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Vurdering -> omsorgsytersBarnIkkeGodskrevetAndreOmsorgsytere.increment()
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ data class Behandling(
vurderVilkår.OmsorgsyterErMedlemIFolketrygden(),
vurderVilkår.OmsorgsyterErIkkeOmsorgsmottaker(),
vurderVilkår.OmsorgsyterHarIkkeDødsdato(),
vurderVilkår.OmsorgsyterMottarPensjonEllerUføretrygdIEøs()
vurderVilkår.OmsorgsyterMottarPensjonEllerUføretrygdIEøs(),
vurderVilkår.OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn(),
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,14 @@ data class Familierelasjoner(
return relasjoner.singleOrNull { it.ident.ident == fnr }?.erBarn() ?: false
}

fun finnBarn(): List<Ident> {
return relasjoner.filter { it.erBarn() }.map { it.ident }
}

fun finnAndreBarnEnn(eksklusiv: String): List<Ident> {
return relasjoner.filter { it.erBarn() }.map { it.ident }.filterNot { it.ident == eksklusiv }
}

fun finnForeldre(): Foreldre {
val far = relasjoner.singleOrNull { it.erFar() }
val mor = relasjoner.singleOrNull { it.erMor() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,17 @@ sealed class JuridiskHenvisning(
tekst = "Forhøyet hjelpestønad ytes til et medlem under 18 år som har vesentlig større behov for tilsyn, pleie og annen hjelp enn det som hjelpestønad etter § 6-4 dekker"
)

data object Forskrift_Om_Alderspensjon_I_Folketrygden_Kap_3_Paragraf_3_Første_Ledd_Første_Punktum :
JuridiskHenvisning(
kortTittel = "Forskrift om alderspensjon i folketrygden",
dato = "FOR-2009-12-22-1810",
kapittel = 3,
paragraf = 3,
ledd = 1,
punktum = 1,
tekst = "Med omsorgsyter menes en person som har den daglige omsorgen for barn og foreldreansvaret etter barneloven."
)

data object Forskrift_Om_Alderspensjon_I_Folketrygden_Kap_3_Paragraf_4_Første_Ledd_Første_Punktum :
JuridiskHenvisning(
kortTittel = "Forskrift om alderspensjon i folketrygden",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model

import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.model.Oppgave
import java.util.UUID

object OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn :
ParagrafVilkår<OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Grunnlag>() {
override fun vilkarsVurder(grunnlag: Grunnlag): Vurdering {
return Vurdering(
grunnlag = grunnlag,
utfall = bestemUtfall(grunnlag),
)
}

override fun <T : Vilkar<Grunnlag>> T.bestemUtfall(grunnlag: Grunnlag): VilkårsvurderingUtfall {
return setOf(
JuridiskHenvisning.Forskrift_Om_Alderspensjon_I_Folketrygden_Kap_3_Paragraf_3_Første_Ledd_Første_Punktum,
JuridiskHenvisning.Forskrift_Om_Alderspensjon_I_Folketrygden_Kap_3_Paragraf_4_Første_Ledd_Første_Punktum,
).let { referanser ->
when {
grunnlag.erManuell() -> {
VilkårsvurderingUtfall.Ubestemt(referanser)
}

else -> {
VilkårsvurderingUtfall.Innvilget.Vilkår(referanser)
}
}
}
}

data class Vurdering(
override val grunnlag: Grunnlag,
override val utfall: VilkårsvurderingUtfall
) : ParagrafVurdering<Grunnlag>() {
override fun hentOppgaveopplysninger(behandling: FullførtBehandling): Oppgaveopplysninger {
return Oppgaveopplysninger.Generell(
oppgavemottaker = behandling.omsorgsyter,
oppgaveTekst = Oppgave.annenForelderInnvilgetOmsorgsopptjeningForAnnetFellesbarn(
omsorgsmottaker = behandling.omsorgsmottaker,
annenForelderOgBarn = grunnlag.finnManuelle().map { it.omsorgsyter to it.omsorgsmottaker }.toSet()
)
)
}
}

data class Grunnlag(
val omsorgsmottaker: String,
val omsorgsår: Int,
val behandlinger: List<FullførtBehandlingForAnnenOmsorgsmottaker>
) : ParagrafGrunnlag() {
init {
require(behandlinger.none { it.omsorgsmottaker == omsorgsmottaker }) { "Skal ikke inneholde behandlinger for omsorgsmottaker" }
}

data class FullførtBehandlingForAnnenOmsorgsmottaker(
val behandlingsId: UUID,
val omsorgsyter: String,
val omsorgsmottaker: String,
val omsorgsår: Int,
val erForelderTilOmsorgsmottaker: Boolean,
val utfall: BehandlingUtfall
)

fun erManuell(): Boolean {
return finnManuelle().isNotEmpty()
}

fun finnManuelle(): List<FullførtBehandlingForAnnenOmsorgsmottaker> {
return behandlinger.filter { it.omsorgsår == omsorgsår && it.erForelderTilOmsorgsmottaker && (it.utfall.erInnvilget() || it.utfall.erManuell()) }
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model

import java.lang.RuntimeException
import java.time.LocalDate
import java.time.Month

Expand Down Expand Up @@ -43,6 +42,14 @@ class Person(
return familierelasjoner.finnForeldre()
}

fun finnBarn(): List<Ident> {
return familierelasjoner.finnBarn()
}

fun finnAndreBarnEnn(eksklusiv: String): List<Ident> {
return finnBarn().filterNot { it.ident == eksklusiv }
}

fun identifisertAv(fnr: String): Boolean {
return identhistorikk.identifiseresAv(fnr)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@ interface VurderVilkår {
fun OmsorgsyterErIkkeOmsorgsmottaker(): OmsorgsyterErikkeOmsorgsmottaker.Vurdering
fun OmsorgsyterHarIkkeDødsdato(): OmsorgsyterHarIkkeDødsdato.Vurdering
fun OmsorgsyterMottarPensjonEllerUføretrygdIEøs(): OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs.Vurdering
fun OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn(): OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Vurdering
}

internal class VilkårsvurderingFactory(
private val grunnlag: OmsorgsopptjeningGrunnlag,
private val finnForOmsorgsyterOgÅr: () -> List<FullførtBehandling>,
private val finnForOmsorgsmottakerOgÅr: () -> List<FullførtBehandling>
private val finnForOmsorgsmottakerOgÅr: () -> List<FullførtBehandling>,
private val finnForOmsorgsytersAndreBarnOgÅr: () -> List<FullførtBehandling>,
) : VurderVilkår {
override fun OmsorgsyterOppfyllerAlderskrav(): OmsorgsyterOppfyllerAlderskrav.Vurdering {
return OmsorgsyterOppfyllerAlderskrav.vilkarsVurder(grunnlag.forAldersvurderingOmsorgsyter())
Expand Down Expand Up @@ -86,6 +88,30 @@ internal class VilkårsvurderingFactory(
return OmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs.vilkarsVurder(grunnlag.forOmsorgsyterMottarIkkePensjonEllerUføretrygdIEøs())
}

override fun OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn(): OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Vurdering {
return OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.vilkarsVurder(
finnForOmsorgsytersAndreBarnOgÅr().map {
require(it.omsorgsyter != grunnlag.omsorgsyter.fnr) { "Forventer kun behandlinger for andre omsorgsytere" }
require(it.omsorgsmottaker != grunnlag.omsorgsmottaker.fnr) { "Forventer kun behandlinger for andre omsorgsmottakere" }
OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Grunnlag.FullførtBehandlingForAnnenOmsorgsmottaker(
behandlingsId = it.id,
omsorgsyter = it.omsorgsyter,
omsorgsmottaker = it.omsorgsmottaker,
omsorgsår = it.omsorgsAr,
erForelderTilOmsorgsmottaker = it.grunnlag.omsorgsyter.erForelderAv(grunnlag.omsorgsmottaker.fnr),
utfall = it.utfall,
)
}.let {
OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Grunnlag(
omsorgsmottaker = grunnlag.omsorgsmottaker.fnr,
omsorgsår = grunnlag.omsorgsAr,
behandlinger = it

)
}
)
}

override fun OmsorgsyterHarTilstrekkeligOmsorgsarbeid(): OmsorgsyterHarTilstrekkeligOmsorgsarbeid.Vurdering {
return OmsorgsyterHarTilstrekkeligOmsorgsarbeid.vilkarsVurder(grunnlag.forTilstrekkeligOmsorgsarbeid())

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,22 @@ class BehandlingRepo(
BehandlingRowMapper()
).toDomain()
}

fun finnForOmsorgsytersAndreBarn(
omsorgsyter: String,
ar: Int,
andreBarnEnnOmsorgsmottaker: List<String>
): List<FullførtBehandling> {
return jdbcTemplate.query(
"""select * from behandling where omsorgsyter <> :omsorgsyter and omsorgs_ar = :ar and omsorgsmottaker in (:andrebarn)""",
mapOf(
"omsorgsyter" to omsorgsyter,
"ar" to ar,
"andrebarn" to andreBarnEnnOmsorgsmottaker.ifEmpty { "('')" }
),
BehandlingRowMapper()
).toDomain()
}
}

internal class BehandlingRowMapper : RowMapper<BehandlingDb> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.repository

import com.fasterxml.jackson.annotation.JsonTypeInfo
import com.fasterxml.jackson.annotation.JsonTypeName
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn
import java.util.UUID

@JsonTypeName("OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDb")
internal data class OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDb(
val grunnlag: OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbGrunnlag,
val utfall: VilkårsvurderingUtfallDb,
) : VilkårsvurderingDb()


internal fun OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Vurdering.toDb(): OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDb {
return OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDb(
grunnlag = grunnlag.toDb(),
utfall = utfall.toDb()
)
}

internal fun OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDb.toDomain(): OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Vurdering {
return OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Vurdering(
grunnlag = grunnlag.toDomain(),
utfall = utfall.toDomain()
)
}


@JsonTypeName("OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbGrunnlag")
internal data class OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbGrunnlag(
val omsorgsmottaker: String,
val omsorgsAr: Int,
val behandlinger: List<OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbFullførtbehandling>
) : GrunnlagVilkårsvurderingDb()

internal fun OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Grunnlag.toDb(): OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbGrunnlag {
return OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbGrunnlag(
omsorgsmottaker = omsorgsmottaker,
omsorgsAr = omsorgsår,
behandlinger = behandlinger.toDb()
)
}

internal fun OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbGrunnlag.toDomain(): OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Grunnlag {
return OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Grunnlag(
omsorgsmottaker = omsorgsmottaker,
omsorgsår = omsorgsAr,
behandlinger = behandlinger.toDomain()
)
}

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type",
)
@JsonTypeName("OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbFullførtbehandling")
internal data class OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbFullførtbehandling(
val behandlingsId: UUID,
val omsorgsyter: String,
val omsorgsmottaker: String,
val år: Int,
val erForelderTilOmsorgsmottaker: Boolean,
val utfall: BehandlingsutfallDb,
)

internal fun List<OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Grunnlag.FullførtBehandlingForAnnenOmsorgsmottaker>.toDb(): List<OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbFullførtbehandling> {
return map { it.toDb() }
}

internal fun List<OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbFullførtbehandling>.toDomain(): List<OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Grunnlag.FullførtBehandlingForAnnenOmsorgsmottaker> {
return map { it.toDomain() }
}

internal fun OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Grunnlag.FullførtBehandlingForAnnenOmsorgsmottaker.toDb(): OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbFullførtbehandling {
return OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbFullførtbehandling(
behandlingsId = behandlingsId,
omsorgsyter = omsorgsyter,
omsorgsmottaker = omsorgsmottaker,
år = omsorgsår,
erForelderTilOmsorgsmottaker = erForelderTilOmsorgsmottaker,
utfall = utfall.toDb(),
)
}

internal fun OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarnDbFullførtbehandling.toDomain(): OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Grunnlag.FullførtBehandlingForAnnenOmsorgsmottaker {
return OmsorgsopptjeningIkkeInnvilgetAnnetFellesbarn.Grunnlag.FullførtBehandlingForAnnenOmsorgsmottaker(
behandlingsId = behandlingsId,
omsorgsyter = omsorgsyter,
omsorgsmottaker = omsorgsmottaker,
omsorgsår = år,
erForelderTilOmsorgsmottaker = erForelderTilOmsorgsmottaker,
utfall = utfall.toDomain()
)
}
Loading

0 comments on commit 37b6504

Please sign in to comment.