Skip to content

Commit

Permalink
Bruke inntekt kontrakt fra https://github.com/navikt/dp-inntekt
Browse files Browse the repository at this point in the history
  • Loading branch information
geiralund committed Dec 20, 2023
1 parent ac8760c commit e6149d3
Show file tree
Hide file tree
Showing 20 changed files with 1,488 additions and 1,337 deletions.
3 changes: 2 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ dependencies {
implementation(kotlin("stdlib"))
implementation(libs.rapids.and.rivers)

implementation("com.github.navikt:dagpenger-events:20231212.b2f698")
implementation("com.github.navikt:dp-inntekt-kontrakter:1_20231220.55a8a9")
implementation("com.github.navikt:dagpenger-events:20231220.3050bf")
implementation("com.github.navikt:dp-grunnbelop:2023.05.24-15.26.f42064d9fdc8")

implementation("de.huxhorn.sulky:de.huxhorn.sulky.ulid:8.3.0")
Expand Down
46 changes: 25 additions & 21 deletions src/main/kotlin/no/nav/dagpenger/regel/grunnlag/Fakta.kt
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package no.nav.dagpenger.regel.grunnlag

import no.nav.dagpenger.events.inntekt.v1.Inntekt
import no.nav.dagpenger.events.inntekt.v1.InntektKlasse
import no.nav.dagpenger.events.inntekt.v1.InntektsPerioder
import no.nav.dagpenger.events.inntekt.v1.KlassifisertInntektMåned
import no.nav.dagpenger.events.inntekt.v1.sumInntekt
import no.nav.dagpenger.grunnbelop.Grunnbeløp
import no.nav.dagpenger.grunnbelop.Regel
import no.nav.dagpenger.grunnbelop.faktorMellom
import no.nav.dagpenger.grunnbelop.forDato
import no.nav.dagpenger.grunnbelop.forMåned
import no.nav.dagpenger.grunnbelop.getGrunnbeløpForRegel
import no.nav.dagpenger.inntekt.v1.Inntekt
import no.nav.dagpenger.inntekt.v1.InntektKlasse
import no.nav.dagpenger.inntekt.v1.InntektsPerioder
import no.nav.dagpenger.inntekt.v1.KlassifisertInntektMåned
import no.nav.dagpenger.inntekt.v1.sumInntekt
import java.math.BigDecimal
import java.time.LocalDate
import java.util.EnumSet
Expand All @@ -29,15 +29,17 @@ data class Fakta(

val inntektsPerioderOrEmpty = inntektsPerioder ?: InntektsPerioder(emptyList(), emptyList(), emptyList())

fun grunnbeløpVedBeregningsdato() = when {
isThisGjusteringTest(beregningsdato) -> Grunnbeløp.GjusteringsTest
else -> getGrunnbeløpForRegel(Regel.Grunnlag).forDato(beregningsdato)
}
fun grunnbeløpVedBeregningsdato() =
when {
isThisGjusteringTest(beregningsdato) -> Grunnbeløp.GjusteringsTest
else -> getGrunnbeløpForRegel(Regel.Grunnlag).forDato(beregningsdato)
}

fun grunnbeløpVedRegelverksdato() = when {
isThisGjusteringTest(regelverksdato) -> Grunnbeløp.GjusteringsTest
else -> getGrunnbeløpForRegel(Regel.Grunnlag).forDato(regelverksdato)
}
fun grunnbeløpVedRegelverksdato() =
when {
isThisGjusteringTest(regelverksdato) -> Grunnbeløp.GjusteringsTest
else -> getGrunnbeløpForRegel(Regel.Grunnlag).forDato(regelverksdato)
}

fun oppjusterteInntekterFørstePeriode(inntektsKlasser: EnumSet<InntektKlasse>): BigDecimal =
inntektsPerioderOrEmpty.first.map(oppjusterTilGjeldendeGrunnbeløp(grunnbeløpVedBeregningsdato())).sumInntekt(
Expand All @@ -56,14 +58,16 @@ data class Fakta(

private fun oppjusterTilGjeldendeGrunnbeløp(gjeldendeGrunnbeløp: Grunnbeløp): (KlassifisertInntektMåned) -> KlassifisertInntektMåned {
return { inntekt ->
val oppjusterteinntekter = inntekt.klassifiserteInntekter.map { klassifisertInntekt ->
val oppjustert = klassifisertInntekt.beløp.multiply(
gjeldendeGrunnbeløp.faktorMellom(
getGrunnbeløpForRegel(Regel.Grunnlag).forMåned(inntekt.årMåned),
),
)
klassifisertInntekt.copy(beløp = oppjustert)
}
val oppjusterteinntekter =
inntekt.klassifiserteInntekter.map { klassifisertInntekt ->
val oppjustert =
klassifisertInntekt.beløp.multiply(
gjeldendeGrunnbeløp.faktorMellom(
getGrunnbeløpForRegel(Regel.Grunnlag).forMåned(inntekt.årMåned),
),
)
klassifisertInntekt.copy(beløp = oppjustert)
}
inntekt.copy(klassifiserteInntekter = oppjusterteinntekter)
}
}
Expand Down
37 changes: 19 additions & 18 deletions src/main/kotlin/no/nav/dagpenger/regel/grunnlag/FaktaMapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package no.nav.dagpenger.regel.grunnlag

import com.fasterxml.jackson.databind.JsonNode
import mu.KotlinLogging
import no.nav.dagpenger.events.inntekt.v1.Inntekt
import no.nav.dagpenger.inntekt.v1.Inntekt
import no.nav.dagpenger.regel.grunnlag.GrunnlagsberegningBehovløser.Companion.AVTJENT_VERNEPLIKT
import no.nav.dagpenger.regel.grunnlag.GrunnlagsberegningBehovløser.Companion.BEREGNINGSDATO
import no.nav.dagpenger.regel.grunnlag.GrunnlagsberegningBehovløser.Companion.FANGST_OG_FISKE
Expand Down Expand Up @@ -40,8 +40,7 @@ fun mapToFaktaFrom(packet: JsonMessage): Fakta {
)
}

private fun JsonNode.asBooleanStrict(): Boolean =
asText().toBooleanStrict()
private fun JsonNode.asBooleanStrict(): Boolean = asText().toBooleanStrict()

private fun JsonMessage.avtjentVerneplikt() =
when (this.harVerdi(AVTJENT_VERNEPLIKT)) {
Expand Down Expand Up @@ -79,26 +78,28 @@ private fun JsonMessage.forrigeGrunnlag() =
false -> null
}

internal fun JsonMessage.inntekt(): Inntekt? = when {
this.harVerdi(MANUELT_GRUNNLAG) && this.harVerdi(INNTEKT) ->
throw ManueltGrunnlagOgInntektException("Har manuelt grunnlag og inntekt")
internal fun JsonMessage.inntekt(): Inntekt? =
when {
this.harVerdi(MANUELT_GRUNNLAG) && this.harVerdi(INNTEKT) ->
throw ManueltGrunnlagOgInntektException("Har manuelt grunnlag og inntekt")

this.harVerdi(FORRIGE_GRUNNLAG) && this.harVerdi(INNTEKT) ->
throw ForrigeGrunnlagOgInntektException("Har forrige grunnlag og inntekt")
this.harVerdi(FORRIGE_GRUNNLAG) && this.harVerdi(INNTEKT) ->
throw ForrigeGrunnlagOgInntektException("Har forrige grunnlag og inntekt")

this.harVerdi(INNTEKT) -> {
val inntektJson = this[INNTEKT]
runCatching {
objectMapper.convertValue(inntektJson, Inntekt::class.java)
}.onFailure {
sikkerLogg.error("Feilet å parse inntekt: $inntektJson")
}.getOrThrow()
}
this.harVerdi(INNTEKT) -> {
val inntektJson = this[INNTEKT]
runCatching {
objectMapper.convertValue(inntektJson, Inntekt::class.java)
}.onFailure {
sikkerLogg.error("Feilet å parse inntekt: $inntektJson")
}.getOrThrow()
}

else -> null
}
else -> null
}

private fun JsonMessage.harVerdi(field: String) = !this[field].isMissingOrNull()

class ManueltGrunnlagOgInntektException(message: String) : RuntimeException(message)

class ForrigeGrunnlagOgInntektException(message: String) : RuntimeException(message)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package no.nav.dagpenger.regel.grunnlag
import de.huxhorn.sulky.ulid.ULID
import mu.KotlinLogging
import mu.withLoggingContext
import no.nav.dagpenger.events.inntekt.v1.sumInntekt
import no.nav.dagpenger.inntekt.v1.sumInntekt
import no.nav.dagpenger.regel.grunnlag.beregning.HovedBeregning
import no.nav.dagpenger.regel.grunnlag.beregning.inntektsklasser
import no.nav.dagpenger.regel.grunnlag.beregning.inntektsklasserMedFangstOgFiske
Expand Down Expand Up @@ -56,7 +56,10 @@ class GrunnlagsberegningBehovløser(
River(rapidsConnection).apply(rapidFilter).register(this)
}

override fun onPacket(packet: JsonMessage, context: MessageContext) {
override fun onPacket(
packet: JsonMessage,
context: MessageContext,
) {
withLoggingContext("behovId" to packet[BEHOV_ID].asText()) {
try {
sikkerLogg.info("Mottok pakke: ${packet.toJson()}")
Expand All @@ -66,19 +69,21 @@ class GrunnlagsberegningBehovløser(
val resultat = HovedBeregning().calculate(fakta)
val ulidGenerator = ULID()

val grunnlagResultat = GrunnlagResultat(
sporingsId = ulidGenerator.nextULID(),
subsumsjonsId = ulidGenerator.nextULID(),
regelidentifikator = regelidentifikator,
avkortetGrunnlag = resultat.avkortet,
uavkortetGrunnlag = resultat.uavkortet,
beregningsregel = resultat.beregningsregel,
harAvkortet = resultat.harAvkortet,
grunnbeløpBrukt = when (fakta.verneplikt) {
true -> fakta.grunnbeløpVedRegelverksdato().verdi
false -> fakta.grunnbeløpVedBeregningsdato().verdi
},
)
val grunnlagResultat =
GrunnlagResultat(
sporingsId = ulidGenerator.nextULID(),
subsumsjonsId = ulidGenerator.nextULID(),
regelidentifikator = regelidentifikator,
avkortetGrunnlag = resultat.avkortet,
uavkortetGrunnlag = resultat.uavkortet,
beregningsregel = resultat.beregningsregel,
harAvkortet = resultat.harAvkortet,
grunnbeløpBrukt =
when (fakta.verneplikt) {
true -> fakta.grunnbeløpVedRegelverksdato().verdi
false -> fakta.grunnbeløpVedBeregningsdato().verdi
},
)
createInntektPerioder(fakta)?.let { inntektPerioder ->
packet[GRUNNLAG_INNTEKTSPERIODER] = inntektPerioder.toMaps()
}
Expand All @@ -94,11 +99,12 @@ class GrunnlagsberegningBehovløser(
context.publish(packet.toJson())
sikkerLogg.info { "Løste behov for grunnlag $grunnlagResultat med fakta $fakta" }
} catch (e: Exception) {
val problem = Problem(
type = URI("urn:dp:error:regel"),
title = "Ukjent feil ved bruk av grunnlagregel",
instance = URI("urn:dp:regel:grunnlag"),
)
val problem =
Problem(
type = URI("urn:dp:error:regel"),
title = "Ukjent feil ved bruk av grunnlagregel",
instance = URI("urn:dp:regel:grunnlag"),
)
packet[PROBLEM] = problem.toMap
context.publish(packet.toJson())
throw e
Expand All @@ -114,25 +120,29 @@ class GrunnlagsberegningBehovløser(

fun createInntektPerioder(fakta: Fakta): List<InntektPeriodeInfo>? {
val arbeidsinntektKlasser = inntektsklasser.toList()
val fangstOgFiskeKlasser = inntektsklasserMedFangstOgFiske.toList().filterNot {
inntektsklasser.toList().contains(it)
}
val fangstOgFiskeKlasser =
inntektsklasserMedFangstOgFiske.toList().filterNot {
inntektsklasser.toList().contains(it)
}

return fakta.inntektsPerioder?.toList()?.mapIndexed { index, list ->
InntektPeriodeInfo(
inntektsPeriode = InntektsPeriode(
inntektsPeriode =
InntektsPeriode(
list.first().årMåned,
list.last().årMåned,
),
inntekt = list.sumInntekt(
inntekt =
list.sumInntekt(
if (fakta.fangstOgFiske) {
arbeidsinntektKlasser + fangstOgFiskeKlasser
} else {
arbeidsinntektKlasser
},
),
periode = index + 1,
inneholderFangstOgFisk = fakta.inntektsPerioder.toList()[index].any { klassifisertInntektMåned ->
inneholderFangstOgFisk =
fakta.inntektsPerioder.toList()[index].any { klassifisertInntektMåned ->
klassifisertInntektMåned.klassifiserteInntekter.any {
fangstOgFiskeKlasser.contains(it.inntektKlasse)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package no.nav.dagpenger.regel.grunnlag.beregning

import no.nav.dagpenger.events.inntekt.v1.InntektKlasse
import no.nav.dagpenger.events.inntekt.v1.sumInntekt
import no.nav.dagpenger.inntekt.v1.InntektKlasse
import no.nav.dagpenger.inntekt.v1.sumInntekt
import no.nav.dagpenger.regel.grunnlag.Fakta
import java.math.BigDecimal
import java.util.EnumSet
Expand All @@ -11,7 +11,6 @@ abstract class GrunnlagEtterLærlingForskrift(
private val grunnlagUtvelgelse: GrunnlagUtvelgelse,
private val inntektKlasser: EnumSet<InntektKlasse>,
) : GrunnlagBeregning(regelIdentifikator) {

override fun isActive(fakta: Fakta): Boolean {
val erInnenforRegelverksperiode = fakta.regelverksdato.erKoronaPeriode()
return fakta.lærling && erInnenforRegelverksperiode && fakta.manueltGrunnlag == null && fakta.forrigeGrunnlag == null
Expand Down Expand Up @@ -49,14 +48,14 @@ sealed class GrunnlagUtvelgelse(
)

class SisteAvsluttendeMånedUtvelgelse : GrunnlagUtvelgelse(antallMåneder = 1, månedFaktor = 12)

class Siste3AvsluttendeMånederUtvelgelse : GrunnlagUtvelgelse(antallMåneder = 3, månedFaktor = 4)

class LærlingForskriftSisteAvsluttendeKalenderMånedFangstOgFisk : GrunnlagEtterLærlingForskrift(
regelIdentifikator = "LærlingFangstOgFisk1x12",
grunnlagUtvelgelse = SisteAvsluttendeMånedUtvelgelse(),
inntektKlasser = inntektsklasserMedFangstOgFiske,
) {

override fun calculate(fakta: Fakta): Resultat {
return if (fakta.fangstOgFiske) super.calculate(fakta) else IngenBeregningsResultat(this.beregningsregel)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,29 @@
package no.nav.dagpenger.regel.grunnlag.beregning

import no.nav.dagpenger.events.inntekt.v1.InntektKlasse
import no.nav.dagpenger.inntekt.v1.InntektKlasse
import java.util.EnumSet

val inntektsklasser = EnumSet.of(
InntektKlasse.ARBEIDSINNTEKT,
InntektKlasse.DAGPENGER,
InntektKlasse.SYKEPENGER,
InntektKlasse.TILTAKSLØNN,
InntektKlasse.PLEIEPENGER,
InntektKlasse.OPPLÆRINGSPENGER,
InntektKlasse.OMSORGSPENGER,
)
val inntektsklasser =
EnumSet.of(
InntektKlasse.ARBEIDSINNTEKT,
InntektKlasse.DAGPENGER,
InntektKlasse.SYKEPENGER,
InntektKlasse.TILTAKSLØNN,
InntektKlasse.PLEIEPENGER,
InntektKlasse.OPPLÆRINGSPENGER,
InntektKlasse.OMSORGSPENGER,
)

val inntektsklasserMedFangstOgFiske = EnumSet.of(
InntektKlasse.FANGST_FISKE,
InntektKlasse.DAGPENGER_FANGST_FISKE,
InntektKlasse.SYKEPENGER_FANGST_FISKE,
InntektKlasse.ARBEIDSINNTEKT,
InntektKlasse.DAGPENGER,
InntektKlasse.SYKEPENGER,
InntektKlasse.TILTAKSLØNN,
InntektKlasse.PLEIEPENGER,
InntektKlasse.OPPLÆRINGSPENGER,
InntektKlasse.OMSORGSPENGER,
)
val inntektsklasserMedFangstOgFiske =
EnumSet.of(
InntektKlasse.FANGST_FISKE,
InntektKlasse.DAGPENGER_FANGST_FISKE,
InntektKlasse.SYKEPENGER_FANGST_FISKE,
InntektKlasse.ARBEIDSINNTEKT,
InntektKlasse.DAGPENGER,
InntektKlasse.SYKEPENGER,
InntektKlasse.TILTAKSLØNN,
InntektKlasse.PLEIEPENGER,
InntektKlasse.OPPLÆRINGSPENGER,
InntektKlasse.OMSORGSPENGER,
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package no.nav.dagpenger.regel.grunnlag.beregning

import no.nav.dagpenger.events.inntekt.v1.InntektKlasse
import no.nav.dagpenger.inntekt.v1.InntektKlasse
import no.nav.dagpenger.regel.grunnlag.Fakta
import java.math.BigDecimal
import java.util.EnumSet
Expand Down
Loading

0 comments on commit e6149d3

Please sign in to comment.