Skip to content

Commit

Permalink
PEK-648 Use enum instead of CTI (#81)
Browse files Browse the repository at this point in the history
Also:
* Support hybrid enum/CTI responses from PEN (CTI = code table item)
* Use explicit mapping in copy constructors (instead of using reflection)
  • Loading branch information
espengjostol authored Mar 11, 2025
1 parent 4fb865c commit 9c7cccb
Show file tree
Hide file tree
Showing 233 changed files with 2,785 additions and 6,282 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@ package no.nav.pensjon.simulator.alderspensjon.api.nav.viapen.acl.v2.result
import no.nav.pensjon.simulator.core.afp.privat.SimulertPrivatAfpPeriode
import no.nav.pensjon.simulator.core.domain.regler.Merknad
import no.nav.pensjon.simulator.core.domain.regler.beregning.*
import no.nav.pensjon.simulator.core.domain.regler.enum.PoengtalltypeEnum
import no.nav.pensjon.simulator.core.domain.regler.enum.ResultatKildeEnum
import no.nav.pensjon.simulator.core.domain.regler.enum.VedtakResultatEnum
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Uttaksgrad
import no.nav.pensjon.simulator.core.domain.regler.simulering.Simuleringsresultat
import no.nav.pensjon.simulator.core.result.*
Expand Down Expand Up @@ -61,7 +59,7 @@ object NavSimuleringResultMapperV2 {
}

return SimuleringResultatV2(
status = source.status?.let { VedtakResultatEnum.valueOf(it.kode) },
status = source.status,
virk = source.virk?.toNorwegianDate(),
beregning = source.beregning?.let(::beregning),
delberegninger = beregningerPerId,
Expand Down Expand Up @@ -183,7 +181,7 @@ object NavSimuleringResultMapperV2 {
ar = source.ar,
bruktIBeregning = source.bruktIBeregning,
gv = source.gv,
poengtallType = source.poengtallType?.let { PoengtalltypeEnum.valueOf(it.kode) },
poengtallType = source.poengtallTypeEnum,
maksUforegrad = source.maksUforegrad,
merknadListe = source.merknadListe,
// Not used in PSELV:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,9 +193,9 @@ object SimulatorContextUtil {
target.pi = source.pi
target.pia = source.pia
target.ar = source.ar
target.opptjeningType = source.opptjeningType
target.opptjeningTypeEnum = source.opptjeningTypeEnum
target.bruk = source.bruk
target.grunnlagKilde = source.grunnlagKilde
target.grunnlagKildeEnum = source.grunnlagKildeEnum
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package no.nav.pensjon.simulator.core.afp.offentlig.pre2025

import no.nav.pensjon.simulator.core.SimulatorContext
import no.nav.pensjon.simulator.core.beholdning.BeholdningType
import no.nav.pensjon.simulator.core.domain.regler.beregning2011.AbstraktBeregningsResultat
import no.nav.pensjon.simulator.core.domain.regler.enum.BeholdningtypeEnum
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Beholdning
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Pensjonsbeholdning
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Persongrunnlag
Expand Down Expand Up @@ -51,7 +51,7 @@ class Pre2025OffentligAfpBeholdning(val context: SimulatorContext) {
for (persongrunnlagBeholdning in persongrunnlag.beholdninger) {
val isSameDay = isSameDay(persongrunnlagBeholdning.fom, (it as Pensjonsbeholdning).fom)

if (isSameDay && persongrunnlagBeholdning.beholdningsType == it.beholdningsType) {
if (isSameDay && persongrunnlagBeholdning.beholdningsTypeEnum == it.beholdningsTypeEnum) {
match = true
}
}
Expand All @@ -67,6 +67,6 @@ class Pre2025OffentligAfpBeholdning(val context: SimulatorContext) {
}

private fun isPensjonsbeholdning(beholdning: Beholdning) =
BeholdningType.PEN_B.name == beholdning.beholdningsType?.kode
BeholdningtypeEnum.PEN_B == beholdning.beholdningsTypeEnum
}
}

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ import no.nav.pensjon.simulator.core.domain.regler.grunnlag.InngangOgEksportGrun
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Inntektsgrunnlag
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.PersonDetalj
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Persongrunnlag
import no.nav.pensjon.simulator.core.domain.regler.kode.GrunnlagKildeCti
import no.nav.pensjon.simulator.core.domain.regler.kode.InntektTypeCti
import no.nav.pensjon.simulator.core.domain.regler.krav.Kravhode
import no.nav.pensjon.simulator.core.legacy.util.DateUtil.getYear
import no.nav.pensjon.simulator.core.legacy.util.DateUtil.isAfterByDay
Expand Down Expand Up @@ -206,8 +204,8 @@ class Pre2025OffentligAfpPersongrunnlag(
belop = EPS_GRUNNBELOEP_MULTIPLIER * grunnbeloep
bruk = true
fom = fomDatoInntekt.toNorwegianDateAtNoon() // is set to noon in property
grunnlagKilde = GrunnlagKildeCti(GrunnlagkildeEnum.BRUKER.name)
inntektType = InntektTypeCti(InntekttypeEnum.FPI.name)
grunnlagKildeEnum = GrunnlagkildeEnum.BRUKER
inntektTypeEnum = InntekttypeEnum.FPI
//kopiertFraGammeltKrav = false <--- not used by pensjon-regler
//registerKilde = null <--- not used by pensjon-regler
tom = null
Expand Down Expand Up @@ -283,6 +281,6 @@ class Pre2025OffentligAfpPersongrunnlag(
}

private fun isForventetPensjongivendeInntekt(grunnlag: Inntektsgrunnlag): Boolean =
InntekttypeEnum.FPI.name != grunnlag.inntektType?.kode
InntekttypeEnum.FPI != grunnlag.inntektTypeEnum
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@ class PrivatAfpBeregner(
private fun newKravlinje(person: PenPerson) =
Kravlinje().apply {
kravlinjeTypeEnum = KravlinjeTypeEnum.AFP_PRIVAT
hovedKravlinje = KravlinjeTypeEnum.AFP_PRIVAT.erHovedkravlinje
relatertPerson = person
kravlinjeStatus = KravlinjeStatus.VILKARSPROVD
land = LandkodeEnum.NOR
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package no.nav.pensjon.simulator.core.beholdning

import no.nav.pensjon.simulator.core.domain.regler.enum.BeholdningtypeEnum
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Beholdning
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Pensjonsbeholdning

Expand All @@ -8,8 +9,8 @@ object BeholdningUtil {
const val SISTE_GYLDIGE_OPPTJENING_AAR = 2023 // valid until November 2025

// TypedInformationListeUtils.findElementOfType
fun findElementOfType(list: List<Beholdning>, type: BeholdningType) =
list.find { type.name == it.beholdningsType?.kode } as? Pensjonsbeholdning
fun findElementOfType(list: List<Beholdning>, type: BeholdningtypeEnum) =
list.find { type == it.beholdningsTypeEnum } as? Pensjonsbeholdning

// ArligInformasjonListeUtils.sortedSubset
fun sortedSubset(list: List<Pensjonsbeholdning>, year: Int) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,7 @@ class AlderspensjonBeregner(private val context: SimulatorContext) {
private fun alderspensjonKravlinje(gjelderPerson: PenPerson) =
Kravlinje().apply {
kravlinjeTypeEnum = KravlinjeTypeEnum.AP
hovedKravlinje = KravlinjeTypeEnum.AP.erHovedkravlinje
relatertPerson = gjelderPerson
// NB apparently not used (no kravlinjeStatus field): setKravlinjeStatus(KravlinjeStatus.FERDIG)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,11 @@ package no.nav.pensjon.simulator.core.beregn
import mu.KotlinLogging
import no.nav.pensjon.simulator.core.SimulatorContext
import no.nav.pensjon.simulator.core.afp.offentlig.livsvarig.LivsvarigOffentligAfpYtelseMedDelingstall
import no.nav.pensjon.simulator.core.beholdning.BeholdningType
import no.nav.pensjon.simulator.core.beregn.PeriodiseringUtil.periodiserGrunnlagAndModifyKravhode
import no.nav.pensjon.simulator.core.domain.SimuleringType
import no.nav.pensjon.simulator.core.domain.regler.beregning2011.*
import no.nav.pensjon.simulator.core.domain.regler.enum.GrunnlagsrolleEnum
import no.nav.pensjon.simulator.core.domain.regler.enum.KravlinjeTypeEnum
import no.nav.pensjon.simulator.core.domain.regler.enum.RegelverkTypeEnum
import no.nav.pensjon.simulator.core.domain.regler.enum.YtelseskomponentTypeEnum
import no.nav.pensjon.simulator.core.domain.regler.enum.*
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.*
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Garantipensjonsbeholdning
import no.nav.pensjon.simulator.core.domain.regler.krav.Kravhode
import no.nav.pensjon.simulator.core.domain.regler.to.TrygdetidRequest
import no.nav.pensjon.simulator.core.domain.regler.vedtak.VilkarsVedtak
Expand Down Expand Up @@ -489,8 +484,8 @@ class AlderspensjonVilkaarsproeverOgBeregner(
) =
BeholdningPeriode(
datoFom = virkningFom,
pensjonsbeholdning = beholdninger.findBeholdningAvType(BeholdningType.PEN_B)?.totalbelop,
garantipensjonsbeholdning = beholdninger.findBeholdningAvType(BeholdningType.GAR_PEN_B)?.totalbelop,
pensjonsbeholdning = beholdninger.findBeholdningAvType(BeholdningtypeEnum.PEN_B)?.totalbelop,
garantipensjonsbeholdning = beholdninger.findBeholdningAvType(BeholdningtypeEnum.GAR_PEN_B)?.totalbelop,
garantitilleggsbeholdning = garantitilleggBeholdningTotalBeloep(
virkningFom,
beholdninger,
Expand All @@ -505,20 +500,20 @@ class AlderspensjonVilkaarsproeverOgBeregner(
foedselsdato: LocalDate
): Double? =
if (isBeforeByDay(getRelativeDateByYear(foedselsdato, GARANTITILLEGG_MAX_ALDER), virkningFom, false))
beholdninger.findBeholdningAvType(BeholdningType.GAR_T_B)?.totalbelop
beholdninger.findBeholdningAvType(BeholdningtypeEnum.GAR_T_B)?.totalbelop
else
null

private fun garantipensjonsniva(beholdninger: Beholdninger): GarantipensjonNivaa? {
val garantipensjonBeholdning =
beholdninger.findBeholdningAvType(BeholdningType.GAR_PEN_B) as? Garantipensjonsbeholdning
beholdninger.findBeholdningAvType(BeholdningtypeEnum.GAR_PEN_B) as? Garantipensjonsbeholdning
?: return null

val justertNivaa = garantipensjonBeholdning.justertGarantipensjonsniva?.garantipensjonsniva ?: return null

return GarantipensjonNivaa(
beloep = justertNivaa.belop,
satsType = justertNivaa.satsType!!.kode,
satsType = (justertNivaa.satsTypeEnum ?: GarantiPensjonsnivaSatsEnum.ORDINAER).name,
sats = justertNivaa.sats,
anvendtTrygdetid = justertNivaa.tt_anv
)
Expand Down Expand Up @@ -553,7 +548,7 @@ class AlderspensjonVilkaarsproeverOgBeregner(
TrygdetidRequest().apply {
this.virkFom = knekkpunktDato.toNorwegianDateAtNoon()
this.brukerForsteVirk = soekerForsteVirkningFom.toNorwegianDateAtNoon()
this.ytelsesTypeEnum = ytelseType
this.hovedKravlinjeType = ytelseType
this.persongrunnlag = persongrunnlag
this.boddEllerArbeidetIUtlandet = boddEllerArbeidetUtenlands
this.regelverkTypeEnum = kravhode.regelverkTypeEnum
Expand Down Expand Up @@ -585,5 +580,5 @@ private fun BeregningsResultatAfpPrivat.hentLivsvarigDelIBruk() =
it.ytelsekomponentTypeEnum == YtelseskomponentTypeEnum.AFP_LIVSVARIG && it is AfpLivsvarig
} as AfpLivsvarig?

private fun Beholdninger.findBeholdningAvType(type: BeholdningType) =
beholdninger.firstOrNull { type.name == it.beholdningsType?.kode }
private fun Beholdninger.findBeholdningAvType(type: BeholdningtypeEnum) =
beholdninger.firstOrNull { type == it.beholdningsTypeEnum }
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package no.nav.pensjon.simulator.core.beregn

import no.nav.pensjon.simulator.core.beholdning.BeholdningType
import no.nav.pensjon.simulator.core.domain.SakType
import no.nav.pensjon.simulator.core.domain.regler.enum.BeholdningtypeEnum
import no.nav.pensjon.simulator.core.domain.regler.enum.GrunnlagsrolleEnum
import no.nav.pensjon.simulator.core.domain.regler.enum.InntekttypeEnum
import no.nav.pensjon.simulator.core.domain.regler.enum.KravlinjeTypeEnum
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Inntektsgrunnlag
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.PersonDetalj
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Persongrunnlag
import no.nav.pensjon.simulator.core.domain.regler.grunnlag.Uttaksgrad
import no.nav.pensjon.simulator.core.domain.regler.kode.InntektTypeCti
import no.nav.pensjon.simulator.core.domain.regler.krav.Kravhode
import no.nav.pensjon.simulator.core.domain.regler.krav.Kravlinje
import no.nav.pensjon.simulator.core.legacy.util.DateUtil.getFirstDateInYear
Expand All @@ -24,7 +24,7 @@ import java.time.LocalDate
import java.util.*
import java.util.function.Predicate

// BehandlingsperiodeUtil
// PEN: BehandlingsperiodeUtil
object BehandlingPeriodeUtil {

// BehandlingsperiodeUtil.periodiserGrunnlag
Expand Down Expand Up @@ -123,7 +123,7 @@ object BehandlingPeriodeUtil {

newPersongrunnlag.beholdninger
.removeIf {
it.beholdningsType?.kode == BeholdningType.PEN_B.name &&
it.beholdningsTypeEnum == BeholdningtypeEnum.PEN_B &&
!dateValidator.areValid(it.fom!!, it.tom)
}

Expand Down Expand Up @@ -356,23 +356,23 @@ object BehandlingPeriodeUtil {
val startofTwoYearBeforeVirkDatoFom = getFirstDateInYear(sameDateTwoYearsBefore)
val endOfThisYear = if (virkningTom != null) getLastDateInYear(virkningTom) else null
// If type PGI, the Inntektsgrunnlag just has to start sometime after startOfLastYear and before endOfThisYear to be included (CR 72810)
if (InntektType.PGI.name == grunnlag.inntektType!!.kode && intersectsWithPossiblyOpenEndings(
startofTwoYearBeforeVirkDatoFom,
endOfThisYear,
grunnlag.fom,
grunnlag.tom,
true
if (InntekttypeEnum.PGI == grunnlag.inntektTypeEnum && intersectsWithPossiblyOpenEndings(
o1Start = startofTwoYearBeforeVirkDatoFom,
o1End = endOfThisYear,
o2Start = grunnlag.fom,
o2End = grunnlag.tom,
considerContactByDayAsIntersection = true
)
) {
return true
}

return isValidInntektType(grunnlag.inntektType!!) && isValidInntektFom(grunnlag.fom)
return isValidInntektType(grunnlag.inntektTypeEnum) && isValidInntektFom(grunnlag.fom)
}

private fun isValidInntektFom(fom: Date?): Boolean =
fom?.let { isBeforeDay(it, INNTEKT_IS_RELEVANT_BEFORE_DATE) } == true

private fun isValidInntektType(type: InntektTypeCti) =
type.kode.let { InntektType.ARBLIGN.name == it || InntektType.AI.name == it }
private fun isValidInntektType(type: InntekttypeEnum?) =
InntekttypeEnum.ARBLIGN == type || InntekttypeEnum.AI == type
}
Original file line number Diff line number Diff line change
@@ -1,27 +1,22 @@
package no.nav.pensjon.simulator.core.domain.regler

import com.fasterxml.jackson.annotation.JsonIgnore
import java.io.Serializable
class Merknad {
/**
* Identifiserer merknaden. Navnekonvensjonen er:
* Regelsettnavn.regelnavn.index, der ".index" er en opsjon.
*/
var kode: String? = null

class Merknad(var kode: String = "", var argumentListe: MutableList<String> = mutableListOf()) : Serializable {
/**
* Beskrivende
*/
var argumentListe: List<String> = mutableListOf()

constructor(merknad: Merknad) : this() {
this.kode = merknad.kode
this.argumentListe = ArrayList(merknad.argumentListe)
}

init {
this.kode = kode.replace("__", ".")
}

fun addArgument(arg: String?) {
if (arg != null) {
argumentListe.add(arg)
}
constructor()
constructor(merknad: Merknad) {
kode = merknad.kode
argumentListe = ArrayList(merknad.argumentListe)
}

fun asString(): String = "$kode:${argumentListe.joinToString(separator = ",")}"

@JsonIgnore
val tekst = asString()
}
Loading

0 comments on commit 9c7cccb

Please sign in to comment.