Skip to content

Commit

Permalink
Merge pull request #2587 from navikt/rydd-ubrukt-gomregning-kode
Browse files Browse the repository at this point in the history
Skal fjerne g-omregningskode som ikke skal brukes. Vi kan ikke omregn…
  • Loading branch information
charliemidtlyng committed May 8, 2024
2 parents 01b6b59 + d0c8b9e commit b2a44dd
Show file tree
Hide file tree
Showing 8 changed files with 36 additions and 96 deletions.
Expand Up @@ -62,15 +62,7 @@ class GOmregningTaskService(
return fagsakIder.size
}

private fun finnFagsakIder(): List<UUID> {
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<UUID> = fagsakRepository.finnFerdigstilteFagsakerMedUtdatertGBelop(
nyesteGrunnbeløpGyldigFraOgMed.atDay(1),
)
}
Expand Up @@ -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
Expand Down Expand Up @@ -78,27 +72,20 @@ 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)

* Oppdater veiviser med inntekt som tipper OS over i 0-beløp (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?

Expand Up @@ -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
Expand Down Expand Up @@ -47,7 +45,6 @@ class OmregningService(
private val iverksettingDtoMapper: IverksettingDtoMapper,
private valknadService: SøknadService,
private val barnService: BarnService,
private val featureToggleService: FeatureToggleService,
) {

private val logger = LoggerFactory.getLogger(javaClass)
Expand Down Expand Up @@ -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"
}
}

Expand Down
15 changes: 0 additions & 15 deletions src/main/kotlin/no/nav/familie/ef/sak/fagsak/FagsakRepository.kt
Expand Up @@ -107,19 +107,4 @@ interface FagsakRepository : RepositoryInterface<FagsakDomain, UUID>, InsertUpda
AND b2.status <> 'FERDIGSTILT')""",
)
fun finnFerdigstilteFagsakerMedUtdatertGBelop(gjeldendeGrunnbeløpFraOgMedDato: LocalDate): List<UUID>

@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<UUID>
}
Expand Up @@ -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"),

Expand Down
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand All @@ -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<Feil> {
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")
}
}

Expand Down
Expand Up @@ -175,7 +175,6 @@ class StepDefinitions {
iverksettingDtoMapper = iverksettingDtoMapper,
søknadService = søknadService,
barnService = barnServiceMock,
featureToggleService,
)

init {
Expand Down
Expand Up @@ -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
Expand Down

0 comments on commit b2a44dd

Please sign in to comment.