Skip to content

Commit

Permalink
Merge pull request #163 from navikt/feature/verneplikt-og-hvis
Browse files Browse the repository at this point in the history
Feature/verneplikt og hvis
  • Loading branch information
geiralund authored Jan 3, 2025
2 parents 81fe65d + ca3cdce commit f54332f
Show file tree
Hide file tree
Showing 47 changed files with 865 additions and 565 deletions.
6 changes: 3 additions & 3 deletions .nais/nais.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ spec:
max: 2
resources:
limits:
memory: 512Mi
memory: 2048Mi
requests:
cpu: 50m
memory: 384Mi
memory: 512Mi
env:
- name: JDK_JAVA_OPTIONS
value: -XX:+UseParallelGC -XX:MaxRAMPercentage=35.0 -XX:ActiveProcessorCount=4 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp
value: -XX:+UseParallelGC -XX:MaxRAMPercentage=25.0 -XX:ActiveProcessorCount=4
- name: GRUPPER_SAKSBEHANDLER
value: {{azure.grupper.saksbehandler}}
- name: KAFKA_EXTRA_TOPIC
Expand Down
3 changes: 1 addition & 2 deletions buildSrc/src/main/kotlin/common.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
Expand Down Expand Up @@ -29,7 +28,7 @@ tasks.test {
showExceptions = true
showStackTraces = true
exceptionFormat = TestExceptionFormat.FULL
events = setOf(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
// events = setOf(TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,27 @@ package no.nav.dagpenger.regel
import no.nav.dagpenger.opplysning.Opplysningstype
import no.nav.dagpenger.opplysning.Regelsett
import no.nav.dagpenger.opplysning.regel.alle
import no.nav.dagpenger.opplysning.regel.enAv
import no.nav.dagpenger.opplysning.tekstId
import no.nav.dagpenger.regel.Minsteinntekt.minsteinntekt
import no.nav.dagpenger.regel.Verneplikt.oppfyllerKravetTilVerneplikt

object KravPåDagpenger {
val kravPåDagpenger = Opplysningstype.somBoolsk("Krav på dagpenger".tekstId("opplysning.krav-paa-dagpenger"))
val minsteinntektEllerVerneplikt = Opplysningstype.somBoolsk("Oppfyller kravet til minsteinntekt eller verneplikt")

val regelsett =
Regelsett("Krav på dagpenger") {

regel(minsteinntektEllerVerneplikt) { enAv(minsteinntekt, oppfyllerKravetTilVerneplikt) }

regel(kravPåDagpenger) {
alle(
Alderskrav.kravTilAlder,
FulleYtelser.ikkeFulleYtelser,
Medlemskap.oppfyllerMedlemskap,
Meldeplikt.registrertPåSøknadstidspunktet,
Minsteinntekt.minsteinntekt,
minsteinntektEllerVerneplikt,
Opphold.oppfyllerKravet,
ReellArbeidssøker.kravTilArbeidssøker,
Rettighetstype.rettighetstype,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,10 @@ object Minsteinntekt {
private val over12mndTerskel = Opplysningstype.somBoolsk("Arbeidsinntekt er over kravet for siste 12 mnd")
private val over36mndTerskel = Opplysningstype.somBoolsk("Arbeidsinntekt er over kravet for siste 36 mnd")

private val verneplikt = Verneplikt.vurderingAvVerneplikt
val minsteinntekt = Opplysningstype.somBoolsk("Krav til minsteinntekt".tekstId("opplysning.krav-til-minsteinntekt"))

val regelsett =
Regelsett("Minsteinntekt") {
Regelsett("§ 4-4 Minsteinntekt") {
regel(maksPeriodeLengde) { oppslag(prøvingsdato) { 36 } }
regel(førsteMånedAvOpptjeningsperiode) { trekkFraMånedTilFørste(sisteAvsluttendendeKalenderMåned, maksPeriodeLengde) }

Expand Down Expand Up @@ -102,7 +101,7 @@ object Minsteinntekt {
regel(`36mndTerskel`) { multiplikasjon(grunnbeløp, `36mndTerskelFaktor`) }
regel(over36mndTerskel) { størreEnnEllerLik(inntekt36, `36mndTerskel`) }

regel(minsteinntekt) { enAv(over12mndTerskel, over36mndTerskel, verneplikt) }
regel(minsteinntekt) { enAv(over12mndTerskel, over36mndTerskel) }
}

private fun grunnbeløpFor(it: LocalDate) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import no.nav.dagpenger.regel.Alderskrav.HattLukkedeSakerSiste8UkerKontroll
import no.nav.dagpenger.regel.Alderskrav.MuligGjenopptakKontroll
import no.nav.dagpenger.regel.Alderskrav.Under18Kontroll
import no.nav.dagpenger.regel.FulleYtelser.FulleYtelserKontrollpunkt
import no.nav.dagpenger.regel.KravPåDagpenger.minsteinntektEllerVerneplikt
import no.nav.dagpenger.regel.Meldeplikt.IkkeRegistrertSomArbeidsøkerKontroll
import no.nav.dagpenger.regel.Minsteinntekt.EØSArbeidKontroll
import no.nav.dagpenger.regel.Minsteinntekt.InntektNesteKalendermånedKontroll
Expand Down Expand Up @@ -55,16 +56,16 @@ class SøknadInnsendtHendelse(
}

// Sjekk krav til minste arbeidsinntekt
if (!opplysninger.har(Minsteinntekt.minsteinntekt)) return Minsteinntekt.minsteinntekt
val minsteinntektOppfylt = opplysninger.finnOpplysning(Minsteinntekt.minsteinntekt).verdi
if (!opplysninger.har(minsteinntektEllerVerneplikt)) return minsteinntektEllerVerneplikt
val minsteinntektOppfylt = opplysninger.finnOpplysning(minsteinntektEllerVerneplikt).verdi

// Om krav til alder eller arbeidsinntekt ikke er oppfylt er det ingen grunn til å fortsette, men vi må fastsette hvilke tillegskrav Arena trenger.
if (!minsteinntektOppfylt) {
return when {
opplysninger.mangler(ReellArbeidssøker.kravTilArbeidssøker) -> ReellArbeidssøker.kravTilArbeidssøker
opplysninger.mangler(Meldeplikt.registrertPåSøknadstidspunktet) -> Meldeplikt.registrertPåSøknadstidspunktet
opplysninger.mangler(Rettighetstype.rettighetstype) -> Rettighetstype.rettighetstype
else -> Minsteinntekt.minsteinntekt
else -> minsteinntektEllerVerneplikt
}
}

Expand All @@ -83,8 +84,8 @@ class SøknadInnsendtHendelse(
opplysninger.finnOpplysning(KravPåDagpenger.kravPåDagpenger).verdi

override fun minsteinntekt(opplysninger: LesbarOpplysninger): Boolean =
opplysninger.har(Minsteinntekt.minsteinntekt) &&
opplysninger.finnOpplysning(Minsteinntekt.minsteinntekt).verdi
opplysninger.har(minsteinntektEllerVerneplikt) &&
opplysninger.finnOpplysning(minsteinntektEllerVerneplikt).verdi

fun alder(opplysninger: LesbarOpplysninger): Boolean =
opplysninger.har(Alderskrav.kravTilAlder) &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.dagpenger.regel
import no.nav.dagpenger.opplysning.Forretningsprosess
import no.nav.dagpenger.opplysning.LesbarOpplysninger
import no.nav.dagpenger.opplysning.Opplysningstype
import no.nav.dagpenger.regel.KravPåDagpenger.minsteinntektEllerVerneplikt
import no.nav.dagpenger.regel.fastsetting.Dagpengegrunnlag
import no.nav.dagpenger.regel.fastsetting.DagpengenesStørrelse
import no.nav.dagpenger.regel.fastsetting.Dagpengeperiode
Expand Down Expand Up @@ -31,15 +32,15 @@ class Søknadsprosess : Forretningsprosess {
return ønsketResultat
}

// Sjekk krav til minste arbeidsinntekt
ønsketResultat.add(Minsteinntekt.minsteinntekt)
// Sjekk krav til minste arbeidsinntekt eller verneplikt
ønsketResultat.add(minsteinntektEllerVerneplikt)

if (opplysninger.mangler(Minsteinntekt.minsteinntekt)) {
if (opplysninger.mangler(minsteinntektEllerVerneplikt)) {
return ønsketResultat
}

val alderskravOppfylt = opplysninger.oppfyller(Alderskrav.kravTilAlder)
val minsteinntektOppfylt = opplysninger.oppfyller(Minsteinntekt.minsteinntekt)
val minsteinntektOppfylt = opplysninger.oppfyller(minsteinntektEllerVerneplikt)

val støtterInnvilgelse = opplysninger.oppfyller(støtterInnvilgelseOpplysningstype)

Expand All @@ -61,7 +62,8 @@ class Søknadsprosess : Forretningsprosess {
Alderskrav.kravTilAlder,
FulleYtelser.ikkeFulleYtelser,
Medlemskap.oppfyllerMedlemskap,
Minsteinntekt.minsteinntekt,
Meldeplikt.registrertPåSøknadstidspunktet,
minsteinntektEllerVerneplikt,
Opphold.oppfyllerKravet,
ReellArbeidssøker.kravTilArbeidssøker,
StreikOgLockout.ikkeStreikEllerLockout,
Expand All @@ -84,7 +86,7 @@ class Søknadsprosess : Forretningsprosess {
ønsketResultat.addAll(Samordning.ønsketResultat)
ønsketResultat.addAll(SamordingUtenforFolketrygden.ønsketResultat)

if (opplysninger.oppfyller(Verneplikt.avtjentVerneplikt)) {
if (opplysninger.oppfyller(Verneplikt.oppfyllerKravetTilVerneplikt)) {
ønsketResultat.addAll(VernepliktFastsetting.ønsketResultat)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@ import no.nav.dagpenger.opplysning.Regelsett
import no.nav.dagpenger.opplysning.id
import no.nav.dagpenger.opplysning.regel.alle
import no.nav.dagpenger.opplysning.regel.enAv
import no.nav.dagpenger.opplysning.regel.hvisSannMedResultat
import no.nav.dagpenger.opplysning.regel.ikke
import no.nav.dagpenger.opplysning.regel.minstAv
import no.nav.dagpenger.opplysning.regel.oppslag
import no.nav.dagpenger.opplysning.regel.prosentTerskel
import no.nav.dagpenger.regel.Behov.HarTaptArbeid
import no.nav.dagpenger.regel.Behov.KravPåLønn
import no.nav.dagpenger.regel.Søknadstidspunkt.prøvingsdato
import no.nav.dagpenger.regel.fastsetting.VernepliktFastsetting.grunnlagForVernepliktErGunstigst
import no.nav.dagpenger.regel.fastsetting.VernepliktFastsetting.vernepliktFastsattVanligArbeidstid

object TapAvArbeidsinntektOgArbeidstid {
internal val tapAvArbeid = Opplysningstype.somBoolsk("Har tapt arbeid".id(HarTaptArbeid))
Expand All @@ -30,11 +33,15 @@ object TapAvArbeidsinntektOgArbeidstid {
val fastsattVanligArbeidstid = Opplysningstype.somDesimaltall("Fastsatt arbeidstid per uke før tap")
val nyArbeidstid = Opplysningstype.somDesimaltall("Ny arbeidstid per uke")
val kravTilTaptArbeidstid: Opplysningstype<Boolean> = Opplysningstype.somBoolsk("Tap av arbeidstid er minst terskel")
internal val ordinærEllerVernepliktArbeidstid =
Opplysningstype.somDesimaltall(
"Fastsatt vanlig arbeidstid etter ordinær eller verneplikt",
)

val kravTilTapAvArbeidsinntektOgArbeidstid = Opplysningstype.somBoolsk("Krav til tap av arbeidsinntekt og arbeidstid")

val regelsett =
Regelsett("§ 4-3. Krav til tap av arbeidsinntekt og arbeidstid") {
Regelsett("§ 4-3 Krav til tap av arbeidsinntekt og arbeidstid") {
regel(tapAvArbeid) { oppslag(prøvingsdato) { true } } // TODO: Satt til true for testing av innvilgelse
regel(kravPåLønn) { oppslag(prøvingsdato) { false } }
regel(ikkeKravPåLønn) { ikke(kravPåLønn) }
Expand All @@ -49,11 +56,17 @@ object TapAvArbeidsinntektOgArbeidstid {

// TODO: Bør hentes fra noe
regel(beregnetArbeidstid) { oppslag(prøvingsdato) { 37.5 } } // TODO: Satt til 37.5 for testing av innvilgelse

// FVA fra verneplikt overstyrer ordinær FVA om verneplikt er gunstigst
regel(ordinærEllerVernepliktArbeidstid) {
hvisSannMedResultat(grunnlagForVernepliktErGunstigst, vernepliktFastsattVanligArbeidstid, beregnetArbeidstid)
}

regel(nyArbeidstid) { oppslag(prøvingsdato) { 0.0 } }
regel(maksimalVanligArbeidstid) { oppslag(prøvingsdato) { 40.0 } }

// TODO: Legg til maks ønsket arbeidstid
regel(fastsattVanligArbeidstid) { minstAv(beregnetArbeidstid, maksimalVanligArbeidstid) }
regel(fastsattVanligArbeidstid) { minstAv(ordinærEllerVernepliktArbeidstid, maksimalVanligArbeidstid) }

regel(kravTilTaptArbeidstid) { prosentTerskel(nyArbeidstid, fastsattVanligArbeidstid, kravTilArbeidstidsreduksjon) }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ import no.nav.dagpenger.regel.Søknadstidspunkt.søknadIdOpplysningstype

object Verneplikt {
val avtjentVerneplikt = Opplysningstype.somBoolsk("Avtjent verneplikt".id("Verneplikt"))
val vurderingAvVerneplikt =
val oppfyllerKravetTilVerneplikt =
Opplysningstype.somBoolsk("Har utført minst tre måneders militærtjeneste eller obligatorisk sivilforsvarstjeneste")

val regelsett =
Regelsett("§ 4-19. Dagpenger etter avtjent verneplikt") {
regel(avtjentVerneplikt) { innhentMed(søknadIdOpplysningstype) }
regel(vurderingAvVerneplikt) { erSann(avtjentVerneplikt) }
regel(oppfyllerKravetTilVerneplikt) { erSann(avtjentVerneplikt) }
}

val VernepliktKontroll =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ internal class BeregningsperiodeFabrikk(
.toDouble()

// TODO: Finn en ekte virkningsdato
private fun hentVedtaksperiode() = opplysninger.finnOpplysning(Dagpengeperiode.antallStønadsuker).gyldighetsperiode
private fun hentVedtaksperiode() = opplysninger.finnOpplysning(Dagpengeperiode.ordinærPeriode).gyldighetsperiode

private fun beregnDager(
meldeperiodeFraOgMed: LocalDate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,12 @@ import no.nav.dagpenger.opplysning.regel.størreEnn
import no.nav.dagpenger.opplysning.verdier.Beløp
import no.nav.dagpenger.regel.Minsteinntekt.inntektFraSkatt
import no.nav.dagpenger.regel.Søknadstidspunkt.prøvingsdato
import no.nav.dagpenger.regel.fastsetting.VernepliktFastsetting.grunnlagHvisVerneplikt
import java.time.LocalDate

object Dagpengegrunnlag {
val uavrundetGrunnlag = Opplysningstype.somBeløp("Uavrundet grunnlag")
val dagpengegrunnlag = Opplysningstype.somBeløp("Grunnlag ved ordinære dagpenger")
val grunnlag = Opplysningstype.somBeløp("Grunnlag")
val harAvkortet = Opplysningstype.somBoolsk("Har avkortet grunnlag")
val uavkortet12mnd = Opplysningstype.somBeløp("Uavkortet grunnlag siste 12 mnd")
Expand All @@ -39,10 +41,10 @@ object Dagpengegrunnlag {
private val maksgrenseForGrunnlag = Opplysningstype.somBeløp("6 ganger grunnbeløp")
private val antallÅrI36Måneder = Opplysningstype.somDesimaltall("Antall år i 36 måneder")

private val grunnlag12mnd = Opplysningstype.somBeløp("Grunnlag siste 12 mnd.")
internal val grunnlag12mnd = Opplysningstype.somBeløp("Grunnlag siste 12 mnd.")

private val beløpSiste36 = Opplysningstype.somBeløp("Inntekt siste 36 måneder")
private val grunnlag36mnd = Opplysningstype.somBeløp("Gjennomsnittlig arbeidsinntekt siste 36 måneder")
internal val grunnlag36mnd = Opplysningstype.somBeløp("Gjennomsnittlig arbeidsinntekt siste 36 måneder")

private val utbetaltArbeidsinntektPeriode1 = Opplysningstype.somBeløp("Utbetalt arbeidsinntekt periode 1")
private val utbetaltArbeidsinntektPeriode2 = Opplysningstype.somBeløp("Utbetalt arbeidsinntekt periode 2")
Expand Down Expand Up @@ -115,11 +117,15 @@ object Dagpengegrunnlag {
regel(bruktBeregningsregel) { brukt(uavrundetGrunnlag) }

// Fastsett avrundet grunnlag
regel(grunnlag) { avrund(uavrundetGrunnlag) }
regel(dagpengegrunnlag) { avrund(uavrundetGrunnlag) }

// Velg høyeste grunnlag av ordinært grunnlag og verneplikt
regel(grunnlag) { høyesteAv(dagpengegrunnlag, grunnlagHvisVerneplikt) }

val harAvkortetPeriode1 = Opplysningstype.somBoolsk("Har avkortet grunnlaget i periode 1")
val harAvkortetPeriode2 = Opplysningstype.somBoolsk("Har avkortet grunnlaget i periode 2")
val harAvkortetPeriode3 = Opplysningstype.somBoolsk("Har avkortet grunnlaget i periode 3")

// Fastsett om grunnlaget er avkortet
regel(harAvkortetPeriode1) { størreEnn(inntektperiode1, maksgrenseForGrunnlag) }
regel(harAvkortetPeriode2) { størreEnn(inntektperiode2, maksgrenseForGrunnlag) }
Expand All @@ -128,6 +134,7 @@ object Dagpengegrunnlag {
}
val ønsketResultat =
listOf(
grunnlag,
grunnbeløpForDagpengeGrunnlag,
harAvkortet,
bruktBeregningsregel,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,11 @@ import no.nav.dagpenger.regel.Behov.Barnetillegg
import no.nav.dagpenger.regel.SamordingUtenforFolketrygden.dagsatsSamordnetUtenforFolketrygden
import no.nav.dagpenger.regel.Søknadstidspunkt.prøvingsdato
import no.nav.dagpenger.regel.Søknadstidspunkt.søknadIdOpplysningstype
import no.nav.dagpenger.regel.fastsetting.Dagpengegrunnlag.grunnlag
import java.math.BigDecimal
import java.time.LocalDate

object DagpengenesStørrelse {
private val grunnlag = Dagpengegrunnlag.grunnlag

val barn = Opplysningstype.somBarn("Barn".id(Barnetillegg))
internal val antallBarn = Opplysningstype.somHeltall("Antall barn som gir rett til barnetillegg")
internal val barnetilleggetsStørrelse = Opplysningstype.somBeløp("Barnetilleggets størrelse i kroner per dag for hvert barn")
Expand Down Expand Up @@ -64,7 +63,7 @@ object DagpengenesStørrelse {
val harSamordnet = Opplysningstype.somBoolsk("Har samordnet")

val regelsett =
Regelsett("§ 4-12. Dagpengenes størrelse\n (Sats)") {
Regelsett("§ 4-12. Dagpengenes størrelse (Sats)") {
regel(barn) { innhentMed(søknadIdOpplysningstype) }
regel(antallBarn) { antallAv(barn) { kvalifiserer } }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ import no.nav.dagpenger.regel.Minsteinntekt
import no.nav.dagpenger.regel.Søknadstidspunkt.prøvingsdato

object Dagpengeperiode {
val antallStønadsuker = Opplysningstype.somHeltall("Antall stønadsuker")
val gjenståendeStønadsdager = Opplysningstype.somHeltall("Antall gjenstående stønadsdager")
private val antallStønadsuker = Opplysningstype.somHeltall("Antall stønadsuker")
private val gjenståendeStønadsdager = Opplysningstype.somHeltall("Antall gjenstående stønadsdager")
val ordinærPeriode = Opplysningstype.somHeltall("Antall stønadsuker som gis ved ordinære dagpenger")
private val dagerIUka = Opplysningstype.somHeltall("Antall dager som skal regnes med i hver uke")
private val terskelFaktor12 = Opplysningstype.somDesimaltall("Terskelfaktor for 12 måneder")
private val terskelFaktor36 = Opplysningstype.somDesimaltall("Terskelfaktor for 36 måneder")
Expand All @@ -33,6 +34,8 @@ object Dagpengeperiode {
private val stønadsuker12 = Opplysningstype.somHeltall("Stønadsuker ved siste 12 måneder")
private val stønadsuker36 = Opplysningstype.somHeltall("Stønadsuker ved siste 36 måneder")

private val ingenOrdinærPeriode = Opplysningstype.somHeltall("Stønadsuker når kravet til minste arbeidsinntekt ikke er oppfylt")

val regelsett =
Regelsett("Dagpengeperiode") {
regel(kortPeriode) { oppslag(prøvingsdato) { 52 } }
Expand All @@ -50,13 +53,15 @@ object Dagpengeperiode {
regel(stønadsuker12) { hvisSannMedResultat(overterskel12, langPeriode, kortPeriode) }
regel(stønadsuker36) { hvisSannMedResultat(overterskel36, langPeriode, kortPeriode) }

regel(antallStønadsuker) {
høyesteAv(stønadsuker12, stønadsuker36)
}
regel(antallStønadsuker) { høyesteAv(stønadsuker12, stønadsuker36) }

regel(ingenOrdinærPeriode) { oppslag(prøvingsdato) { 0 } }

regel(ordinærPeriode) { hvisSannMedResultat(Minsteinntekt.minsteinntekt, antallStønadsuker, ingenOrdinærPeriode) }

regel(dagerIUka) { oppslag(prøvingsdato) { 5 } }
regel(gjenståendeStønadsdager) { multiplikasjon(antallStønadsuker, dagerIUka) }
}

val ønsketResultat = listOf(gjenståendeStønadsdager)
val ønsketResultat = listOf(ordinærPeriode, gjenståendeStønadsdager)
}
Loading

0 comments on commit f54332f

Please sign in to comment.