Skip to content

Commit

Permalink
Bytt til tidslinjebibliotek fra familie-felles (#5086)
Browse files Browse the repository at this point in the history
### 💰 Hva skal gjøres, og hvorfor?

Favro: NAV-23270

Fortsettelse av #5083 
Bytter ut tidslinje fra ba-sak med tidslinje fra familie-felles enkelte
steder.
Holder PR'ene små, så de skal være lette å lese.
Bør leses commit for commit.
Det er noe duplikatkode, men dette vil fjernes i neste PR
  • Loading branch information
MagnusTonnessen authored Feb 19, 2025
1 parent 2aec13f commit 27d9f65
Show file tree
Hide file tree
Showing 12 changed files with 167 additions and 117 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package no.nav.familie.ba.sak.kjerne.beregning

import no.nav.familie.ba.sak.common.erTilogMed3ÅrTidslinje
import no.nav.familie.ba.sak.common.Feil
import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned
import no.nav.familie.ba.sak.common.sisteDagIInneværendeMåned
import no.nav.familie.ba.sak.common.toYearMonth
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.domene.YtelseType
Expand All @@ -12,23 +13,26 @@ import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.Person
import no.nav.familie.ba.sak.kjerne.personident.Aktør
import no.nav.familie.ba.sak.kjerne.tidslinje.Periode
import no.nav.familie.ba.sak.kjerne.tidslinje.Tidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.joinIkkeNull
import no.nav.familie.ba.sak.kjerne.tidslinje.tidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Måned
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.tilYearMonth
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.erTilogMed3ÅrTidslinje
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.joinIkkeNull
import no.nav.familie.tidslinje.tilTidslinje
import no.nav.familie.tidslinje.utvidelser.tilPerioderIkkeNull
import java.math.BigDecimal
import java.time.YearMonth
import no.nav.familie.tidslinje.Periode as FamilieFellesPeriode
import no.nav.familie.tidslinje.Tidslinje as FamilieFellesTidslinje

fun Iterable<AndelTilkjentYtelse>.tilSeparateTidslinjerForBarna(): Map<Aktør, Tidslinje<AndelTilkjentYtelse, Måned>> =
fun Iterable<AndelTilkjentYtelse>.tilSeparateTidslinjerForBarna(): Map<Aktør, FamilieFellesTidslinje<AndelTilkjentYtelse>> =
this
.filter { !it.erSøkersAndel() }
.groupBy { it.aktør }
.mapValues { (_, andeler) -> tidslinje { andeler.map { it.tilPeriode() } } }
.mapValues { (_, andeler) -> andeler.map { it.tilPeriode() }.tilTidslinje() }

fun Map<Aktør, Tidslinje<AndelTilkjentYtelse, Måned>>.tilAndelerTilkjentYtelse(): List<AndelTilkjentYtelse> = this.values.flatMap { it.tilAndelTilkjentYtelse() }
fun Map<Aktør, FamilieFellesTidslinje<AndelTilkjentYtelse>>.tilAndelerTilkjentYtelse(): List<AndelTilkjentYtelse> = this.values.flatMap { it.tilAndelTilkjentYtelse() }

fun Iterable<Tidslinje<AndelTilkjentYtelse, Måned>>.tilAndelerTilkjentYtelse(): List<AndelTilkjentYtelse> = this.flatMap { it.tilAndelTilkjentYtelse() }

Expand All @@ -42,12 +46,22 @@ fun Tidslinje<AndelTilkjentYtelse, Måned>.tilAndelTilkjentYtelse(): List<AndelT
)
}.filterNotNull()

fun FamilieFellesTidslinje<AndelTilkjentYtelse>.tilAndelTilkjentYtelse(): List<AndelTilkjentYtelse> =
this
.tilPerioderIkkeNull()
.map {
it.verdi.medPeriode(
it.fom?.toYearMonth(),
it.tom?.toYearMonth(),
)
}

