Skip to content

Commit

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

Favro: NAV-23270

Fortsettelse av #5099 
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 21, 2025
1 parent 215a038 commit 0b3cff6
Show file tree
Hide file tree
Showing 15 changed files with 123 additions and 162 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,24 @@ package no.nav.familie.ba.sak.kjerne.behandlingsresultat

import no.nav.familie.ba.sak.common.FunksjonellFeil
import no.nav.familie.ba.sak.common.isSameOrAfter
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.tidslinje.Tidslinje
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.tidslinje.Tidslinje
import no.nav.familie.tidslinje.utvidelser.tilPerioder
import java.time.YearMonth

fun Tidslinje<Boolean, Måned>.kastFeilVedEndringEtter(
fun Tidslinje<Boolean>.kastFeilVedEndringEtter(
migreringsdatoForrigeIverksatteBehandling: YearMonth,
behandling: Behandling,
) {
val endringIUtbetalingEtterDato =
perioder()
.filter { it.tilOgMed.tilYearMonth().isSameOrAfter(migreringsdatoForrigeIverksatteBehandling) }
tilPerioder()
.filter { it.tom == null || it.tom!!.toYearMonth().isSameOrAfter(migreringsdatoForrigeIverksatteBehandling) }

val erEndringIUtbetalingEtterMigreringsdato = endringIUtbetalingEtterDato.any { it.innhold == true }
val erEndringIUtbetalingEtterMigreringsdato = endringIUtbetalingEtterDato.any { it.verdi == true }

if (erEndringIUtbetalingEtterMigreringsdato) {
BehandlingsresultatSteg.logger.warn("Feil i behandling $behandling.\n\nEndring i måned ${endringIUtbetalingEtterDato.first { it.innhold == true }.fraOgMed.tilYearMonth()}.")
BehandlingsresultatSteg.logger.warn("Feil i behandling $behandling.\n\nEndring i måned ${endringIUtbetalingEtterDato.first { it.verdi == true }.fom?.toYearMonth()}.")
throw FunksjonellFeil(
"Det finnes endringer i behandlingen som har økonomisk konsekvens for bruker." +
"Det skal ikke skje for endre migreringsdatobehandlinger." +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,26 @@ package no.nav.familie.ba.sak.kjerne.behandlingsresultat

import no.nav.familie.ba.sak.common.TIDENES_MORGEN
import no.nav.familie.ba.sak.common.forrigeMåned
import no.nav.familie.ba.sak.common.nesteMåned
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.behandlingsresultat.BehandlingsresultatOpphørUtils.utledOpphørsdatoForNåværendeBehandlingMedFallback
import no.nav.familie.ba.sak.kjerne.beregning.AndelTilkjentYtelseTidslinje
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.tilTidslinje
import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.EndretUtbetalingAndel
import no.nav.familie.ba.sak.kjerne.eøs.kompetanse.domene.Kompetanse
import no.nav.familie.ba.sak.kjerne.forrigebehandling.EndringIEndretUtbetalingAndelUtil
import no.nav.familie.ba.sak.kjerne.forrigebehandling.EndringIKompetanseUtil
import no.nav.familie.ba.sak.kjerne.forrigebehandling.EndringIVilkårsvurderingUtil
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.Tidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.kombinerMed
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Måned
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilMånedTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.beskjær
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon.beskjærTilOgMed
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.logger
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.PersonResultat
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.utvidelser.kombinerMed
import no.nav.familie.tidslinje.utvidelser.tilPerioder
import java.time.YearMonth

internal enum class Endringsresultat {
Expand Down Expand Up @@ -170,8 +170,8 @@ private fun erEndringIBeløpForPersonOgType(
erFremstiltKravForPerson: Boolean,
Måned: YearMonth,
): Boolean {
val nåværendeTidslinje = AndelTilkjentYtelseTidslinje(nåværendeAndeler)
val forrigeTidslinje = AndelTilkjentYtelseTidslinje(forrigeAndeler)
val nåværendeTidslinje = nåværendeAndeler.tilTidslinje()
val forrigeTidslinje = forrigeAndeler.tilTidslinje()

val endringIBeløpTidslinje =
nåværendeTidslinje
Expand All @@ -195,16 +195,16 @@ private fun erEndringIBeløpForPersonOgType(
}.fjernPerioderEtterOpphørsdato(opphørstidspunktForBehandling)
.fjernPerioderLengreEnnEnMånedFramITid(nåMåned)

return endringIBeløpTidslinje.perioder().any { it.innhold == true }
return endringIBeløpTidslinje.tilPerioder().any { it.verdi == true }
}

private fun Int?.erStørreEnn0(): Boolean = this != null && this > 0

private fun Int?.er0EllerNull(): Boolean = this == null || this == 0

private fun Tidslinje<Boolean, Måned>.fjernPerioderEtterOpphørsdato(opphørstidspunkt: YearMonth) = this.beskjær(fraOgMed = TIDENES_MORGEN.tilMånedTidspunkt(), tilOgMed = opphørstidspunkt.forrigeMåned().tilTidspunkt())
private fun Tidslinje<Boolean>.fjernPerioderEtterOpphørsdato(opphørstidspunkt: YearMonth) = this.beskjærTilOgMed(opphørstidspunkt.forrigeMåned().sisteDagIInneværendeMåned())

private fun Tidslinje<Boolean, Måned>.fjernPerioderLengreEnnEnMånedFramITid(nåMåned: YearMonth) = this.beskjær(fraOgMed = TIDENES_MORGEN.tilMånedTidspunkt(), tilOgMed = Måned.plusMonths(1).tilTidspunkt())
private fun Tidslinje<Boolean>.fjernPerioderLengreEnnEnMånedFramITid(nåMåned: YearMonth) = this.beskjærTilOgMed(Måned.nesteMåned().sisteDagIInneværendeMåned())

internal fun erEndringIKompetanseForPerson(
nåværendeKompetanserForPerson: List<Kompetanse>,
Expand Down Expand Up @@ -248,5 +248,5 @@ internal fun erEndringIEndretUtbetalingAndelerForPerson(
forrigeEndretAndelerForPerson = forrigeEndretAndelerForPerson,
)

return endringIEndretUtbetalingAndelTidslinje.perioder().any { it.innhold == true }
return endringIEndretUtbetalingAndelTidslinje.tilPerioder().any { it.verdi == true }
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ import no.nav.familie.ba.sak.common.FunksjonellFeil
import no.nav.familie.ba.sak.common.secureLogger
import no.nav.familie.ba.sak.kjerne.autovedtak.fødselshendelse.Resultat
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingÅrsak
import no.nav.familie.ba.sak.kjerne.beregning.AndelTilkjentYtelseTidslinje
import no.nav.familie.ba.sak.kjerne.beregning.EndretUtbetalingAndelTidslinje
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.tilTidslinje
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.personident.Aktør
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.kombinerMed
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.PersonResultat
import no.nav.familie.tidslinje.utvidelser.kombinerMed
import no.nav.familie.tidslinje.utvidelser.tilPerioderIkkeNull

internal enum class Søknadsresultat {
INNVILGET,
Expand Down Expand Up @@ -94,9 +94,9 @@ object BehandlingsresultatSøknadUtils {
nåværendeAndelerForPerson: List<AndelTilkjentYtelse>,
endretUtbetalingAndelerForPerson: List<EndretUtbetalingAndel>,
): List<Søknadsresultat> {
val forrigeTidslinje = AndelTilkjentYtelseTidslinje(forrigeAndelerForPerson)
val nåværendeTidslinje = AndelTilkjentYtelseTidslinje(nåværendeAndelerForPerson)
val endretUtbetalingTidslinje = EndretUtbetalingAndelTidslinje(endretUtbetalingAndelerForPerson)
val forrigeTidslinje = forrigeAndelerForPerson.tilTidslinje()
val nåværendeTidslinje = nåværendeAndelerForPerson.tilTidslinje()
val endretUtbetalingTidslinje = endretUtbetalingAndelerForPerson.tilTidslinje()

val resultatTidslinje =
nåværendeTidslinje.kombinerMed(forrigeTidslinje, endretUtbetalingTidslinje) { nåværende, forrige, endretUtbetalingAndel ->
Expand Down Expand Up @@ -136,7 +136,7 @@ object BehandlingsresultatSøknadUtils {
}
}

return resultatTidslinje.perioder().mapNotNull { it.innhold }.distinct()
return resultatTidslinje.tilPerioderIkkeNull().map { it.verdi }.distinct()
}

private fun erEksplisittAvslagPåMinstEnPersonFremstiltKravForEllerSøker(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,6 @@ import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.vedtaksperiodeProdusen
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.vedtaksperiodeProdusent.AndelForVedtaksperiode
import no.nav.familie.tidslinje.tilTidslinje

class AndelTilkjentYtelseTidslinje(
private val andelerTilkjentYtelse: List<AndelTilkjentYtelse>,
) : Tidslinje<AndelTilkjentYtelse, Måned>() {
override fun lagPerioder(): List<Periode<AndelTilkjentYtelse, Måned>> =
andelerTilkjentYtelse.map {
Periode(
fraOgMed = it.stønadFom.tilTidspunkt(),
tilOgMed = it.stønadTom.tilTidspunkt(),
innhold = it,
)
}
}

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

class AndelTilkjentYtelseForVedtaksperioderTidslinje(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.Personopplysning
import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.barn
import no.nav.familie.ba.sak.kjerne.personident.Aktør
import no.nav.familie.ba.sak.kjerne.steg.EndringerIUtbetalingForBehandlingSteg
import no.nav.familie.ba.sak.kjerne.tidslinje.Tidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.TomTidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Måned
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.VilkårsvurderingRepository
import no.nav.familie.tidslinje.tomTidslinje
import no.nav.familie.tidslinje.utvidelser.tilPerioder
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import java.time.LocalDateTime
import no.nav.familie.tidslinje.Tidslinje as FamilieFellesTidslinje

@Service
class BeregningService(
Expand Down Expand Up @@ -118,17 +118,17 @@ class BeregningService(
fun hentEndringerIUtbetalingFraForrigeBehandlingSendtTilØkonomi(behandling: Behandling): EndringerIUtbetalingForBehandlingSteg {
val endringerIUtbetaling =
hentEndringerIUtbetalingFraForrigeBehandlingSendtTilØkonomiTidslinje(behandling)
.perioder()
.any { it.innhold == true }
.tilPerioder()
.any { it.verdi == true }

return if (endringerIUtbetaling) EndringerIUtbetalingForBehandlingSteg.ENDRING_I_UTBETALING else EndringerIUtbetalingForBehandlingSteg.INGEN_ENDRING_I_UTBETALING
}

fun hentEndringerIUtbetalingFraForrigeBehandlingSendtTilØkonomiTidslinje(behandling: Behandling): Tidslinje<Boolean, Måned> {
fun hentEndringerIUtbetalingFraForrigeBehandlingSendtTilØkonomiTidslinje(behandling: Behandling): FamilieFellesTidslinje<Boolean> {
val nåværendeAndeler = andelTilkjentYtelseRepository.finnAndelerTilkjentYtelseForBehandling(behandling.id)
val forrigeAndeler = hentAndelerFraForrigeIverksattebehandling(behandling)

if (nåværendeAndeler.isEmpty() && forrigeAndeler.isEmpty()) return TomTidslinje()
if (nåværendeAndeler.isEmpty() && forrigeAndeler.isEmpty()) return tomTidslinje()

return EndringIUtbetalingUtil.lagEndringIUtbetalingTidslinje(
nåværendeAndeler = nåværendeAndeler,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
package no.nav.familie.ba.sak.kjerne.beregning

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.kjerne.endretutbetaling.domene.EndretUtbetalingAndel
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.tidspunkt.Måned
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilTidspunkt
import no.nav.familie.tidslinje.Periode
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.tilTidslinje

class EndretUtbetalingAndelTidslinje(
private val endretUtbetalingAndeler: List<EndretUtbetalingAndel>,
) : Tidslinje<EndretUtbetalingAndel, Måned>() {
override fun lagPerioder(): Collection<Periode<EndretUtbetalingAndel, Måned>> =
endretUtbetalingAndeler.map {
fun List<EndretUtbetalingAndel>.tilTidslinje(): Tidslinje<EndretUtbetalingAndel> =
this
.map {
Periode(
fraOgMed = it.fom?.tilTidspunkt() ?: throw Feil("Endret utbetaling andel har ingen fom-dato: $it"),
tilOgMed = it.tom?.tilTidspunkt() ?: throw Feil("Endret utbetaling andel har ingen tom-dato: $it"),
innhold = it,
verdi = it,
fom = it.fom?.førsteDagIInneværendeMåned(),
tom = it.tom?.sisteDagIInneværendeMåned(),
)
}
}
}.tilTidslinje()
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ private fun List<AndelTilkjentYtelseMedEndreteUtbetalinger>.førerTilEndringIUtb
forrigeAndeler = forrigeAndeler.map { it.andel },
)

return endringstidslinje.perioder().any { it.innhold == true }
return endringstidslinje.tilPerioder().any { it.verdi == true }
}

fun hentInnvilgedeOgReduserteAndelerSmåbarnstillegg(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
package no.nav.familie.ba.sak.kjerne.forrigebehandling

import no.nav.familie.ba.sak.kjerne.beregning.EndretUtbetalingAndelTidslinje
import no.nav.familie.ba.sak.kjerne.beregning.tilTidslinje
import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.EndretUtbetalingAndel
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.tidspunkt.Måned
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.utvidelser.kombinerMed

object EndringIEndretUtbetalingAndelUtil {
fun lagEndringIEndretUbetalingAndelPerPersonTidslinje(
nåværendeEndretAndelerForPerson: List<EndretUtbetalingAndel>,
forrigeEndretAndelerForPerson: List<EndretUtbetalingAndel>,
): Tidslinje<Boolean, Måned> {
val nåværendeTidslinje = EndretUtbetalingAndelTidslinje(nåværendeEndretAndelerForPerson)
val forrigeTidslinje = EndretUtbetalingAndelTidslinje(forrigeEndretAndelerForPerson)
): Tidslinje<Boolean> {
val nåværendeTidslinje = nåværendeEndretAndelerForPerson.tilTidslinje()
val forrigeTidslinje = forrigeEndretAndelerForPerson.tilTidslinje()

val endringerTidslinje =
nåværendeTidslinje.kombinerMed(forrigeTidslinje) { nåværende, forrige ->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package no.nav.familie.ba.sak.kjerne.forrigebehandling

import no.nav.familie.ba.sak.kjerne.beregning.AndelTilkjentYtelseTidslinje
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.tilTidslinje
import no.nav.familie.ba.sak.kjerne.forrigebehandling.EndringUtil.tilFørsteEndringstidspunkt
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.tidspunkt.Måned
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.utvidelser.kombiner
import no.nav.familie.tidslinje.utvidelser.kombinerMed
import java.time.YearMonth

object EndringIUtbetalingUtil {
Expand All @@ -26,7 +25,7 @@ object EndringIUtbetalingUtil {
internal fun lagEndringIUtbetalingTidslinje(
nåværendeAndeler: List<AndelTilkjentYtelse>,
forrigeAndeler: List<AndelTilkjentYtelse>,
): Tidslinje<Boolean, Måned> {
): Tidslinje<Boolean> {
val allePersonerMedAndeler = (nåværendeAndeler.map { it.aktør } + forrigeAndeler.map { it.aktør }).distinct()

val endringstidslinjePerPersonOgType =
Expand Down Expand Up @@ -55,9 +54,9 @@ object EndringIUtbetalingUtil {
private fun lagEndringIUtbetalingForPersonOgTypeTidslinje(
nåværendeAndeler: List<AndelTilkjentYtelse>,
forrigeAndeler: List<AndelTilkjentYtelse>,
): Tidslinje<Boolean, Måned> {
val nåværendeTidslinje = AndelTilkjentYtelseTidslinje(nåværendeAndeler)
val forrigeTidslinje = AndelTilkjentYtelseTidslinje(forrigeAndeler)
): Tidslinje<Boolean> {
val nåværendeTidslinje = nåværendeAndeler.tilTidslinje()
val forrigeTidslinje = forrigeAndeler.tilTidslinje()

val endringIBeløpTidslinje =
nåværendeTidslinje.kombinerMed(forrigeTidslinje) { nåværende, forrige ->
Expand All @@ -73,9 +72,9 @@ object EndringIUtbetalingUtil {
internal fun lagEtterbetalingstidslinjeForPersonOgType(
nåværendeAndeler: List<AndelTilkjentYtelse>,
forrigeAndeler: List<AndelTilkjentYtelse>,
): Tidslinje<Boolean, Måned> {
val nåværendeTidslinje = AndelTilkjentYtelseTidslinje(nåværendeAndeler)
val forrigeTidslinje = AndelTilkjentYtelseTidslinje(forrigeAndeler)
): Tidslinje<Boolean> {
val nåværendeTidslinje = nåværendeAndeler.tilTidslinje()
val forrigeTidslinje = forrigeAndeler.tilTidslinje()

val etterbetaling =
nåværendeTidslinje.kombinerMed(forrigeTidslinje) { nåværende, forrige ->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package no.nav.familie.ba.sak.kjerne.forrigebehandling

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.tilYearMonth
import no.nav.familie.ba.sak.common.toYearMonth
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.utvidelser.tilPerioder

object EndringUtil {
internal fun Tidslinje<Boolean, Måned>.tilFørsteEndringstidspunkt() =
internal fun Tidslinje<Boolean>.tilFørsteEndringstidspunkt() =
this
.perioder()
.filter { it.innhold == true }
.minOfOrNull { it.fraOgMed }
?.tilYearMonth()
.tilPerioder()
.filter { it.verdi == true }
.mapNotNull { it.fom }
.minOfOrNull { it }
?.toYearMonth()
}
Loading

0 comments on commit 0b3cff6

Please sign in to comment.