diff --git a/behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/ytelse/sats/Sats.java b/behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/ytelse/sats/Sats.java index f7173e11c8..5fa3ef8483 100644 --- a/behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/ytelse/sats/Sats.java +++ b/behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/ytelse/sats/Sats.java @@ -7,15 +7,19 @@ public enum Sats { - LAV(BigDecimal.valueOf(4).divide(BigDecimal.valueOf(3), 5, RoundingMode.HALF_UP), UngdomsytelseSatsType.LAV), - HØY(BigDecimal.valueOf(2), UngdomsytelseSatsType.HØY); + LAV(BigDecimal.valueOf(4).divide(BigDecimal.valueOf(3), 5, RoundingMode.HALF_UP), UngdomsytelseSatsType.LAV, 18, 25), + HØY(BigDecimal.valueOf(2), UngdomsytelseSatsType.HØY, 25, 29); - private BigDecimal grunnbeløpFaktor; - private UngdomsytelseSatsType satsType; + private final BigDecimal grunnbeløpFaktor; + private final UngdomsytelseSatsType satsType; + private final int fomAlder; + private final int tomAlder; - Sats(BigDecimal grunnbeløpFaktor, UngdomsytelseSatsType satsType) { + Sats(BigDecimal grunnbeløpFaktor, UngdomsytelseSatsType satsType, int fomAlder, int tomAlder) { this.grunnbeløpFaktor = grunnbeløpFaktor; this.satsType = satsType; + this.fomAlder = fomAlder; + this.tomAlder = tomAlder; } public BigDecimal getGrunnbeløpFaktor() { @@ -25,4 +29,12 @@ public enum Sats { public UngdomsytelseSatsType getSatsType() { return satsType; } + + public int getFomAlder() { + return fomAlder; + } + + public int getTomAlder() { + return tomAlder; + } } diff --git a/behandlingslager/testutil/src/main/java/no/nav/ung/sak/test/util/behandling/AbstractTestScenario.java b/behandlingslager/testutil/src/main/java/no/nav/ung/sak/test/util/behandling/AbstractTestScenario.java index fc3d9cac33..038d01a579 100644 --- a/behandlingslager/testutil/src/main/java/no/nav/ung/sak/test/util/behandling/AbstractTestScenario.java +++ b/behandlingslager/testutil/src/main/java/no/nav/ung/sak/test/util/behandling/AbstractTestScenario.java @@ -17,7 +17,6 @@ import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; -import no.nav.ung.sak.test.util.behandling.personopplysning.Personopplysning; import org.jboss.weld.exceptions.UnsupportedOperationException; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; @@ -32,6 +31,7 @@ import no.nav.ung.kodeverk.behandling.FagsakStatus; import no.nav.ung.kodeverk.behandling.FagsakYtelseType; import no.nav.ung.kodeverk.behandling.aksjonspunkt.AksjonspunktDefinisjon; +import no.nav.ung.kodeverk.geografisk.Landkoder; import no.nav.ung.kodeverk.geografisk.Region; import no.nav.ung.kodeverk.person.PersonstatusType; import no.nav.ung.kodeverk.person.SivilstandType; @@ -67,9 +67,13 @@ import no.nav.ung.sak.behandlingslager.fagsak.FagsakLåsRepository; import no.nav.ung.sak.behandlingslager.fagsak.FagsakRepository; import no.nav.ung.sak.behandlingslager.fagsak.FagsakTestUtil; +import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeRepository; +import no.nav.ung.sak.behandlingslager.ytelse.UngdomsytelseGrunnlagRepository; +import no.nav.ung.sak.behandlingslager.ytelse.sats.UngdomsytelseSatsResultat; import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; import no.nav.ung.sak.test.util.Whitebox; import no.nav.ung.sak.test.util.behandling.personopplysning.PersonInformasjon; +import no.nav.ung.sak.test.util.behandling.personopplysning.Personopplysning; import no.nav.ung.sak.test.util.behandling.personopplysning.Personstatus; import no.nav.ung.sak.test.util.fagsak.FagsakBuilder; import no.nav.ung.sak.typer.AktørId; @@ -124,6 +128,7 @@ public abstract class AbstractTestScenario> { private boolean manueltOpprettet; private BehandlingResultatType behandlingResultatType = BehandlingResultatType.IKKE_FASTSATT; private BehandlingStatus behandlingStatus = BehandlingStatus.UTREDES; // vanligste for tester + private UngTestscenario ungTestscenario; protected AbstractTestScenario(FagsakYtelseType fagsakYtelseType) { this.fagsakBuilder = FagsakBuilder @@ -398,6 +403,73 @@ public Behandling lagre(BehandlingRepositoryProvider repositoryProvider) { return behandling; } + @SuppressWarnings("unchecked") + public S medUngTestGrunnlag(UngTestscenario ungTestscenario) { + this.ungTestscenario = ungTestscenario; + return (S) this; + } + + public UngTestscenario getUngTestGrunnlag() { + return ungTestscenario; + } + + public Behandling buildOgLagreMedUng( + BehandlingRepositoryProvider repositoryProvider, + UngdomsytelseGrunnlagRepository ungdomsytelseGrunnlagRepository, + UngdomsprogramPeriodeRepository ungdomsprogramPeriodeRepository + ) { + if (ungTestscenario == null) throw new IllegalArgumentException("ungTestGrunnlag må settes for å bruke buildUng"); + + // Default Person + if (personer == null) { + var ungdom = getDefaultBrukerAktørId(); + PersonInformasjon personInformasjon = opprettBuilderForRegisteropplysninger() + .medPersonas() + .ungdom(ungdom, ungTestscenario.fødselsdato(), ungTestscenario.navn()) + .statsborgerskap(Landkoder.NOR) + .personstatus(PersonstatusType.BOSA) + .build(); + medRegisterOpplysninger(personInformasjon); + } + + //Vilkår + if (ungTestscenario.aldersvilkår() != null) { + ungTestscenario.aldersvilkår().forEach(it -> leggTilVilkår(VilkårType.ALDERSVILKÅR, it.getValue(), new Periode(it.getFom(), it.getTom()))); + } + + if (ungTestscenario.ungdomsprogramvilkår() != null) { + ungTestscenario.ungdomsprogramvilkår().forEach(it -> leggTilVilkår(VilkårType.UNGDOMSPROGRAMVILKÅRET, it.getValue(), new Periode(it.getFom(), it.getTom()))); + } + + build(repositoryProvider.getBehandlingRepository(), repositoryProvider); + + //Ung ting + buildUng(ungdomsytelseGrunnlagRepository, ungdomsprogramPeriodeRepository); + return behandling; + } + + private void buildUng(UngdomsytelseGrunnlagRepository ungdomsytelseGrunnlagRepository, UngdomsprogramPeriodeRepository ungdomsprogramPeriodeRepository) { + + if (ungTestscenario.satser() != null) { + ungdomsytelseGrunnlagRepository.lagre(behandling.getId(), new UngdomsytelseSatsResultat( + ungTestscenario.satser(), + "regelInputSats", + "regelSporing" + )); + } + + if (ungTestscenario.uttakPerioder() != null) { + ungdomsytelseGrunnlagRepository.lagre(behandling.getId(), ungTestscenario.uttakPerioder()); + } + + if (ungTestscenario.programPerioder() != null) { + ungdomsprogramPeriodeRepository.lagre(behandling.getId(), ungTestscenario.programPerioder()); + } + + + + } + private BehandlingRepository lagMockedRepositoryForOpprettingAvBehandlingInternt() { if (mockBehandlingRepository != null && behandling != null) { return mockBehandlingRepository; @@ -543,7 +615,6 @@ private void build(BehandlingRepository behandlingRepo, BehandlingRepositoryProv BehandlingLås lås = behandlingRepo.taSkriveLås(behandling); behandlingRepo.lagre(behandling, lås); - Long behandlingId = behandling.getId(); lagrePersonopplysning(repositoryProvider, behandling); lagreSøknad(repositoryProvider); diff --git a/behandlingslager/testutil/src/main/java/no/nav/ung/sak/test/util/behandling/UngTestscenario.java b/behandlingslager/testutil/src/main/java/no/nav/ung/sak/test/util/behandling/UngTestscenario.java new file mode 100644 index 0000000000..7d0225e239 --- /dev/null +++ b/behandlingslager/testutil/src/main/java/no/nav/ung/sak/test/util/behandling/UngTestscenario.java @@ -0,0 +1,32 @@ +package no.nav.ung.sak.test.util.behandling; + +import java.time.LocalDate; +import java.util.List; + +import no.nav.fpsak.tidsserie.LocalDateTimeline; +import no.nav.ung.kodeverk.vilkår.Utfall; +import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriode; +import no.nav.ung.sak.behandlingslager.ytelse.sats.UngdomsytelseSatser; +import no.nav.ung.sak.behandlingslager.ytelse.uttak.UngdomsytelseUttakPerioder; + +/** + * Hjelpeobjekt for å populere databasen med diverse ung data. Brukes av TestScenarioBuilder + * + * @param programPerioder - perioder ungdommen er i programmet, kan være stykkevis + * @param satser - timeline med satser og når de gjelder. Bruk gjerne statiske hjelpebuildere fra denne klassen + * @param uttakPerioder - perioder med uttak, kan evt legge på gradering her + * @param aldersvilkår - timeline med aldersvilkår oppfylt og ikke oppfylt + * @param ungdomsprogramvilkår - timeline med ungdomsprogramvilkår oppfylt og ikke oppfylt + * @param fødselsdato + */ +public record UngTestscenario( + String navn, + List programPerioder, + LocalDateTimeline satser, + UngdomsytelseUttakPerioder uttakPerioder, + LocalDateTimeline aldersvilkår, + LocalDateTimeline ungdomsprogramvilkår, + LocalDate fødselsdato) { +} + + diff --git a/behandlingslager/testutil/src/main/java/no/nav/ung/sak/test/util/behandling/personopplysning/Personas.java b/behandlingslager/testutil/src/main/java/no/nav/ung/sak/test/util/behandling/personopplysning/Personas.java index 4f5b56e0a9..d612de14a4 100644 --- a/behandlingslager/testutil/src/main/java/no/nav/ung/sak/test/util/behandling/personopplysning/Personas.java +++ b/behandlingslager/testutil/src/main/java/no/nav/ung/sak/test/util/behandling/personopplysning/Personas.java @@ -42,6 +42,30 @@ private Personas voksenPerson(AktørId aktørId, SivilstandType st, NavBrukerKj return this; } + + + public Personas ungdom(AktørId aktørId, LocalDate fødselsdato) { + return ungdom(aktørId, fødselsdato, "Test Testesen"); + } + + public Personas ungdom(AktørId aktørId, LocalDate fødselsdato, String navn) { + if (this.aktørId == null) { + this.aktørId = aktørId; + this.fødselsdato = fødselsdato; + } else { + throw new IllegalArgumentException("En Personas har kun en aktørId, allerede satt til " + this.aktørId + ", angitt=" + aktørId); + } + builder.leggTilPersonopplysninger(persInfoBuilder + .aktørId(aktørId) + .fødselsdato(fødselsdato) + .navn(navn) + .brukerKjønn(NavBrukerKjønn.MANN) + .sivilstand(SivilstandType.UGIFT) + .region(Region.NORDEN)); + + return this; + } + public Personas barn(AktørId aktørId, LocalDate fødselsdato) { barn(aktørId, fødselsdato, null); return this; diff --git "a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregning/LagGrunnbel\303\270pFaktorTidslinje.java" "b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregning/LagGrunnbel\303\270pFaktorTidslinje.java" index 3f2c4bf671..6ee6c38ea2 100644 --- "a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregning/LagGrunnbel\303\270pFaktorTidslinje.java" +++ "b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/beregning/LagGrunnbel\303\270pFaktorTidslinje.java" @@ -14,10 +14,10 @@ public class LagGrunnbeløpFaktorTidslinje { static LocalDateTimeline lagGrunnbeløpFaktorTidslinje(LocalDate fødselsdato, LocalDate beregningsdato, boolean harTriggerBeregnHøySats) { - var førsteMuligeDato = fødselsdato.plusYears(18).with(TemporalAdjusters.lastDayOfMonth()).plusDays(1); - LocalDate tjuefemårsdagen = fødselsdato.plusYears(25); + var førsteMuligeDato = fødselsdato.plusYears(LAV.getFomAlder()).with(TemporalAdjusters.lastDayOfMonth()).plusDays(1); + LocalDate tjuefemårsdagen = fødselsdato.plusYears(HØY.getFomAlder()); var datoForEndringAvSats = tjuefemårsdagen.with(TemporalAdjusters.lastDayOfMonth()).plusDays(1); - var sisteMuligeDato = fødselsdato.plusYears(29).with(TemporalAdjusters.lastDayOfMonth()).plusDays(1); + var sisteMuligeDato = fødselsdato.plusYears(HØY.getTomAlder()).with(TemporalAdjusters.lastDayOfMonth()).plusDays(1); var regnUtHøySats = harTriggerBeregnHøySats || beregningsdato.isAfter(tjuefemårsdagen); if (regnUtHøySats) { diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/initperioder/InitierPerioderSteg.java b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/initperioder/InitierPerioderSteg.java index c23b606c73..aa87e1196b 100644 --- a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/initperioder/InitierPerioderSteg.java +++ b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/initperioder/InitierPerioderSteg.java @@ -1,11 +1,22 @@ package no.nav.ung.sak.domene.behandling.steg.initperioder; -import domene.ungdomsprogram.UngdomsprogramPeriodeTjeneste; -import domene.ungdomsprogram.UngdomsprogramTjeneste; +import static no.nav.ung.kodeverk.behandling.BehandlingStegType.INIT_PERIODER; +import static no.nav.ung.kodeverk.behandling.FagsakYtelseType.UNGDOMSYTELSE; + +import java.time.LocalDate; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import no.nav.ung.kodeverk.dokument.Brevkode; -import no.nav.ung.sak.behandlingskontroll.*; +import no.nav.ung.sak.behandlingskontroll.BehandleStegResultat; +import no.nav.ung.sak.behandlingskontroll.BehandlingSteg; +import no.nav.ung.sak.behandlingskontroll.BehandlingStegRef; +import no.nav.ung.sak.behandlingskontroll.BehandlingTypeRef; +import no.nav.ung.sak.behandlingskontroll.BehandlingskontrollKontekst; +import no.nav.ung.sak.behandlingskontroll.FagsakYtelseTypeRef; import no.nav.ung.sak.behandlingslager.behandling.Behandling; import no.nav.ung.sak.behandlingslager.behandling.motattdokument.MottattDokument; import no.nav.ung.sak.behandlingslager.behandling.motattdokument.MottatteDokumentRepository; @@ -14,14 +25,8 @@ import no.nav.ung.sak.behandlingslager.behandling.startdato.UngdomsytelseStartdatoRepository; import no.nav.ung.sak.behandlingslager.behandling.startdato.UngdomsytelseStartdatoer; import no.nav.ung.sak.typer.JournalpostId; - -import java.time.LocalDate; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import static no.nav.ung.kodeverk.behandling.BehandlingStegType.INIT_PERIODER; -import static no.nav.ung.kodeverk.behandling.FagsakYtelseType.UNGDOMSYTELSE; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramTjeneste; @ApplicationScoped @BehandlingStegRef(value = INIT_PERIODER) diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderAntallDagerTjeneste.java b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderAntallDagerTjeneste.java index 0497dabdad..facfb42df6 100644 --- a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderAntallDagerTjeneste.java +++ b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderAntallDagerTjeneste.java @@ -16,6 +16,8 @@ import no.nav.ung.sak.behandlingslager.ytelse.uttak.UngdomsytelseUttakPeriode; import no.nav.ung.sak.behandlingslager.ytelse.uttak.UngdomsytelseUttakPerioder; import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; +import no.nav.ung.sak.ungdomsprogram.forbruktedager.FinnForbrukteDager; +import no.nav.ung.sak.ungdomsprogram.forbruktedager.VurderAntallDagerResultat; class VurderAntallDagerTjeneste { diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderUttakSteg.java b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderUttakSteg.java index 09d1acd8de..be11ecb066 100644 --- a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderUttakSteg.java +++ b/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderUttakSteg.java @@ -1,21 +1,26 @@ package no.nav.ung.sak.domene.behandling.steg.uttak; +import static no.nav.ung.kodeverk.behandling.BehandlingStegType.VURDER_UTTAK; +import static no.nav.ung.kodeverk.behandling.FagsakYtelseType.UNGDOMSYTELSE; +import static no.nav.ung.sak.domene.typer.tid.AbstractLocalDateInterval.TIDENES_BEGYNNELSE; + +import java.util.logging.Logger; + import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import no.nav.fpsak.tidsserie.LocalDateTimeline; import no.nav.ung.kodeverk.vilkår.Utfall; -import no.nav.ung.sak.behandlingskontroll.*; +import no.nav.ung.sak.behandlingskontroll.BehandleStegResultat; +import no.nav.ung.sak.behandlingskontroll.BehandlingSteg; +import no.nav.ung.sak.behandlingskontroll.BehandlingStegRef; +import no.nav.ung.sak.behandlingskontroll.BehandlingTypeRef; +import no.nav.ung.sak.behandlingskontroll.BehandlingskontrollKontekst; +import no.nav.ung.sak.behandlingskontroll.FagsakYtelseTypeRef; import no.nav.ung.sak.behandlingslager.behandling.personopplysning.PersonopplysningEntitet; import no.nav.ung.sak.behandlingslager.behandling.personopplysning.PersonopplysningRepository; import no.nav.ung.sak.behandlingslager.ytelse.UngdomsytelseGrunnlagRepository; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; import no.nav.ung.sak.vilkår.VilkårTjeneste; -import domene.ungdomsprogram.UngdomsprogramPeriodeTjeneste; - -import java.util.logging.Logger; - -import static no.nav.ung.kodeverk.behandling.BehandlingStegType.VURDER_UTTAK; -import static no.nav.ung.kodeverk.behandling.FagsakYtelseType.UNGDOMSYTELSE; -import static no.nav.ung.sak.domene.typer.tid.AbstractLocalDateInterval.TIDENES_BEGYNNELSE; @FagsakYtelseTypeRef(UNGDOMSYTELSE) @BehandlingStegRef(value = VURDER_UTTAK) diff --git a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderUttakStegTest.java b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderUttakStegTest.java index 5c6859a860..1212ce834c 100644 --- a/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderUttakStegTest.java +++ b/behandlingsprosess/src/test/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderUttakStegTest.java @@ -1,5 +1,15 @@ package no.nav.ung.sak.domene.behandling.steg.uttak; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + import no.nav.fpsak.tidsserie.LocalDateTimeline; import no.nav.ung.kodeverk.vilkår.Utfall; import no.nav.ung.kodeverk.vilkår.VilkårType; @@ -14,17 +24,8 @@ import no.nav.ung.sak.behandlingslager.ytelse.UngdomsytelseGrunnlagRepository; import no.nav.ung.sak.kontrakt.vilkår.VilkårUtfallSamlet; import no.nav.ung.sak.test.util.behandling.TestScenarioBuilder; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; import no.nav.ung.sak.vilkår.VilkårTjeneste; -import domene.ungdomsprogram.UngdomsprogramPeriodeTjeneste; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; class VurderUttakStegTest { private VilkårTjeneste vilkårTjeneste = mock(VilkårTjeneste.class); diff --git "a/domenetjenester/inngangsvilkar/src/main/java/no/nav/ung/sak/inngangsvilk\303\245r/ungdomsprogram/VurderUngdomsprogramVilk\303\245rSteg.java" "b/domenetjenester/inngangsvilkar/src/main/java/no/nav/ung/sak/inngangsvilk\303\245r/ungdomsprogram/VurderUngdomsprogramVilk\303\245rSteg.java" index 2067bf6241..3c365d66e8 100644 --- "a/domenetjenester/inngangsvilkar/src/main/java/no/nav/ung/sak/inngangsvilk\303\245r/ungdomsprogram/VurderUngdomsprogramVilk\303\245rSteg.java" +++ "b/domenetjenester/inngangsvilkar/src/main/java/no/nav/ung/sak/inngangsvilk\303\245r/ungdomsprogram/VurderUngdomsprogramVilk\303\245rSteg.java" @@ -5,7 +5,6 @@ import java.util.List; import java.util.NavigableSet; -import domene.ungdomsprogram.UngdomsprogramPeriodeTjeneste; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Any; import jakarta.enterprise.inject.Instance; @@ -30,6 +29,7 @@ import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; import no.nav.ung.sak.domene.typer.tid.TidslinjeUtil; import no.nav.ung.sak.perioder.VilkårsPerioderTilVurderingTjeneste; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; @BehandlingStegRef(value = VURDER_UNGDOMSPROGRAMVILKÅR) @BehandlingTypeRef diff --git a/domenetjenester/innsyn/src/main/java/no/nav/ung/sak/innsyn/hendelse/InnsynEventObserver.java b/domenetjenester/innsyn/src/main/java/no/nav/ung/sak/innsyn/hendelse/InnsynEventObserver.java index 029fd0f815..0b986b6b25 100644 --- a/domenetjenester/innsyn/src/main/java/no/nav/ung/sak/innsyn/hendelse/InnsynEventObserver.java +++ b/domenetjenester/innsyn/src/main/java/no/nav/ung/sak/innsyn/hendelse/InnsynEventObserver.java @@ -6,13 +6,14 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; -import no.nav.ung.kodeverk.behandling.BehandlingStatus; import no.nav.k9.prosesstask.api.ProsessTaskData; import no.nav.k9.prosesstask.api.ProsessTaskTjeneste; +import no.nav.ung.kodeverk.behandling.BehandlingStatus; import no.nav.ung.sak.behandlingskontroll.events.AksjonspunktStatusEvent; import no.nav.ung.sak.behandlingskontroll.events.BehandlingStatusEvent; @ApplicationScoped +//TODO denne brukes ikke i ung-sak enda, og lager unødvendige tasker. Vurder å slett og heller kopiere på nytt når relevant public class InnsynEventObserver { protected final Logger log = LoggerFactory.getLogger(this.getClass()); diff --git a/domenetjenester/mottak/src/main/java/no/nav/ung/sak/mottak/dokumentmottak/FagsakperiodeUtleder.java b/domenetjenester/mottak/src/main/java/no/nav/ung/sak/mottak/dokumentmottak/FagsakperiodeUtleder.java index f296583082..5256b87c95 100644 --- a/domenetjenester/mottak/src/main/java/no/nav/ung/sak/mottak/dokumentmottak/FagsakperiodeUtleder.java +++ b/domenetjenester/mottak/src/main/java/no/nav/ung/sak/mottak/dokumentmottak/FagsakperiodeUtleder.java @@ -6,13 +6,13 @@ import java.time.LocalDate; import java.util.Optional; -import domene.ungdomsprogram.UngdomsprogramPeriodeTjeneste; import jakarta.enterprise.context.Dependent; import jakarta.inject.Inject; import no.nav.fpsak.tidsserie.LocalDateInterval; import no.nav.ung.sak.behandlingslager.behandling.Behandling; import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; -import no.nav.ung.sak.domene.behandling.steg.uttak.FinnForbrukteDager; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; +import no.nav.ung.sak.ungdomsprogram.forbruktedager.FinnForbrukteDager; @Dependent public class FagsakperiodeUtleder { diff --git a/domenetjenester/mottak/src/test/java/no/nav/ung/sak/mottak/dokumentmottak/FagsakperiodeUtlederTest.java b/domenetjenester/mottak/src/test/java/no/nav/ung/sak/mottak/dokumentmottak/FagsakperiodeUtlederTest.java index 6cf5af2b74..61b379ce49 100644 --- a/domenetjenester/mottak/src/test/java/no/nav/ung/sak/mottak/dokumentmottak/FagsakperiodeUtlederTest.java +++ b/domenetjenester/mottak/src/test/java/no/nav/ung/sak/mottak/dokumentmottak/FagsakperiodeUtlederTest.java @@ -16,12 +16,12 @@ import no.nav.ung.kodeverk.behandling.FagsakYtelseType; import no.nav.ung.sak.behandlingslager.behandling.Behandling; import no.nav.ung.sak.behandlingslager.fagsak.Fagsak; +import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriode; +import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeRepository; import no.nav.ung.sak.db.util.JpaExtension; import no.nav.ung.sak.typer.AktørId; import no.nav.ung.sak.typer.Saksnummer; -import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriode; -import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeRepository; -import domene.ungdomsprogram.UngdomsprogramPeriodeTjeneste; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; @ExtendWith(JpaExtension.class) @ExtendWith(CdiAwareExtension.class) diff --git "a/domenetjenester/perioder/src/main/java/no/nav/ung/sak/perioder/UngdomsytelseS\303\270knadsperiodeTjeneste.java" "b/domenetjenester/perioder/src/main/java/no/nav/ung/sak/perioder/UngdomsytelseS\303\270knadsperiodeTjeneste.java" index 1d195ed5dc..45ade8302f 100644 --- "a/domenetjenester/perioder/src/main/java/no/nav/ung/sak/perioder/UngdomsytelseS\303\270knadsperiodeTjeneste.java" +++ "b/domenetjenester/perioder/src/main/java/no/nav/ung/sak/perioder/UngdomsytelseS\303\270knadsperiodeTjeneste.java" @@ -9,7 +9,6 @@ import java.util.function.Function; import java.util.stream.Collectors; -import domene.ungdomsprogram.UngdomsprogramPeriodeTjeneste; import jakarta.enterprise.context.Dependent; import jakarta.inject.Inject; import no.nav.fpsak.tidsserie.LocalDateSegment; @@ -21,6 +20,7 @@ import no.nav.ung.sak.behandlingslager.behandling.startdato.UngdomsytelseSøktStartdato; import no.nav.ung.sak.behandlingslager.fagsak.Fagsak; import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; @Dependent public class UngdomsytelseSøknadsperiodeTjeneste { diff --git "a/domenetjenester/perioder/src/main/java/no/nav/ung/sak/perioder/UngdomsytelseVilk\303\245rsperioderTilVurderingTjeneste.java" "b/domenetjenester/perioder/src/main/java/no/nav/ung/sak/perioder/UngdomsytelseVilk\303\245rsperioderTilVurderingTjeneste.java" index 007b485aec..b861970554 100644 --- "a/domenetjenester/perioder/src/main/java/no/nav/ung/sak/perioder/UngdomsytelseVilk\303\245rsperioderTilVurderingTjeneste.java" +++ "b/domenetjenester/perioder/src/main/java/no/nav/ung/sak/perioder/UngdomsytelseVilk\303\245rsperioderTilVurderingTjeneste.java" @@ -7,7 +7,6 @@ import java.util.NavigableSet; import java.util.Set; -import domene.ungdomsprogram.UngdomsprogramPeriodeTjeneste; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import no.nav.fpsak.tidsserie.LocalDateTimeline; @@ -21,6 +20,7 @@ import no.nav.ung.sak.behandlingslager.behandling.vilkår.KantIKantVurderer; import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; import no.nav.ung.sak.domene.typer.tid.TidslinjeUtil; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; import no.nav.ung.sak.vilkår.InngangsvilkårUtleder; import no.nav.ung.sak.vilkår.UtledeteVilkår; diff --git "a/domenetjenester/perioder/src/test/java/no/nav/ung/sak/perioder/UngdomsytelseS\303\270knadsperiodeTjenesteTest.java" "b/domenetjenester/perioder/src/test/java/no/nav/ung/sak/perioder/UngdomsytelseS\303\270knadsperiodeTjenesteTest.java" index 28bc6a17a1..e059475eca 100644 --- "a/domenetjenester/perioder/src/test/java/no/nav/ung/sak/perioder/UngdomsytelseS\303\270knadsperiodeTjenesteTest.java" +++ "b/domenetjenester/perioder/src/test/java/no/nav/ung/sak/perioder/UngdomsytelseS\303\270knadsperiodeTjenesteTest.java" @@ -20,13 +20,13 @@ import no.nav.ung.sak.behandlingslager.behandling.startdato.UngdomsytelseStartdatoer; import no.nav.ung.sak.behandlingslager.behandling.startdato.UngdomsytelseSøktStartdato; import no.nav.ung.sak.behandlingslager.fagsak.Fagsak; +import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriode; +import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeRepository; import no.nav.ung.sak.db.util.JpaExtension; import no.nav.ung.sak.typer.AktørId; import no.nav.ung.sak.typer.JournalpostId; import no.nav.ung.sak.typer.Saksnummer; -import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriode; -import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeRepository; -import domene.ungdomsprogram.UngdomsprogramPeriodeTjeneste; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; @ExtendWith(JpaExtension.class) @ExtendWith(CdiAwareExtension.class) diff --git a/domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramPeriodeTjeneste.java b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramPeriodeTjeneste.java similarity index 90% rename from domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramPeriodeTjeneste.java rename to domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramPeriodeTjeneste.java index 5e3452ce4c..42783ef475 100644 --- a/domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramPeriodeTjeneste.java +++ b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramPeriodeTjeneste.java @@ -1,4 +1,4 @@ -package domene.ungdomsprogram; +package no.nav.ung.sak.ungdomsprogram; import java.util.Optional; @@ -15,6 +15,8 @@ import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeGrunnlag; import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeRepository; import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; +import no.nav.ung.sak.ungdomsprogram.forbruktedager.FinnForbrukteDager; +import no.nav.ung.sak.ungdomsprogram.forbruktedager.VurderAntallDagerResultat; @Dependent public class UngdomsprogramPeriodeTjeneste { @@ -33,6 +35,11 @@ public LocalDateTimeline finnPeriodeTidslinje(Long behandlingId) { return lagPeriodeTidslinje(ungdomsprogramPeriodeGrunnlag); } + public VurderAntallDagerResultat finnVirkedagerTidslinje(Long behandlingId) { + var tidslinje = finnPeriodeTidslinje(behandlingId); + return FinnForbrukteDager.finnForbrukteDager(tidslinje); + } + /** * Utleder tidslinje for endringer i perioder fra grunnlaget i forrige behandling og det aktive. I førstegangsbehandlinger vil alle perioder returnerers som endring. * diff --git a/domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramRegisterFeil.java b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramRegisterFeil.java similarity index 93% rename from domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramRegisterFeil.java rename to domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramRegisterFeil.java index bc71318f14..39b316eef3 100644 --- a/domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramRegisterFeil.java +++ b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramRegisterFeil.java @@ -1,4 +1,4 @@ -package domene.ungdomsprogram; +package no.nav.ung.sak.ungdomsprogram; import no.nav.k9.felles.feil.Feil; import no.nav.k9.felles.feil.FeilFactory; diff --git a/domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramRegisterKlient.java b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramRegisterKlient.java similarity index 97% rename from domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramRegisterKlient.java rename to domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramRegisterKlient.java index 75eccd46cd..5f3c2614bf 100644 --- a/domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramRegisterKlient.java +++ b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramRegisterKlient.java @@ -1,4 +1,4 @@ -package domene.ungdomsprogram; +package no.nav.ung.sak.ungdomsprogram; import java.net.URI; import java.net.URISyntaxException; diff --git a/domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramTjeneste.java b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramTjeneste.java similarity index 98% rename from domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramTjeneste.java rename to domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramTjeneste.java index 9d9ab516dd..32356fb347 100644 --- a/domenetjenester/ungdomsprogram/src/main/java/domene/ungdomsprogram/UngdomsprogramTjeneste.java +++ b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/UngdomsprogramTjeneste.java @@ -1,4 +1,4 @@ -package domene.ungdomsprogram; +package no.nav.ung.sak.ungdomsprogram; import java.util.Collection; diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/FinnForbrukteDager.java b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/forbruktedager/FinnForbrukteDager.java similarity index 98% rename from behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/FinnForbrukteDager.java rename to domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/forbruktedager/FinnForbrukteDager.java index cf87ddfa0d..f013da8817 100644 --- a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/FinnForbrukteDager.java +++ b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/forbruktedager/FinnForbrukteDager.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.domene.behandling.steg.uttak; +package no.nav.ung.sak.ungdomsprogram.forbruktedager; import java.util.List; diff --git a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderAntallDagerResultat.java b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/forbruktedager/VurderAntallDagerResultat.java similarity index 75% rename from behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderAntallDagerResultat.java rename to domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/forbruktedager/VurderAntallDagerResultat.java index 4065ed2827..4db3e54827 100644 --- a/behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/uttak/VurderAntallDagerResultat.java +++ b/domenetjenester/ungdomsprogram/src/main/java/no/nav/ung/sak/ungdomsprogram/forbruktedager/VurderAntallDagerResultat.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.domene.behandling.steg.uttak; +package no.nav.ung.sak.ungdomsprogram.forbruktedager; import no.nav.fpsak.tidsserie.LocalDateTimeline; diff --git a/domenetjenester/vedtak/src/main/java/no/nav/ung/sak/domene/vedtak/observer/VedtakFattetEventObserver.java b/domenetjenester/vedtak/src/main/java/no/nav/ung/sak/domene/vedtak/observer/VedtakFattetEventObserver.java index 3291e7218a..c0a766cc4e 100644 --- a/domenetjenester/vedtak/src/main/java/no/nav/ung/sak/domene/vedtak/observer/VedtakFattetEventObserver.java +++ b/domenetjenester/vedtak/src/main/java/no/nav/ung/sak/domene/vedtak/observer/VedtakFattetEventObserver.java @@ -8,11 +8,12 @@ import no.nav.k9.prosesstask.api.ProsessTaskTjeneste; import no.nav.ung.kodeverk.vedtak.IverksettingStatus; import no.nav.ung.sak.behandlingslager.behandling.vedtak.BehandlingVedtakEvent; -import no.nav.ung.sak.formidling.BrevbestillingTask; +import no.nav.ung.sak.formidling.bestilling.BrevbestillingTask; @ApplicationScoped public class VedtakFattetEventObserver { + public static final String BREVBESTILLING_TASKTYPE = "formidling.brevbestilling"; private ProsessTaskTjeneste taskTjeneste; public VedtakFattetEventObserver() { @@ -25,6 +26,7 @@ public VedtakFattetEventObserver(ProsessTaskTjeneste taskTjeneste) { public void observerBehandlingVedtak(@Observes BehandlingVedtakEvent event) { if (IverksettingStatus.IVERKSATT.equals(event.getVedtak().getIverksettingStatus())) { + //TODO flytt til formidling pakke var gruppe = new ProsessTaskGruppe(opprettTaskForBrevbestilling(event)); if (erBehandlingAvRettTypeForAbakus(event)) { @@ -35,7 +37,8 @@ public void observerBehandlingVedtak(@Observes BehandlingVedtakEvent event) { } private static ProsessTaskData opprettTaskForBrevbestilling(BehandlingVedtakEvent event) { - ProsessTaskData prosessTaskData = ProsessTaskData.forProsessTask(BrevbestillingTask.class); + ProsessTaskData prosessTaskData = ProsessTaskData.forProsessTask(BrevbestillingTask.class + ); prosessTaskData.setBehandling(event.getFagsakId(), event.getBehandlingId()); return prosessTaskData; } diff --git a/domenetjenester/vedtak/src/test/java/no/nav/ung/sak/domene/vedtak/observer/VedtakFattetEventObserverTest.java b/domenetjenester/vedtak/src/test/java/no/nav/ung/sak/domene/vedtak/observer/VedtakFattetEventObserverTest.java index 473ecf4548..4607d18dc4 100644 --- a/domenetjenester/vedtak/src/test/java/no/nav/ung/sak/domene/vedtak/observer/VedtakFattetEventObserverTest.java +++ b/domenetjenester/vedtak/src/test/java/no/nav/ung/sak/domene/vedtak/observer/VedtakFattetEventObserverTest.java @@ -1,5 +1,6 @@ package no.nav.ung.sak.domene.vedtak.observer; +import static no.nav.ung.sak.domene.vedtak.observer.VedtakFattetEventObserver.BREVBESTILLING_TASKTYPE; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; @@ -33,7 +34,6 @@ import no.nav.ung.sak.behandlingslager.behandling.vedtak.BehandlingVedtakEvent; import no.nav.ung.sak.behandlingslager.behandling.vedtak.BehandlingVedtakRepository; import no.nav.ung.sak.db.util.JpaExtension; -import no.nav.ung.sak.formidling.BrevbestillingTask; import no.nav.ung.sak.typer.AktørId; @ExtendWith(CdiAwareExtension.class) @@ -70,7 +70,7 @@ public void publisererVedtakForIverksatteVedtak() { assertThat(prosessTaskGruppeCaptorCaptor.getAllValues().stream().map(ProsessTaskGruppe::getTasks) .flatMap(Collection::stream) .map(it -> it.getTask().getTaskType())) - .containsExactlyInAnyOrder(PubliserVedtattYtelseHendelseTask.TASKTYPE, BrevbestillingTask.TASKTYPE); + .containsExactlyInAnyOrder(PubliserVedtattYtelseHendelseTask.TASKTYPE, BREVBESTILLING_TASKTYPE); } @Test @@ -90,7 +90,7 @@ public void publisererKunGenereltVedtakseventVedAvslag() { assertThat(prosessTaskGruppeCaptorCaptor.getAllValues().stream().map(ProsessTaskGruppe::getTasks) .flatMap(Collection::stream) .map(it -> it.getTask().getTaskType())) - .containsExactly(BrevbestillingTask.TASKTYPE, PubliserVedtattYtelseHendelseTask.TASKTYPE); + .containsExactly(BREVBESTILLING_TASKTYPE, PubliserVedtattYtelseHendelseTask.TASKTYPE); } private Behandling lagBehandling() { diff --git a/formidling/pom.xml b/formidling/pom.xml index c2a89520a6..b6f838d0f6 100644 --- a/formidling/pom.xml +++ b/formidling/pom.xml @@ -53,6 +53,11 @@ behandlingslager-testutilities test + + org.jsoup + jsoup + test + diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/BrevGenerererTjeneste.java b/formidling/src/main/java/no/nav/ung/sak/formidling/BrevGenerererTjeneste.java index f89e024046..644dda21fd 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/BrevGenerererTjeneste.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/BrevGenerererTjeneste.java @@ -3,82 +3,111 @@ import java.util.Objects; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import no.nav.ung.sak.behandlingslager.aktør.PersoninfoBasis; +import no.nav.fpsak.tidsserie.LocalDateTimeline; import no.nav.ung.sak.behandlingslager.behandling.Behandling; +import no.nav.ung.sak.behandlingslager.behandling.personopplysning.PersonopplysningEntitet; +import no.nav.ung.sak.behandlingslager.behandling.personopplysning.PersonopplysningGrunnlagEntitet; +import no.nav.ung.sak.behandlingslager.behandling.personopplysning.PersonopplysningRepository; import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingRepository; import no.nav.ung.sak.domene.person.pdl.AktørTjeneste; -import no.nav.ung.sak.domene.person.pdl.PersonBasisTjeneste; -import no.nav.ung.sak.formidling.domene.GenerertBrev; -import no.nav.ung.sak.formidling.domene.PdlPerson; -import no.nav.ung.sak.formidling.dto.Brevbestilling; +import no.nav.ung.sak.formidling.innhold.InnvilgelseInnholdBygger; import no.nav.ung.sak.formidling.pdfgen.PdfGenDokument; import no.nav.ung.sak.formidling.pdfgen.PdfGenKlient; import no.nav.ung.sak.formidling.template.TemplateInput; -import no.nav.ung.sak.formidling.template.TemplateType; -import no.nav.ung.sak.formidling.template.dto.InnvilgelseDto; +import no.nav.ung.sak.formidling.template.dto.TemplateDto; import no.nav.ung.sak.formidling.template.dto.felles.FellesDto; import no.nav.ung.sak.formidling.template.dto.felles.MottakerDto; import no.nav.ung.sak.typer.AktørId; +import no.nav.ung.sak.ytelse.DagsatsOgUtbetalingsgrad; +import no.nav.ung.sak.ytelse.beregning.TilkjentYtelseUtleder; @ApplicationScoped public class BrevGenerererTjeneste { + private static final Logger LOG = LoggerFactory.getLogger(BrevGenerererTjeneste.class); + private BehandlingRepository behandlingRepository; - private PersonBasisTjeneste personBasisTjeneste; private AktørTjeneste aktørTjeneste; private PdfGenKlient pdfGen; + private TilkjentYtelseUtleder tilkjentYtelseUtleder; + private PersonopplysningRepository personopplysningRepository; + //Gjør om til Instance når flere maler kommer på plass, og hent vha en type + private InnvilgelseInnholdBygger innvilgelseInnholdBygger; @Inject public BrevGenerererTjeneste( BehandlingRepository behandlingRepository, - PersonBasisTjeneste personBasisTjeneste, AktørTjeneste aktørTjeneste, - PdfGenKlient pdfGen) { + PdfGenKlient pdfGen, + TilkjentYtelseUtleder tilkjentYtelseUtleder, + PersonopplysningRepository personopplysningRepository, + InnvilgelseInnholdBygger innvilgelseInnholdBygger) { this.behandlingRepository = behandlingRepository; - this.personBasisTjeneste = personBasisTjeneste; this.aktørTjeneste = aktørTjeneste; this.pdfGen = pdfGen; + this.tilkjentYtelseUtleder = tilkjentYtelseUtleder; + this.personopplysningRepository = personopplysningRepository; + this.innvilgelseInnholdBygger = innvilgelseInnholdBygger; } public BrevGenerererTjeneste() { } - public GenerertBrev generer(Brevbestilling brevbestilling) { - Behandling behandling = behandlingRepository.hentBehandling(brevbestilling.behandlingId()); - var pdlMottaker = hentMottaker(behandling); + public GenerertBrev genererVedtaksbrev(Long behandlingId) { + var behandling = behandlingRepository.hentBehandling(behandlingId); + if (!behandling.erAvsluttet()) { + throw new IllegalStateException("Behandling må være avsluttet for å kunne bestille vedtaksbrev"); + } - // valider mal via regel hvis vedtaksbrev + LocalDateTimeline tilkjentYtelseTidslinje = + tilkjentYtelseUtleder.utledTilkjentYtelseTidslinje(behandlingId); + if (tilkjentYtelseTidslinje.isEmpty()) { + LOG.warn("Behandling har ingen tilkjent ytelse. Støtter ikke vedtaksbrev for avslag foreløpig. BehandlingResultat={}", behandling.getBehandlingResultatType()); + return null; + } + + var pdlMottaker = hentMottaker(behandling); - // lag brev json via datasamler og velg templateData - var input = new TemplateInput(TemplateType.INNVILGELSE, - new InnvilgelseDto( - FellesDto.automatisk(new MottakerDto(pdlMottaker.navn(), pdlMottaker.fnr())) - )); + var resultat = innvilgelseInnholdBygger.bygg(behandling); + var input = new TemplateInput(resultat.templateType(), + new TemplateDto( + FellesDto.automatisk(new MottakerDto(pdlMottaker.navn(), pdlMottaker.fnr())), + resultat.templateInnholdDto() + ) + ); - // konverter til pdf fra templateData PdfGenDokument dokument = pdfGen.lagDokument(input); return new GenerertBrev( dokument, pdlMottaker, pdlMottaker, - brevbestilling.malType(), - input.templateType() + resultat.dokumentMalType(), + resultat.templateType() ); } + private PdlPerson hentMottaker(Behandling behandling) { + PersonopplysningGrunnlagEntitet personopplysningGrunnlagEntitet = personopplysningRepository.hentPersonopplysninger(behandling.getId()); + PersonopplysningEntitet personopplysning = personopplysningGrunnlagEntitet.getGjeldendeVersjon().getPersonopplysning(behandling.getAktørId()); + + String navn = personopplysning.getNavn(); + AktørId aktørId = behandling.getFagsak().getAktørId(); var personIdent = aktørTjeneste.hentPersonIdentForAktørId(aktørId) .orElseThrow(() -> new IllegalArgumentException("Fant ikke person med aktørid")); - PersoninfoBasis personinfoBasis = personBasisTjeneste.hentBasisPersoninfo(aktørId, personIdent); String fnr = personIdent.getIdent(); Objects.requireNonNull(fnr); - return new PdlPerson(fnr, aktørId, personinfoBasis.getNavn()); + + return new PdlPerson(fnr, aktørId, navn); } diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/GenerertBrev.java b/formidling/src/main/java/no/nav/ung/sak/formidling/GenerertBrev.java similarity index 93% rename from formidling/src/main/java/no/nav/ung/sak/formidling/domene/GenerertBrev.java rename to formidling/src/main/java/no/nav/ung/sak/formidling/GenerertBrev.java index 697f5be22d..80a8ee2b80 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/GenerertBrev.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/GenerertBrev.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.formidling.domene; +package no.nav.ung.sak.formidling; import no.nav.ung.kodeverk.dokument.DokumentMalType; import no.nav.ung.sak.formidling.pdfgen.PdfGenDokument; diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/PdlPerson.java b/formidling/src/main/java/no/nav/ung/sak/formidling/PdlPerson.java similarity index 72% rename from formidling/src/main/java/no/nav/ung/sak/formidling/domene/PdlPerson.java rename to formidling/src/main/java/no/nav/ung/sak/formidling/PdlPerson.java index 1213d97292..bdb3d6e24a 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/PdlPerson.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/PdlPerson.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.formidling.domene; +package no.nav.ung.sak.formidling; import no.nav.ung.sak.typer.AktørId; diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/BehandlingBrevbestillingEntitet.java b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BehandlingBrevbestillingEntitet.java similarity index 98% rename from formidling/src/main/java/no/nav/ung/sak/formidling/domene/BehandlingBrevbestillingEntitet.java rename to formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BehandlingBrevbestillingEntitet.java index ffb5ccde23..d4700ef66c 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/BehandlingBrevbestillingEntitet.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BehandlingBrevbestillingEntitet.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.formidling.domene; +package no.nav.ung.sak.formidling.bestilling; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/BrevMottaker.java b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevMottaker.java similarity index 94% rename from formidling/src/main/java/no/nav/ung/sak/formidling/domene/BrevMottaker.java rename to formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevMottaker.java index 6f7d004e96..546d669da5 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/BrevMottaker.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevMottaker.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.formidling.domene; +package no.nav.ung.sak.formidling.bestilling; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/BrevbestillingEntitet.java b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingEntitet.java similarity index 99% rename from formidling/src/main/java/no/nav/ung/sak/formidling/domene/BrevbestillingEntitet.java rename to formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingEntitet.java index 615236fb6d..514ae29a49 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/BrevbestillingEntitet.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingEntitet.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.formidling.domene; +package no.nav.ung.sak.formidling.bestilling; import java.util.UUID; diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/BrevbestillingRepository.java b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingRepository.java similarity index 89% rename from formidling/src/main/java/no/nav/ung/sak/formidling/BrevbestillingRepository.java rename to formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingRepository.java index baa8aa8e86..6f07c2d374 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/BrevbestillingRepository.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingRepository.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.formidling; +package no.nav.ung.sak.formidling.bestilling; import java.util.List; @@ -6,8 +6,6 @@ import jakarta.inject.Inject; import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; -import no.nav.ung.sak.formidling.domene.BehandlingBrevbestillingEntitet; -import no.nav.ung.sak.formidling.domene.BrevbestillingEntitet; @Dependent public class BrevbestillingRepository { diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/BrevbestillingStatusType.java b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingStatusType.java similarity index 61% rename from formidling/src/main/java/no/nav/ung/sak/formidling/domene/BrevbestillingStatusType.java rename to formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingStatusType.java index 0821b9f0be..5862865765 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/BrevbestillingStatusType.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingStatusType.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.formidling.domene; +package no.nav.ung.sak.formidling.bestilling; public enum BrevbestillingStatusType { JOURNALFØRT, NY, FULLFØRT diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/BrevbestillingTask.java b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingTask.java similarity index 86% rename from formidling/src/main/java/no/nav/ung/sak/formidling/BrevbestillingTask.java rename to formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingTask.java index c6fa37ac9b..c079c22e4f 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/BrevbestillingTask.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingTask.java @@ -1,7 +1,7 @@ -package no.nav.ung.sak.formidling; +package no.nav.ung.sak.formidling.bestilling; -import static no.nav.ung.sak.formidling.BrevdistribusjonTask.BREVBESTILLING_DISTRIBUSJONSTYPE; -import static no.nav.ung.sak.formidling.BrevdistribusjonTask.BREVBESTILLING_ID_PARAM; +import static no.nav.ung.sak.formidling.bestilling.BrevdistribusjonTask.BREVBESTILLING_DISTRIBUSJONSTYPE; +import static no.nav.ung.sak.formidling.bestilling.BrevdistribusjonTask.BREVBESTILLING_ID_PARAM; import java.util.List; import java.util.UUID; @@ -18,34 +18,29 @@ import no.nav.ung.kodeverk.behandling.BehandlingResultatType; import no.nav.ung.kodeverk.dokument.DokumentMalType; import no.nav.ung.kodeverk.formidling.IdType; -import no.nav.ung.kodeverk.formidling.RolleType; import no.nav.ung.sak.behandlingslager.behandling.Behandling; import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingRepository; import no.nav.ung.sak.behandlingslager.fagsak.Fagsak; import no.nav.ung.sak.behandlingslager.fagsak.FagsakProsesstaskRekkefølge; import no.nav.ung.sak.behandlingslager.task.BehandlingProsessTask; +import no.nav.ung.sak.formidling.BrevGenerererTjeneste; +import no.nav.ung.sak.formidling.GenerertBrev; import no.nav.ung.sak.formidling.dokarkiv.DokArkivKlient; import no.nav.ung.sak.formidling.dokarkiv.dto.OpprettJournalpostRequest; import no.nav.ung.sak.formidling.dokarkiv.dto.OpprettJournalpostRequestBuilder; import no.nav.ung.sak.formidling.dokdist.dto.DistribuerJournalpostRequest.DistribusjonsType; -import no.nav.ung.sak.formidling.domene.BehandlingBrevbestillingEntitet; -import no.nav.ung.sak.formidling.domene.BrevMottaker; -import no.nav.ung.sak.formidling.domene.BrevbestillingEntitet; -import no.nav.ung.sak.formidling.domene.GenerertBrev; -import no.nav.ung.sak.formidling.dto.Brevbestilling; -import no.nav.ung.sak.formidling.dto.PartRequestDto; /** - * https://confluence.adeo.no/pages/viewpage.action?pageId=377701645 + * dokarkiv doc *

- * https://dokarkiv-q2.dev.intern.nav.no/swagger-ui/index.html#/ + * dokarkiv-q2.dev swagger */ @ApplicationScoped @ProsessTask(value = BrevbestillingTask.TASKTYPE) @FagsakProsesstaskRekkefølge(gruppeSekvens = true) public class BrevbestillingTask extends BehandlingProsessTask { - public static final String TASKTYPE = "formidling.brevbestlling"; + public static final String TASKTYPE = "formidling.brevbestilling"; private static final Logger LOG = LoggerFactory.getLogger(BrevbestillingTask.class); @@ -100,14 +95,7 @@ protected void prosesser(ProsessTaskData prosessTaskData) { LOG.info("Brevbestilling forespurt {}", behandlingBestilling); - var generertBrev = brevGenerererTjeneste.generer( - new Brevbestilling( - behandling.getId(), - DokumentMalType.INNVILGELSE_DOK, - saksnummer, - new PartRequestDto(fagsak.getAktørId().getAktørId(), IdType.AKTØRID, RolleType.BRUKER), - null) - ); + var generertBrev = brevGenerererTjeneste.genererVedtaksbrev(behandling.getId()); brevbestillingRepository.lagreForBehandling(behandlingBestilling); diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/BrevdistribusjonTask.java b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevdistribusjonTask.java similarity index 94% rename from formidling/src/main/java/no/nav/ung/sak/formidling/BrevdistribusjonTask.java rename to formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevdistribusjonTask.java index 993eb4ea1c..633188bcaf 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/BrevdistribusjonTask.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/BrevdistribusjonTask.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.formidling; +package no.nav.ung.sak.formidling.bestilling; import java.util.Objects; @@ -16,8 +16,6 @@ import no.nav.ung.sak.formidling.dokdist.DokDistRestKlient; import no.nav.ung.sak.formidling.dokdist.dto.DistribuerJournalpostRequest; import no.nav.ung.sak.formidling.dokdist.dto.DistribuerJournalpostRequest.DistribusjonsType; -import no.nav.ung.sak.formidling.domene.BrevbestillingEntitet; -import no.nav.ung.sak.formidling.domene.BrevbestillingStatusType; /** * Distribuerer en bestilling via dokumentdistribusjon diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/DokumentMalTypeKodeverdiConverter.java b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/DokumentMalTypeKodeverdiConverter.java similarity index 92% rename from formidling/src/main/java/no/nav/ung/sak/formidling/domene/DokumentMalTypeKodeverdiConverter.java rename to formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/DokumentMalTypeKodeverdiConverter.java index 8d40ab1248..378261ec05 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/domene/DokumentMalTypeKodeverdiConverter.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/bestilling/DokumentMalTypeKodeverdiConverter.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.formidling.domene; +package no.nav.ung.sak.formidling.bestilling; import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/GrunnlagOgTilkjentYtelse.java b/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/GrunnlagOgTilkjentYtelse.java new file mode 100644 index 0000000000..d1dcb296ad --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/GrunnlagOgTilkjentYtelse.java @@ -0,0 +1,20 @@ +package no.nav.ung.sak.formidling.innhold; + +import java.math.BigDecimal; + +import no.nav.ung.kodeverk.ungdomsytelse.sats.UngdomsytelseSatsType; + +/** + * Intermediary objekt for å periodisere felter for beregning og tilkjent ytelse i brev. + */ +public record GrunnlagOgTilkjentYtelse( + long dagsats, + BigDecimal utbetalingsgrad, + UngdomsytelseSatsType satsType, + BigDecimal grunnbeløpFaktor, + long grunnbeløp, + long årsbeløp, + Integer antallBarn, + int barnetillegg +) { +} diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/InnvilgelseInnholdBygger.java b/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/InnvilgelseInnholdBygger.java new file mode 100644 index 0000000000..581183bebb --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/InnvilgelseInnholdBygger.java @@ -0,0 +1,195 @@ +package no.nav.ung.sak.formidling.innhold; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.util.Comparator; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import jakarta.enterprise.context.Dependent; +import jakarta.inject.Inject; +import no.nav.fpsak.tidsserie.LocalDateSegment; +import no.nav.fpsak.tidsserie.LocalDateSegmentCombinator; +import no.nav.fpsak.tidsserie.LocalDateTimeline; +import no.nav.ung.kodeverk.dokument.DokumentMalType; +import no.nav.ung.kodeverk.ungdomsytelse.sats.UngdomsytelseSatsType; +import no.nav.ung.sak.behandlingslager.behandling.Behandling; +import no.nav.ung.sak.behandlingslager.behandling.personopplysning.PersonopplysningRepository; +import no.nav.ung.sak.behandlingslager.ytelse.UngdomsytelseGrunnlagRepository; +import no.nav.ung.sak.behandlingslager.ytelse.sats.Sats; +import no.nav.ung.sak.behandlingslager.ytelse.sats.UngdomsytelseSatser; +import no.nav.ung.sak.formidling.template.TemplateType; +import no.nav.ung.sak.formidling.template.dto.InnvilgelseDto; +import no.nav.ung.sak.formidling.template.dto.felles.PeriodeDto; +import no.nav.ung.sak.formidling.template.dto.innvilgelse.GbeløpPeriodeDto; +import no.nav.ung.sak.formidling.template.dto.innvilgelse.ResultatFlaggDto; +import no.nav.ung.sak.formidling.template.dto.innvilgelse.SatserDto; +import no.nav.ung.sak.formidling.template.dto.innvilgelse.TilkjentPeriodeDto; +import no.nav.ung.sak.formidling.template.dto.innvilgelse.TilkjentYtelseDto; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; +import no.nav.ung.sak.ungdomsprogram.forbruktedager.VurderAntallDagerResultat; +import no.nav.ung.sak.ytelse.DagsatsOgUtbetalingsgrad; +import no.nav.ung.sak.ytelse.beregning.TilkjentYtelseUtleder; + +@Dependent +public class InnvilgelseInnholdBygger implements VedtaksbrevInnholdBygger { + + private UngdomsytelseGrunnlagRepository ungdomsytelseGrunnlagRepository; + private UngdomsprogramPeriodeTjeneste ungdomsprogramPeriodeTjeneste; + private TilkjentYtelseUtleder tilkjentYtelseUtleder; + private PersonopplysningRepository personopplysningRepository; + + @Inject + public InnvilgelseInnholdBygger( + UngdomsytelseGrunnlagRepository ungdomsytelseGrunnlagRepository, + UngdomsprogramPeriodeTjeneste ungdomsprogramPeriodeTjeneste, + TilkjentYtelseUtleder tilkjentYtelseUtleder, + PersonopplysningRepository personopplysningRepository) { + + this.ungdomsytelseGrunnlagRepository = ungdomsytelseGrunnlagRepository; + this.ungdomsprogramPeriodeTjeneste = ungdomsprogramPeriodeTjeneste; + this.tilkjentYtelseUtleder = tilkjentYtelseUtleder; + this.personopplysningRepository = personopplysningRepository; + } + + public InnvilgelseInnholdBygger() { + } + + @Override + public TemplateInnholdResultat bygg(Behandling behandling) { + Long behandlingId = behandling.getId(); + var tilkjentYtelseTidslinje = + tilkjentYtelseUtleder.utledTilkjentYtelseTidslinje(behandlingId); + + var ungdomsytelseGrunnlag = ungdomsytelseGrunnlagRepository.hentGrunnlag(behandlingId) + .orElseThrow(() -> new IllegalStateException("Mangler grunnlag")); + + var grunnlagOgTilkjentYtelseTidslinje = tilkjentYtelseTidslinje + .intersection(ungdomsytelseGrunnlag.getSatsTidslinje(), sammenstillGrunnlagOgTilkjentYtelse()) + .compress(); + + var tilkjentePerioder = lagTilkjentePerioderDto(grunnlagOgTilkjentYtelseTidslinje); + var gBeløpPerioder = lagGbeløpPerioderDto(grunnlagOgTilkjentYtelseTidslinje); + var ytelseFom = grunnlagOgTilkjentYtelseTidslinje.getMinLocalDate(); + var satser = lagSatsDto(grunnlagOgTilkjentYtelseTidslinje); + + var vurderAntallDagerResultat = ungdomsprogramPeriodeTjeneste.finnVirkedagerTidslinje(behandlingId); + var resultatFlagg = lagResultatFlaggDto(grunnlagOgTilkjentYtelseTidslinje, vurderAntallDagerResultat, behandling); + + long antallDager = vurderAntallDagerResultat.forbrukteDager(); + if (antallDager <= 0) { + throw new IllegalStateException("Antall virkedager i programmet = %d, kan ikke sende innvilgelsesbrev da".formatted(antallDager)); + } + + return new TemplateInnholdResultat(DokumentMalType.INNVILGELSE_DOK, TemplateType.INNVILGELSE, + new InnvilgelseDto( + resultatFlagg, + ytelseFom, + antallDager, + tilkjentePerioder, + gBeløpPerioder, + satser)); + } + + private ResultatFlaggDto lagResultatFlaggDto( + LocalDateTimeline grunnlagOgTilkjentYtelseTimeline, + VurderAntallDagerResultat vurderAntallDagerResultat, + Behandling behandling) { + + var grunnlagOgTilkjentYtelse = grunnlagOgTilkjentYtelseTimeline.stream() + .map(LocalDateSegment::getValue) + .distinct() + .toList(); + + + boolean enDagsats = grunnlagOgTilkjentYtelse.stream().collect(Collectors.groupingBy(GrunnlagOgTilkjentYtelse::dagsats)).size() == 1; + boolean ettGbeløp = grunnlagOgTilkjentYtelse.stream().collect(Collectors.groupingBy(GrunnlagOgTilkjentYtelse::grunnbeløp)).size() == 1; + + var satsTyper = grunnlagOgTilkjentYtelse.stream().map(GrunnlagOgTilkjentYtelse::satsType).collect(Collectors.toSet()); + boolean lavSats = satsTyper.stream().allMatch(it -> it == UngdomsytelseSatsType.LAV); + boolean høySats = satsTyper.stream().allMatch(it -> it == UngdomsytelseSatsType.HØY); + boolean varierendeSats = satsTyper.contains(UngdomsytelseSatsType.LAV) && satsTyper.contains(UngdomsytelseSatsType.HØY); + + LocalDate fødselsdato = personopplysningRepository.hentPersonopplysninger(behandling.getId()) + .getGjeldendeVersjon() + .getPersonopplysning(behandling.getAktørId()) + .getFødselsdato(); + boolean oppnårMaksAlder = vurderAntallDagerResultat.tidslinjeNokDager() + .getMaxLocalDate() + .isAfter(fødselsdato.plusYears(Sats.HØY.getTomAlder())); + + return new ResultatFlaggDto( + enDagsats, + ettGbeløp, + lavSats, + høySats, + varierendeSats, + oppnårMaksAlder); + } + + private static Set lagGbeløpPerioderDto(LocalDateTimeline grunnlagOgTilkjentYtelseTimeline) { + return grunnlagOgTilkjentYtelseTimeline + .mapSegment(GrunnlagOgTilkjentYtelse::grunnbeløp) + .compress().stream() + .map(it -> new GbeløpPeriodeDto( + new PeriodeDto(it.getFom(), it.getTom()), it.getValue())) + .collect(Collectors.toSet()); + } + + private static SatserDto lagSatsDto(LocalDateTimeline grunnlagOgTilkjentYtelseTimeline) { + List sortertGrunnlagOgTilkjentYtelseVerdier = grunnlagOgTilkjentYtelseTimeline.stream() + .sorted(Comparator.comparing(LocalDateSegment::getLocalDateInterval, Comparator.reverseOrder())) // nyeste først + .map(LocalDateSegment::getValue) + .distinct() + .toList(); + + var nyesteLavSats = sortertGrunnlagOgTilkjentYtelseVerdier.stream() + .filter(it -> it.satsType() == UngdomsytelseSatsType.LAV) + .findFirst() + .map(GrunnlagOgTilkjentYtelse::grunnbeløpFaktor); + + var nyesteHøySats = sortertGrunnlagOgTilkjentYtelseVerdier.stream() + .filter(it -> it.satsType() == UngdomsytelseSatsType.HØY) + .findFirst() + .map(GrunnlagOgTilkjentYtelse::grunnbeløpFaktor); + + return new SatserDto(nyesteHøySats.orElse(null), nyesteLavSats.orElse(null), Sats.LAV.getTomAlder(), Sats.HØY.getTomAlder()); + } + + private static List lagTilkjentePerioderDto(LocalDateTimeline grunnlagOgTilkjentYtelseTimeline) { + return grunnlagOgTilkjentYtelseTimeline + .mapSegment(it -> + new TilkjentYtelseDto(it.dagsats(), it.grunnbeløpFaktor(), it.grunnbeløp(), it.årsbeløp())) + .compress().stream() + .sorted(Comparator.comparing(LocalDateSegment::getLocalDateInterval)) //eldste først for tilkjent perioder + .map(it -> + new TilkjentPeriodeDto(new PeriodeDto(it.getFom(), it.getTom()), it.getValue())) + .toList(); + } + + private static LocalDateSegmentCombinator sammenstillGrunnlagOgTilkjentYtelse() { + return (di, lhs, rhs) -> { + var dg = lhs.getValue(); + var sp = rhs.getValue(); + return new LocalDateSegment<>(di, + new GrunnlagOgTilkjentYtelse( + dg.dagsats(), + avrundTilHeltall(dg.utbetalingsgrad()), + sp.satsType(), + sp.grunnbeløpFaktor().setScale(2, RoundingMode.HALF_UP), + avrundTilHeltall(sp.grunnbeløp()).longValue(), + avrundTilHeltall(sp.grunnbeløp().multiply(sp.grunnbeløpFaktor())).longValue(), + sp.antallBarn(), + sp.dagsatsBarnetillegg() + )); + + }; + } + + private static BigDecimal avrundTilHeltall(BigDecimal decimal) { + return decimal.setScale(0, RoundingMode.HALF_UP); + } + +} diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/TemplateInnholdResultat.java b/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/TemplateInnholdResultat.java new file mode 100644 index 0000000000..7538755ebe --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/TemplateInnholdResultat.java @@ -0,0 +1,12 @@ +package no.nav.ung.sak.formidling.innhold; + +import no.nav.ung.kodeverk.dokument.DokumentMalType; +import no.nav.ung.sak.formidling.template.TemplateType; +import no.nav.ung.sak.formidling.template.dto.TemplateInnholdDto; + +public record TemplateInnholdResultat( + DokumentMalType dokumentMalType, + TemplateType templateType, + TemplateInnholdDto templateInnholdDto +) { +} diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/VedtaksbrevInnholdBygger.java b/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/VedtaksbrevInnholdBygger.java new file mode 100644 index 0000000000..a2e1ef7db0 --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/innhold/VedtaksbrevInnholdBygger.java @@ -0,0 +1,11 @@ +package no.nav.ung.sak.formidling.innhold; + +import no.nav.ung.sak.behandlingslager.behandling.Behandling; + +public interface VedtaksbrevInnholdBygger { + + TemplateInnholdResultat bygg(Behandling behandlingId); + +} + + diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/pdfgen/PdfGenKlient.java b/formidling/src/main/java/no/nav/ung/sak/formidling/pdfgen/PdfGenKlient.java index f0a8568f88..1cda1553a6 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/pdfgen/PdfGenKlient.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/pdfgen/PdfGenKlient.java @@ -76,7 +76,7 @@ private Path getResource(String relativePath) { public PdfGenDokument lagDokument(TemplateInput payload) { - JsonNode templateData = pdfgenObjectMapper.convertValue(payload.templateData(), JsonNode.class); + JsonNode templateData = pdfgenObjectMapper.convertValue(payload.templateDto(), JsonNode.class); return lagDokument(payload.templateType().getPath(), payload.templateType().getDir(), templateData); } diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/pdfgen/PdfGenObjectMapperConfig.java b/formidling/src/main/java/no/nav/ung/sak/formidling/pdfgen/PdfGenObjectMapperConfig.java index da3187fb9c..9519464df4 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/pdfgen/PdfGenObjectMapperConfig.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/pdfgen/PdfGenObjectMapperConfig.java @@ -32,7 +32,7 @@ static ObjectMapper lag() { class NorskDatoSerialiserer extends StdSerializer { private static final DateTimeFormatter NORSK_DATE_FORMATTER = - DateTimeFormatter.ofPattern("d. MMMM yyyy", new Locale("no", "NO")); + DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.of("no", "NO")); public NorskDatoSerialiserer() { super(LocalDate.class); @@ -48,7 +48,7 @@ public void serialize(LocalDate dato, JsonGenerator gen, SerializerProvider prov class NorskTidspunktSerialiserer extends StdSerializer { private static final DateTimeFormatter NORSK_DATETIME_FORMATTER = - DateTimeFormatter.ofPattern("d. MMMM yyyy 'kl.' HH:mm", new Locale("no", "NO")); + DateTimeFormatter.ofPattern("d. MMMM yyyy 'kl.' HH:mm", Locale.of("no", "NO")); public NorskTidspunktSerialiserer() { super(LocalDateTime.class); diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/TemplateData.java b/formidling/src/main/java/no/nav/ung/sak/formidling/template/TemplateData.java deleted file mode 100644 index bcebac40d0..0000000000 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/template/TemplateData.java +++ /dev/null @@ -1,12 +0,0 @@ -package no.nav.ung.sak.formidling.template; - -import no.nav.ung.sak.formidling.template.dto.felles.FellesDto; - -/** - * Object som konverteres til json og mates inn til pdfgen Handlebar - * Arves av alle som bruker - */ -public interface TemplateData { - FellesDto felles(); -} - diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/TemplateInput.java b/formidling/src/main/java/no/nav/ung/sak/formidling/template/TemplateInput.java index 14395d166b..125f6b9a3f 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/template/TemplateInput.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/template/TemplateInput.java @@ -1,13 +1,11 @@ package no.nav.ung.sak.formidling.template; +import no.nav.ung.sak.formidling.template.dto.TemplateDto; + /** * - * @param templateType malfilen for pdfgen - * @param templateData dto for pdfgen + * @param templateType malfilen for pdfgen + * @param templateDto dto for pdfgen */ -public record TemplateInput( - TemplateType templateType, - TemplateData templateData - -) { +public record TemplateInput(TemplateType templateType, TemplateDto templateDto) { } diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/InnvilgelseDto.java b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/InnvilgelseDto.java index bd939e603c..148d710783 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/InnvilgelseDto.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/InnvilgelseDto.java @@ -1,10 +1,23 @@ package no.nav.ung.sak.formidling.template.dto; -import no.nav.ung.sak.formidling.template.TemplateData; -import no.nav.ung.sak.formidling.template.dto.felles.FellesDto; +import java.time.LocalDate; +import java.util.List; +import java.util.Set; +import no.nav.ung.sak.formidling.template.dto.innvilgelse.GbeløpPeriodeDto; +import no.nav.ung.sak.formidling.template.dto.innvilgelse.ResultatFlaggDto; +import no.nav.ung.sak.formidling.template.dto.innvilgelse.SatserDto; +import no.nav.ung.sak.formidling.template.dto.innvilgelse.TilkjentPeriodeDto; + +/** + * Hoved-DTO for innvilgelsesbrev + */ public record InnvilgelseDto( - FellesDto felles -) implements TemplateData { + ResultatFlaggDto resultat, + LocalDate ytelseFom, + long antallDager, + List tilkjentePerioder, + Set gbeløpPerioder, + SatserDto satser) implements TemplateInnholdDto { } diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/README.MD b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/README.MD new file mode 100644 index 0000000000..0a5aa292fe --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/README.MD @@ -0,0 +1 @@ +Dto'ene i denne klassen brukes av template filer og skal ikke brukes som output i resttjenester eller lagring i database diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/TemplateDto.java b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/TemplateDto.java new file mode 100644 index 0000000000..a8f457a2a5 --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/TemplateDto.java @@ -0,0 +1,19 @@ +package no.nav.ung.sak.formidling.template.dto; + +import com.fasterxml.jackson.annotation.JsonUnwrapped; + +import no.nav.ung.sak.formidling.template.dto.felles.FellesDto; + +/** + * Hoved-dto for alle brev + * + * @param felles + * @param templateDataDto + */ +public record TemplateDto( + FellesDto felles, + //inliner feltene fordi det er enklere å jobbe med i templatefiler + @JsonUnwrapped TemplateInnholdDto templateDataDto + ) +{ +} diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/TemplateInnholdDto.java b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/TemplateInnholdDto.java new file mode 100644 index 0000000000..d259c67836 --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/TemplateInnholdDto.java @@ -0,0 +1,7 @@ +package no.nav.ung.sak.formidling.template.dto; + +/** + * Marker for template innmat dto'er + */ +public sealed interface TemplateInnholdDto permits InnvilgelseDto { +} diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/felles/FellesDto.java b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/felles/FellesDto.java index b237abc748..c84af5ffbc 100644 --- a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/felles/FellesDto.java +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/felles/FellesDto.java @@ -3,10 +3,10 @@ import java.time.LocalDate; import no.nav.ung.kodeverk.behandling.FagsakYtelseType; -import no.nav.ung.sak.formidling.template.TemplateData; +import no.nav.ung.sak.formidling.template.dto.TemplateDto; /** - * Felles felter som kan brukes av alle brev. Brukes via {@link TemplateData} + * Felles felter som kan brukes av alle brev. Brukes via {@link TemplateDto} */ public record FellesDto( LocalDate brevDato, diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/felles/PeriodeDto.java b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/felles/PeriodeDto.java new file mode 100644 index 0000000000..ffb022bf07 --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/felles/PeriodeDto.java @@ -0,0 +1,22 @@ +package no.nav.ung.sak.formidling.template.dto.felles; + + +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + +@JsonInclude(JsonInclude.Include.NON_NULL) +public record PeriodeDto( + LocalDate fom, + LocalDate tom +) { + @JsonProperty + public boolean harFlereDager() { + if (fom == null || tom == null) { + return true; + } + return ChronoUnit.DAYS.between(fom, tom) > 0L; + } +} diff --git "a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/Gbel\303\270pPeriodeDto.java" "b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/Gbel\303\270pPeriodeDto.java" new file mode 100644 index 0000000000..44f0c992cd --- /dev/null +++ "b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/Gbel\303\270pPeriodeDto.java" @@ -0,0 +1,9 @@ +package no.nav.ung.sak.formidling.template.dto.innvilgelse; + +import no.nav.ung.sak.formidling.template.dto.felles.PeriodeDto; + +public record GbeløpPeriodeDto( + PeriodeDto periode, + long gBeløp +) { +} diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/ResultatFlaggDto.java b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/ResultatFlaggDto.java new file mode 100644 index 0000000000..6a1e958360 --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/ResultatFlaggDto.java @@ -0,0 +1,11 @@ +package no.nav.ung.sak.formidling.template.dto.innvilgelse; + +public record ResultatFlaggDto( + boolean enDagsats, + boolean ettGbeløp, + boolean lavSats, + boolean høySats, + boolean varierendeSats, + boolean oppnårMaksAlder +) { +} diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/SatserDto.java b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/SatserDto.java new file mode 100644 index 0000000000..f5cf8e1584 --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/SatserDto.java @@ -0,0 +1,11 @@ +package no.nav.ung.sak.formidling.template.dto.innvilgelse; + +import java.math.BigDecimal; + +public record SatserDto( + BigDecimal høy, + BigDecimal lav, + Integer aldersgrenseLav, + Integer aldersgrenseHøy +) { +} diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/TilkjentPeriodeDto.java b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/TilkjentPeriodeDto.java new file mode 100644 index 0000000000..20a6190f1e --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/TilkjentPeriodeDto.java @@ -0,0 +1,9 @@ +package no.nav.ung.sak.formidling.template.dto.innvilgelse; + +import no.nav.ung.sak.formidling.template.dto.felles.PeriodeDto; + +public record TilkjentPeriodeDto( + PeriodeDto periode, + TilkjentYtelseDto tilkjentYtelse +) { +} diff --git a/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/TilkjentYtelseDto.java b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/TilkjentYtelseDto.java new file mode 100644 index 0000000000..28b7094d26 --- /dev/null +++ b/formidling/src/main/java/no/nav/ung/sak/formidling/template/dto/innvilgelse/TilkjentYtelseDto.java @@ -0,0 +1,11 @@ +package no.nav.ung.sak.formidling.template.dto.innvilgelse; + +import java.math.BigDecimal; + +public record TilkjentYtelseDto( + long dagsats, + BigDecimal satsFaktor, + long gBeløp, + long årsbeløp +) { +} diff --git a/formidling/src/main/resources/META-INF/pu-default.brevbestilling.orm.xml b/formidling/src/main/resources/META-INF/pu-default.brevbestilling.orm.xml index e21b6f96a6..64b2f30600 100644 --- a/formidling/src/main/resources/META-INF/pu-default.brevbestilling.orm.xml +++ b/formidling/src/main/resources/META-INF/pu-default.brevbestilling.orm.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence/orm https://jakarta.ee/xml/ns/persistence/orm/orm_3_0.xsd" version="3.0"> - - + + diff --git a/formidling/src/main/resources/pdfgen/templates/felles/footer/automatisk-brev.hbs b/formidling/src/main/resources/pdfgen/templates/felles/footer/automatisk-brev.hbs deleted file mode 100644 index 2cdf5b13a5..0000000000 --- a/formidling/src/main/resources/pdfgen/templates/felles/footer/automatisk-brev.hbs +++ /dev/null @@ -1 +0,0 @@ -

Dette er et automatisk utsendt brev.

diff --git a/formidling/src/main/resources/pdfgen/templates/felles/footer/footer-vedtak.hbs b/formidling/src/main/resources/pdfgen/templates/felles/footer/footer-vedtak.hbs index d1dff556ed..86ce7d9a6a 100644 --- a/formidling/src/main/resources/pdfgen/templates/felles/footer/footer-vedtak.hbs +++ b/formidling/src/main/resources/pdfgen/templates/felles/footer/footer-vedtak.hbs @@ -1,10 +1,10 @@ - -

Du har rett til å klage

-

Du kan klage innen 6 uker fra den datoen du mottok vedtaket. Du finner skjema og informasjon på Du har rett til å klage +

Du kan klage innen 6 uker fra den datoen du mottok vedtaket. Du finner skjema og informasjon på nav.no/klage.

-

Du har rett til innsyn

-

Du kan se dokumentene i saken din ved å logge deg inn på nav.no.

+

Du har rett til innsyn

+

Du kan se dokumentene i saken din ved å logge deg inn på nav.no. +

{{> felles/footer/footer}} diff --git a/formidling/src/main/resources/pdfgen/templates/felles/footer/footer.hbs b/formidling/src/main/resources/pdfgen/templates/felles/footer/footer.hbs index fd2178bb58..ff1b2ece58 100644 --- a/formidling/src/main/resources/pdfgen/templates/felles/footer/footer.hbs +++ b/formidling/src/main/resources/pdfgen/templates/felles/footer/footer.hbs @@ -1,20 +1,9 @@ -{{#if felles.mottaker.bruker}} -

Trenger du mer informasjon?

-

Du finner mer informasjon på nav.no/omsorgspenger.

+

Trenger du mer informasjon?

+

Du finner mer informasjon på nav.no/ungdomsytelse. +

-

nav.no/kontakt kan du chatte eller skrive til oss.

+

nav.no/kontakt kan du chatte eller skrive til oss.

-

Hvis du ikke finner svar på nav.no kan du ringe oss på telefon 55 55 33 33, hverdager 09:00-15:00.

+

Hvis du ikke finner svar på nav.no kan du ringe oss på telefon 55 55 33 33, hverdager 09:00-15:00.

-{{else}} -

Har dere spørsmål?

-

Dere finner mer informasjon på nav.no/arbeidsgiver/omsorgspenger

- -

nav.no/kontakt kan dere chatte med oss.

- -

Dere kan også ringe oss på telefon 55 55 33 36, hverdager 09.00-15.00.

- -{{/if}} - - -{{> felles/footer/hilsen }} \ No newline at end of file +{{> felles/footer/hilsen }} diff --git a/formidling/src/main/resources/pdfgen/templates/felles/listetekst_separator.hbs b/formidling/src/main/resources/pdfgen/templates/felles/listetekst_separator.hbs new file mode 100644 index 0000000000..a96c5ffa10 --- /dev/null +++ b/formidling/src/main/resources/pdfgen/templates/felles/listetekst_separator.hbs @@ -0,0 +1 @@ +{{#unless @first}}{{#if @last}} og {{else}}, {{/if}}{{/unless}} \ No newline at end of file diff --git a/formidling/src/main/resources/pdfgen/templates/felles/periode-inline.hbs b/formidling/src/main/resources/pdfgen/templates/felles/periode-inline.hbs new file mode 100644 index 0000000000..34b7bfa581 --- /dev/null +++ b/formidling/src/main/resources/pdfgen/templates/felles/periode-inline.hbs @@ -0,0 +1,5 @@ +{{#if harFlereDager}} + fra {{fom}}{{#if tom}} til {{tom}}{{/if~}} +{{~else~}} + {{fom}} +{{~/if~}} \ No newline at end of file diff --git a/formidling/src/main/resources/pdfgen/templates/felles/periode.hbs b/formidling/src/main/resources/pdfgen/templates/felles/periode.hbs new file mode 100644 index 0000000000..cedf824c0d --- /dev/null +++ b/formidling/src/main/resources/pdfgen/templates/felles/periode.hbs @@ -0,0 +1 @@ +{{#if harFlereDager}}Fra {{fom}}{{#if tom}} til {{tom}}{{/if}}{{else}} {{fom}}{{/if}} \ No newline at end of file diff --git a/formidling/src/main/resources/pdfgen/templates/felles/periodeliste-inline.hbs b/formidling/src/main/resources/pdfgen/templates/felles/periodeliste-inline.hbs new file mode 100644 index 0000000000..25b791aa5f --- /dev/null +++ b/formidling/src/main/resources/pdfgen/templates/felles/periodeliste-inline.hbs @@ -0,0 +1 @@ +{{#each perioder}}{{>felles/listetekst_separator}}{{> felles/periode-inline }}{{/each}} \ No newline at end of file diff --git a/formidling/src/main/resources/pdfgen/templates/ungdomsytelse/innvilgelse.hbs b/formidling/src/main/resources/pdfgen/templates/ungdomsytelse/innvilgelse.hbs index 722f93b3a5..0d1e8b44da 100644 --- a/formidling/src/main/resources/pdfgen/templates/ungdomsytelse/innvilgelse.hbs +++ b/formidling/src/main/resources/pdfgen/templates/ungdomsytelse/innvilgelse.hbs @@ -2,11 +2,82 @@ {{#> felles/seksjon/hoved }} -

NAV har innvilget søknaden din om ungdomsytelse

-

Du får utbetalt X kroner

+

Nav har innvilget søknaden din om ungdomsytelse

+ + {{#if resultat.enDagsats}} +

Du har rett til ungdomsytelse fra {{ytelseFom}} i {{antallDager}} dager. + Du får utbetalt {{currency_no tilkjentePerioder.[0].tilkjentYtelse.dagsats true}} kroner dagen, før skatt.

+ {{else}} +

Du har rett til ungdomsytelse fra {{ytelseFom}} i {{antallDager}} dager.

+ {{#each tilkjentePerioder}} +

{{> felles/periode periode}} får du utbetalt {{currency_no tilkjentYtelse.dagsats true}} kroner dagen, før skatt.

+ {{/each}} + {{/if}} + +

Nav utbetaler pengene innen den 25. i hver måned. Informasjon om utbetaling finner du under + utbetalingsoversikten på "Min side".

+ +

Du får ungdomsytelse fordi du er med ungdomsprogrammet. Ungdomsprogrammet skal sikre deg inntekt mens du + samarbeider med veileder i Nav om tiltak som skal hjelpe deg med arbeid.

+ +

Utbetalingene fra Nav kan endre seg etterhvert som du får eller mister inntekt. Det er derfor viktig at du + melder i fra om endringer i din inntekt på nav.no/ungdomsytelse/endring + og informerer veileder. Hvis du ikke + gir beskjed om endringer i inntekten, kan Nav kreve penger tilbake, så det er viktig å gi beskjed med en + gang det skjer endringer.

+ + {{#if resultat.ettGbeløp}} + Nav bruker grunnbeløpet på {{currency_no gbeløpPerioder.[0].gBeløp true}} kroner for å regne ut hvor mye du får. + {{else}} +

Nav bruker et grunnbeløp for å regne ut hvor mye du får.

+
    + {{#each gbeløpPerioder}} +
  • {{> felles/periode periode}} bruker Nav grunnbeløpet på {{currency_no gBeløp true}} kroner.
  • + {{/each}} +
+ {{/if}} + + {{#if resultat.lavSats}} + Siden du er under {{satser.aldersgrenseLav}} år så får du {{satser.lav}} ganger grunnbeløpet. + {{else if resultat.høySats}} +

Siden du er over {{satser.aldersgrenseLav}} år så får du {{satser.høy}} ganger + grunnbeløpet{{#if resultat.oppnårMaksAlder}} til måneden du fyller {{satser.aldersgrenseHøy}} år{{/if}}.

+ {{else if resultat.varierendeSats}} +

Du får {{satser.lav}} ganger grunnbeløpet mens du er under {{satser.aldersgrenseLav}} år + og {{satser.høy}} ganger grunnbeløpet fra måneden etter du fyller {{satser.aldersgrenseLav}} år.

+ {{/if}} + + + {{#if resultat.enDagsats}} +

Nav regner med 260 virkedager per år utenom helger og ferie. For å regne ut hva du får per dag, deles + årsbeløpet på antall dager. + {{#with tilkjentePerioder.[0].tilkjentYtelse}} + Det betyr at du har rett på {{satsFaktor}} x {{currency_no gBeløp true}} = + {{currency_no årsbeløp true}} kroner i året. Dette gir en dagsats på {{currency_no dagsats true}} + kroner.

+ {{/with}} + {{else}} +

Nav regner med 260 virkedager per år utenom helger og ferie. For å regne ut hva du får per dag, deles + årsbeløpet på antall dager.

+
    + {{#each tilkjentePerioder}} +
  • {{> felles/periode periode}} + {{#with tilkjentYtelse}}har du rett på {{satsFaktor}} x {{currency_no gBeløp true}} = + {{currency_no årsbeløp true}} kroner i årsbeløp. Dette gir en dagsats på {{currency_no dagsats true}} kroner i perioden. + {{/with}} +
  • + {{/each}} +
+ {{/if}} + + +

For å regne hva du får utbetalt i måneden ganges dagsatsen med antall virkedager i måneden. Du kan regne ut + hva du får for en måned samt se flere eksempler på utregninger på + nav.no/ungdomsytelse +

+ +

Vedtaket er gjort etter folketrygdloven § X-Y.

-

Du må melde fra om endringer

-

Dersom det skjer endringer, må du melde fra til oss. En endring kan være at du begynner å jobbe.

{{/felles/seksjon/hoved}} {{> felles/footer/footer-vedtak }} diff --git a/formidling/src/test/java/no/nav/ung/sak/formidling/BrevGenerererTjenesteInnvilgelseTest.java b/formidling/src/test/java/no/nav/ung/sak/formidling/BrevGenerererTjenesteInnvilgelseTest.java new file mode 100644 index 0000000000..0976380067 --- /dev/null +++ b/formidling/src/test/java/no/nav/ung/sak/formidling/BrevGenerererTjenesteInnvilgelseTest.java @@ -0,0 +1,279 @@ +package no.nav.ung.sak.formidling; + +import static no.nav.ung.sak.formidling.HtmlAssert.assertThatHtml; +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.time.LocalDate; + +import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.api.extension.ExtendWith; + +import jakarta.inject.Inject; +import jakarta.persistence.EntityManager; +import no.nav.k9.felles.testutilities.cdi.CdiAwareExtension; +import no.nav.ung.kodeverk.behandling.BehandlingResultatType; +import no.nav.ung.sak.behandlingslager.behandling.Behandling; +import no.nav.ung.sak.behandlingslager.behandling.personopplysning.PersonopplysningRepository; +import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingRepositoryProvider; +import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeRepository; +import no.nav.ung.sak.behandlingslager.ytelse.UngdomsytelseGrunnlagRepository; +import no.nav.ung.sak.db.util.JpaExtension; +import no.nav.ung.sak.domene.person.pdl.AktørTjeneste; +import no.nav.ung.sak.formidling.innhold.InnvilgelseInnholdBygger; +import no.nav.ung.sak.formidling.pdfgen.PdfGenKlient; +import no.nav.ung.sak.formidling.template.TemplateType; +import no.nav.ung.sak.test.util.behandling.TestScenarioBuilder; +import no.nav.ung.sak.test.util.behandling.UngTestscenario; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; +import no.nav.ung.sak.ytelse.beregning.TilkjentYtelseUtleder; +import no.nav.ung.sak.ytelse.beregning.UngdomsytelseTilkjentYtelseUtleder; + +/** + * Test for brevtekster for innvilgelse. Bruker html for å validere. + * For manuell verifikasjon av pdf kan env variabel LAGRE_PDF brukes. + */ +@ExtendWith(CdiAwareExtension.class) +@ExtendWith(JpaExtension.class) +class BrevGenerererTjenesteInnvilgelseTest { + + private BrevGenerererTjeneste brevGenerererTjeneste; + + @Inject + private EntityManager entityManager; + private BehandlingRepositoryProvider repositoryProvider; + private UngdomsytelseGrunnlagRepository ungdomsytelseGrunnlagRepository; + private UngdomsprogramPeriodeRepository ungdomsprogramPeriodeRepository; + private TilkjentYtelseUtleder tilkjentYtelseUtleder; + private PersonopplysningRepository personopplysningRepository; + + PdlKlientFake pdlKlient = PdlKlientFake.medTilfeldigFnr(); + String fnr = pdlKlient.fnr(); + private TestInfo testInfo; + + + @BeforeEach + void setup(TestInfo testInfo) { + this.testInfo = testInfo; + repositoryProvider = new BehandlingRepositoryProvider(entityManager); + ungdomsytelseGrunnlagRepository = new UngdomsytelseGrunnlagRepository(entityManager); + ungdomsprogramPeriodeRepository = new UngdomsprogramPeriodeRepository(entityManager); + tilkjentYtelseUtleder = new UngdomsytelseTilkjentYtelseUtleder(ungdomsytelseGrunnlagRepository); + personopplysningRepository = repositoryProvider.getPersonopplysningRepository(); + + UngdomsprogramPeriodeTjeneste ungdomsprogramPeriodeTjeneste = new UngdomsprogramPeriodeTjeneste(ungdomsprogramPeriodeRepository); + brevGenerererTjeneste = new BrevGenerererTjeneste( + repositoryProvider.getBehandlingRepository(), + new AktørTjeneste(pdlKlient), + new PdfGenKlient(System.getenv("LAGRE_PDF") == null), + tilkjentYtelseUtleder, + personopplysningRepository, + new InnvilgelseInnholdBygger( + ungdomsytelseGrunnlagRepository, + ungdomsprogramPeriodeTjeneste, + tilkjentYtelseUtleder, + personopplysningRepository)); + } + + @Test() + @DisplayName("Verifiserer faste tekster og mottaker") + //Vurder å lage gjenbrukbar assertions som sjekker alle standardtekster og mottaker + void skalHaAlleStandardtekster() { + TestScenarioBuilder scenarioBuilder = BrevScenarioer + .lagAvsluttetStandardBehandling(repositoryProvider, ungdomsytelseGrunnlagRepository, ungdomsprogramPeriodeRepository); + + var ungTestGrunnlag = scenarioBuilder.getUngTestGrunnlag(); + var behandling = scenarioBuilder.getBehandling(); + + GenerertBrev generertBrev = genererVedtaksbrevBrev(behandling.getId()); + + var brevtekst = generertBrev.dokument().html(); + + assertThatHtml(brevtekst).containsTextsOnceInSequence( + BrevUtils.brevDatoString(LocalDate.now()), //vedtaksdato + "Til: " + ungTestGrunnlag.navn(), + "Fødselsnummer: " + fnr, + "Du har rett til å klage", + "Du kan klage innen 6 uker fra den datoen du mottok vedtaket. Du finner skjema og informasjon på nav.no/klage", + "Du har rett til innsyn", + "Du kan se dokumentene i saken din ved å logge deg inn på nav.no", + "Trenger du mer informasjon?", + "Med vennlig hilsen", + "Nav Arbeid og ytelser" + ).containsHtmlOnceInSequence( + "

Du har rett til å klage

", + "

Du har rett til innsyn

", + "

Trenger du mer informasjon?

" + ); + + + } + + + @DisplayName("Innvilgelse med riktig fom dato, maks antall dager, lav sats, grunnbeløp, hjemmel") + //Denne testen sjekker også at teksten kommer i riktig rekkefølge + @Test + void standardInnvilgelse() { + LocalDate fom = LocalDate.of(2024, 12, 1); + var ungTestGrunnlag = BrevScenarioer.innvilget19år(fom); + + var behandling = lagScenario(ungTestGrunnlag); + + GenerertBrev generertBrev = genererVedtaksbrevBrev(behandling.getId()); + assertThat(generertBrev.templateType()).isEqualTo(TemplateType.INNVILGELSE); + + var brevtekst = generertBrev.dokument().html(); + + assertThatHtml(brevtekst).containsHtmlOnceInSequence( + "

Nav har innvilget søknaden din om ungdomsytelse

" + ).containsTextsOnceInSequence( + "Til: " + ungTestGrunnlag.navn(), + "Fødselsnummer: " + fnr, + "Du har rett til ungdomsytelse fra 1. desember 2024 i 260 dager.", + "Du får utbetalt 636 kroner dagen, før skatt.", + "Nav bruker grunnbeløpet på 124 028 kroner for å regne ut hvor mye du får.", + "Siden du er under 25 år så får du 1.33 ganger grunnbeløpet.", + "Vedtaket er gjort etter folketrygdloven § X-Y." + ); + + } + + @Test + void høySats() { + LocalDate fom = LocalDate.of(2024, 12, 1); + var ungTestGrunnlag = BrevScenarioer.innvilget27år(fom); + + var behandling = lagScenario(ungTestGrunnlag); + + GenerertBrev generertBrev = genererVedtaksbrevBrev(behandling.getId()); + + var brevtekst = generertBrev.dokument().html(); + + assertThatHtml(brevtekst).containsHtmlOnceInSequence( + "

Nav har innvilget søknaden din om ungdomsytelse

" + ).containsTextsOnceInSequence( + "Du har rett til ungdomsytelse fra 1. desember 2024 i 260 dager.", + "Du får utbetalt 954 kroner dagen, før skatt.", + "Siden du er over 25 år så får du 2 ganger grunnbeløpet." + ).doesNotContainText( + "636", + "under 25 år" + ); + + } + + @DisplayName("blir 29 i løpet av programmet og får mindre enn maks antall dager") + @Test + void høySatsMaksAlder6MndIProgrammet() { + LocalDate fom = LocalDate.of(2024, 12, 1); + var fødselsdato = LocalDate.of(1996, 5, 15); //Blir 29 etter 6 mnd/130 dager i programmet + var ungTestGrunnlag = BrevScenarioer.innvilget29År(fom, fødselsdato); + + var behandling = lagScenario(ungTestGrunnlag); + + GenerertBrev generertBrev = genererVedtaksbrevBrev(behandling.getId()); + + var brevtekst = generertBrev.dokument().html(); + + assertThatHtml(brevtekst).containsHtmlOnceInSequence( + "

Nav har innvilget søknaden din om ungdomsytelse

" + ).containsTextsOnceInSequence( + "Du har rett til ungdomsytelse fra 1. desember 2024 i 130 dager.", + "Du får utbetalt 954 kroner dagen, før skatt.", + "Siden du er over 25 år så får du 2 ganger grunnbeløpet til måneden du fyller 29 år." + ).doesNotContainText( + "636", + "under 25 år" + );; + } + + //dekker flere dagsatser også + @Test + void lavOgHøySats() { + LocalDate fom = LocalDate.of(2024, 12, 1); + var fødselsdato = LocalDate.of(1999, 5, 15); //Blir 26 etter 6 mnd/130 dager i programmet + var ungTestGrunnlag = BrevScenarioer.innvilget26År(fom, fødselsdato); + + var behandling = lagScenario(ungTestGrunnlag); + + GenerertBrev generertBrev = genererVedtaksbrevBrev(behandling.getId()); + + var brevtekst = generertBrev.dokument().html(); + + assertThatHtml(brevtekst).containsHtmlOnceInSequence( + "

Nav har innvilget søknaden din om ungdomsytelse

" + ).containsTextsOnceInSequence( + "Du har rett til ungdomsytelse fra 1. desember 2024 i 260 dager.", + "Fra 1. desember 2024 til 31. mai 2025 får du utbetalt 636 kroner dagen, før skatt", + "Fra 1. juni 2025 til 1. desember 2025 får du utbetalt 954 kroner dagen, før skatt.", + "Du får 1.33 ganger grunnbeløpet mens du er under 25 år og 2 ganger grunnbeløpet fra måneden etter du fyller 25 år." + ); + } + + @Test + void pdfStrukturTest() throws IOException { + + //Lager ny fordi default PdfgenKlient lager ikke pdf + UngdomsprogramPeriodeTjeneste ungdomsprogramPeriodeTjeneste = new UngdomsprogramPeriodeTjeneste(ungdomsprogramPeriodeRepository); + var brevGenerererTjeneste = new BrevGenerererTjeneste( + repositoryProvider.getBehandlingRepository(), + new AktørTjeneste(pdlKlient), + new PdfGenKlient(false), + tilkjentYtelseUtleder, + personopplysningRepository, + new InnvilgelseInnholdBygger( + ungdomsytelseGrunnlagRepository, + ungdomsprogramPeriodeTjeneste, + tilkjentYtelseUtleder, + personopplysningRepository)); + + TestScenarioBuilder scenarioBuilder = BrevScenarioer + .lagAvsluttetStandardBehandling(repositoryProvider, ungdomsytelseGrunnlagRepository, ungdomsprogramPeriodeRepository); + + var behandling = scenarioBuilder.getBehandling(); + + GenerertBrev generertBrev = genererVedtaksbrevBrev(behandling.getId(), brevGenerererTjeneste); + + var pdf = generertBrev.dokument().pdf(); + + try (PDDocument pdDocument = Loader.loadPDF(pdf)) { + assertThat(pdDocument.getNumberOfPages()).isEqualTo(2); + String pdfTekst = new PDFTextStripper().getText(pdDocument); + assertThat(pdfTekst).isNotEmpty(); + assertThat(pdfTekst).contains("Nav har innvilget søknaden din om ungdomsytelse"); + } + + } + + private Behandling lagScenario(UngTestscenario ungTestscenario) { + TestScenarioBuilder scenarioBuilder = TestScenarioBuilder.builderMedSøknad().medUngTestGrunnlag(ungTestscenario); + + var behandling = scenarioBuilder.buildOgLagreMedUng(repositoryProvider, ungdomsytelseGrunnlagRepository, ungdomsprogramPeriodeRepository); + behandling.setBehandlingResultatType(BehandlingResultatType.INNVILGET); + behandling.avsluttBehandling(); + return behandling; + } + + private GenerertBrev genererVedtaksbrevBrev(Long behandlingId) { + return genererVedtaksbrevBrev(behandlingId, brevGenerererTjeneste); + } + + + private GenerertBrev genererVedtaksbrevBrev(Long behandlingId, BrevGenerererTjeneste brevGenerererTjeneste1) { + GenerertBrev generertBrev = brevGenerererTjeneste1.genererVedtaksbrev(behandlingId); + if (System.getenv("LAGRE_PDF") != null) { + BrevUtils.lagrePdf(generertBrev, testInfo); + } + return generertBrev; + } + + +} + + diff --git a/formidling/src/test/java/no/nav/ung/sak/formidling/BrevGenerererTjenesteTest.java b/formidling/src/test/java/no/nav/ung/sak/formidling/BrevGenerererTjenesteTest.java index fac5e7a5f9..25e298dd8b 100644 --- a/formidling/src/test/java/no/nav/ung/sak/formidling/BrevGenerererTjenesteTest.java +++ b/formidling/src/test/java/no/nav/ung/sak/formidling/BrevGenerererTjenesteTest.java @@ -3,36 +3,28 @@ import static no.nav.ung.sak.formidling.HtmlAssert.assertThatHtml; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import com.fasterxml.jackson.databind.ObjectMapper; - import jakarta.inject.Inject; import jakarta.persistence.EntityManager; import no.nav.k9.felles.testutilities.cdi.CdiAwareExtension; -import no.nav.k9.søknad.JsonUtils; import no.nav.ung.kodeverk.dokument.DokumentMalType; +import no.nav.ung.sak.behandlingslager.behandling.personopplysning.PersonopplysningRepository; import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingRepositoryProvider; +import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeRepository; +import no.nav.ung.sak.behandlingslager.ytelse.UngdomsytelseGrunnlagRepository; import no.nav.ung.sak.db.util.JpaExtension; import no.nav.ung.sak.domene.person.pdl.AktørTjeneste; -import no.nav.ung.sak.domene.person.pdl.PersonBasisTjeneste; -import no.nav.ung.sak.formidling.domene.GenerertBrev; -import no.nav.ung.sak.formidling.domene.PdlPerson; -import no.nav.ung.sak.formidling.dto.Brevbestilling; +import no.nav.ung.sak.formidling.innhold.InnvilgelseInnholdBygger; import no.nav.ung.sak.formidling.pdfgen.PdfGenKlient; import no.nav.ung.sak.formidling.template.TemplateType; -import no.nav.ung.sak.test.util.behandling.TestScenarioBuilder; -import no.nav.ung.sak.typer.AktørId; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; +import no.nav.ung.sak.ytelse.beregning.TilkjentYtelseUtleder; +import no.nav.ung.sak.ytelse.beregning.UngdomsytelseTilkjentYtelseUtleder; /** * Tester at pdf blir generert riktig. @@ -41,64 +33,68 @@ @ExtendWith(JpaExtension.class) class BrevGenerererTjenesteTest { - private ObjectMapper objectMapper = JsonUtils.getObjectMapper(); private BrevGenerererTjeneste brevGenerererTjeneste; + private UngdomsytelseGrunnlagRepository ungdomsytelseGrunnlagRepository; + private UngdomsprogramPeriodeRepository ungdomsprogramPeriodeRepository; + private TilkjentYtelseUtleder tilkjentYtelseUtleder; @Inject private EntityManager entityManager; private BehandlingRepositoryProvider repositoryProvider; - String navn = "Halvorsen Halvor"; - String fnr = PdlKlientFake.gyldigFnr(); + PdlKlientFake pdlKlient = PdlKlientFake.medTilfeldigFnr(); + @Inject + private PersonopplysningRepository personopplysningRepository; @BeforeEach void setup() { + repositoryProvider = new BehandlingRepositoryProvider(entityManager); + ungdomsytelseGrunnlagRepository = new UngdomsytelseGrunnlagRepository(entityManager); + ungdomsprogramPeriodeRepository = new UngdomsprogramPeriodeRepository(entityManager); + tilkjentYtelseUtleder = new UngdomsytelseTilkjentYtelseUtleder(ungdomsytelseGrunnlagRepository); + } + @Test - void skal_lage_pdf_med_riktig_mottaker_navn() throws IOException { - var ungdom = AktørId.dummy(); - TestScenarioBuilder scenarioBuilder = TestScenarioBuilder.builderMedSøknad(ungdom); - var behandling = scenarioBuilder.lagre(repositoryProvider); + void skal_lage_vedtakspdf() { - var pdlKlient = new PdlKlientFake("Halvor", "Halvorsen", fnr); + var scenario = BrevScenarioer.lagAvsluttetStandardBehandling(repositoryProvider, ungdomsytelseGrunnlagRepository, ungdomsprogramPeriodeRepository); + var ungTestGrunnlag = scenario.getUngTestGrunnlag(); + var behandling = scenario.getBehandling(); + UngdomsprogramPeriodeTjeneste ungdomsprogramPeriodeTjeneste = new UngdomsprogramPeriodeTjeneste(ungdomsprogramPeriodeRepository); brevGenerererTjeneste = new BrevGenerererTjeneste( repositoryProvider.getBehandlingRepository(), - new PersonBasisTjeneste(pdlKlient), new AktørTjeneste(pdlKlient), - new PdfGenKlient() - ); - - // Lag innvilgelsesbrev - var bestillBrevDto = new Brevbestilling( - behandling.getId(), - DokumentMalType.INNVILGELSE_DOK, - behandling.getFagsak().getSaksnummer().getVerdi(), - null, - objectMapper.createObjectNode() - ); - - GenerertBrev generertBrev = brevGenerererTjeneste.generer(bestillBrevDto); + new PdfGenKlient(), + tilkjentYtelseUtleder, + repositoryProvider.getPersonopplysningRepository(), + + new InnvilgelseInnholdBygger( + ungdomsytelseGrunnlagRepository, + ungdomsprogramPeriodeTjeneste, + tilkjentYtelseUtleder, + personopplysningRepository)); + + + GenerertBrev generertBrev = brevGenerererTjeneste.genererVedtaksbrev(behandling.getId()); assertThat(generertBrev.templateType()).isEqualTo(TemplateType.INNVILGELSE); assertThat(erPdf(generertBrev.dokument().pdf())).isTrue(); - if (System.getenv("LAGRE_PDF") != null) { - lagrePdf(generertBrev.dokument().pdf(), generertBrev.malType().name()); - } PdlPerson mottaker = generertBrev.mottaker(); - assertThat(mottaker.navn()).isEqualTo(navn); - assertThat(mottaker.aktørId().getAktørId()).isEqualTo(ungdom.getAktørId()); + assertThat(mottaker.navn()).isEqualTo(ungTestGrunnlag.navn()); + assertThat(mottaker.aktørId().getAktørId()).isEqualTo(behandling.getAktørId().getAktørId()); PdlPerson gjelder = generertBrev.gjelder(); assertThat(gjelder).isEqualTo(mottaker); assertThat(generertBrev.malType()).isEqualTo(DokumentMalType.INNVILGELSE_DOK); var brevtekst = generertBrev.dokument().html(); - assertThatHtml(brevtekst).contains("Til: " + navn); + assertThatHtml(brevtekst).containsText("Til: " + ungTestGrunnlag.navn()); } @@ -114,15 +110,6 @@ public static boolean erPdf(byte[] fileBytes) { } - private static void lagrePdf(byte[] data, String filename) throws IOException { - Path directory = Files.createDirectories(Paths.get("pdfresultater")); - File file = directory.resolve(filename + ".pdf").toFile(); - - try (FileOutputStream fos = new FileOutputStream(file)) { - fos.write(data); - } - } - } diff --git a/formidling/src/test/java/no/nav/ung/sak/formidling/BrevScenarioer.java b/formidling/src/test/java/no/nav/ung/sak/formidling/BrevScenarioer.java new file mode 100644 index 0000000000..75af9af158 --- /dev/null +++ b/formidling/src/test/java/no/nav/ung/sak/formidling/BrevScenarioer.java @@ -0,0 +1,161 @@ +package no.nav.ung.sak.formidling; + +import static no.nav.ung.sak.domene.typer.tid.AbstractLocalDateInterval.TIDENES_ENDE; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.temporal.TemporalAdjusters; +import java.util.List; + +import no.nav.fpsak.tidsserie.LocalDateInterval; +import no.nav.fpsak.tidsserie.LocalDateSegment; +import no.nav.fpsak.tidsserie.LocalDateTimeline; +import no.nav.ung.kodeverk.behandling.BehandlingResultatType; +import no.nav.ung.kodeverk.vilkår.Utfall; +import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingRepositoryProvider; +import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriode; +import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeRepository; +import no.nav.ung.sak.behandlingslager.ytelse.UngdomsytelseGrunnlagRepository; +import no.nav.ung.sak.behandlingslager.ytelse.sats.Sats; +import no.nav.ung.sak.behandlingslager.ytelse.sats.UngdomsytelseSatser; +import no.nav.ung.sak.behandlingslager.ytelse.uttak.UngdomsytelseUttakPeriode; +import no.nav.ung.sak.behandlingslager.ytelse.uttak.UngdomsytelseUttakPerioder; +import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet; +import no.nav.ung.sak.test.util.behandling.TestScenarioBuilder; +import no.nav.ung.sak.test.util.behandling.UngTestscenario; + +public class BrevScenarioer { + + public static final String DEFAULT_NAVN = "Ung Testesen"; + private static final BigDecimal G_BELØP_24 = BigDecimal.valueOf(124028); + + public static TestScenarioBuilder lagAvsluttetStandardBehandling(BehandlingRepositoryProvider repositoryProvider1, UngdomsytelseGrunnlagRepository ungdomsytelseGrunnlagRepository1, UngdomsprogramPeriodeRepository ungdomsprogramPeriodeRepository1) { + UngTestscenario ungTestscenario = innvilget19år(LocalDate.of(2024, 12, 1)); + + TestScenarioBuilder scenarioBuilder = TestScenarioBuilder.builderMedSøknad().medUngTestGrunnlag(ungTestscenario); + + var behandling = scenarioBuilder.buildOgLagreMedUng(repositoryProvider1, ungdomsytelseGrunnlagRepository1, ungdomsprogramPeriodeRepository1); + behandling.setBehandlingResultatType(BehandlingResultatType.INNVILGET); + behandling.avsluttBehandling(); + return scenarioBuilder; + } + + /** + * 19 år ungdom med full ungdomsperiode, ingen inntektsgradering og ingen barn + * + */ + public static UngTestscenario innvilget19år(LocalDate fom) { + var p = new LocalDateInterval(fom, fom.plusYears(1)); + + var satser = new LocalDateTimeline<>(p, lavSatsBuilder().build()); + + var programPerioder = List.of(new UngdomsprogramPeriode(p.getFomDato(), TIDENES_ENDE)); + + return new UngTestscenario( + DEFAULT_NAVN, + programPerioder, + satser, + uttaksPerioder(p), + new LocalDateTimeline<>(p, Utfall.OPPFYLT), + new LocalDateTimeline<>(p, Utfall.OPPFYLT), + fom.minusYears(19).plusDays(42)); + } + + /** + * 27 år ungdom med full ungdomsperiode, ingen inntektsgradering og ingen barn, høy sats + * + */ + public static UngTestscenario innvilget27år(LocalDate fom) { + var p = new LocalDateInterval(fom, fom.plusYears(1)); + + var satser = new LocalDateTimeline<>(p, + høySatsBuilder().build()); + + var programPerioder = List.of(new UngdomsprogramPeriode(p.getFomDato(), TIDENES_ENDE)); + + return new UngTestscenario( + DEFAULT_NAVN, + programPerioder, + satser, + uttaksPerioder(p), + new LocalDateTimeline<>(p, Utfall.OPPFYLT), + new LocalDateTimeline<>(p, Utfall.OPPFYLT), + fom.minusYears(27).plusDays(42)); + } + + /** + * 29 år ungdom med ungdomsprogramperiode fram til 29 år, ingen inntektsgradering og ingen barn, høy sats + * + */ + public static UngTestscenario innvilget29År(LocalDate fom, LocalDate fødselsdato) { + var p = new LocalDateInterval(fom, fødselsdato.plusYears(29).with(TemporalAdjusters.lastDayOfMonth())); + + var satser = new LocalDateTimeline<>(p, høySatsBuilder().build()); + + var programPerioder = List.of(new UngdomsprogramPeriode(p.getFomDato(), p.getTomDato())); + + return new UngTestscenario( + DEFAULT_NAVN, + programPerioder, + satser, + uttaksPerioder(p), + new LocalDateTimeline<>(p, Utfall.OPPFYLT), + new LocalDateTimeline<>(p, Utfall.OPPFYLT), + fødselsdato); + } + + /** + * 25 år ungdom med full ungdomsprogramperiode som blir 26 ila perioden. Får både lav og høy sats + * ingen inntektsgradering og ingen barn, høy sats + * + */ + public static UngTestscenario innvilget26År(LocalDate fom, LocalDate fødselsdato) { + LocalDate tom26årmnd = fødselsdato.plusYears(26).with(TemporalAdjusters.lastDayOfMonth()); + var p = new LocalDateInterval(fom, fom.plusYears(1)); + + var satser = new LocalDateTimeline<>(List.of( + new LocalDateSegment<>(p.getFomDato(), tom26årmnd, lavSatsBuilder().build()), + new LocalDateSegment<>(tom26årmnd.plusDays(1), p.getTomDato(), høySatsBuilder().build()) + )); + + var programPerioder = List.of(new UngdomsprogramPeriode(p.getFomDato(), p.getTomDato())); + + return new UngTestscenario( + DEFAULT_NAVN, + programPerioder, + satser, + uttaksPerioder(p), + new LocalDateTimeline<>(p, Utfall.OPPFYLT), + new LocalDateTimeline<>(p, Utfall.OPPFYLT), + fødselsdato); + } + + private static UngdomsytelseUttakPerioder uttaksPerioder(LocalDateInterval p) { + UngdomsytelseUttakPerioder uttakperioder = new UngdomsytelseUttakPerioder( + List.of(new UngdomsytelseUttakPeriode( + BigDecimal.valueOf(100), DatoIntervallEntitet.fraOgMedTilOgMed(p.getFomDato(), p.getTomDato())) + )); + uttakperioder.setRegelInput("regelInputUttak"); + uttakperioder.setRegelSporing("regelSporingUttak"); + return uttakperioder; + } + + public static UngdomsytelseSatser.Builder lavSatsBuilder() { + return UngdomsytelseSatser.builder() + .medGrunnbeløp(G_BELØP_24) + .medGrunnbeløpFaktor(Sats.LAV.getGrunnbeløpFaktor()) + .medSatstype(Sats.LAV.getSatsType()) + .medAntallBarn(0) + .medBarnetilleggDagsats(0); + } + + public static UngdomsytelseSatser.Builder høySatsBuilder() { + return UngdomsytelseSatser.builder() + .medGrunnbeløp(G_BELØP_24) + .medGrunnbeløpFaktor(Sats.HØY.getGrunnbeløpFaktor()) + .medSatstype(Sats.HØY.getSatsType()) + .medAntallBarn(0) + .medBarnetilleggDagsats(0) + ; + } +} diff --git a/formidling/src/test/java/no/nav/ung/sak/formidling/BrevUtils.java b/formidling/src/test/java/no/nav/ung/sak/formidling/BrevUtils.java new file mode 100644 index 0000000000..b89b7b066b --- /dev/null +++ b/formidling/src/test/java/no/nav/ung/sak/formidling/BrevUtils.java @@ -0,0 +1,48 @@ +package no.nav.ung.sak.formidling; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +import org.junit.jupiter.api.TestInfo; + +public class BrevUtils { + + static DateTimeFormatter norwegianFormatter = DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.forLanguageTag("no-NO")); + + public static String brevDatoString(LocalDate date) { + return date.format(norwegianFormatter); + } + + public static void lagrePdf(GenerertBrev generertBrev, TestInfo testInfo) { + byte[] pdf = generertBrev.dokument().pdf(); + String filnavn = "%s-%s" + .formatted( + generertBrev.templateType().name(), + testInfo.getTestMethod().map(Method::getName).orElse("ukjentMetode")); + lagrePdf(pdf, filnavn); + } + + public static void lagrePdf(byte[] data, String filename) { + Path directory; + try { + directory = Files.createDirectories(Paths.get("pdfresultater")); + } catch (IOException e) { + throw new RuntimeException(e); + } + File file = directory.resolve(filename + ".pdf").toFile(); + + try (FileOutputStream fos = new FileOutputStream(file)) { + fos.write(data); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/formidling/src/test/java/no/nav/ung/sak/formidling/HtmlAssert.java b/formidling/src/test/java/no/nav/ung/sak/formidling/HtmlAssert.java index 07c618cca0..5517a4e934 100644 --- a/formidling/src/test/java/no/nav/ung/sak/formidling/HtmlAssert.java +++ b/formidling/src/test/java/no/nav/ung/sak/formidling/HtmlAssert.java @@ -1,28 +1,95 @@ package no.nav.ung.sak.formidling; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; import org.assertj.core.api.AbstractAssert; +import org.assertj.core.api.SoftAssertions; +import org.jetbrains.annotations.NotNull; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Node; +import org.jsoup.select.NodeVisitor; +/** + * Gjør det enklere å assert tekster i html. Fjerner urelevante tagger og linjeskift + */ public class HtmlAssert extends AbstractAssert { + private final String actual; + private final String actualHtmlTrimmed; + private final String actualTextTrimmed; + public HtmlAssert(String actual) { super(actual, HtmlAssert.class); + this.actual = actual; + + // Use Jsoup to parse and clean the HTML + Document document = Jsoup.parse(actual); + + // Remove undesired elements + document.select("style, head, img").remove(); + removeComments(document); + + // Extract cleaned HTML as a string + actualHtmlTrimmed = document.body().html().replaceAll("(?m)^\\s*$\\n", ""); // Remove empty lines + actualTextTrimmed = Jsoup.parse(actual).text().replaceAll("(?m)^\\s*$\\n", ""); } public static HtmlAssert assertThatHtml(String actual) { return new HtmlAssert(actual); } - public void contains(String expectedSubstring) { - String processedHtml = actual - .replaceAll("(?s).*?", "") - .replaceAll("(?s).*?", "") - .replaceAll("(?s)", "") - .replaceAll("(?s)", ""); + public HtmlAssert containsText(String text) { + assertThat(actualTextTrimmed).contains(text); + return this; + } + + public HtmlAssert containsTextsOnceInSequence(CharSequence... text) { + assertThatContainsOnceInSequence(actualTextTrimmed, text); + return this; + } + + + public HtmlAssert containsHtmlOnceInSequence(CharSequence... html) { + assertThatContainsOnceInSequence(actualHtmlTrimmed, html); + return this; + } + + public HtmlAssert doesNotContainText(CharSequence... texts) { + assertThat(actualTextTrimmed).doesNotContain(texts); + return this; + } + + public HtmlAssert doesNotContainHtml(CharSequence... texts) { + assertThat(actualHtmlTrimmed).doesNotContain(texts); + return this; + } + + private void assertThatContainsOnceInSequence(String actual, CharSequence... seq) { + assertThat(actual).containsSubsequence(seq); + var soft = new SoftAssertions(); + Arrays.stream(seq).forEach(it -> + soft.assertThat(actual).containsOnlyOnce(it) + ); + soft.assertAll(); + } + + private void removeComments(Document document) { + document.traverse(new NodeVisitor() { + + @Override + public void head(@NotNull Node node, int depth) { + if (node.nodeName().equals("#comment")) { + node.remove(); + } + } - if (!processedHtml.contains(expectedSubstring)) { - failWithMessage("Expected HTML to contain <%s> but did not. Simplified HTML:\n%s", expectedSubstring, processedHtml); - } + @Override + public void tail(@NotNull Node node, int depth) { + // Do nothing on tail visit + } + }); } } diff --git a/formidling/src/test/java/no/nav/ung/sak/formidling/InnvilgelseTest.java b/formidling/src/test/java/no/nav/ung/sak/formidling/InnvilgelseTest.java deleted file mode 100644 index e7c1acadcc..0000000000 --- a/formidling/src/test/java/no/nav/ung/sak/formidling/InnvilgelseTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package no.nav.ung.sak.formidling; - -import static no.nav.ung.sak.formidling.HtmlAssert.assertThatHtml; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import jakarta.inject.Inject; -import jakarta.persistence.EntityManager; -import no.nav.k9.felles.testutilities.cdi.CdiAwareExtension; -import no.nav.k9.søknad.JsonUtils; -import no.nav.ung.kodeverk.dokument.DokumentMalType; -import no.nav.ung.sak.behandlingslager.behandling.Behandling; -import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingRepositoryProvider; -import no.nav.ung.sak.db.util.JpaExtension; -import no.nav.ung.sak.domene.person.pdl.AktørTjeneste; -import no.nav.ung.sak.domene.person.pdl.PersonBasisTjeneste; -import no.nav.ung.sak.formidling.domene.GenerertBrev; -import no.nav.ung.sak.formidling.dto.Brevbestilling; -import no.nav.ung.sak.formidling.pdfgen.PdfGenKlient; -import no.nav.ung.sak.test.util.behandling.TestScenarioBuilder; -import no.nav.ung.sak.typer.AktørId; - -/** - * Test for brevtekster for innvilgelse. Lager ikke pdf, men bruker html for å validere. - */ -@ExtendWith(CdiAwareExtension.class) -@ExtendWith(JpaExtension.class) -class InnvilgelseTest { - - private BrevGenerererTjeneste brevGenerererTjeneste; - private ObjectMapper objectMapper = JsonUtils.getObjectMapper(); - - - @Inject - private EntityManager entityManager; - private BehandlingRepositoryProvider repositoryProvider; - - String navn = "Halvorsen Halvor"; - String fnr = PdlKlientFake.gyldigFnr(); - - @BeforeEach - void setup() { - repositoryProvider = new BehandlingRepositoryProvider(entityManager); - - var pdlKlient = new PdlKlientFake("Halvor", "Halvorsen", fnr); - - brevGenerererTjeneste = new BrevGenerererTjeneste( - repositoryProvider.getBehandlingRepository(), - new PersonBasisTjeneste(pdlKlient), - new AktørTjeneste(pdlKlient), - new PdfGenKlient(true) - ); - } - - @Test - void standard_innvilgelse() { - var ungdom = AktørId.dummy(); - TestScenarioBuilder scenarioBuilder = TestScenarioBuilder.builderMedSøknad(ungdom); - var behandling = scenarioBuilder.lagre(repositoryProvider); - - var bestillBrevDto = lagBestilling(behandling); - GenerertBrev generertBrev = brevGenerererTjeneste.generer(bestillBrevDto); - - var brevtekst = generertBrev.dokument().html(); - assertThatHtml(brevtekst).contains("

NAV har innvilget søknaden din om ungdomsytelse

"); - assertThatHtml(brevtekst).contains("Til: " + navn); - assertThatHtml(brevtekst).contains("Fødselsnummer: " + fnr); - - } - - private Brevbestilling lagBestilling(Behandling behandling) { - return new Brevbestilling( - behandling.getId(), - DokumentMalType.INNVILGELSE_DOK, - behandling.getFagsak().getSaksnummer().getVerdi(), - null, - objectMapper.createObjectNode() - ); - } - - -} - - diff --git a/formidling/src/test/java/no/nav/ung/sak/formidling/PdlKlientFake.java b/formidling/src/test/java/no/nav/ung/sak/formidling/PdlKlientFake.java index c57c642674..0657d3b824 100644 --- a/formidling/src/test/java/no/nav/ung/sak/formidling/PdlKlientFake.java +++ b/formidling/src/test/java/no/nav/ung/sak/formidling/PdlKlientFake.java @@ -1,15 +1,11 @@ package no.nav.ung.sak.formidling; -import java.util.Collections; import java.util.List; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResponseProjection; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResult; -import no.nav.k9.felles.integrasjon.pdl.Doedsfall; -import no.nav.k9.felles.integrasjon.pdl.Foedselsdato; -import no.nav.k9.felles.integrasjon.pdl.Folkeregisterpersonstatus; import no.nav.k9.felles.integrasjon.pdl.GeografiskTilknytning; import no.nav.k9.felles.integrasjon.pdl.GeografiskTilknytningResponseProjection; import no.nav.k9.felles.integrasjon.pdl.HentGeografiskTilknytningQueryRequest; @@ -22,64 +18,22 @@ import no.nav.k9.felles.integrasjon.pdl.IdentInformasjon; import no.nav.k9.felles.integrasjon.pdl.Identliste; import no.nav.k9.felles.integrasjon.pdl.IdentlisteResponseProjection; -import no.nav.k9.felles.integrasjon.pdl.Kjoenn; -import no.nav.k9.felles.integrasjon.pdl.KjoennType; -import no.nav.k9.felles.integrasjon.pdl.Navn; import no.nav.k9.felles.integrasjon.pdl.Pdl; import no.nav.k9.felles.integrasjon.pdl.Person; import no.nav.k9.felles.integrasjon.pdl.PersonResponseProjection; import no.nav.ung.sak.test.util.aktør.FiktiveFnr; -//TODO flytt opprettelsen i TestScenarioBuilder? -public class PdlKlientFake implements Pdl { - private final String fnr; - private final Person person; +public record PdlKlientFake(String fnr) implements Pdl { private static final FiktiveFnr fiktiveFnr = new FiktiveFnr(); - public PdlKlientFake(String fornavn, String etternavn, String fnr) { - this.fnr = fnr; - // Create a test instance of Person - person = lagPerson(fornavn, etternavn); - - } - - public static PdlKlientFake medDefaultPerson() { - return new PdlKlientFake("Test", "Testesen", gyldigFnr()); + public static PdlKlientFake medTilfeldigFnr() { + return new PdlKlientFake(gyldigFnr()); } public static String gyldigFnr() { return fiktiveFnr.nesteFnr(); } - public static Person lagPerson(String fornavn, String etternavn) { - var person = new Person(); - - // Set values using setters - Doedsfall doedsfall = new Doedsfall(); - doedsfall.setDoedsdato("2024-12-01"); - person.setDoedsfall(Collections.singletonList(doedsfall)); - - Foedselsdato foedselsdato = new Foedselsdato(); - foedselsdato.setFoedselsdato("1990-01-01"); - person.setFoedselsdato(Collections.singletonList(foedselsdato)); - - Folkeregisterpersonstatus folkeregisterpersonstatus = new Folkeregisterpersonstatus(); - folkeregisterpersonstatus.setStatus("BOSATT"); - person.setFolkeregisterpersonstatus(Collections.singletonList(folkeregisterpersonstatus)); - - Navn navn = new Navn(); - navn.setFornavn(fornavn); - navn.setEtternavn(etternavn); - person.setNavn(Collections.singletonList(navn)); - - person.setAdressebeskyttelse(Collections.emptyList()); - Kjoenn kjønn = new Kjoenn(); - kjønn.setKjoenn(KjoennType.KVINNE); - person.setKjoenn(List.of(kjønn)); - - return person; - } - @Override public List hentIdenterBolkResults(HentIdenterBolkQueryRequest q, HentIdenterBolkResultResponseProjection p) { @@ -93,12 +47,12 @@ public Identliste hentIdenter(HentIdenterQueryRequest q, IdentlisteResponseProje @Override public Person hentPerson(HentPersonQueryRequest q, PersonResponseProjection p) { - return person; + return null; } @Override public Person hentPerson(HentPersonQueryRequest q, PersonResponseProjection p, boolean ignoreNotFound) { - return person; + return null; } @Override diff --git a/formidling/src/test/java/no/nav/ung/sak/formidling/BrevbestillingTaskTest.java b/formidling/src/test/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingTaskTest.java similarity index 80% rename from formidling/src/test/java/no/nav/ung/sak/formidling/BrevbestillingTaskTest.java rename to formidling/src/test/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingTaskTest.java index c14967477a..8004b290c1 100644 --- a/formidling/src/test/java/no/nav/ung/sak/formidling/BrevbestillingTaskTest.java +++ b/formidling/src/test/java/no/nav/ung/sak/formidling/bestilling/BrevbestillingTaskTest.java @@ -1,4 +1,4 @@ -package no.nav.ung.sak.formidling; +package no.nav.ung.sak.formidling.bestilling; import static org.assertj.core.api.Assertions.assertThat; @@ -17,25 +17,28 @@ import no.nav.k9.prosesstask.api.ProsessTaskTjeneste; import no.nav.k9.prosesstask.impl.ProsessTaskRepositoryImpl; import no.nav.k9.prosesstask.impl.ProsessTaskTjenesteImpl; -import no.nav.ung.kodeverk.behandling.BehandlingResultatType; import no.nav.ung.kodeverk.dokument.DokumentMalType; import no.nav.ung.kodeverk.formidling.IdType; import no.nav.ung.sak.behandlingslager.behandling.Behandling; import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingRepository; import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingRepositoryProvider; +import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeRepository; +import no.nav.ung.sak.behandlingslager.ytelse.UngdomsytelseGrunnlagRepository; import no.nav.ung.sak.db.util.JpaExtension; import no.nav.ung.sak.domene.person.pdl.AktørTjeneste; -import no.nav.ung.sak.domene.person.pdl.PersonBasisTjeneste; +import no.nav.ung.sak.formidling.BrevGenerererTjeneste; +import no.nav.ung.sak.formidling.BrevScenarioer; +import no.nav.ung.sak.formidling.PdlKlientFake; import no.nav.ung.sak.formidling.dokarkiv.DokArkivKlientFake; import no.nav.ung.sak.formidling.dokarkiv.dto.OpprettJournalpostRequest; import no.nav.ung.sak.formidling.dokdist.dto.DistribuerJournalpostRequest.DistribusjonsType; -import no.nav.ung.sak.formidling.domene.BehandlingBrevbestillingEntitet; -import no.nav.ung.sak.formidling.domene.BrevbestillingEntitet; -import no.nav.ung.sak.formidling.domene.BrevbestillingStatusType; +import no.nav.ung.sak.formidling.innhold.InnvilgelseInnholdBygger; import no.nav.ung.sak.formidling.pdfgen.PdfGenKlient; import no.nav.ung.sak.formidling.template.TemplateType; import no.nav.ung.sak.test.util.behandling.TestScenarioBuilder; -import no.nav.ung.sak.typer.AktørId; +import no.nav.ung.sak.ungdomsprogram.UngdomsprogramPeriodeTjeneste; +import no.nav.ung.sak.ytelse.beregning.TilkjentYtelseUtleder; +import no.nav.ung.sak.ytelse.beregning.UngdomsytelseTilkjentYtelseUtleder; @ExtendWith(CdiAwareExtension.class) @ExtendWith(JpaExtension.class) @@ -49,21 +52,34 @@ class BrevbestillingTaskTest { private DokArkivKlientFake dokArkivKlient; private BrevbestillingRepository brevbestillingRepository; private ProsessTaskTjeneste prosessTaskTjeneste; + private UngdomsytelseGrunnlagRepository ungdomsytelseGrunnlagRepository; + private UngdomsprogramPeriodeRepository ungdomsprogramPeriodeRepository; + private TilkjentYtelseUtleder tilkjentYtelseUtleder; - private final String fnr = PdlKlientFake.gyldigFnr(); + private String fnr; @BeforeEach void setUp() { repositoryProvider = new BehandlingRepositoryProvider(entityManager); behandlingRepository = repositoryProvider.getBehandlingRepository(); + ungdomsytelseGrunnlagRepository = new UngdomsytelseGrunnlagRepository(entityManager); + ungdomsprogramPeriodeRepository = new UngdomsprogramPeriodeRepository(entityManager); + tilkjentYtelseUtleder = new UngdomsytelseTilkjentYtelseUtleder(ungdomsytelseGrunnlagRepository); prosessTaskTjeneste = new ProsessTaskTjenesteImpl(new ProsessTaskRepositoryImpl(entityManager, null, null)); - var pdlKlient = new PdlKlientFake("Test", "Testesen", fnr); + var pdlKlient = PdlKlientFake.medTilfeldigFnr(); + fnr = pdlKlient.fnr(); + UngdomsprogramPeriodeTjeneste ungdomsprogramPeriodeTjeneste = new UngdomsprogramPeriodeTjeneste(ungdomsprogramPeriodeRepository); brevGenerererTjeneste = new BrevGenerererTjeneste( repositoryProvider.getBehandlingRepository(), - new PersonBasisTjeneste(pdlKlient), new AktørTjeneste(pdlKlient), - new PdfGenKlient() - ); + new PdfGenKlient(), + tilkjentYtelseUtleder, + repositoryProvider.getPersonopplysningRepository(), + new InnvilgelseInnholdBygger( + ungdomsytelseGrunnlagRepository, + ungdomsprogramPeriodeTjeneste, + tilkjentYtelseUtleder, + repositoryProvider.getPersonopplysningRepository())); dokArkivKlient = new DokArkivKlientFake(); @@ -73,11 +89,9 @@ void setUp() { @Test void skalLagreBestillingLagePdfJournalføreOgLageDistribusjonstask() { - var ungdom = AktørId.dummy(); - TestScenarioBuilder scenarioBuilder = TestScenarioBuilder.builderMedSøknad(ungdom); - var behandling = scenarioBuilder.lagre(repositoryProvider); - behandling.setBehandlingResultatType(BehandlingResultatType.INNVILGET); - behandling.avsluttBehandling(); + + TestScenarioBuilder scenarioBuilder = BrevScenarioer.lagAvsluttetStandardBehandling(repositoryProvider, ungdomsytelseGrunnlagRepository, ungdomsprogramPeriodeRepository); + var behandling = scenarioBuilder.getBehandling(); BrevbestillingTask brevBestillingTask = new BrevbestillingTask(behandlingRepository, brevGenerererTjeneste, brevbestillingRepository, dokArkivKlient, prosessTaskTjeneste); brevBestillingTask.doTask(lagTask(behandling)); @@ -114,6 +128,9 @@ private static void assertBrevbestilling(BrevbestillingEntitet bestilling, Behan assertThat(bestilling.getMottaker().getMottakerIdType()).isEqualTo(IdType.AKTØRID); } + + + @Test void skalIkkeLagreBestillingHvisJournalføringFeiler() { //TODO diff --git a/formidling/src/test/java/no/nav/ung/sak/formidling/BrevdistribusjonTaskTest.java b/formidling/src/test/java/no/nav/ung/sak/formidling/bestilling/BrevdistribusjonTaskTest.java similarity index 88% rename from formidling/src/test/java/no/nav/ung/sak/formidling/BrevdistribusjonTaskTest.java rename to formidling/src/test/java/no/nav/ung/sak/formidling/bestilling/BrevdistribusjonTaskTest.java index a962567e07..ba1186314c 100644 --- a/formidling/src/test/java/no/nav/ung/sak/formidling/BrevdistribusjonTaskTest.java +++ b/formidling/src/test/java/no/nav/ung/sak/formidling/bestilling/BrevdistribusjonTaskTest.java @@ -1,7 +1,7 @@ -package no.nav.ung.sak.formidling; +package no.nav.ung.sak.formidling.bestilling; -import static no.nav.ung.sak.formidling.BrevdistribusjonTask.BREVBESTILLING_DISTRIBUSJONSTYPE; -import static no.nav.ung.sak.formidling.BrevdistribusjonTask.BREVBESTILLING_ID_PARAM; +import static no.nav.ung.sak.formidling.bestilling.BrevdistribusjonTask.BREVBESTILLING_DISTRIBUSJONSTYPE; +import static no.nav.ung.sak.formidling.bestilling.BrevdistribusjonTask.BREVBESTILLING_ID_PARAM; import static org.assertj.core.api.Assertions.assertThat; import org.junit.jupiter.api.BeforeEach; @@ -19,9 +19,6 @@ import no.nav.ung.sak.formidling.dokdist.DokDistRestKlientFake; import no.nav.ung.sak.formidling.dokdist.dto.DistribuerJournalpostRequest; import no.nav.ung.sak.formidling.dokdist.dto.DistribuerJournalpostRequest.DistribusjonsType; -import no.nav.ung.sak.formidling.domene.BrevMottaker; -import no.nav.ung.sak.formidling.domene.BrevbestillingEntitet; -import no.nav.ung.sak.formidling.domene.BrevbestillingStatusType; import no.nav.ung.sak.formidling.template.TemplateType; @ExtendWith(CdiAwareExtension.class) diff --git a/formidling/src/test/java/no/nav/ung/sak/formidling/dokarkiv/DokArkivKlientFake.java b/formidling/src/test/java/no/nav/ung/sak/formidling/dokarkiv/DokArkivKlientFake.java index 04dd6e14a0..a298146335 100644 --- a/formidling/src/test/java/no/nav/ung/sak/formidling/dokarkiv/DokArkivKlientFake.java +++ b/formidling/src/test/java/no/nav/ung/sak/formidling/dokarkiv/DokArkivKlientFake.java @@ -13,8 +13,8 @@ public class DokArkivKlientFake implements DokArkivKlient { public DokArkivKlientFake() { } - private List requests = new ArrayList(); - private List responses = new ArrayList(); + private final List requests = new ArrayList<>(); + private final List responses = new ArrayList<>(); private final String journalpostId = "12345"; diff --git a/pom.xml b/pom.xml index def2cf4bb2..76e52f8970 100644 --- a/pom.xml +++ b/pom.xml @@ -425,6 +425,12 @@ ${junit.version} test + + org.jsoup + jsoup + 1.18.3 + test + org.mockito mockito-core diff --git a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/formidling/FormidlingRestTjeneste.java b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/formidling/FormidlingRestTjeneste.java index 81a3bbbed3..f343444d9a 100644 --- a/web/src/main/java/no/nav/ung/sak/web/app/tjenester/formidling/FormidlingRestTjeneste.java +++ b/web/src/main/java/no/nav/ung/sak/web/app/tjenester/formidling/FormidlingRestTjeneste.java @@ -28,10 +28,8 @@ import jakarta.ws.rs.core.Response; import no.nav.k9.felles.sikkerhet.abac.BeskyttetRessurs; import no.nav.k9.felles.sikkerhet.abac.TilpassetAbacAttributt; -import no.nav.ung.kodeverk.dokument.DokumentMalType; import no.nav.ung.sak.formidling.BrevGenerererTjeneste; -import no.nav.ung.sak.formidling.domene.GenerertBrev; -import no.nav.ung.sak.formidling.dto.Brevbestilling; +import no.nav.ung.sak.formidling.GenerertBrev; import no.nav.ung.sak.kontrakt.behandling.BehandlingIdDto; import no.nav.ung.sak.kontrakt.formidling.vedtaksbrev.VedtaksbrevForhåndsvisDto; import no.nav.ung.sak.kontrakt.formidling.vedtaksbrev.VedtaksbrevOperasjonerDto; @@ -95,13 +93,7 @@ public VedtaksbrevOperasjonerDto tilgjengeligeVedtaksbrev( @NotNull @Parameter(description = "") @Valid @TilpassetAbacAttributt(supplierClass = AbacAttributtSupplier.class) VedtaksbrevForhåndsvisDto dto, @Context HttpServletRequest request ) { - GenerertBrev generertBrev = brevGenerererTjeneste.generer(new Brevbestilling( - dto.behandlingId(), - DokumentMalType.INNVILGELSE_DOK, - null, - null, - dto.dokumentdata() - )); + GenerertBrev generertBrev = brevGenerererTjeneste.genererVedtaksbrev(dto.behandlingId()); var mediaTypeReq = Objects.requireNonNullElse(request.getHeader(HttpHeaders.ACCEPT), MediaType.APPLICATION_OCTET_STREAM);