diff --git a/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/AvklarbarSykepengegrunnlag.kt b/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/AvklarbarSykepengegrunnlag.kt index c97facee3d..ad37ef69b0 100644 --- a/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/AvklarbarSykepengegrunnlag.kt +++ b/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/AvklarbarSykepengegrunnlag.kt @@ -2,11 +2,8 @@ package no.nav.helse.person.inntekt import java.time.LocalDate import java.time.LocalDateTime -import java.time.YearMonth import java.util.UUID -import no.nav.helse.person.inntekt.AvklarbarSykepengegrunnlag.Inntektturnering import no.nav.helse.økonomi.Inntekt -import kotlin.reflect.KClass sealed class AvklarbarSykepengegrunnlag( id: UUID, @@ -15,56 +12,5 @@ sealed class AvklarbarSykepengegrunnlag( beløp: Inntekt, tidsstempel: LocalDateTime ) : Inntektsopplysning(id, hendelseId, dato, beløp, tidsstempel) { - protected abstract fun avklarSykepengegrunnlag(skjæringstidspunkt: LocalDate, førsteFraværsdag: LocalDate?): AvklarbarSykepengegrunnlag? - internal fun beste(other: AvklarbarSykepengegrunnlag): AvklarbarSykepengegrunnlag { - return turnering.avgjør(this, other) - } - - private fun interface Inntektturnering { - fun beste(venstre: AvklarbarSykepengegrunnlag, høyre: AvklarbarSykepengegrunnlag): AvklarbarSykepengegrunnlag - } - - - internal companion object { - - private val SisteAnkomne = Inntektturnering { venstre, høyre -> - when { - høyre.tidsstempel < venstre.tidsstempel -> venstre - else -> høyre - } - } - /* - gir venstre om måneden er tidligere enn høyre, høyre ellers; - eksempelvis dersom inntektsmelding (første fraværsdag) er i en annen måned enn skjæringstidspunktet, da - skal skatteopplysningene brukes - */ - private val TidligsteMåned = Inntektturnering { venstre, høyre -> - when { - YearMonth.from(venstre.dato) <= YearMonth.from(høyre.dato) -> venstre - else -> høyre - } - } - private val KunHøyre = Inntektturnering { _, høyre -> høyre } - - private val turnering = mapOf( - Inntektsmelding::class to mapOf( - Inntektsmelding::class to SisteAnkomne, - SkattSykepengegrunnlag::class to TidligsteMåned, - IkkeRapportert::class to TidligsteMåned - ) - ) - - private fun Map, Map, Inntektturnering>>.avgjør(venstre: AvklarbarSykepengegrunnlag, høyre: AvklarbarSykepengegrunnlag): AvklarbarSykepengegrunnlag { - return this[venstre::class]?.get(høyre::class)?.beste(venstre, høyre) - ?: this[høyre::class]?.get(venstre::class)?.beste(høyre, venstre) // kommutativ variant; a+b = b+a - ?: error("mangelfull inntektturnering for [${venstre::class.simpleName}, ${høyre::class.simpleName}]") - } - internal fun List?.avklarSykepengegrunnlag(skjæringstidspunkt: LocalDate, førsteFraværsdag: LocalDate?, skattSykepengegrunnlag: SkattSykepengegrunnlag?): Inntektsopplysning? { - val tilgjengelige = listOfNotNull(skattSykepengegrunnlag) + (this ?: emptyList()) - val kandidater = tilgjengelige.mapNotNull { it.avklarSykepengegrunnlag(skjæringstidspunkt, førsteFraværsdag) } - if (kandidater.isEmpty()) return null - return kandidater.reduce { champion, challenger -> champion.beste(challenger) } - } - } } \ No newline at end of file diff --git a/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/IkkeRapportert.kt b/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/IkkeRapportert.kt index 1204c21809..e7d6fd3667 100644 --- a/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/IkkeRapportert.kt +++ b/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/IkkeRapportert.kt @@ -14,8 +14,6 @@ internal class IkkeRapportert( tidsstempel: LocalDateTime ) : AvklarbarSykepengegrunnlag(id, hendelseId, dato, Inntekt.INGEN, tidsstempel) { internal constructor(dato: LocalDate, hendelseId: UUID, tidsstempel: LocalDateTime) : this(UUID.randomUUID(), hendelseId, dato, tidsstempel) - override fun avklarSykepengegrunnlag(skjæringstidspunkt: LocalDate, førsteFraværsdag: LocalDate?) = - takeIf { this.dato == skjæringstidspunkt } override fun kanOverstyresAv(ny: Inntektsopplysning) = true diff --git a/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/Inntektshistorikk.kt b/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/Inntektshistorikk.kt index a7162ee716..836110895d 100644 --- a/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/Inntektshistorikk.kt +++ b/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/Inntektshistorikk.kt @@ -4,7 +4,7 @@ package no.nav.helse.person.inntekt import java.time.LocalDate import no.nav.helse.dto.deserialisering.InntektshistorikkInnDto import no.nav.helse.dto.serialisering.InntektshistorikkUtDto -import no.nav.helse.person.inntekt.AvklarbarSykepengegrunnlag.Companion.avklarSykepengegrunnlag +import no.nav.helse.person.inntekt.Inntektsmelding.Companion.avklarSykepengegrunnlag internal class Inntektshistorikk private constructor(private val historikk: MutableList) { diff --git a/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/Inntektsmelding.kt b/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/Inntektsmelding.kt index 7455bbd1f0..34380f6080 100644 --- a/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/Inntektsmelding.kt +++ b/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/Inntektsmelding.kt @@ -13,6 +13,7 @@ import no.nav.helse.person.PersonObserver import no.nav.helse.person.PersonObserver.Inntektsopplysningstype.INNTEKTSMELDING import no.nav.helse.person.aktivitetslogg.IAktivitetslogg import no.nav.helse.person.aktivitetslogg.Varselkode.RV_IV_7 +import no.nav.helse.yearMonth import no.nav.helse.økonomi.Inntekt class Inntektsmelding internal constructor( @@ -22,7 +23,7 @@ class Inntektsmelding internal constructor( beløp: Inntekt, tidsstempel: LocalDateTime, private val kilde: Kilde -) : AvklarbarSykepengegrunnlag(id, hendelseId, dato, beløp, tidsstempel) { +) : Inntektsopplysning(id, hendelseId, dato, beløp, tidsstempel) { internal constructor(dato: LocalDate, hendelseId: UUID, beløp: Inntekt, kilde: Kilde = Kilde.Arbeidsgiver, tidsstempel: LocalDateTime = LocalDateTime.now()) : this(UUID.randomUUID(), dato, hendelseId, beløp, tidsstempel, kilde) override fun gjenbrukbarInntekt(beløp: Inntekt?) = beløp?.let { Inntektsmelding(dato, hendelseId, it, kilde, tidsstempel) }?: this @@ -45,9 +46,8 @@ class Inntektsmelding internal constructor( if (erOmregnetÅrsinntektEndret(this, gammel)) this else gammel.overstyrer(this) - override fun avklarSykepengegrunnlag(skjæringstidspunkt: LocalDate, førsteFraværsdag: LocalDate?): AvklarbarSykepengegrunnlag? { - if (dato == skjæringstidspunkt) return this - if (førsteFraværsdag == null || dato != førsteFraværsdag) return null + internal fun avklarSykepengegrunnlag(skatt: AvklarbarSykepengegrunnlag): Inntektsopplysning { + if (skatt.dato.yearMonth < this.dato.yearMonth) return skatt return this } @@ -135,6 +135,17 @@ class Inntektsmelding internal constructor( kilde = Kilde.gjenopprett(dto.kilde), ) } + + internal fun List.finnInntektsmeldingForSkjæringstidspunkt(skjæringstidspunkt: LocalDate, førsteFraværsdag: LocalDate?): Inntektsmelding? { + val inntektsmeldinger = this.filter { it.dato == skjæringstidspunkt || it.dato == førsteFraværsdag } + return inntektsmeldinger.maxByOrNull { inntektsmelding -> inntektsmelding.tidsstempel } + } + + internal fun List.avklarSykepengegrunnlag(skjæringstidspunkt: LocalDate, førsteFraværsdag: LocalDate?, skattSykepengegrunnlag: SkattSykepengegrunnlag?): Inntektsopplysning? { + val inntektsmelding = finnInntektsmeldingForSkjæringstidspunkt(skjæringstidspunkt, førsteFraværsdag) + val skatt = skattSykepengegrunnlag?.takeIf { it.kanBrukes(skjæringstidspunkt) }?.somSykepengegrunnlag() ?: return inntektsmelding + return inntektsmelding?.avklarSykepengegrunnlag(skatt) ?: skatt + } } } diff --git a/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/SkattSykepengegrunnlag.kt b/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/SkattSykepengegrunnlag.kt index 8e0e8ade10..afc2349ecd 100644 --- a/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/SkattSykepengegrunnlag.kt +++ b/sykepenger-model/src/main/kotlin/no/nav/helse/person/inntekt/SkattSykepengegrunnlag.kt @@ -1,8 +1,5 @@ package no.nav.helse.person.inntekt -import java.time.LocalDate -import java.time.LocalDateTime -import java.util.UUID import no.nav.helse.dto.AnsattPeriodeDto import no.nav.helse.dto.deserialisering.InntektsopplysningInnDto import no.nav.helse.dto.serialisering.InntektsopplysningUtDto @@ -14,6 +11,9 @@ import no.nav.helse.person.inntekt.AnsattPeriode.Companion.harArbeidsforholdNyer import no.nav.helse.person.inntekt.Skatteopplysning.Companion.sisteMåneder import no.nav.helse.person.inntekt.Skatteopplysning.Companion.subsumsjonsformat import no.nav.helse.økonomi.Inntekt +import java.time.LocalDate +import java.time.LocalDateTime +import java.util.* internal class SkattSykepengegrunnlag private constructor( id: UUID, @@ -56,25 +56,24 @@ internal class SkattSykepengegrunnlag private constructor( tidsstempel: LocalDateTime = LocalDateTime.now() ) : this(UUID.randomUUID(), hendelseId, dato, Skatteopplysning.sisteTreMåneder(dato, inntektsopplysninger), ansattPerioder, tidsstempel) - override fun avklarSykepengegrunnlag(skjæringstidspunkt: LocalDate, førsteFraværsdag: LocalDate?): AvklarbarSykepengegrunnlag? { - if (this.dato != skjæringstidspunkt) return null - if (ansattPerioder.isEmpty()) return null + fun kanBrukes(skjæringstidspunkt: LocalDate): Boolean { + if (this.dato != skjæringstidspunkt) return false + if (ansattPerioder.isEmpty()) return false // ser bort fra skatteinntekter om man ikke er ansatt på skjæringstidspunktet: - if (!ansattVedSkjæringstidspunkt(skjæringstidspunkt)) return null - // bruker skatteinntekter om det foreligger inntekter innenfor 2 mnd fra skjæringstidspunktet: - if (sisteMåneder(skjæringstidspunkt, MAKS_INNTEKT_GAP, inntektsopplysninger).isNotEmpty()) return this - // ser bort fra skatteinntekter om man er ansatt på skjæringstidspunktet, men inntektene er eldre enn 2 mnd fra skjæringstidspunktet (avsluttet arb.forhold?): - if (inntektsopplysninger.isNotEmpty()) return null - // ser bort fra skatteinntekter om arb.forholdet er eldre enn 2 mnd fra skjæringstidspunktet: - if (!nyoppstartetArbeidsforhold(skjæringstidspunkt)) return null - // nyoppstartet arbeidsforhold (startdato innen 2 mnd fra skjæringstidspunktet), og ingen inntekter foreligger: - // todo bare returnere "this" og mappe ut IKKE_RAPPORTERT i SpeilBuilder? - return IkkeRapportert( + if (!ansattVedSkjæringstidspunkt(skjæringstidspunkt)) return false + if (inntektsopplysninger.isEmpty()) { + return nyoppstartetArbeidsforhold(skjæringstidspunkt) + } + return sisteMåneder(skjæringstidspunkt, MAKS_INNTEKT_GAP, inntektsopplysninger).isNotEmpty() + } + + internal fun somSykepengegrunnlag() = + if (!inntektsopplysninger.isEmpty()) this + else IkkeRapportert( hendelseId = this.hendelseId, dato = this.dato, tidsstempel = this.tidsstempel ) - } private fun nyoppstartetArbeidsforhold(skjæringstidspunkt: LocalDate) = ansattPerioder.harArbeidsforholdNyereEnn(skjæringstidspunkt, MAKS_INNTEKT_GAP) diff --git a/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/InntektshistorikkTest.kt b/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/InntektshistorikkTest.kt index 5d8e8e8b97..194d929410 100644 --- a/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/InntektshistorikkTest.kt +++ b/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/InntektshistorikkTest.kt @@ -1,9 +1,5 @@ package no.nav.helse.person.inntekt -import java.time.LocalDate -import java.util.UUID -import no.nav.helse.august -import no.nav.helse.desember import no.nav.helse.dsl.ArbeidsgiverHendelsefabrikk import no.nav.helse.etterlevelse.Subsumsjonslogg.Companion.EmptyLog import no.nav.helse.februar @@ -13,22 +9,16 @@ import no.nav.helse.hendelser.til import no.nav.helse.inspectors.InntektshistorikkInspektør import no.nav.helse.inspectors.inspektør import no.nav.helse.januar -import no.nav.helse.november -import no.nav.helse.oktober import no.nav.helse.person.aktivitetslogg.Aktivitetslogg -import no.nav.helse.testhelpers.assertNotNull -import no.nav.helse.testhelpers.inntektperioderForSykepengegrunnlag import no.nav.helse.testhelpers.resetSeed import no.nav.helse.økonomi.Inntekt -import no.nav.helse.økonomi.Inntekt.Companion.INGEN -import no.nav.helse.økonomi.Inntekt.Companion.daglig import no.nav.helse.økonomi.Inntekt.Companion.månedlig -import no.nav.helse.økonomi.Inntekt.Companion.årlig import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertNull -import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import java.time.LocalDate +import java.util.* internal class InntektshistorikkTest { @@ -36,10 +26,6 @@ internal class InntektshistorikkTest { private val inspektør get() = InntektshistorikkInspektør(historikk.view()) private companion object { - const val UNG_PERSON_FNR_2018 = "12029240045" - val UNG_PERSON_FØDSELSDATO = 12.februar(1992) - - const val AKTØRID = "42" const val ORGNUMMER = "987654321" val INNTEKT = 31000.00.månedlig val hendelsefabrikk = ArbeidsgiverHendelsefabrikk( @@ -53,40 +39,6 @@ internal class InntektshistorikkTest { historikk = Inntektshistorikk() } - @Test - fun `sykepengegrunnlag for arbeidsgiver med nytt arbeidsforhold`() { - val opplysning = historikk.avklarSykepengegrunnlag( - 1.februar, - 1.februar, - SkattSykepengegrunnlag( - hendelseId = UUID.randomUUID(), - dato = 1.februar, - inntektsopplysninger = emptyList(), - ansattPerioder = listOf(AnsattPeriode(1.januar, null)) - ) - ) - assertNotNull(opplysning) - assertEquals(IkkeRapportert::class, opplysning::class) - assertEquals(INGEN, opplysning.inspektør.beløp) - } - - @Test - fun `sykepengegrunnlag for arbeidsgiver med nytt deaktivert arbeidsforhold`() { - val opplysning = historikk.avklarSykepengegrunnlag( - 1.februar, - 1.februar, - SkattSykepengegrunnlag( - hendelseId = UUID.randomUUID(), - dato = 1.februar, - inntektsopplysninger = emptyList(), - ansattPerioder = listOf(AnsattPeriode(1.januar, null)) - ) - ) - assertNotNull(opplysning) - assertEquals(IkkeRapportert::class, opplysning::class) - assertEquals(INGEN, opplysning.inspektør.beløp) - } - @Test fun `Inntekt fra inntektsmelding brukes til å beregne sykepengegrunnlaget`() { inntektsmelding(førsteFraværsdag = 1.januar).addInntekt(historikk, EmptyLog) @@ -115,97 +67,6 @@ internal class InntektshistorikkTest { assertNull(historikk.avklarSykepengegrunnlag(2.januar, 2.januar, null)) } - @Test - fun `intrikat test for sykepengegrunnlag der første fraværsdag er 31 desember`() { - val skattSykepengegrunnlag = inntektperioderForSykepengegrunnlag { - 1.desember(2016) til 1.desember(2016) inntekter { - ORGNUMMER inntekt 10000 - } - 1.desember(2016) til 1.august(2017) inntekter { - ORGNUMMER inntekt 20000 - } - 1.oktober(2017) til 1.oktober(2017) inntekter { - ORGNUMMER inntekt 30000 - } - 1.november(2017) til 1.januar inntekter { - ORGNUMMER inntekt 12000 - ORGNUMMER inntekt 22000 - } - } - .map { it.tilSykepengegrunnlag(31.desember(2017), UUID.randomUUID()) } - .single() + SkattSykepengegrunnlag(UUID.randomUUID(), 1.desember, emptyList(), listOf(AnsattPeriode(1.november(2017), null))) - - assertEquals(256000.årlig, historikk.avklarSykepengegrunnlag(31.desember(2017), 31.desember(2017), skattSykepengegrunnlag)?.inspektør?.beløp) - } - - @Test - fun `intrikat test for sykepengegrunnlag der første fraværsdag er 1 januar`() { - val skattSykepengegrunnlag = inntektperioderForSykepengegrunnlag { - 1.desember(2016) til 1.desember(2016) inntekter { - ORGNUMMER inntekt 10000 - } - 1.desember(2016) til 1.august(2017) inntekter { - ORGNUMMER inntekt 20000 - } - 1.oktober(2017) til 1.oktober(2017) inntekter { - ORGNUMMER inntekt 30000 - } - 1.november(2017) til 1.januar inntekter { - ORGNUMMER inntekt 12000 - ORGNUMMER inntekt 22000 - } - } - .map { it.tilSykepengegrunnlag(1.januar, UUID.randomUUID()) } - .single() + SkattSykepengegrunnlag(UUID.randomUUID(), 1.desember, emptyList(), listOf(AnsattPeriode(1.desember(2016), null))) - assertEquals(392000.årlig, historikk.avklarSykepengegrunnlag(1.januar, 1.januar, skattSykepengegrunnlag)?.inspektør?.beløp) - } - - @Test - fun `Inntekt fra skatt siste tre måneder brukes til å beregne sykepengegrunnlaget`() { - val skattSykepengegrunnlag = inntektperioderForSykepengegrunnlag { - 1.desember(2016) til 1.desember(2017) inntekter { - ORGNUMMER inntekt INNTEKT - } - 1.desember(2016) til 1.august(2017) inntekter { - ORGNUMMER inntekt INNTEKT - } - } - .map { it.tilSykepengegrunnlag(1.januar, UUID.randomUUID()) } - .single() + SkattSykepengegrunnlag(UUID.randomUUID(), 1.desember, emptyList(), listOf(AnsattPeriode(1.desember(2016), null))) - assertEquals(INNTEKT, historikk.avklarSykepengegrunnlag(1.januar, 1.januar, skattSykepengegrunnlag)?.inspektør?.beløp) - } - - @Test - fun `Inntekt fra skatt siste tre måneder som tilsammen er et negativt beløp`() { - val skattSykepengegrunnlag = inntektperioderForSykepengegrunnlag { - 1.oktober(2017) til 1.desember(2017) inntekter { - ORGNUMMER inntekt INNTEKT * -1 - } - } - .map { it.tilSykepengegrunnlag(1.januar, UUID.randomUUID()) } - .single() + SkattSykepengegrunnlag(UUID.randomUUID(), 1.desember, emptyList(), listOf(AnsattPeriode(1.oktober(2017), null))) - val inntektsopplysning = historikk.avklarSykepengegrunnlag(1.januar, 1.januar, skattSykepengegrunnlag) - assertTrue(inntektsopplysning is SkattSykepengegrunnlag) - assertEquals(INGEN, inntektsopplysning?.inspektør?.beløp) - } - - @Test - fun `Inntekt fra skatt er minst 0 kroner`() { - val skattComposite = SkattSykepengegrunnlag( - UUID.randomUUID(), 1.januar, inntektsopplysninger = listOf( - Skatteopplysning( - hendelseId = UUID.randomUUID(), - beløp = (-2500).daglig, - måned = desember(2017), - type = Skatteopplysning.Inntekttype.LØNNSINNTEKT, - fordel = "fordel", - beskrivelse = "beskrivelse" - ), - ), emptyList() - ) - assertEquals(INGEN, skattComposite.inspektør.beløp) - } - @Test fun `Inntekt for annen dato og samme kilde erstatter ikke eksisterende`() { inntektsmelding(førsteFraværsdag = 1.januar).addInntekt(historikk, EmptyLog) diff --git a/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/InntektsopplysningTest.kt b/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/InntektsopplysningTest.kt index f457364381..5c579985c7 100644 --- a/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/InntektsopplysningTest.kt +++ b/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/InntektsopplysningTest.kt @@ -1,17 +1,19 @@ package no.nav.helse.person.inntekt -import java.time.LocalDateTime -import java.util.UUID +import no.nav.helse.desember import no.nav.helse.februar import no.nav.helse.januar +import no.nav.helse.person.inntekt.Inntektsmelding.Companion.avklarSykepengegrunnlag +import no.nav.helse.person.inntekt.Inntektsmelding.Companion.finnInntektsmeldingForSkjæringstidspunkt +import no.nav.helse.person.inntekt.Skatteopplysning.Inntekttype.LØNNSINNTEKT +import no.nav.helse.yearMonth import no.nav.helse.økonomi.Inntekt.Companion.INGEN import no.nav.helse.økonomi.Inntekt.Companion.månedlig -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertFalse -import org.junit.jupiter.api.Assertions.assertNotEquals -import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows +import java.time.LocalDate +import java.time.LocalDateTime +import java.util.* internal class InntektsopplysningTest { private companion object { @@ -90,60 +92,42 @@ internal class InntektsopplysningTest { val im1 = Inntektsmelding(1.januar, UUID.randomUUID(), INNTEKT, Inntektsmelding.Kilde.Arbeidsgiver, LocalDateTime.now()) val im2 = Inntektsmelding(1.januar, UUID.randomUUID(), INNTEKT, Inntektsmelding.Kilde.Arbeidsgiver, LocalDateTime.now().plusSeconds(1)) - assertEquals(im2, im1.beste(im2)) - assertEquals(im2, im2.beste(im1)) + assertEquals(im2, listOf(im1, im2).finnInntektsmeldingForSkjæringstidspunkt(1.januar, null)) } @Test fun `turnering - skatt vs inntektsmelding`() { val im = Inntektsmelding(10.februar, UUID.randomUUID(), INNTEKT) - val skatt1 = SkattSykepengegrunnlag(UUID.randomUUID(), 1.februar, emptyList(), emptyList()) - val skatt2 = SkattSykepengegrunnlag(UUID.randomUUID(), 31.januar, emptyList(), emptyList()) - - assertEquals(im, im.beste(skatt1)) - assertEquals(im, skatt1.beste(im)) - - assertEquals(skatt2, im.beste(skatt2)) - assertEquals(skatt2, skatt2.beste(im)) - } - - @Test - fun `turnering - ikkeRapportert vs inntektsmelding`() { - val im = Inntektsmelding(10.februar, UUID.randomUUID(), INNTEKT) - val ikkeRapportert1 = IkkeRapportert(1.februar, UUID.randomUUID(), LocalDateTime.now()) - val ikkeRapportert2 = IkkeRapportert(31.januar, UUID.randomUUID(), LocalDateTime.now()) - - assertEquals(im, im.beste(ikkeRapportert1)) - assertEquals(im, ikkeRapportert1.beste(im)) - - assertEquals(ikkeRapportert2, ikkeRapportert2.beste(im)) - assertEquals(ikkeRapportert2, im.beste(ikkeRapportert2)) - } - - @Test - fun `turnering - ikkeRapportert vs skatt`() { - val skatt = SkattSykepengegrunnlag(UUID.randomUUID(), 1.februar, emptyList(), emptyList()) - val ikkeRapportert = IkkeRapportert(31.januar, UUID.randomUUID(), LocalDateTime.now()) - - assertThrows { assertEquals(skatt, skatt.beste(ikkeRapportert)) } - assertThrows { assertEquals(skatt, ikkeRapportert.beste(skatt)) } - } - - @Test - fun `turnering - skatt vs skatt`() { - val skatt1 = SkattSykepengegrunnlag(UUID.randomUUID(), 1.februar, emptyList(), emptyList()) - val skatt2 = SkattSykepengegrunnlag(UUID.randomUUID(), 1.februar, emptyList(), emptyList()) - - assertThrows { skatt1.beste(skatt2) } - assertThrows { skatt2.beste(skatt1) } - } - - @Test - fun `turnering - ikkeRapportert vs ikkeRapportert`() { - val ikkeRapportert1 = IkkeRapportert(31.januar, UUID.randomUUID(), LocalDateTime.now()) - val ikkeRapportert2 = IkkeRapportert(31.januar, UUID.randomUUID(), LocalDateTime.now()) - - assertThrows { ikkeRapportert1.beste(ikkeRapportert2) } - assertThrows { ikkeRapportert2.beste(ikkeRapportert1) } + val skatt1 = SkattSykepengegrunnlag(UUID.randomUUID(), 1.februar, listOf( + Skatteopplysning( + hendelseId = UUID.randomUUID(), + beløp = 25000.månedlig, + måned = 1.januar.yearMonth, + type = LØNNSINNTEKT, + fordel = "", + beskrivelse = "", + tidsstempel = LocalDateTime.now() + ) + ), listOf( + AnsattPeriode(LocalDate.EPOCH, null), + )) + val skatt2 = SkattSykepengegrunnlag(UUID.randomUUID(), 31.januar, listOf( + Skatteopplysning( + hendelseId = UUID.randomUUID(), + beløp = 25000.månedlig, + måned = 1.desember(2017).yearMonth, + type = LØNNSINNTEKT, + fordel = "", + beskrivelse = "", + tidsstempel = LocalDateTime.now() + ) + ), listOf( + AnsattPeriode(LocalDate.EPOCH, null), + )) + + assertSame(im, listOf(im).avklarSykepengegrunnlag(1.februar, 10.februar, skatt1)) + assertSame(skatt2, listOf(im).avklarSykepengegrunnlag(31.januar, 10.februar, skatt2)) + assertSame(im, im.avklarSykepengegrunnlag(skatt1)) + assertSame(skatt2, im.avklarSykepengegrunnlag(skatt2)) } } diff --git a/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/SkattInntektsgrunnlagTest.kt b/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/SkattInntektsgrunnlagTest.kt index 1d34f8356f..9f65e0dae6 100644 --- a/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/SkattInntektsgrunnlagTest.kt +++ b/sykepenger-model/src/test/kotlin/no/nav/helse/person/inntekt/SkattInntektsgrunnlagTest.kt @@ -7,22 +7,105 @@ import no.nav.helse.april import no.nav.helse.desember import no.nav.helse.februar import no.nav.helse.forrigeDag +import no.nav.helse.inspectors.inspektør import no.nav.helse.januar import no.nav.helse.mars -import no.nav.helse.person.inntekt.AvklarbarSykepengegrunnlag.Companion.avklarSykepengegrunnlag +import no.nav.helse.nesteDag import no.nav.helse.person.inntekt.Skatteopplysning.Inntekttype.LØNNSINNTEKT -import no.nav.helse.testhelpers.assertNotNull import no.nav.helse.yearMonth import no.nav.helse.økonomi.Inntekt +import no.nav.helse.økonomi.Inntekt.Companion.INGEN import no.nav.helse.økonomi.Inntekt.Companion.daglig import no.nav.helse.økonomi.Inntekt.Companion.månedlig import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNull +import org.junit.jupiter.api.Assertions.assertFalse import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test internal class SkattInntektsgrunnlagTest { + @Test + fun `bruker kun tre måneder før skjæringstidspunktet`() { + val skatt = SkattSykepengegrunnlag(UUID.randomUUID(), 10.april, inntektsopplysninger = listOf( + Skatteopplysning( + hendelseId = UUID.randomUUID(), + beløp = 1000.daglig, + måned = desember(2017), + type = LØNNSINNTEKT, + fordel = "fordel", + beskrivelse = "beskrivelse" + ), + Skatteopplysning( + hendelseId = UUID.randomUUID(), + beløp = 1000.daglig, + måned = januar(2018), + type = LØNNSINNTEKT, + fordel = "fordel", + beskrivelse = "beskrivelse" + ), + Skatteopplysning( + hendelseId = UUID.randomUUID(), + beløp = 1000.daglig, + måned = februar(2018), + type = LØNNSINNTEKT, + fordel = "fordel", + beskrivelse = "beskrivelse" + ), + Skatteopplysning( + hendelseId = UUID.randomUUID(), + beløp = 1000.daglig, + måned = mars(2018), + type = LØNNSINNTEKT, + fordel = "fordel", + beskrivelse = "beskrivelse" + ), + ), + emptyList() + ) + assertEquals(1000.daglig, skatt.inspektør.beløp) + } + + @Test + fun `bruker ikke inntekter samme måned som skjæringstidspunktet`() { + val skatt = SkattSykepengegrunnlag(UUID.randomUUID(), 10.april, inntektsopplysninger = listOf( + Skatteopplysning( + hendelseId = UUID.randomUUID(), + beløp = 1000.daglig, + måned = januar(2018), + type = LØNNSINNTEKT, + fordel = "fordel", + beskrivelse = "beskrivelse" + ), + Skatteopplysning( + hendelseId = UUID.randomUUID(), + beløp = 1000.daglig, + måned = februar(2018), + type = LØNNSINNTEKT, + fordel = "fordel", + beskrivelse = "beskrivelse" + ), + Skatteopplysning( + hendelseId = UUID.randomUUID(), + beløp = 1000.daglig, + måned = mars(2018), + type = LØNNSINNTEKT, + fordel = "fordel", + beskrivelse = "beskrivelse" + ), + Skatteopplysning( + hendelseId = UUID.randomUUID(), + beløp = 1000.daglig, + måned = april(2018), + type = LØNNSINNTEKT, + fordel = "fordel", + beskrivelse = "beskrivelse" + ), + ), + emptyList() + ) + assertEquals(1000.daglig, skatt.inspektør.beløp) + } + @Test fun `setter negativt omregnet årsinntekt til 0`() { val skatt = SkattSykepengegrunnlag(UUID.randomUUID(), 1.januar, inntektsopplysninger = listOf( @@ -51,7 +134,7 @@ internal class SkattInntektsgrunnlagTest { hendelseId = UUID.randomUUID(), beløp = 25000.månedlig, måned = 1.januar.yearMonth, - type = Skatteopplysning.Inntekttype.LØNNSINNTEKT, + type = LØNNSINNTEKT, fordel = "", beskrivelse = "", tidsstempel = LocalDateTime.now() @@ -60,7 +143,7 @@ internal class SkattInntektsgrunnlagTest { hendelseId = UUID.randomUUID(), beløp = 25000.månedlig, måned = 1.februar.yearMonth, - type = Skatteopplysning.Inntekttype.LØNNSINNTEKT, + type = LØNNSINNTEKT, fordel = "", beskrivelse = "", tidsstempel = LocalDateTime.now() @@ -69,7 +152,7 @@ internal class SkattInntektsgrunnlagTest { hendelseId = UUID.randomUUID(), beløp = 25000.månedlig, måned = 1.mars.yearMonth, - type = Skatteopplysning.Inntekttype.LØNNSINNTEKT, + type = LØNNSINNTEKT, fordel = "", beskrivelse = "", tidsstempel = LocalDateTime.now() @@ -77,16 +160,9 @@ internal class SkattInntektsgrunnlagTest { ), ansattPerioder = listOf(AnsattPeriode(EPOCH, null)) ) - assertNull(emptyList().avklarSykepengegrunnlag( - skjæringstidspunkt.forrigeDag, - null, - skattSykepengegrunnlag - )) - assertTrue(skattSykepengegrunnlag === emptyList().avklarSykepengegrunnlag( - skjæringstidspunkt, - null, - skattSykepengegrunnlag - )) + assertFalse(skattSykepengegrunnlag.kanBrukes(skjæringstidspunkt.forrigeDag)) + assertTrue(skattSykepengegrunnlag.kanBrukes(skjæringstidspunkt)) + assertFalse(skattSykepengegrunnlag.kanBrukes(skjæringstidspunkt.nesteDag)) } @Test @@ -100,7 +176,7 @@ internal class SkattInntektsgrunnlagTest { hendelseId = UUID.randomUUID(), beløp = 25000.månedlig, måned = 1.januar.yearMonth, - type = Skatteopplysning.Inntekttype.LØNNSINNTEKT, + type = LØNNSINNTEKT, fordel = "", beskrivelse = "", tidsstempel = LocalDateTime.now() @@ -109,7 +185,7 @@ internal class SkattInntektsgrunnlagTest { hendelseId = UUID.randomUUID(), beløp = 25000.månedlig, måned = 1.februar.yearMonth, - type = Skatteopplysning.Inntekttype.LØNNSINNTEKT, + type = LØNNSINNTEKT, fordel = "", beskrivelse = "", tidsstempel = LocalDateTime.now() @@ -125,7 +201,7 @@ internal class SkattInntektsgrunnlagTest { hendelseId = UUID.randomUUID(), beløp = 25000.månedlig, måned = 1.januar.yearMonth, - type = Skatteopplysning.Inntekttype.LØNNSINNTEKT, + type = LØNNSINNTEKT, fordel = "", beskrivelse = "", tidsstempel = LocalDateTime.now() @@ -133,16 +209,11 @@ internal class SkattInntektsgrunnlagTest { ), ansattPerioder = listOf(AnsattPeriode(EPOCH, null)) ) - assertTrue(skattSykepengegrunnlag1 === emptyList().avklarSykepengegrunnlag( - skjæringstidspunkt, - null, - skattSykepengegrunnlag1 - )) - assertNull(emptyList().avklarSykepengegrunnlag( - skjæringstidspunkt, - null, - skattSykepengegrunnlag2 - )) + assertTrue(skattSykepengegrunnlag1.kanBrukes(skjæringstidspunkt)) + assertFalse(skattSykepengegrunnlag2.kanBrukes(skjæringstidspunkt)) + + val resultat = skattSykepengegrunnlag1.somSykepengegrunnlag() + assertEquals(SkattSykepengegrunnlag::class, resultat::class) } @Test @@ -160,18 +231,24 @@ internal class SkattInntektsgrunnlagTest { inntektsopplysninger = emptyList(), ansattPerioder = listOf(AnsattPeriode(1.januar, null)) ) - val resultat = emptyList().avklarSykepengegrunnlag( - skjæringstidspunkt, - null, - skattSykepengegrunnlag1 + assertTrue(skattSykepengegrunnlag1.kanBrukes(skjæringstidspunkt)) + assertFalse(skattSykepengegrunnlag2.kanBrukes(skjæringstidspunkt)) + + val resultat = skattSykepengegrunnlag1.somSykepengegrunnlag() + assertEquals(IkkeRapportert::class, resultat::class) + } + + @Test + fun `sykepengegrunnlag for arbeidsgiver med nytt arbeidsforhold`() { + val skatt = SkattSykepengegrunnlag( + hendelseId = UUID.randomUUID(), + dato = 1.februar, + inntektsopplysninger = emptyList(), + ansattPerioder = listOf(AnsattPeriode(1.januar, null)) ) - assertNotNull(resultat) + val resultat = skatt.somSykepengegrunnlag() assertEquals(IkkeRapportert::class, resultat::class) - assertNull(emptyList().avklarSykepengegrunnlag( - skjæringstidspunkt, - null, - skattSykepengegrunnlag2 - )) + assertEquals(INGEN, resultat.inspektør.beløp) } } \ No newline at end of file