Repository: navikt/pensjon-etterlatte-saksbehandling
Pull request #7467: EY-5215 lagre relatertBehandling ved opprettelse av forbehandling
Author: login: andreasbalevik
Created: 2025-05-08T10:51:13Z | Merged: 2025-05-08T14:51:34Z

Tidligere brukte vi sisteIverksatteBehandling for å hente beregnetEtteroppgjoerResultat, problemet der er at hvis en forbehandling er ferdigstilt og vi har gjennomført en revurdering så finner vi ikke et resultat fordi sisteIverksattebehandling har endret seg. 

- Ender til å lagre relatertBehandlingId som brukes for å hente beregnetEtteroppgjoerResultat

NB! Dette vil bryte tidligere saker i Gjenny da relatertBehandlingId er påkrevd og forventet...

- Vi bør kanskje ha en sjekk som sjekker om sisteIverksatteBehandling har endret seg mens forbehandling er under behandling. Da vil relatertBehandlingId ikke peke på siste


Diff:
diff --git a/apps/etterlatte-behandling/src/main/kotlin/Application.kt b/apps/etterlatte-behandling/src/main/kotlin/Application.kt
index 8d73e65e475..83fc5138800 100644
--- a/apps/etterlatte-behandling/src/main/kotlin/Application.kt
+++ b/apps/etterlatte-behandling/src/main/kotlin/Application.kt
@@ -181,6 +181,7 @@ private fun Route.settOppRoutes(applicationContext: ApplicationContext) {
         skatteoppgjoerHendelserService = applicationContext.skatteoppgjoerHendelserService,
         etteroppgjoerService = applicationContext.etteroppgjoerService,
         featureToggleService = applicationContext.featureToggleService,
+        etteroppgjoerJobService = applicationContext.etteroppgjoerJobService,
     )
     behandlingRoutes(
         behandlingService = applicationContext.behandlingService,
diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/EtteroppgjoerRoutes.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/EtteroppgjoerRoutes.kt
index 5f90e92f27a..d646985b52e 100644
--- a/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/EtteroppgjoerRoutes.kt
+++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/EtteroppgjoerRoutes.kt
@@ -14,6 +14,7 @@ import no.nav.etterlatte.behandling.etteroppgjoer.forbehandling.BeregnFaktiskInn
 import no.nav.etterlatte.behandling.etteroppgjoer.forbehandling.EtteroppgjoerForbehandlingService
 import no.nav.etterlatte.behandling.etteroppgjoer.sigrun.HendelseKjoeringRequest
 import no.nav.etterlatte.behandling.etteroppgjoer.sigrun.SkatteoppgjoerHendelserService
+import no.nav.etterlatte.behandling.job.EtteroppgjoerJobService
 import no.nav.etterlatte.funksjonsbrytere.FeatureToggle
 import no.nav.etterlatte.funksjonsbrytere.FeatureToggleService
 import no.nav.etterlatte.inTransaction
@@ -48,6 +49,7 @@ fun Route.etteroppgjoerRoutes(
     forbehandlingBrevService: EtteroppgjoerForbehandlingBrevService,
     skatteoppgjoerHendelserService: SkatteoppgjoerHendelserService,
     etteroppgjoerService: EtteroppgjoerService,
+    etteroppgjoerJobService: EtteroppgjoerJobService,
     featureToggleService: FeatureToggleService,
 ) {
     route("/api/etteroppgjoer") {
@@ -129,7 +131,7 @@ fun Route.etteroppgjoerRoutes(
                         "Inntektsaar mangler"
                     }
                 inTransaction {
-                    etteroppgjoerService.finnOgOpprettEtteroppgjoer(inntektsaar)
+                    etteroppgjoerJobService.finnOgOpprettEtteroppgjoer(inntektsaar)
                 }
                 call.respond(HttpStatusCode.OK)
             }
@@ -144,7 +146,7 @@ fun Route.etteroppgjoerRoutes(
                         "Inntektsaar mangler"
                     }
 
-                forbehandlingService.finnOgOpprettForbehandlinger(inntektsaar)
+                etteroppgjoerJobService.finnOgOpprettForbehandlinger(inntektsaar)
             }
         }
 
diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/EtteroppgjoerService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/EtteroppgjoerService.kt
index e304a23dec7..4fe4772b8c4 100644
--- a/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/EtteroppgjoerService.kt
+++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/EtteroppgjoerService.kt
@@ -1,10 +1,8 @@
 package no.nav.etterlatte.behandling.etteroppgjoer
 
