Skip to content

TFP-6036: Sletting av arbeidsforhold informasjon uten referanser. #2640

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

Merged
merged 12 commits into from
Mar 10, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ public Response oppdaterAktoerId(@TilpassetAbacAttributt(supplierClass = Forvalt
public Response ryddOppGrunnlagUtenReferanse() {
LOG.info("FORVALTNING ABAKUS ryddOppGrunnlagUtenReferanse");
oppryddingTjeneste.fjernAlleIayAggregatUtenReferanse();
oppryddingTjeneste.fjernAlleIayInformasjontUtenReferanse();
return Response.ok().build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package no.nav.foreldrepenger.abakus.rydding;

import static java.util.Collections.emptyList;

import java.util.List;
import java.util.Objects;

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

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.persistence.EntityManager;
import no.nav.foreldrepenger.abakus.domene.iay.InntektArbeidYtelseAggregat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.Objects;

import static java.util.Collections.emptyList;

@ApplicationScoped
public class OppryddingIAYAggregatRepository {
Expand Down Expand Up @@ -51,8 +51,7 @@ public void slettIayAggregat(Long id) {
slettIayAktørIntekt(id);
slettIayAktørArbeid(id);
slettIayAktørYtelse(id);
entityManager.remove(iay);
entityManager.flush(); // Sørger for at endringer er lagret før vi går videre
fjernInntektArbeidYtelseFor(id);
}
}

Expand Down Expand Up @@ -257,4 +256,11 @@ private void fjernInntekterFor(List<Long> aktørInntektIdList) {
.executeUpdate();
LOG.info("Fjernet {} aktør inntekter for iay-aggregat: {}", antallFjernet, iayIdForSletting);
}

private void fjernInntektArbeidYtelseFor(Long iayIdForSletting) {
var antallFjernet = entityManager.createNativeQuery("delete from iay_inntekt_arbeid_ytelser where id = :iayId")
.setParameter(PARAM_IAY_ID, iayIdForSletting)
.executeUpdate();
LOG.info("Fjernet {} IAY-aggregat med id: {}", antallFjernet, iayIdForSletting);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package no.nav.foreldrepenger.abakus.rydding;

import static java.util.Collections.emptyList;

import java.util.List;
import java.util.Objects;

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

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.persistence.EntityManager;
import no.nav.foreldrepenger.abakus.domene.iay.arbeidsforhold.ArbeidsforholdInformasjon;

@ApplicationScoped
public class OppryddingIayInformasjonRepository {
private static final Logger LOG = LoggerFactory.getLogger(OppryddingIayInformasjonRepository.class);

private EntityManager entityManager;

OppryddingIayInformasjonRepository() {
// CDI proxy
}

@Inject
public OppryddingIayInformasjonRepository(EntityManager entityManager) {
Objects.requireNonNull(entityManager, "entityManager");
this.entityManager = entityManager;
}

public List<Long> hentIayInformasjonUtenReferanse(Integer maxResults) {
@SuppressWarnings("unchecked") List<Number> result = entityManager.createNativeQuery("select distinct id from iay_informasjon info where "
+ "not exists (select 1 from gr_arbeid_inntekt gr where info.id = gr.informasjon_id)").setMaxResults(maxResults).getResultList();
if (result.isEmpty()) {
LOG.info("Fant ingen IAY-Informasjon uten grunnlag referanse");
return emptyList();
}
LOG.info("Fant {} IAY-Informasjon uten grunnlag referanse", result.size());
return result.stream().map(Number::longValue).toList();
}

public void slettIayInformasjon(Long id) {
var arbeidsforholdInformasjon = entityManager.find(ArbeidsforholdInformasjon.class, id);
if (arbeidsforholdInformasjon != null) {
slettArbeidsforholdInformasjon(id);
fjernInformasjonFor(id);
}
}

private void slettArbeidsforholdInformasjon(Long informasjonId) {
var overstyrteArbeidsforhold = hentOverstyrteArbeidsforholdFor(informasjonId);
if (!overstyrteArbeidsforhold.isEmpty()) {
fjernOverstyrteArbeidsforholdPerioderFor(overstyrteArbeidsforhold);
fjernOverstyrteArbeidsforholFor(informasjonId);
}
fjernArbeidsforholReferanserFor(informasjonId);
}

private List<Long> hentOverstyrteArbeidsforholdFor(Long informasjonId) {
@SuppressWarnings("unchecked") List<Number> result = entityManager.createNativeQuery(
"select distinct id from iay_arbeidsforhold where informasjon_id = :infoId").setParameter("infoId", informasjonId).getResultList();
return result.stream().map(Number::longValue).toList();
}

private void fjernOverstyrteArbeidsforholdPerioderFor(List<Long> overstyrteArbeidsforholdIdList) {
var antallFjernet = entityManager.createNativeQuery(
"delete from iay_overstyrte_perioder where arbeidsforhold_id in (:overstyrteArbeidsforholdIdList)")
.setParameter("overstyrteArbeidsforholdIdList", overstyrteArbeidsforholdIdList)
.executeUpdate();
LOG.info("Fjernet {} overstyrte arbeidsforhold perioder for arbeidsforhold: {}", antallFjernet, overstyrteArbeidsforholdIdList);
}

private void fjernOverstyrteArbeidsforholFor(Long informasjonId) {
var antallFjernet = entityManager.createNativeQuery("delete from iay_arbeidsforhold where informasjon_id = :informasjonId")
.setParameter("informasjonId", informasjonId)
.executeUpdate();
LOG.info("Fjernet {} overstyrte arbeidsforhold for informasjon: {}", antallFjernet, informasjonId);
}

private void fjernArbeidsforholReferanserFor(Long informasjonId) {
var antallFjernet = entityManager.createNativeQuery("delete from iay_arbeidsforhold_refer where informasjon_id = :informasjonId")
.setParameter("informasjonId", informasjonId)
.executeUpdate();
LOG.info("Fjernet {} arbeidsforhold referanser for informasjon: {}", antallFjernet, informasjonId);
}

private void fjernInformasjonFor(Long informasjonId) {
var antallFjernet = entityManager.createNativeQuery("delete from iay_informasjon where id = :informasjonId")
.setParameter("informasjonId", informasjonId)
.executeUpdate();
LOG.info("Fjernet {} arbeidsforhold informasjon med id: {}", antallFjernet, informasjonId);
}
}
Original file line number Diff line number Diff line change
@@ -1,49 +1,46 @@
package no.nav.foreldrepenger.abakus.rydding;

import java.util.List;

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

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import no.nav.foreldrepenger.abakus.rydding.task.FjernIAYGrunnlagUtenReferanseTask;
import no.nav.foreldrepenger.abakus.rydding.task.FjernIayInformasjonUtenReferanseTask;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskData;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskTjeneste;
import no.nav.vedtak.mapper.json.DefaultJsonMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static no.nav.foreldrepenger.abakus.rydding.task.FjernIAYGrunnlagUtenReferanseTask.MAX_PARTITION_SIZE;

@ApplicationScoped
public class OppryddingTjeneste {
private static final Logger LOG = LoggerFactory.getLogger(OppryddingTjeneste.class);
private OppryddingIAYAggregatRepository iayOppryddingRepository;
private ProsessTaskTjeneste taskTjeneste;

OppryddingTjeneste() {
// CDI proxy
}

@Inject
public OppryddingTjeneste(OppryddingIAYAggregatRepository iayOppryddingRepository, ProsessTaskTjeneste taskTjeneste) {
this.iayOppryddingRepository = iayOppryddingRepository;
public OppryddingTjeneste(ProsessTaskTjeneste taskTjeneste) {
this.taskTjeneste = taskTjeneste;
}

public void fjernAlleIayAggregatUtenReferanse() {
var iayAggregatUtenReferanse = iayOppryddingRepository.hentIayAggregaterUtenReferanse(MAX_PARTITION_SIZE);
if (iayAggregatUtenReferanse.isEmpty()) {
LOG.info("Ingen IAY aggregat for sletting.");
return;
}
LOG.info("Fjerner {} IAY-aggregater uten referanse.", iayAggregatUtenReferanse.size());
opprettFjernIayAggregatTask(iayAggregatUtenReferanse);
opprettFjernIayAggregatTask();
}

private void opprettFjernIayAggregatTask(List<Long> iayIdsList) {
LOG.info("Oppretter task for å fjerne {} IAY-aggregater uten referanse.", iayIdsList.size());
public void fjernAlleIayInformasjontUtenReferanse() {
opprettFjernIayInformasjonTask();
}

private void opprettFjernIayAggregatTask() {
LOG.info("Oppretter task for å fjerne IAY-aggregater uten referanse.");
var prosessTaskData = ProsessTaskData.forProsessTask(FjernIAYGrunnlagUtenReferanseTask.class);
prosessTaskData.setPayload(DefaultJsonMapper.toJson(iayIdsList));
taskTjeneste.lagre(prosessTaskData);
}

private void opprettFjernIayInformasjonTask() {
LOG.info("Oppretter task for å fjerne IAY-Informasjon uten referanse.");
var prosessTaskData = ProsessTaskData.forProsessTask(FjernIayInformasjonUtenReferanseTask.class);
taskTjeneste.lagre(prosessTaskData);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,6 @@ public FjernAlleGrunnlagUtenReferanseBatchTask(OppryddingTjeneste oppryddingTjen
@Override
public void doTask(ProsessTaskData prosessTaskData) {
oppryddingTjeneste.fjernAlleIayAggregatUtenReferanse();
oppryddingTjeneste.fjernAlleIayInformasjontUtenReferanse();
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,23 @@
package no.nav.foreldrepenger.abakus.rydding.task;

import java.util.List;
import java.util.Set;

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

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import no.nav.foreldrepenger.abakus.rydding.OppryddingIAYAggregatRepository;
import no.nav.vedtak.felles.prosesstask.api.ProsessTask;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskData;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskHandler;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskTjeneste;
import no.nav.vedtak.mapper.json.DefaultJsonMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ApplicationScoped
@ProsessTask(value = "opprydding.iayGrunnlag.uten.referanse", maxFailedRuns = 2)
public class FjernIAYGrunnlagUtenReferanseTask implements ProsessTaskHandler {
public static final int MAX_PARTITION_SIZE = 250;

public static final int IAY_GRUNNLAG_BATCH_SIZE = 500;

private static final Logger LOG = LoggerFactory.getLogger(FjernIAYGrunnlagUtenReferanseTask.class);

private final OppryddingIAYAggregatRepository iayAggregatRepository;
private final ProsessTaskTjeneste taskTjeneste;

Expand All @@ -30,22 +28,20 @@ public FjernIAYGrunnlagUtenReferanseTask(OppryddingIAYAggregatRepository iayAggr
}

@Override
public void doTask(ProsessTaskData prosessTaskData) {
Set<Integer> iayAggregatUtenReferanse = DefaultJsonMapper.fromJson(prosessTaskData.getPayloadAsString(), Set.class);
public void doTask(ProsessTaskData unused) {
var iayAggregatUtenReferanse = iayAggregatRepository.hentIayAggregaterUtenReferanse(IAY_GRUNNLAG_BATCH_SIZE);
LOG.info("Fjerner {} IAY-aggregater uten referanse.", iayAggregatUtenReferanse.size());
iayAggregatUtenReferanse.forEach(iayId -> iayAggregatRepository.slettIayAggregat(iayId.longValue()));
iayAggregatUtenReferanse.forEach(iayAggregatRepository::slettIayAggregat);
LOG.info("Slettet {} IAY-aggregater uten referanse", iayAggregatUtenReferanse.size());

var nyeAggregaterTilSletting = iayAggregatRepository.hentIayAggregaterUtenReferanse(MAX_PARTITION_SIZE);
if (!nyeAggregaterTilSletting.isEmpty()) {
opprettFjernIayAggregatTask(nyeAggregaterTilSletting);
if (iayAggregatUtenReferanse.size() >= IAY_GRUNNLAG_BATCH_SIZE) {
opprettFjernIayAggregatTask();
}
}

private void opprettFjernIayAggregatTask(List<Long> iayIdsList) {
LOG.info("Oppretter en ny task for å fjerne {} IAY-aggregater uten referanse.", iayIdsList.size());
private void opprettFjernIayAggregatTask() {
LOG.info("Oppretter en ny task for å fjerne IAY-aggregater uten referanse.");
var prosessTaskData = ProsessTaskData.forProsessTask(FjernIAYGrunnlagUtenReferanseTask.class);
prosessTaskData.setPayload(DefaultJsonMapper.toJson(iayIdsList));
taskTjeneste.lagre(prosessTaskData);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package no.nav.foreldrepenger.abakus.rydding.task;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import no.nav.foreldrepenger.abakus.rydding.OppryddingIayInformasjonRepository;
import no.nav.vedtak.felles.prosesstask.api.ProsessTask;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskData;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskHandler;
import no.nav.vedtak.felles.prosesstask.api.ProsessTaskTjeneste;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ApplicationScoped
@ProsessTask(value = "opprydding.iayInformasjon.uten.referanse", maxFailedRuns = 2)
public class FjernIayInformasjonUtenReferanseTask implements ProsessTaskHandler {
public static final int IAY_ARBEIDSFORHOLD_INFORMASJON_BATCH_SIZE = 750;

private static final Logger LOG = LoggerFactory.getLogger(FjernIayInformasjonUtenReferanseTask.class);

private final OppryddingIayInformasjonRepository oppryddingIayInformasjonRepository;
private final ProsessTaskTjeneste taskTjeneste;

@Inject
public FjernIayInformasjonUtenReferanseTask(OppryddingIayInformasjonRepository oppryddingIayInformasjonRepository, ProsessTaskTjeneste taskTjeneste) {
this.oppryddingIayInformasjonRepository = oppryddingIayInformasjonRepository;
this.taskTjeneste = taskTjeneste;
}

@Override
public void doTask(ProsessTaskData unused) {
var iayInformasjonUtenReferanse = oppryddingIayInformasjonRepository.hentIayInformasjonUtenReferanse(IAY_ARBEIDSFORHOLD_INFORMASJON_BATCH_SIZE);
LOG.info("Fjerner {} IAY-Informasjon uten referanse.", iayInformasjonUtenReferanse.size());
iayInformasjonUtenReferanse.forEach(oppryddingIayInformasjonRepository::slettIayInformasjon);
LOG.info("Slettet {} IAY-Informasjon uten referanse", iayInformasjonUtenReferanse.size());

if (iayInformasjonUtenReferanse.size() >= IAY_ARBEIDSFORHOLD_INFORMASJON_BATCH_SIZE) {
opprettFjernInformasjonAggregatTask();
}
}

private void opprettFjernInformasjonAggregatTask() {
LOG.info("Oppretter en ny task for å fjerne IAY-Informasjon uten referanse.");
var prosessTaskData = ProsessTaskData.forProsessTask(FjernIayInformasjonUtenReferanseTask.class);
taskTjeneste.lagre(prosessTaskData);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ void slettIayAggregat_register_ok() {
assertThat(iayAggregater).hasSize(1);

repository.slettIayAggregat(iayAggregater.getFirst());
flushAndClear();

assertThat(repository.hentIayAggregaterUtenReferanse(250)).isEmpty();
}
Expand All @@ -54,7 +53,6 @@ void slettIayAggregat_saksbehandlet_ok() {
assertThat(iayAggregater).hasSize(1);

repository.slettIayAggregat(iayAggregater.getFirst());
flushAndClear();

assertThat(repository.hentIayAggregaterUtenReferanse(250)).isEmpty();
}
Expand Down
Loading