diff --git a/src/main/kotlin/no/nav/familie/ef/sak/behandling/grunnbelop/GOmregningTaskService.kt b/src/main/kotlin/no/nav/familie/ef/sak/behandling/grunnbelop/GOmregningTaskService.kt index e44aac5a83..2fede21c94 100644 --- a/src/main/kotlin/no/nav/familie/ef/sak/behandling/grunnbelop/GOmregningTaskService.kt +++ b/src/main/kotlin/no/nav/familie/ef/sak/behandling/grunnbelop/GOmregningTaskService.kt @@ -62,15 +62,7 @@ class GOmregningTaskService( return fagsakIder.size } - private fun finnFagsakIder(): List { - val fagsakIder = when (featureToggleService.isEnabled(Toggle.G_BEREGNING_INKLUDER_SATT_PÅ_VENT)) { - false -> fagsakRepository.finnFerdigstilteFagsakerMedUtdatertGBelop( - nyesteGrunnbeløpGyldigFraOgMed.atDay(1), - ) - true -> fagsakRepository.finnFerdigstilteEllerSattPåVentFagsakerMedUtdatertGBelop( - nyesteGrunnbeløpGyldigFraOgMed.atDay(1), - ) - } - return fagsakIder - } + private fun finnFagsakIder(): List = fagsakRepository.finnFerdigstilteFagsakerMedUtdatertGBelop( + nyesteGrunnbeløpGyldigFraOgMed.atDay(1), + ) } diff --git a/src/main/kotlin/no/nav/familie/ef/sak/behandling/grunnbelop/dok/G-omregning-README.md b/src/main/kotlin/no/nav/familie/ef/sak/behandling/grunnbelop/dok/G-omregning-README.md index 998ba62cbe..b06a105cf0 100644 --- a/src/main/kotlin/no/nav/familie/ef/sak/behandling/grunnbelop/dok/G-omregning-README.md +++ b/src/main/kotlin/no/nav/familie/ef/sak/behandling/grunnbelop/dok/G-omregning-README.md @@ -5,47 +5,41 @@ Noen av kommentarene i dette dokumentet går litt ut over implementering av kode Viktig med forklaring på hvordan og hvorfor koden har blitt som den har blitt, hvilke valg vi har tatt og hva vi jobber med å endre før neste g-omregning. +## Årlig arbeid - -### Teknisk - flyt og valg - -#### Flyt: - -##### 1. Start - scheduler + sql - -**Når G er vedtatt:** +**Når G er vedtatt (mai/juni):** 1. Vurder om vi skal skru av scheduler (se under) 2. Legg inn ny G i no.nav.familie.ef.sak.beregning.Grunnbeløpsperioder 3. Nye behandlinger vil nå bruke ny G 4. Kjør gjerne en test med 1 fagsak (se ManuellGOmregningController under) før man setter på scheduler? -5. Husk å oppdatere G i iverksett (eller skriv om kode - send G fra ef-sak) -6. Se "etterarbeid under" +5. Se ["etterarbeid under"](#etterarbeid) G-omregning starter vanligvis med at en scheduler finner kandidater for g-omregning (sql) `no.nav.familie.ef.sak.behandling.grunnbelop.GOmregningTaskServiceScheduler` -Scheduler kjøres typisk en gang i uka og vil prøve å finne ferdigstilte fagsaker med gammel G uten samordning. -Det finnes to versjoner av denne - en som i tillegg henter saker på vent. Denne må toggle skrus på. +Scheduler kjøres typisk en gang i uka (tirsdager kl 15) og vil prøve å finne ferdigstilte fagsaker med gammel G uten samordning. -Saker som var åpne ved første g-omregning vil bli forsøkt kjørt i neste ukes batch hvis de er ferdige. +Saker som var åpne ved første g-omregning vil bli forsøkt kjørt i neste ukes batch hvis de er ferdigstilt i mellomtiden. Det finnes også en controller hvor man også kan kjøre omregning på _en_ fagsak `no.nav.familie.ef.sak.forvaltning.ManuellGOmregningController` -##### 2. Utfør gomregning (kode) -1. Vi kopier data fra forrige behandling -> ny G - behandling -2. Vi justerer inntekt [HER ER DET GJORT NOEN VALG!!!] -3. Vi beregner ytelse [HER ER DET GJORT NOEN VALG!!!] -4. Vi iverksetter uten brev -5. Vi oppretter ny task som poller status fra iverksett (vanlig flyt) -* familie-ef-iverksett: Iverksetter mot økonomi og sender melding til ditt nav -(hvis dette ikke endres må ny G også oppdateres på iverksett) +### Teknisk - flyt og valg + +##### Hvordan utføres g-omregning (kode) +1. Data kopieres fra forrige behandling -> ny G - behandling +2. Inntekten justeres ihht G [HER ER DET GJORT NOEN VALG!!!] +3. Ytelsen beregnes på nytt [HER ER DET GJORT NOEN VALG!!!] +4. Iverksetting uten brev +5. `familie-ef-iverksett`: Iverksetter mot økonomi og sender melding til Ditt NAV +6. Task som poller status fra iverksett (vanlig flyt) ### Noen valg det er fint å vite om #### Indeksjustering av inntekt. `no.nav.familie.ef.sak.beregning.BeregningKt.finnGrunnbeløpsPerioder` -Vi indeksjusterer inntekt når vi g-omregner. For hver inntektsperiode vi skal endre: +Inntekten indeksjusteres ved g-omregning. Forslag til å slutte med dette er utarbeidet (mars 2024), men ikke løst. +For hver inntektsperiode vi skal endre: 1. Vi finner omregningsfaktor 2. Vi finner total inntekt (dag + mnd + år). 3. Total inntekt rundes ned til nærmeste 1000 (finne F - forventet inntekt). *1 @@ -78,21 +72,14 @@ igjen mai for regulering senere. For at åpne behandlinger, f.eks. en behandling Valideringen utføres når et vedtak besluttes. Lengden på overgangsperioden bestemmes utifra `fristGOmregning` som vi har hardkodet til 1. juni. Det betyr at hvis koden oppdateres med ny G 20. mai, vil man i perioden 20.mai - 1. juni få lov til å iverksette både med nyeste og nest nyeste G. `fristGOmregning` kan justeres utifra hvor strenge vi ønsker å være. -#### Etterarbeid/sjekkliste: - -* Gå igjennom de med samordningsfradrag - disse må g-reguleres manuelt - -* Gå igjennom de med sanksjon - disse må revurderes manuelt -(NB! ikke mulig å g-omregne mai-løpende, juni-sanksjon, juli-løpende). Denne vil kaste feil. - -* Gå igjennom de som er satt på vent? Vurdere om disse skal kjøres maskinelt? - -* Sjekk om det ligger noen som IKKE er g-omregnet. Typisk 0-utbetaling i juni og utover - de som er tagget med 2022 etter g-omregningsdag +### Etterarbeid: +Når G-omregningen er ferdigkjørt er det viktig å gå igjennom denne listen for å passe på at alle rutinene er fulgt og oppdatert. -* Sjekk om det det er innvilget vedtak (revurdering) med fom > mai2023 OG har 2022-verdi for mai/juni+++ som ikke ble omregnet automatisk og nytt vedtak fattet - som starter ETTER mai. -Spennende sql her / Lag kotlinkode som henter ut alle behandlinger som har 2023-tag, MEN ikke har noen g-omregningsbehandling for 2023. Gjør tørr-beregning (ikke "g-beregning" for disse fra mai 2023 og se om det blir diff i ATY) +* `FinnBehandlingerMedGammelGTask` vil rapportere de som må håndteres manuelt (samordningsfradrag) den 1. i hver måned. + * De i denne listen som har samordning skal overleveres til coachene. + * Hvis G-omregning skjer etter 1. juni: Rekjør denne tasken når G-omregningen er ferdigkjørt -* Fallgruver: Behandlinger med samordningsfradrag blir ikke plukket opp - her må vi sjekke litt "jevnt og trutt" (!). Det vil bli laget en egen task som sjekker om det finnes behandlinger som ikke har blitt g-omregnet enda, før g-omregning 2024. +* For de tilfellene med sanksjonsperioder vil G-omregningstasken feile. Denne må manuelt G-omregnes av coachene og tasken kan avvikshåndteres * Oppdater veiviser med barnetilsyn 6G (vilkår for å kunne motta = inntekt under 6G) @@ -100,5 +87,5 @@ Spennende sql her / Lag kotlinkode som henter ut alle behandlinger som har 2023- * Sjekk om det er riktig G brukt på nav.no? -* Kanskje sjekke om noen har fått avslag på førstegangsbehandling i mai på "BT" med begrunnelse over 6 gamle G +* Kanskje sjekke om noen har fått avslag på førstegangsbehandling i mai på "BT" med begrunnelse over 6 gamle G? diff --git a/src/main/kotlin/no/nav/familie/ef/sak/beregning/OmregningService.kt b/src/main/kotlin/no/nav/familie/ef/sak/beregning/OmregningService.kt index be7ec221b2..039afe3124 100644 --- a/src/main/kotlin/no/nav/familie/ef/sak/beregning/OmregningService.kt +++ b/src/main/kotlin/no/nav/familie/ef/sak/beregning/OmregningService.kt @@ -10,8 +10,6 @@ import no.nav.familie.ef.sak.behandlingsflyt.steg.BeregnYtelseSteg import no.nav.familie.ef.sak.behandlingsflyt.steg.StegType import no.nav.familie.ef.sak.behandlingsflyt.task.PollStatusFraIverksettTask import no.nav.familie.ef.sak.infrastruktur.exception.feilHvis -import no.nav.familie.ef.sak.infrastruktur.featuretoggle.FeatureToggleService -import no.nav.familie.ef.sak.infrastruktur.featuretoggle.Toggle import no.nav.familie.ef.sak.iverksett.IverksettClient import no.nav.familie.ef.sak.iverksett.IverksettingDtoMapper import no.nav.familie.ef.sak.opplysninger.personopplysninger.GrunnlagsdataService @@ -47,7 +45,6 @@ class OmregningService( private val iverksettingDtoMapper: IverksettingDtoMapper, private val søknadService: SøknadService, private val barnService: BarnService, - private val featureToggleService: FeatureToggleService, ) { private val logger = LoggerFactory.getLogger(javaClass) @@ -99,13 +96,8 @@ class OmregningService( } private fun validerBehandlingstatusForFagsak(fagsakId: UUID) { - when (featureToggleService.isEnabled(Toggle.G_BEREGNING_INKLUDER_SATT_PÅ_VENT)) { - false -> feilHvis(behandlingService.finnesÅpenBehandling(fagsakId)) { - "Kan ikke omregne, det finnes åpen behandling på fagsak: $fagsakId" - } - true -> feilHvis(behandlingService.finnesBehandlingSomIkkeErFerdigstiltEllerSattPåVent(fagsakId)) { - "Kan ikke omregne, det finnes åpen behandling på fagsak: $fagsakId" - } + feilHvis(behandlingService.finnesÅpenBehandling(fagsakId)) { + "Kan ikke omregne, det finnes åpen behandling på fagsak: $fagsakId" } } diff --git a/src/main/kotlin/no/nav/familie/ef/sak/fagsak/FagsakRepository.kt b/src/main/kotlin/no/nav/familie/ef/sak/fagsak/FagsakRepository.kt index 45e818eeb1..ded50dcfa3 100644 --- a/src/main/kotlin/no/nav/familie/ef/sak/fagsak/FagsakRepository.kt +++ b/src/main/kotlin/no/nav/familie/ef/sak/fagsak/FagsakRepository.kt @@ -107,19 +107,4 @@ interface FagsakRepository : RepositoryInterface, InsertUpda AND b2.status <> 'FERDIGSTILT')""", ) fun finnFerdigstilteFagsakerMedUtdatertGBelop(gjeldendeGrunnbeløpFraOgMedDato: LocalDate): List - - @Query( - """SELECT DISTINCT b.fagsak_id - FROM gjeldende_iverksatte_behandlinger b - JOIN tilkjent_ytelse ty ON b.id = ty.behandling_id - AND ty.grunnbelopsdato < :gjeldendeGrunnbeløpFraOgMedDato - JOIN andel_tilkjent_ytelse aty ON aty.tilkjent_ytelse = ty.id - AND aty.samordningsfradrag = 0 - AND aty.stonad_tom > :gjeldendeGrunnbeløpFraOgMedDato - WHERE b.stonadstype = 'OVERGANGSSTØNAD' - AND b.fagsak_id NOT IN (SELECT b2.fagsak_id FROM behandling b2 - WHERE b2.fagsak_id = b.fagsak_id - AND b2.status not in ('FERDIGSTILT','SATT_PÅ_VENT'))""", - ) - fun finnFerdigstilteEllerSattPåVentFagsakerMedUtdatertGBelop(gjeldendeGrunnbeløpFraOgMedDato: LocalDate): List } diff --git a/src/main/kotlin/no/nav/familie/ef/sak/infrastruktur/featuretoggle/FeatureToggleService.kt b/src/main/kotlin/no/nav/familie/ef/sak/infrastruktur/featuretoggle/FeatureToggleService.kt index 3d6285eacf..5f7a968076 100644 --- a/src/main/kotlin/no/nav/familie/ef/sak/infrastruktur/featuretoggle/FeatureToggleService.kt +++ b/src/main/kotlin/no/nav/familie/ef/sak/infrastruktur/featuretoggle/FeatureToggleService.kt @@ -19,10 +19,6 @@ class FeatureToggleService(val unleashService: UnleashService) { enum class Toggle(val toggleId: String, val beskrivelse: String? = null) { // Release - G_BEREGNING_INKLUDER_SATT_PÅ_VENT( - "familie.ef.sak.inkluder-satt-pa-vent-gomregning", - "Usikker på om vi ønsker denne eller ikke. Ta en vurdering før 2024?", - ), DEAKTIVERE_MIKROFRONTEND_FOR_INAKTIVE_BRUKERE("familie.ef.sak.deaktiver-mikrofrontend-for-inaktive-brukere"), OVERSENDE_BEGRUNNELSE_FOR_TILBAKEKREVING("familie-ef-sak.begrunnelse-for-tilbakekreving", "Release"), diff --git a/src/test/kotlin/no/nav/familie/ef/sak/beregning/OmregningServiceTest.kt b/src/test/kotlin/no/nav/familie/ef/sak/beregning/OmregningServiceTest.kt index 666f40875c..609c52784c 100644 --- a/src/test/kotlin/no/nav/familie/ef/sak/beregning/OmregningServiceTest.kt +++ b/src/test/kotlin/no/nav/familie/ef/sak/beregning/OmregningServiceTest.kt @@ -20,6 +20,7 @@ import no.nav.familie.ef.sak.fagsak.domain.PersonIdent import no.nav.familie.ef.sak.felles.util.BrukerContextUtil import no.nav.familie.ef.sak.infrastruktur.config.ObjectMapperProvider import no.nav.familie.ef.sak.infrastruktur.config.RolleConfig +import no.nav.familie.ef.sak.infrastruktur.exception.Feil import no.nav.familie.ef.sak.iverksett.IverksettClient import no.nav.familie.ef.sak.no.nav.familie.ef.sak.vilkår.VilkårTestUtil import no.nav.familie.ef.sak.opplysninger.personopplysninger.GrunnlagsdataService @@ -63,6 +64,7 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows import org.springframework.beans.factory.annotation.Autowired import java.math.BigDecimal import java.time.LocalDate @@ -158,7 +160,7 @@ internal class OmregningServiceTest : OppslagSpringRunnerTest() { } @Test - fun `Verifiser riktig beløp og inntektsjustering hvis finnes behandling på vent`() { + fun `Verifiser stans av gomregning dersom behandlingen er på vent`() { val inntektPeriode = lagInntekt(201, 2002, 200003, 2022) lagSøknadOgVilkårOgVedtak(behandlingId, fagsakId, inntektPeriode, stønadsår = 2022) @@ -179,24 +181,11 @@ internal class OmregningServiceTest : OppslagSpringRunnerTest() { assertThat(inntektPeriode.totalinntekt().toInt()).isEqualTo(276287) mockTestMedGrunnbeløpFra2022 { - omregningService.utførGOmregning(fagsakId) - - verify { iverksettClient.iverksettUtenBrev(capture(iverksettDtoSlot)) } - val iverksettDto = iverksettDtoSlot.captured - - assertThat(iverksettDto.vedtak.tilkjentYtelse?.andelerTilkjentYtelse?.size).isEqualTo(2) // skal være splittet - // Sjekk andel etter ny g omregningsdato - val andelTilkjentYtelseOmregnet = finnAndelEtterNyGDato(iverksettDto)!! - assertThat(andelTilkjentYtelseOmregnet.inntekt).isEqualTo(289100) // justert med F - assertThat(andelTilkjentYtelseOmregnet.beløp).isEqualTo(12151) // Justert med F - - // Sjekk inntektsperiode etter ny G omregning - val inntektsperiodeEtterGomregning = finnInntektsperiodeEtterNyGDato(iverksettDto.behandling.behandlingId, 2022) + val feil = assertThrows { + omregningService.utførGOmregning(fagsakId) + } - assertThat(inntektsperiodeEtterGomregning.dagsats?.toInt()).isEqualTo(0) - assertThat(inntektsperiodeEtterGomregning.månedsinntekt?.toInt()).isEqualTo(0) - assertThat(inntektsperiodeEtterGomregning.inntekt.toInt()).isEqualTo(289100) - assertThat(inntektsperiodeEtterGomregning.totalinntekt().toInt()).isEqualTo(289100) + assertThat(feil.message).contains("det finnes åpen behandling på fagsak") } } diff --git a/src/test/kotlin/no/nav/familie/ef/sak/cucumber/steps/StepDefinitions.kt b/src/test/kotlin/no/nav/familie/ef/sak/cucumber/steps/StepDefinitions.kt index 7fa360c193..195150d260 100644 --- a/src/test/kotlin/no/nav/familie/ef/sak/cucumber/steps/StepDefinitions.kt +++ b/src/test/kotlin/no/nav/familie/ef/sak/cucumber/steps/StepDefinitions.kt @@ -175,7 +175,6 @@ class StepDefinitions { iverksettingDtoMapper = iverksettingDtoMapper, søknadService = søknadService, barnService = barnServiceMock, - featureToggleService, ) init { diff --git a/src/test/kotlin/no/nav/familie/ef/sak/repository/FagsakRepositoryTest.kt b/src/test/kotlin/no/nav/familie/ef/sak/repository/FagsakRepositoryTest.kt index 84c0325d3a..f97b0aef77 100644 --- a/src/test/kotlin/no/nav/familie/ef/sak/repository/FagsakRepositoryTest.kt +++ b/src/test/kotlin/no/nav/familie/ef/sak/repository/FagsakRepositoryTest.kt @@ -70,7 +70,7 @@ internal class FagsakRepositoryTest : OppslagSpringRunnerTest() { ), ) tilkjentYtelseRepository.insert(tilkjentYtelse(behandlingFerdig.id, fagsak.personIdenter.first().ident, 2022)) - assertThat(fagsakRepository.finnFerdigstilteEllerSattPåVentFagsakerMedUtdatertGBelop(LocalDate.of(2022, 5, 1)).size).isEqualTo(1) + assertThat(fagsakRepository.finnFerdigstilteFagsakerMedUtdatertGBelop(LocalDate.of(2022, 5, 1)).size).isEqualTo(0) } @Test