Skip to content

Commit

Permalink
legg til endepunkt for å patche ident på fagsak som ikke har behandli…
Browse files Browse the repository at this point in the history
…ng (#5085)

### 💰 Hva skal gjøres, og hvorfor?

[Favro](https://favro.com/organization/98c34fb974ce445eac854de0/1844bbac3b6605eacc8f5543?card=NAV-24063)
Vi har mange fagsaker i prod som ikke har noen behandlinger på seg.
Disse har ofte feil identer og kan skape trøbbel i fremtiden. Ønsker å
gå gjennom alle og patche identene.

Legger til to midlertidige endepunkter ett for å finne fagsaker som må
oppdateres og ett for å faktisk oppdatere de. Da har vi kontroll på
hvilke og hvor mange vi tar om gangen osv. Fjerner endepunktene når
jobben er gjort

### ✅ Checklist
_Har du husket alle punktene i listen?_
- [ ] Jeg har testet mine endringer i henhold til akseptansekriteriene
🕵️
- [ ] Jeg har config- eller sql-endringer. I så fall, husk manuell
deploy til miljø for å verifisere endringene.
- [ ] Jeg har skrevet tester. Hvis du ikke har skrevet tester, beskriv
hvorfor under 👇

_Jeg har ikke skrevet tester fordi:_
Har testet i dev og koden skal slettes i fremtiden da den ikke trengs

---------

Signed-off-by: FredrikP <[email protected]>
  • Loading branch information
fredrikpf authored Feb 20, 2025
1 parent 01d0513 commit 68b2f21
Show file tree
Hide file tree
Showing 8 changed files with 236 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import no.nav.familie.ba.sak.kjerne.autovedtak.satsendring.domene.SatskjøringRe
import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService
import no.nav.familie.ba.sak.kjerne.fagsak.FagsakService
import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.PersongrunnlagService
import no.nav.familie.ba.sak.kjerne.personident.PersonidentService
import no.nav.familie.ba.sak.sikkerhet.TilgangService
import no.nav.familie.ba.sak.statistikk.stønadsstatistikk.StønadsstatistikkService
import no.nav.familie.ba.sak.task.GrensesnittavstemMotOppdrag
Expand Down Expand Up @@ -86,6 +87,7 @@ class ForvalterController(
private val stønadsstatistikkService: StønadsstatistikkService,
private val persongrunnlagService: PersongrunnlagService,
private val hentAlleIdenterTilPsysTask: HentAlleIdenterTilPsysTask,
private val personidentService: PersonidentService,
) {
private val logger: Logger = LoggerFactory.getLogger(ForvalterController::class.java)

Expand Down Expand Up @@ -238,6 +240,34 @@ class ForvalterController(
return ResponseEntity.ok("ok")
}

@PatchMapping("/patch-fagsaker-uten-behandling-med-ny-ident")
fun patchFagsakerUtenBehandlingMedNyIdent(
@RequestBody fagsakIder: Set<Long>,
): ResponseEntity<String> {
tilgangService.verifiserHarTilgangTilHandling(
minimumBehandlerRolle = BehandlerRolle.FORVALTER,
handling = "Patch merget ident",
)

fagsakIder.forEach { fagsakId ->
opprettTaskService.opprettTaskForÅPatcheIdentPåFagsakUtenBehandling(fagsakId)
}
return ResponseEntity.ok("ok")
}

@GetMapping("/hent-fagsaker-uten-behandling-med-utdatert-ident")
fun hentFagsakerUtenBehandlingMedUtdatertIdent(): ResponseEntity<Set<Long>> {
tilgangService.verifiserHarTilgangTilHandling(
minimumBehandlerRolle = BehandlerRolle.FORVALTER,
handling = "Patch merget ident",
)

val fagsakerSomMåOppdateres =
personidentService.finnFagsakerUtenBehandlingMedUtdatertIdent()

return ResponseEntity.ok(fagsakerSomMåOppdateres.toSet())
}

@PostMapping("/behandling/{behandlingId}/manuell-kvittering")
@ApiResponses(
value = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,4 +222,14 @@ WHERE silp.stonad_tom < DATE_TRUNC('month', NOW())
nativeQuery = true,
)
fun finnFagsakerMedFlereMigreringsbehandlinger(month: LocalDateTime): List<FagsakMedFlereMigreringer>

@Query(
"""
SELECT f
FROM Fagsak f where not exists(select 1
from Behandling b
where b.fagsak.id = f.id)
""",
)
fun finnFagsakerUtenBehandling(): Set<Fagsak>
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import no.nav.familie.ba.sak.integrasjoner.pdl.PdlIdentRestClient
import no.nav.familie.ba.sak.integrasjoner.pdl.domene.IdentInformasjon
import no.nav.familie.ba.sak.integrasjoner.pdl.domene.hentAktivAktørId
import no.nav.familie.ba.sak.integrasjoner.pdl.domene.hentAktivFødselsnummer
import no.nav.familie.ba.sak.kjerne.fagsak.FagsakRepository
import no.nav.familie.kontrakter.felles.PersonIdent
import no.nav.person.pdl.aktor.v2.Type
import org.slf4j.LoggerFactory
Expand All @@ -21,6 +22,7 @@ class PersonidentService(
private val aktørIdRepository: AktørIdRepository,
private val pdlIdentRestClient: PdlIdentRestClient,
private val taskRepository: TaskRepositoryWrapper,
private val fagsakRepository: FagsakRepository,
) {
fun hentIdenter(
personIdent: String,
Expand Down Expand Up @@ -159,6 +161,18 @@ class PersonidentService(
return aktør
}

fun finnFagsakerUtenBehandlingMedUtdatertIdent(): Set<Long> {
val fagsaker = fagsakRepository.finnFagsakerUtenBehandling()
val fagsakerSomMåOppdateres =
fagsaker
.filter { fagsak ->
val identerFraPdl = pdlIdentRestClient.hentIdenter(fagsak.aktør.aktivFødselsnummer(), historikk = true)
val aktivIdentFraPdl = identerFraPdl.hentAktivFødselsnummer()
aktivIdentFraPdl != fagsak.aktør.aktivFødselsnummer()
}.map { it.id }
return fagsakerSomMåOppdateres.toSet()
}

companion object {
val logger = LoggerFactory.getLogger(PersonidentService::class.java)
}
Expand Down
13 changes: 13 additions & 0 deletions src/main/kotlin/no/nav/familie/ba/sak/task/OpprettTaskService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,19 @@ class OpprettTaskService(
),
)

@Transactional
fun opprettTaskForÅPatcheIdentPåFagsakUtenBehandling(fagsakId: Long) =
taskRepository.save(
Task(
type = PatchIdentFagsakUtenBehandling.TASK_STEP_TYPE,
payload = objectMapper.writeValueAsString(fagsakId),
properties =
Properties().apply {
this["fagsakId"] = fagsakId.toString()
},
),
)

@Transactional
fun opprettTaskForÅPatcheVilkårFom(
dto: PatchFomPåVilkårTilFødselsdato,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package no.nav.familie.ba.sak.task

import no.nav.familie.ba.sak.common.secureLogger
import no.nav.familie.ba.sak.integrasjoner.pdl.PdlIdentRestClient
import no.nav.familie.ba.sak.integrasjoner.pdl.domene.hentAktivAktørId
import no.nav.familie.ba.sak.integrasjoner.pdl.domene.hentAktivFødselsnummer
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingRepository
import no.nav.familie.ba.sak.kjerne.fagsak.FagsakRepository
import no.nav.familie.ba.sak.kjerne.personident.AktørIdRepository
import no.nav.familie.ba.sak.kjerne.personident.AktørMergeLogg
import no.nav.familie.ba.sak.kjerne.personident.AktørMergeLoggRepository
import no.nav.familie.ba.sak.kjerne.personident.PersonidentRepository
import no.nav.familie.ba.sak.kjerne.personident.PersonidentService
import no.nav.familie.kontrakter.felles.objectMapper
import no.nav.familie.prosessering.AsyncTaskStep
import no.nav.familie.prosessering.TaskStepBeskrivelse
import no.nav.familie.prosessering.domene.Task
import org.springframework.stereotype.Service
import java.time.LocalDateTime

@Service
@TaskStepBeskrivelse(
taskStepType = PatchIdentFagsakUtenBehandling.TASK_STEP_TYPE,
beskrivelse = "Patcher ident på fagsak uten behandling hvis identen er utdatert",
maxAntallFeil = 1,
settTilManuellOppfølgning = true,
)
class PatchIdentFagsakUtenBehandling(
private val fagsakRepository: FagsakRepository,
private val behandlingRepository: BehandlingRepository,
private val pdlIdentRestClient: PdlIdentRestClient,
private val personidentRepository: PersonidentRepository,
private val aktørIdRepository: AktørIdRepository,
private val personidentService: PersonidentService,
private val aktørMergeLoggRepository: AktørMergeLoggRepository,
) : AsyncTaskStep {
override fun doTask(task: Task) {
val fagsakId = objectMapper.readValue(task.payload, Long::class.java)

// Valider at fagsak ikke har behandlinger
val behandlingerPåFagsak = behandlingRepository.finnBehandlinger(fagsakId)
if (behandlingerPåFagsak.isNotEmpty()) {
throw IllegalArgumentException("Fagsak $fagsakId har behandlinger og burde patches på en annen måte")
}

// Valider at identen på fagsaken er utdatert
val fagsak = fagsakRepository.finnFagsak(fagsakId) ?: throw IllegalArgumentException("Fagsak $fagsakId eksisterer ikke")
val aktivPersonIdent = fagsak.aktør.aktivFødselsnummer()

val identInformasjonFraPdl = pdlIdentRestClient.hentIdenter(personIdent = aktivPersonIdent, historikk = true)
val erIdentPåFagsakAjourMedPdl =
identInformasjonFraPdl.none { identFraPdl ->
identFraPdl.historisk && identFraPdl.ident == aktivPersonIdent
}
if (erIdentPåFagsakAjourMedPdl) {
return
}

secureLogger.info("Patcher aktør med id ${fagsak.aktør.aktørId} på fagsak $fagsakId")
val nyPersonIdent = identInformasjonFraPdl.hentAktivFødselsnummer()

val personidentNyttFødselsnummer = personidentRepository.findByFødselsnummerOrNull(nyPersonIdent)
if (personidentNyttFødselsnummer != null) error("Fant allerede en personident for nytt fødselsnummer")

// Patch hvis utdatert - trekk ut funksjonalitet fra PatchMergetIdentTask
// Denne patcher med å bruke on cascade update på aktørid
val eksisterendeAktørPåFagsak = fagsak.aktør.aktørId
aktørIdRepository.patchAktørMedNyAktørId(
gammelAktørId = eksisterendeAktørPåFagsak,
nyAktørId = identInformasjonFraPdl.hentAktivAktørId(),
)

// Etter at alle fk_aktoer_id har blitt oppgradert alle steder, så vil personident ha det gamle fødselsnummeret.
// Ved å kalle hentOgLagre, så vil den gamle personidenten-raden bli deaktivert og ny med riktig fødselsnummer
// vil bli oppdatert
val nyAktør = personidentService.hentOgLagreAktør(ident = nyPersonIdent, lagre = true)

aktørMergeLoggRepository.save(
AktørMergeLogg(
fagsakId = fagsakId,
historiskAktørId = eksisterendeAktørPåFagsak,
nyAktørId = nyAktør.aktørId,
mergeTidspunkt = LocalDateTime.now(),
),
)
}

companion object {
const val TASK_STEP_TYPE = "PatchIdentFagsakUtenBehandling"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,7 @@ internal class HåndterNyIdentServiceTest {
aktørIdRepository = aktørIdRepository,
pdlIdentRestClient = pdlIdentRestClient,
taskRepository = taskRepositoryMock,
fagsakRepository = mockk(),
)

private val håndterNyIdentService =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ internal class PersonidentServiceTest {
aktørIdRepository = aktørIdRepository,
pdlIdentRestClient = pdlIdentRestClient,
taskRepository = taskRepositoryMock,
fagsakRepository = mockk(),
)

@BeforeAll
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package no.nav.familie.ba.sak.kjerne.personident

import io.mockk.every
import io.mockk.mockk
import no.nav.familie.ba.sak.config.AbstractSpringIntegrationTest
import no.nav.familie.ba.sak.config.TaskRepositoryWrapper
import no.nav.familie.ba.sak.config.tilAktør
import no.nav.familie.ba.sak.datagenerator.lagBehandlingUtenId
import no.nav.familie.ba.sak.datagenerator.lagFagsakUtenId
import no.nav.familie.ba.sak.datagenerator.randomFnr
import no.nav.familie.ba.sak.integrasjoner.pdl.PdlIdentRestClient
import no.nav.familie.ba.sak.integrasjoner.pdl.domene.IdentInformasjon
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingRepository
import no.nav.familie.ba.sak.kjerne.fagsak.FagsakRepository
import no.nav.familie.ba.sak.kjerne.fagsak.FagsakService
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired

class PersonIdentServiceIntegrasjonsTest(
@Autowired
private val aktørIdRepository: AktørIdRepository,
@Autowired
private val behandlingRepository: BehandlingRepository,
@Autowired
private val fagsakService: FagsakService,
@Autowired
private val personidentRepository: PersonidentRepository,
@Autowired
private val taskRepository: TaskRepositoryWrapper,
@Autowired
private val fagsakRepository: FagsakRepository,
) : AbstractSpringIntegrationTest() {
private val pdlIdentRestClient: PdlIdentRestClient = mockk()

val personIdentService =
PersonidentService(
personidentRepository = personidentRepository,
aktørIdRepository = aktørIdRepository,
pdlIdentRestClient = pdlIdentRestClient,
taskRepository = taskRepository,
fagsakRepository = fagsakRepository,
)

@Test
fun `hentFagsakerUtenBehandlingMedUtdatertIdent henter kun ut fagsaker som har utdatert ident`() {
// Arrange
val utdatertAktør = tilAktør(randomFnr())
val oppdatertAktør = tilAktør(randomFnr())
val aktørPåFagsakMedBehandling = tilAktør(randomFnr())
aktørIdRepository.saveAll(listOf(utdatertAktør, oppdatertAktør, aktørPåFagsakMedBehandling))

val identInformasjonFraPdl =
listOf(
IdentInformasjon(oppdatertAktør.aktørId, false, "AKTORID"),
IdentInformasjon(oppdatertAktør.aktivFødselsnummer(), false, "FOLKEREGISTERIDENT"),
IdentInformasjon(utdatertAktør.aktørId, true, "AKTORID"),
IdentInformasjon(utdatertAktør.aktivFødselsnummer(), true, "FOLKEREGISTERIDENT"),
)

val fagsakSomHarUtdatertAktør = fagsakService.lagre(lagFagsakUtenId(aktør = utdatertAktør))
val fagsakSomHarOppdatertAktør = fagsakService.lagre(lagFagsakUtenId(aktør = oppdatertAktør))
val fagsakSomHarBehandling = fagsakService.lagre(lagFagsakUtenId(aktør = aktørPåFagsakMedBehandling))

behandlingRepository.save(lagBehandlingUtenId(fagsak = fagsakSomHarBehandling))

every { pdlIdentRestClient.hentIdenter(utdatertAktør.aktivFødselsnummer(), historikk = true) } returns identInformasjonFraPdl
every { pdlIdentRestClient.hentIdenter(oppdatertAktør.aktivFødselsnummer(), historikk = true) } returns identInformasjonFraPdl

// Act
val faktiskeFagsakIder = personIdentService.finnFagsakerUtenBehandlingMedUtdatertIdent()

// Assert
assertThat(faktiskeFagsakIder).isEqualTo(setOf(fagsakSomHarUtdatertAktør.id))
}
}

0 comments on commit 68b2f21

Please sign in to comment.