-import kotlinx.coroutines.runBlocking
 import no.nav.etterlatte.behandling.klienter.VedtakKlient
 import no.nav.etterlatte.libs.common.behandling.SakType
 import no.nav.etterlatte.libs.common.sak.SakId
-import no.nav.etterlatte.libs.ktor.token.HardkodaSystembruker
 import no.nav.etterlatte.logger
 import no.nav.etterlatte.sak.SakLesDao
 import no.nav.etterlatte.sak.SakService
@@ -31,23 +29,6 @@ class EtteroppgjoerService(
         )
     }
 
-    // finn saker som skal ha etteroppgjør for inntektsår og opprett etteroppgjør
-    fun finnOgOpprettEtteroppgjoer(inntektsaar: Int) {
-        logger.info("Starter oppretting av etteroppgjør for inntektsår $inntektsaar")
-        val sakerMedUtbetaling =
-            runBlocking {
-                vedtakKlient.hentSakerMedUtbetalingForInntektsaar(
-                    inntektsaar,
-                    HardkodaSystembruker.etteroppgjoer,
-                )
-            }
-
-        sakerMedUtbetaling
-            .forEach { sakId -> opprettEtteroppgjoer(sakId, inntektsaar) }
-
-        logger.info("Opprettet totalt ${sakerMedUtbetaling.size} etteroppgjoer for inntektsaar=$inntektsaar")
-    }
-
     fun hentEtteroppgjoer(
         sakId: SakId,
         inntektsaar: Int,
diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingDao.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingDao.kt
index e937ed238ef..093a63dd31b 100644
--- a/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingDao.kt
+++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingDao.kt
@@ -4,8 +4,6 @@ import com.fasterxml.jackson.module.kotlin.readValue
 import no.nav.etterlatte.behandling.etteroppgjoer.AInntekt
 import no.nav.etterlatte.behandling.etteroppgjoer.PensjonsgivendeInntekt
 import no.nav.etterlatte.behandling.etteroppgjoer.PensjonsgivendeInntektFraSkatt
-import no.nav.etterlatte.behandling.etteroppgjoer.forbehandling.EtteroppgjoerForbehandling
-import no.nav.etterlatte.behandling.etteroppgjoer.forbehandling.EtteroppgjoerForbehandlingStatus
 import no.nav.etterlatte.behandling.hendelse.getLongOrNull
 import no.nav.etterlatte.behandling.hendelse.setLong
 import no.nav.etterlatte.common.ConnectionAutoclosing
@@ -38,7 +36,7 @@ class EtteroppgjoerForbehandlingDao(
                 val statement =
                     prepareStatement(
                         """
-                        SELECT t.id, t.sak_id, s.saktype, s.fnr, s.enhet, t.opprettet, t.status, t.aar, t.fom, t.tom, t.brev_id, t.kopiert_fra
+                        SELECT *
                         FROM etteroppgjoer_behandling t INNER JOIN sak s on t.sak_id = s.id
                         WHERE t.id = ?
                         """.trimIndent(),
@@ -54,7 +52,7 @@ class EtteroppgjoerForbehandlingDao(
                 val statement =
                     prepareStatement(
                         """
-                        SELECT t.id, t.sak_id, s.saktype, s.fnr, s.enhet, t.opprettet, t.status, t.aar, t.fom, t.tom, t.brev_id, t.kopiert_fra  
+                        SELECT *  
                         FROM etteroppgjoer_behandling t INNER JOIN sak s on t.sak_id = s.id
                         WHERE t.sak_id = ?
                         """.trimIndent(),
@@ -71,9 +69,9 @@ class EtteroppgjoerForbehandlingDao(
                     prepareStatement(
                         """
                         INSERT INTO etteroppgjoer_behandling(
-                            id, status, sak_id, opprettet, aar, fom, tom, brev_id, kopiert_fra
+                            id, status, sak_id, opprettet, aar, fom, tom, brev_id, kopiert_fra, siste_iverksatte_behandling
                         ) 
-                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) 
+                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
                         ON CONFLICT (id) DO UPDATE SET
                             status = excluded.status,
                             brev_id = excluded.brev_id
@@ -94,6 +92,7 @@ class EtteroppgjoerForbehandlingDao(
                 )
                 statement.setLong(8, forbehandling.brevId)
                 statement.setObject(9, forbehandling.kopiertFra)
+                statement.setObject(10, forbehandling.sisteIverksatteBehandlingId)
 
                 statement.executeUpdate().also {
                     krev(it == 1) {
@@ -338,6 +337,7 @@ class EtteroppgjoerForbehandlingDao(
                 ),
             brevId = getLongOrNull("brev_id"),
             kopiertFra = getString("kopiert_fra")?.let { UUID.fromString(it) },
+            sisteIverksatteBehandlingId = getString("siste_iverksatte_behandling").let { UUID.fromString(it) },
         )
 
     private fun ResultSet.toPensjonsgivendeInntekt(): PensjonsgivendeInntekt =
diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingModel.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingModel.kt
index 9ca295b25f7..53aa89af171 100644
--- a/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingModel.kt
+++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingModel.kt
@@ -21,13 +21,14 @@ data class EtteroppgjoerForbehandling(
     val aar: Int,
     val innvilgetPeriode: Periode,
     val brevId: Long?,
-    // hvis vi oppretter en kopi av forbehandling for å bruke i en revurdering
-    val kopiertFra: UUID? = null,
+    val kopiertFra: UUID? = null, // hvis vi oppretter en kopi av forbehandling for å bruke i en revurdering
+    val sisteIverksatteBehandlingId: UUID, // siste iverksatte behandling når forbehandling ble opprettet
 ) {
     companion object {
         fun opprett(
             sak: Sak,
             innvilgetPeriode: Periode,
+            sisteIverksatteBehandling: UUID,
         ) = EtteroppgjoerForbehandling(
             id = UUID.randomUUID(),
             hendelseId = UUID.randomUUID(),
@@ -38,6 +39,7 @@ data class EtteroppgjoerForbehandling(
             opprettet = Tidspunkt.now(),
             brevId = null,
             kopiertFra = null,
+            sisteIverksatteBehandlingId = sisteIverksatteBehandling,
         )
     }
 
@@ -75,7 +77,6 @@ data class EtteroppgjoerForbehandling(
 
 data class DetaljertForbehandlingDto(
     val behandling: EtteroppgjoerForbehandling,
-    val sisteIverksatteBehandling: UUID,
     val opplysninger: EtteroppgjoerOpplysninger,
     val faktiskInntekt: FaktiskInntektDto?,
     val beregnetEtteroppgjoerResultat: BeregnetEtteroppgjoerResultatDto?,
diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingService.kt
index eab0da37321..de59eac3a3f 100644
--- a/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingService.kt
+++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingService.kt
@@ -3,6 +3,7 @@ package no.nav.etterlatte.behandling.etteroppgjoer.forbehandling
 import io.ktor.server.plugins.NotFoundException
 import kotlinx.coroutines.runBlocking
 import no.nav.etterlatte.behandling.BehandlingService
+import no.nav.etterlatte.behandling.domain.Behandling
 import no.nav.etterlatte.behandling.etteroppgjoer.EtteroppgjoerService
 import no.nav.etterlatte.behandling.etteroppgjoer.EtteroppgjoerStatus
 import no.nav.etterlatte.behandling.etteroppgjoer.PensjonsgivendeInntektFraSkatt
@@ -14,11 +15,13 @@ import no.nav.etterlatte.brev.model.Brev
 import no.nav.etterlatte.libs.common.behandling.SakType
 import no.nav.etterlatte.libs.common.beregning.BeregnetEtteroppgjoerResultatDto
 import no.nav.etterlatte.libs.common.beregning.EtteroppgjoerBeregnFaktiskInntektRequest
+import no.nav.etterlatte.libs.common.beregning.EtteroppgjoerBeregnetAvkorting
 import no.nav.etterlatte.libs.common.beregning.EtteroppgjoerBeregnetAvkortingRequest
 import no.nav.etterlatte.libs.common.beregning.EtteroppgjoerHentBeregnetResultatRequest
 import no.nav.etterlatte.libs.common.beregning.FaktiskInntektDto
 import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException
 import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException
+import no.nav.etterlatte.libs.common.feilhaandtering.krevIkkeNull
 import no.nav.etterlatte.libs.common.oppgave.OppgaveIntern
 import no.nav.etterlatte.libs.common.oppgave.OppgaveKilde
 import no.nav.etterlatte.libs.common.oppgave.OppgaveType
@@ -28,7 +31,6 @@ import no.nav.etterlatte.libs.common.sak.SakId
 import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt
 import no.nav.etterlatte.libs.common.vedtak.FoersteVirkOgOppoerTilSak
 import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo
-import no.nav.etterlatte.libs.ktor.token.HardkodaSystembruker
 import no.nav.etterlatte.oppgave.OppgaveService
 import no.nav.etterlatte.sak.SakLesDao
 import org.slf4j.Logger
@@ -50,27 +52,6 @@ class EtteroppgjoerForbehandlingService(
 ) {
     private val logger: Logger = LoggerFactory.getLogger(EtteroppgjoerForbehandlingService::class.java)
 
-    // finn saker med etteroppgjoer og mottatt skatteoppgjoer som skal ha forbehandling
-    fun finnOgOpprettForbehandlinger(inntektsaar: Int) {
-        logger.info(
-            "Starter oppretting av forbehandling for etteroppgjør med mottatt skatteoppgjør for inntektsår $inntektsaar",
-        )
-        val etteroppgjoerListe =
-            etteroppgjoerService.hentEtteroppgjoerForStatus(EtteroppgjoerStatus.MOTTATT_SKATTEOPPGJOER, inntektsaar)
-
-        for (etteroppgjoer in etteroppgjoerListe) {
-            try {
-                opprettEtteroppgjoerForbehandling(
-                    etteroppgjoer.sakId,
-                    etteroppgjoer.inntektsaar,
-                    HardkodaSystembruker.etteroppgjoer,
-                )
-            } catch (e: Exception) {
-                logger.error("Kunne ikke opprette forbehandling for sakId=${etteroppgjoer.sakId} grunnen: ${e.message}")
-            }
-        }
-    }
-
     fun ferdigstillForbehandling(
         behandlingId: UUID,
         brukerTokenInfo: BrukerTokenInfo,
@@ -87,8 +68,6 @@ class EtteroppgjoerForbehandlingService(
         oppgaveService.ferdigStillOppgaveUnderBehandling(forbehandling.id.toString(), OppgaveType.ETTEROPPGJOER, brukerTokenInfo)
     }
 
-    fun hentPensjonsgivendeInntekt(behandlingId: UUID): PensjonsgivendeInntektFraSkatt? = dao.hentPensjonsgivendeInntekt(behandlingId)
-
     fun lagreForbehandling(forbehandling: EtteroppgjoerForbehandling) = dao.lagreForbehandling(forbehandling)
 
     fun hentForbehandling(behandlingId: UUID): EtteroppgjoerForbehandling =
@@ -99,27 +78,13 @@ class EtteroppgjoerForbehandlingService(
         brukerTokenInfo: BrukerTokenInfo,
     ): DetaljertForbehandlingDto {
         val forbehandling = hentForbehandling(forbehandlingId)
-
         val sisteIverksatteBehandling =
-            behandlingService.hentSisteIverksatte(forbehandling.sak.id)
-                ?: throw InternfeilException("Fant ikke siste iverksatt behandling")
-
-        val request =
-            EtteroppgjoerBeregnetAvkortingRequest(
-                forbehandling = forbehandlingId,
-                sisteIverksatteBehandling = sisteIverksatteBehandling.id,
-                aar = forbehandling.aar,
-                sakId = sisteIverksatteBehandling.sak.id,
-            )
-        logger.info("Henter avkorting for forbehandling: $request")
-        val avkorting =
-            runBlocking {
-                beregningKlient.hentAvkortingForForbehandlingEtteroppgjoer(
-                    request,
-                    brukerTokenInfo,
+            behandlingService.hentBehandling(forbehandling.sisteIverksatteBehandlingId)
+                ?: throw InternfeilException(
+                    "Fant ikke relatert behandling=${forbehandling.sisteIverksatteBehandlingId} for forbehandling=$forbehandlingId",
                 )
-            }
 
+        val avkorting = hentAvkortingForForbehandling(forbehandling, sisteIverksatteBehandling, brukerTokenInfo)
         val pensjonsgivendeInntekt = dao.hentPensjonsgivendeInntekt(forbehandlingId)
         val aInntekt = dao.hentAInntekt(forbehandlingId)
 
@@ -149,7 +114,6 @@ class EtteroppgjoerForbehandlingService(
                     ainntekt = aInntekt,
                     tidligereAvkorting = avkorting.avkortingMedForventaInntekt,
                 ),
-            sisteIverksatteBehandling = sisteIverksatteBehandling.id,
             beregnetEtteroppgjoerResultat = beregnetEtteroppgjoerResultat,
             faktiskInntekt = avkorting.avkortingMedFaktiskInntekt?.avkortingGrunnlag?.firstOrNull() as? FaktiskInntektDto,
         )
@@ -163,6 +127,8 @@ class EtteroppgjoerForbehandlingService(
         dao.lagreForbehandling(forbehandling.medBrev(brev))
     }
 
+    fun hentPensjonsgivendeInntekt(behandlingId: UUID): PensjonsgivendeInntektFraSkatt? = dao.hentPensjonsgivendeInntekt(behandlingId)
+
     fun hentEtteroppgjoerForbehandlinger(sakId: SakId): List<EtteroppgjoerForbehandling> = dao.hentForbehandlinger(sakId)
 
     fun opprettEtteroppgjoerForbehandling(
@@ -179,9 +145,9 @@ class EtteroppgjoerForbehandlingService(
         val aInntekt = runBlocking { inntektskomponentService.hentInntektFraAInntekt(sak.ident, inntektsaar) }
         val virkOgOpphoer = runBlocking { vedtakKlient.hentFoersteVirkOgOppoerTilSak(sakId, brukerTokenInfo) }
         val innvilgetPeriode = utledInnvilgetPeriode(virkOgOpphoer, inntektsaar)
-        val nyForbehandling = EtteroppgjoerForbehandling.opprett(sak, innvilgetPeriode)
 
-        dao.lagreForbehandling(nyForbehandling)
+        val nyForbehandling = opprettOgLagreNyForbehandling(sak, innvilgetPeriode)
+
         dao.lagrePensjonsgivendeInntekt(pensjonsgivendeInntekt, nyForbehandling.id)
         dao.lagreAInntekt(aInntekt, nyForbehandling.id)
 
@@ -213,15 +179,11 @@ class EtteroppgjoerForbehandlingService(
             forbehandling = kopierOgLagreNyForbehandling(forbehandling)
         }
 
-        val sisteIverksatteBehandling =
-            behandlingService.hentSisteIverksatte(forbehandling.sak.id)
-                ?: throw InternfeilException("Fant ikke siste iverksatte")
-
         val beregningRequest =
             EtteroppgjoerBeregnFaktiskInntektRequest(
                 sakId = forbehandling.sak.id,
                 forbehandlingId = forbehandling.id,
-                sisteIverksatteBehandling = sisteIverksatteBehandling.id,
+                sisteIverksatteBehandling = forbehandling.sisteIverksatteBehandlingId,
                 aar = forbehandling.aar,
                 loennsinntekt = request.loennsinntekt,
                 naeringsinntekt = request.naeringsinntekt,
@@ -276,6 +238,20 @@ class EtteroppgjoerForbehandlingService(
         // TODO: flere sjekker?
     }
 
+    private fun opprettOgLagreNyForbehandling(
+        sak: Sak,
+        innvilgetPeriode: Periode,
+    ): EtteroppgjoerForbehandling {
+        val sisteIverksatteBehandling = behandlingService.hentSisteIverksatte(sak.id)
+        krevIkkeNull(sisteIverksatteBehandling) {
+            "Fant ikke sisteIverksatteBehandling for Sak=${sak.id} kan derfor ikke opprette forbehandling"
+        }
+
+        return EtteroppgjoerForbehandling.opprett(sak, innvilgetPeriode, sisteIverksatteBehandling.id).also {
+            dao.lagreForbehandling(it)
+        }
+    }
+
     private fun utledInnvilgetPeriode(
         virkOgOpphoer: FoersteVirkOgOppoerTilSak,
         inntektsaar: Int,
@@ -294,13 +270,39 @@ class EtteroppgjoerForbehandlingService(
             },
     )
 
+    private fun hentAvkortingForForbehandling(
+        forbehandling: EtteroppgjoerForbehandling,
+        sisteIverksatteBehandling: Behandling,
+        brukerTokenInfo: BrukerTokenInfo,
+    ): EtteroppgjoerBeregnetAvkorting {
+        val request =
+            EtteroppgjoerBeregnetAvkortingRequest(
+                forbehandling = forbehandling.id,
+                sisteIverksatteBehandling = sisteIverksatteBehandling.id,
+                aar = forbehandling.aar,
+                sakId = sisteIverksatteBehandling.sak.id,
+            )
+        logger.info("Henter avkorting for forbehandling: $request")
+        return runBlocking {
+            beregningKlient.hentAvkortingForForbehandlingEtteroppgjoer(
+                request,
+                brukerTokenInfo,
+            )
+        }
+    }
+
     private fun kopierOgLagreNyForbehandling(forbehandling: EtteroppgjoerForbehandling): EtteroppgjoerForbehandling {
+        val sisteIverksatteBehandling =
+            behandlingService.hentSisteIverksatte(forbehandling.sak.id)
+                ?: throw InternfeilException("Fant ikke siste iverksatte")
+
         val forbehandlingCopy =
             forbehandling.copy(
                 id = UUID.randomUUID(),
                 status = EtteroppgjoerForbehandlingStatus.OPPRETTET,
                 opprettet = Tidspunkt.now(), // ny dato
                 kopiertFra = forbehandling.id,
+                sisteIverksatteBehandlingId = sisteIverksatteBehandling.id,
             )
 
         dao.lagreForbehandling(forbehandlingCopy)
diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/EtteroppgjoerJobService.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/EtteroppgjoerJobService.kt
index 47d43a41fdd..20520aa7fb6 100644
--- a/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/EtteroppgjoerJobService.kt
+++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/EtteroppgjoerJobService.kt
@@ -4,10 +4,12 @@ import kotlinx.coroutines.DelicateCoroutinesApi
 import kotlinx.coroutines.newSingleThreadContext
 import kotlinx.coroutines.runBlocking
 import no.nav.etterlatte.behandling.etteroppgjoer.EtteroppgjoerService
+import no.nav.etterlatte.behandling.etteroppgjoer.EtteroppgjoerStatus
 import no.nav.etterlatte.behandling.etteroppgjoer.EtteroppgjoerToggles
 import no.nav.etterlatte.behandling.etteroppgjoer.forbehandling.EtteroppgjoerForbehandlingService
-import no.nav.etterlatte.behandling.etteroppgjoer.sigrun.SkatteoppgjoerHendelserService
+import no.nav.etterlatte.behandling.klienter.VedtakKlient
 import no.nav.etterlatte.funksjonsbrytere.FeatureToggleService
+import no.nav.etterlatte.libs.ktor.token.HardkodaSystembruker
 import org.slf4j.LoggerFactory
 import java.time.YearMonth
 
@@ -15,7 +17,7 @@ import java.time.YearMonth
 class EtteroppgjoerJobService(
     private val etteroppgjoerService: EtteroppgjoerService,
     private val etteroppgjoerForbehandlingService: EtteroppgjoerForbehandlingService,
-    private val skatteoppgjoerHendelserService: SkatteoppgjoerHendelserService,
+    private val vedtakKlient: VedtakKlient,
     private val featureToggleService: FeatureToggleService,
 ) {
     private val logger = LoggerFactory.getLogger(this::class.java)
@@ -26,31 +28,63 @@ class EtteroppgjoerJobService(
             runBlocking(ctx) {
                 if (featureToggleService.isEnabled(EtteroppgjoerToggles.ETTEROPPGJOER_PERIODISK_JOBB, false)) {
                     logger.info("Starter periodiske jobber for etteroppgjoer")
-                    startEtteroppgjoerKjoering(etteroppgjoerService, etteroppgjoerForbehandlingService, skatteoppgjoerHendelserService)
+                    startEtteroppgjoerKjoering()
                 } else {
                     logger.info("Periodisk jobber for etteroppgjoer er deaktivert")
                 }
             }
         }
     }
-}
 
-internal fun startEtteroppgjoerKjoering(
-    etteroppgjoerService: EtteroppgjoerService,
-    etteroppgjoerForbehandlingService: EtteroppgjoerForbehandlingService,
-    skatteoppgjoerHendelserService: SkatteoppgjoerHendelserService,
-) {
-    val yearNow = YearMonth.now().year
-    val aarMellom2024OgNaa = (2024..yearNow).toList()
+    fun startEtteroppgjoerKjoering() {
+        val yearNow = YearMonth.now().year
+        val aarMellom2024OgNaa = (2024..yearNow).toList()
+
+        for (inntektsaar in aarMellom2024OgNaa) {
+            finnOgOpprettEtteroppgjoer(inntektsaar)
+
+            // TODO: legge inn denne når vi har testet litt mer?
+            // skatteoppgjoerHendelserService.startHendelsesKjoering(HendelseKjoeringRequest(500),"automatisk")
+
+            finnOgOpprettForbehandlinger(inntektsaar)
+        }
+    }
+
+    // finn saker med etteroppgjoer og mottatt skatteoppgjoer som skal ha forbehandling
+    fun finnOgOpprettForbehandlinger(inntektsaar: Int) {
+        logger.info(
+            "Starter oppretting av forbehandling for etteroppgjør med mottatt skatteoppgjør for inntektsår $inntektsaar",
+        )
+        val etteroppgjoerListe =
+            etteroppgjoerService.hentEtteroppgjoerForStatus(EtteroppgjoerStatus.MOTTATT_SKATTEOPPGJOER, inntektsaar)
 
-    val antallHendelser = 500
+        for (etteroppgjoer in etteroppgjoerListe) {
+            try {
+                etteroppgjoerForbehandlingService.opprettEtteroppgjoerForbehandling(
+                    etteroppgjoer.sakId,
+                    etteroppgjoer.inntektsaar,
+                    HardkodaSystembruker.etteroppgjoer,
+                )
+            } catch (e: Exception) {
+                logger.error("Kunne ikke opprette forbehandling for sakId=${etteroppgjoer.sakId} grunnen: ${e.message}")
+            }
+        }
+    }
 
-    for (inntektsaar in aarMellom2024OgNaa) {
-        etteroppgjoerService.finnOgOpprettEtteroppgjoer(inntektsaar)
+    // finn saker som skal ha etteroppgjør for inntektsår og opprett etteroppgjør
+    fun finnOgOpprettEtteroppgjoer(inntektsaar: Int) {
+        logger.info("Starter oppretting av etteroppgjør for inntektsår $inntektsaar")
+        val sakerMedUtbetaling =
+            runBlocking {
+                vedtakKlient.hentSakerMedUtbetalingForInntektsaar(
+                    inntektsaar,
+                    HardkodaSystembruker.etteroppgjoer,
+                )
+            }
 
-        // TODO: legge inn denne når vi har testet litt mer?
-        // skatteoppgjoerHendelserService.startHendelsesKjoering(HendelseKjoeringRequest(500),"automatisk")
+        sakerMedUtbetaling
+            .forEach { sakId -> etteroppgjoerService.opprettEtteroppgjoer(sakId, inntektsaar) }
 
-        etteroppgjoerForbehandlingService.finnOgOpprettForbehandlinger(inntektsaar)
+        logger.info("Opprettet totalt ${sakerMedUtbetaling.size} etteroppgjoer for inntektsaar=$inntektsaar")
     }
 }
diff --git a/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt b/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt
index 90f8bf2b1aa..9fcbd24c95b 100644
--- a/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt
+++ b/apps/etterlatte-behandling/src/main/kotlin/config/ApplicationContext.kt
@@ -733,7 +733,7 @@ internal class ApplicationContext(
         EtteroppgjoerJobService(
             etteroppgjoerService,
             etteroppgjoerForbehandlingService,
-            skatteoppgjoerHendelserService,
+            vedtakKlient,
             featureToggleService,
         )
 
diff --git a/apps/etterlatte-behandling/src/main/resources/db/migration/V266__legge_til_siste_iverksatte_behandling_for_forbehandling.sql b/apps/etterlatte-behandling/src/main/resources/db/migration/V266__legge_til_siste_iverksatte_behandling_for_forbehandling.sql
new file mode 100644
index 00000000000..f018141f62b
--- /dev/null
+++ b/apps/etterlatte-behandling/src/main/resources/db/migration/V266__legge_til_siste_iverksatte_behandling_for_forbehandling.sql
@@ -0,0 +1,2 @@
+ALTER TABLE etteroppgjoer_behandling
+    ADD COLUMN siste_iverksatte_behandling UUID;
\ No newline at end of file
diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/etteroppgjoer/EtteroppgjoerForbehandlingDaoTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/etteroppgjoer/EtteroppgjoerForbehandlingDaoTest.kt
index 81b1ce9f65e..f7f79341a21 100644
--- a/apps/etterlatte-behandling/src/test/kotlin/behandling/etteroppgjoer/EtteroppgjoerForbehandlingDaoTest.kt
+++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/etteroppgjoer/EtteroppgjoerForbehandlingDaoTest.kt
@@ -87,6 +87,7 @@ class EtteroppgjoerForbehandlingDaoTest(
                 brevId = null,
                 innvilgetPeriode = Periode(YearMonth.of(2024, 1), YearMonth.of(2024, 12)),
                 kopiertFra = kopiertFra,
+                sisteIverksatteBehandlingId = UUID.randomUUID(),
             )
 
         etteroppgjoerForbehandlingDao.lagreForbehandling(ny)
@@ -114,6 +115,7 @@ class EtteroppgjoerForbehandlingDaoTest(
                 brevId = null,
                 innvilgetPeriode = Periode(YearMonth.of(2024, 1), YearMonth.of(2024, 12)),
                 kopiertFra = UUID.randomUUID(),
+                sisteIverksatteBehandlingId = UUID.randomUUID(),
             ),
         )
         etteroppgjoerForbehandlingDao.lagreForbehandling(
@@ -127,6 +129,7 @@ class EtteroppgjoerForbehandlingDaoTest(
                 brevId = null,
                 innvilgetPeriode = Periode(YearMonth.of(2024, 1), YearMonth.of(2024, 12)),
                 kopiertFra = null,
+                sisteIverksatteBehandlingId = UUID.randomUUID(),
             ),
         )
 


Reviews:
user: login: oyvindsh
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T12:24:23Z
user: login: oyvindsh
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T12:27:50Z
user: login: oyvindsh
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T12:28:08Z
user: login: andreasbalevik
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-08T14:41:19Z

Review comments:
diff_hunk: @@ -21,13 +21,14 @@ data class EtteroppgjoerForbehandling(
     val aar: Int,
     val innvilgetPeriode: Periode,
     val brevId: Long?,
-    // hvis vi oppretter en kopi av forbehandling for å bruke i en revurdering
-    val kopiertFra: UUID? = null,
+    val kopiertFra: UUID? = null, // hvis vi oppretter en kopi av forbehandling for å bruke i en revurdering
+    val relatertBehandlingId: UUID, // siste iverksatte behandling når forbehandling ble opprettet
path: apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingModel.kt
user: login: oyvindsh
body: Jeg tenker vi kan kanskje bare kalle den `sistIverksatteBehandlingId`? 
created_at: 2025-05-08T12:24:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -71,9 +71,9 @@ class EtteroppgjoerForbehandlingDao(
                     prepareStatement(
                         """
                         INSERT INTO etteroppgjoer_behandling(
-                            id, status, sak_id, opprettet, aar, fom, tom, brev_id, kopiert_fra
+                            id, status, sak_id, opprettet, aar, fom, tom, brev_id, kopiert_fra, relatert_behandling_id
path: apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingDao.kt
user: login: oyvindsh
body: Jeg lurer på om vi trenger en on conflict oppdater denne id'en, siden vi i noen tilfeller nok vil endre på behandlingen vi peker på mens forbehandlingen er under arbeid. Men det er kanskje mer hensiktsmessig å se på dette mer overordnet på hva vi må gjøre hvis dette skjer. F.eks. kan vi jo varsle bruker om et etteroppgjør, kjøre igjennom en annen revurdering mens vi venter på svar, og så må vi forholde oss til den nye revurderingen på en eller annen måte før vi bare kan dunke igjennom etteroppgjøret.
created_at: 2025-05-08T12:27:50Z
author_association: CONTRIBUTOR
diff_hunk: @@ -71,9 +71,9 @@ class EtteroppgjoerForbehandlingDao(
                     prepareStatement(
                         """
                         INSERT INTO etteroppgjoer_behandling(
-                            id, status, sak_id, opprettet, aar, fom, tom, brev_id, kopiert_fra
+                            id, status, sak_id, opprettet, aar, fom, tom, brev_id, kopiert_fra, relatert_behandling_id
path: apps/etterlatte-behandling/src/main/kotlin/behandling/etteroppgjoer/forbehandling/EtteroppgjoerForbehandlingDao.kt
user: login: andreasbalevik
body: Hvis det er en mismatch kan vi varsle saksbehandler i gui og gi mulighet til å trykke på knapp oppdatere til siste iverksatte behandling. 
created_at: 2025-05-08T14:41:19Z
author_association: CONTRIBUTOR

PR comments:
user: login: perkynades
created_at: 2025-05-08T11:20:52Z
body: Tror vi generelt har brukt `referanse` som navn på feltet for å referere videre til relevante behandlinger. Her har kanskje også @oyvindsh noen meninger
author_association: CONTRIBUTOR
user: login: oyvindsh
created_at: 2025-05-08T12:29:30Z
body: > Tror vi generelt har brukt `referanse` som navn på feltet for å referere videre til relevante behandlinger. Her har kanskje også @oyvindsh noen meninger

Som nevnt over tenker jeg vi kan gå for et ganske presist navn her, siden feltet har en veldig konkret tolkning / betydning. 

En ting jeg kom på her er at vi sliter nok med data i dev når vi tar ut denne endringen -- kanskje vi er moden for å rydde bort det vi har i etteroppgjør forbehandling-tabellen?
author_association: CONTRIBUTOR