Skip to content

Commit

Permalink
Konsumér inntektsmelding-v1 fra Simba (#603)
Browse files Browse the repository at this point in the history
* Konsumér inntektsmelding-v1 fra Simba

* Fjern TODOs

* Gjør testverdi for arkivreferanse likt format som prod
  • Loading branch information
bjerga authored Dec 5, 2024
1 parent 95c41e9 commit e5f5e0d
Show file tree
Hide file tree
Showing 5 changed files with 335 additions and 237 deletions.
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
24 changes: 19 additions & 5 deletions src/main/kotlin/no/nav/syfo/simba/InntektsmeldingConsumer.kt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<String, Any>,
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
)
166 changes: 93 additions & 73 deletions src/main/kotlin/no/nav/syfo/simba/MapInntektsmelding.kt
Original file line number Diff line number Diff line change
@@ -1,113 +1,133 @@
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
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,
)
Loading

0 comments on commit e5f5e0d

Please sign in to comment.