diff --git a/src/main/kotlin/no/nav/medlemskap/domene/Periode.kt b/src/main/kotlin/no/nav/medlemskap/domene/Periode.kt index ac52b28a9..76a51cd6e 100644 --- a/src/main/kotlin/no/nav/medlemskap/domene/Periode.kt +++ b/src/main/kotlin/no/nav/medlemskap/domene/Periode.kt @@ -13,6 +13,16 @@ data class Periode( return (fomNotNull().isBefore(tomNotNull()) || fomNotNull().isEqual(tomNotNull())) } + fun overlapper(annenPeriode: Kontrollperiode): Boolean { + val periode = Periode(annenPeriode.fom, annenPeriode.tom) + if (!erGyldigPeriode()) { + return false + } + + return interval().overlaps(periode.interval()) + } + + fun overlapper(annenPeriode: Periode): Boolean { if (!erGyldigPeriode()) { return false diff --git a/src/main/kotlin/no/nav/medlemskap/domene/arbeidsforhold/Arbeidsforhold.kt b/src/main/kotlin/no/nav/medlemskap/domene/arbeidsforhold/Arbeidsforhold.kt index 0f11c6827..175327599 100644 --- a/src/main/kotlin/no/nav/medlemskap/domene/arbeidsforhold/Arbeidsforhold.kt +++ b/src/main/kotlin/no/nav/medlemskap/domene/arbeidsforhold/Arbeidsforhold.kt @@ -1,17 +1,23 @@ package no.nav.medlemskap.domene.arbeidsforhold +import mu.KotlinLogging +import net.logstash.logback.argument.StructuredArguments.kv import no.nav.medlemskap.clients.ereg.Ansatte.Companion.finnesMindreEnn import no.nav.medlemskap.common.* import no.nav.medlemskap.domene.Kontrollperiode import no.nav.medlemskap.domene.Periode import no.nav.medlemskap.domene.Ytelse import no.nav.medlemskap.domene.Ytelse.Companion.name +import no.nav.medlemskap.domene.arbeidsforhold.Arbeidsforhold.Companion.harFlereArbeidsforholdIKontrollperiode +import no.nav.medlemskap.domene.arbeidsforhold.Arbeidsforhold.Companion.harPermisjonerIKontrollPerioden import no.nav.medlemskap.regler.common.Funksjoner.isNotNullOrEmpty import no.nav.medlemskap.regler.common.erDatoerSammenhengende import java.time.LocalDate import java.time.temporal.ChronoUnit import kotlin.math.abs +private val secureLogger = KotlinLogging.logger("tjenestekall") + data class Arbeidsforhold( val periode: Periode, val utenlandsopphold: List?, @@ -45,6 +51,33 @@ data class Arbeidsforhold( companion object { private val offentligSektorJuridiskeEnhetstyper = listOf("STAT", "FKF", "FYLK", "KF", "KOMM", "SF", "SÆR") + private fun loggTilInfoSecurelogs(melding: String, fnr: String) { + secureLogger.info( + melding, + kv("fnr", fnr) + ) + } + + fun harPermisjonerSiste12Måneder( + arbeidsforhold: List, + kontrollPeriode: Kontrollperiode + ): Boolean { + return if (arbeidsforhold.harKunEttArbeidsforholdMedPermisjoner(kontrollPeriode)) { + true + } else if (!arbeidsforhold.harNoenArbeidsforhold100ProsentPermisjonIKontrollPerioden(kontrollPeriode)) { + false + } else if (arbeidsforhold.finnOverlappendePermisjoner(kontrollPeriode).isEmpty()) { + false + } else { + true + } + } + + fun List.harKunEttArbeidsforholdMedPermisjoner(kontrollPeriode: Kontrollperiode): Boolean { + return this.harFlereArbeidsforholdIKontrollperiode(kontrollPeriode) + && this.harPermisjonerIKontrollPerioden(kontrollPeriode) + } + fun harPermitteringerSiste12Måneder( arbeidsforhold: List, kontrollPeriode: Kontrollperiode @@ -65,29 +98,33 @@ data class Arbeidsforhold( } } - fun List.totaltantallDager(): Int { + fun List.totaltantallDager(): Int { val antallDagerIHverPermisjon = this.map { val fom = it.periode.fom ?: LocalDate.now().minusYears(1) val tom = it.periode.tom ?: LocalDate.now() - ChronoUnit.DAYS.between(fom,tom) + ChronoUnit.DAYS.between(fom, tom) } return antallDagerIHverPermisjon.sum().toInt() } + fun List.totaltantallDagerIKontrollPeriode(kontrollPeriode: Kontrollperiode): Int { val antallDagerIHverPermisjon = this.map { var fom = kontrollPeriode.fom - if (it.periode.fom != null && it.periode.fom.isAfter(kontrollPeriode.periode.fom)){ + if (it.periode.fom != null && it.periode.fom.isAfter(kontrollPeriode.periode.fom)) { fom = it.periode.fom } val tom = it.periode.tom ?: LocalDate.now() - ChronoUnit.DAYS.between(fom,tom) + ChronoUnit.DAYS.between(fom, tom) } return antallDagerIHverPermisjon.sum().toInt() } + fun List.harFlereArbeidsforholdIKontrollperiode(kontrollPeriode: Kontrollperiode): Boolean { + return this.arbeidsforholdForKontrollPeriode(kontrollPeriode).size > 1 + } fun List.alleAktiveYrkeskoderDerTomErNull(): List { return this.flatMap { arbeidsforhold -> @@ -99,28 +136,30 @@ data class Arbeidsforhold( fun List.harPermisjonerIKontrollPerioden(kontrollPeriode: Kontrollperiode): Boolean { return this.filter { it.harPermisjonerIKontrollPerioden(kontrollPeriode) }.isNotEmpty() } - fun Arbeidsforhold.harPermisjonerIKontrollPerioden(kontrollPeriode: Kontrollperiode): Boolean { + fun Arbeidsforhold.harPermisjonerIKontrollPerioden(kontrollPeriode: Kontrollperiode): Boolean { if (permisjonPermittering == null) { return false } - return permisjonPermittering.permisjonPermitteringerForKontrollPeriode(kontrollPeriode).filter { it.type != PermisjonPermitteringType.PERMITTERING }.isNotEmpty() + return permisjonPermittering.permisjonPermitteringerForKontrollPeriode(kontrollPeriode) + .filter { it.type != PermisjonPermitteringType.PERMITTERING }.isNotEmpty() } fun List.harNoenArbeidsforhold100ProsentPermisjon(): Boolean { return this.hentAllePermisjoner().any { it.prosent == 100.0 } } + fun List.harNoenArbeidsforhold100ProsentPermisjonIKontrollPerioden(kontrollPeriode: Kontrollperiode): Boolean { - return this.hentAllePermisjoner().permisjonPermitteringerForKontrollPeriode(kontrollPeriode).any { it.prosent == 100.0 } + return this.hentAllePermisjoner().permisjonPermitteringerForKontrollPeriode(kontrollPeriode) + .any { it.prosent == 100.0 } } - fun List.finnOverlappendePermisjoner(kontrollPeriode: Periode): List { + fun List.finnOverlappendePermisjoner(kontrollPeriode: Kontrollperiode): List { return this.hentAllePermisjoner().filter { it.periode.overlapper(kontrollPeriode) } } - fun List.hentAllePermisjoner(): List { val permisjoner: MutableList = mutableListOf() this.forEach { @@ -128,9 +167,10 @@ data class Arbeidsforhold( permisjoner.addAll(it.permisjonPermittering) } } - return permisjoner.filter { it.type!= PermisjonPermitteringType.PERMITTERING } + return permisjoner.filter { it.type != PermisjonPermitteringType.PERMITTERING } } - fun List.hentAllePermisjonerSiden(dato:LocalDate): List { + + fun List.hentAllePermisjonerSiden(dato: LocalDate): List { val permisjoner: MutableList = mutableListOf() this.forEach { if (it.permisjonPermittering != null) { diff --git a/src/main/kotlin/no/nav/medlemskap/regler/v1/arbeidsforhold/HarBrukerPermisjonSisteTolvMnd.kt b/src/main/kotlin/no/nav/medlemskap/regler/v1/arbeidsforhold/HarBrukerPermisjonSisteTolvMnd.kt index 00795eac8..cd82f13e9 100644 --- a/src/main/kotlin/no/nav/medlemskap/regler/v1/arbeidsforhold/HarBrukerPermisjonSisteTolvMnd.kt +++ b/src/main/kotlin/no/nav/medlemskap/regler/v1/arbeidsforhold/HarBrukerPermisjonSisteTolvMnd.kt @@ -1,59 +1,31 @@ package no.nav.medlemskap.regler.v1.arbeidsforhold -import mu.KotlinLogging -import net.logstash.logback.argument.StructuredArguments.kv import no.nav.medlemskap.domene.Datagrunnlag -import no.nav.medlemskap.domene.Kontrollperiode import no.nav.medlemskap.domene.Periode import no.nav.medlemskap.domene.Ytelse import no.nav.medlemskap.domene.arbeidsforhold.Arbeidsforhold import no.nav.medlemskap.domene.arbeidsforhold.Arbeidsforhold.Companion.finnOverlappendePermisjoner -import no.nav.medlemskap.domene.arbeidsforhold.Arbeidsforhold.Companion.harNoenArbeidsforhold100ProsentPermisjon import no.nav.medlemskap.domene.arbeidsforhold.Arbeidsforhold.Companion.harNoenArbeidsforhold100ProsentPermisjonIKontrollPerioden -import no.nav.medlemskap.domene.arbeidsforhold.Arbeidsforhold.Companion.harPermisjonerIKontrollPerioden +import no.nav.medlemskap.domene.arbeidsforhold.Arbeidsforhold.Companion.harPermisjonerSiste12Måneder import no.nav.medlemskap.regler.common.RegelId import no.nav.medlemskap.regler.common.Resultat import no.nav.medlemskap.regler.common.Resultat.Companion.ja import no.nav.medlemskap.regler.common.Resultat.Companion.nei import java.time.LocalDate -private val secureLogger = KotlinLogging.logger("tjenestekall") class HarBrukerPermisjonSiste12Måneder( ytelse: Ytelse, private val startDatoForYtelse: LocalDate, private val arbeidsforhold: List, - private val kontrollperiode: Periode, - private val fnr: String, regelId: RegelId = RegelId.REGEL_32, ) : ArbeidsforholdRegel(regelId, ytelse, startDatoForYtelse) { override fun operasjon(): Resultat { - if (arbeidsforhold.size > 1) { - //32-d - if (arbeidsforhold.harPermisjonerIKontrollPerioden(kontrollPeriodeForArbeidsforhold)) { - secureLogger.info( - "Regelbrudd 32-d. Bruker har flere arbeidsforhold og permisjon.", - kv("fnr", fnr) - ) - return ja(regelId) - } - return nei(regelId) + if (harPermisjonerSiste12Måneder(arbeidsforhold, kontrollPeriodeForArbeidsforhold)) { + return ja(regelId) } - - if (!arbeidsforhold.harNoenArbeidsforhold100ProsentPermisjonIKontrollPerioden(kontrollPeriodeForArbeidsforhold)) { - - return nei(regelId) - } - //32-c - if (arbeidsforhold.finnOverlappendePermisjoner(kontrollperiode).isEmpty()) { - return nei(regelId) - } - secureLogger.info( - "Regelbrudd 32-c. Bruker har 100% permisjon i arbeidsforhold.", - kv("fnr", fnr) - ) - return ja(regelId) + return nei(regelId) } @@ -63,9 +35,7 @@ class HarBrukerPermisjonSiste12Måneder( return HarBrukerPermisjonSiste12Måneder( ytelse = datagrunnlag.ytelse, startDatoForYtelse = datagrunnlag.startDatoForYtelse, - arbeidsforhold = datagrunnlag.arbeidsforhold, - kontrollperiode = Periode(datagrunnlag.periode.fom, datagrunnlag.periode.tom), - fnr = datagrunnlag.fnr, + arbeidsforhold = datagrunnlag.arbeidsforhold ) } } diff --git a/src/test/kotlin/no/nav/medlemskap/domene/arbeidsforhold/PermisjonPermiteringTest.kt b/src/test/kotlin/no/nav/medlemskap/domene/arbeidsforhold/PermisjonPermiteringTest.kt index 2c231da81..e5143c6e2 100644 --- a/src/test/kotlin/no/nav/medlemskap/domene/arbeidsforhold/PermisjonPermiteringTest.kt +++ b/src/test/kotlin/no/nav/medlemskap/domene/arbeidsforhold/PermisjonPermiteringTest.kt @@ -13,7 +13,7 @@ class PermisjonPermiteringTest { @Test fun finnOverlappendePerioderTest_medLikKontrollperiodeSomPermisjonspermittering() { - val kontrollperiode = Periode(fom = LocalDate.now(), tom = LocalDate.now()) + val kontrollperiode = Kontrollperiode(fom = LocalDate.now(), tom = LocalDate.now()) val permisjonPermittering = PermisjonPermittering( Periode(fom = LocalDate.now(), tom = LocalDate.now()), @@ -29,7 +29,7 @@ class PermisjonPermiteringTest { @Test fun finnOverlappendePerioderTest_DerPermisjonpermitteringErForKontrollperiode() { - val kontrollperiode = Periode(fom = LocalDate.now(), tom = LocalDate.now()) + val kontrollperiode = Kontrollperiode(fom = LocalDate.now(), tom = LocalDate.now()) val permisjonPermittering = PermisjonPermittering( Periode(fom = LocalDate.now().minusYears(1), tom = LocalDate.now().minusDays(1)), @@ -45,7 +45,7 @@ class PermisjonPermiteringTest { /*Sjekker overlappende eller samme dato.*/ @Test fun finnOverlappendePerioderTest_DerPermisjonpermitteringStarterForKontrollperiodeOgEnderI() { - val kontrollperiode = Periode(fom = LocalDate.now(), tom = LocalDate.now()) + val kontrollperiode = Kontrollperiode(fom = LocalDate.now(), tom = LocalDate.now()) val permisjonPermittering = PermisjonPermittering( Periode(fom = LocalDate.now().minusYears(1), tom = LocalDate.now()), @@ -61,7 +61,7 @@ class PermisjonPermiteringTest { @Test fun finnOverlappendePerioderTest_DerPermisjonpermitteringStarterForKontrollperiodeOgEnderEtter() { - val kontrollperiode = Periode(fom = LocalDate.now(), tom = LocalDate.now()) + val kontrollperiode = Kontrollperiode(fom = LocalDate.now(), tom = LocalDate.now()) val permisjonPermittering = PermisjonPermittering( Periode(fom = LocalDate.now().minusYears(1), tom = LocalDate.now().plusYears(1)),