diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/BeregnYtelseSteg.java b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/BeregnYtelseSteg.java index 888d87babc..ee8ec238c0 100644 --- a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/BeregnYtelseSteg.java +++ b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/BeregnYtelseSteg.java @@ -66,7 +66,7 @@ public BeregnYtelseSteg(UngdomsytelseGrunnlagRepository ungdomsytelseGrunnlagRep if (ungdomsytelseGrunnlag.isEmpty()) { return BehandleStegResultat.utførtUtenAksjonspunkter(); } - final var rapportertInntektTidslinje = rapportertInntektMapper.map(kontekst.getBehandlingId()); + final var rapportertInntektTidslinje = rapportertInntektMapper.mapAlleGjeldendeRegisterOgBrukersInntekter(kontekst.getBehandlingId()); final var ytelseTidslinje = ytelseperiodeUtleder.utledYtelsestidslinje(kontekst.getBehandlingId()); // Validerer at periodene for rapporterte inntekter er konsistent med ytelsetidslinje diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/LagTilkjentYtelse.java b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/LagTilkjentYtelse.java index 2eef2069db..c03234f30b 100644 --- a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/LagTilkjentYtelse.java +++ b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/LagTilkjentYtelse.java @@ -19,7 +19,7 @@ public class LagTilkjentYtelse { static LocalDateTimeline lagTidslinje(LocalDateTimeline godkjentTidslinje, LocalDateTimeline totalsatsTidslinje, LocalDateTimeline rapportertInntektTidslinje) { return totalsatsTidslinje.combine(rapportertInntektTidslinje, (di, sats, rapportertInntekt) -> { // Dersom det ikke er rapportert inntekt settes denne til 0, ellers summeres alle inntektene - final var rapporertinntekt = rapportertInntekt == null ? BigDecimal.ZERO : rapportertInntekt.getValue().getRapporterteInntekter().stream().map(RapportertInntekt::beløp).reduce(BigDecimal.ZERO, BigDecimal::add); + final var rapporertinntekt = rapportertInntekt == null ? BigDecimal.ZERO : rapportertInntekt.getValue().getBrukerRapporterteInntekter().stream().map(RapportertInntekt::beløp).reduce(BigDecimal.ZERO, BigDecimal::add); // Mapper verdier til TilkjentYtelsePeriodeResultat final var periodeResultat = TikjentYtelseBeregner.beregn(di, sats.getValue(), rapporertinntekt); return new LocalDateSegment<>(di.getFomDato(), di.getTomDato(), periodeResultat); diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/Avviksvurdering.java b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/Avviksvurdering.java new file mode 100644 index 0000000000..2889222c5c --- /dev/null +++ b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/Avviksvurdering.java @@ -0,0 +1,80 @@ +package no.nav.ung.sak.domene.behandling.steg.registerinntektkontroll; + +import no.nav.fpsak.tidsserie.LocalDateSegment; +import no.nav.fpsak.tidsserie.LocalDateTimeline; +import no.nav.ung.kodeverk.behandling.BehandlingÅrsakType; +import no.nav.ung.sak.ytelse.RapportertInntekt; +import no.nav.ung.sak.ytelse.RapporterteInntekter; +import no.nav.ung.sak.ytelse.uttalelse.BrukersUttalelseForRegisterinntekt; + +import java.math.BigDecimal; +import java.util.Optional; +import java.util.Set; + +import static no.nav.ung.sak.domene.behandling.steg.registerinntektkontroll.FinnKontrollresultatForIkkeGodkjentUttalelse.harDiff; + +public class Avviksvurdering { + + public static final BigDecimal AKSEPTERT_DIFFERANSE = BigDecimal.valueOf(1000); + + + static Optional gjørAvviksvurderingMotRegisterinntekt(LocalDateTimeline gjeldendeRapporterteInntekter, LocalDateTimeline uttalelseTidslinje, LocalDateTimeline> tidslinjeRelevanteÅrsaker) { + final var inntektDiffKontrollResultat = finnKontrollresultatTidslinje(gjeldendeRapporterteInntekter, tidslinjeRelevanteÅrsaker); + + final var tidslinjeForOppgaveTilBruker = inntektDiffKontrollResultat.filterValue(it -> it.equals(KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER)); + if (!tidslinjeForOppgaveTilBruker.isEmpty()) { + + // Må finne ut om vi skal sette ny frist + final var oppgaverTilBrukerTidslinje = finnNyOppgaveKontrollresultatTidslinje(gjeldendeRapporterteInntekter, uttalelseTidslinje, tidslinjeForOppgaveTilBruker); + + if (!oppgaverTilBrukerTidslinje.filterValue(it -> it.equals(KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST)).isEmpty()) { + return Optional.of(KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST); + } else { + return Optional.of(KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER); + } + + } + + if (!inntektDiffKontrollResultat.filterValue(it -> it.equals(KontrollResultat.BRUK_INNTEKT_FRA_BRUKER)).isEmpty()) { + return Optional.of(KontrollResultat.BRUK_INNTEKT_FRA_BRUKER); + } + return Optional.empty(); + } + + private static LocalDateTimeline finnNyOppgaveKontrollresultatTidslinje(LocalDateTimeline gjeldendeRapporterteInntekter, LocalDateTimeline uttalelseTidslinje, LocalDateTimeline tidslinjeForOppgaveTilBruker) { + final var oppgaverTilBrukerTidslinje = gjeldendeRapporterteInntekter.mapValue(RapporterteInntekter::getRegisterRapporterteInntekter).intersection(tidslinjeForOppgaveTilBruker) + .combine(uttalelseTidslinje.mapValue(BrukersUttalelseForRegisterinntekt::registerInntekt), (di, register, uttalelse) -> { + if (uttalelse == null) { + return new LocalDateSegment<>(di, KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER); + } + if (!harDiff(uttalelse.getValue(), register.getValue())) { + return new LocalDateSegment<>(di, KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER); + } else { + return new LocalDateSegment<>(di, KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST); + } + }, LocalDateTimeline.JoinStyle.LEFT_JOIN); + return oppgaverTilBrukerTidslinje; + } + + private static LocalDateTimeline finnKontrollresultatTidslinje(LocalDateTimeline gjeldendeRapporterteInntekter, LocalDateTimeline> tidslinjeRelevanteÅrsaker) { + final var inntektDiffKontrollResultat = gjeldendeRapporterteInntekter.intersection(tidslinjeRelevanteÅrsaker) + .mapValue(it -> + { + final var register = it.getRegisterRapporterteInntekter().stream() + .map(RapportertInntekt::beløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + final var bruker = it.getBrukerRapporterteInntekter().stream() + .map(RapportertInntekt::beløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + + final var differanse = register.subtract(bruker).abs(); + + if (differanse.compareTo(AKSEPTERT_DIFFERANSE) > 0) { + return KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER; + } else { + return KontrollResultat.BRUK_INNTEKT_FRA_BRUKER; + } + }); + return inntektDiffKontrollResultat; + } + + +} diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/FinnKontrollresultatForIkkeGodkjentUttalelse.java b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/FinnKontrollresultatForIkkeGodkjentUttalelse.java new file mode 100644 index 0000000000..fe51968454 --- /dev/null +++ b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/FinnKontrollresultatForIkkeGodkjentUttalelse.java @@ -0,0 +1,46 @@ +package no.nav.ung.sak.domene.behandling.steg.registerinntektkontroll; + +import no.nav.fpsak.tidsserie.LocalDateSegment; +import no.nav.fpsak.tidsserie.LocalDateTimeline; +import no.nav.ung.sak.ytelse.RapportertInntekt; +import no.nav.ung.sak.ytelse.RapporterteInntekter; +import no.nav.ung.sak.ytelse.uttalelse.BrukersUttalelseForRegisterinntekt; + +import java.math.BigDecimal; +import java.util.Set; + +public class FinnKontrollresultatForIkkeGodkjentUttalelse { + + static KontrollResultat finnKontrollresultatForIkkeGodkjentUttalelse(LocalDateTimeline gjeldendeRapporterteInntekter, LocalDateTimeline relevantIkkeGodkjentUttalelse) { + final var registerInntektTidslinje = gjeldendeRapporterteInntekter.mapValue(RapporterteInntekter::getRegisterRapporterteInntekter); + final var ikkeGodkjentUttalelseResultater = relevantIkkeGodkjentUttalelse.combine(registerInntektTidslinje, (di, uttalelse, register) -> { + if (!harDiff(uttalelse.getValue().registerInntekt(), register != null ? register.getValue() : Set.of())) { + return new LocalDateSegment<>(di, KontrollResultat.OPPRETT_AKSJONSPUNKT); + } else { + return new LocalDateSegment<>(di, KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST); + } + }, LocalDateTimeline.JoinStyle.LEFT_JOIN); + + if (!ikkeGodkjentUttalelseResultater.filterValue(it -> it == KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST).isEmpty()) { + return KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST; + } else if (!ikkeGodkjentUttalelseResultater.filterValue(it -> it == KontrollResultat.OPPRETT_AKSJONSPUNKT).isEmpty()) { + return KontrollResultat.OPPRETT_AKSJONSPUNKT; + } + + return KontrollResultat.OPPRETT_AKSJONSPUNKT; + } + + static boolean harDiff(Set registerInntekFraUttalelse, Set gjeldendeRegisterinntekt) { + final var totalInntektFraUttalelse = summerInntekter(registerInntekFraUttalelse); + final var totalGjeldendeRegisterInntekt = summerInntekter(gjeldendeRegisterinntekt); + return totalInntektFraUttalelse.compareTo(totalGjeldendeRegisterInntekt) != 0; + } + + private static BigDecimal summerInntekter(Set registerinntektFraUttalelse) { + return registerinntektFraUttalelse.stream() + .map(RapportertInntekt::beløp) + .reduce(BigDecimal::add) + .orElse(BigDecimal.ZERO); + } + +} diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollResultat.java b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollResultat.java new file mode 100644 index 0000000000..63aca49d91 --- /dev/null +++ b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollResultat.java @@ -0,0 +1,10 @@ +package no.nav.ung.sak.domene.behandling.steg.registerinntektkontroll; + +public enum KontrollResultat { + BRUK_INNTEKT_FRA_BRUKER, + OPPRETT_AKSJONSPUNKT, + OPPRETT_OPPGAVE_TIL_BRUKER, + OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST, + SETT_PÅ_VENT_TIL_RAPPORTERINGSFRIST + +} diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollerInntektSteg.java b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollerInntektSteg.java new file mode 100644 index 0000000000..cf6c41ff4f --- /dev/null +++ b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollerInntektSteg.java @@ -0,0 +1,51 @@ +package no.nav.ung.sak.domene.behandling.steg.registerinntektkontroll; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import no.nav.ung.sak.behandlingskontroll.*; +import no.nav.ung.sak.perioder.ProsessTriggerPeriodeUtleder; +import no.nav.ung.sak.ytelse.RapportertInntektMapper; +import no.nav.ung.sak.ytelse.uttalelse.RegisterinntektUttalelseTjeneste; + +import static no.nav.ung.kodeverk.behandling.BehandlingStegType.KONTROLLER_REGISTER_INNTEKT; +import static no.nav.ung.kodeverk.behandling.FagsakYtelseType.UNGDOMSYTELSE; + +@ApplicationScoped +@BehandlingStegRef(value = KONTROLLER_REGISTER_INNTEKT) +@BehandlingTypeRef +@FagsakYtelseTypeRef(UNGDOMSYTELSE) +public class KontrollerInntektSteg implements BehandlingSteg { + + private ProsessTriggerPeriodeUtleder prosessTriggerPeriodeUtleder; + private RapportertInntektMapper rapportertInntektMapper; + private RegisterinntektUttalelseTjeneste registerinntektUttalelseTjeneste; + + + @Inject + public KontrollerInntektSteg(ProsessTriggerPeriodeUtleder prosessTriggerPeriodeUtleder, + RapportertInntektMapper rapportertInntektMapper, + RegisterinntektUttalelseTjeneste registerinntektUttalelseTjeneste) { + this.prosessTriggerPeriodeUtleder = prosessTriggerPeriodeUtleder; + this.rapportertInntektMapper = rapportertInntektMapper; + this.registerinntektUttalelseTjeneste = registerinntektUttalelseTjeneste; + } + + public KontrollerInntektSteg() { + } + + @Override + public BehandleStegResultat utførSteg(BehandlingskontrollKontekst kontekst) { + + final var rapporterteInntekterTidslinje = rapportertInntektMapper.mapAlleGjeldendeRegisterOgBrukersInntekter(kontekst.getBehandlingId()); + final var prosessTriggerTidslinje = prosessTriggerPeriodeUtleder.utledTidslinje(kontekst.getBehandlingId()); + final var uttalelser = registerinntektUttalelseTjeneste.hentUttalelser(kontekst.getBehandlingId()); + final var registerinntekterForIkkeGodkjentUttalelse = rapportertInntektMapper.finnRegisterinntekterForUttalelse(kontekst.getBehandlingId(), uttalelser); + + + final var kontrollResultat = KontrollerInntektTjeneste.utførKontroll(prosessTriggerTidslinje, rapporterteInntekterTidslinje, registerinntekterForIkkeGodkjentUttalelse); + + return BehandleStegResultat.utførtUtenAksjonspunkter( + ); + } + +} diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollerInntektTjeneste.java b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollerInntektTjeneste.java new file mode 100644 index 0000000000..d150516574 --- /dev/null +++ b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollerInntektTjeneste.java @@ -0,0 +1,39 @@ +package no.nav.ung.sak.domene.behandling.steg.registerinntektkontroll; + +import no.nav.fpsak.tidsserie.LocalDateTimeline; +import no.nav.ung.kodeverk.behandling.BehandlingÅrsakType; +import no.nav.ung.sak.ytelse.RapporterteInntekter; +import no.nav.ung.sak.ytelse.uttalelse.BrukersUttalelseForRegisterinntekt; +import no.nav.ung.sak.ytelse.uttalelse.Status; + +import java.util.Set; + +import static no.nav.ung.sak.domene.behandling.steg.registerinntektkontroll.FinnKontrollresultatForIkkeGodkjentUttalelse.finnKontrollresultatForIkkeGodkjentUttalelse; + +public class KontrollerInntektTjeneste { + + + + public static KontrollResultat utførKontroll(LocalDateTimeline> prosessTriggerTidslinje, + LocalDateTimeline gjeldendeRapporterteInntekter, + LocalDateTimeline uttalelseTidslinje) { + + // Sjekker først om vi har relevante årsaker + final var tidslinjeRelevanteÅrsaker = prosessTriggerTidslinje.filterValue(it -> it.contains(BehandlingÅrsakType.RE_RAPPORTERING_INNTEKT) || it.contains(BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT)); + final var harIkkePassertRapporteringsfrist = tidslinjeRelevanteÅrsaker.filterValue(it -> !it.contains(BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT)); + // Dersom vi ikkje har passert rapporteringsfrist (ikkje har kontroll-årsak) så skal vi vente til rapporteringsfrist + if (!harIkkePassertRapporteringsfrist.isEmpty()) { + return KontrollResultat.SETT_PÅ_VENT_TIL_RAPPORTERINGSFRIST; + } + + final var relevantIkkeGodkjentUttalelse = uttalelseTidslinje.filterValue(it -> it.status().equals(Status.BEKREFTET) && !it.uttalelse().erEndringenGodkjent()).intersection(tidslinjeRelevanteÅrsaker); + if (!relevantIkkeGodkjentUttalelse.isEmpty()) { + return finnKontrollresultatForIkkeGodkjentUttalelse(gjeldendeRapporterteInntekter, relevantIkkeGodkjentUttalelse); + } + + final var opprettOppgaveTilBrukerMedNyFrist = Avviksvurdering.gjørAvviksvurderingMotRegisterinntekt(gjeldendeRapporterteInntekter, uttalelseTidslinje, tidslinjeRelevanteÅrsaker); + return opprettOppgaveTilBrukerMedNyFrist.orElse(KontrollResultat.BRUK_INNTEKT_FRA_BRUKER); + + } + +} diff --git a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/BeregnYtelseStegTest.java b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/BeregnYtelseStegTest.java index 1e68d77cea..f0c421a7ed 100644 --- a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/BeregnYtelseStegTest.java +++ b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/BeregnYtelseStegTest.java @@ -61,12 +61,13 @@ void setUp() { inntektArbeidYtelseTjeneste = new AbakusInMemoryInntektArbeidYtelseTjeneste(); ungdomsprogramPeriodeRepository = new UngdomsprogramPeriodeRepository(entityManager); behandlingRepository = new BehandlingRepository(entityManager); + final var ytelseperiodeUtleder = new YtelseperiodeUtleder( + new UngdomsprogramPeriodeTjeneste(ungdomsprogramPeriodeRepository), + behandlingRepository); beregnYtelseSteg = new BeregnYtelseSteg(ungdomsytelseGrunnlagRepository, tilkjentYtelseRepository, - new RapportertInntektMapper(inntektArbeidYtelseTjeneste), - new YtelseperiodeUtleder( - new UngdomsprogramPeriodeTjeneste(ungdomsprogramPeriodeRepository), - behandlingRepository)); + new RapportertInntektMapper(inntektArbeidYtelseTjeneste, ytelseperiodeUtleder), + ytelseperiodeUtleder); fagsakRepository = new FagsakRepository(entityManager); diff --git a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/LagTilkjentYtelseTest.java b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/LagTilkjentYtelseTest.java index da61bacab8..4b8caf8038 100644 --- a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/LagTilkjentYtelseTest.java +++ b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/beregnytelse/LagTilkjentYtelseTest.java @@ -37,7 +37,9 @@ void testLagTidslinjeMedTomGodkjentTidslinje() { LocalDateTimeline rapportertInntektTidslinje = new LocalDateTimeline<>(List.of( new LocalDateSegment<>(LocalDate.of(2023, 1, 15), LocalDate.of(2023, 2, 15), - new RapporterteInntekter(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(50000))))) + new RapporterteInntekter( + Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(50000))), + Set.of())) )); // Call the method under test @@ -114,7 +116,9 @@ void testLagTidslinjeUtenRapportertInntekt() { final var rapportertInntekt = BigDecimal.valueOf(150); LocalDateTimeline rapportertInntektTidslinje = new LocalDateTimeline<>(List.of( - new LocalDateSegment<>(fom, tom, new RapporterteInntekter(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, rapportertInntekt)))) + new LocalDateSegment<>(fom, tom, new RapporterteInntekter( + Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, rapportertInntekt)), + Set.of())) )); // Act diff --git a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollerInntektTjenesteTest.java b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollerInntektTjenesteTest.java new file mode 100644 index 0000000000..7afae66cb1 --- /dev/null +++ b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/KontrollerInntektTjenesteTest.java @@ -0,0 +1,199 @@ +package no.nav.ung.sak.domene.behandling.steg.registerinntektkontroll; + +import no.nav.fpsak.tidsserie.LocalDateInterval; +import no.nav.fpsak.tidsserie.LocalDateSegment; +import no.nav.fpsak.tidsserie.LocalDateTimeline; +import no.nav.ung.kodeverk.behandling.BehandlingÅrsakType; +import no.nav.ung.sak.ytelse.InntektType; +import no.nav.ung.sak.ytelse.RapportertInntekt; +import no.nav.ung.sak.ytelse.RapporterteInntekter; +import no.nav.ung.sak.ytelse.uttalelse.BrukersUttalelseForRegisterinntekt; +import no.nav.ung.sak.ytelse.uttalelse.Status; +import no.nav.ung.sak.ytelse.uttalelse.Uttalelse; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +class KontrollerInntektTjenesteTest { + + @Test + void skal_sette_på_vent_til_rapporteringsfrist() { + // Arrange + final var fom = LocalDate.now().minusDays(10); + final var tom = LocalDate.now().plusDays(10); + LocalDateTimeline> prosessTriggerTidslinje = lagProsesstriggerTidslinjeForInntektRapportering(fom, tom); + final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinje(fom, tom); + LocalDateTimeline ikkeGodkjentUttalelseTidslinje = LocalDateTimeline.empty(); + + // Act + KontrollResultat resultat = KontrollerInntektTjeneste.utførKontroll(prosessTriggerTidslinje, gjeldendeRapporterteInntekter, ikkeGodkjentUttalelseTidslinje); + + // Assert + assertEquals(KontrollResultat.SETT_PÅ_VENT_TIL_RAPPORTERINGSFRIST, resultat); + } + + @Test + void skal_opprette_aksjonspunkt_dersom_brukes_har_gitt_uttalelse_og_registerinntekt_er_lik() { + // Arrange + final var fom = LocalDate.now().minusDays(10); + final var tom = LocalDate.now().plusDays(10); + final var bruker = 10; + final var register = 10_000; + LocalDateTimeline> prosessTriggerTidslinje = lagProsesstriggerTidslinjeForInntektRapporteringOgKontroll(fom, tom); + final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinjeMedDiffMotRegister(fom, tom, register, bruker); + LocalDateTimeline ikkeGodkjentUttalelseTidslinje = new LocalDateTimeline<>(fom, tom, + new BrukersUttalelseForRegisterinntekt(Status.BEKREFTET, Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(register))), new Uttalelse(false))); + + // Act + KontrollResultat resultat = KontrollerInntektTjeneste.utførKontroll(prosessTriggerTidslinje, gjeldendeRapporterteInntekter, ikkeGodkjentUttalelseTidslinje); + + // Assert + assertEquals(KontrollResultat.OPPRETT_AKSJONSPUNKT, resultat); + } + + @Test + void skal_sette_på_vent_på_nytt_dersom_bruker_har_gitt_uttalelse_og_registerinntekt_er_ulik() { + // Arrange + final var fom = LocalDate.now().minusDays(10); + final var tom = LocalDate.now().plusDays(10); + final var bruker = 10; + final var register = 10_000; + final var registerFraUttalelse = 9999; + LocalDateTimeline> prosessTriggerTidslinje = lagProsesstriggerTidslinjeForInntektRapporteringOgKontroll(fom, tom); + final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinjeMedDiffMotRegister(fom, tom, register, bruker); + LocalDateTimeline ikkeGodkjentUttalelseTidslinje = new LocalDateTimeline<>(fom, tom, + new BrukersUttalelseForRegisterinntekt(Status.BEKREFTET, Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(registerFraUttalelse))), new Uttalelse(false))); + + // Act + KontrollResultat resultat = KontrollerInntektTjeneste.utførKontroll(prosessTriggerTidslinje, gjeldendeRapporterteInntekter, ikkeGodkjentUttalelseTidslinje); + + // Assert + assertEquals(KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST, resultat); + } + + @Test + void skal_bruke_brukers_inntekt_dersom_diff_mellom_rapportert_inntekt_fra_register_og_bruker_er_mindre_enn_akseptert_grense() { + // Arrange + final var fom = LocalDate.now().minusDays(10); + final var tom = LocalDate.now().plusDays(10); + LocalDateTimeline> prosessTriggerTidslinje = lagProsesstriggerTidslinjeForKontroll(fom, tom); + final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinjeMedDiffMotRegister(fom, tom, 10_000, 10_001); + LocalDateTimeline ikkeGodkjentUttalelseTidslinje = LocalDateTimeline.empty(); + + // Act + KontrollResultat resultat = KontrollerInntektTjeneste.utførKontroll(prosessTriggerTidslinje, gjeldendeRapporterteInntekter, ikkeGodkjentUttalelseTidslinje); + + // Assert + assertEquals(KontrollResultat.BRUK_INNTEKT_FRA_BRUKER, resultat); + } + + @Test + void skal_bruke_brukers_inntekt_dersom_ingen_rapportert_inntekt_fra_register_eller_bruker() { + // Arrange + final var fom = LocalDate.now().minusDays(10); + final var tom = LocalDate.now().plusDays(10); + LocalDateTimeline> prosessTriggerTidslinje = lagProsesstriggerTidslinjeForKontroll(fom, tom); + final var gjeldendeRapporterteInntekter = ingenRapporterteInntekter(fom, tom); + LocalDateTimeline ikkeGodkjentUttalelseTidslinje = LocalDateTimeline.empty(); + + // Act + KontrollResultat resultat = KontrollerInntektTjeneste.utførKontroll(prosessTriggerTidslinje, gjeldendeRapporterteInntekter, ikkeGodkjentUttalelseTidslinje); + + // Assert + assertEquals(KontrollResultat.BRUK_INNTEKT_FRA_BRUKER, resultat); + } + + @Test + void skal_opprette_oppgave_dersom_diff_mellom_rapportert_inntekt_fra_register_og_bruker_er_større_enn_akseptert_grense() { + // Arrange + final var fom = LocalDate.now().minusDays(10); + final var tom = LocalDate.now().plusDays(10); + LocalDateTimeline> prosessTriggerTidslinje = lagProsesstriggerTidslinjeForKontroll(fom, tom); + final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinjeMedDiffMotRegister(fom, tom, 10_000, 11_001); + LocalDateTimeline ikkeGodkjentUttalelseTidslinje = LocalDateTimeline.empty(); + + // Act + KontrollResultat resultat = KontrollerInntektTjeneste.utførKontroll(prosessTriggerTidslinje, gjeldendeRapporterteInntekter, ikkeGodkjentUttalelseTidslinje); + + // Assert + assertEquals(KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER, resultat); + } + + + @Test + void skal_opprette_oppgave_med_ny_frist_dersom_diff_mellom_rapportert_inntekt_fra_register_og_bruker_er_større_enn_akseptert_grense_og_det_finnes_eksisterende_ikke_bekreftet_oppgave_med_ulik_registerinntekt() { + // Arrange + final var fom = LocalDate.now().minusDays(10); + final var tom = LocalDate.now().plusDays(10); + LocalDateTimeline> prosessTriggerTidslinje = lagProsesstriggerTidslinjeForKontroll(fom, tom); + final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinjeMedDiffMotRegister(fom, tom, 10_000, 11_001); + LocalDateTimeline uttalelseTidslinje = new LocalDateTimeline<>(fom, tom, + new BrukersUttalelseForRegisterinntekt(Status.VENTER, Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(10_002))), null)); + + // Act + KontrollResultat resultat = KontrollerInntektTjeneste.utførKontroll(prosessTriggerTidslinje, gjeldendeRapporterteInntekter, uttalelseTidslinje); + + // Assert + assertEquals(KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST, resultat); + } + + + private static LocalDateTimeline> lagProsesstriggerTidslinjeForInntektRapportering(LocalDate fom, LocalDate tom) { + return new LocalDateTimeline<>( + new LocalDateInterval(fom, tom), + Set.of(BehandlingÅrsakType.RE_RAPPORTERING_INNTEKT) + ); + } + + private static LocalDateTimeline> lagProsesstriggerTidslinjeForInntektRapporteringOgKontroll(LocalDate fom, LocalDate tom) { + return new LocalDateTimeline<>( + new LocalDateInterval(fom, tom), + Set.of(BehandlingÅrsakType.RE_RAPPORTERING_INNTEKT, BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT) + ); + } + + private static LocalDateTimeline> lagProsesstriggerTidslinjeForKontroll(LocalDate fom, LocalDate tom) { + return new LocalDateTimeline<>( + new LocalDateInterval(fom, tom), + Set.of(BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT) + ); + } + + private static LocalDateTimeline lagRapportertInntektTidslinje(LocalDate fom, LocalDate tom) { + LocalDateTimeline gjeldendeRapporterteInntekter = new LocalDateTimeline<>( + List.of( + new LocalDateSegment<>(fom, tom, new RapporterteInntekter(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.TEN)), Set.of())) + ) + ); + return gjeldendeRapporterteInntekter; + } + + private static LocalDateTimeline lagRapportertInntektTidslinjeMedDiffMotRegister(LocalDate fom, LocalDate tom, int register, int bruker) { + LocalDateTimeline gjeldendeRapporterteInntekter = new LocalDateTimeline<>( + List.of( + new LocalDateSegment<>(fom, tom, new RapporterteInntekter(Set.of( + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(bruker))), Set.of( + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(register)) + ))) + ) + ); + return gjeldendeRapporterteInntekter; + } + + private static LocalDateTimeline ingenRapporterteInntekter(LocalDate fom, LocalDate tom) { + LocalDateTimeline gjeldendeRapporterteInntekter = new LocalDateTimeline<>( + List.of( + new LocalDateSegment<>(fom, tom, new RapporterteInntekter(Set.of(), Set.of())) + ) + ); + return gjeldendeRapporterteInntekter; + } + + +} diff --git a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/uttak/RapportertInntektMapperTest.java b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/uttak/RapportertInntektMapperTest.java index 9b63b531d8..c42fd15d0c 100644 --- a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/uttak/RapportertInntektMapperTest.java +++ b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/uttak/RapportertInntektMapperTest.java @@ -8,9 +8,11 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.temporal.TemporalAdjusters; import java.util.List; import java.util.Set; +import no.nav.ung.sak.ytelseperioder.YtelseperiodeUtleder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -31,27 +33,32 @@ class RapportertInntektMapperTest { private InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste = mock(InntektArbeidYtelseTjeneste.class); + private YtelseperiodeUtleder ytelseperiodeUtleder = mock(YtelseperiodeUtleder.class); private RapportertInntektMapper rapportertInntektMapper; @BeforeEach void setUp() { - rapportertInntektMapper = new RapportertInntektMapper(inntektArbeidYtelseTjeneste); + when(ytelseperiodeUtleder.utledYtelsestidslinje(anyLong())).thenReturn(new LocalDateTimeline<>(List.of( + new LocalDateSegment<>(LocalDate.now(), LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()), true), + new LocalDateSegment<>(LocalDate.now().plusMonths(1).withDayOfMonth(1), LocalDate.now().plusMonths(1).with(TemporalAdjusters.lastDayOfMonth()), true)))); + rapportertInntektMapper = new RapportertInntektMapper(inntektArbeidYtelseTjeneste, ytelseperiodeUtleder); } @Test void skal_mappe_en_mottatt_inntekt() { // Arrange - final var periode = DatoIntervallEntitet.fraOgMedTilOgMed(LocalDate.now(), LocalDate.now().plusDays(1)); + final var periode = DatoIntervallEntitet.fraOgMedTilOgMed(LocalDate.now(), LocalDate.now().with(TemporalAdjusters.lastDayOfMonth())); final var inntekt = BigDecimal.TEN; final var oppgittOpptjening = lagMottattATFLInntekt(periode, inntekt, LocalDateTime.now()); mockIAY(List.of(oppgittOpptjening)); // Act - final var tidslinje = rapportertInntektMapper.map(1L); + final var tidslinje = rapportertInntektMapper.mapAlleGjeldendeRegisterOgBrukersInntekter(1L); // Assert final var forventet = new LocalDateTimeline<>(periode.getFomDato(), periode.getTomDato(), - new RapporterteInntekter(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt)))); + new RapporterteInntekter(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt)), + Set.of())); assertThat(tidslinje).isEqualTo(forventet); } @@ -59,21 +66,21 @@ void skal_mappe_en_mottatt_inntekt() { @Test void skal_mappe_mottatte_inntekter_for_næring_og_arbeid() { // Arrange - final var periode = DatoIntervallEntitet.fraOgMedTilOgMed(LocalDate.now(), LocalDate.now().plusDays(1)); + final var periode = DatoIntervallEntitet.fraOgMedTilOgMed(LocalDate.now(), LocalDate.now().with(TemporalAdjusters.lastDayOfMonth())); final var arbeidsinntekt = BigDecimal.TEN; final var næringsinntekt = BigDecimal.ONE; final var oppgittOpptjening = lagMottattATFLOgNæringInntekt(periode, arbeidsinntekt, næringsinntekt, LocalDateTime.now()); mockIAY(List.of(oppgittOpptjening)); // Act - final var tidslinje = rapportertInntektMapper.map(1L); + final var tidslinje = rapportertInntektMapper.mapAlleGjeldendeRegisterOgBrukersInntekter(1L); // Assert final var forventet = new LocalDateTimeline<>(periode.getFomDato(), periode.getTomDato(), new RapporterteInntekter(Set.of( new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, arbeidsinntekt), new RapportertInntekt(InntektType.SELVSTENDIG_NÆRINGSDRIVENDE, næringsinntekt) - ))); + ), Set.of())); assertThat(tidslinje).isEqualTo(forventet); } @@ -81,13 +88,13 @@ void skal_mappe_en_mottatt_inntekt() { void skal_mappe_to_mottatte_inntekter_for_forskjellige_perioder() { // Arrange final var fom = LocalDate.now(); - final var tom = LocalDate.now().plusDays(1); + final var tom = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()); final var periode = DatoIntervallEntitet.fraOgMedTilOgMed(fom, tom); final var inntekt = BigDecimal.TEN; final var innsendtTidspunkt = LocalDateTime.now(); final var oppgittOpptjening = lagMottattATFLInntekt(periode, inntekt, innsendtTidspunkt); - final var fom2 = tom.plusDays(10); - final var tom2 = fom2.plusDays(10); + final var fom2 = fom.plusMonths(1).withDayOfMonth(1); + final var tom2 = fom2.with(TemporalAdjusters.lastDayOfMonth()); final var periode2 = DatoIntervallEntitet.fraOgMedTilOgMed(fom2, tom2); final var inntekt2 = BigDecimal.valueOf(50); final var oppgittOpptjening2 = lagMottattATFLInntekt(periode2, inntekt2, innsendtTidspunkt); @@ -95,13 +102,17 @@ void skal_mappe_to_mottatte_inntekter_for_forskjellige_perioder() { mockIAY(List.of(oppgittOpptjening, oppgittOpptjening2)); // Act - final var tidslinje = rapportertInntektMapper.map(1L); + final var tidslinje = rapportertInntektMapper.mapAlleGjeldendeRegisterOgBrukersInntekter(1L); // Assert final var forventet = new LocalDateTimeline<>( List.of( - new LocalDateSegment<>(periode.getFomDato(), periode.getTomDato(), new RapporterteInntekter(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt)))), - new LocalDateSegment<>(periode2.getFomDato(), periode2.getTomDato(), new RapporterteInntekter(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt2)))) + new LocalDateSegment<>(periode.getFomDato(), periode.getTomDato(), new RapporterteInntekter( + Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt)), + Set.of())), + new LocalDateSegment<>(periode2.getFomDato(), periode2.getTomDato(), new RapporterteInntekter( + Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt2)), + Set.of())) )); assertThat(tidslinje).isEqualTo(forventet); } @@ -110,7 +121,7 @@ void skal_mappe_to_mottatte_inntekter_for_forskjellige_perioder() { void skal_mappe_to_mottatte_inntekter_for_samme_perioder() { // Arrange final var fom = LocalDate.now(); - final var tom = LocalDate.now().plusDays(1); + final var tom = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()); final var periode = DatoIntervallEntitet.fraOgMedTilOgMed(fom, tom); final var inntekt = BigDecimal.TEN; final var innsendtTidspunkt = LocalDateTime.now().minusDays(1); @@ -123,12 +134,13 @@ void skal_mappe_to_mottatte_inntekter_for_samme_perioder() { mockIAY(List.of(oppgittOpptjening, oppgittOpptjening2)); // Act - final var tidslinje = rapportertInntektMapper.map(1L); + final var tidslinje = rapportertInntektMapper.mapAlleGjeldendeRegisterOgBrukersInntekter(1L); // Assert final var forventet = new LocalDateTimeline<>(periode.getFomDato(), periode.getTomDato(), new RapporterteInntekter( - Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt2)))); + Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt2)), + Set.of())); assertThat(tidslinje).isEqualTo(forventet); } diff --git a/domenetjenester/behandlingskontroll/src/main/java/no/nav/ung/sak/behandlingskontroll/ProsessModell.java b/domenetjenester/behandlingskontroll/src/main/java/no/nav/ung/sak/behandlingskontroll/ProsessModell.java index 196d85804b..39145397dd 100644 --- a/domenetjenester/behandlingskontroll/src/main/java/no/nav/ung/sak/behandlingskontroll/ProsessModell.java +++ b/domenetjenester/behandlingskontroll/src/main/java/no/nav/ung/sak/behandlingskontroll/ProsessModell.java @@ -28,6 +28,7 @@ public class ProsessModell { .medSteg(BehandlingStegType.FORESLÅ_BEHANDLINGSRESULTAT) .medSteg(BehandlingStegType.UNGDOMSYTELSE_BEREGNING, StartpunktType.BEREGNING) .medSteg(BehandlingStegType.VURDER_UTTAK) + .medSteg(BehandlingStegType.KONTROLLER_REGISTER_INNTEKT) .medSteg(BehandlingStegType.BEREGN_YTELSE) .medSteg(BehandlingStegType.SIMULER_OPPDRAG) .medSteg(BehandlingStegType.FORESLÅ_VEDTAK) @@ -53,6 +54,7 @@ public BehandlingModell revurdering() { .medSteg(BehandlingStegType.FORESLÅ_BEHANDLINGSRESULTAT) .medSteg(BehandlingStegType.UNGDOMSYTELSE_BEREGNING, StartpunktType.BEREGNING) .medSteg(BehandlingStegType.VURDER_UTTAK) + .medSteg(BehandlingStegType.KONTROLLER_REGISTER_INNTEKT) .medSteg(BehandlingStegType.BEREGN_YTELSE) .medSteg(BehandlingStegType.SIMULER_OPPDRAG) .medSteg(BehandlingStegType.FORESLÅ_VEDTAK) diff --git a/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/RapportertInntektMapper.java b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/RapportertInntektMapper.java index 3403a622ce..cb01f1795f 100644 --- a/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/RapportertInntektMapper.java +++ b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/RapportertInntektMapper.java @@ -1,22 +1,31 @@ package no.nav.ung.sak.ytelse; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Set; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import jakarta.enterprise.context.Dependent; import jakarta.inject.Inject; +import no.nav.fpsak.tidsserie.LocalDateInterval; import no.nav.fpsak.tidsserie.LocalDateSegment; import no.nav.fpsak.tidsserie.LocalDateTimeline; import no.nav.fpsak.tidsserie.StandardCombinators; +import no.nav.ung.kodeverk.arbeidsforhold.InntektspostType; import no.nav.ung.sak.domene.arbeidsforhold.InntektArbeidYtelseTjeneste; import no.nav.ung.sak.domene.iay.modell.InntektArbeidYtelseGrunnlag; +import no.nav.ung.sak.domene.iay.modell.Inntektspost; +import no.nav.ung.sak.domene.iay.modell.OppgittArbeidsforhold; import no.nav.ung.sak.domene.iay.modell.OppgittOpptjening; +import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; +import no.nav.ung.sak.domene.typer.tid.Virkedager; +import no.nav.ung.sak.ytelse.uttalelse.BrukersUttalelseForRegisterinntekt; +import no.nav.ung.sak.ytelse.uttalelse.BrukersUttalelsePeriode; +import no.nav.ung.sak.ytelse.uttalelse.Status; +import no.nav.ung.sak.ytelseperioder.YtelseperiodeUtleder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; @Dependent public class RapportertInntektMapper { @@ -24,47 +33,183 @@ public class RapportertInntektMapper { private static final Logger LOGGER = LoggerFactory.getLogger(RapportertInntektMapper.class); private final InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste; + private final YtelseperiodeUtleder ytelseperiodeUtleder; @Inject - public RapportertInntektMapper(InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste) { + public RapportertInntektMapper(InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste, YtelseperiodeUtleder ytelseperiodeUtleder) { this.inntektArbeidYtelseTjeneste = inntektArbeidYtelseTjeneste; + this.ytelseperiodeUtleder = ytelseperiodeUtleder; } - public LocalDateTimeline map(Long behandlingId) { + public LocalDateTimeline mapAlleGjeldendeRegisterOgBrukersInntekter(Long behandlingId) { // Henter iay-grunnlag (kall til abakus) final var iayGrunnlag = inntektArbeidYtelseTjeneste.hentGrunnlag(behandlingId); + final var ytelseTidslinje = ytelseperiodeUtleder.utledYtelsestidslinje(behandlingId); + + + final var brukersRapporterteInntekter = finnBrukersRapporterteInntekter(iayGrunnlag, ytelseTidslinje); + validerBrukersRapporterteInntekterTidslinje(brukersRapporterteInntekter, ytelseTidslinje); + + final var grupperteInntekter = grupperInntekter(iayGrunnlag); + + final var registerTidslinje = finnRegisterInntektTidslinje(ytelseTidslinje, grupperteInntekter); + return kombinerTidslinjer(brukersRapporterteInntekter, registerTidslinje); + + } + + public LocalDateTimeline finnRegisterinntekterForUttalelse(Long behandlingId, + List brukersUttalelsePerioder) { + final var relevanteUttalelser = brukersUttalelsePerioder.stream() + .filter(it -> Set.of(Status.BEKREFTET, Status.VENTER).contains(it.status())).toList(); + final var unikeGrunnlagsIder = relevanteUttalelser + .stream() + .map(no.nav.ung.sak.ytelse.uttalelse.BrukersUttalelsePeriode::iayGrunnlagUUID) + .collect(Collectors.toSet()); + + final var grunnlagPrUUID = unikeGrunnlagsIder.stream().collect(Collectors.toMap(it -> it, it -> inntektArbeidYtelseTjeneste.hentGrunnlagForGrunnlagId(behandlingId, it))); + + return relevanteUttalelser.stream() + .map(it -> finnRegisterinntekterVurdertIUttalelse(it, grunnlagPrUUID)) + .reduce(LocalDateTimeline::crossJoin) + .orElse(LocalDateTimeline.empty()); + + } + + private Map> grupperInntekter(InntektArbeidYtelseGrunnlag iayGrunnlag) { + return iayGrunnlag.getRegisterVersjon().stream().flatMap(it -> it.getAktørInntekt().stream()) + .flatMap(it -> it.getInntekt().stream()) + .flatMap(it -> it.getAlleInntektsposter().stream()) + .collect(Collectors.groupingBy(this::mapTilInntektType)); + } + + private LocalDateTimeline finnRegisterinntekterVurdertIUttalelse(BrukersUttalelsePeriode it, Map grunnlagPrUUID) { + final var iayGrunnlag = grunnlagPrUUID.get(it.iayGrunnlagUUID()); + final var grupperteInntekter = grupperInntekter(iayGrunnlag); + final var registerTidslinje = finnRegisterinntektForPeriode(grupperteInntekter, it.periode().toLocalDateInterval()); + return registerTidslinje.mapValue(registerinntekter -> new BrukersUttalelseForRegisterinntekt(it.status(), registerinntekter, it.uttalelse())); + } + + private static LocalDateTimeline> finnRegisterInntektTidslinje(LocalDateTimeline ytelseTidslinje, Map> grupperteInntekter) { + final var registerTidslinje = new LocalDateTimeline>(Set.of()); + + for (var intervall : ytelseTidslinje.getLocalDateIntervals()) { + + final var tidslinjeForPeriode = finnRegisterinntektForPeriode(grupperteInntekter, intervall); + registerTidslinje.crossJoin(tidslinjeForPeriode); + + } + return registerTidslinje; + } + + private static LocalDateTimeline> finnRegisterinntektForPeriode(Map> grupperteInntekter, LocalDateInterval intervall) { + final var inntekterForPeriode = new HashSet(); + + final var overlappendeArbeidsinntekter = finnOverlappendeInntekterForType(intervall, grupperteInntekter, InntektType.ARBEIDSTAKER_ELLER_FRILANSER); + + overlappendeArbeidsinntekter + .stream() + .map(it -> finnBeløpInnenforPeriode(intervall, it)) + .reduce(BigDecimal::add) + .map(it -> new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, it)) + .ifPresent(inntekterForPeriode::add); + + final var overlappendeYtelse = finnOverlappendeInntekterForType(intervall, grupperteInntekter, InntektType.YTELSE); + overlappendeYtelse + .stream() + .map(it -> finnBeløpInnenforPeriode(intervall, it)) + .reduce(BigDecimal::add) + .map(it -> new RapportertInntekt(InntektType.YTELSE, it)) + .ifPresent(inntekterForPeriode::add); + + + final var tidslinjeForPeriode = new LocalDateTimeline>(intervall, inntekterForPeriode); + return tidslinjeForPeriode; + } + + private static void validerBrukersRapporterteInntekterTidslinje(LocalDateTimeline> brukersRapporterteInntekter, LocalDateTimeline ytelseTidslinje) { + final var perioderUtenforYtelsesperioder = brukersRapporterteInntekter.getLocalDateIntervals().stream() + .filter(it -> ytelseTidslinje.getLocalDateIntervals().stream().noneMatch(it::equals)) + .toList(); + + if (!perioderUtenforYtelsesperioder.isEmpty()) { + throw new IllegalStateException("Fant rapporterte inntekter for perioder utenfor ytelsesperioder: " + perioderUtenforYtelsesperioder); + + } + } + + private static LocalDateTimeline kombinerTidslinjer(LocalDateTimeline> brukersRapporterteInntekter, LocalDateTimeline> registerTidslinje) { + return brukersRapporterteInntekter.crossJoin(registerTidslinje, (di, bruker, register) -> { + final var rapporterteInntekter = new RapporterteInntekter(bruker == null ? Set.of() : bruker.getValue(), register == null ? Set.of() : register.getValue()); + return new LocalDateSegment<>(di, rapporterteInntekter); + }); + } + + private static BigDecimal finnBeløpInnenforPeriode(LocalDateInterval intervall, Inntektspost it) { + final var inntektsperiode = it.getPeriode(); + final var overlapp = new LocalDateTimeline<>(intervall, true).intersection(new LocalDateInterval(inntektsperiode.getFomDato(), inntektsperiode.getTomDato())); + final var overlappPeriode = overlapp.getLocalDateIntervals().getFirst(); + + final var antallVirkedager = inntektsperiode.antallArbeidsdager(); + final var overlappAntallVirkedager = Virkedager.beregnAntallVirkedager(overlappPeriode.getFomDato(), overlappPeriode.getTomDato()); + + return it.getBeløp().getVerdi().multiply(BigDecimal.valueOf(overlappAntallVirkedager).divide(BigDecimal.valueOf(antallVirkedager), 10, RoundingMode.HALF_UP)); + } + + private static List finnOverlappendeInntekterForType(LocalDateInterval intervall, Map> grupperteInntekter, InntektType inntektType) { + return grupperteInntekter.getOrDefault(inntektType, List.of()) + .stream().filter(it -> intervall.overlaps(new LocalDateInterval(it.getPeriode().getFomDato(), it.getPeriode().getTomDato()))) + .toList(); + } + + private InntektType mapTilInntektType(Inntektspost it) { + if (it.getInntektspostType().equals(InntektspostType.LØNN)) { + return InntektType.ARBEIDSTAKER_ELLER_FRILANSER; + } else if (it.getInntektspostType().equals(InntektspostType.YTELSE)) { + return InntektType.YTELSE; + } + throw new IllegalArgumentException("Kunne ikke håndtere inntektsposttype: " + it.getInntektspostType()); + } + + private LocalDateTimeline> finnBrukersRapporterteInntekter(InntektArbeidYtelseGrunnlag iayGrunnlag, LocalDateTimeline ytelseTidslinje) { // Finner rapporterte inntekter pr journalpost sortert på mottattdato med siste mottatt journalpost først - final var sorterteInntekttidslinjerPåMottattdato = finnSorterteInntektstidslinjer(iayGrunnlag); + final var sorterteInntekttidslinjerPåMottattdato = finnSorterteInntektstidslinjer(iayGrunnlag, ytelseTidslinje); - var resultatTidslinje = new LocalDateTimeline(List.of()); + var brukersRapporterteInntekter = new LocalDateTimeline>(List.of()); for (InntektForMottattidspunkt journalpostMedInntekttidslinje : sorterteInntekttidslinjerPåMottattdato) { // Dersom vi ikke allerede har lagt til en rapportert inntekt for perioden legger vi den til i resultattidslinjen - if (!resultatTidslinje.intersects(journalpostMedInntekttidslinje.tidslinje())) { + if (!brukersRapporterteInntekter.intersects(journalpostMedInntekttidslinje.tidslinje())) { // Trenger ikkje å håndtere overlapp sidan vi aldri går inn her med overlapp - resultatTidslinje = resultatTidslinje.crossJoin(journalpostMedInntekttidslinje.tidslinje()); + brukersRapporterteInntekter = brukersRapporterteInntekter.crossJoin(journalpostMedInntekttidslinje.tidslinje()); LOGGER.info("Fant rapportert inntekt for periode: " + journalpostMedInntekttidslinje); } else { LOGGER.info("Fant inntekt som ble forkastet pga overlapp med senere rapportert inntekt for samme periode: " + journalpostMedInntekttidslinje); } } - - return resultatTidslinje; + return brukersRapporterteInntekter; } - private List finnSorterteInntektstidslinjer(InntektArbeidYtelseGrunnlag iayGrunnlag) { + private List finnSorterteInntektstidslinjer(InntektArbeidYtelseGrunnlag iayGrunnlag, LocalDateTimeline ytelseTidslinje) { return iayGrunnlag.getOppgittOpptjeningAggregat() .stream() - .flatMap(o -> o.getOppgitteOpptjeninger().stream().map(RapportertInntektMapper::finnInntekterPrMottattidspunkt)) + .flatMap(o -> o.getOppgitteOpptjeninger().stream()) + .filter(o -> erRapportertForGyldigPeriode(o, ytelseTidslinje)) + .map(RapportertInntektMapper::finnInntekterPrMottattidspunkt) .sorted(Comparator.reverseOrder()) .toList(); } + private boolean erRapportertForGyldigPeriode(OppgittOpptjening o, LocalDateTimeline ytelseTidslinje) { + return o.getOppgittArbeidsforhold().stream().map(OppgittArbeidsforhold::getPeriode) + .map(DatoIntervallEntitet::toLocalDateInterval) + .allMatch(p -> ytelseTidslinje.getLocalDateIntervals().stream().anyMatch(p::equals)); + } + private static InntektForMottattidspunkt finnInntekterPrMottattidspunkt(OppgittOpptjening o) { final var res = new ArrayList>>(); res.addAll(finnArbeidOgFrilansSegmenter(o)); res.addAll(finnNæringssegmenter(o)); - return new InntektForMottattidspunkt(o.getInnsendingstidspunkt(), new LocalDateTimeline<>(res, StandardCombinators::union).mapValue(RapporterteInntekter::new)); + return new InntektForMottattidspunkt(o.getInnsendingstidspunkt(), new LocalDateTimeline<>(res, StandardCombinators::union)); } private static List>> finnNæringssegmenter(OppgittOpptjening o) { @@ -88,7 +233,7 @@ private static List>> finnArbeidOgFrilan } private record InntektForMottattidspunkt(LocalDateTime mottattTidspunkt, - LocalDateTimeline tidslinje + LocalDateTimeline> tidslinje ) implements Comparable { @Override diff --git a/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/RapporterteInntekter.java b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/RapporterteInntekter.java index 2c9df5d4bc..adaf77faca 100644 --- a/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/RapporterteInntekter.java +++ b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/RapporterteInntekter.java @@ -5,33 +5,39 @@ public class RapporterteInntekter { - private Set rapporterteInntekter; + private Set brukerRapporterteInntekter; + private Set registerRapporterteInntekter; - public RapporterteInntekter(Set rapporterteInntekter) { - this.rapporterteInntekter = rapporterteInntekter; + public RapporterteInntekter(Set brukerRapporterteInntekter, Set registerRapporterteInntekter) { + this.brukerRapporterteInntekter = brukerRapporterteInntekter; + this.registerRapporterteInntekter = registerRapporterteInntekter; } - public Set getRapporterteInntekter() { - return rapporterteInntekter; + public Set getBrukerRapporterteInntekter() { + return brukerRapporterteInntekter; + } + + public Set getRegisterRapporterteInntekter() { + return registerRapporterteInntekter; } @Override public boolean equals(Object o) { if (!(o instanceof RapporterteInntekter that)) return false; - return Objects.equals(rapporterteInntekter, that.rapporterteInntekter); + return Objects.equals(brukerRapporterteInntekter, that.brukerRapporterteInntekter) && Objects.equals(registerRapporterteInntekter, that.registerRapporterteInntekter); } @Override public int hashCode() { - return Objects.hashCode(rapporterteInntekter); + return Objects.hash(brukerRapporterteInntekter, registerRapporterteInntekter); } @Override public String toString() { return "RapporterteInntekter{" + - "rapporterteInntekter=" + rapporterteInntekter + + "brukerRapporterteInntekter=" + brukerRapporterteInntekter + + ", registerRapporterteInntekter=" + registerRapporterteInntekter + '}'; } - } diff --git a/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/BrukersUttalelseForRegisterinntekt.java b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/BrukersUttalelseForRegisterinntekt.java new file mode 100644 index 0000000000..6a8da6956c --- /dev/null +++ b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/BrukersUttalelseForRegisterinntekt.java @@ -0,0 +1,8 @@ +package no.nav.ung.sak.ytelse.uttalelse; + +import no.nav.ung.sak.ytelse.RapportertInntekt; + +import java.util.Set; + +public record BrukersUttalelseForRegisterinntekt(Status status, Set registerInntekt, Uttalelse uttalelse) { +} diff --git a/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/BrukersUttalelsePeriode.java b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/BrukersUttalelsePeriode.java new file mode 100644 index 0000000000..e3b0afa2f2 --- /dev/null +++ b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/BrukersUttalelsePeriode.java @@ -0,0 +1,10 @@ +package no.nav.ung.sak.ytelse.uttalelse; + + +import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; + +import java.util.UUID; + +public record BrukersUttalelsePeriode(DatoIntervallEntitet periode, Status status, Uttalelse uttalelse, UUID iayGrunnlagUUID) { + +} diff --git a/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/RegisterinntektUttalelseTjeneste.java b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/RegisterinntektUttalelseTjeneste.java new file mode 100644 index 0000000000..bb38067432 --- /dev/null +++ b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/RegisterinntektUttalelseTjeneste.java @@ -0,0 +1,10 @@ +package no.nav.ung.sak.ytelse.uttalelse; + +import java.util.List; + +public interface RegisterinntektUttalelseTjeneste { + + + List hentUttalelser(Long behandlingId); + +} diff --git a/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/RegisterinntektUttalelseTjenesteImpl.java b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/RegisterinntektUttalelseTjenesteImpl.java new file mode 100644 index 0000000000..957cf6fa96 --- /dev/null +++ b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/RegisterinntektUttalelseTjenesteImpl.java @@ -0,0 +1,13 @@ +package no.nav.ung.sak.ytelse.uttalelse; + +import jakarta.enterprise.context.Dependent; + +import java.util.List; + +@Dependent +public class RegisterinntektUttalelseTjenesteImpl implements RegisterinntektUttalelseTjeneste { + @Override + public List hentUttalelser(Long behandlingId) { + return List.of(); + } +} diff --git a/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/Status.java b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/Status.java new file mode 100644 index 0000000000..4dc1402167 --- /dev/null +++ b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/Status.java @@ -0,0 +1,7 @@ +package no.nav.ung.sak.ytelse.uttalelse; + +public enum Status { + VENTER, + BEKREFTET, + UTLØPT +} diff --git a/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/Uttalelse.java b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/Uttalelse.java new file mode 100644 index 0000000000..10b186847c --- /dev/null +++ b/domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/uttalelse/Uttalelse.java @@ -0,0 +1,4 @@ +package no.nav.ung.sak.ytelse.uttalelse; + +public record Uttalelse(boolean erEndringenGodkjent) { +} diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/EndringRapportertInntektInnholdBygger.java b/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/EndringRapportertInntektInnholdBygger.java index 28d4f0f741..db65563c4e 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/EndringRapportertInntektInnholdBygger.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/EndringRapportertInntektInnholdBygger.java @@ -55,7 +55,7 @@ public TemplateInnholdResultat bygg(Behandling behandling, LocalDateTimeline mapTilTemplateDto( Objects.requireNonNull(rhs, "Mangler sats og rapportert inntekt for periode %s for tilkjent ytelse %s" .formatted(p.toString(), ty.toString())); - var rapportertInntektSum = rhs.getValue().getRapporterteInntekter().stream() + var rapportertInntektSum = rhs.getValue().getBrukerRapporterteInntekter().stream() .map(RapportertInntekt::beløp).reduce(BigDecimal.ZERO, BigDecimal::add); return new LocalDateSegment<>(p, diff --git a/formidling/src/test/java/no/nav/ung/sak/formidling/BrevGenerererTjenesteEndringInntektTest.java b/formidling/src/test/java/no/nav/ung/sak/formidling/BrevGenerererTjenesteEndringInntektTest.java index eb6fc0dd91..27080c3d9c 100644 --- a/formidling/src/test/java/no/nav/ung/sak/formidling/BrevGenerererTjenesteEndringInntektTest.java +++ b/formidling/src/test/java/no/nav/ung/sak/formidling/BrevGenerererTjenesteEndringInntektTest.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.time.LocalDate; +import no.nav.ung.sak.ytelseperioder.YtelseperiodeUtleder; import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; @@ -93,7 +94,7 @@ private BrevGenerererTjeneste lagBrevGenererTjeneste(boolean ignorePdf) { var endringInnholdBygger = new EndringRapportertInntektInnholdBygger(tilkjentYtelseRepository, - new RapportertInntektMapper(abakusInMemoryInntektArbeidYtelseTjeneste) + new RapportertInntektMapper(abakusInMemoryInntektArbeidYtelseTjeneste, new YtelseperiodeUtleder(new UngdomsprogramPeriodeTjeneste(ungdomsprogramPeriodeRepository), repositoryProvider.getBehandlingRepository())) ); var detaljertResultatUtleder = new DetaljertResultatUtlederImpl( diff --git a/kodeverk/src/main/java/no/nav/ung/kodeverk/behandling/BehandlingStegType.java b/kodeverk/src/main/java/no/nav/ung/kodeverk/behandling/BehandlingStegType.java index e4d897b109..1d9fb77031 100644 --- a/kodeverk/src/main/java/no/nav/ung/kodeverk/behandling/BehandlingStegType.java +++ b/kodeverk/src/main/java/no/nav/ung/kodeverk/behandling/BehandlingStegType.java @@ -91,7 +91,8 @@ public enum BehandlingStegType implements Kodeverdi { MANUELL_TILKJENNING_YTELSE("MANUELL_TILKJENNING_YTELSE", "Manuell tilkjenning av ytelse", UTREDES), OVERGANG_FRA_INFOTRYGD("OVERGANG_FRA_INFOTRYGD", "Direkte overgang fra infotrygd", UTREDES), VURDER_UNGDOMSPROGRAMVILKÅR("VURDER_UNGDOMSPROGRAMVILKÅR", "Vurder deltakelse i ungdomsprogrammet", UTREDES), - UNGDOMSYTELSE_BEREGNING("UNGDOMSYTELSE_BEREGNING", "Beregner sats for ungdomsytelsen", UTREDES); + UNGDOMSYTELSE_BEREGNING("UNGDOMSYTELSE_BEREGNING", "Beregner sats for ungdomsytelsen", UTREDES), + KONTROLLER_REGISTER_INNTEKT("KONTROLLER_REGISTER_INNTEKT", "Kontroller brukers rapporterte inntekt mot registerinntekt", UTREDES); private static final Map KODER = new LinkedHashMap<>(); diff --git a/web/src/main/resources/openapi-ts-client/ung-sak.openapi.json b/web/src/main/resources/openapi-ts-client/ung-sak.openapi.json index dfddb365f3..e211cf118d 100644 --- a/web/src/main/resources/openapi-ts-client/ung-sak.openapi.json +++ b/web/src/main/resources/openapi-ts-client/ung-sak.openapi.json @@ -1047,9 +1047,9 @@ "x-enum-varnames" : [ "STARTET", "INNGANG", "UTGANG", "VENTER", "AVBRUTT", "UTFØRT", "FREMOVERFØRT", "TILBAKEFØRT", "UDEFINERT" ] }, "BehandlingStegTilstandDtoStegType" : { - "enum" : [ "BERYT", "PRECONDITION_BERGRUNN", "FAST_BERGRUNN", "VURDER_OPPTJ_PERIODE", "FASTSETT_STP_BER", "FVEDSTEG", "VURDER_VILKAR_BERGRUNN", "VURDER_REF_BERGRUNN", "FORDEL_BERGRUNN", "FORBRES", "FORS_BERGRUNN", "FORS_BERGRUNN_2", "VURDER_MANUELT_BREV", "FORVEDSTEG", "BERYT_OPPDRAG", "VURDER_SØKNADSFRIST", "INIT_PERIODER", "INIT_VILKÅR", "INPER", "INREG", "INSØK", "INREG_AVSL", "IVEDSTEG", "KOFAK", "KOARB", "KOMPLETT_FOR_BEREGNING", "INNINN", "KOFAKBER", "KOFAKUT", "KOFAK_LOP_MEDL", "VURDEROP", "SIMOPP", "START", "VRSLREV", "VULOMED", "VURDER_FARESIGNALER", "VURDINNSYN", "VURDERKOMPLETT", "VURDER_STARTDATO_UTTAKSREGLER", "VURDER_TILKOMMET_INNTEKT", "POSTCONDITION_KOMPLETTHET", "VARIANT_FILTER", "VURDER_MEDISINSK", "VURDER_NODVENDIGHET", "VURDER_INSTITUSJON", "VURDER_GJENNOMGATT_OPPLAERING", "POST_MEDISINSK", "VURDERMV", "VURDER_OMSORG_FOR", "VURDER_ALDER", "VURDER_ALDER_BARN", "VURDER_OPPTJ_FAKTA", "VURDER_OPPTJ", "VURDER_TILBAKETREKK", "VURDER_UTLAND", "VURDER_UTTAK", "VURDER_UTTAK_V2", "BEKREFT_UTTAK", "MANUELL_VILKÅRSVURDERING", "MANUELL_TILKJENNING_YTELSE", "OVERGANG_FRA_INFOTRYGD", "VURDER_UNGDOMSPROGRAMVILKÅR", "UNGDOMSYTELSE_BEREGNING" ], + "enum" : [ "BERYT", "PRECONDITION_BERGRUNN", "FAST_BERGRUNN", "VURDER_OPPTJ_PERIODE", "FASTSETT_STP_BER", "FVEDSTEG", "VURDER_VILKAR_BERGRUNN", "VURDER_REF_BERGRUNN", "FORDEL_BERGRUNN", "FORBRES", "FORS_BERGRUNN", "FORS_BERGRUNN_2", "VURDER_MANUELT_BREV", "FORVEDSTEG", "BERYT_OPPDRAG", "VURDER_SØKNADSFRIST", "INIT_PERIODER", "INIT_VILKÅR", "INPER", "INREG", "INSØK", "INREG_AVSL", "IVEDSTEG", "KOFAK", "KOARB", "KOMPLETT_FOR_BEREGNING", "INNINN", "KOFAKBER", "KOFAKUT", "KOFAK_LOP_MEDL", "VURDEROP", "SIMOPP", "START", "VRSLREV", "VULOMED", "VURDER_FARESIGNALER", "VURDINNSYN", "VURDERKOMPLETT", "VURDER_STARTDATO_UTTAKSREGLER", "VURDER_TILKOMMET_INNTEKT", "POSTCONDITION_KOMPLETTHET", "VARIANT_FILTER", "VURDER_MEDISINSK", "VURDER_NODVENDIGHET", "VURDER_INSTITUSJON", "VURDER_GJENNOMGATT_OPPLAERING", "POST_MEDISINSK", "VURDERMV", "VURDER_OMSORG_FOR", "VURDER_ALDER", "VURDER_ALDER_BARN", "VURDER_OPPTJ_FAKTA", "VURDER_OPPTJ", "VURDER_TILBAKETREKK", "VURDER_UTLAND", "VURDER_UTTAK", "VURDER_UTTAK_V2", "BEKREFT_UTTAK", "MANUELL_VILKÅRSVURDERING", "MANUELL_TILKJENNING_YTELSE", "OVERGANG_FRA_INFOTRYGD", "VURDER_UNGDOMSPROGRAMVILKÅR", "UNGDOMSYTELSE_BEREGNING", "KONTROLLER_REGISTER_INNTEKT" ], "type" : "string", - "x-enum-varnames" : [ "BEREGN_YTELSE", "PRECONDITION_BEREGNING", "FASTSETT_BEREGNINGSGRUNNLAG", "FASTSETT_OPPTJENINGSPERIODE", "FASTSETT_SKJÆRINGSTIDSPUNKT_BEREGNING", "FATTE_VEDTAK", "VURDER_VILKAR_BERGRUNN", "VURDER_REF_BERGRUNN", "FORDEL_BEREGNINGSGRUNNLAG", "FORESLÅ_BEHANDLINGSRESULTAT", "FORESLÅ_BEREGNINGSGRUNNLAG", "FORTSETT_FORESLÅ_BEREGNINGSGRUNNLAG", "VURDER_MANUELT_BREV", "FORESLÅ_VEDTAK", "HINDRE_TILBAKETREKK", "VURDER_SØKNADSFRIST", "INIT_PERIODER", "INIT_VILKÅR", "INNHENT_PERSONOPPLYSNINGER", "INNHENT_REGISTEROPP", "INNHENT_SØKNADOPP", "INREG_AVSL", "IVERKSETT_VEDTAK", "KONTROLLER_FAKTA", "KONTROLLER_FAKTA_ARBEIDSFORHOLD", "VURDER_KOMPLETTHET_BEREGNING", "INNHENT_INNTEKTSMELDING", "KONTROLLER_FAKTA_BEREGNING", "KONTROLLER_FAKTA_UTTAK", "KONTROLLER_LØPENDE_MEDLEMSKAP", "KONTROLLERER_SØKERS_OPPLYSNINGSPLIKT", "SIMULER_OPPDRAG", "START_STEG", "VARSEL_REVURDERING", "VULOMED", "VURDER_FARESIGNALER", "VURDER_INNSYN", "VURDER_KOMPLETTHET", "VURDER_STARTDATO_UTTAKSREGLER", "VURDER_TILKOMMET_INNTEKT", "POSTCONDITION_KOMPLETTHET", "VARIANT_FILTER", "VURDER_MEDISINSKE_VILKÅR", "VURDER_NØDVENDIGHETS_VILKÅR", "VURDER_INSTITUSJON_VILKÅR", "VURDER_GJENNOMGÅTT_OPPLÆRING", "POST_VURDER_MEDISINSKVILKÅR", "VURDER_MEDLEMSKAPVILKÅR", "VURDER_OMSORG_FOR", "ALDERSVILKÅRET", "VURDER_ALDERSVILKÅR_BARN", "VURDER_OPPTJENING_FAKTA", "VURDER_OPPTJENINGSVILKÅR", "VURDER_TILBAKETREKK", "VURDER_UTLAND", "VURDER_UTTAK", "VURDER_UTTAK_V2", "BEKREFT_UTTAK", "MANUELL_VILKÅRSVURDERING", "MANUELL_TILKJENNING_YTELSE", "OVERGANG_FRA_INFOTRYGD", "VURDER_UNGDOMSPROGRAMVILKÅR", "UNGDOMSYTELSE_BEREGNING" ] + "x-enum-varnames" : [ "BEREGN_YTELSE", "PRECONDITION_BEREGNING", "FASTSETT_BEREGNINGSGRUNNLAG", "FASTSETT_OPPTJENINGSPERIODE", "FASTSETT_SKJÆRINGSTIDSPUNKT_BEREGNING", "FATTE_VEDTAK", "VURDER_VILKAR_BERGRUNN", "VURDER_REF_BERGRUNN", "FORDEL_BEREGNINGSGRUNNLAG", "FORESLÅ_BEHANDLINGSRESULTAT", "FORESLÅ_BEREGNINGSGRUNNLAG", "FORTSETT_FORESLÅ_BEREGNINGSGRUNNLAG", "VURDER_MANUELT_BREV", "FORESLÅ_VEDTAK", "HINDRE_TILBAKETREKK", "VURDER_SØKNADSFRIST", "INIT_PERIODER", "INIT_VILKÅR", "INNHENT_PERSONOPPLYSNINGER", "INNHENT_REGISTEROPP", "INNHENT_SØKNADOPP", "INREG_AVSL", "IVERKSETT_VEDTAK", "KONTROLLER_FAKTA", "KONTROLLER_FAKTA_ARBEIDSFORHOLD", "VURDER_KOMPLETTHET_BEREGNING", "INNHENT_INNTEKTSMELDING", "KONTROLLER_FAKTA_BEREGNING", "KONTROLLER_FAKTA_UTTAK", "KONTROLLER_LØPENDE_MEDLEMSKAP", "KONTROLLERER_SØKERS_OPPLYSNINGSPLIKT", "SIMULER_OPPDRAG", "START_STEG", "VARSEL_REVURDERING", "VULOMED", "VURDER_FARESIGNALER", "VURDER_INNSYN", "VURDER_KOMPLETTHET", "VURDER_STARTDATO_UTTAKSREGLER", "VURDER_TILKOMMET_INNTEKT", "POSTCONDITION_KOMPLETTHET", "VARIANT_FILTER", "VURDER_MEDISINSKE_VILKÅR", "VURDER_NØDVENDIGHETS_VILKÅR", "VURDER_INSTITUSJON_VILKÅR", "VURDER_GJENNOMGÅTT_OPPLÆRING", "POST_VURDER_MEDISINSKVILKÅR", "VURDER_MEDLEMSKAPVILKÅR", "VURDER_OMSORG_FOR", "ALDERSVILKÅRET", "VURDER_ALDERSVILKÅR_BARN", "VURDER_OPPTJENING_FAKTA", "VURDER_OPPTJENINGSVILKÅR", "VURDER_TILBAKETREKK", "VURDER_UTLAND", "VURDER_UTTAK", "VURDER_UTTAK_V2", "BEKREFT_UTTAK", "MANUELL_VILKÅRSVURDERING", "MANUELL_TILKJENNING_YTELSE", "OVERGANG_FRA_INFOTRYGD", "VURDER_UNGDOMSPROGRAMVILKÅR", "UNGDOMSYTELSE_BEREGNING", "KONTROLLER_REGISTER_INNTEKT" ] }, "BehandlingsresultatDto" : { "properties" : {