Skip to content

Commit

Permalink
Chore: skriv om funksjon som oppdater aty med endret utbetaling (#5091)
Browse files Browse the repository at this point in the history
### 💰 Hva skal gjøres, og hvorfor?
Favro:
https://favro.com/organization/98c34fb974ce445eac854de0/1844bbac3b6605eacc8f5543?card=NAV-22696

**OBS!! Må leses commit for commit**

Skriver om funksjonen som oppdaterer andel tilkjent ytelse med endret
utbetaling andeler. Den gamle koden var unødvendig kompleks siden det
ble skrevet før vi fikk tidslinje-rammeverket. Jeg sletter ikke den
gamle koden i denne PRen, men lar det ligge bak en toggle, så vi kan
teste godt i preprod før vi skrur det på i prod. Har også restrukturert
litt da `TilkjentYtelseUtils`-filen var massiv. Flytter kode ut i
diverse Generator-filer. Lar den gamle koden ligge igjen i
`TilkjentYtelseUtils` også rydder jeg opp når toggle fjernes.

PRen ser MASSIV ut, men det er egentlig mest flytting av kode og
skriving av tester som er mange kodelinjer.

### 🔎️ Er det noe spesielt du ønsker tilbakemelding om?
Har skrevet et par kommentarer.

### ✅ Checklist
_Har du husket alle punktene i listen?_
- [x] Jeg har testet mine endringer i henhold til akseptansekriteriene
🕵️
- [ ] Jeg har config- eller sql-endringer. I så fall, husk manuell
deploy til miljø for å verifisere endringene.
- [x] Jeg har skrevet tester. Hvis du ikke har skrevet tester, beskriv
hvorfor under 👇

### 💬 Ønsker du en muntlig gjennomgang?
- [x] Ja, kan gjerne ta muntlig gjennomgang av PR
- [ ] Nei
  • Loading branch information
idaame authored Feb 25, 2025
1 parent 5d0e936 commit 33daf27
Show file tree
Hide file tree
Showing 21 changed files with 1,716 additions and 753 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ enum class FeatureToggle(
// NAV-23733
BRUK_OVERSTYRING_AV_FOM_SISTE_ANDEL_UTVIDET("familie-ba-sak.bruk-overstyring-av-fom-siste-andel-utvidet"),

// NAV-24196
TILLAT_OPPRETT_AV_BEHANDLING_PÅ_VIKAFOSSEN("familie-ba-sak.tillatt_opprett_av_behandling_paa_vikafossen"),
// NAV-22696
SKAL_BRUKE_NY_VERSJON_AV_OPPDATERING_AV_ANDELER_MED_ENDRINGER("familie-ba-sak.ny-versjon-oppdater-andeler-med-endringer"),

// NAV-24034
BRUK_NY_SAKSBEHANDLER_NAVN_FORMAT_I_SIGNATUR("familie-ba-sak.bruk-ny-saksbehandler-navn-format-i-signatur"),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
package no.nav.familie.ba.sak.kjerne.beregning

import no.nav.familie.ba.sak.common.Feil
import no.nav.familie.ba.sak.common.Utils.avrundetHeltallAvProsent
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.AndelTilkjentYtelseMedEndreteUtbetalinger
import no.nav.familie.ba.sak.kjerne.beregning.domene.EndretUtbetalingAndelMedAndelerTilkjentYtelse
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.beregning.domene.medEndring
import no.nav.familie.ba.sak.kjerne.personident.Aktør
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.komposisjon.mapVerdiNullable
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon.ZipPadding
import no.nav.familie.ba.sak.kjerne.tidslinjefamiliefelles.transformasjon.zipMedNeste
import no.nav.familie.tidslinje.Periode
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.tilTidslinje
import no.nav.familie.tidslinje.utvidelser.filtrerIkkeNull
import no.nav.familie.tidslinje.utvidelser.kombinerMed
import no.nav.familie.tidslinje.utvidelser.tilPerioderIkkeNull
import java.math.BigDecimal

object AndelTilkjentYtelseMedEndretUtbetalingGenerator {
fun lagAndelerMedEndretUtbetalingAndeler(
andelTilkjentYtelserUtenEndringer: Collection<AndelTilkjentYtelse>,
endretUtbetalingAndeler: List<EndretUtbetalingAndelMedAndelerTilkjentYtelse>,
tilkjentYtelse: TilkjentYtelse,
): List<AndelTilkjentYtelseMedEndreteUtbetalinger> {
if (endretUtbetalingAndeler.isEmpty()) {
return andelTilkjentYtelserUtenEndringer
.map { AndelTilkjentYtelseMedEndreteUtbetalinger.utenEndringer(it.copy()) }
}

val andelerPerAktørOgType = andelTilkjentYtelserUtenEndringer.groupBy { Pair(it.aktør, it.type) }
val endringerPerAktør =
endretUtbetalingAndeler.groupBy {
it.person?.aktør
?: throw Feil("Endret utbetaling andel ${it.endretUtbetalingAndel.id} i behandling ${tilkjentYtelse.behandling.id} er ikke knyttet til en person")
}

val oppdaterteAndeler =
andelerPerAktørOgType.flatMap { (aktørOgType, andelerForAktørOgType) ->
val aktør = aktørOgType.first
val ytelseType = aktørOgType.second

when (ytelseType) {
YtelseType.ORDINÆR_BARNETRYGD,
YtelseType.UTVIDET_BARNETRYGD,
->
lagAndelerMedEndretUtbetalingAndelerForPerson(
andelerAvTypeForPerson = andelerForAktørOgType,
endretUtbetalingAndelerForPerson = endringerPerAktør.getOrDefault(aktør, emptyList()),
tilkjentYtelse = tilkjentYtelse,
)
YtelseType.SMÅBARNSTILLEGG ->
throw Feil("Småbarnstillegg kan ikke oppdateres med endret utbetaling andeler i behandling=${tilkjentYtelse.behandling.id}")
}
}

return oppdaterteAndeler
}

private fun lagAndelerMedEndretUtbetalingAndelerForPerson(
andelerAvTypeForPerson: List<AndelTilkjentYtelse>,
endretUtbetalingAndelerForPerson: List<EndretUtbetalingAndelMedAndelerTilkjentYtelse>,
tilkjentYtelse: TilkjentYtelse,
): List<AndelTilkjentYtelseMedEndreteUtbetalinger> {
if (endretUtbetalingAndelerForPerson.isEmpty()) {
return andelerAvTypeForPerson
.map { AndelTilkjentYtelseMedEndreteUtbetalinger.utenEndringer(it.copy()) }
}

val andelerTidslinje = andelerAvTypeForPerson.map { it.tilPeriode() }.tilTidslinje()
val endretUtbetalingTidslinje = endretUtbetalingAndelerForPerson.tilTidslinje()

val andelerMedEndringerTidslinje =
andelerTidslinje.kombinerMed(endretUtbetalingTidslinje) { andelTilkjentYtelse, endretUtbetalingAndel ->
if (andelTilkjentYtelse == null) {
null
} else {
val nyttBeløp =
if (endretUtbetalingAndel != null) {
andelTilkjentYtelse.sats.avrundetHeltallAvProsent(
endretUtbetalingAndel.prosent!!,
)
} else {
andelTilkjentYtelse.kalkulertUtbetalingsbeløp
}
val prosent =
if (endretUtbetalingAndel != null) endretUtbetalingAndel.prosent!! else andelTilkjentYtelse.prosent

AndelMedEndretUtbetalingForTidslinje(
aktør = andelTilkjentYtelse.aktør,
beløp = nyttBeløp,
sats = andelTilkjentYtelse.sats,
ytelseType = andelTilkjentYtelse.type,
prosent = prosent,
endretUtbetalingAndel = endretUtbetalingAndel,
)
}
}

return andelerMedEndringerTidslinje
.slåSammenEtterfølgende0krAndelerPgaSammeEndretAndel()
.tilAndelerTilkjentYtelseMedEndreteUtbetalinger(tilkjentYtelse)
}

internal data class AndelMedEndretUtbetalingForTidslinje(
val aktør: Aktør,
val beløp: Int,
val sats: Int,
val ytelseType: YtelseType,
val prosent: BigDecimal,
val endretUtbetalingAndel: EndretUtbetalingAndelMedAndelerTilkjentYtelse?,
)

internal fun Tidslinje<AndelMedEndretUtbetalingForTidslinje>.tilAndelerTilkjentYtelseMedEndreteUtbetalinger(
tilkjentYtelse: TilkjentYtelse,
): List<AndelTilkjentYtelseMedEndreteUtbetalinger> =
this
.tilPerioderIkkeNull()
.map { it.tilAndelTilkjentYtelseMedEndreteUtbetalinger(tilkjentYtelse) }

internal fun Periode<AndelMedEndretUtbetalingForTidslinje>.tilAndelTilkjentYtelseMedEndreteUtbetalinger(
tilkjentYtelse: TilkjentYtelse,
): AndelTilkjentYtelseMedEndreteUtbetalinger {
val andelTilkjentYtelse =
AndelTilkjentYtelse(
behandlingId = tilkjentYtelse.behandling.id,
tilkjentYtelse = tilkjentYtelse,
aktør = this.verdi.aktør,
type = this.verdi.ytelseType,
kalkulertUtbetalingsbeløp = this.verdi.beløp,
nasjonaltPeriodebeløp = this.verdi.beløp,
differanseberegnetPeriodebeløp = null,
sats = this.verdi.sats,
prosent = this.verdi.prosent,
stønadFom = this.fom?.toYearMonth() ?: throw Feil("Fra og med-dato ikke satt"),
stønadTom = this.tom?.toYearMonth() ?: throw Feil("Til og med-dato ikke satt"),
)

val endretUtbetalingAndel = this.verdi.endretUtbetalingAndel

return if (endretUtbetalingAndel == null) {
AndelTilkjentYtelseMedEndreteUtbetalinger.utenEndringer(andelTilkjentYtelse)
} else {
andelTilkjentYtelse.medEndring(endretUtbetalingAndel)
}
}

internal fun Tidslinje<AndelMedEndretUtbetalingForTidslinje>.slåSammenEtterfølgende0krAndelerPgaSammeEndretAndel() =
this
.zipMedNeste(ZipPadding.FØR)
.mapVerdiNullable {
val forrigeAndelMedEndring = it?.first
val nåværendeAndelMedEndring = it?.second

val forrigeOgNåværendeAndelEr0kr =
forrigeAndelMedEndring?.prosent == BigDecimal.ZERO && nåværendeAndelMedEndring?.prosent == BigDecimal.ZERO
val forrigeOgNåværendeAndelErPåvirketAvSammeEndring =
forrigeAndelMedEndring?.endretUtbetalingAndel?.endretUtbetalingAndel == nåværendeAndelMedEndring?.endretUtbetalingAndel?.endretUtbetalingAndel &&
nåværendeAndelMedEndring?.endretUtbetalingAndel != null

if (forrigeOgNåværendeAndelEr0kr && forrigeOgNåværendeAndelErPåvirketAvSammeEndring) forrigeAndelMedEndring else nåværendeAndelMedEndring
}.filtrerIkkeNull()
}
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.toYearMonth
import no.nav.familie.ba.sak.config.FeatureToggle
import no.nav.familie.ba.sak.config.featureToggle.UnleashNextMedContextService
import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService
import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingRepository
Expand Down Expand Up @@ -38,6 +40,7 @@ class BeregningService(
private val småbarnstilleggService: SmåbarnstilleggService,
private val tilkjentYtelseEndretAbonnenter: List<TilkjentYtelseEndretAbonnent> = emptyList(),
private val andelerTilkjentYtelseOgEndreteUtbetalingerService: AndelerTilkjentYtelseOgEndreteUtbetalingerService,
private val unleashNextMedContextService: UnleashNextMedContextService,
) {
fun slettTilkjentYtelseForBehandling(behandlingId: Long) =
tilkjentYtelseRepository
Expand Down Expand Up @@ -186,11 +189,12 @@ class BeregningService(
?: throw IllegalStateException("Kunne ikke hente vilkårsvurdering for behandling med id ${behandling.id}")

val tilkjentYtelse =
TilkjentYtelseUtils.beregnTilkjentYtelse(
TilkjentYtelseGenerator.genererTilkjentYtelse(
vilkårsvurdering = vilkårsvurdering,
personopplysningGrunnlag = personopplysningGrunnlag,
endretUtbetalingAndeler = endreteUtbetalingAndeler,
fagsakType = behandling.fagsak.type,
skalBrukeNyVersjonAvOppdaterAndelerMedEndringer = unleashNextMedContextService.isEnabled(FeatureToggle.SKAL_BRUKE_NY_VERSJON_AV_OPPDATERING_AV_ANDELER_MED_ENDRINGER),
) { søkerAktør ->
småbarnstilleggService.hentOgLagrePerioderMedOvergangsstønadForBehandling(
søkerAktør = søkerAktør,
Expand All @@ -206,8 +210,9 @@ class BeregningService(
}

// For at endret utbetaling andeler skal fungere så må man generere andeler før man kobler endringene på andelene
// Dette er fordi en endring regnes som gyldig når den overlapper med en andel og har gyldig årsak
// Hvis man ikke genererer andeler før man kobler på endringene så vil ingen av endringene ses på som gyldige, altså ikke oppdatere noen andeler
// Dette er fordi en endring regnes som gyldig når den overlapper med en andel og har gyldig årsak
// Hvis man ikke genererer andeler før man kobler på endringene så vil ingen av endringene ses på som gyldige, altså ikke oppdatere noen andeler
@Transactional
fun genererTilkjentYtelseFraVilkårsvurdering(
behandling: Behandling,
personopplysningGrunnlag: PersonopplysningGrunnlag,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package no.nav.familie.ba.sak.kjerne.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.kjerne.beregning.domene.EndretUtbetalingAndelMedAndelerTilkjentYtelse
import no.nav.familie.tidslinje.Periode
import no.nav.familie.tidslinje.Tidslinje
import no.nav.familie.tidslinje.tilTidslinje

fun Collection<EndretUtbetalingAndelMedAndelerTilkjentYtelse>.tilTidslinje(): Tidslinje<EndretUtbetalingAndelMedAndelerTilkjentYtelse> =
this
.map {
Periode(
verdi = it,
fom = it.fom?.førsteDagIInneværendeMåned(),
tom = it.tom?.sisteDagIInneværendeMåned(),
)
}.tilTidslinje()
Loading

0 comments on commit 33daf27

Please sign in to comment.