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 #5075

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from 2 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 @@ -6,6 +6,8 @@ import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Dag
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.DagTidspunkt.Companion.tilTidspunktEllerUendeligSent
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.DagTidspunkt.Companion.tilTidspunktEllerUendeligTidlig
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.VilkårResultat
import no.nav.familie.tidslinje.tilTidslinje
import no.nav.familie.tidslinje.Periode as FamilieFellesPeriode

/**
* Lager tidslinje av VilkårRegelverkResultat for ett vilkår og én aktør
Expand Down Expand Up @@ -36,3 +38,21 @@ fun VilkårResultat.tilPeriode(): Periode<VilkårRegelverkResultat, Dag> {
),
)
}

fun Iterable<VilkårResultat>.tilVilkårRegelverkResultatTidslinjeFamilieFelles() =
this
.filter { it.erOppfylt() }
.map { it.tilPeriodeNy() }
.tilTidslinje()

private fun VilkårResultat.tilPeriodeNy(): FamilieFellesPeriode<VilkårRegelverkResultat> =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Antar dette skal endres på sikt?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ja, navnene på noen av duplikatfunksjonene må være forskjellig pga jvm signature som blir like >.< Mente egentlig å bruke FamilieFelles i navnet, i stedet for Ny

FamilieFellesPeriode(
verdi =
VilkårRegelverkResultat(
vilkår = vilkårType,
regelverkResultat = this.tilRegelverkResultat(),
utdypendeVilkårsvurderinger = this.utdypendeVilkårsvurderinger,
),
fom = periodeFom,
tom = periodeTom,
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package no.nav.familie.ba.sak.kjerne.eøs.vilkårsvurdering
import no.nav.familie.ba.sak.kjerne.tidslinje.Tidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Dag
import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.tilMånedFraMånedsskifteIkkeNull
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon.tilMånedFraMånedsskifteIkkeNull
import no.nav.familie.tidslinje.Tidslinje as FamilieFellesTidslinje

/**
* Extension-funksjon som konverterer en dag-basert tidslinje til en måned-basert tidslinje med VilkårRegelverkResultat
Expand All @@ -24,3 +26,9 @@ fun Tidslinje<VilkårRegelverkResultat, Dag>.tilMånedsbasertTidslinjeForVilkår
.tilMånedFraMånedsskifteIkkeNull { sisteDagForrigeMåned, førsteDagDenneMåned ->
if (sisteDagForrigeMåned.erOppfylt() && førsteDagDenneMåned.erOppfylt()) førsteDagDenneMåned else null
}

fun FamilieFellesTidslinje<VilkårRegelverkResultat>.tilMånedsbasertTidslinjeForVilkårRegelverkResultat() =
this
.tilMånedFraMånedsskifteIkkeNull { sisteDagForrigeMåned, førsteDagDenneMåned ->
if (sisteDagForrigeMåned.erOppfylt() && førsteDagDenneMåned.erOppfylt()) førsteDagDenneMåned else null
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,14 @@ import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Dag
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Måned
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Tidsenhet
import no.nav.familie.ba.sak.kjerne.tidslinje.transformasjon.beskjærEtter
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.kombinerUtenNull
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.beskjærEtter
import no.nav.familie.tidslinje.inneholder
import no.nav.familie.tidslinje.utvidelser.kombinerMed
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.erUnder18ÅrVilkårTidslinje as familieFellesErUnder18ÅrVilkårTidslinje
import no.nav.familie.tidslinje.Tidslinje as FamilieFellesTidslinje

class VilkårsvurderingTidslinjer(
vilkårsvurdering: Vilkårsvurdering,
Expand Down Expand Up @@ -142,3 +149,107 @@ private fun VilkårsvurderingTidslinjer.søkerHarNasjonalOgFinnesBarnMedEøs():
}

fun <I, T : Tidsenhet> Tidslinje<I, T>.inneholder(innhold: I): Boolean = this.perioder().any { it.innhold == innhold }

// TODO: Endre navn til VilkårsvurderingTidslinjer når den andre klassen er slettet
class VilkårsvurderingFamilieFellesTidslinjer(
vilkårsvurdering: Vilkårsvurdering,
søkerOgBarn: List<PersonEnkel>,
) {
private val barna: List<PersonEnkel> = søkerOgBarn.barn()
private val søker: Aktør = søkerOgBarn.søker().aktør

private val søkersTidslinje: SøkersTidslinjer =
SøkersTidslinjer(
vilkårResultater = vilkårsvurdering.hentPersonResultaterTil(søker.aktørId),
fagsakType = vilkårsvurdering.behandling.fagsak.type,
behandlingUnderkategori = vilkårsvurdering.behandling.underkategori,
)

private val barnasTidslinjer: Map<Aktør, BarnetsTidslinjer> =
barna.associate {
it.aktør to
BarnetsTidslinjer(
barn = it,
vilkårResultater = vilkårsvurdering.hentPersonResultaterTil(it.aktør.aktørId),
søkersRegelverkResultatTidslinje = søkersTidslinje.regelverkResultatTidslinje,
fagsakType = vilkårsvurdering.behandling.fagsak.type,
behandlingUnderkategori = vilkårsvurdering.behandling.underkategori,
)
}

fun søkersTidslinje(): SøkersTidslinjer = søkersTidslinje

fun barnasTidslinjer(): Map<Aktør, BarnetsTidslinjer> = barnasTidslinjer

class SøkersTidslinjer(
vilkårResultater: List<VilkårResultat>,
fagsakType: FagsakType,
behandlingUnderkategori: BehandlingUnderkategori,
) {
val vilkårsresultatTidslinjer =
vilkårResultater
.groupBy { it.vilkårType }
.map { it.value.tilVilkårRegelverkResultatTidslinjeFamilieFelles() }

val regelverkResultatTidslinje =
vilkårsresultatTidslinjer
.map { it.tilMånedsbasertTidslinjeForVilkårRegelverkResultat() }
.kombinerUtenNull {
kombinerVilkårResultaterTilRegelverkResultat(
personType = PersonType.SØKER,
alleVilkårResultater = it,
fagsakType = fagsakType,
behandlingUnderkategori = behandlingUnderkategori,
)
}
}

class BarnetsTidslinjer(
barn: PersonEnkel,
vilkårResultater: List<VilkårResultat>,
søkersRegelverkResultatTidslinje: FamilieFellesTidslinje<RegelverkResultat>,
fagsakType: FagsakType,
behandlingUnderkategori: BehandlingUnderkategori,
) {
val erUnder18ÅrVilkårTidslinje = familieFellesErUnder18ÅrVilkårTidslinje(barn.fødselsdato)

val vilkårsresultatTidslinjer =
vilkårResultater
.groupBy { it.vilkårType }
.map { it.value.tilVilkårRegelverkResultatTidslinjeFamilieFelles() }

val egetRegelverkResultatTidslinje: FamilieFellesTidslinje<RegelverkResultat> =
vilkårsresultatTidslinjer
.map { it.tilMånedsbasertTidslinjeForVilkårRegelverkResultat() }
.kombinerUtenNull {
kombinerVilkårResultaterTilRegelverkResultat(
personType = PersonType.BARN,
alleVilkårResultater = it,
fagsakType = fagsakType,
behandlingUnderkategori = behandlingUnderkategori,
)
}.beskjærEtter(erUnder18ÅrVilkårTidslinje)

val regelverkResultatTidslinje =
egetRegelverkResultatTidslinje
.kombinerMed(søkersRegelverkResultatTidslinje) { barnetsResultat, søkersResultat ->
barnetsResultat.kombinerMed(søkersResultat)
}
// Barnets egne tidslinjer kan på dette tidspunktet strekke seg 18 år frem i tid,
// og mye lenger enn søkers regelverk-tidslinje, som skal være begrensningen. Derfor beskjærer vi mot den
.beskjærEtter(søkersRegelverkResultatTidslinje)
}

fun harBlandetRegelverk(): Boolean =
søkerHarNasjonalOgFinnesBarnMedEøs() ||
søkersTidslinje().regelverkResultatTidslinje.inneholder(RegelverkResultat.OPPFYLT_BLANDET_REGELVERK) ||
barnasTidslinjer().values.any { it.egetRegelverkResultatTidslinje.inneholder(RegelverkResultat.OPPFYLT_BLANDET_REGELVERK) }

private fun søkerHarNasjonalOgFinnesBarnMedEøs(): Boolean =
barnasTidslinjer().values.any {
it.egetRegelverkResultatTidslinje
.kombinerMed(søkersTidslinje().regelverkResultatTidslinje) { barnRegelverk, søkerRegelverk ->
barnRegelverk == RegelverkResultat.OPPFYLT_EØS_FORORDNINGEN && søkerRegelverk == RegelverkResultat.OPPFYLT_NASJONALE_REGLER
}.inneholder(true)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -141,3 +141,14 @@ fun <V, R> Collection<Tidslinje<V>>.kombinerNullableKombinator(listeKombinator:
is Udefinert -> Udefinert()
}
}

fun <V, R> Tidslinje<V>.mapVerdiNullable(mapper: (V?) -> R?): Tidslinje<R> =
this.map { periodeVerdi ->
when (periodeVerdi) {
is Verdi,
is Null,
-> mapper(periodeVerdi.verdi)?.let { Verdi(it) } ?: Null()

is Udefinert -> Udefinert()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@ package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon

import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned
import no.nav.familie.ba.sak.common.førsteDagINesteMåned
import no.nav.familie.ba.sak.common.isSameOrAfter
import no.nav.familie.ba.sak.common.isSameOrBefore
import no.nav.familie.ba.sak.common.sisteDagIForrigeMåned
import no.nav.familie.ba.sak.common.sisteDagIInneværendeMåned
import no.nav.familie.ba.sak.common.sisteDagIMåned
import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.Person
import no.nav.familie.tidslinje.Periode
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.tilTidslinje
import no.nav.familie.tidslinje.utvidelser.tilPerioder
import java.time.LocalDate
import java.time.YearMonth

Expand Down Expand Up @@ -45,3 +48,17 @@ fun opprettBooleanTidslinje(
fraDato: LocalDate,
tilDato: LocalDate,
) = listOf(Periode(verdi = true, fom = fraDato, tom = tilDato)).tilTidslinje()

fun <V> Tidslinje<V>.verdiPåTidspunkt(tidspunkt: LocalDate): V? = this.tilPerioder().verdiForTidspunkt(tidspunkt)

fun <V> Collection<Periode<V>>.verdiForTidspunkt(tidspunkt: LocalDate): V? = this.firstOrNull { it.omfatter(tidspunkt) }?.verdi

private fun <V> Periode<V>.omfatter(tidspunkt: LocalDate) =
when {
fom == null && tom == null -> true
fom == null -> tom!!.isSameOrAfter(tidspunkt)
tom == null -> fom!!.isSameOrBefore(tidspunkt)
else -> fom!!.isSameOrBefore(tidspunkt) && tom!!.isSameOrAfter(tidspunkt)
}

fun <V> Periode<V>.tilTidslinje(): Tidslinje<V> = listOf(this).tilTidslinje()
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon

import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned
import no.nav.familie.ba.sak.common.sisteDagIForrigeMåned
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.verdiPåTidspunkt
import no.nav.familie.tidslinje.Null
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.Udefinert
Expand Down Expand Up @@ -32,24 +35,14 @@ fun <V> Tidslinje<V>.tilMånedFraMånedsskifteIkkeNull(
mapper: (innholdSisteDagForrigeMåned: V, innholdFørsteDagDenneMåned: V) -> V?,
): Tidslinje<V> =
this
.konverterTilMåned(antallMndBakoverITid = 1) { dato, måneder ->
val sisteDagForrigeMåned =
måneder
.first()
.lastOrNull()
?.periodeVerdi
?.verdi
val førsteDagDenneMåned =
måneder
.last()
.firstOrNull()
?.periodeVerdi
?.verdi
.konverterTilMåned { dato, _ ->
val verdiForrigeMåned = verdiPåTidspunkt(dato.sisteDagIForrigeMåned())
val verdiDenneMåned = verdiPåTidspunkt(dato.førsteDagIInneværendeMåned())

if (sisteDagForrigeMåned == null || førsteDagDenneMåned == null) {
if (verdiForrigeMåned == null || verdiDenneMåned == null) {
Null()
} else {
mapper(sisteDagForrigeMåned, førsteDagDenneMåned).tilPeriodeVerdi()
mapper(verdiForrigeMåned, verdiDenneMåned).tilPeriodeVerdi()
}
}.trim(Null(), Udefinert())

Expand Down
Loading