Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ta i bruk tidslinje fra familie-felles i VilkårsvurderingTidslinjer #5083

Merged
merged 15 commits into from
Feb 18, 2025
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,12 @@ import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelseReposito
import no.nav.familie.ba.sak.kjerne.eøs.felles.BehandlingId
import no.nav.familie.ba.sak.kjerne.eøs.vilkårsvurdering.VilkårsvurderingTidslinjeService
import no.nav.familie.ba.sak.kjerne.logg.LoggService
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.innholdForTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.verdiPåTidspunkt
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.Regelverk
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.Vilkår
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.VilkårsvurderingRepository
import org.springframework.stereotype.Service
import java.time.YearMonth
import java.time.LocalDate

@Service
class BehandlingstemaService(
Expand Down Expand Up @@ -87,14 +86,14 @@ class BehandlingstemaService(
tidslinjer
.barnasTidslinjer()
.values
.map { it.egetRegelverkResultatTidslinje.innholdForTidspunkt(YearMonth.now(clockProvider.get()).tilTidspunkt()) }
.map { it.egetRegelverkResultatTidslinje.verdiPåTidspunkt(LocalDate.now(clockProvider.get())) }

val etBarnHarMinstEnLøpendeEØSPeriode = alleBarnasTidslinjerSomHarLøpendePeriode.any { it.innhold?.regelverk == Regelverk.EØS_FORORDNINGEN }
val etBarnHarMinstEnLøpendeEØSPeriode = alleBarnasTidslinjerSomHarLøpendePeriode.any { it?.regelverk == Regelverk.EØS_FORORDNINGEN }
if (etBarnHarMinstEnLøpendeEØSPeriode) {
return BehandlingKategori.EØS
}

val etBarnHarMinstEnLøpendeNasjonalPeriode = alleBarnasTidslinjerSomHarLøpendePeriode.any { it.innhold?.regelverk == Regelverk.NASJONALE_REGLER }
val etBarnHarMinstEnLøpendeNasjonalPeriode = alleBarnasTidslinjerSomHarLøpendePeriode.any { it?.regelverk == Regelverk.NASJONALE_REGLER }
if (etBarnHarMinstEnLøpendeNasjonalPeriode) {
return BehandlingKategori.NASJONAL
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package no.nav.familie.ba.sak.kjerne.beregning

import no.nav.familie.ba.sak.common.erTilogMed3ÅrTidslinje
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.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 @@ -15,8 +17,10 @@ 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.tidslinje.tilTidslinje
import java.math.BigDecimal
import java.time.YearMonth
import no.nav.familie.tidslinje.Periode as FamilieFellesPeriode

fun Iterable<AndelTilkjentYtelse>.tilSeparateTidslinjerForBarna(): Map<Aktør, Tidslinje<AndelTilkjentYtelse, Måned>> =
this
Expand Down Expand Up @@ -68,6 +72,18 @@ fun Iterable<AndelTilkjentYtelse>.tilTidslinjeForSøkersYtelse(ytelseType: Ytels
}
}

fun Iterable<AndelTilkjentYtelse>.tilFamilieFellesTidslinjeForSøkersYtelse(ytelseType: YtelseType) =
this
.filter { it.erSøkersAndel() }
.filter { it.type == ytelseType }
.map {
FamilieFellesPeriode(
verdi = it,
fom = it.stønadFom.førsteDagIInneværendeMåned(),
tom = it.stønadTom.sisteDagIInneværendeMåned(),
)
}.tilTidslinje()

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

Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,33 @@
package no.nav.familie.ba.sak.kjerne.eøs.endringsabonnement

import no.nav.familie.ba.sak.common.ClockProvider
import no.nav.familie.ba.sak.common.sisteDagIInneværendeMåned
import no.nav.familie.ba.sak.kjerne.endretutbetaling.EndretUtbetalingAndelHentOgPersisterService
import no.nav.familie.ba.sak.kjerne.endretutbetaling.EndretUtbetalingAndelerOppdatertAbonnent
import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.EndretUtbetalingAndel
import no.nav.familie.ba.sak.kjerne.eøs.felles.BehandlingId
import no.nav.familie.ba.sak.kjerne.eøs.felles.PeriodeOgBarnSkjemaEndringAbonnent
import no.nav.familie.ba.sak.kjerne.eøs.felles.PeriodeOgBarnSkjemaRepository
import no.nav.familie.ba.sak.kjerne.eøs.felles.PeriodeOgBarnSkjemaService
import no.nav.familie.ba.sak.kjerne.eøs.felles.beregning.tilSeparateTidslinjerForBarna
import no.nav.familie.ba.sak.kjerne.eøs.felles.beregning.tilSkjemaer
import no.nav.familie.ba.sak.kjerne.eøs.felles.beregning.familieFellesTidslinjerTilSkjemaer
import no.nav.familie.ba.sak.kjerne.eøs.felles.beregning.tilSeparateFamilieFellesTidslinjerForBarna
import no.nav.familie.ba.sak.kjerne.eøs.felles.medBehandlingId
import no.nav.familie.ba.sak.kjerne.eøs.kompetanse.domene.Kompetanse
import no.nav.familie.ba.sak.kjerne.eøs.utbetaling.UtbetalingTidslinjeService
import no.nav.familie.ba.sak.kjerne.eøs.vilkårsvurdering.RegelverkResultat
import no.nav.familie.ba.sak.kjerne.eøs.vilkårsvurdering.VilkårsvurderingTidslinjeService
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.eksperimentelt.filtrer
import no.nav.familie.ba.sak.kjerne.tidslinje.eksperimentelt.filtrerIkkeNull
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.TomTidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.kombinerMed
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.leftJoin
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.outerJoin
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Måned
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.tilForrigeMåned
import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.beskjærTilOgMed
import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.forlengFremtidTilUendelig
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.tidslinjefamiliefelles.komposisjon.trimNull
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon.forlengFremtidTilUendelig
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.Regelverk
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.leftJoin
import no.nav.familie.tidslinje.outerJoin
import no.nav.familie.tidslinje.tomTidslinje
import no.nav.familie.tidslinje.utvidelser.filtrer
import no.nav.familie.tidslinje.utvidelser.filtrerIkkeNull
import no.nav.familie.tidslinje.utvidelser.kombinerMed
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import java.time.YearMonth
Expand Down Expand Up @@ -122,9 +119,9 @@ class TilpassKompetanserTilEndretUtebetalingAndelerService(

fun tilpassKompetanserTilRegelverk(
gjeldendeKompetanser: Collection<Kompetanse>,
barnaRegelverkTidslinjer: Map<Aktør, Tidslinje<RegelverkResultat, Måned>>,
utbetalesIkkeOrdinærEllerUtvidetTidslinjer: Map<Aktør, Tidslinje<Boolean, Måned>>,
annenForelderOmfattetAvNorskLovgivningTidslinje: Tidslinje<Boolean, Måned> = TomTidslinje<Boolean, Måned>(),
barnaRegelverkTidslinjer: Map<Aktør, Tidslinje<RegelverkResultat>>,
utbetalesIkkeOrdinærEllerUtvidetTidslinjer: Map<Aktør, Tidslinje<Boolean>>,
annenForelderOmfattetAvNorskLovgivningTidslinje: Tidslinje<Boolean> = tomTidslinje(),
inneværendeMåned: YearMonth,
): Collection<Kompetanse> {
val barnasEøsRegelverkTidslinjer =
Expand All @@ -136,23 +133,20 @@ fun tilpassKompetanserTilRegelverk(
else -> regelverk
}
}.mapValues { (_, tidslinjer) ->
tidslinjer.forlengFremtidTilUendelig(MånedTidspunkt.nå())
tidslinjer.trimNull().forlengFremtidTilUendelig(inneværendeMåned.sisteDagIInneværendeMåned())
}

return gjeldendeKompetanser
.tilSeparateTidslinjerForBarna()
.tilSeparateFamilieFellesTidslinjerForBarna()
.outerJoin(barnasEøsRegelverkTidslinjer) { kompetanse, eøsRegelverk ->
eøsRegelverk?.let { kompetanse ?: Kompetanse.NULL }
}.mapValues { (_, value) ->
value.kombinerMed(annenForelderOmfattetAvNorskLovgivningTidslinje) { kompetanse, annenForelderOmfattet ->
kompetanse?.copy(erAnnenForelderOmfattetAvNorskLovgivning = annenForelderOmfattet ?: false)
}
}.mapValues { (_, value) ->
val nåMåned = inneværendeMåned.tilTidspunkt()
value
.beskjærTilOgMed(nåMåned)
.forlengFremtidTilUendelig(senesteEndeligeTidspunkt = nåMåned.tilForrigeMåned())
}.tilSkjemaer()
}.mapValues { (_, tidslinje) ->
tidslinje.trimNull().forlengFremtidTilUendelig(inneværendeMåned.sisteDagIInneværendeMåned())
}.familieFellesTidslinjerTilSkjemaer()
}

fun VilkårsvurderingTidslinjeService.hentBarnasRegelverkResultatTidslinjer(behandlingId: BehandlingId) =
Expand All @@ -163,10 +157,10 @@ fun VilkårsvurderingTidslinjeService.hentBarnasRegelverkResultatTidslinjer(beha
tidslinjer.regelverkResultatTidslinje
}

private fun Map<Aktør, Tidslinje<RegelverkResultat, Måned>>.tilBarnasEøsRegelverkTidslinjer(): Map<Aktør, Tidslinje<Regelverk, Måned>> =
private fun Map<Aktør, Tidslinje<RegelverkResultat>>.tilBarnasEøsRegelverkTidslinjer(): Map<Aktør, Tidslinje<Regelverk>> =
this.mapValues { (_, regelverkResultatTidslinje) ->
regelverkResultatTidslinje
.map { it?.regelverk }
.mapVerdiNullable { it?.regelverk }
.filtrer { it == Regelverk.EØS_FORORDNINGEN }
.filtrerIkkeNull()
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package no.nav.familie.ba.sak.kjerne.eøs.felles.beregning

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.eøs.felles.PeriodeOgBarnSkjema
import no.nav.familie.ba.sak.kjerne.eøs.felles.PeriodeOgBarnSkjemaEntitet
import no.nav.familie.ba.sak.kjerne.eøs.felles.utenPeriode
Expand All @@ -11,6 +14,10 @@ import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Måned
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.tidspunkt.tilYearMonthEllerNull
import no.nav.familie.tidslinje.tilTidslinje
import no.nav.familie.tidslinje.utvidelser.tilPerioder
import no.nav.familie.tidslinje.Periode as FamilieFellesPeriode
import no.nav.familie.tidslinje.Tidslinje as FamilieFellesTidslinje

fun <S : PeriodeOgBarnSkjema<S>> S.tilTidslinje() = listOf(this).tilTidslinje()

Expand Down Expand Up @@ -46,11 +53,35 @@ fun <S : PeriodeOgBarnSkjema<S>> Iterable<S>.tilSeparateTidslinjerForBarna(): Ma
}
}

