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

TFP-5599 enkleste tilfelle vedtak uten varsel på åpen TBK er noop #2668

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
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 @@ -29,6 +29,7 @@ public class BehandlingRepository {
public static final String KEY_FAGSAK_ID = "fagsakId";
public static final String KEY_SAKSNUMMER = "saksnummer";
private static final String KEY_BEHANDLING_TYPE = "behandlingType";
private static final String KEY_BEHANDLING_STATUS = "behandlingStatus";

private EntityManager entityManager;

Expand Down Expand Up @@ -74,9 +75,12 @@ public List<Behandling> hentAlleBehandlingerForSaksnummer(Saksnummer saksnummer)
Objects.requireNonNull(saksnummer, KEY_SAKSNUMMER);
var query = getEntityManager().createQuery("""
SELECT beh FROM Behandling beh, Fagsak fagsak WHERE beh.fagsak.id=fagsak.id AND fagsak.saksnummer = :saksnummer
AND beh.status <>'AVSLU'
AND beh.behandlingType='BT-007'""", Behandling.class);
query.setParameter(KEY_SAKSNUMMER, saksnummer);
AND beh.status <> :behandlingStatus
AND beh.behandlingType = :behandlingType
""", Behandling.class)
.setParameter(KEY_SAKSNUMMER, saksnummer)
.setParameter(KEY_BEHANDLING_STATUS, BehandlingStatus.AVSLUTTET)
.setParameter(KEY_BEHANDLING_TYPE, BehandlingType.TILBAKEKREVING);
return hentUniktResultat(query);
}

Expand All @@ -87,10 +91,10 @@ public List<Behandling> hentBehandlingerSomIkkeErAvsluttetForFagsakId(Long fagsa
Objects.requireNonNull(fagsakId, KEY_FAGSAK_ID);

var query = getEntityManager().createQuery(
"SELECT beh from Behandling beh WHERE beh.fagsak.id = :fagsakId AND beh.status <> :status",
"SELECT beh from Behandling beh WHERE beh.fagsak.id = :fagsakId AND beh.status <> :behandlingStatus",
Behandling.class);
query.setParameter(KEY_FAGSAK_ID, fagsakId);
query.setParameter("status", BehandlingStatus.AVSLUTTET);
query.setParameter(KEY_BEHANDLING_STATUS, BehandlingStatus.AVSLUTTET);
query.setHint(HibernateHints.HINT_READ_ONLY, "true");
return query.getResultList();
}
Expand Down Expand Up @@ -214,12 +218,12 @@ private static Optional<Behandling> optionalFirst(List<Behandling> behandlinger)

var query = entityManager.createQuery(
"FROM Behandling behandling " +
"WHERE behandling.status <> :status " +
"WHERE behandling.status <> :behandlingStatus " +
" AND behandling.behandlendeEnhetId = :enhet ",
Behandling.class);

query.setParameter("enhet", enhetId);
query.setParameter("status", BehandlingStatus.AVSLUTTET);
query.setParameter(KEY_BEHANDLING_STATUS, BehandlingStatus.AVSLUTTET);
query.setHint(HibernateHints.HINT_READ_ONLY, "true");
return query.getResultList();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ public enum Tillegsinformasjon {
PERSONOPPLYSNINGER("personopplysninger-tilbake", "soeker-personopplysninger"),
VARSELTEKST("tilbakekrevingsvarsel-fritekst"),
SØKNAD("soknad-backend"),
SENDTOPPDRAG("oppdrag-info"),
TILBAKEKREVINGSVALG("tilbakekreving-valg", "tilbakekrevingvalg"),
FAGSAK("fagsak", "fagsak"),
VERGE("verge-backend", "verge");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public class SamletEksternBehandlingInfo {
private SoknadDto søknad;
private FagsakDto fagsak;
private VergeDto verge;
private SendtoppdragDto sendtoppdrag;

public EksternBehandlingsinfoDto getGrunninformasjon() {
return grunninformasjon;
Expand All @@ -39,6 +40,11 @@ public String getVarseltekst() {
return varseltekst;
}

public SendtoppdragDto getSendtoppdrag() {
check(tilleggsinformasjonHentet.contains(Tillegsinformasjon.SENDTOPPDRAG), "Utvikler-feil: har ikke hentet sendt oppdrag");
return sendtoppdrag;
}

public TilbakekrevingValgDto getTilbakekrevingsvalg() {
check(tilleggsinformasjonHentet.contains(Tillegsinformasjon.TILBAKEKREVINGSVALG), "Utvikler-feil: har ikke hentet tilbakekrevingsvalg");
return tilbakekrevingsvalg;
Expand Down Expand Up @@ -111,6 +117,11 @@ public Builder setVarseltekst(String varseltekst) {
return this;
}

public Builder setSendtoppdrag(SendtoppdragDto sendtoppdrag) {
kladd.sendtoppdrag = sendtoppdrag;
return this;
}

public Builder setVarseltekst(VarseltekstDto varseltekst) {
kladd.varseltekst = varseltekst.getVarseltekst();
return this;
Expand Down Expand Up @@ -143,6 +154,7 @@ public SamletEksternBehandlingInfo build() {
valider(Tillegsinformasjon.SØKNAD, SamletEksternBehandlingInfo::getSøknad);
valider(Tillegsinformasjon.VERGE, SamletEksternBehandlingInfo::getVerge);
valider(Tillegsinformasjon.VARSELTEKST, SamletEksternBehandlingInfo::getVarseltekst);
valider(Tillegsinformasjon.SENDTOPPDRAG, SamletEksternBehandlingInfo::getSendtoppdrag);
return kladd;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.dto;

public record SendtoppdragDto(String saksnummer, Long behandlingId) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.ws.rs.core.UriBuilder;

import no.nav.foreldrepenger.kontrakter.simulering.resultat.v1.FeilutbetaltePerioderDto;
import no.nav.foreldrepenger.tilbakekreving.domene.typer.Henvisning;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.Fptilbake;
Expand All @@ -20,6 +21,7 @@
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.dto.FagsakDto;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.dto.PersonopplysningDto;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.dto.SamletEksternBehandlingInfo;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.dto.SendtoppdragDto;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.dto.SoknadDto;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.dto.TilbakekrevingValgDto;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.dto.VarseltekstDto;
Expand Down Expand Up @@ -89,6 +91,9 @@ private Optional<SamletEksternBehandlingInfo> hentBehandlingsinfoOpt(UUID ekster
if (tilleggsinformasjon.contains(Tillegsinformasjon.VARSELTEKST) && lenke.getRel().equals(Tillegsinformasjon.VARSELTEKST.getFpsakRelasjonNavn())) {
hentVarseltekst(lenke).ifPresent(builder::setVarseltekst);
}
if (tilleggsinformasjon.contains(Tillegsinformasjon.SENDTOPPDRAG) && lenke.getRel().equals(Tillegsinformasjon.SENDTOPPDRAG.getFpsakRelasjonNavn())) {
hentSendtoppdrag(lenke).ifPresent(builder::setSendtoppdrag);
}
if (tilleggsinformasjon.contains(Tillegsinformasjon.SØKNAD) && lenke.getRel().equals(Tillegsinformasjon.SØKNAD.getFpsakRelasjonNavn())) {
builder.setFamiliehendelse(hentSøknad(lenke));
}
Expand Down Expand Up @@ -184,6 +189,11 @@ private Optional<VarseltekstDto> hentVarseltekst(BehandlingResourceLinkDto resou

}

private Optional<SendtoppdragDto> hentSendtoppdrag(BehandlingResourceLinkDto resourceLink) {
URI endpoint = endpointFraLink(resourceLink);
return get(endpoint, SendtoppdragDto.class);
}

private SoknadDto hentSøknad(BehandlingResourceLinkDto resourceLink) {
URI endpoint = endpointFraLink(resourceLink);
return get(endpoint, SoknadDto.class)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,44 +1,49 @@
package no.nav.foreldrepenger.tilbakekreving.hendelser;

import static java.time.temporal.TemporalAdjusters.next;

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

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

import no.nav.foreldrepenger.tilbakekreving.behandlingskontroll.impl.BehandlingskontrollTjeneste;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.aksjonspunkt.AksjonspunktDefinisjon;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.aksjonspunkt.Venteårsak;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.repository.BehandlingRepository;

import no.nav.foreldrepenger.tilbakekreving.felles.Frister;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import no.nav.foreldrepenger.tilbakekreving.behandling.task.HendelseTaskDataWrapper;
import no.nav.foreldrepenger.tilbakekreving.behandlingskontroll.impl.BehandlingskontrollTjeneste;
import no.nav.foreldrepenger.tilbakekreving.behandlingskontroll.task.FortsettBehandlingTask;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.Behandling;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.BehandlingStegType;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.BehandlingType;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.aksjonspunkt.AksjonspunktDefinisjon;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.aksjonspunkt.Venteårsak;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.brev.BrevSporingRepository;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.ekstern.EksternBehandling;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.repository.BehandlingRepository;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.behandling.repository.EksternBehandlingRepository;
import no.nav.foreldrepenger.tilbakekreving.behandlingslager.tilbakekrevingsvalg.VidereBehandling;
import no.nav.foreldrepenger.tilbakekreving.domene.typer.Henvisning;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.FagsystemKlient;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.Tillegsinformasjon;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.dto.EksternBehandlingsinfoDto;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.dto.SendtoppdragDto;
import no.nav.foreldrepenger.tilbakekreving.fagsystem.klient.dto.TilbakekrevingValgDto;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskData;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskTjeneste;

import static java.time.temporal.TemporalAdjusters.next;

@ApplicationScoped
public class HendelseHåndtererTjeneste {

private static final Logger LOG = LoggerFactory.getLogger(HendelseHåndtererTjeneste.class);

private ProsessTaskTjeneste taskTjeneste;
private FagsystemKlient fagsystemKlient;
private EksternBehandlingRepository eksternBehandlingRepository;
private BehandlingRepository behandlingRepository;
private EksternBehandlingRepository eksternBehandlingRepository;
private BrevSporingRepository brevSporingRepository;
private BehandlingskontrollTjeneste behandlingskontrollTjeneste;

HendelseHåndtererTjeneste() {
Expand All @@ -49,43 +54,64 @@ public class HendelseHåndtererTjeneste {
public HendelseHåndtererTjeneste(ProsessTaskTjeneste taskTjeneste,
FagsystemKlient fagsystemKlient,
EksternBehandlingRepository eksternBehandlingRepository,
BehandlingRepository behandlingRepository, BehandlingskontrollTjeneste behandlingskontrollTjeneste) {
BehandlingRepository behandlingRepository,
BehandlingskontrollTjeneste behandlingskontrollTjeneste,
BrevSporingRepository brevSporingRepository) {
this.taskTjeneste = taskTjeneste;
this.fagsystemKlient = fagsystemKlient;
this.eksternBehandlingRepository = eksternBehandlingRepository;
this.behandlingRepository = behandlingRepository;
this.eksternBehandlingRepository = eksternBehandlingRepository;
this.brevSporingRepository = brevSporingRepository;
this.behandlingskontrollTjeneste = behandlingskontrollTjeneste;
}

public void håndterHendelse(HendelseTaskDataWrapper hendelseTaskDataWrapper, Henvisning henvisning, String kaller) {
var eksternBehandlingUuid = hendelseTaskDataWrapper.getBehandlingUuid();
var samletBehandlingInfo = fagsystemKlient.hentBehandlingsinfo(eksternBehandlingUuid, Tillegsinformasjon.TILBAKEKREVINGSVALG, Tillegsinformasjon.VARSELTEKST, Tillegsinformasjon.SENDTOPPDRAG);
var tbkData = samletBehandlingInfo.getTilbakekrevingsvalg();
var åpenTilbakekreving = behandlingRepository.finnÅpenTilbakekrevingsbehandling(hendelseTaskDataWrapper.getSaksnummer())
.orElse(null);
if (åpenTilbakekreving != null && !åpenTilbakekreving.isBehandlingPåVent()) {
.orElse(null);var harSendtVarselTidligere = åpenTilbakekreving != null && brevSporingRepository.harVarselBrevSendtForBehandlingId(åpenTilbakekreving.getId());
if (erRelevantHendelseForOpprettTilbakekreving(tbkData) && eksternBehandlingRepository.harEksternBehandlingForEksternUuid(eksternBehandlingUuid)) {
LOG.info("Mottatt VedtakHendelse {} allerede opprettet tilbakekreving for henvisning={} fra {}", tbkData.getVidereBehandling(), henvisning, kaller);
}
if (erRelevantHendelseForOpprettTilbakekreving(tbkData) && åpenTilbakekreving == null) { // Skal opprette tilbakekreving
LOG.info("Mottatt VedtakHendelse {} er relevant for tilbakekreving opprett for henvisning={} fra {}", tbkData.getVidereBehandling(),
henvisning, kaller);
lagOpprettBehandlingTask(hendelseTaskDataWrapper, henvisning);
} else if (erRelevantHendelseForOpprettTilbakekreving(tbkData)) { // Håndtere at det finnes tilbakekreving
// Enten vent på nytt grunnlag / ny status - eller start på nytt med nytt varselbrev
if (samletBehandlingInfo.getVarseltekst() == null || samletBehandlingInfo.getVarseltekst().isBlank()) {
settÅpenTilbakekrevingPåVent(åpenTilbakekreving, samletBehandlingInfo.getSendtoppdrag());
} else {
var loggVarsel = harSendtVarselTidligere ? "er varslet tidligere" : "ikke er varslet";
LOG.info("Mottatt VedtakHendelse {} for behandling {} har bedt om varsel og det finnes åpen tilbakekreving {} som {}",
tbkData.getVidereBehandling(), eksternBehandlingUuid.toString(), åpenTilbakekreving.getId(), loggVarsel);
// Brute-force rewind slik at det sendes nytt varsel (og man venter på grunnlag)
rewindTilbakekrevingTilStart(åpenTilbakekreving, henvisning, eksternBehandlingUuid);
}
} else {
if (erRelevantHendelseForOppdatereTilbakekreving(tbkData)) {
LOG.info("Mottatt VedtakHendelse {} for henvisning {} var tidligere relevant for å oppdatere behandling. Nå ignoreres den",
tbkData.getVidereBehandling(), henvisning);
}
settÅpenTilbakekrevingPåVent(åpenTilbakekreving, samletBehandlingInfo.getSendtoppdrag());
}
}

private void settÅpenTilbakekrevingPåVent(Behandling åpenTilbakekreving, SendtoppdragDto oppdrag) {
if (åpenTilbakekreving != null && oppdrag != null) {
// For å redusere risiko for at det fattes vedtak basert på gammelt kravgrunnlag
// Nytt ytelsesvedtak når det finnes åpen tilbakekreving vil ofte føre til at kravgrunnlag sperres samme kveld
// Gjenoppta-batch kjører hverdager kl 07:00. Hvis helg, vent til tirsdag morgen, ellers 24 timer.
var venteTid = DayOfWeek.FRIDAY.getValue() < DayOfWeek.from(LocalDate.now()).getValue() ?
LocalDate.now().with(next(DayOfWeek.TUESDAY)) : LocalDate.now().plusDays(1);
var idag = LocalDate.now();
var venteTid = idag.getDayOfWeek().getValue() > DayOfWeek.FRIDAY.getValue() ?
idag.with(next(DayOfWeek.TUESDAY)) : idag.plusDays(1);
behandlingskontrollTjeneste.settBehandlingPåVentUtenSteg(åpenTilbakekreving, AksjonspunktDefinisjon.VENT_PÅ_TILBAKEKREVINGSGRUNNLAG,
venteTid.atStartOfDay(), Venteårsak.VENT_PÅ_TILBAKEKREVINGSGRUNNLAG);
}
fagsystemKlient.hentTilbakekrevingValg(eksternBehandlingUuid)
.ifPresent(tbkData -> {
if (erRelevantHendelseForOpprettTilbakekreving(tbkData)) {
if (eksternBehandlingRepository.harEksternBehandlingForEksternUuid(eksternBehandlingUuid)) {
LOG.info("Hendelse={} allerede opprettet tilbakekreving for henvisning={} fra {}", tbkData.getVidereBehandling(), henvisning, kaller);
} else {
LOG.info("Hendelse={} er relevant for tilbakekreving opprett for henvisning={} fra {}", tbkData.getVidereBehandling(), henvisning, kaller);
lagOpprettBehandlingTask(hendelseTaskDataWrapper, henvisning);
}
} else if (erRelevantHendelseForOppdatereTilbakekreving(tbkData)) {
LOG.info("Hendelse={} for henvisning={} var tidligere relevant for å oppdatere behandling. Nå ignoreres den",
tbkData.getVidereBehandling(), henvisning);
}
});
}


public Henvisning hentHenvisning(UUID behandling) {
return fagsystemKlient.hentBehandlingOptional(behandling)
.map(EksternBehandlingsinfoDto::getHenvisning)
Expand All @@ -111,4 +137,26 @@ private void lagOpprettBehandlingTask(HendelseTaskDataWrapper hendelseTaskDataWr

taskTjeneste.lagre(taskData.getProsessTaskData());
}

private void rewindTilbakekrevingTilStart(Behandling åpenTilbakekreving, Henvisning henvisning, UUID eksternBehandlingUuid) {
// Kan ikke håndtere når står under iverksettelse
if (behandlingskontrollTjeneste.erIStegEllerSenereSteg(åpenTilbakekreving.getId(), BehandlingStegType.IVERKSETT_VEDTAK)) {
var melding = String.format("Åpen tilbakekreving %s er under iverksetting. Kan ikke håndtere hendsels for behandling %s",
åpenTilbakekreving.getId().toString(), eksternBehandlingUuid.toString());
throw new IllegalStateException(melding);
}
EksternBehandling eksternBehandling = new EksternBehandling(åpenTilbakekreving, henvisning, eksternBehandlingUuid);
eksternBehandlingRepository.lagre(eksternBehandling);
var kontekst = behandlingskontrollTjeneste.initBehandlingskontroll(åpenTilbakekreving);
behandlingskontrollTjeneste.taBehandlingAvVentSetAlleAutopunktUtført(åpenTilbakekreving, kontekst);
behandlingskontrollTjeneste.behandlingTilbakeføringTilTidligereBehandlingSteg(kontekst, BehandlingStegType.INOPPSTEG);
lagFortsettBehandlingTask(åpenTilbakekreving);
}

private void lagFortsettBehandlingTask(Behandling behandling) {
ProsessTaskData taskData = ProsessTaskData.forProsessTask(FortsettBehandlingTask.class);
taskData.setBehandling(behandling.getFagsakId(), behandling.getId(), behandling.getAktørId().getId());
taskData.setCallIdFraEksisterende();
taskTjeneste.lagre(taskData);
}
}