Skip to content

Commit 1293460

Browse files
authored
TSFF-1230: Legg til batchprosess for automatisk å sette etterlysning til utløpt (#251)
* TSFF-1230: Legg til batchprosess for automatisk å sette etterlysninger til utløpt * TSFF-1230: Fjerner prosesstasktjeneste
1 parent aca39f5 commit 1293460

File tree

13 files changed

+232
-52
lines changed

13 files changed

+232
-52
lines changed

behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/behandling/repository/BehandlingKandidaterRepository.java

+21
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import jakarta.persistence.EntityManager;
1212
import jakarta.persistence.TypedQuery;
1313

14+
import no.nav.ung.kodeverk.etterlysning.EtterlysningStatus;
15+
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
1416
import org.hibernate.jpa.QueryHints;
1517

1618
import no.nav.ung.kodeverk.behandling.BehandlingStatus;
@@ -100,4 +102,23 @@ public List<Behandling> finnBehandlingerForAutomatiskGjenopptagelse() {
100102
.setHint(QueryHints.HINT_READONLY, "true");
101103
return query.getResultList();
102104
}
105+
106+
public List<Behandling> finnBehandlingerForUtløptEtterlysning() {
107+
LocalDateTime naa = LocalDateTime.now();
108+
109+
String sql = " SELECT DISTINCT b.* " +
110+
" FROM etterlysning e " +
111+
" INNER JOIN behandling b on b.id=ap.behandling_id " +
112+
" INNER JOIN fagsak f on f.id=b.fagsak_id" +
113+
" WHERE e.status = :status " +
114+
" AND f.ytelse_type != 'OBSOLETE'" +
115+
" AND e.frist < :naa ";
116+
var query = getEntityManager().createNativeQuery(sql, Behandling.class)
117+
.setHint(QueryHints.HINT_READONLY, "true")
118+
.setParameter("status", EtterlysningStatus.VENTER)
119+
.setParameter("naa", naa);
120+
121+
return query.getResultList();
122+
}
123+
103124
}

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

+21-16
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
11
package no.nav.ung.sak.behandlingslager.etterlysning;
22

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;
3+
import jakarta.persistence.*;
184
import no.nav.ung.kodeverk.etterlysning.EtterlysningStatus;
195
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
206
import no.nav.ung.sak.behandlingslager.BaseEntitet;
217
import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet;
8+
import org.hibernate.annotations.Immutable;
9+
10+
import java.time.LocalDateTime;
11+
import java.util.UUID;
2212

2313
@Entity(name = "Etterlysning")
2414
@Table(name = "ETTERLYSNING")
@@ -107,6 +97,14 @@ public EtterlysningStatus getStatus() {
10797
return status;
10898
}
10999

100+
public Long getBehandlingId() {
101+
return behandlingId;
102+
}
103+
104+
public LocalDateTime getFrist() {
105+
return frist;
106+
}
107+
110108
public void vent(LocalDateTime frist) {
111109
if (status != EtterlysningStatus.OPPRETTET) {
112110
throw new IllegalStateException("Kan vente på etterlysning som ikke er satt til OPPRETTET. Status er " + status);
@@ -123,12 +121,19 @@ public void avbryt() {
123121
this.frist = null;
124122
}
125123

126-
127124
public void skalAvbrytes() {
128125
if (status == EtterlysningStatus.MOTTATT_SVAR) {
129126
throw new IllegalStateException("Kan ikke avbryte etterlysning som er mottatt.");
130127
}
131128
this.status = EtterlysningStatus.SKAL_AVBRYTES;
132129
}
133130

131+
public void utløpt() {
132+
if (status != EtterlysningStatus.VENTER) {
133+
throw new IllegalStateException("Kan ikke avbryte etterlysning dersom status ikke er VENTER. Status var " + status);
134+
}
135+
this.status = EtterlysningStatus.UTLØPT;
136+
}
137+
138+
134139
}

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

+12
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import no.nav.ung.kodeverk.etterlysning.EtterlysningStatus;
77
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
88

9+
import java.time.LocalDateTime;
910
import java.util.List;
1011

1112
@ApplicationScoped
@@ -70,4 +71,15 @@ public List<Etterlysning> hentEtterlysningerSomSkalAvbrytes(Long behandlingId) {
7071
}
7172

7273

74+
public List<Etterlysning> hentUtløpteEtterlysningerSomVenterPåSvar(Long behandlingId) {
75+
final var etterlysninger = entityManager.createQuery("select e from Etterlysning e " +
76+
"where e.behandlingId = :behandlingId and e.type = :type and status = :status AND frist < :naa", Etterlysning.class)
77+
.setParameter("status", EtterlysningStatus.VENTER)
78+
.setParameter("behandlingId", behandlingId)
79+
.setParameter("naa", LocalDateTime.now())
80+
.getResultList();
81+
return etterlysninger;
82+
}
83+
84+
7385
}

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

