Skip to content

Commit

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

Favro: NAV-23270

Fortsettelse av #5089 
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 senere PR'er
  • Loading branch information
MagnusTonnessen authored Feb 20, 2025
1 parent 68b2f21 commit 4fd53aa
Show file tree
Hide file tree
Showing 10 changed files with 98 additions and 77 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,23 @@ package no.nav.familie.ba.sak.kjerne.behandlingsresultat
import no.nav.familie.ba.sak.common.Feil
import no.nav.familie.ba.sak.common.FunksjonellFeil
import no.nav.familie.ba.sak.common.secureLogger
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.behandling.domene.Behandling
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingType
import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandlingsresultat
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingÅrsak
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.domene.YtelseType
import no.nav.familie.ba.sak.kjerne.beregning.domene.tilTidslinjerPerAktørOgType
import no.nav.familie.ba.sak.kjerne.eøs.felles.util.MAX_MÅNED
import no.nav.familie.ba.sak.kjerne.eøs.felles.util.MIN_MÅNED
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.outerJoin
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.tidslinje.transformasjon.beskjærTilOgMed
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon.beskjærTilOgMed
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.PersonResultat
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.outerJoin
import no.nav.familie.tidslinje.utvidelser.tilPerioderIkkeNull
import java.time.YearMonth

