Skip to content

Commit 7014a6e

Browse files
espenjvgithub-actions[bot]qtips
authored
FIX: Hopper tilbake til start ved nye bekreftelser (#262)
* FIX: Hopper tilbake til start ved nye bekreftelser * FIX: Hopper tilbake til start ved nye bekreftelser * ung-sak.openapi.json updated by build pipeline skip-checks:true * Fiks henting at uttalelse. Logging * flytter journalpostId til Uttalelse * fix * FIX: Returnerer null fra regler istedenfor å feile fordi det vil kunne skje at det ikke finnes brev i enkelte tilfeller. * FIX: Sjekker kontrollperioder for utledelse av startpunkt for iay, lar etterlysning peike på uttalelse, legger til støtte for å avbryte oppgave, utfører oppgavetasker i sekvens med avbryt først --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Qadeer Khan <[email protected]>
1 parent 983debb commit 7014a6e

File tree

24 files changed

+230
-123
lines changed

24 files changed

+230
-123
lines changed

behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/etterlysning/Etterlysning.java

+18-12
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,11 @@ public class Etterlysning extends BaseEntitet {
4242
@Column(name = "frist")
4343
private LocalDateTime frist;
4444

45-
@Embedded
46-
@AttributeOverrides(@AttributeOverride(name = "journalpostId", column = @Column(name = "svar_journalpost_id")))
47-
private JournalpostId svarJournalpostId;
48-
4945
@OneToOne
50-
@JoinColumn(name = "id", referencedColumnName = "etterlysning_id")
46+
@JoinColumn(name = "uttalelse_id", unique = true)
5147
private UttalelseEntitet uttalelse;
5248

53-
private Etterlysning() {
49+
Etterlysning() {
5450
// Hibernate
5551
}
5652

@@ -83,6 +79,21 @@ public Etterlysning(Long behandlingId,
8379
this.status = status;
8480
}
8581

82+
@Override
83+
public String toString() {
84+
return "Etterlysning{" +
85+
"id=" + id +
86+
", behandlingId=" + behandlingId +
87+
", grunnlagsreferanse=" + grunnlagsreferanse +
88+
", eksternReferanse=" + eksternReferanse +
89+
", periode=" + periode +
90+
", type=" + type +
91+
", status=" + status +
92+
", frist=" + frist +
93+
", uttalelse=" + uttalelse +
94+
'}';
95+
}
96+
8697
public Long getId() {
8798
return id;
8899
}
@@ -150,13 +161,8 @@ public void mottattUttalelse(JournalpostId svarJournalpostId, boolean erEndringG
150161
if (status != EtterlysningStatus.VENTER) {
151162
throw new IllegalStateException("Kan ikke motta svar på etterlysning som ikke er satt til VENTER. Status er " + status);
152163
}
153-
this.svarJournalpostId = svarJournalpostId;
154164
this.status = EtterlysningStatus.MOTTATT_SVAR;
155-
this.uttalelse = new UttalelseEntitet(this.id, erEndringGodkjent, uttalelse);
156-
}
157-
158-
public JournalpostId getSvarJournalpostId() {
159-
return svarJournalpostId;
165+
this.uttalelse = new UttalelseEntitet(erEndringGodkjent, uttalelse, svarJournalpostId);
160166
}
161167

162168
public UttalelseEntitet getUttalelse() {

behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/etterlysning/EtterlysningRepository.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public List<Etterlysning> hentOpprettetEtterlysninger(Long behandlingId, Etterly
6868

6969
public List<Etterlysning> hentEtterlysningerSomSkalAvbrytes(Long behandlingId) {
7070
final var etterlysninger = entityManager.createQuery("select e from Etterlysning e " +
71-
"where e.behandlingId = :behandlingId and e.type = :type and status = :status", Etterlysning.class)
71+
"where e.behandlingId = :behandlingId and status = :status", Etterlysning.class)
7272
.setParameter("behandlingId", behandlingId)
7373
.setParameter("status", EtterlysningStatus.SKAL_AVBRYTES)
7474
.getResultList();
@@ -78,7 +78,7 @@ public List<Etterlysning> hentEtterlysningerSomSkalAvbrytes(Long behandlingId) {
7878

7979
public List<Etterlysning> hentUtløpteEtterlysningerSomVenterPåSvar(Long behandlingId) {
8080
final var etterlysninger = entityManager.createQuery("select e from Etterlysning e " +
81-
"where e.behandlingId = :behandlingId and e.type = :type and status = :status AND frist < :naa", Etterlysning.class)
81+
"where e.behandlingId = :behandlingId and status = :status AND frist < :naa", Etterlysning.class)
8282
.setParameter("status", EtterlysningStatus.VENTER)
8383
.setParameter("behandlingId", behandlingId)
8484
.setParameter("naa", LocalDateTime.now())

behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/etterlysning/UttalelseEntitet.java

+19-9
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22

33
import jakarta.persistence.*;
44
import no.nav.ung.sak.behandlingslager.BaseEntitet;
5-
import org.hibernate.annotations.Immutable;
5+
import no.nav.ung.sak.typer.JournalpostId;
66

77
@Entity(name = "Uttalelse")
88
@Table(name = "UTTALELSE")
9-
@Immutable
109
public class UttalelseEntitet extends BaseEntitet {
1110

1211
@Id
@@ -19,21 +18,28 @@ public class UttalelseEntitet extends BaseEntitet {
1918
@Column(name = "har_godtatt_endringen", updatable = false, nullable = false)
2019
private boolean harGodtattEndringen;
2120

22-
@Column(name = "etterlysning_id", updatable = false, nullable = false)
23-
private long etterlysningId;
21+
@Embedded
22+
@AttributeOverrides(@AttributeOverride(name = "journalpostId", column = @Column(name = "svar_journalpost_id")))
23+
private JournalpostId svarJournalpostId;
2424

25-
26-
private UttalelseEntitet() {
25+
public UttalelseEntitet() {
2726
// Hibernate
2827
}
2928

30-
public UttalelseEntitet(long etterlysningId, boolean harGodtattEndringen, String uttalelseBegrunnelse) {
29+
public UttalelseEntitet(boolean harGodtattEndringen, String uttalelseBegrunnelse, JournalpostId svarJournalpostId) {
3130
this.uttalelseBegrunnelse = uttalelseBegrunnelse;
3231
this.harGodtattEndringen = harGodtattEndringen;
33-
this.etterlysningId = etterlysningId;
32+
this.svarJournalpostId = svarJournalpostId;
3433
}
3534

36-
35+
@Override
36+
public String toString() {
37+
return "UttalelseEntitet{" +
38+
"id=" + id +
39+
", harGodtattEndringen=" + harGodtattEndringen +
40+
", svarJournalpostId=" + svarJournalpostId +
41+
'}';
42+
}
3743

3844
public String getUttalelseBegrunnelse() {
3945
return uttalelseBegrunnelse;
@@ -42,4 +48,8 @@ public String getUttalelseBegrunnelse() {
4248
public boolean harGodtattEndringen() {
4349
return harGodtattEndringen;
4450
}
51+
52+
public JournalpostId getSvarJournalpostId() {
53+
return svarJournalpostId;
54+
}
4555
}

behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/tilkjentytelse/KontrollertInntektPeriode.java

+16
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ public class KontrollertInntektPeriode extends BaseEntitet {
3737
@Column(name = "er_manuelt_vurdert", nullable = false)
3838
private boolean erManueltVurdert;
3939

40+
41+
private KontrollertInntektPeriode() {
42+
// Hibernate
43+
}
44+
4045
KontrollertInntektPeriode(KontrollertInntektPeriode eksisterende) {
4146
this.periode = Range.closed(eksisterende.getPeriode().getFomDato(), eksisterende.getPeriode().getTomDato());
4247
this.arbeidsinntekt = eksisterende.getArbeidsinntekt();
@@ -75,6 +80,17 @@ public boolean getErManueltVurdert() {
7580
return erManueltVurdert;
7681
}
7782

83+
@Override
84+
public String toString() {
85+
return "KontrollertInntektPeriode{" +
86+
"periode=" + periode +
87+
", arbeidsinntekt=" + arbeidsinntekt +
88+
", ytelse=" + ytelse +
89+
", kilde=" + kilde +
90+
", erManueltVurdert=" + erManueltVurdert +
91+
'}';
92+
}
93+
7894
public static Builder ny() {
7995
return new Builder();
8096
}

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

+36-16
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import no.nav.fpsak.tidsserie.LocalDateSegment;
66
import no.nav.fpsak.tidsserie.LocalDateTimeline;
77
import no.nav.k9.prosesstask.api.ProsessTaskData;
8+
import no.nav.k9.prosesstask.api.ProsessTaskGruppe;
89
import no.nav.k9.prosesstask.api.ProsessTaskTjeneste;
910
import no.nav.ung.kodeverk.behandling.BehandlingStegType;
1011
import no.nav.ung.kodeverk.behandling.BehandlingÅrsakType;
@@ -27,6 +28,8 @@
2728
import no.nav.ung.sak.ytelse.KontrollerteInntektperioderTjeneste;
2829
import no.nav.ung.sak.ytelse.RapportertInntektMapper;
2930
import no.nav.ung.sak.ytelse.RapporterteInntekter;
31+
import org.slf4j.Logger;
32+
import org.slf4j.LoggerFactory;
3033

3134
import java.time.LocalDateTime;
3235
import java.util.ArrayList;
@@ -43,6 +46,8 @@
4346
@FagsakYtelseTypeRef(UNGDOMSYTELSE)
4447
public class KontrollerInntektSteg implements BehandlingSteg {
4548

49+
private static final Logger log = LoggerFactory.getLogger(KontrollerInntektSteg.class);
50+
4651
private ProsessTriggerPeriodeUtleder prosessTriggerPeriodeUtleder;
4752
private RapportertInntektMapper rapportertInntektMapper;
4853
private KontrollerteInntektperioderTjeneste kontrollerteInntektperioderTjeneste;
@@ -51,6 +56,8 @@ public class KontrollerInntektSteg implements BehandlingSteg {
5156
private InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste;
5257
private ProsessTaskTjeneste prosessTaskTjeneste;
5358

59+
60+
5461
@Inject
5562
public KontrollerInntektSteg(ProsessTriggerPeriodeUtleder prosessTriggerPeriodeUtleder,
5663
RapportertInntektMapper rapportertInntektMapper,
@@ -87,6 +94,8 @@ public KontrollerInntektSteg() {
8794
var registerinntekterForEtterlysninger = rapportertInntektMapper.finnRegisterinntekterForEtterlysninger(behandlingId, etterlysningsperioder);
8895

8996
var kontrollResultat = KontrollerInntektTjeneste.utførKontroll(prosessTriggerTidslinje, rapporterteInntekterTidslinje, registerinntekterForEtterlysninger);
97+
98+
log.info("Kontrollresultat ble {}", kontrollResultat.toSegments());
9099
håndterPeriodisertKontrollresultat(kontekst, kontrollResultat, rapporterteInntekterTidslinje, prosessTriggerTidslinje, etterlysninger);
91100
return avgjørResultat(behandlingId, kontrollResultat, prosessTriggerTidslinje);
92101
}
@@ -111,36 +120,47 @@ public void vedHoppOverBakover(BehandlingskontrollKontekst kontekst, BehandlingS
111120
List<Etterlysning> etterlysningerSomSkalAvbrytes = new ArrayList<>();
112121
List<Etterlysning> etterlysningerSomSkalOpprettes = new ArrayList<>();
113122
var grunnlag = inntektArbeidYtelseTjeneste.hentGrunnlag(kontekst.getBehandlingId());
114-
for (var segment : kontrollResultat.toSegments()) {
115-
switch (segment.getValue()) {
123+
for (var kontrollSegment : kontrollResultat.toSegments()) {
124+
switch (kontrollSegment.getValue()) {
116125
case BRUK_INNTEKT_FRA_BRUKER -> {
117-
etterlysningerSomSkalAvbrytes.addAll(avbrytDersomEksisterendeEtterlysning(etterlysninger, segment));
126+
log.info("Bruker inntekt fra bruker for periode {}", kontrollSegment.getLocalDateInterval());
127+
etterlysningerSomSkalAvbrytes.addAll(avbrytDersomEksisterendeEtterlysning(etterlysninger, kontrollSegment));
118128
kontrollerteInntektperioderTjeneste.opprettKontrollerteInntekterPerioderFraBruker(
119129
kontekst.getBehandlingId(),
120-
rapporterteInntekterTidslinje.mapValue(RapporterteInntekter::brukerRapporterteInntekter).intersection(segment.getLocalDateInterval()),
130+
rapporterteInntekterTidslinje.mapValue(RapporterteInntekter::brukerRapporterteInntekter).intersection(kontrollSegment.getLocalDateInterval()),
121131
prosessTriggerTidslinje);
122132
}
123133
case OPPRETT_OPPGAVE_TIL_BRUKER_MED_NY_FRIST -> {
124-
etterlysningerSomSkalAvbrytes.addAll(avbrytDersomEksisterendeEtterlysning(etterlysninger, segment));
125-
etterlysningerSomSkalOpprettes.add(opprettNyEtterlysning(kontekst.getBehandlingId(), segment, grunnlag.getEksternReferanse()));
134+
log.info("Oppretter ny etterlysning med utvidet frist for periode {}", kontrollSegment.getLocalDateInterval());
135+
etterlysningerSomSkalAvbrytes.addAll(avbrytDersomEksisterendeEtterlysning(etterlysninger, kontrollSegment));
136+
etterlysningerSomSkalOpprettes.add(opprettNyEtterlysning(kontekst.getBehandlingId(), kontrollSegment, grunnlag.getEksternReferanse()));
126137
}
127138
case OPPRETT_OPPGAVE_TIL_BRUKER -> {
128-
if (!harEksisterendeEtterlysningPåVent(segment, etterlysninger)) {
129-
etterlysningerSomSkalOpprettes.add(opprettNyEtterlysning(kontekst.getBehandlingId(), segment, grunnlag.getEksternReferanse()));
139+
log.info("Oppretter etterlysning hvis ikke finnes for periode {}", kontrollSegment.getLocalDateInterval());
140+
if (!harEksisterendeEtterlysningPåVent(kontrollSegment, etterlysninger)) {
141+
etterlysningerSomSkalOpprettes.add(opprettNyEtterlysning(kontekst.getBehandlingId(), kontrollSegment, grunnlag.getEksternReferanse()));
130142
}
131143
}
132144
}
133145
}
134146

147+
final var prosessTaskGruppe = new ProsessTaskGruppe();
148+
if (!etterlysningerSomSkalAvbrytes.isEmpty()) {
149+
log.info("Avbryter etterlysninger {}", etterlysningerSomSkalAvbrytes);
150+
etterlysningRepository.lagre(etterlysningerSomSkalAvbrytes);
151+
prosessTaskGruppe.addNesteSekvensiell(lagTaskForAvbrytelseAvEtterlysning(kontekst));
152+
}
153+
135154
if (!etterlysningerSomSkalOpprettes.isEmpty()) {
155+
log.info("Oppretter etterlysninger {}", etterlysningerSomSkalOpprettes);
136156
etterlysningRepository.lagre(etterlysningerSomSkalOpprettes);
137-
lagTaskForOpprettingAvEtterlysning(kontekst);
157+
prosessTaskGruppe.addNesteSekvensiell(lagTaskForOpprettingAvEtterlysning(kontekst));
138158
}
139159

140-
if (!etterlysningerSomSkalAvbrytes.isEmpty()) {
141-
etterlysningRepository.lagre(etterlysningerSomSkalAvbrytes);
142-
lagTaskForAvbrytelseAvEtterlysning(kontekst);
160+
if (!prosessTaskGruppe.getTasks().isEmpty()) {
161+
prosessTaskTjeneste.lagre(prosessTaskGruppe);
143162
}
163+
144164
}
145165

146166
private static boolean harEksisterendeEtterlysningPåVent(LocalDateSegment<KontrollResultat> segment, List<Etterlysning> etterlysninger) {
@@ -201,17 +221,17 @@ private List<Etterlysning> avbrytDersomEksisterendeEtterlysning(List<Etterlysnin
201221
}
202222

203223

204-
private void lagTaskForOpprettingAvEtterlysning(BehandlingskontrollKontekst kontekst) {
224+
private ProsessTaskData lagTaskForOpprettingAvEtterlysning(BehandlingskontrollKontekst kontekst) {
205225
var prosessTaskData = ProsessTaskData.forProsessTask(OpprettEtterlysningTask.class);
206226
prosessTaskData.setProperty(OpprettEtterlysningTask.ETTERLYSNING_TYPE, EtterlysningType.UTTALELSE_KONTROLL_INNTEKT.getKode());
207227
prosessTaskData.setBehandling(kontekst.getFagsakId(), kontekst.getBehandlingId());
208-
prosessTaskTjeneste.lagre(prosessTaskData);
228+
return prosessTaskData;
209229
}
210230

211-
private void lagTaskForAvbrytelseAvEtterlysning(BehandlingskontrollKontekst kontekst) {
231+
private ProsessTaskData lagTaskForAvbrytelseAvEtterlysning(BehandlingskontrollKontekst kontekst) {
212232
var prosessTaskData = ProsessTaskData.forProsessTask(AvbrytEtterlysningTask.class);
213233
prosessTaskData.setBehandling(kontekst.getFagsakId(), kontekst.getBehandlingId());
214-
prosessTaskTjeneste.lagre(prosessTaskData);
234+
return prosessTaskData;
215235
}
216236

217237

domenetjenester/beregning-ytelse/src/main/java/no/nav/ung/sak/ytelse/KontrollerteInntektperioderTjeneste.java

+4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import no.nav.ung.sak.behandlingslager.tilkjentytelse.KontrollertInntektPeriode;
1111
import no.nav.ung.sak.behandlingslager.tilkjentytelse.TilkjentYtelseRepository;
1212
import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet;
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
1315

1416
import java.math.BigDecimal;
1517
import java.util.HashSet;
@@ -25,6 +27,7 @@
2527
@Dependent
2628
public class KontrollerteInntektperioderTjeneste {
2729

30+
private static final Logger LOG = LoggerFactory.getLogger(KontrollerteInntektperioderTjeneste.class);
2831
private final TilkjentYtelseRepository tilkjentYtelseRepository;
2932

3033

@@ -36,6 +39,7 @@ public KontrollerteInntektperioderTjeneste(TilkjentYtelseRepository tilkjentYtel
3639
public void opprettKontrollerteInntekterPerioderFraBruker(Long behandlingId, LocalDateTimeline<Set<RapportertInntekt>> inntektTidslinje, LocalDateTimeline<Set<BehandlingÅrsakType>> prosesstriggerTidslinje) {
3740
final var relevantePerioderForKontroll = prosesstriggerTidslinje.filterValue(it -> it.contains(BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT));
3841
final var kontrollertePerioder = mapTilKontrollerteInntektperioder(inntektTidslinje.mapValue(it -> new RapportertInntektOgKilde(KontrollertInntektKilde.BRUKER, it)), relevantePerioderForKontroll, Optional.of(KontrollertInntektKilde.BRUKER), false);
42+
LOG.info("Lagrer inntekt fra bruker: {}", kontrollertePerioder);
3943
tilkjentYtelseRepository.lagre(behandlingId, kontrollertePerioder);
4044
}
4145

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

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package no.nav.ung.sak.etterlysning;
22

33
import jakarta.enterprise.context.ApplicationScoped;
4+
import jakarta.inject.Inject;
45
import no.nav.k9.prosesstask.api.ProsessTask;
56
import no.nav.k9.prosesstask.api.ProsessTaskData;
67
import no.nav.k9.prosesstask.api.ProsessTaskHandler;
@@ -18,6 +19,7 @@ public AvbrytEtterlysningTask() {
1819
// CDI
1920
}
2021

22+
@Inject
2123
public AvbrytEtterlysningTask(EtterlysningProssesseringTjeneste etterlysningProssesseringTjeneste) {
2224
this.etterlysningProssesseringTjeneste = etterlysningProssesseringTjeneste;
2325
}

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,18 @@ public class EtterlysningProssesseringTjeneste {
1414

1515
private EtterlysningRepository etterlysningRepository;
1616
private InntektkontrollEtterlysningHåndterer inntektkontrollEtterlysningOppretter;
17+
private UngOppgaveKlient oppgaveKlient;
1718

1819
public EtterlysningProssesseringTjeneste() {
1920
// CDI
2021
}
2122

2223
@Inject
2324
public EtterlysningProssesseringTjeneste(EtterlysningRepository etterlysningRepository,
24-
InntektkontrollEtterlysningHåndterer inntektkontrollEtterlysningOppretter) {
25+
InntektkontrollEtterlysningHåndterer inntektkontrollEtterlysningOppretter, UngOppgaveKlient oppgaveKlient) {
2526
this.etterlysningRepository = etterlysningRepository;
2627
this.inntektkontrollEtterlysningOppretter = inntektkontrollEtterlysningOppretter;
28+
this.oppgaveKlient = oppgaveKlient;
2729
}
2830

2931
public void settTilUtløpt(Long behandlingId) {
@@ -38,6 +40,8 @@ public void settTilAvbrutt(Long behandlingId) {
3840
final var etterlysninger = etterlysningRepository.hentEtterlysningerSomSkalAvbrytes(behandlingId);
3941
// Kall oppgave API
4042

43+
etterlysninger.forEach(e -> oppgaveKlient.avbrytOppgave(e.getEksternReferanse()));
44+
4145
etterlysninger.forEach(Etterlysning::avbryt);
4246
etterlysningRepository.lagre(etterlysninger);
4347
}

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

+12
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,31 @@
99

1010
import java.net.URI;
1111
import java.net.URISyntaxException;
12+
import java.util.UUID;
1213

1314
@Dependent
1415
@ScopedRestIntegration(scopeKey = "ungdomsprogramregister.scope", defaultScope = "api://prod-gcp.k9saksbehandling.ung-deltakelse-opplyser/.default")
1516
public class UngOppgaveKlient {
1617
private final OidcRestClient restClient;
1718
private final URI opprettURI;
19+
private final URI avbrytURI;
1820

1921
@Inject
2022
public UngOppgaveKlient(
2123
OidcRestClient restClient,
2224
@KonfigVerdi(value = "ungdomsprogramregister.url", defaultVerdi = "http://ung-deltakelse-opplyser.k9saksbehandling") String url) {
2325
this.restClient = restClient;
2426
opprettURI = tilUri(url, "oppgave/opprett");
27+
avbrytURI = tilUri(url, "oppgave/avbryt");
28+
29+
}
30+
31+
public void avbrytOppgave(UUID eksternRef) {
32+
try {
33+
restClient.post(avbrytURI, eksternRef);
34+
} catch (Exception e) {
35+
throw UngOppgavetjenesteFeil.FACTORY.feilVedKallTilUngOppgaveTjeneste(e).toException();
36+
}
2537

2638
}
2739

0 commit comments

Comments
 (0)