Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TSFF-1230: Legg til batchprosess for automatisk å sette etterlysning til utløpt #251

Merged
merged 2 commits into from
Mar 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;

import no.nav.ung.kodeverk.etterlysning.EtterlysningStatus;
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
import org.hibernate.jpa.QueryHints;

import no.nav.ung.kodeverk.behandling.BehandlingStatus;
Expand Down Expand Up @@ -100,4 +102,23 @@ public List<Behandling> finnBehandlingerForAutomatiskGjenopptagelse() {
.setHint(QueryHints.HINT_READONLY, "true");
return query.getResultList();
}

public List<Behandling> finnBehandlingerForUtløptEtterlysning() {
LocalDateTime naa = LocalDateTime.now();

String sql = " SELECT DISTINCT b.* " +
" FROM etterlysning e " +
" INNER JOIN behandling b on b.id=ap.behandling_id " +
" INNER JOIN fagsak f on f.id=b.fagsak_id" +
" WHERE e.status = :status " +
" AND f.ytelse_type != 'OBSOLETE'" +
" AND e.frist < :naa ";
var query = getEntityManager().createNativeQuery(sql, Behandling.class)
.setHint(QueryHints.HINT_READONLY, "true")
.setParameter("status", EtterlysningStatus.VENTER)
.setParameter("naa", naa);

return query.getResultList();
}

}
Original file line number Diff line number Diff line change
@@ -1,24 +1,14 @@
package no.nav.ung.sak.behandlingslager.etterlysning;

import java.time.LocalDateTime;
import java.util.UUID;

import no.nav.fpsak.tidsserie.LocalDateTimeline;
import org.hibernate.annotations.Immutable;

import jakarta.persistence.AttributeOverride;
import jakarta.persistence.AttributeOverrides;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.*;
import no.nav.ung.kodeverk.etterlysning.EtterlysningStatus;
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
import no.nav.ung.sak.behandlingslager.BaseEntitet;
import no.nav.ung.sak.domene.typer.tid.DatoIntervallEntitet;
import org.hibernate.annotations.Immutable;

import java.time.LocalDateTime;
import java.util.UUID;

@Entity(name = "Etterlysning")
@Table(name = "ETTERLYSNING")
Expand Down Expand Up @@ -107,6 +97,14 @@ public EtterlysningStatus getStatus() {
return status;
}

public Long getBehandlingId() {
return behandlingId;
}

public LocalDateTime getFrist() {
return frist;
}

