Skip to content

Commit a792450

Browse files
espenjvqtipsgithub-actions[bot]
authored
TSFF-1190 Etterlysning av uttalelse/bekreftelse fra bruker (#250)
* TSFF-1190: Etterlysning av uttalelse * gjør RapportertInntekt til record * Oppretter etterlysning og lager ny task for å bestille oppgave * Endrer kontroll biten til å returnere tidslinje istedenfor enum * TSFF-1190: Opprettelse og avbrytelse av etterlysning basert på periodisert kontrollresultat * TSFF-1190: Legger til etterlysning i bom * TSFF-1190: DDL for etterlysning * TSFF-1190: DDL for etterlysning * TSFF-1190: Fiks embedded periode * Fikse import * Fikse scriptversjon * Legger til restendepunkt * Fix pom * Legger til orm * Fjerner snapshot versjon * Legger til manglende beans.xml * Fix kompileringsfeil * ung-sak.openapi.json updated by build pipeline skip-checks:true * Bruker type i staden for kode * Diverse bugfix * Fjerne ubrukt record * ung-sak.openapi.json updated by build pipeline skip-checks:true --------- Co-authored-by: Qadeer Khan <[email protected]> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent 34a44ce commit a792450

File tree

40 files changed

+1139
-176
lines changed

40 files changed

+1139
-176
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package no.nav.ung.sak.behandlingslager.etterlysning;
2+
3+
import java.time.LocalDateTime;
4+
import java.util.UUID;
5+
6+
import no.nav.fpsak.tidsserie.LocalDateTimeline;
7+
import org.hibernate.annotations.Immutable;
8+
9+
import jakarta.persistence.AttributeOverride;
10+
import jakarta.persistence.AttributeOverrides;
11+
import jakarta.persistence.Column;
12+
import jakarta.persistence.Embedded;
13+
import jakarta.persistence.Entity;
14+
import jakarta.persistence.GeneratedValue;
15+
import jakarta.persistence.GenerationType;
16+
import jakarta.persistence.Id;
17+
import jakarta.persistence.Table;
18+
import no.nav.ung.kodeverk.etterlysning.EtterlysningStatus;
19+
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
20+
import no.nav.ung.sak.behandlingslager.BaseEntitet;
21+
import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet;
22+
23+
@Entity(name = "Etterlysning")
24+
@Table(name = "ETTERLYSNING")
25+
@Immutable
26+
public class Etterlysning extends BaseEntitet {
27+
28+
@Id
29+
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_ETTERLYSNING")
30+
private Long id;
31+
32+
@Column(name = "behandling_id", updatable = false, nullable = false)
33+
private Long behandlingId;
34+
35+
@Column(name = "grunnlag_ref", nullable = false)
36+
private UUID grunnlagsreferanse;
37+
38+
@Column(name = "ekstern_ref", nullable = false)
39+
private UUID eksternReferanse;
40+
41+
@Embedded
42+
private DatoIntervallEntitet periode;
43+
44+
@Column(name = "type", nullable = false)
45+
private EtterlysningType type;
46+
47+
@Column(name = "status", nullable = false)
48+
private EtterlysningStatus status;
49+
50+
@Column(name = "frist")
51+
private LocalDateTime frist;
52+
53+
private Etterlysning() {
54+
// Hibernate
55+
}
56+
57+
public static Etterlysning forInntektKontrollUttalelse(
58+
Long behandlingId,
59+
UUID grunnlagsreferanse,
60+
UUID eksternReferanse,
61+
DatoIntervallEntitet periode) {
62+
63+
return new Etterlysning(
64+
behandlingId,
65+
grunnlagsreferanse,
66+
eksternReferanse,
67+
periode,
68+
EtterlysningType.UTTALELSE_KONTROLL_INNTEKT,
69+
EtterlysningStatus.OPPRETTET);
70+
}
71+
72+
public Etterlysning(Long behandlingId,
73+
UUID grunnlagsreferanse,
74+
UUID eksternReferanse,
75+
DatoIntervallEntitet periode,
76+
EtterlysningType type,
77+
EtterlysningStatus status) {
78+
this.behandlingId = behandlingId;
79+
this.grunnlagsreferanse = grunnlagsreferanse;
80+
this.eksternReferanse = eksternReferanse;
81+
this.periode = periode;
82+
this.type = type;
83+
this.status = status;
84+
}
85+
86+
public Long getId() {
87+
return id;
88+
}
89+
90+
public UUID getGrunnlagsreferanse() {
91+
return grunnlagsreferanse;
92+
}
93+
94+
public UUID getEksternReferanse() {
95+
return eksternReferanse;
96+
}
97+
98+
public DatoIntervallEntitet getPeriode() {
99+
return periode;
100+
}
101+
102+
public EtterlysningType getType() {
103+
return type;
104+
}
105+
106+
public EtterlysningStatus getStatus() {
107+
return status;
108+
}
109+
110+
public void vent(LocalDateTime frist) {
111+
if (status != EtterlysningStatus.OPPRETTET) {
112+
throw new IllegalStateException("Kan vente på etterlysning som ikke er satt til OPPRETTET. Status er " + status);
113+
}
114+
this.status = EtterlysningStatus.VENTER;
115+
this.frist = frist;
116+
}
117+
118+
public void avbryt() {
119+
if (status != EtterlysningStatus.SKAL_AVBRYTES) {
120+
throw new IllegalStateException("Kan ikke avbryte etterlysning som ikke er satt til SKAL_AVBRYTES. Status er " + status);
121+
}
122+
this.status = EtterlysningStatus.AVBRUTT;
123+
this.frist = null;
124+
}
125+
126+
127+
public void skalAvbrytes() {
128+
if (status == EtterlysningStatus.MOTTATT_SVAR) {
129+
throw new IllegalStateException("Kan ikke avbryte etterlysning som er mottatt.");
130+
}
131+
this.status = EtterlysningStatus.SKAL_AVBRYTES;
132+
}
133+
134+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package no.nav.ung.sak.behandlingslager.etterlysning;
2+
3+
import jakarta.enterprise.context.ApplicationScoped;
4+
import jakarta.inject.Inject;
5+
import jakarta.persistence.EntityManager;
6+
import no.nav.ung.kodeverk.etterlysning.EtterlysningStatus;
7+
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
8+
9+
import java.util.List;
10+
11+
@ApplicationScoped
12+
public class EtterlysningRepository {
13+
14+
private EntityManager entityManager;
15+
16+
17+
public EtterlysningRepository() {
18+
}
19+
20+
@Inject
21+
public EtterlysningRepository(EntityManager entityManager) {
22+
this.entityManager = entityManager;
23+
}
24+
25+
public Etterlysning lagre(Etterlysning etterlysning) {
26+
entityManager.persist(etterlysning);
27+
return etterlysning;
28+
}
29+
30+
public List<Etterlysning> lagre(List<Etterlysning> etterlysninger) {
31+
etterlysninger.forEach(entityManager::persist);
32+
return etterlysninger;
33+
}
34+
35+
public List<Etterlysning> hentEtterlysninger(Long behandlingId) {
36+
final var etterlysninger = entityManager.createQuery("select e from Etterlysning e " +
37+
"where e.behandlingId = :behandlingId", Etterlysning.class)
38+
.setParameter("behandlingId", behandlingId)
39+
.getResultList();
40+
return etterlysninger;
41+
}
42+
43+
public List<Etterlysning> hentEtterlysninger(Long behandlingId, EtterlysningType type) {
44+
final var etterlysninger = entityManager.createQuery("select e from Etterlysning e " +
45+
"where e.behandlingId = :behandlingId and e.type = :type", Etterlysning.class)
46+
.setParameter("behandlingId", behandlingId)
47+
.setParameter("type", type)
48+
.getResultList();
49+
return etterlysninger;
50+
}
51+
52+
53+
public List<Etterlysning> hentOpprettetEtterlysninger(Long behandlingId, EtterlysningType type) {
54+
final var etterlysninger = entityManager.createQuery("select e from Etterlysning e " +
55+
"where e.behandlingId = :behandlingId and e.type = :type and status = :status", Etterlysning.class)
56+
.setParameter("behandlingId", behandlingId)
57+
.setParameter("type", type)
58+
.setParameter("status", EtterlysningStatus.OPPRETTET)
59+
.getResultList();
60+
return etterlysninger;
61+
}
62+
63+
public List<Etterlysning> hentEtterlysningerSomSkalAvbrytes(Long behandlingId) {
64+
final var etterlysninger = entityManager.createQuery("select e from Etterlysning e " +
65+
"where e.behandlingId = :behandlingId and e.type = :type and status = :status", Etterlysning.class)
66+
.setParameter("behandlingId", behandlingId)
67+
.setParameter("status", EtterlysningStatus.SKAL_AVBRYTES)
68+
.getResultList();
69+
return etterlysninger;
70+
}
71+
72+
73+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package no.nav.ung.sak.behandlingslager.kodeverk;
2+
3+
import jakarta.persistence.AttributeConverter;
4+
import jakarta.persistence.Converter;
5+
import no.nav.ung.kodeverk.etterlysning.EtterlysningStatus;
6+
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
7+
8+
@Converter(autoApply = true)
9+
public class EtterlysningStatusKodeverdiConverter implements AttributeConverter<EtterlysningStatus, String> {
10+
@Override
11+
public String convertToDatabaseColumn(EtterlysningStatus attribute) {
12+
return attribute == null ? null : attribute.getKode();
13+
}
14+
15+
@Override
16+
public EtterlysningStatus convertToEntityAttribute(String dbData) {
17+
return dbData == null ? null : EtterlysningStatus.fraKode(dbData);
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package no.nav.ung.sak.behandlingslager.kodeverk;
2+
3+
import jakarta.persistence.AttributeConverter;
4+
import jakarta.persistence.Converter;
5+
import no.nav.ung.kodeverk.behandling.aksjonspunkt.AksjonspunktDefinisjon;
6+
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
7+
8+
@Converter(autoApply = true)
9+
public class EtterlysningTypeKodeverdiConverter implements AttributeConverter<EtterlysningType, String> {
10+
@Override
11+
public String convertToDatabaseColumn(EtterlysningType attribute) {
12+
return attribute == null ? null : attribute.getKode();
13+
}
14+
15+
@Override
16+
public EtterlysningType convertToEntityAttribute(String dbData) {
17+
return dbData == null ? null : EtterlysningType.fraKode(dbData);
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<entity-mappings xmlns="https://jakarta.ee/xml/ns/persistence/orm"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence/orm https://jakarta.ee/xml/ns/persistence/orm/orm_3_0.xsd"
5+
version="3.0">
6+
7+
<sequence-generator name="SEQ_ETTERLYSNING" allocation-size="50" sequence-name="SEQ_ETTERLYSNING"/>
8+
9+
<entity class="no.nav.ung.sak.behandlingslager.etterlysning.Etterlysning"/>
10+
11+
</entity-mappings>

behandlingsprosess/src/main/java/no/nav/ung/sak/domene/behandling/steg/registerinntektkontroll/Avviksvurdering.java

+36-37
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,67 @@
11
package no.nav.ung.sak.domene.behandling.steg.registerinntektkontroll;
22

3+
import static no.nav.ung.sak.domene.behandling.steg.registerinntektkontroll.FinnKontrollresultatForIkkeGodkjentUttalelse.harDiff;
4+
5+
import java.math.BigDecimal;
6+
import java.util.Set;
7+
38
import no.nav.fpsak.tidsserie.LocalDateSegment;
49
import no.nav.fpsak.tidsserie.LocalDateTimeline;
10+
import no.nav.fpsak.tidsserie.StandardCombinators;
511
import no.nav.ung.kodeverk.behandling.BehandlingÅrsakType;
12+
import no.nav.ung.sak.ytelse.BrukersUttalelseForRegisterinntekt;
613
import no.nav.ung.sak.ytelse.RapportertInntekt;
714
import no.nav.ung.sak.ytelse.RapporterteInntekter;
8-
import no.nav.ung.sak.ytelse.uttalelse.BrukersUttalelseForRegisterinntekt;
9-
10-
import java.math.BigDecimal;
11-
import java.util.Optional;
12-
import java.util.Set;
13-
14-
import static no.nav.ung.sak.domene.behandling.steg.registerinntektkontroll.FinnKontrollresultatForIkkeGodkjentUttalelse.harDiff;
1515

1616
public class Avviksvurdering {
1717

1818
public static final BigDecimal AKSEPTERT_DIFFERANSE = BigDecimal.valueOf(1000);
1919

2020

21-
static Optional<KontrollResultat> gjørAvviksvurderingMotRegisterinntekt(LocalDateTimeline<RapporterteInntekter> gjeldendeRapporterteInntekter, LocalDateTimeline<BrukersUttalelseForRegisterinntekt> uttalelseTidslinje, LocalDateTimeline<Set<BehandlingÅrsakType>> tidslinjeRelevanteÅrsaker) {
21+
static LocalDateTimeline<KontrollResultat> gjørAvviksvurderingMotRegisterinntekt(
22+
LocalDateTimeline<RapporterteInntekter> gjeldendeRapporterteInntekter,
23+
LocalDateTimeline<BrukersUttalelseForRegisterinntekt> uttalelseTidslinje,
24+
LocalDateTimeline<Set<BehandlingÅrsakType>> tidslinjeRelevanteÅrsaker) {
25+
26+
//Finner tidslinje der det er avvik mellom register og rapportert inntekt
2227
final var inntektDiffKontrollResultat = finnKontrollresultatTidslinje(gjeldendeRapporterteInntekter, tidslinjeRelevanteÅrsaker);
2328

2429
final var tidslinjeForOppgaveTilBruker = inntektDiffKontrollResultat.filterValue(it -> it.equals(KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER));
25-
if (!tidslinjeForOppgaveTilBruker.isEmpty()) {
26-
27-
// Må finne ut om vi skal sette ny frist
28-
final var oppgaverTilBrukerTidslinje = finnNyOppgaveKontrollresultatTidslinje(gjeldendeRapporterteInntekter, uttalelseTidslinje, tidslinjeForOppgaveTilBruker);
2930

30-
if (!oppgaverTilBrukerTidslinje.filterValue(it -> it.equals(KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST)).isEmpty()) {
31-
return Optional.of(KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST);
32-
} else {
33-
return Optional.of(KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER);
34-
}
31+
// Må finne ut om vi skal sette ny frist hvis registeret har oppdatert seg
32+
final var oppgaverTilBrukerTidslinje = finnNyOppgaveKontrollresultatTidslinje(gjeldendeRapporterteInntekter, uttalelseTidslinje, tidslinjeForOppgaveTilBruker);
3533

36-
}
37-
38-
if (!inntektDiffKontrollResultat.filterValue(it -> it.equals(KontrollResultat.BRUK_INNTEKT_FRA_BRUKER)).isEmpty()) {
39-
return Optional.of(KontrollResultat.BRUK_INNTEKT_FRA_BRUKER);
40-
}
41-
return Optional.empty();
34+
//Resultat
35+
return inntektDiffKontrollResultat.crossJoin(oppgaverTilBrukerTidslinje, StandardCombinators::coalesceRightHandSide);
4236
}
4337

44-
private static LocalDateTimeline<KontrollResultat> finnNyOppgaveKontrollresultatTidslinje(LocalDateTimeline<RapporterteInntekter> gjeldendeRapporterteInntekter, LocalDateTimeline<BrukersUttalelseForRegisterinntekt> uttalelseTidslinje, LocalDateTimeline<KontrollResultat> tidslinjeForOppgaveTilBruker) {
45-
final var oppgaverTilBrukerTidslinje = gjeldendeRapporterteInntekter.mapValue(RapporterteInntekter::getRegisterRapporterteInntekter).intersection(tidslinjeForOppgaveTilBruker)
46-
.combine(uttalelseTidslinje.mapValue(BrukersUttalelseForRegisterinntekt::registerInntekt), (di, register, uttalelse) -> {
47-
if (uttalelse == null) {
48-
return new LocalDateSegment<>(di, KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER);
49-
}
50-
if (!harDiff(uttalelse.getValue(), register.getValue())) {
51-
return new LocalDateSegment<>(di, KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER);
52-
} else {
53-
return new LocalDateSegment<>(di, KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST);
54-
}
55-
}, LocalDateTimeline.JoinStyle.LEFT_JOIN);
38+
private static LocalDateTimeline<KontrollResultat> finnNyOppgaveKontrollresultatTidslinje(
39+
LocalDateTimeline<RapporterteInntekter> gjeldendeRapporterteInntekter,
40+
LocalDateTimeline<BrukersUttalelseForRegisterinntekt> uttalelseTidslinje,
41+
LocalDateTimeline<KontrollResultat> tidslinjeForOppgaveTilBruker) {
42+
final var oppgaverTilBrukerTidslinje = gjeldendeRapporterteInntekter.mapValue(RapporterteInntekter::registerRapporterteInntekter).intersection(tidslinjeForOppgaveTilBruker)
43+
.combine(uttalelseTidslinje.mapValue(BrukersUttalelseForRegisterinntekt::registerInntekt),
44+
(di, gjeldendeRegisterinntekt, registerinntektVedUttalelse) -> {
45+
if (registerinntektVedUttalelse == null) {
46+
return new LocalDateSegment<>(di, KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER);
47+
}
48+
if (!harDiff(registerinntektVedUttalelse.getValue(), gjeldendeRegisterinntekt.getValue())) {
49+
return new LocalDateSegment<>(di, KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER);
50+
} else {
51+
return new LocalDateSegment<>(di, KontrollResultat.OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST);
52+
}
53+
},
54+
LocalDateTimeline.JoinStyle.LEFT_JOIN);
5655
return oppgaverTilBrukerTidslinje;
5756
}
5857

5958
private static LocalDateTimeline<KontrollResultat> finnKontrollresultatTidslinje(LocalDateTimeline<RapporterteInntekter> gjeldendeRapporterteInntekter, LocalDateTimeline<Set<BehandlingÅrsakType>> tidslinjeRelevanteÅrsaker) {
6059
final var inntektDiffKontrollResultat = gjeldendeRapporterteInntekter.intersection(tidslinjeRelevanteÅrsaker)
6160
.mapValue(it ->
6261
{
63-
final var register = it.getRegisterRapporterteInntekter().stream()
62+
final var register = it.registerRapporterteInntekter().stream()
6463
.map(RapportertInntekt::beløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
65-
final var bruker = it.getBrukerRapporterteInntekter().stream()
64+
final var bruker = it.brukerRapporterteInntekter().stream()
6665
.map(RapportertInntekt::beløp).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
6766

6867
final var differanse = register.subtract(bruker).abs();

0 commit comments

Comments
 (0)