Skip to content

Commit

Permalink
Fix: punsj-oppgaver kode7 (#2572)
Browse files Browse the repository at this point in the history
* Fix: punsj-oppgaver kode7

* død kode

* import

* håndter null

* håndter null
  • Loading branch information
tendestad authored Aug 28, 2024
1 parent 58643f4 commit 1a23dbc
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import no.nav.k9.los.integrasjon.rest.NavHeaders
import no.nav.k9.los.utils.Cache
import no.nav.k9.los.utils.CacheObject
import no.nav.k9.los.utils.LosObjectMapper
import no.nav.k9.sak.typer.AktørId
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.time.Duration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ class K9PunsjTilLosAdapterTjeneste(
spillAvBehandlingProsessEventer()
}
}

private fun schedulerAvspilling() {
log.info("Schedulerer avspilling av BehandlingProsessEventer til å kjøre 3m fra nå, hver time")
timer(
Expand Down Expand Up @@ -109,8 +110,7 @@ class K9PunsjTilLosAdapterTjeneste(
val oppgave = oppgaveV3Tjeneste.sjekkDuplikatOgProsesser(oppgaveDto, tx)

if (oppgave != null) {
// TODO: Kallet under fungerer ikke, siden den er avhengig av feltverdi 'saksnummer'. Vurder om skal endres eller slettes.
// pepCacheService.oppdater(tx, oppgave.kildeområde, oppgave.eksternId)
pepCacheService.oppdater(tx, oppgave.kildeområde, oppgave.eksternId)

annullerReservasjonHvisPåVentEllerAvsluttet(oppgave, tx)
// Flere tilfeller som skal håndteres her?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class OppgavetypeRepository(

fun hentOppgavetype(område: Område, eksternId: String, tx: TransactionalSession): Oppgavetype {
return hent(område, tx).oppgavetyper.find { it.eksternId == eksternId }
?: throw IllegalArgumentException("Finner ikke oppgavetype: ${eksternId} for område: ${område}")
?: throw IllegalArgumentException("Finner ikke oppgavetype: ${eksternId} for område: ${område.eksternId}")
}

fun hentOppgavetype(område: String, oppgavetypeId: Long, tx: TransactionalSession): Oppgavetype {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,9 @@ class PepCacheService(
private val pepClient: IPepClient,
private val pepCacheRepository: PepCacheRepository,
private val oppgaveRepository: OppgaveRepository,
private val transactionalManager: TransactionalManager,
private val transactionalManager: TransactionalManager
) {

suspend fun hentOgOppdaterVedBehov(tx: TransactionalSession, oppgave: Oppgave, maksimalAlder: Duration = Duration.ofMinutes(30)): PepCache {
return pepCacheRepository.hent(kildeområde = oppgave.kildeområde, eksternId = oppgave.eksternId, tx).let { pepCache ->
if (pepCache?.erGyldig(maksimalAlder) != true) {
oppdater(tx, oppgave)
} else {
pepCache
}
}
}

@WithSpan
fun oppdaterCacheForÅpneOgVentendeOppgaverEldreEnn(gyldighet: Duration = Duration.ofHours(23)) {
oppdaterCacheForOppgaverMedStatusEldreEnn(gyldighet, setOf(Oppgavestatus.VENTER, Oppgavestatus.AAPEN))
Expand Down Expand Up @@ -85,20 +75,20 @@ class PepCacheService(
)

val saksnummer = oppgave.hentVerdi(oppgave.kildeområde, "saksnummer")
return if (saksnummer != null){
return if (saksnummer != null) {
pep.oppdater(saksnummer)
} else {
val aktører = validerMinstEn(hentAktører(oppgave))
val aktører = hentAktører(oppgave)
pep.oppdater(aktører)
}
}

private suspend fun PepCache.oppdater(saksnummer: String): PepCache {
return coroutineScope {
val kode6Request = async (Span.current().asContextElement()) {
val kode6Request = async(Span.current().asContextElement()) {
pepClient.erSakKode6(fagsakNummer = saksnummer)
}
val kode7EllerEgenAnsattRequest = async (Span.current().asContextElement()) {
val kode7EllerEgenAnsattRequest = async(Span.current().asContextElement()) {
pepClient.erSakKode7EllerEgenAnsatt(fagsakNummer = saksnummer)
}
val kode7EllerEgenAnsatt = kode7EllerEgenAnsattRequest.await()
Expand All @@ -113,50 +103,44 @@ class PepCacheService(
}

private suspend fun PepCache.oppdater(aktører: List<AktørId>): PepCache {
if (aktører.isEmpty()){
return oppdater(kode6 = false, kode7 = false, egenAnsatt = false)
}
return coroutineScope {
val kode6Request = aktører.map {
async (Span.current().asContextElement()) {
async(Span.current().asContextElement()) {
pepClient.erAktørKode6(it.aktørId)
}
}
val kode7EllerEgenAnsattRequest = aktører.map {
async (Span.current().asContextElement()) {
pepClient.erSakKode7EllerEgenAnsatt(it.aktørId)
async(Span.current().asContextElement()) {
pepClient.erAktørKode7EllerEgenAnsatt(it.aktørId)
}
}

val minsteEnKode6 = kode6Request
.map { it.await() }
.reduce {a, b -> a || b}
.reduce { a, b -> a || b }
val minsteEnKode7EllerEgenAnsatt = kode7EllerEgenAnsattRequest
.map { it.await() }
.reduce {a, b -> a || b}

val oppdatertPepCache = oppdater(
.reduce { a, b -> a || b }
oppdater(
kode6 = minsteEnKode6,
kode7 = minsteEnKode7EllerEgenAnsatt,
egenAnsatt = minsteEnKode7EllerEgenAnsatt,
)
oppdatertPepCache
}
}

private fun <E, T : Collection<E>> validerMinstEn(input : T) : T {
if (input.isEmpty() ){
throw IllegalArgumentException("Forventet minst ett element, fikk ingen")
}
return input
}

private fun hentAktører(oppgave: Oppgave) : List<AktørId> {
private fun hentAktører(oppgave: Oppgave): List<AktørId> {
return listOfNotNull(
oppgave.hentVerdi(oppgave.kildeområde, "aktorId"),
oppgave.hentVerdi(oppgave.kildeområde, "pleietrengendeAktorId"),
oppgave.hentVerdi(oppgave.kildeområde, "relatertPartAktorid")
).map { AktørId(it) }
}

private data class AktørId(val aktørId: String)

private data class AktørId (val aktørId: String)
}

4 changes: 3 additions & 1 deletion src/test/kotlin/no/nav/k9/los/KoinModules.kt
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ import javax.sql.DataSource

fun buildAndTestConfig(dataSource: DataSource, pepClient: IPepClient = PepClientLocal()): Module = module {

val config = mockk<Configuration>()

single(named("oppgaveKøOppdatert")) {
Channel<UUID>(Channel.UNLIMITED)
}
Expand Down Expand Up @@ -152,7 +154,7 @@ fun buildAndTestConfig(dataSource: DataSource, pepClient: IPepClient = PepClient
saksbehandlerRepository = get()
)
}
val config = mockk<Configuration>()

single {
config
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import io.mockk.verify
import kotlinx.coroutines.runBlocking
import no.nav.helse.dusseldorf.ktor.jackson.dusseldorfConfigured
import no.nav.k9.los.AbstractPostgresTest
import no.nav.k9.los.Configuration
import no.nav.k9.los.aksjonspunktbehandling.K9punsjEventHandler
import no.nav.k9.los.aksjonspunktbehandling.K9sakEventHandler
import no.nav.k9.los.buildAndTestConfig
import no.nav.k9.los.domene.lager.oppgave.v2.TransactionalManager
Expand All @@ -19,8 +21,11 @@ import no.nav.k9.los.integrasjon.abac.Action
import no.nav.k9.los.integrasjon.abac.IPepClient
import no.nav.k9.los.integrasjon.kafka.dto.BehandlingProsessEventDto
import no.nav.k9.los.integrasjon.kafka.dto.EventHendelse
import no.nav.k9.los.integrasjon.kafka.dto.PunsjEventDto
import no.nav.k9.los.integrasjon.kafka.dto.PunsjId
import no.nav.k9.los.nyoppgavestyring.FeltType
import no.nav.k9.los.nyoppgavestyring.domeneadaptere.k9.OmrådeSetup
import no.nav.k9.los.nyoppgavestyring.domeneadaptere.k9.punsjtillos.K9PunsjTilLosAdapterTjeneste
import no.nav.k9.los.nyoppgavestyring.domeneadaptere.k9.saktillos.K9SakTilLosAdapterTjeneste
import no.nav.k9.los.nyoppgavestyring.kodeverk.BeskyttelseType
import no.nav.k9.los.nyoppgavestyring.query.OppgaveQueryService
Expand All @@ -31,6 +36,8 @@ import no.nav.k9.los.nyoppgavestyring.query.dto.query.FeltverdiOppgavefilter
import no.nav.k9.los.nyoppgavestyring.query.dto.query.OppgaveQuery
import no.nav.k9.los.nyoppgavestyring.query.mapping.OppgavefilterUtvider
import no.nav.k9.los.nyoppgavestyring.visningoguttrekk.OppgaveRepository
import no.nav.k9.sak.typer.AktørId
import no.nav.k9.sak.typer.JournalpostId
import org.intellij.lang.annotations.Language
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
Expand Down Expand Up @@ -67,6 +74,8 @@ class PepCacheServiceTest : KoinTest, AbstractPostgresTest() {
områdeSetup.setup()
val k9SakTilLosAdapterTjeneste = get<K9SakTilLosAdapterTjeneste>()
k9SakTilLosAdapterTjeneste.setup()
val k9PunsjTilLosAdapterTjeneste = get<K9PunsjTilLosAdapterTjeneste>()
k9PunsjTilLosAdapterTjeneste.setup()
}

fun gjørSakKode6(saksnummer: String) {
Expand All @@ -83,6 +92,27 @@ class PepCacheServiceTest : KoinTest, AbstractPostgresTest() {
}
}

fun gjørAktørKode6(aktørId: String) {
runBlocking {
coEvery { pepClient.erAktørKode6(eq(aktørId)) } returns true
coEvery { pepClient.erAktørKode7EllerEgenAnsatt(eq(aktørId)) } returns false
}
}

fun gjørAktørKode7(aktørId: String) {
runBlocking {
coEvery { pepClient.erAktørKode6(eq(aktørId)) } returns false
coEvery { pepClient.erAktørKode7EllerEgenAnsatt(eq(aktørId)) } returns true
}
}

fun gjørAktørOrdinær(aktørId: String) {
runBlocking {
coEvery { pepClient.erAktørKode6(eq(aktørId)) } returns false
coEvery { pepClient.erAktørKode7EllerEgenAnsatt(eq(aktørId)) } returns false
}
}


@Test
fun `Alle ordinære eventer på K9sakEventHandler skal oppdatere pepcache for å alltid få med aktørendringer i sak`() {
Expand All @@ -101,6 +131,56 @@ class PepCacheServiceTest : KoinTest, AbstractPostgresTest() {
assertThat(pepCache.oppdatert).isGreaterThan(LocalDateTime.now().minusMinutes(1))
}

@Test
fun `Alle ordinære eventer på K9punsjEventHandler skal oppdatere pepcache for å alltid få med aktørendringer i sak`() {
val k9punsjEventHandler = get<K9punsjEventHandler>()
val pepRepository = get<PepCacheRepository>()

val aktørId = "1234567890123"
val eksternId = UUID.randomUUID().toString()
gjørAktørOrdinær(aktørId)
k9punsjEventHandler.prosesser(lagPunsjBehandlingprosessEventMedStatus(eksternId, aktørId))

val pepCache = pepRepository.hent("K9", eksternId)!!
assertThat(pepCache.kode6).isFalse()
assertThat(pepCache.kode7).isFalse()
assertThat(pepCache.egenAnsatt).isFalse()
assertThat(pepCache.oppdatert).isGreaterThan(LocalDateTime.now().minusMinutes(1))
}

@Test
fun `Eventer i K9punsjEventHandler med kode6 skal oppdatere pepcache`() {
val k9punsjEventHandler = get<K9punsjEventHandler>()
val pepRepository = get<PepCacheRepository>()

val aktørId = "1234567890123"
val eksternId = UUID.randomUUID().toString()
gjørAktørKode6(aktørId)
k9punsjEventHandler.prosesser(lagPunsjBehandlingprosessEventMedStatus(eksternId, aktørId))

val pepCache = pepRepository.hent("K9", eksternId)!!
assertThat(pepCache.kode6).isTrue()
assertThat(pepCache.kode7).isFalse()
assertThat(pepCache.egenAnsatt).isFalse()
assertThat(pepCache.oppdatert).isGreaterThan(LocalDateTime.now().minusMinutes(1))
}

@Test
fun `Eventer i K9punsjEventHandler med kode7 skal oppdatere pepcache`() {
val k9punsjEventHandler = get<K9punsjEventHandler>()
val pepRepository = get<PepCacheRepository>()

val aktørId = "1234567890123"
val eksternId = UUID.randomUUID().toString()
gjørAktørKode7(aktørId)
k9punsjEventHandler.prosesser(lagPunsjBehandlingprosessEventMedStatus(eksternId, aktørId))

val pepCache = pepRepository.hent("K9", eksternId)!!
assertThat(pepCache.kode6).isFalse()
assertThat(pepCache.kode7).isTrue()
assertThat(pepCache.oppdatert).isGreaterThan(LocalDateTime.now().minusMinutes(1))
}

@Test
fun `Eventer i K9sakEventHandler med kode6 skal oppdatere pepcache`() {
val k9sakEventHandler = get<K9sakEventHandler>()
Expand Down Expand Up @@ -280,6 +360,21 @@ class PepCacheServiceTest : KoinTest, AbstractPostgresTest() {
return objectMapper.readValue(json, BehandlingProsessEventDto::class.java)
}

private fun lagPunsjBehandlingprosessEventMedStatus(
eksternId: String,
aktørId: String,
eventTid: LocalDateTime = LocalDateTime.now(),
): PunsjEventDto {

return PunsjEventDto(
eksternId = UUID.fromString(eksternId),
journalpostId = JournalpostId("1"),
eventTid = eventTid,
aktørId = AktørId(aktørId),
aksjonspunktKoderMedStatusListe = mutableMapOf(),
)
}

private fun ventPåAntallForsøk(antall: Int, beskrivelse: String = "", f: () -> Boolean) {
for (i in 0..antall) {
Thread.sleep(500)
Expand Down

0 comments on commit 1a23dbc

Please sign in to comment.