Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

legger på auuer i forkant på godkjenningsbehovet #114

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ class GodkjenningsbehovBuilder(
periode: ClosedRange<LocalDate>,
private val behandlingId: UUID,
private val perioderMedSammeSkjæringstidspunkt: List<PeriodeMedSammeSkjæringstidspunkt>,
private val auuerIForkant: List<UUID>,
private val hendelser: Set<UUID>
) {
private val tags: MutableSet<String> = mutableSetOf()
Expand Down Expand Up @@ -132,6 +133,7 @@ class GodkjenningsbehovBuilder(
"tom" to it.periode.endInclusive.toString()
)
},
"auuerIForkant" to auuerIForkant,
"sykepengegrunnlagsfakta" to when (sykepengegrunnlagsfakta) {
is FastsattIInfotrygd -> mapOf(
"omregnetÅrsinntektTotalt" to sykepengegrunnlagsfakta.omregnetÅrsinntektTotalt,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@ internal class BehovkontraktTest : AbstractEndToEndMediatorTest() {
assertTrue(godkjenning.path("omregnedeÅrsinntekter").path(0).path("beløp").isDouble)
assertTrue(godkjenning.path("behandlingId").asText().isNotEmpty())
assertTrue(godkjenning.path("perioderMedSammeSkjæringstidspunkt").isArray)
assertTrue(godkjenning.path("auuerIForkant").isArray)
assertFalse(godkjenning.path("perioderMedSammeSkjæringstidspunkt").isEmpty)
godkjenning.path("perioderMedSammeSkjæringstidspunkt").path(0).also {
assertTrue(it.path("vedtaksperiodeId").asText().isNotEmpty())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import no.nav.helse.person.Vedtaksperiode.Companion.SKAL_INNGÅ_I_SYKEPENGEGRUNN
import no.nav.helse.person.Vedtaksperiode.Companion.aktiveSkjæringstidspunkter
import no.nav.helse.person.Vedtaksperiode.Companion.beregnSkjæringstidspunkter
import no.nav.helse.person.Vedtaksperiode.Companion.checkBareEnPeriodeTilGodkjenningSamtidig
import no.nav.helse.person.Vedtaksperiode.Companion.finnAuuerIForkant
import no.nav.helse.person.Vedtaksperiode.Companion.førsteOverlappendePeriodeSomTrengerRefusjonsopplysninger
import no.nav.helse.person.Vedtaksperiode.Companion.førstePeriodeSomTrengerInntektTilVilkårsprøving
import no.nav.helse.person.Vedtaksperiode.Companion.nestePeriodeSomSkalGjenopptas
Expand Down Expand Up @@ -735,6 +736,13 @@ internal class Arbeidsgiver private constructor(
return sammenhengendePerioder
}

// finner auuer før vedtaksperioden, men etter forrige avsluttede vedtaksperiode.
// brukes av spesialist for å avdekke totrinns, om noen av auu'ene har fått en overstyring
// som skal "dryppe over" på neste vedtaksperiode til godkjenning
internal fun finnAuuerIForkant(utgangspunkt: Vedtaksperiode): List<Vedtaksperiode> {
return vedtaksperioder.finnAuuerIForkant(utgangspunkt)
}

private fun addInntektsmelding(inntektsmelding: Inntektsmelding, dagoverstyring: Revurderingseventyr?) {
val inntektsdato = inntektsmelding.addInntekt(inntektshistorikk, inntektsmelding.jurist(jurist))
inntektsmelding.leggTilRefusjon(refusjonshistorikk)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,12 +132,13 @@ internal class Behandlinger private constructor(behandlinger: List<Behandling>)
hendelse: IAktivitetslogg,
erForlengelse: Boolean,
perioderMedSammeSkjæringstidspunkt: List<Pair<UUID, Behandlinger>>,
auuerIForkant: List<UUID>,
kanForkastes: Boolean,
arbeidsgiverperiode: Arbeidsgiverperiode?,
harPeriodeRettFør: Boolean
) {
val behandlingerMedSammeSkjæringstidspunkt = perioderMedSammeSkjæringstidspunkt.map { it.first to it.second.behandlinger.last() }
behandlinger.last().godkjenning(hendelse, erForlengelse, behandlingerMedSammeSkjæringstidspunkt, kanForkastes, arbeidsgiverperiode, harPeriodeRettFør)
behandlinger.last().godkjenning(hendelse, erForlengelse, behandlingerMedSammeSkjæringstidspunkt, auuerIForkant, kanForkastes, arbeidsgiverperiode, harPeriodeRettFør)
}

internal fun håndterAnnullering(arbeidsgiver: Arbeidsgiver, hendelse: AnnullerUtbetaling, andreBehandlinger: List<Behandlinger>): Utbetaling? {
Expand Down Expand Up @@ -552,6 +553,7 @@ internal class Behandlinger private constructor(behandlinger: List<Behandling>)
kanForkastes: Boolean,
behandling: Behandling,
perioderMedSammeSkjæringstidspunkt: List<Triple<UUID, UUID, Periode>>,
auuerIForkant: List<UUID>,
arbeidsgiverperiode: Arbeidsgiverperiode?,
harPeriodeRettFør: Boolean
) {
Expand All @@ -566,6 +568,7 @@ internal class Behandlinger private constructor(behandlinger: List<Behandling>)
perioderMedSammeSkjæringstidspunkt.map { (vedtaksperiodeId, behandlingId, periode) ->
PeriodeMedSammeSkjæringstidspunkt(vedtaksperiodeId, behandlingId, periode)
},
auuerIForkant,
hendelser
)
grunnlagsdata.byggGodkjenningsbehov(builder)
Expand Down Expand Up @@ -906,12 +909,13 @@ internal class Behandlinger private constructor(behandlinger: List<Behandling>)
hendelse: IAktivitetslogg,
erForlengelse: Boolean,
behandlingerMedSammeSkjæringstidspunkt: List<Pair<UUID, Behandling>>,
auuerIForkant: List<UUID>,
kanForkastes: Boolean,
arbeidsgiverperiode: Arbeidsgiverperiode?,
harPeriodeRettFør: Boolean
) {
val perioderMedSammeSkjæringstidspunkt = behandlingerMedSammeSkjæringstidspunkt.map { Triple(it.first, it.second.id, it.second.periode) }
gjeldende.godkjenning(hendelse, erForlengelse, kanForkastes, this, perioderMedSammeSkjæringstidspunkt, arbeidsgiverperiode, harPeriodeRettFør)
gjeldende.godkjenning(hendelse, erForlengelse, kanForkastes, this, perioderMedSammeSkjæringstidspunkt, auuerIForkant, arbeidsgiverperiode, harPeriodeRettFør)
}

fun annuller(arbeidsgiver: Arbeidsgiver, hendelse: AnnullerUtbetaling, behandlinger: List<Behandling>): Utbetaling? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -668,6 +668,8 @@ class Person private constructor(
vilkårsgrunnlagHistorikk.lagre(vilkårsgrunnlag)
}

internal fun auuerIForkant(utgangspunkt: Vedtaksperiode) = arbeidsgivere.flatMap { it.finnAuuerIForkant(utgangspunkt) }

internal fun avklarSykepengegrunnlag(
hendelse: IAktivitetslogg,
skjæringstidspunkt: LocalDate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -967,8 +967,9 @@ internal class Vedtaksperiode private constructor(
private fun trengerGodkjenning(hendelse: IAktivitetslogg) {
val perioder = person.vedtaksperioder(MED_SKJÆRINGSTIDSPUNKT(skjæringstidspunkt))
.map { it.id to it.behandlinger }
val auukerIForkant = person.auuerIForkant(this).map { it.id }
val harPeriodeRettFør = arbeidsgiver.finnVedtaksperiodeRettFør(this) != null
behandlinger.godkjenning(hendelse, erForlengelse(), perioder, arbeidsgiver.kanForkastes(this, Aktivitetslogg()), finnArbeidsgiverperiode(), harPeriodeRettFør)
behandlinger.godkjenning(hendelse, erForlengelse(), perioder, auukerIForkant, arbeidsgiver.kanForkastes(this, Aktivitetslogg()), finnArbeidsgiverperiode(), harPeriodeRettFør)
}
internal fun gjenopptaBehandling(hendelse: Hendelse, arbeidsgivere: Iterable<Arbeidsgiver>) {
hendelse.kontekst(arbeidsgiver)
Expand Down Expand Up @@ -2487,6 +2488,13 @@ internal class Vedtaksperiode private constructor(
.minOrNull()
}

internal fun Iterable<Vedtaksperiode>.finnAuuerIForkant(utgangspunkt: Vedtaksperiode): List<Vedtaksperiode> {
val forrigeAvsluttet = this.lastOrNull { it.tilstand == Avsluttet && it < utgangspunkt }
return this.filter { vedtaksperiode ->
vedtaksperiode.tilstand == AvsluttetUtenUtbetaling && (forrigeAvsluttet == null || vedtaksperiode > forrigeAvsluttet) && vedtaksperiode < utgangspunkt
}
}

// Fredet funksjonsnavn
internal val TIDLIGERE_OG_ETTERGØLGENDE = fun(segSelv: Vedtaksperiode): VedtaksperiodeFilter {
val medSammeAGP = MED_SAMME_AGP_OG_SKJÆRINGSTIDSPUNKT(segSelv)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import java.util.UUID
import no.nav.helse.Toggle
import no.nav.helse.assertForventetFeil
import no.nav.helse.august
import no.nav.helse.dsl.lagStandardSykepengegrunnlag
import no.nav.helse.etterspurtBehov
import no.nav.helse.februar
import no.nav.helse.hendelser.Dagtype
Expand All @@ -13,6 +14,7 @@ import no.nav.helse.hendelser.ManuellOverskrivingDag
import no.nav.helse.hendelser.Sykmeldingsperiode
import no.nav.helse.hendelser.Søknad
import no.nav.helse.hendelser.Søknad.Søknadsperiode.Sykdom
import no.nav.helse.hendelser.Vilkårsgrunnlag
import no.nav.helse.hendelser.til
import no.nav.helse.inspectors.inspektør
import no.nav.helse.januar
Expand Down Expand Up @@ -78,6 +80,72 @@ internal class GodkjenningsbehovBuilderTest : AbstractEndToEndTest() {
)
}


@Test
fun auuIForkant() {
nyPeriode(1.januar til 16.januar, a1)
nyPeriode(1.januar til 16.januar, a2)

nyPeriode(17.januar til 31.januar, a1)
nyPeriode(17.januar til 31.januar, a2)

håndterInntektsmeldingPortal(listOf(1.januar til 16.januar), inntektsdato = 1.januar, orgnummer = a1)
håndterInntektsmeldingPortal(listOf(1.januar til 16.januar), inntektsdato = 1.januar, orgnummer = a2)

håndterVilkårsgrunnlag(
vedtaksperiodeIdInnhenter = 2.vedtaksperiode,
inntektsvurderingForSykepengegrunnlag = lagStandardSykepengegrunnlag(listOf(a1 to INNTEKT, a2 to INNTEKT), 1.januar),
arbeidsforhold = listOf(
Vilkårsgrunnlag.Arbeidsforhold(a1, LocalDate.EPOCH, null, Vilkårsgrunnlag.Arbeidsforhold.Arbeidsforholdtype.ORDINÆRT),
Vilkårsgrunnlag.Arbeidsforhold(a2, LocalDate.EPOCH, null, Vilkårsgrunnlag.Arbeidsforhold.Arbeidsforholdtype.ORDINÆRT)
),
orgnummer = a1
)

håndterYtelser(2.vedtaksperiode, orgnummer = a1)
håndterSimulering(2.vedtaksperiode, orgnummer = a1)

assertGodkjenningsbehov(
vedtaksperiodeId = 2.vedtaksperiode.id(a1),
periodeFom = 17.januar,
periodeTom = 31.januar,
behandlingId = 2.vedtaksperiode.sisteBehandlingId(a1),
tags = setOf("Arbeidsgiverutbetaling"),
periodeType = "FØRSTEGANGSBEHANDLING",
førstegangsbehandling = true,
inntektskilde = "FLERE_ARBEIDSGIVERE",
orgnummere = setOf(a1, a2),
omregnedeÅrsinntekter = listOf(
mapOf("organisasjonsnummer" to a1, "beløp" to 372000.0),
mapOf("organisasjonsnummer" to a2, "beløp" to 372000.0)
),
perioderMedSammeSkjæringstidspunkt = listOf(
mapOf("vedtaksperiodeId" to 1.vedtaksperiode.id(a1).toString(), "behandlingId" to 1.vedtaksperiode.sisteBehandlingId(a1).toString(), "fom" to 1.januar.toString(), "tom" to 16.januar.toString()),
mapOf("vedtaksperiodeId" to 1.vedtaksperiode.id(a2).toString(), "behandlingId" to 1.vedtaksperiode.sisteBehandlingId(a2).toString(), "fom" to 1.januar.toString(), "tom" to 16.januar.toString()),
mapOf("vedtaksperiodeId" to 2.vedtaksperiode.id(a1).toString(), "behandlingId" to 2.vedtaksperiode.sisteBehandlingId(a1).toString(), "fom" to 17.januar.toString(), "tom" to 31.januar.toString()),
mapOf("vedtaksperiodeId" to 2.vedtaksperiode.id(a2).toString(), "behandlingId" to 2.vedtaksperiode.sisteBehandlingId(a2).toString(), "fom" to 17.januar.toString(), "tom" to 31.januar.toString()),
),
auuerIForkant = listOf(
1.vedtaksperiode.id(a1),
1.vedtaksperiode.id(a2)
),
sykepengegrunnlagsfakta = mapOf(
"omregnetÅrsinntektTotalt" to 744000.0,
"6G" to 561804.0,
"fastsatt" to GodkjenningsbehovBuilder.Fastsatt.EtterHovedregel.name,
"arbeidsgivere" to listOf (
mapOf(
"arbeidsgiver" to a1,
"omregnetÅrsinntekt" to 372000.0
), mapOf(
"arbeidsgiver" to a2,
"omregnetÅrsinntekt" to 372000.0
)
)
)
)
}

@Test
fun arbeidsgiverutbetaling() {
tilGodkjenning(januar, a1)
Expand Down Expand Up @@ -596,6 +664,7 @@ internal class GodkjenningsbehovBuilderTest : AbstractEndToEndTest() {
perioderMedSammeSkjæringstidspunkt: List<Map<String, String>> = listOf(
mapOf("vedtaksperiodeId" to 1.vedtaksperiode.id(a1).toString(), "behandlingId" to 1.vedtaksperiode.sisteBehandlingId(a1).toString(), "fom" to 1.januar.toString(), "tom" to 31.januar.toString()),
),
auuerIForkant: List<UUID> = emptyList(),
sykepengegrunnlagsfakta: Map<String, Any> = mapOf(
"omregnetÅrsinntektTotalt" to INNTEKT.reflection { årlig, _, _, _ -> årlig }.toDouble(),
"6G" to 561804.0,
Expand All @@ -621,6 +690,7 @@ internal class GodkjenningsbehovBuilderTest : AbstractEndToEndTest() {
val actualOmregnedeÅrsinntekter = hentFelt<List<Map<String, String>>>(vedtaksperiodeId = vedtaksperiodeId, feltNavn = "omregnedeÅrsinntekter")!!
val actualBehandlingId = hentFelt<String>(vedtaksperiodeId = vedtaksperiodeId, feltNavn = "behandlingId")!!
val actualPerioderMedSammeSkjæringstidspunkt = hentFelt<Any>(vedtaksperiodeId = vedtaksperiodeId, feltNavn = "perioderMedSammeSkjæringstidspunkt")!!
val actualAuuerIForkant = hentFelt<List<UUID>>(vedtaksperiodeId = vedtaksperiodeId, feltNavn = "auuerIForkant")!!

hendelser?.let { assertHendelser(it, vedtaksperiodeId) }
assertSykepengegrunnlagsfakta(vedtaksperiodeId, sykepengegrunnlagsfakta)
Expand All @@ -637,6 +707,7 @@ internal class GodkjenningsbehovBuilderTest : AbstractEndToEndTest() {
assertEquals(omregnedeÅrsinntekter, actualOmregnedeÅrsinntekter)
assertEquals(behandlingId.toString(), actualBehandlingId)
assertEquals(perioderMedSammeSkjæringstidspunkt, actualPerioderMedSammeSkjæringstidspunkt)
assertEquals(auuerIForkant, actualAuuerIForkant)

val utkastTilVedtak = observatør.utkastTilVedtakEventer.last()
assertEquals(actualtags, utkastTilVedtak.tags)
Expand Down