public void vent(LocalDateTime frist) {
if (status != EtterlysningStatus.OPPRETTET) {
throw new IllegalStateException("Kan vente på etterlysning som ikke er satt til OPPRETTET. Status er " + status);
Expand All @@ -123,12 +121,19 @@ public void avbryt() {
this.frist = null;
}


public void skalAvbrytes() {
if (status == EtterlysningStatus.MOTTATT_SVAR) {
throw new IllegalStateException("Kan ikke avbryte etterlysning som er mottatt.");
}
this.status = EtterlysningStatus.SKAL_AVBRYTES;
}

public void utløpt() {
if (status != EtterlysningStatus.VENTER) {
throw new IllegalStateException("Kan ikke avbryte etterlysning dersom status ikke er VENTER. Status var " + status);
}
this.status = EtterlysningStatus.UTLØPT;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import no.nav.ung.kodeverk.etterlysning.EtterlysningStatus;
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;

import java.time.LocalDateTime;
import java.util.List;

@ApplicationScoped
Expand Down Expand Up @@ -70,4 +71,15 @@ public List<Etterlysning> hentEtterlysningerSomSkalAvbrytes(Long behandlingId) {
}


public List<Etterlysning> hentUtløpteEtterlysningerSomVenterPåSvar(Long behandlingId) {
final var etterlysninger = entityManager.createQuery("select e from Etterlysning e " +
"where e.behandlingId = :behandlingId and e.type = :type and status = :status AND frist < :naa", Etterlysning.class)
.setParameter("status", EtterlysningStatus.VENTER)
.setParameter("behandlingId", behandlingId)
.setParameter("naa", LocalDateTime.now())
.getResultList();
return etterlysninger;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ public class KontrollerInntektSteg implements BehandlingSteg {
private InntektArbeidYtelseTjeneste inntektArbeidYtelseTjeneste;
private ProsessTaskTjeneste prosessTaskTjeneste;


@Inject
public KontrollerInntektSteg(ProsessTriggerPeriodeUtleder prosessTriggerPeriodeUtleder,
RapportertInntektMapper rapportertInntektMapper,
Expand All @@ -76,6 +75,9 @@ public KontrollerInntektSteg() {
@Override
public BehandleStegResultat utførSteg(BehandlingskontrollKontekst kontekst) {
Long behandlingId = kontekst.getBehandlingId();



var rapporterteInntekterTidslinje = rapportertInntektMapper.mapAlleGjeldendeRegisterOgBrukersInntekter(behandlingId);
var prosessTriggerTidslinje = prosessTriggerPeriodeUtleder.utledTidslinje(behandlingId);
var uttalelser = registerinntektUttalelseTjeneste.hentUttalelser(behandlingId);
Expand Down
1 change: 1 addition & 0 deletions domenetjenester/etterlysning/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
<groupId>no.nav.ung.sak</groupId>
<artifactId>arbeidsforhold</artifactId>
</dependency>

</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package no.nav.ung.sak.etterlysning;

import jakarta.enterprise.context.ApplicationScoped;
import no.nav.k9.prosesstask.api.ProsessTask;
import no.nav.k9.prosesstask.api.ProsessTaskData;
import no.nav.k9.prosesstask.api.ProsessTaskHandler;

/**
* 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.
*/
@ApplicationScoped
@ProsessTask(value = AutomatiskSettEtterlysningerUtløptBatchTask.TASKTYPE, cronExpression = "0 5 7 * * *")
public class AutomatiskSettEtterlysningerUtløptBatchTask implements ProsessTaskHandler {

public static final String TASKTYPE = "batch.automatiskSettEtterlysningUtlopt";
private AutomatiskUtløptEtterlysningTjeneste automatiskUtløptEtterlysningTjeneste;

public AutomatiskSettEtterlysningerUtløptBatchTask() {
// CDI
}

public AutomatiskSettEtterlysningerUtløptBatchTask(AutomatiskUtløptEtterlysningTjeneste automatiskUtløptEtterlysningTjeneste) {
this.automatiskUtløptEtterlysningTjeneste = automatiskUtløptEtterlysningTjeneste;
}

@Override
public void doTask(ProsessTaskData prosessTaskData) {
automatiskUtløptEtterlysningTjeneste.settEtterlysningerUtløpt();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package no.nav.ung.sak.etterlysning;

import jakarta.enterprise.context.Dependent;
import jakarta.inject.Inject;
import no.nav.k9.prosesstask.api.ProsessTaskData;
import no.nav.k9.prosesstask.api.ProsessTaskTjeneste;
import no.nav.ung.sak.behandlingslager.behandling.Behandling;
import no.nav.ung.sak.behandlingslager.behandling.repository.BehandlingKandidaterRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

@Dependent
public class AutomatiskUtløptEtterlysningTjeneste {

private static final Logger logger = LoggerFactory.getLogger(AutomatiskUtløptEtterlysningTjeneste.class);


private BehandlingKandidaterRepository behandlingKandidaterRepository;
private ProsessTaskTjeneste prosessTaskTjeneste;


@Inject
public AutomatiskUtløptEtterlysningTjeneste(BehandlingKandidaterRepository behandlingKandidaterRepository, ProsessTaskTjeneste prosessTaskTjeneste) {
this.behandlingKandidaterRepository = behandlingKandidaterRepository;
this.prosessTaskTjeneste = prosessTaskTjeneste;
}

public void settEtterlysningerUtløpt() {

List<Behandling> behandlingListe = behandlingKandidaterRepository.finnBehandlingerForUtløptEtterlysning();

for (Behandling behandling : behandlingListe) {
try {
opprettProsessTask(behandling);
} catch (Exception e) {
logger.warn("Feil ved forsøk på sette etterlysninger til utløpt for behandling {}", behandling, e);
}
}
}

private void opprettProsessTask(Behandling behandling) {
var prosessTaskData = ProsessTaskData.forProsessTask(SettEtterlysningTilUtløptTask.class);
prosessTaskData.setBehandling(behandling.getFagsakId(), behandling.getId());
prosessTaskTjeneste.lagre(prosessTaskData);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@
import no.nav.k9.prosesstask.api.ProsessTask;
import no.nav.k9.prosesstask.api.ProsessTaskData;
import no.nav.k9.prosesstask.api.ProsessTaskHandler;
import no.nav.ung.sak.behandlingslager.etterlysning.Etterlysning;
import no.nav.ung.sak.behandlingslager.etterlysning.EtterlysningRepository;
import no.nav.ung.sak.behandlingslager.fagsak.FagsakProsesstaskRekkefølge;

@ApplicationScoped
Expand All @@ -14,24 +12,19 @@
public class AvbrytEtterlysningTask implements ProsessTaskHandler {

public static final String TASKTYPE = "etterlysning.avbryt";
private EtterlysningRepository etterlysningRepository;
private EtterlysningProssesseringTjeneste etterlysningProssesseringTjeneste;

public AvbrytEtterlysningTask() {
// CDI
}

public AvbrytEtterlysningTask(EtterlysningRepository etterlysningRepository) {
this.etterlysningRepository = etterlysningRepository;
public AvbrytEtterlysningTask(EtterlysningProssesseringTjeneste etterlysningProssesseringTjeneste) {
this.etterlysningProssesseringTjeneste = etterlysningProssesseringTjeneste;
}

@Override
public void doTask(ProsessTaskData prosessTaskData) {
final var behandlingId = prosessTaskData.getBehandlingId();
final var etterlysninger = etterlysningRepository.hentEtterlysningerSomSkalAvbrytes(Long.parseLong(behandlingId));
// Kall oppgave API

etterlysninger.forEach(Etterlysning::avbryt);
etterlysningRepository.lagre(etterlysninger);
etterlysningProssesseringTjeneste.settTilAvbrutt(Long.parseLong(prosessTaskData.getBehandlingId()));
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
package no.nav.ung.sak.etterlysning;

public interface EtterlysningHåndterer {





void hånterEtterlysning(long behandlingId);
void håndterOpprettelse(long behandlingId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package no.nav.ung.sak.etterlysning;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
import no.nav.ung.sak.behandlingslager.etterlysning.Etterlysning;
import no.nav.ung.sak.behandlingslager.etterlysning.EtterlysningRepository;

import java.util.Objects;

@ApplicationScoped
public class EtterlysningProssesseringTjeneste {

private EtterlysningRepository etterlysningRepository;
private InntektkontrollEtterlysningHåndterer inntektkontrollEtterlysningOppretter;

public EtterlysningProssesseringTjeneste() {
// CDI
}

@Inject
public EtterlysningProssesseringTjeneste(EtterlysningRepository etterlysningRepository,
InntektkontrollEtterlysningHåndterer inntektkontrollEtterlysningOppretter) {
this.etterlysningRepository = etterlysningRepository;
this.inntektkontrollEtterlysningOppretter = inntektkontrollEtterlysningOppretter;
}

public void settTilUtløpt(Long behandlingId) {
final var etterlysninger = etterlysningRepository.hentUtløpteEtterlysningerSomVenterPåSvar(behandlingId);
// Kall oppgave API

etterlysninger.forEach(Etterlysning::utløpt);
etterlysningRepository.lagre(etterlysninger);
}

public void settTilAvbrutt(Long behandlingId) {
final var etterlysninger = etterlysningRepository.hentEtterlysningerSomSkalAvbrytes(behandlingId);
// Kall oppgave API

etterlysninger.forEach(Etterlysning::avbryt);
etterlysningRepository.lagre(etterlysninger);
}

public void opprett(Long behandlingId, EtterlysningType etterlysningType) {
if (Objects.requireNonNull(etterlysningType) == EtterlysningType.UTTALELSE_KONTROLL_INNTEKT) {
inntektkontrollEtterlysningOppretter.håndterOpprettelse(behandlingId);
} else {
throw new IllegalArgumentException("Ukjent etterlysningstype: " + etterlysningType);
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

import jakarta.enterprise.context.Dependent;
import jakarta.inject.Inject;
import no.nav.ung.kodeverk.etterlysning.EtterlysningStatus;
import no.nav.ung.kodeverk.etterlysning.EtterlysningType;
import no.nav.ung.sak.behandlingslager.etterlysning.EtterlysningRepository;
import no.nav.ung.sak.domene.arbeidsforhold.InntektArbeidYtelseTjeneste;

import java.time.LocalDateTime;

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

@Override
public void hånterEtterlysning(long behandlingId) {
public void håndterOpprettelse(long behandlingId) {
final var etterlysninger = etterlysningRepository.hentOpprettetEtterlysninger(behandlingId, EtterlysningType.UTTALELSE_KONTROLL_INNTEKT);
// Kall oppgave API
etterlysninger.forEach(e -> e.vent(LocalDateTime.now().plusDays(14)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,31 +15,21 @@ public class OpprettEtterlysningTask implements ProsessTaskHandler {

public static final String TASKTYPE = "etterlysning.opprett";
public static final String ETTERLYSNING_TYPE = "type";

private InntektkontrollEtterlysningHåndterer inntektkontrollEtterlysningOppretter;
private EtterlysningProssesseringTjeneste etterlysningProssesseringTjeneste;

public OpprettEtterlysningTask() {
// CDI
}

@Inject
public OpprettEtterlysningTask(InntektkontrollEtterlysningHåndterer inntektkontrollEtterlysningOppretter) {
this.inntektkontrollEtterlysningOppretter = inntektkontrollEtterlysningOppretter;
public OpprettEtterlysningTask(EtterlysningProssesseringTjeneste etterlysningProssesseringTjeneste) {
this.etterlysningProssesseringTjeneste = etterlysningProssesseringTjeneste;
}

@Override
public void doTask(ProsessTaskData prosessTaskData) {
final var behandlingId = prosessTaskData.getBehandlingId();
final var etterlysningType = EtterlysningType.fraKode(prosessTaskData.getPropertyValue(ETTERLYSNING_TYPE));
switch (etterlysningType) {
case EtterlysningType.UTTALELSE_KONTROLL_INNTEKT:
inntektkontrollEtterlysningOppretter.hånterEtterlysning(Long.parseLong(behandlingId));
break;
default:
throw new IllegalArgumentException("Ukjent etterlysningstype: " + etterlysningType);
}



etterlysningProssesseringTjeneste.opprett(Long.parseLong(behandlingId), etterlysningType);
}
}
Loading
Loading