fun <S : PeriodeOgBarnSkjema<S>> Iterable<S>.tilSeparateFamilieFellesTidslinjerForBarna(): Map<Aktør, FamilieFellesTidslinje<S>> {
val skjemaer = this
if (skjemaer.toList().isEmpty()) return emptyMap()

val alleBarnAktørIder = skjemaer.map { it.barnAktører }.reduce { akk, neste -> akk + neste }

return alleBarnAktørIder.associateWith { aktør ->
skjemaer
.filter { it.barnAktører.contains(aktør) }
.map {
FamilieFellesPeriode(
fom = it.fom?.førsteDagIInneværendeMåned(),
tom = it.tom?.sisteDagIInneværendeMåned(),
verdi = it.kopier(fom = null, tom = null, barnAktører = setOf(aktør)),
)
}.tilTidslinje()
}
}

fun <S : PeriodeOgBarnSkjemaEntitet<S>> Map<Aktør, Tidslinje<S, Måned>>.tilSkjemaer() =
this
.flatMap { (aktør, tidslinjer) -> tidslinjer.tilSkjemaer(aktør) }
.slåSammen()

fun <S : PeriodeOgBarnSkjemaEntitet<S>> Map<Aktør, FamilieFellesTidslinje<S>>.familieFellesTidslinjerTilSkjemaer() =
this
.flatMap { (aktør, tidslinjer) -> tidslinjer.tilSkjemaer(aktør) }
.slåSammen()

