Skip to content

Commit 6b9ddb1

Browse files
TSFF-1196 Bruke a-ordningen (#236)
* starte på batch task * Startet på batch task for å opprette revurdering for inntektskontroll * Changes by Espen.Velsvik * ung-sak.openapi.json updated by build pipeline skip-checks:true --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent 01d9b55 commit 6b9ddb1

File tree

6 files changed

+203
-9
lines changed

6 files changed

+203
-9
lines changed

behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/fagsak/FagsakRepository.java

+15
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,21 @@ public Optional<Fagsak> finnUnikFagsak(long fagsakId) {
6363
return opt;
6464
}
6565

66+
public List<Fagsak> hentAlleFagsakerSomOverlapper(LocalDate fom, LocalDate tom) {
67+
Objects.requireNonNull(fom, "fom");
68+
Objects.requireNonNull(tom, "tom");
69+
String sqlString = """
70+
select f.* from Fagsak f
71+
where f.periode && daterange(cast(:fom as date), cast(:tom as date), '[]') = true
72+
""";
73+
74+
Query query = entityManager.createNativeQuery(sqlString, Fagsak.class); // NOSONAR
75+
query.setParameter("fom", fom);
76+
query.setParameter("tom", tom);
77+
78+
return query.getResultList();
79+
}
80+
6681
// TODO: Burde kanskje ekskludere OBSOLETE her?
6782
public List<Fagsak> hentForBruker(AktørId aktørId) {
6883
TypedQuery<Fagsak> query = entityManager

behandlingslager/domene/src/main/java/no/nav/ung/sak/behandlingslager/ytelse/UngdomsytelseGrunnlag.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public LocalDateTimeline<UngdomsytelseSatser> getSatsTidslinje() {
6565
return new LocalDateTimeline<>(segmenter);
6666
}
6767

68-
public LocalDateTimeline<UngdomsytelseUttak> getUtbetalingsgradTidslinje() {
68+
public LocalDateTimeline<UngdomsytelseUttak> getAvslagstidslinjeFraUttak() {
6969
var segmenter = uttakPerioder.getPerioder().stream().map(p ->
7070
new LocalDateSegment<>(p.getPeriode().getFomDato(), p.getPeriode().getTomDato(), new UngdomsytelseUttak(p.getAvslagsårsak())
7171
)).toList();

domenetjenester/behandling-revurdering/src/main/java/no/nav/ung/sak/behandling/revurdering/OpprettRevurderingEllerOpprettDiffTask.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111

1212
import jakarta.enterprise.context.ApplicationScoped;
1313
import jakarta.inject.Inject;
14-
import no.nav.ung.kodeverk.behandling.BehandlingÅrsakType;
1514
import no.nav.k9.prosesstask.api.ProsessTask;
1615
import no.nav.k9.prosesstask.api.ProsessTaskData;
16+
import no.nav.ung.kodeverk.behandling.BehandlingÅrsakType;
1717
import no.nav.ung.sak.behandling.prosessering.BehandlingProsesseringTjeneste;
1818
import no.nav.ung.sak.behandling.prosessering.BehandlingsprosessApplikasjonTjeneste;
1919
import no.nav.ung.sak.behandlingskontroll.FagsakYtelseTypeRef;
@@ -105,7 +105,7 @@ protected void prosesser(ProsessTaskData prosessTaskData) {
105105
var behandling = behandlingRepository.hentBehandling(behandlingId);
106106
BehandlingÅrsak.builder(behandlingÅrsakType).buildFor(behandling);
107107
behandlingRepository.lagre(behandling, behandlingLås);
108-
var skalTvingeRegisterinnhenting = Set.of(BehandlingÅrsakType.RE_HENDELSE_DØD_BARN, BehandlingÅrsakType.RE_HENDELSE_DØD_FORELDER, BehandlingÅrsakType.RE_KLAGE_NY_INNH_LIGNET_INNTEKT).contains(behandlingÅrsakType);
108+
var skalTvingeRegisterinnhenting = Set.of(BehandlingÅrsakType.RE_HENDELSE_DØD_FORELDER, BehandlingÅrsakType.RE_HENDELSE_DØD_BARN, BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT).contains(behandlingÅrsakType);
109109

110110
behandlingProsesseringTjeneste.opprettTasksForGjenopptaOppdaterFortsett(behandling, false, skalTvingeRegisterinnhenting);
111111

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
package no.nav.ung.sak.behandling.revurdering.inntektskontroll;
2+
3+
import static no.nav.ung.kodeverk.behandling.BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT;
4+
import static no.nav.ung.sak.behandling.revurdering.OpprettRevurderingEllerOpprettDiffTask.BEHANDLING_ÅRSAK;
5+
import static no.nav.ung.sak.behandling.revurdering.OpprettRevurderingEllerOpprettDiffTask.PERIODER;
6+
7+
import java.time.LocalDate;
8+
import java.time.temporal.TemporalAdjusters;
9+
import java.util.Comparator;
10+
import java.util.List;
11+
import java.util.Optional;
12+
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
15+
16+
import jakarta.enterprise.context.ApplicationScoped;
17+
import jakarta.inject.Inject;
18+
import no.nav.fpsak.tidsserie.LocalDateInterval;
19+
import no.nav.fpsak.tidsserie.LocalDateTimeline;
20+
import no.nav.k9.prosesstask.api.ProsessTask;
21+
import no.nav.k9.prosesstask.api.ProsessTaskData;
22+
import no.nav.k9.prosesstask.api.ProsessTaskGruppe;
23+
import no.nav.k9.prosesstask.api.ProsessTaskHandler;
24+
import no.nav.k9.prosesstask.api.ProsessTaskTjeneste;
25+
import no.nav.ung.kodeverk.behandling.BehandlingÅrsakType;
26+
import no.nav.ung.kodeverk.vilkår.Utfall;
27+
import no.nav.ung.sak.behandling.revurdering.OpprettRevurderingEllerOpprettDiffTask;
28+
import no.nav.ung.sak.behandlingslager.behandling.Behandling;
29+
import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingRepository;
30+
import no.nav.ung.sak.behandlingslager.fagsak.Fagsak;
31+
import no.nav.ung.sak.behandlingslager.fagsak.FagsakRepository;
32+
import no.nav.ung.sak.behandlingslager.perioder.UngdomsprogramPeriodeRepository;
33+
import no.nav.ung.sak.behandlingslager.ytelse.UngdomsytelseGrunnlagRepository;
34+
import no.nav.ung.sak.kontrakt.vilkår.VilkårUtfallSamlet;
35+
import no.nav.ung.sak.trigger.ProsessTriggereRepository;
36+
import no.nav.ung.sak.vilkår.VilkårTjeneste;
37+
38+
39+
/**
40+
* Batchtask som starter kontroll av inntekt fra a-inntekt
41+
* <p>
42+
* Kjører hver dag kl 07:15.
43+
*/
44+
@ApplicationScoped
45+
@ProsessTask(value = OpprettRevurderingForInntektskontrollBatchTask.TASKNAME, cronExpression = "0 7 7 * *", maxFailedRuns = 1)
46+
public class OpprettRevurderingForInntektskontrollBatchTask implements ProsessTaskHandler {
47+
48+
public static final String TASKNAME = "batch.opprettRevurderingForInntektskontrollBatch";
49+
50+
private static final Logger log = LoggerFactory.getLogger(OpprettRevurderingForInntektskontrollBatchTask.class);
51+
52+
private ProsessTaskTjeneste prosessTaskTjeneste;
53+
private FagsakRepository fagsakRepository;
54+
private BehandlingRepository behandlingRepository;
55+
private UngdomsprogramPeriodeRepository ungdomsprogramPeriodeRepository;
56+
private ProsessTriggereRepository prosessTriggereRepository;
57+
private VilkårTjeneste vilkårTjeneste;
58+
private UngdomsytelseGrunnlagRepository ungdomsytelseGrunnlagRepository;
59+
60+
OpprettRevurderingForInntektskontrollBatchTask() {
61+
}
62+
63+
@Inject
64+
public OpprettRevurderingForInntektskontrollBatchTask(ProsessTaskTjeneste prosessTaskTjeneste,
65+
BehandlingRepository behandlingRepository,
66+
FagsakRepository fagsakRepository,
67+
UngdomsprogramPeriodeRepository ungdomsprogramPeriodeRepository,
68+
ProsessTriggereRepository prosessTriggereRepository,
69+
VilkårTjeneste vilkårTjeneste,
70+
UngdomsytelseGrunnlagRepository ungdomsytelseGrunnlagRepository) {
71+
this.prosessTaskTjeneste = prosessTaskTjeneste;
72+
this.fagsakRepository = fagsakRepository;
73+
this.behandlingRepository = behandlingRepository;
74+
this.ungdomsprogramPeriodeRepository = ungdomsprogramPeriodeRepository;
75+
this.prosessTriggereRepository = prosessTriggereRepository;
76+
this.vilkårTjeneste = vilkårTjeneste;
77+
this.ungdomsytelseGrunnlagRepository = ungdomsytelseGrunnlagRepository;
78+
}
79+
80+
81+
@Override
82+
public void doTask(ProsessTaskData prosessTaskData) {
83+
var fom = LocalDate.now().minusMonths(1).withDayOfMonth(1);
84+
var tom = LocalDate.now().minusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
85+
var fagsaker = fagsakRepository.hentAlleFagsakerSomOverlapper(fom, tom);
86+
87+
var behandlinger = fagsaker.stream().map(Fagsak::getId).map(fagsakId -> {
88+
var avsluttetBehandling = behandlingRepository.finnSisteAvsluttedeIkkeHenlagteBehandling(fagsakId);
89+
if (avsluttetBehandling.isPresent()) {
90+
return avsluttetBehandling;
91+
}
92+
return behandlingRepository.hentSisteYtelsesBehandlingForFagsakId(fagsakId);
93+
}).flatMap(Optional::stream).toList();
94+
95+
/* Filtrere ut behandlinger som skal ha inntektskontroll:
96+
- Har ikke allerede opprettet trigger for inntektskontroll
97+
- Har programdeltagelse og den startet ikke forrige måned. Og slutter ikke i inneværende måned
98+
- Har ikke avslåtte vilkår, men kan ha vilkår som er til vurdering
99+
- Har ikke avslått uttak, men kan ha uttak som er til vurdering
100+
*/
101+
var behandlingerTilKontroll = behandlinger.stream()
102+
.filter(behandling -> harIkkeOpprettetTrigger(behandling, fom, tom))
103+
.filter(behandling -> harProgramdeltagelseSomGirInntektskontroll(behandling, fom, tom))
104+
.filter(behandling -> harIkkeAvslåtteVilkår(behandling, fom, tom))
105+
.filter(behandling -> harIkkeAvslåttUttak(behandling, fom, tom))
106+
.toList();
107+
108+
log.info("Fant følgende saker til kontroll av inntekt: ", behandlinger.stream().map(Behandling::getFagsak).map(Fagsak::getSaksnummer).toList());
109+
110+
// TODO: Legg inn dette når resten er klart (vi vil ikkje kjøre i Q før vi kan teste det skikkelig i Q)
111+
// opprettProsessTask(behandlingerTilKontroll, fom, tom);
112+
}
113+
114+
private void opprettProsessTask(List<Behandling> behandlingerTilKontroll, LocalDate fom, LocalDate tom) {
115+
ProsessTaskGruppe taskGruppeTilRevurderinger = new ProsessTaskGruppe();
116+
117+
var revurderTasker = behandlingerTilKontroll
118+
.stream()
119+
.map(behandling -> {
120+
var fagsakId = behandling.getFagsakId();
121+
log.info("Oppretter revurdering for fagsak med id {}", fagsakId);
122+
123+
ProsessTaskData tilVurderingTask = ProsessTaskData.forProsessTask(OpprettRevurderingEllerOpprettDiffTask.class);
124+
tilVurderingTask.setFagsakId(fagsakId);
125+
tilVurderingTask.setProperty(PERIODER, fom + "/" + tom);
126+
tilVurderingTask.setProperty(BEHANDLING_ÅRSAK, BehandlingÅrsakType.RE_KONTROLL_REGISTER_INNTEKT.getKode());
127+
return tilVurderingTask;
128+
}).toList();
129+
130+
taskGruppeTilRevurderinger.addNesteParallell(revurderTasker);
131+
prosessTaskTjeneste.lagre(taskGruppeTilRevurderinger);
132+
}
133+
134+
private boolean harIkkeAvslåttUttak(Behandling behandling, LocalDate fom, LocalDate tom) {
135+
var ungdomsytelseGrunnlag = ungdomsytelseGrunnlagRepository.hentGrunnlag(behandling.getId());
136+
if (ungdomsytelseGrunnlag.isEmpty()) {
137+
// Hvis ikke vurdert uttak
138+
return true;
139+
}
140+
return ungdomsytelseGrunnlag.get().getAvslagstidslinjeFraUttak().intersection(new LocalDateInterval(fom, tom)).isEmpty();
141+
}
142+
143+
private boolean harIkkeAvslåtteVilkår(Behandling behandling, LocalDate fom, LocalDate tom) {
144+
var samletResultat = vilkårTjeneste.samletVilkårsresultat(behandling.getId()).intersection(new LocalDateInterval(fom, tom));
145+
var harVilkårSomIkkeErVurdert = samletResultat.toSegments().stream().anyMatch(segment -> segment.getValue().getSamletUtfall().equals(Utfall.IKKE_VURDERT));
146+
if (samletResultat.isEmpty() || harVilkårSomIkkeErVurdert) {
147+
//førstegangsbehandling som ikke har fått behandlet vilkår
148+
return true;
149+
}
150+
return erInnvilget(samletResultat);
151+
}
152+
153+
private static boolean erInnvilget(LocalDateTimeline<VilkårUtfallSamlet> samletResultat) {
154+
return samletResultat.toSegments().stream().noneMatch(segment -> segment.getValue().getSamletUtfall().equals(Utfall.IKKE_OPPFYLT));
155+
}
156+
157+
// Inntektsrapportering gjelder bare fra måned nr 2 og inkluderer ikke evt. opphørsmåned
158+
private boolean harProgramdeltagelseSomGirInntektskontroll(Behandling behandling, LocalDate fom, LocalDate tom) {
159+
var ungdomsprogramPeriodeGrunnlag = ungdomsprogramPeriodeRepository.hentGrunnlag(behandling.getId());
160+
if (ungdomsprogramPeriodeGrunnlag.isEmpty()) {
161+
return false;
162+
}
163+
164+
var perioder = ungdomsprogramPeriodeGrunnlag.get().getUngdomsprogramPerioder().getPerioder();
165+
if (perioder.isEmpty()) {
166+
return false;
167+
}
168+
var startdato = perioder.stream().map(p -> p.getPeriode().getFomDato()).min(Comparator.naturalOrder()).orElseThrow();
169+
var sluttdato = perioder.stream().map(p -> p.getPeriode().getTomDato()).max(Comparator.naturalOrder()).orElseThrow();
170+
return startdato.isBefore(fom) && sluttdato.isAfter(tom);
171+
}
172+
173+
private boolean harIkkeOpprettetTrigger(Behandling behandling, LocalDate fom, LocalDate tom) {
174+
return prosessTriggereRepository.hentGrunnlag(behandling.getId()).stream().flatMap(it -> it.getTriggere().stream()).noneMatch(it -> it.getÅrsak().equals(RE_KONTROLL_REGISTER_INNTEKT) && it.getPeriode().overlapper(fom, tom));
175+
}
176+
177+
178+
}

kodeverk/src/main/java/no/nav/ung/kodeverk/behandling/BehandlingÅrsakType.java

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ public enum BehandlingÅrsakType implements Kodeverdi {
8989

9090
// Innrapportering av inntekt
9191
RE_RAPPORTERING_INNTEKT("RE-RAPPORTERING-INNTEKT", "Rapportering av inntekt"),
92+
RE_KONTROLL_REGISTER_INNTEKT("RE-KONTROLL-REGISTER-INNTEKT", "Kontroll av registerinntekt"),
9293

9394

9495
UDEFINERT("-", "Ikke definert"),

0 commit comments

Comments
 (0)