+3-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ public class KontrollerInntektSteg implements BehandlingSteg {
5050
private InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste;
5151
private ProsessTaskTjeneste prosessTaskTjeneste;
5252

53-
5453
@Inject
5554
public KontrollerInntektSteg(ProsessTriggerPeriodeUtleder prosessTriggerPeriodeUtleder,
5655
RapportertInntektMapper rapportertInntektMapper,
@@ -76,6 +75,9 @@ public KontrollerInntektSteg() {
7675
@Override
7776
public BehandleStegResultat utførSteg(BehandlingskontrollKontekst kontekst) {
7877
Long behandlingId = kontekst.getBehandlingId();
78+
79+
80+
7981
var rapporterteInntekterTidslinje = rapportertInntektMapper.mapAlleGjeldendeRegisterOgBrukersInntekter(behandlingId);
8082
var prosessTriggerTidslinje = prosessTriggerPeriodeUtleder.utledTidslinje(behandlingId);
8183
var uttalelser = registerinntektUttalelseTjeneste.hentUttalelser(behandlingId);

domenetjenester/etterlysning/pom.xml

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
<groupId>no.nav.ung.sak</groupId>
4040
<artifactId>arbeidsforhold</artifactId>
4141
</dependency>
42+
4243
</dependencies>
4344

4445
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package no.nav.ung.sak.etterlysning;
2+
3+
import jakarta.enterprise.context.ApplicationScoped;
4+
import no.nav.k9.prosesstask.api.ProsessTask;
5+
import no.nav.k9.prosesstask.api.ProsessTaskData;
6+
import no.nav.k9.prosesstask.api.ProsessTaskHandler;
7+
8+
/**
9+
* Batchservice som finner alle etterlysninger som skal settes til utløpt, og setter alle til utløpt og kaller oppgave API for å avbryte tilhørende oppgave.
10+
*/
11+
@ApplicationScoped
12+
@ProsessTask(value = AutomatiskSettEtterlysningerUtløptBatchTask.TASKTYPE, cronExpression = "0 5 7 * * *")
13+
public class AutomatiskSettEtterlysningerUtløptBatchTask implements ProsessTaskHandler {
14+
15+
public static final String TASKTYPE = "batch.automatiskSettEtterlysningUtlopt";
16+
private AutomatiskUtløptEtterlysningTjeneste automatiskUtløptEtterlysningTjeneste;
17+
18+
public AutomatiskSettEtterlysningerUtløptBatchTask() {
19+
// CDI
20+
}
21+
22+
public AutomatiskSettEtterlysningerUtløptBatchTask(AutomatiskUtløptEtterlysningTjeneste automatiskUtløptEtterlysningTjeneste) {
23+
this.automatiskUtløptEtterlysningTjeneste = automatiskUtløptEtterlysningTjeneste;
24+
}
25+
26+
@Override
27+
public void doTask(ProsessTaskData prosessTaskData) {
28+
automatiskUtløptEtterlysningTjeneste.settEtterlysningerUtløpt();
29+
}
30+
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package no.nav.ung.sak.etterlysning;
2+
3+
import jakarta.enterprise.context.Dependent;
4+
import jakarta.inject.Inject;
5+
import no.nav.k9.prosesstask.api.ProsessTaskData;
6+
import no.nav.k9.prosesstask.api.ProsessTaskTjeneste;
7+
import no.nav.ung.sak.behandlingslager.behandling.Behandling;
8+
import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingKandidaterRepository;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
import java.util.List;
13+
14+
@Dependent
15+
public class AutomatiskUtløptEtterlysningTjeneste {
16+
17+
private static final Logger logger = LoggerFactory.getLogger(AutomatiskUtløptEtterlysningTjeneste.class);
18+
19+
20+
private BehandlingKandidaterRepository behandlingKandidaterRepository;
21+
private ProsessTaskTjeneste prosessTaskTjeneste;
22+
23+
24+
@Inject
25+
public AutomatiskUtløptEtterlysningTjeneste(BehandlingKandidaterRepository behandlingKandidaterRepository, ProsessTaskTjeneste prosessTaskTjeneste) {
26+
this.behandlingKandidaterRepository = behandlingKandidaterRepository;
27+
this.prosessTaskTjeneste = prosessTaskTjeneste;
28+
}
29+
30+
public void settEtterlysningerUtløpt() {
31+
32+
List<Behandling> behandlingListe = behandlingKandidaterRepository.finnBehandlingerForUtløptEtterlysning();
33+
34+
for (Behandling behandling : behandlingListe) {
35+
try {
36+
opprettProsessTask(behandling);
37+
} catch (Exception e) {
38+
logger.warn("Feil ved forsøk på sette etterlysninger til utløpt for behandling {}", behandling, e);
39+
}
40+
}
41+
}
42+
43+
private void opprettProsessTask(Behandling behandling) {
44+
var prosessTaskData = ProsessTaskData.forProsessTask(SettEtterlysningTilUtløptTask.class);
45+
prosessTaskData.setBehandling(behandling.getFagsakId(), behandling.getId());
46+
prosessTaskTjeneste.lagre(prosessTaskData);
47+
}
48+
}

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

+4-11
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
import no.nav.k9.prosesstask.api.ProsessTask;
55
import no.nav.k9.prosesstask.api.ProsessTaskData;
66
import no.nav.k9.prosesstask.api.ProsessTaskHandler;
7-
import no.nav.ung.sak.behandlingslager.etterlysning.Etterlysning;
8-
import no.nav.ung.sak.behandlingslager.etterlysning.EtterlysningRepository;
97
import no.nav.ung.sak.behandlingslager.fagsak.FagsakProsesstaskRekkefølge;
108

119
@ApplicationScoped
@@ -14,24 +12,19 @@
1412
public class AvbrytEtterlysningTask implements ProsessTaskHandler {
1513

1614
public static final String TASKTYPE = "etterlysning.avbryt";
17-
private EtterlysningRepository etterlysningRepository;
15+
private EtterlysningProssesseringTjeneste etterlysningProssesseringTjeneste;
1816

1917
public AvbrytEtterlysningTask() {
2018
// CDI
2119
}
2220

23-
public AvbrytEtterlysningTask(EtterlysningRepository etterlysningRepository) {
24-
this.etterlysningRepository = etterlysningRepository;
21+
public AvbrytEtterlysningTask(EtterlysningProssesseringTjeneste etterlysningProssesseringTjeneste) {
22+
this.etterlysningProssesseringTjeneste = etterlysningProssesseringTjeneste;
2523
}
2624

2725
@Override
2826
public void doTask(ProsessTaskData prosessTaskData) {
29-
final var behandlingId = prosessTaskData.getBehandlingId();
30-
final var etterlysninger = etterlysningRepository.hentEtterlysningerSomSkalAvbrytes(Long.parseLong(behandlingId));
31-
// Kall oppgave API
32-
33-
etterlysninger.forEach(Etterlysning::avbryt);
34-
etterlysningRepository.lagre(etterlysninger);
27+
etterlysningProssesseringTjeneste.settTilAvbrutt(Long.parseLong(prosessTaskData.getBehandlingId()));
3528
}
3629

3730
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package no.nav.ung.sak.etterlysning;
22

33
public interface EtterlysningHåndterer {
4-
5-
6-
7-
8-
9-
void hånterEtterlysning(long behandlingId);
4+
void håndterOpprettelse(long behandlingId);
105
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package no.nav.ung.sak.etterlysning;
2+
3+
import jakarta.enterprise.context.ApplicationScoped;
4+
import jakarta.inject.Inject;
5+
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
6+
import no.nav.ung.sak.behandlingslager.etterlysning.Etterlysning;
7+
import no.nav.ung.sak.behandlingslager.etterlysning.EtterlysningRepository;
8+
9+
import java.util.Objects;
10+
11+
@ApplicationScoped
12+
public class EtterlysningProssesseringTjeneste {
13+
14+
private EtterlysningRepository etterlysningRepository;
15+
private InntektkontrollEtterlysningHåndterer inntektkontrollEtterlysningOppretter;
16+
17+
public EtterlysningProssesseringTjeneste() {
18+
// CDI
19+
}
20+
21+
@Inject
22+
public EtterlysningProssesseringTjeneste(EtterlysningRepository etterlysningRepository,
23+
InntektkontrollEtterlysningHåndterer inntektkontrollEtterlysningOppretter) {
24+
this.etterlysningRepository = etterlysningRepository;
25+
this.inntektkontrollEtterlysningOppretter = inntektkontrollEtterlysningOppretter;
26+
}
27+
28+
public void settTilUtløpt(Long behandlingId) {
29+
final var etterlysninger = etterlysningRepository.hentUtløpteEtterlysningerSomVenterPåSvar(behandlingId);
30+
// Kall oppgave API
31+
32+
etterlysninger.forEach(Etterlysning::utløpt);
33+
etterlysningRepository.lagre(etterlysninger);
34+
}
35+
36+
public void settTilAvbrutt(Long behandlingId) {
37+
final var etterlysninger = etterlysningRepository.hentEtterlysningerSomSkalAvbrytes(behandlingId);
38+
// Kall oppgave API
39+
40+
etterlysninger.forEach(Etterlysning::avbryt);
41+
etterlysningRepository.lagre(etterlysninger);
42+
}
43+
44+
public void opprett(Long behandlingId, EtterlysningType etterlysningType) {
45+
if (Objects.requireNonNull(etterlysningType) == EtterlysningType.UTTALELSE_KONTROLL_INNTEKT) {
46+
inntektkontrollEtterlysningOppretter.håndterOpprettelse(behandlingId);
47+
} else {
48+
throw new IllegalArgumentException("Ukjent etterlysningstype: " + etterlysningType);
49+
}
50+
}
51+
52+
53+
}

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

+1-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22

33
import jakarta.enterprise.context.Dependent;
44
import jakarta.inject.Inject;
5-
import no.nav.ung.kodeverk.etterlysning.EtterlysningStatus;
65
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
76
import no.nav.ung.sak.behandlingslager.etterlysning.EtterlysningRepository;
8-
import no.nav.ung.sak.domene.arbeidsforhold.InntektArbeidYtelseTjeneste;
97

108
import java.time.LocalDateTime;
119

@@ -20,8 +18,7 @@ public class InntektkontrollEtterlysningHåndterer implements EtterlysningHåndt
2018
this.etterlysningRepository = etterlysningRepository;
2119
}
2220

23-
@Override
24-
public void hånterEtterlysning(long behandlingId) {
21+
public void håndterOpprettelse(long behandlingId) {
2522
final var etterlysninger = etterlysningRepository.hentOpprettetEtterlysninger(behandlingId, EtterlysningType.UTTALELSE_KONTROLL_INNTEKT);
2623
// Kall oppgave API
2724
etterlysninger.forEach(e -> e.vent(LocalDateTime.now().plusDays(14)));

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

+4-14
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,21 @@ public class OpprettEtterlysningTask implements ProsessTaskHandler {
1515

1616
public static final String TASKTYPE = "etterlysning.opprett";
1717
public static final String ETTERLYSNING_TYPE = "type";
18-
19-
private InntektkontrollEtterlysningHåndterer inntektkontrollEtterlysningOppretter;
18+
private EtterlysningProssesseringTjeneste etterlysningProssesseringTjeneste;
2019

2120
public OpprettEtterlysningTask() {
2221
// CDI
2322
}
2423

2524
@Inject
26-
public OpprettEtterlysningTask(InntektkontrollEtterlysningHåndterer inntektkontrollEtterlysningOppretter) {
27-
this.inntektkontrollEtterlysningOppretter = inntektkontrollEtterlysningOppretter;
25+
public OpprettEtterlysningTask(EtterlysningProssesseringTjeneste etterlysningProssesseringTjeneste) {
26+
this.etterlysningProssesseringTjeneste = etterlysningProssesseringTjeneste;
2827
}
2928

3029
@Override
3130
public void doTask(ProsessTaskData prosessTaskData) {
3231
final var behandlingId = prosessTaskData.getBehandlingId();
3332
final var etterlysningType = EtterlysningType.fraKode(prosessTaskData.getPropertyValue(ETTERLYSNING_TYPE));
34-
switch (etterlysningType) {
35-
case EtterlysningType.UTTALELSE_KONTROLL_INNTEKT:
36-
inntektkontrollEtterlysningOppretter.hånterEtterlysning(Long.parseLong(behandlingId));
37-
break;
38-
default:
39-
throw new IllegalArgumentException("Ukjent etterlysningstype: " + etterlysningType);
40-
}
41-
42-
43-
33+
etterlysningProssesseringTjeneste.opprett(Long.parseLong(behandlingId), etterlysningType);
4434
}
4535
}

0 commit comments

Comments
 (0)