Skip to content

Commit

Permalink
Fix: Omskriving av OPPDATER_UTVIDET_KLASSEKODE-behandling for å kunne…
Browse files Browse the repository at this point in the history
… fikse fagsaker med feil periodeIder (#5071)

[NAV-24233](https://favro.com/organization/98c34fb974ce445eac854de0/1844bbac3b6605eacc8f5543?card=NAV-24233)

### 💰 Hva skal gjøres, og hvorfor?
For å få korrigert fagsaker med feil offsets på siste iverksatte
behandling skriver vi her om logikken i
`OPPDATER_UTVIDET_KLASSEKODE`-behandlinger. Nå sørger vi for at vi
sender alle andeler fra og med andelen som overlapper med inneværende
mnd og fremover for alle fagsaker som er berørt. I verste fall vil dette
innebære at vi sender andeler fra og med 01.07.23 og frem over på nytt,
og vi vil derfor få 0-utbetalinger fra 01.07.23 og for alle måneder frem
til nå.

Fagsaker som blir plukket ut for kjøring er fagsaker som tidligere har
hatt en `OPPDATER_UTVIDET_KLASSEKODE`-behandling og som har blitt
revurdert i etterkant. Noen av disse vil ikke ha feil offset og vil bli
ignorert i selve jobben.

En spørring 11.02.25 sier at det er 995 fagsaker som vil bli plukket ut,
og det vil da altså være et subset av disse vi vil kjøre behandlingen
for.

### ✅ Checklist
- [ ] Jeg har testet mine endringer i henhold til akseptansekriteriene
🕵️
- [ ] Jeg har config- eller sql-endringer.
- [x] Jeg har skrevet tester.

### 💬 Ønsker du en muntlig gjennomgang?
- [ ] Ja
- [ ] Nei
  • Loading branch information
bragejahren authored Feb 13, 2025
1 parent aa6b018 commit 36fc15d
Show file tree
Hide file tree
Showing 15 changed files with 94 additions and 375 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,13 @@ class AndelDataForOppdaterUtvidetKlassekodeBehandlingUtleder(
val (utvidetAndelerTilkjentYtelse, øvrigeAndelerTilkjentYtelse) = forrigeTilkjentYtelse.andelerTilkjentYtelse.partition { it.erUtvidet() }
val utvidetAndeler =
utvidetAndelerTilkjentYtelse.mapNotNull {
// Splitter andel som treffer inneværende måned og fjerner alle andeler som kommer etter.
if (it.stønadFom <= inneværendeMåned && it.stønadTom > inneværendeMåned) {
it.tilAndelDataLongId(skalBrukeNyKlassekodeForUtvidetBarnetrygd).copy(tom = inneværendeMåned)
// Fjerner alle andeler som overlapper eller kommer etter inneværende måned
if (it.stønadFom <= inneværendeMåned && it.stønadTom >= inneværendeMåned) {
null
} else if (it.stønadFom >= inneværendeMåned) {
null
} else {
// Tar med alle andeler som kommer før
it.tilAndelDataLongId(skalBrukeNyKlassekodeForUtvidetBarnetrygd)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ 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.BehandlingÅrsak
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelseRepository
import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse
Expand Down Expand Up @@ -54,7 +53,7 @@ class UtbetalingsoppdragGenerator(
val forrigeAndeler =
if (forrigeTilkjentYtelse == null) {
emptyList()
} else if (vedtak.behandling.opprettetÅrsak != BehandlingÅrsak.OPPDATER_UTVIDET_KLASSEKODE) {
} else if (!vedtak.behandling.erOppdaterUtvidetKlassekode()) {
forrigeTilkjentYtelse.tilAndelData(skalBrukeNyKlassekodeForUtvidetBarnetrygd)
} else {
andelDataForOppdaterUtvidetKlassekodeBehandlingUtleder.finnForrigeAndelerForOppdaterUtvidetKlassekodeBehandling(forrigeTilkjentYtelse, skalBrukeNyKlassekodeForUtvidetBarnetrygd)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import no.nav.familie.ba.sak.kjerne.behandling.SnikeIKøenService
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.BehandlingÅrsak
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelseRepository
import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository
import no.nav.familie.ba.sak.kjerne.steg.StegType
import no.nav.familie.ba.sak.sikkerhet.SikkerhetContext
Expand All @@ -27,29 +28,40 @@ class AutovedtakOppdaterUtvidetKlassekodeService(
private val autovedtakService: AutovedtakService,
private val taskRepository: TaskRepositoryWrapper,
private val tilkjentYtelseRepository: TilkjentYtelseRepository,
private val andelTilkjentYtelseRepository: AndelTilkjentYtelseRepository,
) {
val logger = LoggerFactory.getLogger(this::class.java)

@Transactional
fun utførMigreringTilOppdatertUtvidetKlassekode(fagsakId: Long) {
logger.info("Utfører migrering til ny klassekode for utvidet barnetrygd for fagsak=$fagsakId")
logger.info("Revurderer fagsak=$fagsakId som kan ha feil periodeId'er i siste vedtatte behandling")

if (tilkjentYtelseRepository.harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd(fagsakId)) {
logger.info("Hopper ut av behandling fordi fagsak $fagsakId allerede bruker ny klassekode for utvidet barnetrygd.")
oppdaterUtvidetKlassekodeKjøringRepository.settBrukerNyKlassekodeTilTrueOgStatusTilUtført(fagsakId)
return
}

val sisteVedtatteBehandling =
behandlingHentOgPersisterService.hentSisteBehandlingSomErVedtatt(fagsakId = fagsakId)
val sisteIverksatteBehandling =
behandlingHentOgPersisterService.hentSisteBehandlingSomErIverksatt(fagsakId = fagsakId)
?: error("Fant ikke siste vedtatte behandling for fagsak $fagsakId")

if (!sisteVedtatteBehandling.harLøpendeUtvidetBarnetrygd()) {
if (!sisteIverksatteBehandling.harLøpendeUtvidetBarnetrygd()) {
logger.info("Hopper ut av behandling fordi fagsak $fagsakId ikke har løpende utvidet barnetrygd.")
oppdaterUtvidetKlassekodeKjøringRepository.deleteByFagsakId(fagsakId)
return
}

val sisteAndelIUtvidetKjede =
andelTilkjentYtelseRepository
.hentSisteAndelPerIdentOgType(fagsakId)
.single { it.erUtvidet() }

val harSisteUtvidetAndelISisteIverksatteBehandling =
andelTilkjentYtelseRepository
.finnAndelerTilkjentYtelseForBehandling(behandlingId = sisteIverksatteBehandling.id)
.filter { it.erUtvidet() }
.any { it.periodeOffset == sisteAndelIUtvidetKjede.periodeOffset }

if (harSisteUtvidetAndelISisteIverksatteBehandling) {
logger.info("Hopper ut av behandling fordi fagsak $fagsakId har siste utvidet andel i siste vedtatte behandling")
oppdaterUtvidetKlassekodeKjøringRepository.deleteByFagsakId(fagsakId)
}

val aktivOgÅpenBehandling = behandlingHentOgPersisterService.finnAktivOgÅpenForFagsak(fagsakId = fagsakId)

if (aktivOgÅpenBehandling != null) {
Expand All @@ -69,7 +81,7 @@ class AutovedtakOppdaterUtvidetKlassekodeService(

val behandlingEtterBehandlingsresultat =
autovedtakService.opprettAutomatiskBehandlingOgKjørTilBehandlingsresultat(
aktør = sisteVedtatteBehandling.fagsak.aktør,
aktør = sisteIverksatteBehandling.fagsak.aktør,
behandlingType = BehandlingType.REVURDERING,
behandlingÅrsak = BehandlingÅrsak.OPPDATER_UTVIDET_KLASSEKODE,
fagsakId = fagsakId,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class PopulerOppdaterUtvidetKlassekodeKjøringTask(
val (fagsakerSomSkalLagres, time) =
measureTimedValue {
fagsakRepository
.finnFagsakerMedLøpendeUtvidetBarnetrygdSomBrukerGammelKlassekode()
.finnFagsakerMedIverksattRevurderingEtterOppdaterUtvidetKlassekodeBehandling()
.minus(fagsakerSomErLagret)
.map { OppdaterUtvidetKlassekodeKjøring(fagsakId = it) }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package no.nav.familie.ba.sak.kjerne.beregning

import no.nav.familie.ba.sak.common.FunksjonellFeil
import no.nav.familie.ba.sak.common.Utils.avrundetHeltallAvProsent
import no.nav.familie.ba.sak.kjerne.autovedtak.oppdaterutvidetklassekode.OppdaterUtvidetKlassekodeUtvidetAndelerSplitter
import no.nav.familie.ba.sak.kjerne.beregning.UtvidetBarnetrygdUtil.filtrertForPerioderBarnaBorMedSøker
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.domene.SatsType
Expand Down Expand Up @@ -62,10 +61,6 @@ data class UtvidetBarnetrygdGenerator(
)
}

return if (tilkjentYtelse.behandling.erOppdaterUtvidetKlassekode()) {
OppdaterUtvidetKlassekodeUtvidetAndelerSplitter.splittUtvidetAndelerIInneværendeMåned(utvidetAndeler)
} else {
utvidetAndeler
}
return utvidetAndeler
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -225,34 +225,19 @@ WHERE silp.stonad_tom < DATE_TRUNC('month', NOW())

@Query(
"""
WITH sisteVedtatteBehandling AS (SELECT b.id, b.fk_fagsak_id
FROM behandling b
JOIN fagsak f ON b.fk_fagsak_id = f.id
WHERE b.status = 'AVSLUTTET'
AND b.resultat NOT LIKE 'HENLAGT%'
AND f.status = 'LØPENDE'
AND f.arkivert = false
AND b.aktivert_tid = (SELECT MAX(b2.aktivert_tid)
FROM behandling b2
WHERE b2.fk_fagsak_id = f.id
AND b2.status = 'AVSLUTTET'
AND b2.resultat NOT LIKE 'HENLAGT%')),
fagsakMedLøpendeUtvidet AS (SELECT svb.fk_fagsak_id
FROM sisteVedtatteBehandling svb
JOIN tilkjent_ytelse ty ON ty.fk_behandling_id = svb.id
JOIN andel_tilkjent_ytelse aty ON aty.tilkjent_ytelse_id = ty.id
WHERE aty.type = 'UTVIDET_BARNETRYGD'
AND aty.stonad_tom >= DATE_TRUNC('month', NOW()))
SELECT fmle.fk_fagsak_id
FROM fagsakMedLøpendeUtvidet fmle
EXCEPT (SELECT f.id
FROM fagsak f
JOIN behandling b on f.id = b.fk_fagsak_id
JOIN tilkjent_ytelse ty ON b.id = ty.fk_behandling_id
WHERE ty.utbetalingsoppdrag is not null and ty.utbetalingsoppdrag like '%"klassifisering":"BAUTV-OP"%')
SELECT DISTINCT b1.fk_fagsak_id
FROM behandling b1
JOIN behandling b2
ON b1.fk_fagsak_id = b2.fk_fagsak_id
AND b2.aktivert_tid > b1.aktivert_tid
AND b2.opprettet_aarsak != 'OPPDATER_UTVIDET_KLASSEKODE'
AND b2.status = 'AVSLUTTET'
AND b2.resultat NOT LIKE 'HENLAGT%'
JOIN tilkjent_ytelse ty
ON b2.id = ty.fk_behandling_id AND ty.utbetalingsoppdrag IS NOT NULL
WHERE b1.opprettet_aarsak = 'OPPDATER_UTVIDET_KLASSEKODE';
""",
nativeQuery = true,
)
fun finnFagsakerMedLøpendeUtvidetBarnetrygdSomBrukerGammelKlassekode(): List<Long>
fun finnFagsakerMedIverksattRevurderingEtterOppdaterUtvidetKlassekodeBehandling(): List<Long>
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class AndelDataForOppdaterUtvidetKlassekodeBehandlingUtlederTest {
}

@Test
fun `skal splitte utvidet andel dersom nåtidspunkt treffer andelen samt fjerne alle utvidet andeler etter nåtidspunkt`() {
fun `skal fjerne utvidet andel dersom nåtidspunkt treffer andelen samt fjerne alle utvidet andeler etter nåtidspunkt`() {
// Arrange
val tilkjentYtelse = lagTilkjentYtelse()
val denneMåned = YearMonth.now(clockProvider.get())
Expand All @@ -80,13 +80,8 @@ class AndelDataForOppdaterUtvidetKlassekodeBehandlingUtlederTest {
val forrigeAndeler = andelDataForOppdaterUtvidetKlassekodeBehandlingUtleder.finnForrigeAndelerForOppdaterUtvidetKlassekodeBehandling(tilkjentYtelse, true)

// Assert
assertThat(forrigeAndeler).hasSize(2)
val utvidetAndelData = forrigeAndeler.single { it.type == YtelsetypeBA.UTVIDET_BARNETRYGD }
assertThat(utvidetAndelData.fom).isEqualTo(utvidetAndel.stønadFom)
assertThat(utvidetAndelData.tom).isEqualTo(denneMåned)
assertThat(utvidetAndelData.id).isEqualTo(utvidetAndel.id)
assertThat(utvidetAndelData.beløp).isEqualTo(utvidetAndel.kalkulertUtbetalingsbeløp)
assertThat(utvidetAndelData.type).isEqualTo(YtelsetypeBA.UTVIDET_BARNETRYGD)
assertThat(forrigeAndeler).hasSize(1)
assertThat(forrigeAndeler.none { it.type == YtelsetypeBA.UTVIDET_BARNETRYGD }).isTrue
}

@Test
Expand Down Expand Up @@ -118,7 +113,7 @@ class AndelDataForOppdaterUtvidetKlassekodeBehandlingUtlederTest {
}

@Test
fun `skal returnere tom liste dersom det ikke finnes noen forrige tilkjent ytelse`() {
fun `skal fjerne utvidet andel som treffer nåtidspunkt og alle etterfølgende utvidet andeler`() {
// Arrange
val tilkjentYtelse = lagTilkjentYtelse()
val denneMåned = YearMonth.now(clockProvider.get())
Expand Down Expand Up @@ -152,13 +147,8 @@ class AndelDataForOppdaterUtvidetKlassekodeBehandlingUtlederTest {
val forrigeAndeler = andelDataForOppdaterUtvidetKlassekodeBehandlingUtleder.finnForrigeAndelerForOppdaterUtvidetKlassekodeBehandling(tilkjentYtelse, true)

// Assert
assertThat(forrigeAndeler).hasSize(2)
val utvidetAndelData = forrigeAndeler.single { it.type == YtelsetypeBA.UTVIDET_BARNETRYGD }
assertThat(utvidetAndelData.fom).isEqualTo(utvidetAndel.stønadFom)
assertThat(utvidetAndelData.tom).isEqualTo(denneMåned)
assertThat(utvidetAndelData.id).isEqualTo(utvidetAndel.id)
assertThat(utvidetAndelData.beløp).isEqualTo(utvidetAndel.kalkulertUtbetalingsbeløp)
assertThat(utvidetAndelData.type).isEqualTo(YtelsetypeBA.UTVIDET_BARNETRYGD)
assertThat(forrigeAndeler).hasSize(1)
assertThat(forrigeAndeler.none { it.type == YtelsetypeBA.UTVIDET_BARNETRYGD }).isTrue
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import no.nav.familie.ba.sak.TestClockProvider
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.common.sisteDagIMåned
import no.nav.familie.ba.sak.common.toYearMonth
import no.nav.familie.ba.sak.config.FeatureToggle
Expand All @@ -28,6 +30,7 @@ import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.ValueSource
import java.time.LocalDate
import java.time.YearMonth

class UtbetalingsoppdragGeneratorTest {
private val klassifiseringKorrigerer: KlassifiseringKorrigerer = mockk()
Expand All @@ -36,7 +39,7 @@ class UtbetalingsoppdragGeneratorTest {
private val andelTilkjentYtelseRepository: AndelTilkjentYtelseRepository = mockk()
private val behandlingHentOgPersisterService: BehandlingHentOgPersisterService = mockk()
private val tilkjentYtelseRepository: TilkjentYtelseRepository = mockk()
private val andelDataForOppdaterUtvidetKlassekodeBehandlingUtleder: AndelDataForOppdaterUtvidetKlassekodeBehandlingUtleder = mockk()
private val andelDataForOppdaterUtvidetKlassekodeBehandlingUtleder: AndelDataForOppdaterUtvidetKlassekodeBehandlingUtleder = AndelDataForOppdaterUtvidetKlassekodeBehandlingUtleder(TestClockProvider.lagClockProviderMedFastTidspunkt(YearMonth.of(2025, 2)))
private val utbetalingsoppdragGenerator =
UtbetalingsoppdragGenerator(
utbetalingsgenerator = Utbetalingsgenerator(),
Expand Down Expand Up @@ -319,8 +322,8 @@ class UtbetalingsoppdragGeneratorTest {
lagAndelTilkjentYtelse(
id = 1,
behandling = forrigeBehandling,
fom = LocalDate.now().toYearMonth(),
tom = LocalDate.now().toYearMonth(),
fom = YearMonth.of(2024, 6),
tom = YearMonth.of(2025, 3),
periodeIdOffset = 0,
forrigeperiodeIdOffset = null,
person = barn,
Expand All @@ -340,8 +343,8 @@ class UtbetalingsoppdragGeneratorTest {
lagAndelTilkjentYtelse(
id = 2,
behandling = behandling,
fom = LocalDate.now().toYearMonth(),
tom = LocalDate.now().toYearMonth(),
fom = YearMonth.of(2024, 6),
tom = YearMonth.of(2025, 3),
person = barn,
ytelseType = YtelseType.UTVIDET_BARNETRYGD,
kildeBehandlingId = null,
Expand Down Expand Up @@ -409,8 +412,6 @@ class UtbetalingsoppdragGeneratorTest {
firstArg()
}

every { andelDataForOppdaterUtvidetKlassekodeBehandlingUtleder.finnForrigeAndelerForOppdaterUtvidetKlassekodeBehandling(any(), any()) } returns emptyList()

every { tilkjentYtelseRepository.findByOppdatertUtvidetBarnetrygdKlassekodeIUtbetalingsoppdrag(any()) } returns emptyList()
// Act
val beregnetUtbetalingsoppdragLongId =
Expand Down Expand Up @@ -444,11 +445,21 @@ class UtbetalingsoppdragGeneratorTest {
beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.utbetalingsperiode
.single()
.vedtakdatoFom,
).isEqualTo(LocalDate.now().førsteDagIInneværendeMåned())
).isEqualTo(
tilkjentYtelse.andelerTilkjentYtelse
.single()
.stønadFom
.førsteDagIInneværendeMåned(),
)
assertThat(
beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.utbetalingsperiode
.single()
.vedtakdatoTom,
).isEqualTo(LocalDate.now().sisteDagIMåned())
).isEqualTo(
tilkjentYtelse.andelerTilkjentYtelse
.single()
.stønadTom
.sisteDagIInneværendeMåned(),
)
}
}
Loading

0 comments on commit 36fc15d

Please sign in to comment.