Skip to content

Commit

Permalink
Map ny skjemaklasse til inntektsmelding (#665)
Browse files Browse the repository at this point in the history
* Map ny skjemaklasse til inntektsmelding

* Legg til kommentar for å forklare utleding av bestemmende fraværsdag
  • Loading branch information
bjerga authored Aug 14, 2024
1 parent 02d3769 commit 0eba06a
Show file tree
Hide file tree
Showing 9 changed files with 454 additions and 642 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,24 @@ import no.nav.helsearbeidsgiver.felles.domene.ForslagInntekt
import no.nav.helsearbeidsgiver.felles.domene.ForslagRefusjon
import no.nav.helsearbeidsgiver.utils.test.date.februar
import no.nav.helsearbeidsgiver.utils.test.date.januar
import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig
import no.nav.helsearbeidsgiver.utils.wrapper.Fnr
import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr
import java.util.UUID

fun mockForespoersel(): Forespoersel {
val orgnr = "789789789"
val orgnr = Orgnr.genererGyldig()
return Forespoersel(
type = ForespoerselType.KOMPLETT,
orgnr = orgnr,
fnr = "15055012345",
orgnr = orgnr.verdi,
fnr = Fnr.genererGyldig().verdi,
vedtaksperiodeId = UUID.randomUUID(),
sykmeldingsperioder = listOf(2.januar til 31.januar),
egenmeldingsperioder = listOf(1.januar til 1.januar),
bestemmendeFravaersdager =
mapOf(
orgnr to 1.januar,
"555767555" to 5.januar,
orgnr.verdi to 1.januar,
Orgnr.genererGyldig().verdi to 5.januar,
),
forespurtData = mockForespurtData(),
erBesvart = false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,18 +97,21 @@ fun mockInntektsmeldingV1(): InntektsmeldingV1 =
),
agp =
Arbeidsgiverperiode(
listOf(
5.oktober til 15.oktober,
20.oktober til 22.oktober,
),
listOf(
28.september til 28.september,
30.september til 30.september,
),
RedusertLoennIAgp(
beloep = 300.3,
begrunnelse = RedusertLoennIAgp.Begrunnelse.FerieEllerAvspasering,
),
perioder =
listOf(
5.oktober til 15.oktober,
20.oktober til 22.oktober,
),
egenmeldinger =
listOf(
28.september til 28.september,
30.september til 30.september,
),
redusertLoennIAgp =
RedusertLoennIAgp(
beloep = 300.3,
begrunnelse = RedusertLoennIAgp.Begrunnelse.FerieEllerAvspasering,
),
),
inntekt =
InntektV1(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonElement
import no.nav.helse.rapids_rivers.RapidsConnection
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convert
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Innsending
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.AarsakInnsending
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding
Expand All @@ -27,7 +26,6 @@ import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore
import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.Service
import no.nav.helsearbeidsgiver.felles.rapidsrivers.service.ServiceMed3Steg
import no.nav.helsearbeidsgiver.felles.utils.Log
import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.json.toPretty
Expand All @@ -44,7 +42,7 @@ data class Steg0(
val transaksjonId: UUID,
val forespoerselId: UUID,
val avsenderFnr: Fnr,
val skjema: JsonElement,
val skjema: SkjemaInntektsmelding,
)

data class Steg1(
Expand Down Expand Up @@ -81,7 +79,7 @@ class InnsendingService(
transaksjonId = Key.UUID.les(UuidSerializer, melding),
forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, melding),
avsenderFnr = Key.ARBEIDSGIVER_FNR.les(Fnr.serializer(), melding),
skjema = Key.SKJEMA_INNTEKTSMELDING.les(JsonElement.serializer(), melding),
skjema = Key.SKJEMA_INNTEKTSMELDING.les(SkjemaInntektsmelding.serializer(), melding),
)

override fun lesSteg1(melding: Map<Key, JsonElement>): Steg1 =
Expand Down Expand Up @@ -191,38 +189,32 @@ class InnsendingService(
steg2: Steg2,
) {
if (steg2 is Steg2.Komplett) {
val skjema =
runCatching {
steg0.skjema
.fromJson(SkjemaInntektsmelding.serializer())
.convert(
sykmeldingsperioder = steg1.forespoersel.sykmeldingsperioder,
aarsakInnsending = steg2.aarsakInnsending,
)
}.getOrElse {
steg0.skjema.fromJson(Innsending.serializer())
}

val orgNavn = steg2.orgnrMedNavn[steg1.forespoersel.orgnr.let(::Orgnr)] ?: "Ukjent virksomhet"
val sykmeldtNavn = steg2.personer[steg1.forespoersel.fnr.let(::Fnr)]?.navn ?: UKJENT_NAVN
val avsenderNavn = steg2.personer[steg0.avsenderFnr]?.navn ?: UKJENT_NAVN

val inntektsmelding =
mapInntektsmelding(
forespoersel = steg1.forespoersel,
skjema = skjema,
fulltnavnArbeidstaker = sykmeldtNavn,
skjema = steg0.skjema,
aarsakInnsending = steg2.aarsakInnsending,
virksomhetNavn = orgNavn,
innsenderNavn = avsenderNavn,
sykmeldtNavn = sykmeldtNavn,
avsenderNavn = avsenderNavn,
)

if (inntektsmelding.bestemmendeFraværsdag.isBefore(inntektsmelding.inntektsdato)) {
val bestemmendeFravaersdag = utledBestemmendeFravaersdag(steg1.forespoersel, inntektsmelding)

val inntektsdato = inntektsmelding.inntekt?.inntektsdato
if (inntektsdato != null && bestemmendeFravaersdag.isBefore(inntektsdato)) {
"Bestemmende fraværsdag er før inntektsdato. Dette er ikke mulig. Spleis vil trolig spør om ny inntektsmelding.".also {
logger.error(it)
sikkerLogger.error(it)
}
}

val inntektsmeldingGammeltFormat = inntektsmelding.convert().copy(bestemmendeFraværsdag = bestemmendeFravaersdag)

rapid
.publish(
Key.EVENT_NAME to eventName.toJson(),
Expand All @@ -231,7 +223,7 @@ class InnsendingService(
Key.DATA to
mapOf(
Key.FORESPOERSEL_ID to steg0.forespoerselId.toJson(),
Key.INNTEKTSMELDING to inntektsmelding.toJson(Inntektsmelding.serializer()),
Key.INNTEKTSMELDING to inntektsmeldingGammeltFormat.toJson(Inntektsmelding.serializer()),
).toJson(),
).also { loggBehovPublisert(BehovType.LAGRE_IM, it) }
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,126 +1,82 @@
package no.nav.helsearbeidsgiver.inntektsmelding.innsending

import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.FullLoennIArbeidsgiverPerioden
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Innsending
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntekt
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Refusjon
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.bestemmendeFravaersdag
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.AarsakInnsending
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Avsender
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntekt
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykmeldt
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding
import no.nav.helsearbeidsgiver.felles.domene.Forespoersel
import no.nav.helsearbeidsgiver.felles.domene.ForslagInntekt
import no.nav.helsearbeidsgiver.utils.wrapper.Fnr
import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr
import java.time.ZonedDateTime
import java.util.UUID

fun mapInntektsmelding(
forespoersel: Forespoersel,
skjema: Innsending,
fulltnavnArbeidstaker: String,
skjema: SkjemaInntektsmelding,
aarsakInnsending: AarsakInnsending,
virksomhetNavn: String,
innsenderNavn: String,
sykmeldtNavn: String,
avsenderNavn: String,
): Inntektsmelding {
val egenmeldingsperioder =
val agp =
if (forespoersel.forespurtData.arbeidsgiverperiode.paakrevd) {
skjema.egenmeldingsperioder
} else {
forespoersel.egenmeldingsperioder
}

val arbeidsgiverperioder =
if (forespoersel.forespurtData.arbeidsgiverperiode.paakrevd) {
skjema.arbeidsgiverperioder
} else {
emptyList()
}

val fullLoennIArbeidsgiverPerioden =
if (forespoersel.forespurtData.arbeidsgiverperiode.paakrevd) {
if (skjema.fullLønnIArbeidsgiverPerioden?.utbetalerFullLønn == false) {
skjema.fullLønnIArbeidsgiverPerioden
} else {
FullLoennIArbeidsgiverPerioden(
utbetalerFullLønn = true,
begrunnelse = null,
utbetalt = null,
)
}
skjema.agp
} else {
null
}

val inntektsdato =
if (forespoersel.forespurtData.arbeidsgiverperiode.paakrevd) {
// NB!: 'skjema.bestemmendeFraværsdag' inneholder egentlig inntektsdato og ikke bestemmende fraværsdag. Utbedring kommer.
skjema.bestemmendeFraværsdag
} else {
forespoersel.forslagInntektsdato()
}

val bestemmendeFravaersdag =
if (
forespoersel.forespurtData.arbeidsgiverperiode.paakrevd ||
(!forespoersel.forespurtData.inntekt.paakrevd && forespoersel.forespurtData.refusjon.paakrevd)
) {
bestemmendeFravaersdag(
arbeidsgiverperioder = arbeidsgiverperioder,
sykmeldingsperioder = forespoersel.sykmeldingsperioder,
)
} else {
forespoersel.forslagBestemmendeFravaersdag()
}

val inntekt =
if (forespoersel.forespurtData.inntekt.paakrevd) {
skjema.inntekt
if (forespoersel.forespurtData.arbeidsgiverperiode.paakrevd) {
skjema.inntekt
} else {
skjema.inntekt?.copy(
inntektsdato = forespoersel.forslagInntektsdato(),
)
}
} else {
Inntekt(
bekreftet = true,
beregnetInntekt = (forespoersel.forespurtData.inntekt.forslag as ForslagInntekt.Fastsatt).fastsattInntekt,
endringÅrsak = null,
manueltKorrigert = true,
beloep = (forespoersel.forespurtData.inntekt.forslag as ForslagInntekt.Fastsatt).fastsattInntekt,
inntektsdato = forespoersel.forslagInntektsdato(),
naturalytelser = emptyList(),
endringAarsak = null,
)
}

val refusjon =
if (forespoersel.forespurtData.refusjon.paakrevd && skjema.refusjon.utbetalerHeleEllerDeler) {
if (forespoersel.forespurtData.refusjon.paakrevd) {
skjema.refusjon
} else {
Refusjon(
utbetalerHeleEllerDeler = false,
refusjonPrMnd = null,
refusjonOpphører = null,
refusjonEndringer = null,
)
null
}

val forespurtData =
mapOf(
"arbeidsgiverperiode" to forespoersel.forespurtData.arbeidsgiverperiode.paakrevd,
"inntekt" to forespoersel.forespurtData.inntekt.paakrevd,
"refusjon" to forespoersel.forespurtData.refusjon.paakrevd,
).filterValues { it }
.keys
.toList()

return Inntektsmelding(
vedtaksperiodeId = forespoersel.vedtaksperiodeId,
orgnrUnderenhet = forespoersel.orgnr,
identitetsnummer = forespoersel.fnr,
fulltNavn = fulltnavnArbeidstaker,
virksomhetNavn = virksomhetNavn,
behandlingsdager = emptyList(),
egenmeldingsperioder = egenmeldingsperioder,
fraværsperioder = forespoersel.sykmeldingsperioder,
arbeidsgiverperioder = arbeidsgiverperioder,
beregnetInntekt = inntekt.beregnetInntekt,
inntektsdato = inntektsdato,
id = UUID.randomUUID(),
type =
Inntektsmelding.Type.Forespurt(
id = skjema.forespoerselId,
vedtaksperiodeId = forespoersel.vedtaksperiodeId,
),
sykmeldt =
Sykmeldt(
fnr = forespoersel.fnr.let(::Fnr),
navn = sykmeldtNavn,
),
avsender =
Avsender(
orgnr = forespoersel.orgnr.let(::Orgnr),
orgNavn = virksomhetNavn,
navn = avsenderNavn,
tlf = skjema.avsenderTlf,
),
sykmeldingsperioder = forespoersel.sykmeldingsperioder,
agp = agp,
inntekt = inntekt,
fullLønnIArbeidsgiverPerioden = fullLoennIArbeidsgiverPerioden,
refusjon = refusjon,
naturalytelser = skjema.naturalytelser,
tidspunkt = ZonedDateTime.now().toOffsetDateTime(),
årsakInnsending = skjema.årsakInnsending,
innsenderNavn = innsenderNavn,
telefonnummer = skjema.telefonnummer,
forespurtData = forespurtData,
bestemmendeFraværsdag = bestemmendeFravaersdag,
aarsakInnsending = aarsakInnsending,
mottatt = ZonedDateTime.now().toOffsetDateTime(),
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package no.nav.helsearbeidsgiver.inntektsmelding.innsending

import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.bestemmendeFravaersdag
import no.nav.helsearbeidsgiver.felles.domene.Forespoersel
import java.time.LocalDate

/**
* Vi bruker Spleis sitt forslag til bestemmende fraværsdag (BF), med to unntak der vi må beregne BF selv:
* - Vi ber om AGP. Da kan AGP inneholde info som Spleis ikke vet om, f. eks. egenmeldinger.
* - Vi ber kun om refusjon. Da kan Spleis sitt forslag inneholde feil`*` dersom sykmeldt har mer enn én arbeidsgiver.
*
* `*` Det er ikke feil, men forslagene fra Spleis er egentlig inntektsdatoer, ikke BF-er.
* For én arbeidsgiver så er disse datoene like, men det er de nødvendigvis ikke ved mer enn én arbeidsgiver.
*/
fun utledBestemmendeFravaersdag(
forespoersel: Forespoersel,
inntektsmelding: Inntektsmelding,
): LocalDate =
if (
forespoersel.forespurtData.arbeidsgiverperiode.paakrevd ||
(!forespoersel.forespurtData.inntekt.paakrevd && forespoersel.forespurtData.refusjon.paakrevd)
) {
bestemmendeFravaersdag(
arbeidsgiverperioder = inntektsmelding.agp?.perioder.orEmpty(),
sykmeldingsperioder = forespoersel.sykmeldingsperioder,
)
} else {
forespoersel.forslagBestemmendeFravaersdag()
}
Loading

0 comments on commit 0eba06a

Please sign in to comment.