private fun <S : PeriodeOgBarnSkjema<S>> Tidslinje<S, Måned>.tilSkjemaer(aktør: Aktør) =
this.perioder().mapNotNull { periode ->
periode.innhold?.kopier(
Expand All @@ -59,3 +90,12 @@ private fun <S : PeriodeOgBarnSkjema<S>> Tidslinje<S, Måned>.tilSkjemaer(aktør
barnAktører = setOf(aktør),
)
}

private fun <S : PeriodeOgBarnSkjema<S>> FamilieFellesTidslinje<S>.tilSkjemaer(aktør: Aktør) =
this.tilPerioder().mapNotNull { periode ->
periode.verdi?.kopier(
fom = periode.fom?.toYearMonth(),
tom = periode.tom?.toYearMonth(),
barnAktører = setOf(aktør),
)
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package no.nav.familie.ba.sak.kjerne.eøs.utbetaling

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.kjerne.beregning.BeregningService
import no.nav.familie.ba.sak.kjerne.beregning.domene.YtelseType
import no.nav.familie.ba.sak.kjerne.beregning.tilTidslinjeForSøkersYtelse
import no.nav.familie.ba.sak.kjerne.beregning.tilFamilieFellesTidslinjeForSøkersYtelse
import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.EndretUtbetalingAndel
import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.Årsak
import no.nav.familie.ba.sak.kjerne.eøs.felles.BehandlingId
import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.PersonType
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.kombinerMed
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.tilTidspunktEllerUendeligSent
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilTidspunktEllerUendeligTidlig
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.trimNull
import no.nav.familie.tidslinje.Periode
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.tilTidslinje
import no.nav.familie.tidslinje.utvidelser.kombinerMed
import org.springframework.stereotype.Service
import java.math.BigDecimal

Expand All @@ -25,39 +25,44 @@ class UtbetalingTidslinjeService(
fun hentUtbetalesIkkeOrdinærEllerUtvidetTidslinjer(
behandlingId: BehandlingId,
endretUtbetalingAndeler: List<EndretUtbetalingAndel>,
): Map<Aktør, Tidslinje<Boolean, Måned>> {
): Map<Aktør, Tidslinje<Boolean>> {
val barnasSkalIkkeUtbetalesTidslinjer =
endretUtbetalingAndeler
.tilBarnasSkalIkkeUtbetalesTidslinjer()

val utvidetTidslinje =
beregningService
.hentAndelerTilkjentYtelseForBehandling(behandlingId.id)
.tilTidslinjeForSøkersYtelse(YtelseType.UTVIDET_BARNETRYGD)
.tilFamilieFellesTidslinjeForSøkersYtelse(YtelseType.UTVIDET_BARNETRYGD)

return barnasSkalIkkeUtbetalesTidslinjer
.mapValues { (_, ordinærSkalIkkeUtbetalesTidslinje) ->
val utbetalesIkkeOrdinærEllerUtvidetTidslinje =
ordinærSkalIkkeUtbetalesTidslinje.kombinerMed(utvidetTidslinje) { ordinærSkalIkkeUtbetales, utvidetAndel ->
ordinærSkalIkkeUtbetales == true && (utvidetAndel == null || utvidetAndel.kalkulertUtbetalingsbeløp == 0)
}
ordinærSkalIkkeUtbetalesTidslinje
.kombinerMed(utvidetTidslinje) { ordinærSkalIkkeUtbetales, utvidetAndel ->
if (ordinærSkalIkkeUtbetales == null && utvidetAndel == null) {
null
} else {
ordinærSkalIkkeUtbetales == true && (utvidetAndel == null || utvidetAndel.kalkulertUtbetalingsbeløp == 0)
}
}.trimNull()
utbetalesIkkeOrdinærEllerUtvidetTidslinje
}
}
}

internal fun Iterable<EndretUtbetalingAndel>.tilBarnasSkalIkkeUtbetalesTidslinjer(): Map<Aktør, Tidslinje<Boolean, Måned>> =
internal fun Iterable<EndretUtbetalingAndel>.tilBarnasSkalIkkeUtbetalesTidslinjer(): Map<Aktør, Tidslinje<Boolean>> =
this
.filter { it.årsak in listOf(Årsak.ETTERBETALING_3ÅR, Årsak.ETTERBETALING_3MND, Årsak.ALLEREDE_UTBETALT, Årsak.ENDRE_MOTTAKER) && it.prosent == BigDecimal.ZERO }
.filter { it.person?.type == PersonType.BARN }
.filter { it.person?.aktør != null }
.groupBy { it.person?.aktør!! }
.mapValues { (_, endringer) -> endringer.map { it.tilPeriode { true } } }
.mapValues { (_, perioder) -> tidslinje { perioder } }
.mapValues { (_, perioder) -> perioder.tilTidslinje() }

private fun <I> EndretUtbetalingAndel.tilPeriode(mapper: (EndretUtbetalingAndel) -> I?) =
private fun <V> EndretUtbetalingAndel.tilPeriode(mapper: (EndretUtbetalingAndel) -> V) =
Periode(
fraOgMed = this.fom.tilTidspunktEllerUendeligTidlig(tom),
tilOgMed = this.tom.tilTidspunktEllerUendeligSent(fom),
innhold = mapper(this),
fom = this.fom?.førsteDagIInneværendeMåned(),
tom = this.tom?.sisteDagIInneværendeMåned(),
verdi = mapper(this),
)
Loading