-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Chore: skriv om funksjon som oppdater aty med endret utbetaling (#5091)
### 💰 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
Showing
21 changed files
with
1,716 additions
and
753 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
167 changes: 167 additions & 0 deletions
167
...no/nav/familie/ba/sak/kjerne/beregning/AndelTilkjentYtelseMedEndretUtbetalingGenerator.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
18 changes: 18 additions & 0 deletions
18
...familie/ba/sak/kjerne/beregning/EndretUtbetalingAndelMedAndelerTilkjentYtelseTidslinje.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
Oops, something went wrong.