object BehandlingsresultatValideringUtils {
Expand Down Expand Up @@ -79,8 +81,8 @@ object BehandlingsresultatValideringUtils {
Måned: YearMonth,
) {
val forrigeMåned =Måned.minusMonths(1)
val andelerIFortidenTidslinje = andelerDenneBehandlingen.tilTidslinjerPerAktørOgType().beskjærTilOgMed(forrigeMåned.tilTidspunkt())
val andelerIFortidenForrigeBehanldingTidslinje = andelerForrigeBehandling.tilTidslinjerPerAktørOgType().beskjærTilOgMed(forrigeMåned.tilTidspunkt())
val andelerIFortidenTidslinje = andelerDenneBehandlingen.tilTidslinjerPerAktørOgType().beskjærTilOgMed(forrigeMåned.sisteDagIInneværendeMåned())
val andelerIFortidenForrigeBehanldingTidslinje = andelerForrigeBehandling.tilTidslinjerPerAktørOgType().beskjærTilOgMed(forrigeMåned.sisteDagIInneværendeMåned())

val endringerIAndelerTilbakeITidTidslinjer =
andelerIFortidenTidslinje.outerJoin(andelerIFortidenForrigeBehanldingTidslinje) { nyAndel, gammelAndel ->
Expand Down Expand Up @@ -113,16 +115,19 @@ object BehandlingsresultatValideringUtils {
endringISatsTidslinjer.kastFeilOgLoggVedEndringerIAndeler()
}

private fun Map<Pair<Aktør, YtelseType>, Tidslinje<EndringIAndel, Måned>>.kastFeilOgLoggVedEndringerIAndeler() {
private fun Map<Pair<Aktør, YtelseType>, Tidslinje<EndringIAndel>>.kastFeilOgLoggVedEndringerIAndeler() {
this.forEach { (aktør, ytelsetype), endringIAndelTidslinje ->
endringIAndelTidslinje.perioder().forEach {
if (it.innhold is ErEndringIAndel) {
endringIAndelTidslinje.tilPerioderIkkeNull().forEach {
if (it.verdi is ErEndringIAndel) {
val erEndringIAndel = it.verdi as ErEndringIAndel
val fom = it.fom?.toYearMonth() ?: MIN_MÅNED
val tom = it.tom?.toYearMonth() ?: MAX_MÅNED
secureLogger.info(
"Det er en uforventet endring i $ytelsetype-andel for $aktør i perioden ${it.fraOgMed.tilYearMonth()} til ${it.tilOgMed.tilYearMonth()}.\n" +
"Andel denne behandlingen: ${it.innhold.andelDenneBehandlingen}\n" +
"Andel forrige behandling: ${it.innhold.andelForrigeBehandling}",
"Det er en uforventet endring i $ytelsetype-andel for $aktør i perioden $fom til $tom.\n" +
"Andel denne behandlingen: ${erEndringIAndel.andelDenneBehandlingen}\n" +
"Andel forrige behandling: ${erEndringIAndel.andelForrigeBehandling}",
)
throw Feil("Det er en uforventet endring i andel. Gjelder andel i perioden ${it.fraOgMed.tilYearMonth()} til ${it.tilOgMed.tilYearMonth()}. Se secure log for mer detaljer.")
throw Feil("Det er en uforventet endring i andel. Gjelder andel i perioden $fom til $tom. Se secure log for mer detaljer.")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ 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.vedtak.vedtaksperiode.vedtaksperiodeProdusent.AndelForVedtaksbegrunnelse
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.vedtaksperiodeProdusent.AndelForVedtaksperiode
import no.nav.familie.tidslinje.tilTidslinje

class AndelTilkjentYtelseTidslinje(
private val andelerTilkjentYtelse: List<AndelTilkjentYtelse>,
Expand All @@ -21,6 +22,8 @@ class AndelTilkjentYtelseTidslinje(
}
}

fun List<AndelTilkjentYtelse>.tilTidslinje() = this.map { it.tilPeriode() }.tilTidslinje()

class AndelTilkjentYtelseForVedtaksperioderTidslinje(
private val andelerTilkjentYtelse: List<AndelTilkjentYtelse>,
) : Tidslinje<AndelForVedtaksperiode, Måned>() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,14 @@ 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.kombiner
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.kombinerMed
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.outerJoin
import no.nav.familie.ba.sak.kjerne.tidslinje.månedPeriodeAv
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Måned
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.tilYearMonth
import no.nav.familie.ba.sak.kjerne.tidslinje.tilTidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.map
import no.nav.familie.tidslinje.outerJoin
import no.nav.familie.tidslinje.utvidelser.tilPerioder
import no.nav.familie.tidslinje.utvidelser.tilPerioderIkkeNull
import java.math.BigDecimal
import java.time.LocalDate
import java.time.YearMonth
Expand Down Expand Up @@ -113,7 +115,7 @@ object TilkjentYtelseValidering {
else -> false
}
}.values
.map { it.perioder() } // Må kalle på .perioder() for at feilene over skal bli kastet
.map { it.tilPerioder() } // Må kalle på .perioder() for at feilene over skal bli kastet
}

fun finnAktørIderMedUgyldigEtterbetalingsperiode(
Expand Down Expand Up @@ -180,7 +182,7 @@ object TilkjentYtelseValidering {

val fagsakType = tilkjentYtelse.behandling.fagsak.type

tidslinjeMedAndeler.perioder().mapNotNull { it.innhold }.forEach {
tidslinjeMedAndeler.tilPerioderIkkeNull().map { it.verdi }.forEach {
val søkersAndeler = hentSøkersAndeler(it, søker)
val barnasAndeler = hentBarnasAndeler(it, barna)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import no.nav.familie.ba.sak.common.toYearMonth
import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.YtelsetypeBA
import no.nav.familie.ba.sak.kjerne.beregning.AndelTilkjentYtelseForVedtaksbegrunnelserTidslinje
import no.nav.familie.ba.sak.kjerne.beregning.AndelTilkjentYtelseForVedtaksperioderTidslinje
import no.nav.familie.ba.sak.kjerne.beregning.AndelTilkjentYtelseTidslinje
import no.nav.familie.ba.sak.kjerne.beregning.tilTidslinje
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.vilkårsvurdering.domene.PersonResultat
Expand Down Expand Up @@ -209,11 +209,9 @@ private fun regelverkAvhengigeVilkår() =
Vilkår.LOVLIG_OPPHOLD,
)

fun Collection<AndelTilkjentYtelse>.tilTidslinjerPerAktørOgType(): Map<Pair<Aktør, YtelseType>, AndelTilkjentYtelseTidslinje> =
fun Collection<AndelTilkjentYtelse>.tilTidslinjerPerAktørOgType() =
groupBy { Pair(it.aktør, it.type) }.mapValues { (_, andelerTilkjentYtelsePåPerson) ->
AndelTilkjentYtelseTidslinje(
andelerTilkjentYtelsePåPerson,
)
andelerTilkjentYtelsePåPerson.tilTidslinje()
}

fun List<AndelTilkjentYtelse>.tilAndelForVedtaksperiodeTidslinjerPerAktørOgType(): Map<Pair<Aktør, YtelseType>, AndelTilkjentYtelseForVedtaksperioderTidslinje> =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@ import jakarta.persistence.SequenceGenerator
import jakarta.persistence.Table
import no.nav.familie.ba.sak.common.YearMonthConverter
import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling
import no.nav.familie.ba.sak.kjerne.tidslinje.Tidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.kombiner
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Måned
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.kombiner
import no.nav.familie.ba.sak.sikkerhet.RollestyringMotDatabase
import no.nav.familie.kontrakter.felles.objectMapper
import no.nav.familie.kontrakter.felles.oppdrag.Utbetalingsoppdrag
Expand Down Expand Up @@ -64,7 +62,7 @@ data class TilkjentYtelse(
val andelerTilkjentYtelse: MutableSet<AndelTilkjentYtelse> = mutableSetOf(),
)

fun TilkjentYtelse.tilTidslinjeMedAndeler(): Tidslinje<Iterable<AndelTilkjentYtelse>, Måned> =
fun TilkjentYtelse.tilTidslinjeMedAndeler() =
this.andelerTilkjentYtelse
.tilTidslinjerPerAktørOgType()
.values
Expand Down
41 changes: 22 additions & 19 deletions src/main/kotlin/no/nav/familie/ba/sak/kjerne/brev/BrevUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ import no.nav.familie.ba.sak.common.Feil
import no.nav.familie.ba.sak.common.TIDENES_ENDE
import no.nav.familie.ba.sak.common.TIDENES_MORGEN
import no.nav.familie.ba.sak.common.Utils.slåSammen
import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned
import no.nav.familie.ba.sak.common.sisteDagIMåned
import no.nav.familie.ba.sak.common.tilMånedÅr
import no.nav.familie.ba.sak.common.tilMånedÅrMedium
import no.nav.familie.ba.sak.common.toYearMonth
import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingType
import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandlingsresultat.DELVIS_INNVILGET
Expand All @@ -27,7 +29,8 @@ import no.nav.familie.ba.sak.kjerne.brev.domene.maler.utbetalingEøs.UtbetalingE
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.utbetalingEøs.UtbetalingMndEøs
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.utbetalingEøs.UtbetalingMndEøsOppsummering
import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.EndretUtbetalingAndel
import no.nav.familie.ba.sak.kjerne.eøs.felles.beregning.tilSeparateTidslinjerForBarna
import no.nav.familie.ba.sak.kjerne.eøs.felles.beregning.tilSeparateFamilieFellesTidslinjerForBarna
import no.nav.familie.ba.sak.kjerne.eøs.felles.util.MIN_MÅNED
import no.nav.familie.ba.sak.kjerne.eøs.kompetanse.domene.Kompetanse
import no.nav.familie.ba.sak.kjerne.eøs.kompetanse.domene.KompetanseResultat
import no.nav.familie.ba.sak.kjerne.eøs.kompetanse.domene.tilUtfylteKompetanserEtterEndringstidpunktPerAktør
Expand All @@ -37,18 +40,18 @@ import no.nav.familie.ba.sak.kjerne.eøs.utenlandskperiodebeløp.tilUtbetaltFraA
import no.nav.familie.ba.sak.kjerne.eøs.valutakurs.Valutakurs
import no.nav.familie.ba.sak.kjerne.fagsak.FagsakStatus
import no.nav.familie.ba.sak.kjerne.personident.Aktør
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.erIkkeTom
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.kombiner
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.outerJoin
import no.nav.familie.ba.sak.kjerne.tidslinje.splitPerTidsenhet
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilMånedTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.tilYearMonth
import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.beskjærFraOgMed
import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.mapIkkeNull
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.erIkkeTom
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.kombiner
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon.beskjærFraOgMed
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon.mapIkkeNull
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.utils.splitPerMåned
import no.nav.familie.ba.sak.kjerne.vedtak.domene.VedtaksperiodeMedBegrunnelser
import no.nav.familie.tidslinje.outerJoin
import no.nav.familie.tidslinje.utvidelser.tilPerioder
import tilLandNavn
import java.time.LocalDate
import java.time.YearMonth

fun hentAutomatiskVedtaksbrevtype(behandling: Behandling): Brevmal {
val behandlingÅrsak = behandling.opprettetÅrsak
Expand Down Expand Up @@ -117,8 +120,8 @@ fun skalHenteUtbetalingerEøs(

val valutakurserEtterEndringtidspunktet =
valutakurser
.tilSeparateTidslinjerForBarna()
.mapValues { (_, valutakursTidslinjeForBarn) -> valutakursTidslinjeForBarn.beskjærFraOgMed(endringstidspunkt.tilMånedTidspunkt()) }
.tilSeparateFamilieFellesTidslinjerForBarna()
.mapValues { (_, valutakursTidslinjeForBarn) -> valutakursTidslinjeForBarn.beskjærFraOgMed(endringstidspunkt.førsteDagIInneværendeMåned()) }

return valutakurserEtterEndringtidspunktet.any { it.value.erIkkeTom() }
}
Expand Down Expand Up @@ -160,10 +163,10 @@ fun hentUtbetalingerPerMndEøs(

// Ønsker kun andeler etter endringstidspunkt så beskjærer fra og med endringstidspunktet
val andelerForVedtaksperioderPerAktørOgTypeAvgrensetTilVedtaksperioder =
andelerForVedtaksperioderPerAktørOgType.mapValues { (_, andelForVedtaksperiode) -> andelForVedtaksperiode.beskjærFraOgMed(endringstidspunkt.tilMånedTidspunkt()) }
andelerForVedtaksperioderPerAktørOgType.mapValues { (_, andelForVedtaksperiode) -> andelForVedtaksperiode.beskjærFraOgMed(endringstidspunkt.førsteDagIInneværendeMåned()) }

val utenlandskePeriodebeløpTidslinjerForBarna = utenlandskePeriodebeløp.tilSeparateTidslinjerForBarna().mapKeys { entry -> Pair(entry.key, YtelseType.ORDINÆR_BARNETRYGD) }
val valutakursTidslinjerForBarna = valutakurser.tilSeparateTidslinjerForBarna().mapKeys { entry -> Pair(entry.key, YtelseType.ORDINÆR_BARNETRYGD) }
val utenlandskePeriodebeløpTidslinjerForBarna = utenlandskePeriodebeløp.tilSeparateFamilieFellesTidslinjerForBarna().mapKeys { entry -> Pair(entry.key, YtelseType.ORDINÆR_BARNETRYGD) }
val valutakursTidslinjerForBarna = valutakurser.tilSeparateFamilieFellesTidslinjerForBarna().mapKeys { entry -> Pair(entry.key, YtelseType.ORDINÆR_BARNETRYGD) }

return andelerForVedtaksperioderPerAktørOgTypeAvgrensetTilVedtaksperioder
// Kombinerer tidslinjene for andeler, utenlandskPeriodebeløp og valutakurser per aktørOgYtelse
Expand All @@ -176,13 +179,13 @@ fun hentUtbetalingerPerMndEøs(
// Kombinerer verdiene til alle tidslinjene slik at vi får en liste av UtbetalingEøs per periode, samt sørger for at vi får en periode per mnd.
// Grupperer deretter på periodenes fom
.kombiner()
.perioder()
.flatMap { periode -> periode.splitPerTidsenhet(LocalDate.now().tilMånedTidspunkt()) }
.tilPerioder()
.flatMap { periode -> periode.splitPerMåned(YearMonth.now()) }
.associate { periode ->
val utbetalingMndEøs = hentUtbetalingMndEøs(utbetalingerEøs = periode.innhold?.toList() ?: emptyList())
val fraOgMedDato = periode.fraOgMed.tilYearMonth().tilMånedÅrMedium()
val utbetalingMndEøs = hentUtbetalingMndEøs(utbetalingerEøs = periode.verdi?.toList() ?: emptyList())
val fraOgMedMåned = (periode.fom?.toYearMonth() ?: MIN_MÅNED).tilMånedÅrMedium()

fraOgMedDato to utbetalingMndEøs
fraOgMedMåned to utbetalingMndEøs
}.filter { it.value.utbetalinger.isNotEmpty() }
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.utils

import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned
import no.nav.familie.ba.sak.common.rangeTo
import no.nav.familie.ba.sak.common.sisteDagIInneværendeMåned
import no.nav.familie.ba.sak.common.toYearMonth
import no.nav.familie.tidslinje.PRAKTISK_TIDLIGSTE_DAG
import no.nav.familie.tidslinje.Periode
import java.time.YearMonth

fun <V> Periode<V>.splitPerMåned(tilOgMedMåned: YearMonth): List<Periode<V>> {
val førsteMåned = (this.fom ?: PRAKTISK_TIDLIGSTE_DAG).toYearMonth()
val sisteMåned = setOfNotNull(this.tom?.toYearMonth(), tilOgMedMåned).minOrNull()!!
return førsteMåned.rangeTo(sisteMåned).map {
Periode(
verdi = this.verdi,
fom = it.førsteDagIInneværendeMåned(),
tom = it.sisteDagIInneværendeMåned(),
)
}
}
Loading

0 comments on commit 4fd53aa

Please sign in to comment.