fun AndelTilkjentYtelse.tilPeriode() =
Periode(
this.stønadFom.tilTidspunkt(),
this.stønadTom.tilTidspunkt(),
FamilieFellesPeriode(
// Ta bort periode, slik at det ikke blir med på innholdet som vurderes for likhet
this.medPeriode(null, null),
verdi = this.medPeriode(null, null),
fom = this.stønadFom.førsteDagIInneværendeMåned(),
tom = this.stønadTom.sisteDagIInneværendeMåned(),
)

fun AndelTilkjentYtelse.medPeriode(
Expand Down Expand Up @@ -84,7 +98,7 @@ fun Iterable<AndelTilkjentYtelse>.tilFamilieFellesTidslinjeForSøkersYtelse(ytel
)
}.tilTidslinje()

fun Map<Aktør, Tidslinje<AndelTilkjentYtelse, Måned>>.kunAndelerTilOgMed3År(barna: List<Person>): Map<Aktør, Tidslinje<AndelTilkjentYtelse, Måned>> {
fun Map<Aktør, FamilieFellesTidslinje<AndelTilkjentYtelse>>.kunAndelerTilOgMed3År(barna: List<Person>): Map<Aktør, FamilieFellesTidslinje<AndelTilkjentYtelse>> {
val barnasErInntil3ÅrTidslinjer = barna.associate { it.aktør to erTilogMed3ÅrTidslinje(it.fødselsdato) }

// For hvert barn kombiner andel-tidslinjen med 3-års-tidslinjen. Resultatet er andelene når barna er inntil 3 år
Expand Down Expand Up @@ -131,6 +145,24 @@ fun Tidslinje<AndelTilkjentYtelseForTidslinje, Måned>.tilAndelerTilkjentYtelse(
)
}

fun FamilieFellesTidslinje<AndelTilkjentYtelseForTidslinje>.tilAndelerTilkjentYtelse(tilkjentYtelse: TilkjentYtelse) =
tilPerioderIkkeNull()
.map {
AndelTilkjentYtelse(
behandlingId = tilkjentYtelse.behandling.id,
tilkjentYtelse = tilkjentYtelse,
aktør = it.verdi.aktør,
type = it.verdi.ytelseType,
kalkulertUtbetalingsbeløp = it.verdi.beløp,
nasjonaltPeriodebeløp = it.verdi.nasjonaltPeriodebeløp,
differanseberegnetPeriodebeløp = it.verdi.differanseberegnetPeriodebeløp,
sats = it.verdi.sats,
prosent = it.verdi.prosent,
stønadFom = it.fom?.toYearMonth() ?: throw Feil("Fra og med-dato kan ikke være null i AndelTilkjentYtelse"),
stønadTom = it.tom?.toYearMonth() ?: throw Feil("Til og med-dato kan ikke være null i AndelTilkjentYtelse"),
)
}

/**
* Lager tidslinje med AndelTilkjentYtelseForTidslinje-objekter, som derfor er "trygg" mtp DB-endringer
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package no.nav.familie.ba.sak.kjerne.beregning
import no.nav.familie.ba.sak.common.Feil
import no.nav.familie.ba.sak.common.Periode
import no.nav.familie.ba.sak.common.erUnder6ÅrTidslinje
import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned
import no.nav.familie.ba.sak.common.isBetween
import no.nav.familie.ba.sak.common.sisteDagIMåned
import no.nav.familie.ba.sak.common.toYearMonth
import no.nav.familie.ba.sak.kjerne.beregning.domene.Sats
import no.nav.familie.ba.sak.kjerne.beregning.domene.SatsType
Expand All @@ -18,8 +20,10 @@ import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companio
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilTidspunktEllerUendeligSent
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilTidspunktEllerUendeligTidlig
import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.beskjær
import no.nav.familie.tidslinje.tilTidslinje
import java.time.LocalDate
import no.nav.familie.ba.sak.kjerne.tidslinje.Periode as TidslinjePeriode
import no.nav.familie.tidslinje.Periode as FamilieFellesTidslinjePeriode

object SatsTidspunkt {
val senesteSatsTidspunkt: LocalDate = LocalDate.MAX
Expand Down Expand Up @@ -104,6 +108,19 @@ fun satstypeTidslinje(satsType: SatsType) =
}
}

fun satstypeFamilieFellesTidslinje(satsType: SatsType) =
SatsService
.finnAlleSatserFor(satsType)
.map {
val fom = if (it.gyldigFom == LocalDate.MIN) null else it.gyldigFom.førsteDagIInneværendeMåned()
val tom = if (it.gyldigTom == LocalDate.MAX) null else it.gyldigTom.sisteDagIMåned()
FamilieFellesTidslinjePeriode(
verdi = it.beløp,
fom = fom,
tom = tom,
)
}.tilTidslinje()

fun lagOrdinærTidslinje(barn: Person): Tidslinje<Int, Måned> {
val orbaTidslinje = satstypeTidslinje(SatsType.ORBA)
val tilleggOrbaTidslinje = satstypeTidslinje(SatsType.TILLEGG_ORBA).filtrerMed(erUnder6ÅrTidslinje(barn))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,18 @@ package no.nav.familie.ba.sak.kjerne.beregning

import no.nav.familie.ba.sak.common.FunksjonellFeil
import no.nav.familie.ba.sak.common.Utils.avrundetHeltallAvProsent
import no.nav.familie.ba.sak.kjerne.beregning.UtvidetBarnetrygdUtil.filtrertForPerioderBarnaBorMedSøker
import no.nav.familie.ba.sak.kjerne.beregning.UtvidetBarnetrygdUtil.familieFellesTidslinjeFiltrertForPerioderBarnaBorMedSøker
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.domene.SatsType
import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.domene.YtelseType
import no.nav.familie.ba.sak.kjerne.personident.Aktør
import no.nav.familie.ba.sak.kjerne.tidslinje.Tidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.kombinerMedKunVerdi
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.kombinerUtenNullOgIkkeTom
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Måned
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.kombinerKunVerdiMed
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.kombinerUtenNullOgIkkeTom
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.VilkårsvurderingForskyvningUtils.tilForskjøvetTidslinjeForOppfyltVilkårForVoksenPerson
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.Vilkår
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.VilkårResultat
import no.nav.familie.tidslinje.Tidslinje

data class UtvidetBarnetrygdGenerator(
val behandlingId: Long,
Expand All @@ -23,7 +22,7 @@ data class UtvidetBarnetrygdGenerator(
fun lagUtvidetBarnetrygdAndeler(
utvidetVilkår: List<VilkårResultat>,
andelerBarna: List<AndelTilkjentYtelse>,
perioderBarnaBorMedSøkerTidslinje: Map<Aktør, Tidslinje<Boolean, Måned>>,
perioderBarnaBorMedSøkerTidslinje: Map<Aktør, Tidslinje<Boolean>>,
): List<AndelTilkjentYtelse> {
if (utvidetVilkår.isEmpty() || andelerBarna.isEmpty()) return emptyList()

Expand All @@ -32,17 +31,17 @@ data class UtvidetBarnetrygdGenerator(
val utvidetVilkårTidslinje = utvidetVilkår.tilForskjøvetTidslinjeForOppfyltVilkårForVoksenPerson(Vilkår.UTVIDET_BARNETRYGD)

val barnasAndelerFiltrertForPerioderBarnaBorMedSøker =
andelerBarna.tilSeparateTidslinjerForBarna().filtrertForPerioderBarnaBorMedSøker(perioderBarnaBorMedSøkerTidslinje)
andelerBarna.tilSeparateTidslinjerForBarna().familieFellesTidslinjeFiltrertForPerioderBarnaBorMedSøker(perioderBarnaBorMedSøkerTidslinje)

val størsteProsentTidslinje =
barnasAndelerFiltrertForPerioderBarnaBorMedSøker.values
.kombinerUtenNullOgIkkeTom { andeler -> andeler.maxOf { it.prosent } }

val utvidetAndeler =
utvidetVilkårTidslinje
.kombinerMedKunVerdi(
.kombinerKunVerdiMed(
størsteProsentTidslinje,
satstypeTidslinje(SatsType.UTVIDET_BARNETRYGD),
satstypeFamilieFellesTidslinje(SatsType.UTVIDET_BARNETRYGD),
) { _, prosent, sats ->
val nasjonaltPeriodebeløp = sats.avrundetHeltallAvProsent(prosent)
AndelTilkjentYtelseForTidslinje(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,16 @@ import no.nav.familie.ba.sak.kjerne.tidslinje.Tidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.leftJoin
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Måned
import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.map
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.mapVerdiNullable
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.VilkårsvurderingForskyvningUtils.lagForskjøvetFamilieFellesTidslinjeForOppfylteVilkår
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.VilkårsvurderingForskyvningUtils.lagForskjøvetTidslinjeForOppfylteVilkår
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.PersonResultat
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.UtdypendeVilkårsvurdering
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.Vilkår
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.VilkårResultat
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.Vilkårsvurdering
import no.nav.familie.tidslinje.leftJoin
import no.nav.familie.tidslinje.Tidslinje as FamilieFellesTidslinje

object UtvidetBarnetrygdUtil {
internal fun beregnTilkjentYtelseUtvidet(
Expand All @@ -37,7 +41,7 @@ object UtvidetBarnetrygdUtil {
).lagUtvidetBarnetrygdAndeler(
utvidetVilkår = utvidetVilkår,
andelerBarna = andelerTilkjentYtelseBarnaMedEtterbetaling3ÅrEller3MndEndringer.map { it.andel },
perioderBarnaBorMedSøkerTidslinje = personResultater.tilPerioderBarnaBorMedSøkerTidslinje(),
perioderBarnaBorMedSøkerTidslinje = personResultater.tilPerioderBarnaBorMedSøkerFamilieFellesTidslinje(),
)

return TilkjentYtelseUtils.oppdaterTilkjentYtelseMedEndretUtbetalingAndeler(
Expand All @@ -62,6 +66,22 @@ object UtvidetBarnetrygdUtil {
}
}

fun Set<PersonResultat>.tilPerioderBarnaBorMedSøkerFamilieFellesTidslinje(): Map<Aktør, FamilieFellesTidslinje<Boolean>> =
this.associate { personResultat ->
personResultat.aktør to
personResultat.vilkårResultater
.lagForskjøvetFamilieFellesTidslinjeForOppfylteVilkår(Vilkår.BOR_MED_SØKER)
.mapVerdiNullable { vilkårResultat ->
vilkårResultat?.utdypendeVilkårsvurderinger?.none {
it in
listOf(
UtdypendeVilkårsvurdering.BARN_BOR_I_EØS_MED_ANNEN_FORELDER,
UtdypendeVilkårsvurdering.BARN_BOR_I_STORBRITANNIA_MED_ANNEN_FORELDER,
)
}
}
}

fun Map<Aktør, Tidslinje<AndelTilkjentYtelse, Måned>>.filtrertForPerioderBarnaBorMedSøker(perioderBarnaBorMedSøkerTidslinje: Map<Aktør, Tidslinje<Boolean, Måned>>): Map<Aktør, Tidslinje<AndelTilkjentYtelse, Måned>> =
this.leftJoin(perioderBarnaBorMedSøkerTidslinje) { andel, barnBorMedSøker ->
when (barnBorMedSøker) {
Expand All @@ -70,6 +90,14 @@ object UtvidetBarnetrygdUtil {
}
}

fun Map<Aktør, FamilieFellesTidslinje<AndelTilkjentYtelse>>.familieFellesTidslinjeFiltrertForPerioderBarnaBorMedSøker(perioderBarnaBorMedSøkerTidslinje: Map<Aktør, FamilieFellesTidslinje<Boolean>>): Map<Aktør, FamilieFellesTidslinje<AndelTilkjentYtelse>> =
this.leftJoin(perioderBarnaBorMedSøkerTidslinje) { andel, barnBorMedSøker ->
when (barnBorMedSøker) {
true -> andel
else -> null
}
}

internal fun finnUtvidetVilkår(vilkårsvurdering: Vilkårsvurdering): List<VilkårResultat> {
val utvidetVilkårResultater =
vilkårsvurdering.personResultater
Expand Down
Loading

0 comments on commit 27d9f65

Please sign in to comment.