Skip to content

Commit 275f3d0

Browse files
committed
TSFF-1190: Kaller oppgave API for å opprette oppgaver
1 parent 1293460 commit 275f3d0

12 files changed

+291
-27
lines changed

domenetjenester/etterlysning/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
<artifactId>etterlysning</artifactId>
1616

1717
<dependencies>
18+
<dependency>
19+
<groupId>no.nav.ung</groupId>
20+
<artifactId>ung-deltakelse-opplyser</artifactId>
21+
</dependency>
22+
1823
<dependency>
1924
<groupId>no.nav.ung.sak</groupId>
2025
<artifactId>kontrakt</artifactId>

domenetjenester/etterlysning/src/main/java/no/nav/ung/sak/etterlysning/EtterlysningProssesseringTjeneste.java

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
66
import no.nav.ung.sak.behandlingslager.etterlysning.Etterlysning;
77
import no.nav.ung.sak.behandlingslager.etterlysning.EtterlysningRepository;
8+
import no.nav.ung.sak.etterlysning.kontroll.InntektkontrollEtterlysningHåndterer;
89

910
import java.util.Objects;
1011

domenetjenester/etterlysning/src/main/java/no/nav/ung/sak/etterlysning/InntektkontrollEtterlysningHåndterer.java

-27
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package no.nav.ung.sak.etterlysning;
2+
3+
import jakarta.enterprise.context.Dependent;
4+
import jakarta.inject.Inject;
5+
import no.nav.k9.felles.integrasjon.rest.OidcRestClient;
6+
import no.nav.k9.felles.integrasjon.rest.ScopedRestIntegration;
7+
import no.nav.k9.felles.konfigurasjon.konfig.KonfigVerdi;
8+
import no.nav.ung.deltakelseopplyser.domene.register.ungsak.RegisterInntektOppgaveDTO;
9+
10+
import java.net.URI;
11+
import java.net.URISyntaxException;
12+
import java.util.List;
13+
14+
@Dependent
15+
@ScopedRestIntegration(scopeKey = "ungdomsprogramregister.scope", defaultScope = "api://prod-gcp.k9saksbehandling.ung-deltakelse-opplyser/.default")
16+
public class UngOppgaveKlient {
17+
private final OidcRestClient restClient;
18+
private final URI opprettURI;
19+
20+
@Inject
21+
public UngOppgaveKlient(
22+
OidcRestClient restClient,
23+
@KonfigVerdi(value = "ungdomsprogramregister.url", defaultVerdi = "http://ung-deltakelse-opplyser.k9saksbehandling") String url) {
24+
this.restClient = restClient;
25+
opprettURI = tilUri(url, "oppgave/opprett");
26+
27+
}
28+
29+
public void opprettOppgave(RegisterInntektOppgaveDTO oppgaver) {
30+
try {
31+
restClient.post(opprettURI, oppgaver);
32+
} catch (Exception e) {
33+
throw UngOppgavetjenesteFeil.FACTORY.feilVedKallTilUngOppgaveTjeneste(e).toException();
34+
}
35+
36+
}
37+
38+
private static URI tilUri(String baseUrl, String path) {
39+
try {
40+
return new URI(baseUrl + "/" + path);
41+
} catch (URISyntaxException e) {
42+
throw new IllegalArgumentException("Ugyldig konfigurasjon for ungdomsprogram.register.url", e);
43+
}
44+
}
45+
46+
}
47+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package no.nav.ung.sak.etterlysning;
2+
3+
import no.nav.k9.felles.feil.Feil;
4+
import no.nav.k9.felles.feil.FeilFactory;
5+
import no.nav.k9.felles.feil.LogLevel;
6+
import no.nav.k9.felles.feil.deklarasjon.DeklarerteFeil;
7+
import no.nav.k9.felles.feil.deklarasjon.IntegrasjonFeil;
8+
9+
public interface UngOppgavetjenesteFeil extends DeklarerteFeil {
10+
11+
UngOppgavetjenesteFeil FACTORY = FeilFactory.create(UngOppgavetjenesteFeil.class);
12+
13+
@IntegrasjonFeil(feilkode = "UNG-100011", feilmelding = "Feil ved kall til oppgavetjenesten.", logLevel = LogLevel.ERROR)
14+
Feil feilVedKallTilUngOppgaveTjeneste(Exception e);
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package no.nav.ung.sak.etterlysning.kontroll;
2+
3+
import no.nav.fpsak.tidsserie.LocalDateInterval;
4+
import no.nav.fpsak.tidsserie.LocalDateTimeline;
5+
import no.nav.ung.deltakelseopplyser.domene.register.ungsak.RegisterInntektArbeidOgFrilansDTO;
6+
import no.nav.ung.deltakelseopplyser.domene.register.ungsak.RegisterInntektDTO;
7+
import no.nav.ung.deltakelseopplyser.domene.register.ungsak.RegisterInntektYtelseDTO;
8+
import no.nav.ung.kodeverk.arbeidsforhold.InntektspostType;
9+
import no.nav.ung.sak.domene.iay.modell.InntektArbeidYtelseGrunnlag;
10+
import no.nav.ung.sak.domene.iay.modell.Inntektspost;
11+
import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet;
12+
import no.nav.ung.sak.domene.typer.tid.Virkedager;
13+
import no.nav.ung.sak.kontrakt.etterlysning.oppgave.kontroll.RegisterInntektATFL;
14+
import no.nav.ung.sak.kontrakt.etterlysning.oppgave.kontroll.RegisterInntektYtelse;
15+
import no.nav.ung.sak.kontrakt.etterlysning.oppgave.kontroll.RegisterInntekter;
16+
17+
import java.math.BigDecimal;
18+
import java.math.RoundingMode;
19+
import java.util.List;
20+
21+
public class InntektKontrollOppgaveMapper {
22+
23+
static RegisterInntektDTO mapTilRegisterInntekter(InntektArbeidYtelseGrunnlag grunnlag, DatoIntervallEntitet periode) {
24+
25+
final var arbeidOgFrilansInntekter = finnArbeidOgFrilansInntekter(grunnlag, periode);
26+
final var ytelseInntekter = finnYtelseInntekter(grunnlag, periode);
27+
return new RegisterInntektDTO(arbeidOgFrilansInntekter, ytelseInntekter);
28+
}
29+
30+
private static List<RegisterInntektYtelseDTO> finnYtelseInntekter(InntektArbeidYtelseGrunnlag grunnlag, DatoIntervallEntitet periode) {
31+
return grunnlag.getRegisterVersjon().stream().flatMap(it -> it.getAktørInntekt().stream())
32+
.flatMap(i -> i.getInntekt().stream())
33+
.flatMap(inntekt -> inntekt.getAlleInntektsposter().stream()
34+
.filter(ip -> ip.getInntektspostType().equals(InntektspostType.YTELSE))
35+
.filter(ip -> ip.getPeriode().overlapper(periode))
36+
.map(ip -> {
37+
var beløp = finnBeløpInnenforPeriode(periode, ip);
38+
return new RegisterInntektYtelseDTO(beløp.intValue(), ip.getInntektYtelseType().getYtelseType().getKode());
39+
})).toList();
40+
}
41+
42+
private static List<RegisterInntektArbeidOgFrilansDTO> finnArbeidOgFrilansInntekter(InntektArbeidYtelseGrunnlag grunnlag, DatoIntervallEntitet periode) {
43+
return grunnlag.getRegisterVersjon().stream().flatMap(it -> it.getAktørInntekt().stream())
44+
.flatMap(i -> i.getInntekt().stream())
45+
.flatMap(inntekt -> inntekt.getAlleInntektsposter().stream()
46+
.filter(ip -> ip.getInntektspostType().equals(InntektspostType.LØNN))
47+
.filter(ip -> ip.getPeriode().overlapper(periode))
48+
.map(ip -> {
49+
var beløp = finnBeløpInnenforPeriode(periode, ip);
50+
return new RegisterInntektArbeidOgFrilansDTO(beløp.intValue(), inntekt.getArbeidsgiver().getIdentifikator());
51+
})).toList();
52+
}
53+
54+
private static BigDecimal finnBeløpInnenforPeriode(DatoIntervallEntitet intervall, Inntektspost it) {
55+
final var inntektsperiode = it.getPeriode();
56+
final var overlapp = new LocalDateTimeline<>(intervall.toLocalDateInterval(), true).intersection(new LocalDateInterval(inntektsperiode.getFomDato(), inntektsperiode.getTomDato()));
57+
final var overlappPeriode = overlapp.getLocalDateIntervals().getFirst();
58+
59+
final var antallVirkedager = inntektsperiode.antallArbeidsdager();
60+
final var overlappAntallVirkedager = Virkedager.beregnAntallVirkedager(overlappPeriode.getFomDato(), overlappPeriode.getTomDato());
61+
62+
return it.getBeløp().getVerdi().multiply(BigDecimal.valueOf(overlappAntallVirkedager).divide(BigDecimal.valueOf(antallVirkedager), 10, RoundingMode.HALF_UP));
63+
}
64+
65+
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package no.nav.ung.sak.etterlysning.kontroll;
2+
3+
import jakarta.enterprise.context.Dependent;
4+
import jakarta.inject.Inject;
5+
import no.nav.fpsak.tidsserie.LocalDateInterval;
6+
import no.nav.fpsak.tidsserie.LocalDateTimeline;
7+
import no.nav.ung.deltakelseopplyser.domene.register.ungsak.RegisterInntektOppgaveDTO;
8+
import no.nav.ung.kodeverk.arbeidsforhold.InntektspostType;
9+
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
10+
import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingRepository;
11+
import no.nav.ung.sak.behandlingslager.etterlysning.Etterlysning;
12+
import no.nav.ung.sak.behandlingslager.etterlysning.EtterlysningRepository;
13+
import no.nav.ung.sak.domene.arbeidsforhold.InntektArbeidYtelseTjeneste;
14+
import no.nav.ung.sak.domene.iay.modell.InntektArbeidYtelseGrunnlag;
15+
import no.nav.ung.sak.domene.iay.modell.Inntektspost;
16+
import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet;
17+
import no.nav.ung.sak.domene.typer.tid.Virkedager;
18+
import no.nav.ung.sak.etterlysning.EtterlysningHåndterer;
19+
import no.nav.ung.sak.etterlysning.UngOppgaveKlient;
20+
import no.nav.ung.sak.kontrakt.etterlysning.oppgave.kontroll.RegisterInntektATFL;
21+
import no.nav.ung.sak.kontrakt.etterlysning.oppgave.kontroll.RegisterInntektOppgaveDto;
22+
import no.nav.ung.sak.kontrakt.etterlysning.oppgave.kontroll.RegisterInntektYtelse;
23+
import no.nav.ung.sak.kontrakt.etterlysning.oppgave.kontroll.RegisterInntekter;
24+
25+
import java.math.BigDecimal;
26+
import java.math.RoundingMode;
27+
import java.time.LocalDateTime;
28+
import java.util.List;
29+
import java.util.stream.Collectors;
30+
31+
//TODO fjern?
32+
@Dependent
33+
public class InntektkontrollEtterlysningHåndterer implements EtterlysningHåndterer {
34+
35+
private final EtterlysningRepository etterlysningRepository;
36+
private final BehandlingRepository behandlingRepository;
37+
private InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste;
38+
private UngOppgaveKlient ungOppgaveKlient;
39+
40+
@Inject
41+
public InntektkontrollEtterlysningHåndterer(EtterlysningRepository etterlysningRepository,
42+
BehandlingRepository behandlingRepository,
43+
InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste,
44+
UngOppgaveKlient ungOppgaveKlient) {
45+
this.etterlysningRepository = etterlysningRepository;
46+
this.behandlingRepository = behandlingRepository;
47+
this.inntektArbeidYtelseTjeneste = inntektArbeidYtelseTjeneste;
48+
this.ungOppgaveKlient = ungOppgaveKlient;
49+
}
50+
51+
public void håndterOpprettelse(long behandlingId) {
52+
final var behandling = behandlingRepository.hentBehandling(behandlingId);
53+
54+
55+
final var etterlysninger = etterlysningRepository.hentOpprettetEtterlysninger(behandlingId, EtterlysningType.UTTALELSE_KONTROLL_INNTEKT);
56+
57+
58+
final var unikeGrunnlagsreferanser = etterlysninger.stream().map(Etterlysning::getGrunnlagsreferanse).collect(Collectors.toSet());
59+
60+
final var grunnlagPrReferanse = unikeGrunnlagsreferanser.stream().collect(Collectors.toMap(it -> it, it -> inntektArbeidYtelseTjeneste.hentGrunnlagForGrunnlagId(behandlingId, it)));
61+
etterlysninger.forEach(e -> e.vent(LocalDateTime.now().plusDays(14)));
62+
63+
final var oppgaveDtoer = etterlysninger.stream().map(etterlysning -> {
64+
final var grunnlag = grunnlagPrReferanse.get(etterlysning.getGrunnlagsreferanse());
65+
return new RegisterInntektOppgaveDTO(behandling.getAktørId().getAktørId(), etterlysning.getEksternReferanse(), etterlysning.getFrist(),
66+
InntektKontrollOppgaveMapper.mapTilRegisterInntekter(grunnlag, etterlysning.getPeriode()));
67+
}).collect(Collectors.toList());
68+
69+
oppgaveDtoer.forEach(ungOppgaveKlient::opprettOppgave);
70+
71+
// Kall oppgave API
72+
etterlysningRepository.lagre(etterlysninger);
73+
}
74+
75+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package no.nav.ung.sak.kontrakt.etterlysning.oppgave.kontroll;
2+
3+
import com.fasterxml.jackson.annotation.*;
4+
import jakarta.validation.Valid;
5+
import jakarta.validation.constraints.NotNull;
6+
import no.nav.ung.sak.typer.Arbeidsgiver;
7+
8+
@JsonIgnoreProperties(ignoreUnknown = true)
9+
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
10+
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.ANY)
11+
public record RegisterInntektATFL(@NotNull @Valid @JsonProperty("beløp") Integer beløp, @NotNull @Valid @JsonProperty("arbeidsgiver") Arbeidsgiver arbeidsgiver) {
12+
13+
@JsonCreator
14+
public RegisterInntektATFL {
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package no.nav.ung.sak.kontrakt.etterlysning.oppgave.kontroll;
2+
3+
import com.fasterxml.jackson.annotation.*;
4+
import jakarta.validation.Valid;
5+
import jakarta.validation.constraints.NotNull;
6+
import no.nav.ung.sak.typer.AktørId;
7+
8+
import java.time.LocalDateTime;
9+
import java.util.UUID;
10+
11+
@JsonIgnoreProperties(ignoreUnknown = true)
12+
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
13+
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.ANY)
14+
public record RegisterInntektOppgaveDto(
15+
@NotNull @Valid @JsonProperty("aktørId") AktørId aktørId,
16+
@Valid @JsonProperty("referanse") UUID referanse,
17+
@NotNull @JsonProperty("frist") LocalDateTime frist,
18+
@Valid @JsonProperty("registerInntekter") RegisterInntekter registerInntekter
19+
) {
20+
21+
@JsonCreator
22+
public RegisterInntektOppgaveDto {
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package no.nav.ung.sak.kontrakt.etterlysning.oppgave.kontroll;
2+
3+
import com.fasterxml.jackson.annotation.*;
4+
import jakarta.validation.Valid;
5+
import jakarta.validation.constraints.NotNull;
6+
import no.nav.ung.kodeverk.behandling.FagsakYtelseType;
7+
8+
@JsonIgnoreProperties(ignoreUnknown = true)
9+
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
10+
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.ANY)
11+
public record RegisterInntektYtelse(@NotNull @Valid @JsonProperty("beløp") Integer beløp, @NotNull @Valid @JsonProperty("ytelseType") FagsakYtelseType ytelseType) {
12+
13+
@JsonCreator
14+
public RegisterInntektYtelse {
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package no.nav.ung.sak.kontrakt.etterlysning.oppgave.kontroll;
2+
3+
import com.fasterxml.jackson.annotation.*;
4+
import jakarta.validation.Valid;
5+
import jakarta.validation.constraints.NotNull;
6+
7+
import java.util.List;
8+
9+
@JsonIgnoreProperties(ignoreUnknown = true)
10+
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
11+
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, fieldVisibility = JsonAutoDetect.Visibility.ANY)
12+
public record RegisterInntekter(
13+
@NotNull @Valid @JsonProperty("registerinntekterForArbeidOgFrilans") List<RegisterInntektATFL> registerinntekterForArbeidOgFrilans,
14+
@NotNull @Valid @JsonProperty("registerinntekterForYtelse") List<RegisterInntektYtelse> registerinntekterForYtelse) {
15+
16+
@JsonCreator
17+
public RegisterInntekter {
18+
}
19+
}

pom.xml

+7
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@
5555
det brukes. -->
5656
<dependencyManagement>
5757
<dependencies>
58+
59+
<dependency>
60+
<groupId>no.nav.ung</groupId>
61+
<artifactId>ung-deltakelse-opplyser</artifactId>
62+
<version>0.0.1-SNAPSHOT</version>
63+
</dependency>
64+
5865
<dependency>
5966
<groupId>com.fasterxml.jackson</groupId>
6067
<artifactId>jackson-bom</artifactId>

0 commit comments

Comments
 (0)