diff --git a/src/main/java/no/nav/tag/tiltaksgjennomforing/avtale/Avtale.java b/src/main/java/no/nav/tag/tiltaksgjennomforing/avtale/Avtale.java index 73fb406f9..f0c1df7c2 100644 --- a/src/main/java/no/nav/tag/tiltaksgjennomforing/avtale/Avtale.java +++ b/src/main/java/no/nav/tag/tiltaksgjennomforing/avtale/Avtale.java @@ -840,7 +840,7 @@ public void godkjennTilskuddsperiode(NavIdent beslutter, String enhet) { // Sjekk om samme løpenummer allerede er godkjent og annullert. Trenger da en "ekstra" resendingsnummer Integer resendingsnummer = finnResendingsNummer(gjeldendePeriode); gjeldendePeriode.godkjenn(beslutter, enhet); - setGjeldendeTilskuddsperiode(gjeldendeTilskuddsperiodeGammel()); + setGjeldendeTilskuddsperiode(finnGjeldendeTilskuddsperiode()); if (!erAvtaleInngått()) { LocalDateTime tidspunkt = Now.localDateTime(); godkjennForBeslutter(tidspunkt, beslutter); @@ -901,16 +901,16 @@ public TilskuddPeriode tilskuddsperiode(int index) { @Nullable @JsonProperty public TilskuddPeriode getGjeldendeTilskuddsperiode() { - var gjeldendePeriode = gjeldendeTilskuddsperiodeGammel(); + var gjeldendePeriode = finnGjeldendeTilskuddsperiode(); var gjeldendePeriodeKalkulertId = gjeldendePeriode != null ? gjeldendePeriode.getId() : null; var gjeldendeFraDbId = this.gjeldendeTilskuddsperiode != null ? this.gjeldendeTilskuddsperiode.getId() : null; if (!Objects.equals(gjeldendePeriodeKalkulertId, gjeldendeFraDbId)) { - log.debug("Gjeldende tilskuddsperiode ikke oppdatert? Fant {}, men kalkulerte {}", gjeldendeFraDbId, gjeldendePeriodeKalkulertId); + log.warn("Gjeldende tilskuddsperiode ikke oppdatert? Fant {}, men kalkulerte {}", gjeldendeFraDbId, gjeldendePeriodeKalkulertId); } return gjeldendePeriode; } - private TilskuddPeriode gjeldendeTilskuddsperiodeGammel() { + public TilskuddPeriode finnGjeldendeTilskuddsperiode() { TreeSet aktiveTilskuddsperioder = tilskuddPeriode.stream() .filter(TilskuddPeriode::isAktiv) .collect(Collectors.toCollection(TreeSet::new)); @@ -999,7 +999,7 @@ private void forkortTilskuddsperioder(LocalDate nySluttDato) { } } } - setGjeldendeTilskuddsperiode(gjeldendeTilskuddsperiodeGammel()); + setGjeldendeTilskuddsperiode(finnGjeldendeTilskuddsperiode()); } void endreBeløpITilskuddsperioder() { @@ -1015,7 +1015,7 @@ public void sendTilbakeTilBeslutter() { .filter(t -> t.getStatus() == TilskuddPeriodeStatus.AVSLÅTT) .map(TilskuddPeriode::deaktiverOgLagNyUbehandlet).toList(); tilskuddPeriode.addAll(rettede); - setGjeldendeTilskuddsperiode(gjeldendeTilskuddsperiodeGammel()); + setGjeldendeTilskuddsperiode(finnGjeldendeTilskuddsperiode()); } private void sjekkAtIkkeAvtaleErAnnullertEllerAvbrutt() { @@ -1039,7 +1039,7 @@ private List beregnTilskuddsperioder(LocalDate startDato, Local private void nyeTilskuddsperioder() { this.hentBeregningStrategi().genererNyeTilskuddsperioder(this); - setGjeldendeTilskuddsperiode(gjeldendeTilskuddsperiodeGammel()); + setGjeldendeTilskuddsperiode(finnGjeldendeTilskuddsperiode()); } private boolean sjekkRyddingAvTilskuddsperioder() { @@ -1097,7 +1097,7 @@ public boolean nyeTilskuddsperioderEtterMigreringFraArena(LocalDate migreringsDa fikseLøpenumre(tilskuddsperioder, 1); if (!dryRun) { tilskuddPeriode.addAll(tilskuddsperioder); - setGjeldendeTilskuddsperiode(gjeldendeTilskuddsperiodeGammel()); + setGjeldendeTilskuddsperiode(finnGjeldendeTilskuddsperiode()); } return true; } else { diff --git a/src/main/java/no/nav/tag/tiltaksgjennomforing/avtale/AvtaleRepository.java b/src/main/java/no/nav/tag/tiltaksgjennomforing/avtale/AvtaleRepository.java index d22572af9..dca68b938 100644 --- a/src/main/java/no/nav/tag/tiltaksgjennomforing/avtale/AvtaleRepository.java +++ b/src/main/java/no/nav/tag/tiltaksgjennomforing/avtale/AvtaleRepository.java @@ -1,10 +1,13 @@ package no.nav.tag.tiltaksgjennomforing.avtale; import io.micrometer.core.annotation.Timed; +import jakarta.persistence.LockModeType; +import org.springframework.data.domain.Limit; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Lock; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -62,6 +65,9 @@ public interface AvtaleRepository extends JpaRepository, JpaSpecif List findAllByGjeldendeInnhold_AvtaleInngåttNotNull(); + @Lock(LockModeType.PESSIMISTIC_WRITE) + List findAllByGjeldendeTilskuddsperiodeIsNullAndTiltakstypeIsNot(Tiltakstype tiltakstype, Limit limit); + @Timed(percentiles = {0.5d, 0.75d, 0.9d, 0.99d, 0.999d}) @Override Avtale save(Avtale entity); diff --git a/src/main/java/no/nav/tag/tiltaksgjennomforing/avtale/jobber/GjeldendeTilskuddsperiodeJobb.java b/src/main/java/no/nav/tag/tiltaksgjennomforing/avtale/jobber/GjeldendeTilskuddsperiodeJobb.java new file mode 100644 index 000000000..6a6f8447a --- /dev/null +++ b/src/main/java/no/nav/tag/tiltaksgjennomforing/avtale/jobber/GjeldendeTilskuddsperiodeJobb.java @@ -0,0 +1,58 @@ +package no.nav.tag.tiltaksgjennomforing.avtale.jobber; + +import lombok.extern.slf4j.Slf4j; +import no.nav.tag.tiltaksgjennomforing.Miljø; +import no.nav.tag.tiltaksgjennomforing.avtale.AvtaleRepository; +import no.nav.tag.tiltaksgjennomforing.avtale.Tiltakstype; +import org.springframework.context.annotation.Profile; +import org.springframework.data.domain.Limit; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@Component +@Profile({Miljø.DEV_FSS, Miljø.PROD_FSS}) +class GjeldendeTilskuddsperiodeJobb { + private final GjeldendeTilskuddsperiodeJobbWorker gjeldendeTilskuddsperiodeJobbWorker; + + public GjeldendeTilskuddsperiodeJobb(GjeldendeTilskuddsperiodeJobbWorker gjeldendeTilskuddsperiodeJobbWorker) { + this.gjeldendeTilskuddsperiodeJobbWorker = gjeldendeTilskuddsperiodeJobbWorker; + } + + @Scheduled(cron = "0 0/15 * * * *") + public void settGjeldendeTilskuddsperiodeJobb() { + gjeldendeTilskuddsperiodeJobbWorker.settGjeldendeTilskuddsperiodeJobb(); + } +} + +@Slf4j +@Component +class GjeldendeTilskuddsperiodeJobbWorker { + private final AvtaleRepository avtaleRepository; + + public GjeldendeTilskuddsperiodeJobbWorker(AvtaleRepository avtaleRepository) { + this.avtaleRepository = avtaleRepository; + } + + @Transactional + public void settGjeldendeTilskuddsperiodeJobb() { + log.info("Starter jobb for å oppdatere gjeldedeTilskuddsperiode-felt"); + var avtaler = avtaleRepository.findAllByGjeldendeTilskuddsperiodeIsNullAndTiltakstypeIsNot( + Tiltakstype.ARBEIDSTRENING, + Limit.of(100) + ); + if (avtaler.isEmpty()) { + log.info("Ingen avtaler å behandle"); + return; + } + avtaler.forEach(avtale -> { + var nyGjeldende = avtale.finnGjeldendeTilskuddsperiode(); + if (nyGjeldende == null) { + log.warn("Fant ikke en gjeldende tilskuddsperiode! Har ikke avtalen aktive tilskuddsperioder? (avtale-id: {})", avtale.getId()); + } + avtale.setGjeldendeTilskuddsperiode(nyGjeldende); + }); + avtaleRepository.saveAll(avtaler); + } +}