diff --git a/behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/tilkjentytelse/KontrollertInntektPeriode.java b/behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/tilkjentytelse/KontrollertInntektPeriode.java index 2b5cbf6b26..b4dfbbaf70 100644 --- a/behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/tilkjentytelse/KontrollertInntektPeriode.java +++ b/behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/tilkjentytelse/KontrollertInntektPeriode.java @@ -32,9 +32,15 @@ public class KontrollertInntektPeriode extends BaseEntitet { @Column(name = "rapportert_inntekt") private BigDecimal rapportertInntekt; + @Column(name = "rapportert_inntekt_pr_mnd") + private BigDecimal rapportertInntektPrMnd; + @Column(name = "register_inntekt") private BigDecimal registerInntekt; + @Column(name = "register_inntekt_pr_mnd") + private BigDecimal registerInntektPrMnd; + @Convert(converter = KontrollertInntektKildeKodeverdiConverter.class) @Column(name = "kilde", nullable = false) private KontrollertInntektKilde kilde; @@ -67,7 +73,9 @@ public KontrollertInntektPeriode(KontrollertInntektPeriode eksisterende) { private KontrollertInntektPeriode(DatoIntervallEntitet periode, BigDecimal inntekt, BigDecimal rapportertInntekt, + BigDecimal rapportertInntektPrMnd, BigDecimal registerInntekt, + BigDecimal registerInntektPrMnd, KontrollertInntektKilde kilde, boolean erManueltVurdert, String begrunnelse) { @@ -77,7 +85,9 @@ private KontrollertInntektPeriode(DatoIntervallEntitet periode, this.erManueltVurdert = erManueltVurdert; this.begrunnelse = begrunnelse; this.registerInntekt = registerInntekt; + this.registerInntektPrMnd = registerInntektPrMnd; this.rapportertInntekt = rapportertInntekt; + this.rapportertInntektPrMnd = rapportertInntektPrMnd; } public Long getId() { @@ -131,7 +141,9 @@ public static class Builder { private DatoIntervallEntitet periode; private BigDecimal inntekt; private BigDecimal rapportertInntekt; + private BigDecimal rapportertInntektPrMnd; private BigDecimal registerInntekt; + private BigDecimal registerInntektPrMnd; private KontrollertInntektKilde kilde; private boolean erManueltVurdert; private String begrunnelse; @@ -157,11 +169,21 @@ public Builder medRapportertInntekt(BigDecimal rapportertInntekt) { return this; } + public Builder medRapportertInntektPrMnd(BigDecimal rapportertInntektPrMnd) { + this.rapportertInntektPrMnd = rapportertInntektPrMnd; + return this; + } + public Builder medRegisterInntekt(BigDecimal registerInntekt) { this.registerInntekt = registerInntekt; return this; } + public Builder medRegisterInntektPrMnd(BigDecimal registerInntektPrMnd) { + this.registerInntektPrMnd = registerInntektPrMnd; + return this; + } + public Builder medKilde(KontrollertInntektKilde kilde) { this.kilde = kilde; return this; @@ -179,10 +201,9 @@ public Builder medBegrunnelse(String begrunnelse) { public KontrollertInntektPeriode build() { - return new KontrollertInntektPeriode(periode, inntekt, rapportertInntekt, registerInntekt, kilde, erManueltVurdert, begrunnelse); + return new KontrollertInntektPeriode(periode, inntekt, rapportertInntekt, rapportertInntektPrMnd, registerInntekt, registerInntektPrMnd, kilde, erManueltVurdert, begrunnelse); } - } } diff --git a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/kompletthet/registerinntektkontroll/EtterlysningutlederKontrollerInntektTest.java b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/kompletthet/registerinntektkontroll/EtterlysningutlederKontrollerInntektTest.java index 3f8a51b2fd..553b305fcd 100644 --- a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/kompletthet/registerinntektkontroll/EtterlysningutlederKontrollerInntektTest.java +++ b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/kompletthet/registerinntektkontroll/EtterlysningutlederKontrollerInntektTest.java @@ -34,7 +34,7 @@ class EtterlysningutlederKontrollerInntektTest { LocalDateTimeline> prosessTriggerTidslinje = lagProsesstriggerTidslinjeForInntektRapporteringOgKontroll(fom, tom); final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinjeMedDiffMotRegister(fom, tom, register, bruker); LocalDateTimeline ikkeGodkjentUttalelseTidslinje = new LocalDateTimeline<>(fom, tom, - new EtterlysningOgRegisterinntekt(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(registerFraUttalelse))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.MOTTATT_SVAR, false))); + new EtterlysningOgRegisterinntekt(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(registerFraUttalelse), BigDecimal.valueOf(registerFraUttalelse) )), new InntektskontrollEtterlysningInfo(EtterlysningStatus.MOTTATT_SVAR, false))); // Act var resultat = utfør(prosessTriggerTidslinje, gjeldendeRapporterteInntekter, ikkeGodkjentUttalelseTidslinje); @@ -132,7 +132,7 @@ void skal_ikke_opprette_etterlysning_dersom_bruker_ikke_har_godkjent_ytelse_og_i final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinjeMedDiffMotRegister(fom, tom, 0, 1001, 0); LocalDateTimeline ikkeGodkjentUttalelseTidslinje = new LocalDateTimeline<>( fom, tom, - new EtterlysningOgRegisterinntekt(Set.of(new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(1001))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.MOTTATT_SVAR, false)) + new EtterlysningOgRegisterinntekt(Set.of(new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(1001), BigDecimal.valueOf(1001))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.MOTTATT_SVAR, false)) ); // Act @@ -151,7 +151,7 @@ void skal_ikke_opprette_etterlysning_dersom_bruker_har_godkjent_ytelse_og_inntek final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinjeMedDiffMotRegister(fom, tom, 0, 1001, 0); LocalDateTimeline godkjentUttalelseTidslinje = new LocalDateTimeline<>( fom, tom, - new EtterlysningOgRegisterinntekt(Set.of(new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(1001))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.MOTTATT_SVAR, true)) + new EtterlysningOgRegisterinntekt(Set.of(new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(1001), BigDecimal.valueOf(1001))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.MOTTATT_SVAR, true)) ); // Act @@ -172,8 +172,8 @@ void skal_ikke_opprette_etterlysning_dersom_bruker_tidligere_har_rapportert_innt LocalDateTimeline godkjentUttalelseTidslinje = new LocalDateTimeline<>( fom, tom, new EtterlysningOgRegisterinntekt(Set.of( - new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(2000)), - new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(10_000))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.MOTTATT_SVAR, true)) + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(2000), BigDecimal.valueOf(2000)), + new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(10_000), BigDecimal.valueOf(10_000))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.MOTTATT_SVAR, true)) ); // Act @@ -192,7 +192,7 @@ void skal_ikke_opprette_etterlysning_dersom_bruker_tidligere_har_rapportert_innt LocalDateTimeline> prosessTriggerTidslinje = lagProsesstriggerTidslinjeForKontroll(fom, tom); final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinjeMedDiffMotRegister(fom, tom, 10_000, 11_001); LocalDateTimeline uttalelseTidslinje = new LocalDateTimeline<>(fom, tom, - new EtterlysningOgRegisterinntekt(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(10_002))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.VENTER, null))); + new EtterlysningOgRegisterinntekt(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(10_002), BigDecimal.valueOf(10_002))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.VENTER, null))); // Act var resultat = utfør(prosessTriggerTidslinje, gjeldendeRapporterteInntekter, uttalelseTidslinje); @@ -260,8 +260,8 @@ private static LocalDateTimeline lagRapportertInntektTidsl 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)) + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(bruker), BigDecimal.valueOf(bruker))), Set.of( + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(register), BigDecimal.valueOf(register)) ))) ) ); @@ -273,9 +273,9 @@ private static LocalDateTimeline lagRapportertInntektTidsl 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.YTELSE, BigDecimal.valueOf(registerYtelse)), - new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(registerATFL)) + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(bruker), BigDecimal.valueOf(bruker))), Set.of( + new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(registerYtelse), BigDecimal.valueOf(registerYtelse)), + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(registerATFL), BigDecimal.valueOf(registerATFL)) ))) ) ); diff --git a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/kompletthet/registerinntektkontroll/KontrollerInntektEtterlysningOppretterTest.java b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/kompletthet/registerinntektkontroll/KontrollerInntektEtterlysningOppretterTest.java index f47ae6e7f7..5b17a49f64 100644 --- a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/kompletthet/registerinntektkontroll/KontrollerInntektEtterlysningOppretterTest.java +++ b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/kompletthet/registerinntektkontroll/KontrollerInntektEtterlysningOppretterTest.java @@ -77,7 +77,7 @@ void skal_utlede_resultat_uten_etterlysning_og_lagre_sporing() { // Arrange var fom = LocalDate.now().withDayOfMonth(1); var tom = fom.plusMonths(1).minusDays(1); - var rapporterteInntekter = Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.TEN)); + var rapporterteInntekter = Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.TEN, BigDecimal.TEN)); when(kontrollerInntektInputMapper.mapInput(any())).thenReturn(new KontrollerInntektInput( new LocalDateTimeline<>(fom, tom, true), new LocalDateTimeline<>(fom, tom, new RapporterteInntekter(rapporterteInntekter, rapporterteInntekter)), 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 index 9851ced160..c712141486 100644 --- 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 @@ -30,7 +30,7 @@ void skal_opprette_aksjonspunkt_dersom_bruker_har_uttalelse_og_registerinntekt_e final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinjeMedDiffMotRegister(fom, tom, register, bruker); LocalDateTimeline harUttalelseTidslinje = new LocalDateTimeline<>(fom, tom, new EtterlysningOgRegisterinntekt( - Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(register))), + Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(register), BigDecimal.valueOf(register))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.MOTTATT_SVAR, true) )); @@ -100,7 +100,7 @@ void skal_bruke_brukers_godkjente_inntekt_dersom_bruker_og_har_svart_uten_uttale LocalDateTimeline ikkeGodkjentUttalelseTidslinje = new LocalDateTimeline<>( fom, tom, new EtterlysningOgRegisterinntekt( - Set.of(new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(1001))), + Set.of(new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(1001), BigDecimal.valueOf(1001))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.MOTTATT_SVAR, false) )); @@ -122,8 +122,8 @@ void skal_bruke_brukers_godkjente_inntekt_dersom_bruker_tidligere_har_rapportert fom, tom, new EtterlysningOgRegisterinntekt( Set.of( - new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(2000)), - new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(10_000)) + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(2000), BigDecimal.valueOf(2000)), + new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(10_000), BigDecimal.valueOf(10_000)) ), new InntektskontrollEtterlysningInfo(EtterlysningStatus.MOTTATT_SVAR, false)) ); @@ -177,7 +177,7 @@ void skal_opprette_aksjonspunkt_dersom_ingen_inntekt_i_register_og_rapportert_in LocalDateTimeline> prosessTriggerTidslinje = lagProsesstriggerTidslinjeForInntektRapporteringOgKontroll(fom, tom); final var gjeldendeRapporterteInntekter = lagRapportertInntektTidslinjeMedDiffMotRegister(fom, tom, register, bruker); LocalDateTimeline etterlysningTidslinje = new LocalDateTimeline<>(fom, tom, - new EtterlysningOgRegisterinntekt(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(register))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.UTLØPT, null))); + new EtterlysningOgRegisterinntekt(Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(register), BigDecimal.valueOf(register))), new InntektskontrollEtterlysningInfo(EtterlysningStatus.UTLØPT, null))); // Act var resultat = utfør(prosessTriggerTidslinje, gjeldendeRapporterteInntekter, etterlysningTidslinje); @@ -212,8 +212,8 @@ private static LocalDateTimeline lagRapportertInntektTidsl 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)) + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(bruker), BigDecimal.valueOf(bruker))), Set.of( + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(register), BigDecimal.valueOf(register)) ))) ) ); @@ -225,9 +225,9 @@ private static LocalDateTimeline lagRapportertInntektTidsl 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.YTELSE, BigDecimal.valueOf(registerYtelse)), - new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(registerATFL)) + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(bruker), BigDecimal.valueOf(bruker))), Set.of( + new RapportertInntekt(InntektType.YTELSE, BigDecimal.valueOf(registerYtelse), BigDecimal.valueOf(registerYtelse)), + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, BigDecimal.valueOf(registerATFL), BigDecimal.valueOf(registerATFL)) ))) ) ); diff --git a/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/InntekterForKilde.java b/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/InntekterForKilde.java index 617a19c29b..c989c68005 100644 --- a/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/InntekterForKilde.java +++ b/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/InntekterForKilde.java @@ -2,6 +2,7 @@ import no.nav.ung.kodeverk.arbeidsforhold.InntektYtelseType; import no.nav.ung.sak.typer.Arbeidsgiver; + import java.util.List; public record InntekterForKilde( @@ -9,5 +10,16 @@ public record InntekterForKilde( Arbeidsgiver arbeidsgiver, InntektYtelseType ytelseType, List inntekter -) {} +) { + + static InntekterForKilde forBrukersRapporterteArbeidsinntekter(Inntektsperiode inntektsperiode) { + return new InntekterForKilde( + InntektType.ARBEIDSTAKER_ELLER_FRILANSER, + null, + null, + List.of(inntektsperiode) + ); + } + +} diff --git a/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/Inntektsperiode.java b/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/Inntektsperiode.java index b6052cd12e..776fa4261b 100644 --- a/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/Inntektsperiode.java +++ b/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/Inntektsperiode.java @@ -5,5 +5,20 @@ public record Inntektsperiode( Beløp beløp, + Beløp periodebeløpFraRådata, DatoIntervallEntitet periode -) {} +) { + + + public Inntektsperiode adderBeløp(Inntektsperiode augend) { + if (!this.periode.equals(augend.periode)) { + throw new IllegalArgumentException("Kan kun addere inntektsperioder med samme periode"); + } + return new Inntektsperiode( + this.beløp.adder(augend.beløp), + this.periodebeløpFraRådata.adder(augend.periodebeløpFraRådata), + this.periode + ); + } + +} diff --git a/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/KontrollerteInntektperioderTjeneste.java b/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/KontrollerteInntektperioderTjeneste.java index 2086e8d502..6b446c2f96 100644 --- a/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/KontrollerteInntektperioderTjeneste.java +++ b/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/KontrollerteInntektperioderTjeneste.java @@ -162,7 +162,9 @@ private static List mapAutomatiskKontrollerteInntektp .medKilde(s.getValue().kilde()) .medErManueltVurdert(false) .medRegisterInntekt(rapporterteInntekter.map(it -> it.registerRapporterteInntekter().stream().map(RapportertInntekt::beløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)).orElse(BigDecimal.ZERO)) + .medRegisterInntektPrMnd(rapporterteInntekter.map(it -> it.registerRapporterteInntekter().stream().map(RapportertInntekt::fulltRapporteringsbeløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)).orElse(BigDecimal.ZERO)) .medRapportertInntekt(rapporterteInntekter.map(it -> it.brukerRapporterteInntekter().stream().map(RapportertInntekt::beløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)).orElse(BigDecimal.ZERO)) + .medRapportertInntektPrMnd(rapporterteInntekter.map(it -> it.brukerRapporterteInntekter().stream().map(RapportertInntekt::fulltRapporteringsbeløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)).orElse(BigDecimal.ZERO)) .build(); } ).toList(); @@ -183,7 +185,9 @@ private static List mapManueltKontrollerteInntektperi .medPeriode(DatoIntervallEntitet.fraOgMedTilOgMed(s.getFom(), s.getTom())) .medInntekt(s.getValue().samletInntekt()) .medRegisterInntekt(rapporterteInntekter.map(it -> it.registerRapporterteInntekter().stream().map(RapportertInntekt::beløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)).orElse(BigDecimal.ZERO)) + .medRegisterInntektPrMnd(rapporterteInntekter.map(it -> it.registerRapporterteInntekter().stream().map(RapportertInntekt::fulltRapporteringsbeløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)).orElse(BigDecimal.ZERO)) .medRapportertInntekt(rapporterteInntekter.map(it -> it.brukerRapporterteInntekter().stream().map(RapportertInntekt::beløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)).orElse(BigDecimal.ZERO)) + .medRapportertInntektPrMnd(rapporterteInntekter.map(it -> it.brukerRapporterteInntekter().stream().map(RapportertInntekt::fulltRapporteringsbeløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO)).orElse(BigDecimal.ZERO)) .medKilde(s.getValue().kilde()) .medErManueltVurdert(true) .medBegrunnelse(s.getValue().begrunnelse()) diff --git a/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/RapportertInntekt.java b/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/RapportertInntekt.java index bf0d892c18..f720c1cf51 100644 --- a/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/RapportertInntekt.java +++ b/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/RapportertInntekt.java @@ -6,12 +6,14 @@ public class RapportertInntekt { private InntektType inntektType; private BigDecimal beløp; + private BigDecimal fulltRapporteringsbeløp; public RapportertInntekt( InntektType inntektType, - BigDecimal beløp) { + BigDecimal beløp, BigDecimal fulltRapporteringsbeløp) { this.inntektType = inntektType; this.beløp = beløp; + this.fulltRapporteringsbeløp = fulltRapporteringsbeløp; } @Override @@ -30,6 +32,11 @@ public InntektType inntektType() { return beløp; } + public BigDecimal fulltRapporteringsbeløp() { + return beløp; + } + + @Override public boolean equals(Object obj) { if (obj == this) return true; diff --git a/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/RapportertInntektMapper.java b/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/RapportertInntektMapper.java index cf862aeec7..4074e7ec2c 100644 --- a/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/RapportertInntektMapper.java +++ b/domenetjenester/inntektskontroll/src/main/java/no/nav/ung/sak/kontroll/RapportertInntektMapper.java @@ -6,14 +6,13 @@ import no.nav.fpsak.tidsserie.LocalDateSegment; import no.nav.fpsak.tidsserie.LocalDateTimeline; import no.nav.fpsak.tidsserie.StandardCombinators; -import no.nav.ung.kodeverk.arbeidsforhold.InntektYtelseType; +import no.nav.k9.felles.konfigurasjon.konfig.KonfigVerdi; import no.nav.ung.kodeverk.arbeidsforhold.InntektsKilde; import no.nav.ung.kodeverk.arbeidsforhold.InntektspostType; import no.nav.ung.kodeverk.varsel.EtterlysningStatus; import no.nav.ung.sak.domene.iay.modell.*; import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; import no.nav.ung.sak.domene.typer.tid.Virkedager; -import no.nav.ung.sak.typer.Arbeidsgiver; import no.nav.ung.sak.typer.Beløp; import no.nav.ung.sak.ytelseperioder.MånedsvisTidslinjeUtleder; import org.slf4j.Logger; @@ -32,11 +31,15 @@ public class RapportertInntektMapper { private final InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste; private final MånedsvisTidslinjeUtleder ytelsesperiodeutleder; + private final boolean kontrollerInntektSisteMånedEnabled; @Inject - public RapportertInntektMapper(InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste, MånedsvisTidslinjeUtleder ytelsesperiodeutleder) { + public RapportertInntektMapper(InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste, + MånedsvisTidslinjeUtleder ytelsesperiodeutleder, + @KonfigVerdi(value = "KONTROLL_SISTE_MND_ENABLED", defaultVerdi = "false") boolean kontrollerInntektSisteMånedEnabled) { this.inntektArbeidYtelseTjeneste = inntektArbeidYtelseTjeneste; this.ytelsesperiodeutleder = ytelsesperiodeutleder; + this.kontrollerInntektSisteMånedEnabled = kontrollerInntektSisteMånedEnabled; } public LocalDateTimeline mapAlleGjeldendeRegisterOgBrukersInntekter(Long behandlingId) { @@ -49,7 +52,10 @@ public LocalDateTimeline mapAlleGjeldendeRegisterOgBrukers final var månedsvisYtelseTidslinje = ytelsesperiodeutleder.periodiserMånedsvis(behandlingId); - final var brukersRapporterteInntekter = finnBrukersRapporterteInntekter(iayGrunnlag.get(), månedsvisYtelseTidslinje); + final var brukersRapporterteInntekter = + kontrollerInntektSisteMånedEnabled ? + finnBrukersRapporterteInntekterForOverlapp(iayGrunnlag.get(), månedsvisYtelseTidslinje) : + finnBrukersRapporterteInntekter(iayGrunnlag.get(), månedsvisYtelseTidslinje); validerBrukersRapporterteInntekterTidslinje(brukersRapporterteInntekter, månedsvisYtelseTidslinje); final var grupperteInntekter = grupperInntekter(iayGrunnlag.get()); @@ -85,7 +91,7 @@ private List grupperInntekter(InntektArbeidYtelseGrunnlag iay it.getArbeidsgiver(), førsteInntektspost.getInntektYtelseType(), it.getAlleInntektsposter().stream() - .map(ip -> new Inntektsperiode(ip.getBeløp(), ip.getPeriode())) + .map(ip -> new Inntektsperiode(ip.getBeløp(), ip.getBeløp(), ip.getPeriode())) .toList() ); }).toList(); @@ -140,18 +146,16 @@ private static Set mapTilRapporterteInntekterPrType(List it.inntektType() == InntektType.ARBEIDSTAKER_ELLER_FRILANSER) .flatMap(it -> it.inntekter().stream()) - .map(Inntektsperiode::beløp) - .reduce(Beløp::adder) - .map(it -> new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, it.getVerdi())) + .reduce(Inntektsperiode::adderBeløp) + .map(it -> new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, it.beløp().getVerdi(), it.periodebeløpFraRådata().getVerdi())) .ifPresent(inntekterForPeriode::add); overlappendeInntekter .stream() .filter(it -> it.inntektType() == InntektType.YTELSE) .flatMap(it -> it.inntekter().stream()) - .map(Inntektsperiode::beløp) - .reduce(Beløp::adder) - .map(it -> new RapportertInntekt(InntektType.YTELSE, it.getVerdi())) + .reduce(Inntektsperiode::adderBeløp) + .map(it -> new RapportertInntekt(InntektType.YTELSE, it.beløp().getVerdi(), it.periodebeløpFraRådata().getVerdi())) .ifPresent(inntekterForPeriode::add); return inntekterForPeriode; } @@ -182,27 +186,29 @@ private static LocalDateTimeline kombinerTidslinjer(LocalD final var antallVirkedager = inntektsperiode.antallArbeidsdager(); final var overlappAntallVirkedager = Virkedager.beregnAntallVirkedager(overlappPeriode.getFomDato(), overlappPeriode.getTomDato()); - var beløp = new Beløp(it.beløp().getVerdi().multiply(BigDecimal.valueOf(overlappAntallVirkedager).divide(BigDecimal.valueOf(antallVirkedager), 10, RoundingMode.HALF_UP))); - return new Inntektsperiode(beløp, inntektsperiode); + var delvisBeløp = new Beløp(it.beløp().getVerdi().multiply(BigDecimal.valueOf(overlappAntallVirkedager).divide(BigDecimal.valueOf(antallVirkedager), 10, RoundingMode.HALF_UP))); + return new Inntektsperiode(delvisBeløp, it.periodebeløpFraRådata(), inntektsperiode); } private static List finnOverlappendeInntekter(LocalDateInterval intervall, List grupperteInntekter) { return grupperteInntekter.stream() .map(inntekterForKilde -> - { - List overlappendeInntektsperioder = inntekterForKilde.inntekter().stream() - .filter(it -> it.periode().toLocalDateInterval().overlaps(intervall)) - .map(it -> finnBeløpInnenforPeriode(intervall, it)) - .toList(); - return new InntekterForKilde( - inntekterForKilde.inntektType(), - inntekterForKilde.arbeidsgiver(), - inntekterForKilde.ytelseType(), - overlappendeInntektsperioder); - } + finnOverlappendeInntekt(intervall, inntekterForKilde) ).toList(); } + private static InntekterForKilde finnOverlappendeInntekt(LocalDateInterval intervall, InntekterForKilde inntekterForKilde) { + List overlappendeInntektsperioder = inntekterForKilde.inntekter().stream() + .filter(it -> it.periode().toLocalDateInterval().overlaps(intervall)) + .map(it -> finnBeløpInnenforPeriode(intervall, it)) + .toList(); + return new InntekterForKilde( + inntekterForKilde.inntektType(), + inntekterForKilde.arbeidsgiver(), + inntekterForKilde.ytelseType(), + overlappendeInntektsperioder); + } + private InntektType mapTilInntektType(Inntektspost it) { if (it.getInntektspostType().equals(InntektspostType.LØNN)) { return InntektType.ARBEIDSTAKER_ELLER_FRILANSER; @@ -212,6 +218,33 @@ private InntektType mapTilInntektType(Inntektspost it) { throw new IllegalArgumentException("Kunne ikke håndtere inntektsposttype: " + it.getInntektspostType()); } + private LocalDateTimeline> finnBrukersRapporterteInntekterForOverlapp(InntektArbeidYtelseGrunnlag iayGrunnlag, LocalDateTimeline månedsvisYtelseTidslinje) { + LocalDateTimeline> resultat = new LocalDateTimeline<>(List.of()); + var inntektsperiodeOgInnsendingstidspunkt = iayGrunnlag.getOppgittOpptjeningAggregat() + .stream() + .flatMap(o -> o.getOppgitteOpptjeninger().stream()) + .flatMap(o -> + o.getOppgittArbeidsforhold().stream() + .map(it -> + new Inntektsperiode( + new Beløp(it.getInntekt()), + new Beløp(it.getInntekt()), + it.getPeriode() + )).map(it -> new InntektsperiodeOgMottattTidspunkt(o.getInnsendingstidspunkt(), it)) + ).toList(); + + for (LocalDateInterval p : månedsvisYtelseTidslinje.getLocalDateIntervals()) { + Optional sisteMottatteInntektForPeriode = inntektsperiodeOgInnsendingstidspunkt.stream() + .filter(it -> it.inntektsperiode.periode().toLocalDateInterval().overlaps(p)) + .max(Comparator.comparing(InntektsperiodeOgMottattTidspunkt::mottattTidspunkt)); + if (sisteMottatteInntektForPeriode.isPresent()) { + InntekterForKilde forOverlapp = finnOverlappendeInntekt(p, InntekterForKilde.forBrukersRapporterteArbeidsinntekter(sisteMottatteInntektForPeriode.get().inntektsperiode)); + resultat = resultat.crossJoin(new LocalDateTimeline<>(p, mapTilRapporterteInntekterPrType(List.of(forOverlapp)))); + } + } + return resultat; + } + private LocalDateTimeline> finnBrukersRapporterteInntekter(InntektArbeidYtelseGrunnlag iayGrunnlag, LocalDateTimeline månedsvisYtelseTidslinje) { // Finner rapporterte inntekter pr journalpost sortert på mottattdato med siste mottatt journalpost først final var sorterteInntekttidslinjerPåMottattdato = finnSorterteInntektstidslinjer(iayGrunnlag, månedsvisYtelseTidslinje); @@ -258,6 +291,7 @@ private static List>> finnArbeidOgFrilan it.getPeriode().toLocalDateInterval(), Set.of(new RapportertInntekt( InntektType.ARBEIDSTAKER_ELLER_FRILANSER, + it.getInntekt(), it.getInntekt()) ))).toList(); } @@ -280,4 +314,15 @@ public int compareTo(InntektForMottattidspunkt o) { } } + public record InntektsperiodeOgMottattTidspunkt( + LocalDateTime mottattTidspunkt, + Inntektsperiode inntektsperiode + ) implements Comparable { + + @Override + public int compareTo(InntektForMottattidspunkt o) { + return this.mottattTidspunkt.compareTo(o.mottattTidspunkt); + } + } + } diff --git a/domenetjenester/inntektskontroll/src/test/java/no/nav/ung/sak/kontroll/RapportertInntektMapperTest.java b/domenetjenester/inntektskontroll/src/test/java/no/nav/ung/sak/kontroll/RapportertInntektMapperTest.java index c66ab5fa1a..8c37e3d531 100644 --- a/domenetjenester/inntektskontroll/src/test/java/no/nav/ung/sak/kontroll/RapportertInntektMapperTest.java +++ b/domenetjenester/inntektskontroll/src/test/java/no/nav/ung/sak/kontroll/RapportertInntektMapperTest.java @@ -38,7 +38,7 @@ void setUp() { when(ytelsesperiodeutleder.periodiserMånedsvis(anyLong())).thenReturn(new LocalDateTimeline<>(List.of( new LocalDateSegment<>(LocalDate.now(), LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()), YearMonth.now()), new LocalDateSegment<>(LocalDate.now().plusMonths(1).withDayOfMonth(1), LocalDate.now().plusMonths(1).with(TemporalAdjusters.lastDayOfMonth()), YearMonth.now().plusMonths(1))))); - rapportertInntektMapper = new RapportertInntektMapper(inntektArbeidYtelseTjeneste, ytelsesperiodeutleder); + rapportertInntektMapper = new RapportertInntektMapper(inntektArbeidYtelseTjeneste, ytelsesperiodeutleder, false); } @Test @@ -54,7 +54,7 @@ void skal_mappe_en_mottatt_inntekt() { // 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,inntekt)), Set.of())); assertThat(tidslinje).isEqualTo(forventet); @@ -74,7 +74,7 @@ void skal_mappe_mottatte_inntekter_for_arbeid() { // Assert final var forventet = new LocalDateTimeline<>(periode.getFomDato(), periode.getTomDato(), new RapporterteInntekter(Set.of( - new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, arbeidsinntekt) + new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, arbeidsinntekt, arbeidsinntekt) ), Set.of())); assertThat(tidslinje).isEqualTo(forventet); } @@ -103,10 +103,10 @@ void skal_mappe_to_mottatte_inntekter_for_forskjellige_perioder() { final var forventet = new LocalDateTimeline<>( List.of( new LocalDateSegment<>(periode.getFomDato(), periode.getTomDato(), new RapporterteInntekter( - Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt)), + Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt, inntekt)), Set.of())), new LocalDateSegment<>(periode2.getFomDato(), periode2.getTomDato(), new RapporterteInntekter( - Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt2)), + Set.of(new RapportertInntekt(InntektType.ARBEIDSTAKER_ELLER_FRILANSER, inntekt2, inntekt2)), Set.of())) )); assertThat(tidslinje).isEqualTo(forventet); @@ -134,7 +134,7 @@ void skal_mappe_to_mottatte_inntekter_for_samme_perioder() { // 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, inntekt2)), Set.of())); assertThat(tidslinje).isEqualTo(forventet); } diff --git a/migreringer/src/main/resources/db/postgres/defaultDS/1.0/V1.0_065__rapporterte_inntekter_pr_mnd.sql b/migreringer/src/main/resources/db/postgres/defaultDS/1.0/V1.0_065__rapporterte_inntekter_pr_mnd.sql new file mode 100644 index 0000000000..50bebc910b --- /dev/null +++ b/migreringer/src/main/resources/db/postgres/defaultDS/1.0/V1.0_065__rapporterte_inntekter_pr_mnd.sql @@ -0,0 +1,7 @@ +ALTER table KONTROLLERT_INNTEKT_PERIODE + ADD COLUMN rapportert_inntekt_pr_mnd numeric; +ALTER table KONTROLLERT_INNTEKT_PERIODE + ADD COLUMN register_inntekt_pr_mnd numeric; + +UPDATE KONTROLLERT_INNTEKT_PERIODE set rapportert_inntekt_pr_mnd = rapportert_inntekt where rapportert_inntekt is not null; +UPDATE KONTROLLERT_INNTEKT_PERIODE set register_inntekt_pr_mnd = register_inntekt where register_inntekt is not null; diff --git a/web/src/test/java/no/nav/ung/sak/web/app/tjenester/behandling/kontroll/FastsettInntektOppdatererTest.java b/web/src/test/java/no/nav/ung/sak/web/app/tjenester/behandling/kontroll/FastsettInntektOppdatererTest.java index 387c488484..22867e1811 100644 --- a/web/src/test/java/no/nav/ung/sak/web/app/tjenester/behandling/kontroll/FastsettInntektOppdatererTest.java +++ b/web/src/test/java/no/nav/ung/sak/web/app/tjenester/behandling/kontroll/FastsettInntektOppdatererTest.java @@ -95,7 +95,7 @@ void setUp() { new UngdomsytelseSøknadsperiodeTjeneste(ungdomsytelseStartdatoRepository, new UngdomsprogramPeriodeTjeneste(ungdomsprogramPeriodeRepository, ungdomsytelseStartdatoRepository), behandlingRepository)); RelevanteKontrollperioderUtleder relevanteKontrollperioderUtleder = new RelevanteKontrollperioderUtleder(prosessTriggerPeriodeUtleder, månedsvisTidslinjeUtleder, false); kontrollerteInntektperioderTjeneste = new KontrollerteInntektperioderTjeneste(tilkjentYtelseRepository, månedsvisTidslinjeUtleder, relevanteKontrollperioderUtleder); - final var rapportertInntektMapper = new RapportertInntektMapper(inntektArbeidYtelseTjeneste, månedsvisTidslinjeUtleder); + final var rapportertInntektMapper = new RapportertInntektMapper(inntektArbeidYtelseTjeneste, månedsvisTidslinjeUtleder, false); oppdaterer = new FastsettInntektOppdaterer( kontrollerteInntektperioderTjeneste, rapportertInntektMapper,