diff --git a/gradle.properties b/gradle.properties index 3607d35f3..9792269ec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,8 +39,8 @@ apacheKafkaStreamsVersion=3.8.0 annotationApiVersion=1.3.2 altinnCorrespondanceVersion=1.2019.09.25-00.21-49b69f0625e0 logbackClassicVersion=1.4.8 -hagDomeneInntektsmeldingVersion=0.1.5 -hagUtilsVersion=0.7.0 +hagDomeneInntektsmeldingVersion=0.1.6 +hagUtilsVersion=0.9.0 kotlinxSerializationVersion=1.6.0 bakgrunnsjobbVersion=1.0.4 pdlClientVersion=0.6.2 diff --git a/src/main/kotlin/no/nav/syfo/simba/InntektsmeldingConsumer.kt b/src/main/kotlin/no/nav/syfo/simba/InntektsmeldingConsumer.kt index 72b2ad0ae..45a2f0c73 100644 --- a/src/main/kotlin/no/nav/syfo/simba/InntektsmeldingConsumer.kt +++ b/src/main/kotlin/no/nav/syfo/simba/InntektsmeldingConsumer.kt @@ -1,9 +1,10 @@ package no.nav.syfo.simba +import kotlinx.serialization.Serializable import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.JournalfoertInntektsmelding import no.nav.helsearbeidsgiver.pdl.PdlClient import no.nav.helsearbeidsgiver.utils.json.fromJson +import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateSerializer import no.nav.helsearbeidsgiver.utils.log.logger import no.nav.helsearbeidsgiver.utils.log.sikkerLogger import no.nav.syfo.behandling.FantIkkeAktørException @@ -21,7 +22,9 @@ import no.nav.syfo.utsattoppgave.UtsattOppgaveService import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.kafka.clients.consumer.KafkaConsumer import java.time.Duration +import java.time.LocalDate import java.time.LocalDateTime +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding as InntektsmeldingV1 class InntektsmeldingConsumer( props: Map, @@ -84,15 +87,15 @@ class InntektsmeldingConsumer( if (im != null) { sikkerlogger.info("InntektsmeldingConsumer: Behandler ikke ${meldingFraSimba.journalpostId}. Finnes allerede.") } else { - behandle(meldingFraSimba.journalpostId, meldingFraSimba.inntektsmelding, meldingFraSimba.selvbestemt) + behandle(meldingFraSimba.journalpostId, meldingFraSimba.inntektsmeldingV1, meldingFraSimba.bestemmendeFravaersdag, meldingFraSimba.selvbestemt) log.info("InntektsmeldingConsumer: Behandlet inntektsmelding med journalpostId: ${meldingFraSimba.journalpostId}") } } - private fun behandle(journalpostId: String, inntektsmeldingFraSimba: Inntektsmelding, selvbestemt: Boolean) { - val aktorid = hentAktoeridFraPDL(inntektsmeldingFraSimba.identitetsnummer) + private fun behandle(journalpostId: String, inntektsmeldingFraSimba: InntektsmeldingV1, bestemmendeFravaersdag: LocalDate?, selvbestemt: Boolean) { + val aktorid = hentAktoeridFraPDL(inntektsmeldingFraSimba.sykmeldt.fnr.verdi) val arkivreferanse = "im_$journalpostId" - val inntektsmelding = mapInntektsmelding(arkivreferanse, aktorid, journalpostId, inntektsmeldingFraSimba, selvbestemt) + val inntektsmelding = mapInntektsmelding(arkivreferanse, aktorid, journalpostId, inntektsmeldingFraSimba, bestemmendeFravaersdag, selvbestemt) val dto = inntektsmeldingService.lagreBehandling(inntektsmelding, aktorid) val matcherSpleis = inntektsmelding.matcherSpleis() val timeout = if (matcherSpleis) { @@ -154,3 +157,14 @@ class InntektsmeldingConsumer( } } } + +// Midlertidig klasse som inneholder både gammelt og nytt format +@Serializable +private data class JournalfoertInntektsmelding( + val journalpostId: String, + val inntektsmeldingV1: InntektsmeldingV1, + @Serializable(LocalDateSerializer::class) + val bestemmendeFravaersdag: LocalDate?, + val inntektsmelding: Inntektsmelding, + val selvbestemt: Boolean, // for å skille på selvbestemt og vanlig i spinosaurus, før V1 tas i bruk overalt +) diff --git a/src/main/kotlin/no/nav/syfo/simba/MapInntektsmelding.kt b/src/main/kotlin/no/nav/syfo/simba/MapInntektsmelding.kt index 49dc8b4a1..b6f17f146 100644 --- a/src/main/kotlin/no/nav/syfo/simba/MapInntektsmelding.kt +++ b/src/main/kotlin/no/nav/syfo/simba/MapInntektsmelding.kt @@ -1,25 +1,25 @@ package no.nav.syfo.simba -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Bonus -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Feilregistrert -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Ferie -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Ferietrekk -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntekt -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.InntektEndringAarsak -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.NyStilling -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.NyStillingsprosent -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Nyansatt -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Permisjon -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Permittering -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Sykefravaer -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Tariffendring -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.VarigLonnsendring +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Bonus +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Feilregistrert +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Ferie +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Ferietrekk +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntekt +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.InntektEndringAarsak +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.NyStilling +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.NyStillingsprosent +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Nyansatt +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Permisjon +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Permittering +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.RefusjonEndring +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykefravaer +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Tariffendring +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.VarigLoennsendring import no.nav.helsearbeidsgiver.utils.pipe.orDefault import no.nav.syfo.domain.JournalStatus import no.nav.syfo.domain.Periode import no.nav.syfo.domain.inntektsmelding.AvsenderSystem import no.nav.syfo.domain.inntektsmelding.EndringIRefusjon -import no.nav.syfo.domain.inntektsmelding.Gyldighetsstatus import no.nav.syfo.domain.inntektsmelding.Inntektsmelding import no.nav.syfo.domain.inntektsmelding.Kontaktinformasjon import no.nav.syfo.domain.inntektsmelding.Naturalytelse @@ -27,87 +27,107 @@ import no.nav.syfo.domain.inntektsmelding.OpphoerAvNaturalytelse import no.nav.syfo.domain.inntektsmelding.RapportertInntekt import no.nav.syfo.domain.inntektsmelding.Refusjon import no.nav.syfo.domain.inntektsmelding.SpinnInntektEndringAarsak -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding as InntektmeldingSimba +import java.time.LocalDate +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding as InntektmeldingV1 +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Naturalytelse as NaturalytelseV1 +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Periode as PeriodeV1 +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Refusjon as RefusjonV1 object Avsender { - val NAV_NO = "NAV_NO" - val NAV_NO_SELVBESTEMT = NAV_NO + "_SELVBESTEMT" - val VERSJON = "1.0" + const val NAV_NO = "NAV_NO" + const val NAV_NO_SELVBESTEMT = NAV_NO + "_SELVBESTEMT" + const val VERSJON = "1.0" } -fun mapInntektsmelding(arkivreferanse: String, aktorId: String, journalpostId: String, im: InntektmeldingSimba, selvbestemt: Boolean = false): Inntektsmelding { +fun mapInntektsmelding( + arkivreferanse: String, + aktorId: String, + journalpostId: String, + im: InntektmeldingV1, + bestemmendeFravaersdag: LocalDate?, + selvbestemt: Boolean = false +): Inntektsmelding { val avsenderSystem = if (selvbestemt) { Avsender.NAV_NO_SELVBESTEMT } else { Avsender.NAV_NO } return Inntektsmelding( - id = "", - vedtaksperiodeId = im.vedtaksperiodeId, - fnr = im.identitetsnummer, - arbeidsgiverOrgnummer = im.orgnrUnderenhet, - arbeidsgiverPrivatFnr = null, - arbeidsgiverPrivatAktørId = null, - arbeidsforholdId = null, - journalpostId = journalpostId, - arsakTilInnsending = im.årsakInnsending.name.lowercase().replaceFirstChar { it.uppercase() }, journalStatus = JournalStatus.FERDIGSTILT, - arbeidsgiverperioder = im.arbeidsgiverperioder.map { Periode(it.fom, it.tom) }, - beregnetInntekt = im.beregnetInntekt.toBigDecimal(), - inntektsdato = im.inntektsdato, - refusjon = Refusjon(im.refusjon.refusjonPrMnd.orDefault(0.0).toBigDecimal(), im.refusjon.refusjonOpphører), - endringerIRefusjon = im.refusjon.refusjonEndringer?.map { EndringIRefusjon(it.dato, it.beløp?.toBigDecimal()) }.orEmpty(), - opphørAvNaturalYtelse = im.naturalytelser?.map { - OpphoerAvNaturalytelse( - Naturalytelse.valueOf(it.naturalytelse.name), - it.dato, - it.beløp.toBigDecimal() - ) - }.orEmpty(), - gjenopptakelserNaturalYtelse = emptyList(), - gyldighetsStatus = Gyldighetsstatus.GYLDIG, - arkivRefereranse = arkivreferanse, - feriePerioder = emptyList(), - førsteFraværsdag = im.bestemmendeFraværsdag, - mottattDato = im.tidspunkt.toLocalDateTime(), sakId = "", + arkivRefereranse = arkivreferanse, aktorId = aktorId, - begrunnelseRedusert = im.fullLønnIArbeidsgiverPerioden?.begrunnelse?.name.orEmpty(), + journalpostId = journalpostId, avsenderSystem = AvsenderSystem(avsenderSystem, Avsender.VERSJON), - nærRelasjon = null, - kontaktinformasjon = Kontaktinformasjon(im.innsenderNavn, im.telefonnummer), - innsendingstidspunkt = im.tidspunkt.toLocalDateTime(), - bruttoUtbetalt = im.fullLønnIArbeidsgiverPerioden?.utbetalt?.toBigDecimal(), - årsakEndring = null, - rapportertInntekt = im.inntekt?.tilRapportertInntekt() + vedtaksperiodeId = im.vedtaksperiodeId, + fnr = im.sykmeldt.fnr.verdi, + arbeidsgiverOrgnummer = im.avsender.orgnr.verdi, + kontaktinformasjon = im.avsender.let { Kontaktinformasjon(it.navn, it.tlf) }, + arbeidsgiverperioder = im.agp?.perioder?.map(PeriodeV1::tilPeriode).orEmpty(), + bruttoUtbetalt = im.agp?.redusertLoennIAgp?.beloep?.toBigDecimal(), + begrunnelseRedusert = im.agp?.redusertLoennIAgp?.begrunnelse?.name.orEmpty(), + beregnetInntekt = im.inntekt!!.beloep.toBigDecimal(), + inntektsdato = im.inntekt?.inntektsdato, + opphørAvNaturalYtelse = im.inntekt?.naturalytelser?.map(NaturalytelseV1::tilNaturalytelse).orEmpty(), + rapportertInntekt = im.inntekt?.tilRapportertInntekt(), + refusjon = im.refusjon.tilRefusjon(), + endringerIRefusjon = im.refusjon?.endringer?.map(RefusjonEndring::tilEndringIRefusjon).orEmpty(), + førsteFraværsdag = bestemmendeFravaersdag, + arsakTilInnsending = im.aarsakInnsending.name, + mottattDato = im.mottatt.toLocalDateTime(), + innsendingstidspunkt = im.mottatt.toLocalDateTime() ) } -fun Inntekt.tilRapportertInntekt() = - RapportertInntekt( - bekreftet = this.bekreftet, - beregnetInntekt = this.beregnetInntekt, - endringAarsak = this.endringÅrsak?.aarsak(), - endringAarsakData = this.endringÅrsak?.tilSpinnInntektEndringAarsak(), - manueltKorrigert = this.manueltKorrigert +private fun NaturalytelseV1.tilNaturalytelse(): OpphoerAvNaturalytelse = + OpphoerAvNaturalytelse( + naturalytelse = naturalytelse.name.let(Naturalytelse::valueOf), + fom = sluttdato, + beloepPrMnd = verdiBeloep.toBigDecimal() ) -fun InntektEndringAarsak.aarsak(): String = - this.tilSpinnInntektEndringAarsak()?.aarsak ?: this::class.simpleName ?: "Ukjent" +private fun Inntekt.tilRapportertInntekt(): RapportertInntekt { + val spinnEndringAarsak = endringAarsak?.tilSpinnInntektEndringAarsak() -fun InntektEndringAarsak.tilSpinnInntektEndringAarsak(): SpinnInntektEndringAarsak? = + return RapportertInntekt( + bekreftet = true, + beregnetInntekt = beloep, + endringAarsak = spinnEndringAarsak?.aarsak, + endringAarsakData = spinnEndringAarsak, + manueltKorrigert = endringAarsak != null + ) +} + +private fun RefusjonV1?.tilRefusjon(): Refusjon = + Refusjon( + beloepPrMnd = this?.beloepPerMaaned.orDefault(0.0).toBigDecimal(), + opphoersdato = this?.sluttdato + ) + +private fun RefusjonEndring.tilEndringIRefusjon(): EndringIRefusjon = + EndringIRefusjon( + endringsdato = startdato, + beloep = beloep.toBigDecimal() + ) + +private fun InntektEndringAarsak.tilSpinnInntektEndringAarsak(): SpinnInntektEndringAarsak = when (this) { - is Permisjon -> SpinnInntektEndringAarsak(aarsak = "Permisjon", perioder = liste.map { Periode(it.fom, it.tom) }) - is Ferie -> SpinnInntektEndringAarsak(aarsak = "Ferie", perioder = liste.map { Periode(it.fom, it.tom) }) + is Bonus -> SpinnInntektEndringAarsak(aarsak = "Bonus") + is Feilregistrert -> SpinnInntektEndringAarsak(aarsak = "Feilregistrert") + is Ferie -> SpinnInntektEndringAarsak(aarsak = "Ferie", perioder = ferier.map(PeriodeV1::tilPeriode)) is Ferietrekk -> SpinnInntektEndringAarsak(aarsak = "Ferietrekk") - is Permittering -> SpinnInntektEndringAarsak(aarsak = "Permittering", perioder = liste.map { Periode(it.fom, it.tom) }) - is Tariffendring -> SpinnInntektEndringAarsak("Tariffendring", gjelderFra = gjelderFra, bleKjent = bleKjent) - is VarigLonnsendring -> SpinnInntektEndringAarsak("VarigLonnsendring", gjelderFra = gjelderFra) is NyStilling -> SpinnInntektEndringAarsak(aarsak = "NyStilling", gjelderFra = gjelderFra) is NyStillingsprosent -> SpinnInntektEndringAarsak(aarsak = "NyStillingsprosent", gjelderFra = gjelderFra) - is Bonus -> SpinnInntektEndringAarsak(aarsak = "Bonus") - is Sykefravaer -> SpinnInntektEndringAarsak(aarsak = "Sykefravaer", perioder = liste.map { Periode(it.fom, it.tom) }) is Nyansatt -> SpinnInntektEndringAarsak(aarsak = "Nyansatt") - is Feilregistrert -> SpinnInntektEndringAarsak(aarsak = "Feilregistrert") - else -> null + is Permisjon -> SpinnInntektEndringAarsak(aarsak = "Permisjon", perioder = permisjoner.map(PeriodeV1::tilPeriode)) + is Permittering -> SpinnInntektEndringAarsak(aarsak = "Permittering", perioder = permitteringer.map(PeriodeV1::tilPeriode)) + is Sykefravaer -> SpinnInntektEndringAarsak(aarsak = "Sykefravaer", perioder = sykefravaer.map(PeriodeV1::tilPeriode)) + is Tariffendring -> SpinnInntektEndringAarsak(aarsak = "Tariffendring", gjelderFra = gjelderFra, bleKjent = bleKjent) + is VarigLoennsendring -> SpinnInntektEndringAarsak(aarsak = "VarigLonnsendring", gjelderFra = gjelderFra) } + +private fun PeriodeV1.tilPeriode(): Periode = + Periode( + fom = fom, + tom = tom, + ) diff --git a/src/test/kotlin/no/nav/syfo/simba/MapInntektEndringAarsakFraSimbaTest.kt b/src/test/kotlin/no/nav/syfo/simba/MapInntektEndringAarsakFraSimbaTest.kt index 6496c230c..41e6b29b7 100644 --- a/src/test/kotlin/no/nav/syfo/simba/MapInntektEndringAarsakFraSimbaTest.kt +++ b/src/test/kotlin/no/nav/syfo/simba/MapInntektEndringAarsakFraSimbaTest.kt @@ -1,25 +1,25 @@ package no.nav.syfo.simba -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Bonus -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Feilregistrert -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Ferie -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Ferietrekk -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.InntektEndringAarsak -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.NyStilling -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.NyStillingsprosent -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Nyansatt -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Permisjon -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Permittering -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Sykefravaer -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Tariffendring -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.VarigLonnsendring -import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Periode +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Bonus +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Feilregistrert +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Ferie +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Ferietrekk +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.InntektEndringAarsak +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.NyStilling +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.NyStillingsprosent +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Nyansatt +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Permisjon +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Permittering +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykefravaer +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Tariffendring +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.VarigLoennsendring +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.til +import no.nav.helsearbeidsgiver.utils.test.date.januar +import no.nav.helsearbeidsgiver.utils.test.date.mai import no.nav.syfo.domain.inntektsmelding.SpinnInntektEndringAarsak import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Test import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.MethodSource -import java.time.LocalDate class MapInntektEndringAarsakFraSimbaTest { @@ -27,56 +27,45 @@ class MapInntektEndringAarsakFraSimbaTest { // SpinnInntektEndringAarsak som tilsvarer InntektEndringAarsak @JvmStatic - fun inntektEndringerProvider() = - listOf( - Pair(Mock.spinnInntektEndringAarsak, Bonus()), - Pair(Mock.spinnInntektEndringAarsak.copy(aarsak = "Feilregistrert"), Feilregistrert), - Pair(Mock.spinnInntektEndringAarsak.copy(aarsak = "Ferie", perioder = listOf(Mock.spinnPeriode)), Ferie(liste = listOf(Mock.periode))), - Pair(Mock.spinnInntektEndringAarsak.copy(aarsak = "Ferietrekk"), Ferietrekk), - Pair(Mock.spinnInntektEndringAarsak.copy(aarsak = "Nyansatt"), Nyansatt), - Pair(Mock.spinnInntektEndringAarsak.copy(aarsak = "NyStilling", gjelderFra = Mock.gjelderFra), NyStilling(gjelderFra = Mock.gjelderFra)), - Pair(Mock.spinnInntektEndringAarsak.copy(aarsak = "NyStillingsprosent", gjelderFra = Mock.gjelderFra), NyStillingsprosent(gjelderFra = Mock.gjelderFra)), - Pair(Mock.spinnInntektEndringAarsak.copy(aarsak = "Permisjon", perioder = listOf(Mock.spinnPeriode)), Permisjon(liste = listOf(Mock.periode))), - Pair(Mock.spinnInntektEndringAarsak.copy(aarsak = "Permittering", perioder = listOf(Mock.spinnPeriode)), Permittering(liste = listOf(Mock.periode))), - Pair(Mock.spinnInntektEndringAarsak.copy(aarsak = "Sykefravaer", perioder = listOf(Mock.spinnPeriode)), Sykefravaer(liste = listOf(Mock.periode))), - Pair(Mock.spinnInntektEndringAarsak.copy(aarsak = "Tariffendring", gjelderFra = Mock.gjelderFra, bleKjent = Mock.bleKjent), Tariffendring(gjelderFra = Mock.gjelderFra, bleKjent = Mock.bleKjent)), - Pair(Mock.spinnInntektEndringAarsak.copy(aarsak = "VarigLonnsendring", gjelderFra = Mock.gjelderFra), VarigLonnsendring(gjelderFra = Mock.gjelderFra)), + fun inntektEndringerProvider(): List> { + val perioder = listOf(1.januar til 31.januar) + val spinnPerioder = perioder.map { + no.nav.syfo.domain.Periode( + fom = it.fom, + tom = it.tom + ) + } + return listOf( + SpinnInntektEndringAarsak("Bonus") to Bonus, + SpinnInntektEndringAarsak("Feilregistrert") to Feilregistrert, + SpinnInntektEndringAarsak("Ferie", perioder = spinnPerioder) to Ferie(ferier = perioder), + SpinnInntektEndringAarsak("Ferietrekk") to Ferietrekk, + SpinnInntektEndringAarsak("Nyansatt") to Nyansatt, + SpinnInntektEndringAarsak("NyStilling", gjelderFra = 1.januar) to NyStilling(gjelderFra = 1.januar), + SpinnInntektEndringAarsak("NyStillingsprosent", gjelderFra = 1.januar) to NyStillingsprosent(gjelderFra = 1.januar), + SpinnInntektEndringAarsak("Permisjon", perioder = spinnPerioder) to Permisjon(permisjoner = perioder), + SpinnInntektEndringAarsak("Permittering", perioder = spinnPerioder) to Permittering(permitteringer = perioder), + SpinnInntektEndringAarsak("Sykefravaer", perioder = spinnPerioder) to Sykefravaer(sykefravaer = perioder), + SpinnInntektEndringAarsak("Tariffendring", gjelderFra = 1.januar, bleKjent = 1.mai) to Tariffendring(gjelderFra = 1.januar, bleKjent = 1.mai), + SpinnInntektEndringAarsak("VarigLonnsendring", gjelderFra = 1.januar) to VarigLoennsendring(gjelderFra = 1.januar), ) + } } - object Mock { - val periode = Periode( - LocalDate.of(2021, 1, 1), - LocalDate.of(2021, 1, 30) - ) - val spinnPeriode = no.nav.syfo.domain.Periode( - fom = periode.fom, - tom = periode.tom - ) - val gjelderFra = LocalDate.of(2021, 1, 1) - val bleKjent = LocalDate.of(2021, 5, 1) - val spinnInntektEndringAarsak = SpinnInntektEndringAarsak(aarsak = "Bonus") - } @ParameterizedTest @MethodSource("inntektEndringerProvider") fun `InntektEndringAarsak mappes til riktig SpinnInntektEndringAarsak`(pair: Pair) { val (spinnInntektEndringAarsak, inntektEndringAarsak) = pair - assertEquals(spinnInntektEndringAarsak, inntektEndringAarsak.tilSpinnInntektEndringAarsak()) - } + val im = lagInntektsmelding().let { + it.copy( + inntekt = it.inntekt?.copy( + endringAarsak = inntektEndringAarsak + ) + ) + } + + val mapped = mapInntektsmelding("1", "2", "3", im, 1.januar) - @Test - fun oversettInntektEndringAarsakTilRapportertInntektEndringAarsak() { - assertEquals("Permisjon", Permisjon(emptyList()).aarsak()) - assertEquals("Ferie", Ferie(emptyList()).aarsak()) - assertEquals("Ferietrekk", Ferietrekk.aarsak()) - assertEquals("Permittering", Permittering(emptyList()).aarsak()) - assertEquals("Tariffendring", Tariffendring(LocalDate.now(), LocalDate.now()).aarsak()) - assertEquals("VarigLonnsendring", VarigLonnsendring(LocalDate.now()).aarsak()) - assertEquals("NyStilling", NyStilling(LocalDate.now()).aarsak()) - assertEquals("NyStillingsprosent", NyStillingsprosent(LocalDate.now()).aarsak()) - assertEquals("Bonus", Bonus().aarsak()) - assertEquals("Sykefravaer", Sykefravaer(emptyList()).aarsak()) - assertEquals("Nyansatt", Nyansatt.aarsak()) - assertEquals("Feilregistrert", Feilregistrert.aarsak()) + assertEquals(spinnInntektEndringAarsak, mapped.rapportertInntekt?.endringAarsakData) } } diff --git a/src/test/kotlin/no/nav/syfo/simba/MapInntektsmeldingFraSimbaTest.kt b/src/test/kotlin/no/nav/syfo/simba/MapInntektsmeldingFraSimbaTest.kt index 307591008..54f5560c1 100644 --- a/src/test/kotlin/no/nav/syfo/simba/MapInntektsmeldingFraSimbaTest.kt +++ b/src/test/kotlin/no/nav/syfo/simba/MapInntektsmeldingFraSimbaTest.kt @@ -1,16 +1,26 @@ package no.nav.syfo.simba -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.AarsakInnsending -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.BegrunnelseIngenEllerRedusertUtbetalingKode -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Bonus -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.FullLoennIArbeidsgiverPerioden -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntekt -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Naturalytelse -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.NaturalytelseKode -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Refusjon -import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.RefusjonEndring -import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Periode +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.AarsakInnsending +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Arbeidsgiverperiode +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Avsender +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Bonus +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntekt +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Naturalytelse +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Permisjon +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.RedusertLoennIAgp +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Refusjon +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.RefusjonEndring +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykmeldt +import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.til +import no.nav.helsearbeidsgiver.utils.test.date.desember +import no.nav.helsearbeidsgiver.utils.test.date.februar +import no.nav.helsearbeidsgiver.utils.test.date.januar +import no.nav.helsearbeidsgiver.utils.test.date.mai +import no.nav.helsearbeidsgiver.utils.test.date.mars +import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig +import no.nav.helsearbeidsgiver.utils.wrapper.Fnr +import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertNull import org.junit.jupiter.api.Test @@ -19,135 +29,200 @@ import java.time.LocalDateTime import java.time.OffsetDateTime import java.time.ZoneOffset import java.util.UUID +import no.nav.syfo.simba.Avsender as MuligAvsender class MapInntektsmeldingFraSimbaTest { @Test fun mapInntektsmeldingMedNaturalytelser() { - val naturalytelser = NaturalytelseKode.entries.map { Naturalytelse(it, LocalDate.now(), 1.0) } + val naturalytelser = Naturalytelse.Kode.entries.map { Naturalytelse(it, 1.0, LocalDate.now()) } val antallNaturalytelser = naturalytelser.count() - val imd = lagInntektsmelding().copy(naturalytelser = naturalytelser) - val mapped = mapInntektsmelding("1323", "sdfds", "134", imd) + val imd = lagInntektsmelding().let { + it.copy( + inntekt = it.inntekt?.copy( + naturalytelser = naturalytelser + ) + ) + } + val mapped = mapInntektsmelding( + arkivreferanse = "im1323", + aktorId = "sdfds", + journalpostId = "134", + im = imd, + bestemmendeFravaersdag = 10.januar + ) assertEquals(antallNaturalytelser, mapped.opphørAvNaturalYtelse.size) - val naturalytelse = mapped.opphørAvNaturalYtelse.get(0) + val naturalytelse = mapped.opphørAvNaturalYtelse[0] assertEquals(no.nav.syfo.domain.inntektsmelding.Naturalytelse.AKSJERGRUNNFONDSBEVISTILUNDERKURS, naturalytelse.naturalytelse) } @Test fun mapRefusjon() { - val refusjonEndring = listOf(RefusjonEndring(123.0, LocalDate.now())) - val refusjon = Refusjon(true, 10.0, LocalDate.of(2025, 12, 12), refusjonEndring) - val mapped = mapInntektsmelding("1323", "sdfds", "134", lagInntektsmelding().copy(refusjon = refusjon)) - assertEquals(mapped.refusjon.opphoersdato, refusjon.refusjonOpphører) + val refusjonEndringer = listOf(RefusjonEndring(123.0, 1.desember(2025))) + val refusjon = Refusjon(10.0, refusjonEndringer, 12.desember(2025)) + val mapped = mapInntektsmelding( + arkivreferanse = "im1323", + aktorId = "sdfds", + journalpostId = "134", + im = lagInntektsmelding().copy(refusjon = refusjon), + bestemmendeFravaersdag = 10.januar + ) + assertEquals(mapped.refusjon.opphoersdato, refusjon.sluttdato) assertEquals(mapped.endringerIRefusjon.size, 1) } @Test fun mapBegrunnelseRedusert() { - val begrunnelser = BegrunnelseIngenEllerRedusertUtbetalingKode.entries - val mapped = begrunnelser.map { kode -> - lagInntektsmelding().copy( - fullLønnIArbeidsgiverPerioden = FullLoennIArbeidsgiverPerioden( - false, - kode, - 1.0 + RedusertLoennIAgp.Begrunnelse.entries.forEach { begrunnelse -> + val im = lagInntektsmelding().let { + it.copy( + agp = it.agp?.copy( + redusertLoennIAgp = RedusertLoennIAgp( + beloep = 1.0, + begrunnelse = begrunnelse + ) + ) ) - ) - } - .map { imd -> - mapInntektsmelding("123", "abc", "345", imd) - }.toList() - for (i in mapped.indices) { - assertEquals(begrunnelser[i].name, mapped[i].begrunnelseRedusert, "Feil ved mapping av $i: ${begrunnelser[i]}") - assertEquals(1.0.toBigDecimal(), mapped[i].bruttoUtbetalt, "Feil ved mapping av $i: ${begrunnelser[i]}") + } + + val mapped = mapInntektsmelding("im123", "abc", "345", im, 10.januar) + + assertEquals(begrunnelse.name, mapped.begrunnelseRedusert, "Feil ved mapping: $begrunnelse") + assertEquals(1.0.toBigDecimal(), mapped.bruttoUtbetalt, "Feil ved mapping: $begrunnelse") } } @Test fun mapIngenBegrunnelseRedusert() { - val im = mapInntektsmelding("1", "2", "3", lagInntektsmelding()) - assertEquals("", im.begrunnelseRedusert) - assertNull(im.bruttoUtbetalt) + val im = lagInntektsmelding().let { + it.copy( + agp = it.agp?.copy( + redusertLoennIAgp = null + ) + ) + } + val mapped = mapInntektsmelding("im1", "2", "3", im, 10.januar) + assertEquals("", mapped.begrunnelseRedusert) + assertNull(mapped.bruttoUtbetalt) } @Test - fun mapInntektEndringAArsak() { - val im = mapInntektsmelding("1", "2", "3", lagInntektsmelding().copy(inntekt = Mock.inntektEndringBonus)) - assertEquals("", im.begrunnelseRedusert) - assertNull(im.bruttoUtbetalt) - assertEquals("Bonus", im.rapportertInntekt?.endringAarsak) - assertEquals("Bonus", im.rapportertInntekt?.endringAarsakData?.aarsak) - assertNull(im.rapportertInntekt?.endringAarsakData?.perioder) - assertNull(im.rapportertInntekt?.endringAarsakData?.gjelderFra) - assertNull(im.rapportertInntekt?.endringAarsakData?.bleKjent) + fun mapInntektEndringAarsak() { + val im = lagInntektsmelding().copy( + inntekt = Inntekt( + beloep = 60_000.0, + inntektsdato = 3.mai, + naturalytelser = emptyList(), + endringAarsak = Bonus, + ) + ) + val mapped = mapInntektsmelding("im1", "2", "3", im, 10.januar) + assertEquals("Bonus", mapped.rapportertInntekt?.endringAarsak) + assertEquals("Bonus", mapped.rapportertInntekt?.endringAarsakData?.aarsak) + assertNull(mapped.rapportertInntekt?.endringAarsakData?.perioder) + assertNull(mapped.rapportertInntekt?.endringAarsakData?.gjelderFra) + assertNull(mapped.rapportertInntekt?.endringAarsakData?.bleKjent) } @Test fun mapInnsendtTidspunktFraSimba() { val localDateTime = LocalDateTime.of(2023, 2, 11, 14, 0) val innsendt = OffsetDateTime.of(localDateTime, ZoneOffset.of("+1")) - val im = mapInntektsmelding("1", "2", "3", lagInntektsmelding().copy(tidspunkt = innsendt)) + val im = mapInntektsmelding("im1", "2", "3", lagInntektsmelding().copy(mottatt = innsendt), 10.januar) assertEquals(localDateTime, im.innsendingstidspunkt) } @Test fun mapVedtaksperiodeID() { - val im = mapInntektsmelding("1", "2", "3", lagInntektsmelding()) + val im = mapInntektsmelding("im1", "2", "3", lagInntektsmelding().copy(vedtaksperiodeId = null), 10.januar) assertNull(im.vedtaksperiodeId) val vedtaksperiodeId = UUID.randomUUID() - val im2 = mapInntektsmelding("1", "2", "3", lagInntektsmelding().copy(vedtaksperiodeId = vedtaksperiodeId)) + val im2 = mapInntektsmelding("im1", "2", "3", lagInntektsmelding().copy(vedtaksperiodeId = vedtaksperiodeId), 10.januar) assertEquals(vedtaksperiodeId, im2.vedtaksperiodeId) } @Test fun mapAvsenderForSelvbestemtOgVanlig() { - val selvbestemtIM = mapInntektsmelding("1", "2", "3", lagInntektsmelding(), selvbestemt = true) - assertEquals(Avsender.NAV_NO_SELVBESTEMT, selvbestemtIM.avsenderSystem.navn) - assertEquals(Avsender.VERSJON, selvbestemtIM.avsenderSystem.versjon) - val im = mapInntektsmelding("1", "2", "3", lagInntektsmelding()) - assertEquals(Avsender.NAV_NO, im.avsenderSystem.navn) - assertEquals(Avsender.VERSJON, im.avsenderSystem.versjon) - } - - private fun lagInntektsmelding(): Inntektsmelding { - val dato1 = LocalDate.now().minusDays(7) - val dato2 = LocalDate.now().minusDays(5) - val dato3 = LocalDate.now().minusDays(3) - val periode1 = listOf(Periode(dato1, dato1)) - val periode2 = listOf(Periode(dato1, dato1), Periode(dato2, dato2)) - val periode3 = listOf(Periode(dato1, dato3)) - - val refusjonEndring = listOf(RefusjonEndring(123.0, LocalDate.now())) - val refusjon = Refusjon(true, 10.0, LocalDate.of(2025, 12, 12), refusjonEndring) - - val imFraSimba = Inntektsmelding( - orgnrUnderenhet = "123456789", - identitetsnummer = "12345678901", - fulltNavn = "Test testesen", - virksomhetNavn = "Blåbærsyltetøy A/S", - behandlingsdager = listOf(dato1), - egenmeldingsperioder = periode1, - bestemmendeFraværsdag = dato2, - fraværsperioder = periode2, - arbeidsgiverperioder = periode3, - beregnetInntekt = 100_000.0, - refusjon = refusjon, - naturalytelser = emptyList(), - tidspunkt = OffsetDateTime.now(), - årsakInnsending = AarsakInnsending.NY, - innsenderNavn = "Peppes Pizza", - telefonnummer = "22555555" - ) - return imFraSimba - } - object Mock { - val bonus = Bonus() - val forslagInntekt = 50_000.0 - val endretInntekt = 60_000.0 - val inntektUtenEndring = Inntekt( - bekreftet = true, - beregnetInntekt = forslagInntekt, - manueltKorrigert = false - ) - val inntektEndringBonus = inntektUtenEndring.copy(beregnetInntekt = endretInntekt, endringÅrsak = bonus, manueltKorrigert = true) + val selvbestemtIM = mapInntektsmelding("im1", "2", "3", lagInntektsmelding(), 10.januar, selvbestemt = true) + assertEquals(MuligAvsender.NAV_NO_SELVBESTEMT, selvbestemtIM.avsenderSystem.navn) + assertEquals(MuligAvsender.VERSJON, selvbestemtIM.avsenderSystem.versjon) + val im = mapInntektsmelding("im1", "2", "3", lagInntektsmelding(), 10.januar) + assertEquals(MuligAvsender.NAV_NO, im.avsenderSystem.navn) + assertEquals(MuligAvsender.VERSJON, im.avsenderSystem.versjon) } } + +fun lagInntektsmelding(): Inntektsmelding = + Inntektsmelding( + id = UUID.randomUUID(), + type = Inntektsmelding.Type.Forespurt( + id = UUID.randomUUID() + ), + vedtaksperiodeId = UUID.randomUUID(), + sykmeldt = Sykmeldt( + fnr = Fnr.genererGyldig(), + navn = "Syk Sykesen", + ), + avsender = Avsender( + orgnr = Orgnr.genererGyldig(), + orgNavn = "Blåbærsyltetøy A/S", + navn = "Hå Erresen", + tlf = "22555555", + ), + sykmeldingsperioder = listOf( + 10.januar til 31.januar, + 10.februar til 28.februar, + ), + agp = Arbeidsgiverperiode( + perioder = listOf( + 1.januar til 3.januar, + 5.januar til 5.januar, + 10.januar til 21.januar, + ), + egenmeldinger = listOf( + 1.januar til 3.januar, + 5.januar til 5.januar, + ), + redusertLoennIAgp = RedusertLoennIAgp( + beloep = 55_555.0, + begrunnelse = RedusertLoennIAgp.Begrunnelse.Permittering, + ), + ), + inntekt = Inntekt( + beloep = 66_666.0, + inntektsdato = 10.januar, + naturalytelser = listOf( + Naturalytelse( + naturalytelse = Naturalytelse.Kode.BIL, + verdiBeloep = 123.0, + sluttdato = 1.februar, + ), + Naturalytelse( + naturalytelse = Naturalytelse.Kode.FRITRANSPORT, + verdiBeloep = 456.0, + sluttdato = 15.februar, + ), + ), + endringAarsak = Permisjon( + permisjoner = listOf( + 6.januar til 6.januar, + 8.januar til 8.januar, + ) + ), + ), + refusjon = Refusjon( + beloepPerMaaned = 22_222.0, + endringer = listOf( + RefusjonEndring( + beloep = 22_111.0, + startdato = 1.februar, + ), + RefusjonEndring( + beloep = 22_000.0, + startdato = 2.februar, + ), + ), + sluttdato = 25.februar, + ), + aarsakInnsending = AarsakInnsending.Ny, + mottatt = 1.mars.atStartOfDay().atOffset(ZoneOffset.ofHours(1)), + )