diff --git a/src/main/kotlin/no/nav/syfo/prosesser/FinnAlleUtgaandeOppgaverProcessor.kt b/src/main/kotlin/no/nav/syfo/prosesser/FinnAlleUtgaandeOppgaverProcessor.kt index 5aba4fb93..7423bb634 100644 --- a/src/main/kotlin/no/nav/syfo/prosesser/FinnAlleUtgaandeOppgaverProcessor.kt +++ b/src/main/kotlin/no/nav/syfo/prosesser/FinnAlleUtgaandeOppgaverProcessor.kt @@ -12,8 +12,11 @@ import no.nav.syfo.dto.Tilstand import no.nav.syfo.repository.InntektsmeldingRepository import no.nav.syfo.service.BehandlendeEnhetConsumer import no.nav.syfo.util.Metrikk +import no.nav.syfo.utsattoppgave.BehandlingsKategori import no.nav.syfo.utsattoppgave.UtsattOppgaveDAO +import no.nav.syfo.utsattoppgave.hentInntektsmelding import no.nav.syfo.utsattoppgave.opprettOppgaveIGosys +import no.nav.syfo.utsattoppgave.utledBehandlingsKategori import org.slf4j.LoggerFactory import java.time.Duration import java.time.LocalDateTime @@ -32,37 +35,41 @@ class FinnAlleUtgaandeOppgaverProcessor( override fun doJob(): Unit = MdcUtils.withCallIdAsUuid { utsattOppgaveDAO .finnAlleUtgåtteOppgaver() - .mapNotNull { - val inntektsmeldingEntitet = inntektsmeldingRepository.findByUuid(it.inntektsmeldingId) - if (inntektsmeldingEntitet == null) { - sikkerlogger.error("Fant ikke inntektsmelding for utsatt oppgave: ${it.arkivreferanse}") - logger.error("Fant ikke inntektsmelding for utsatt oppgave: ${it.arkivreferanse}") - null - } else { - it to inntektsmeldingEntitet - } - } - .forEach { (oppgaveEntitet, inntektsmeldingEntitet) -> - try { - logger.info("Skal opprette oppgave for inntektsmelding: ${oppgaveEntitet.arkivreferanse}") - opprettOppgaveIGosys( - oppgaveEntitet, - oppgaveClient, - utsattOppgaveDAO, - behandlendeEnhetConsumer, - oppgaveEntitet.speil, - inntektsmeldingEntitet, - om - ) - oppgaveEntitet.tilstand = Tilstand.OpprettetTimeout - oppgaveEntitet.oppdatert = LocalDateTime.now() - metrikk.tellUtsattOppgave_OpprettTimeout() - utsattOppgaveDAO.lagre(oppgaveEntitet) - logger.info("Oppgave opprettet i gosys pga timeout for inntektsmelding: ${oppgaveEntitet.arkivreferanse}") - } catch (e: OpprettOppgaveException) { - sikkerlogger.error("Feilet ved opprettelse av oppgave ved timeout i gosys for inntektsmelding: ${oppgaveEntitet.arkivreferanse}", e) - logger.error("Feilet ved opprettelse av oppgave ved timeout i gosys for inntektsmelding: ${oppgaveEntitet.arkivreferanse}") - } + .forEach { oppgaveEntitet -> + inntektsmeldingRepository.hentInntektsmelding(oppgaveEntitet, om) + .onFailure { + sikkerlogger.error("Fant ikke inntektsmelding for utsatt oppgave: ${oppgaveEntitet.arkivreferanse}", it) + logger.error("Fant ikke inntektsmelding for utsatt oppgave: ${oppgaveEntitet.arkivreferanse}") + return@forEach + } + .onSuccess { inntektsmelding -> + + val gjelderUtland = behandlendeEnhetConsumer.gjelderUtland(oppgaveEntitet) + val behandlingsKategori = utledBehandlingsKategori(oppgaveEntitet, inntektsmelding, gjelderUtland) + try { + if (behandlingsKategori != BehandlingsKategori.IKKE_FRAVAER) { + logger.info("Skal opprette oppgave for inntektsmelding: ${oppgaveEntitet.arkivreferanse}") + opprettOppgaveIGosys( + oppgaveEntitet, + oppgaveClient, + utsattOppgaveDAO, + behandlingsKategori + ) + logger.info("Oppgave opprettet i gosys pga timeout for inntektsmelding: ${oppgaveEntitet.arkivreferanse}") + oppgaveEntitet.tilstand = Tilstand.OpprettetTimeout + } else { + logger.info("Skal ikke opprette oppgave ved timeout for inntektsmelding: ${oppgaveEntitet.arkivreferanse}") + sikkerlogger.info("Skal ikke opprette oppgave ved timeout for inntektsmelding: ${oppgaveEntitet.arkivreferanse} grunnet ${behandlingsKategori.name}") + oppgaveEntitet.tilstand = Tilstand.Forkastet + } + oppgaveEntitet.oppdatert = LocalDateTime.now() + metrikk.tellUtsattOppgave_OpprettTimeout() + utsattOppgaveDAO.lagre(oppgaveEntitet) + } catch (e: OpprettOppgaveException) { + sikkerlogger.error("Feilet ved opprettelse av oppgave ved timeout i gosys for inntektsmelding: ${oppgaveEntitet.arkivreferanse}", e) + logger.error("Feilet ved opprettelse av oppgave ved timeout i gosys for inntektsmelding: ${oppgaveEntitet.arkivreferanse}") + } + } } } } diff --git a/src/main/kotlin/no/nav/syfo/service/BehandlendeEnhetConsumer.kt b/src/main/kotlin/no/nav/syfo/service/BehandlendeEnhetConsumer.kt index b1983f8aa..9cc630ed5 100644 --- a/src/main/kotlin/no/nav/syfo/service/BehandlendeEnhetConsumer.kt +++ b/src/main/kotlin/no/nav/syfo/service/BehandlendeEnhetConsumer.kt @@ -11,6 +11,7 @@ import no.nav.syfo.client.norg.ArbeidsfordelingRequest import no.nav.syfo.client.norg.ArbeidsfordelingResponse import no.nav.syfo.client.norg.Norg2Client import no.nav.syfo.domain.GeografiskTilknytningData +import no.nav.syfo.dto.UtsattOppgaveEntitet import no.nav.syfo.util.Metrikk const val SYKEPENGER_UTLAND = "4474" @@ -61,6 +62,12 @@ class BehandlendeEnhetConsumer( ) } } + + fun gjelderUtland(oppgave: UtsattOppgaveEntitet): Boolean { + val behandlendeEnhet = this.hentBehandlendeEnhet(oppgave.fnr, oppgave.inntektsmeldingId) + logger.info("Fant enhet $behandlendeEnhet for ${oppgave.arkivreferanse}") + return (SYKEPENGER_UTLAND == behandlendeEnhet) + } } fun finnAktivBehandlendeEnhet(arbeidsfordelinger: List, geografiskTilknytning: String?): String { diff --git a/src/main/kotlin/no/nav/syfo/utsattoppgave/FinnBehandlingsKategori.kt b/src/main/kotlin/no/nav/syfo/utsattoppgave/FinnBehandlingsKategori.kt index 7059962f3..77aef6137 100644 --- a/src/main/kotlin/no/nav/syfo/utsattoppgave/FinnBehandlingsKategori.kt +++ b/src/main/kotlin/no/nav/syfo/utsattoppgave/FinnBehandlingsKategori.kt @@ -1,6 +1,7 @@ package no.nav.syfo.utsattoppgave import no.nav.syfo.domain.inntektsmelding.Inntektsmelding +import no.nav.syfo.dto.UtsattOppgaveEntitet import java.math.BigDecimal enum class BehandlingsKategori { @@ -10,11 +11,13 @@ enum class BehandlingsKategori { REFUSJON_UTEN_DATO, REFUSJON_MED_DATO, REFUSJON_LITEN_LØNN, - BESTRIDER_SYKEMELDING + BESTRIDER_SYKEMELDING, + IKKE_FRAVAER } fun finnBehandlingsKategori(inntektsmelding: Inntektsmelding, speilRelatert: Boolean, gjelderUtland: Boolean): BehandlingsKategori = when { + inntektsmelding.begrunnelseRedusert == "IkkeFravaer" -> BehandlingsKategori.IKKE_FRAVAER speilRelatert -> BehandlingsKategori.SPEIL_RELATERT gjelderUtland -> BehandlingsKategori.UTLAND inntektsmelding.begrunnelseRedusert == "BetvilerArbeidsufoerhet" -> BehandlingsKategori.BESTRIDER_SYKEMELDING @@ -23,3 +26,11 @@ fun finnBehandlingsKategori(inntektsmelding: Inntektsmelding, speilRelatert: Boo inntektsmelding.refusjon.beloepPrMnd < inntektsmelding.beregnetInntekt -> BehandlingsKategori.REFUSJON_LITEN_LØNN else -> BehandlingsKategori.REFUSJON_UTEN_DATO } + +fun utledBehandlingsKategori( + oppgave: UtsattOppgaveEntitet, + inntektsmelding: Inntektsmelding, + gjelderUtland: Boolean +): BehandlingsKategori { + return finnBehandlingsKategori(inntektsmelding, oppgave.speil, gjelderUtland) +} diff --git a/src/main/kotlin/no/nav/syfo/utsattoppgave/UtsattOppgaveService.kt b/src/main/kotlin/no/nav/syfo/utsattoppgave/UtsattOppgaveService.kt index f0b20c34e..aa7c694dd 100644 --- a/src/main/kotlin/no/nav/syfo/utsattoppgave/UtsattOppgaveService.kt +++ b/src/main/kotlin/no/nav/syfo/utsattoppgave/UtsattOppgaveService.kt @@ -8,14 +8,11 @@ import no.nav.helsearbeidsgiver.utils.log.sikkerLogger import no.nav.syfo.client.OppgaveClient import no.nav.syfo.domain.OppgaveResultat import no.nav.syfo.domain.inntektsmelding.Inntektsmelding -import no.nav.syfo.dto.InntektsmeldingEntitet import no.nav.syfo.dto.Tilstand import no.nav.syfo.dto.UtsattOppgaveEntitet import no.nav.syfo.repository.InntektsmeldingRepository import no.nav.syfo.service.BehandlendeEnhetConsumer -import no.nav.syfo.service.SYKEPENGER_UTLAND import no.nav.syfo.util.Metrikk -import org.slf4j.LoggerFactory import java.time.LocalDateTime import java.util.UUID @@ -27,7 +24,6 @@ class UtsattOppgaveService( private val om: ObjectMapper, private val metrikk: Metrikk ) { - private val logger = this.logger() private val sikkerlogger = sikkerLogger() @@ -60,17 +56,29 @@ class UtsattOppgaveService( } (Tilstand.Utsatt to Handling.Opprett), (Tilstand.Forkastet to Handling.Opprett) -> { - val inntektsmeldingEntitet = inntektsmeldingRepository.findByUuid(oppgave.inntektsmeldingId) - - if (inntektsmeldingEntitet != null) { - val resultat = opprettOppgave(oppgave, gjelderSpeil, inntektsmeldingEntitet) - oppgave.oppdatert = LocalDateTime.now() - lagre(oppgave.copy(tilstand = Tilstand.Opprettet, speil = gjelderSpeil)) - metrikk.tellUtsattOppgave_Opprett() - logger.info("Endret oppgave: ${oppgave.inntektsmeldingId} til tilstand: ${Tilstand.Opprettet.name} gosys oppgaveID: ${resultat.oppgaveId} duplikat? ${resultat.duplikat}") - } else { - sikkerlogger.error("Fant ikke inntektsmelding for ID '${oppgave.inntektsmeldingId}'.") - } + inntektsmeldingRepository.hentInntektsmelding(oppgave, om) + .onSuccess { inntektsmelding -> + val gjelderUtland = behandlendeEnhetConsumer.gjelderUtland(oppgave) + val behandlingsKategori = utledBehandlingsKategori(oppgave, inntektsmelding, gjelderUtland) + if (BehandlingsKategori.IKKE_FRAVAER != behandlingsKategori) { + val resultat = opprettOppgave(oppgave, behandlingsKategori) + oppgave.oppdatert = LocalDateTime.now() + lagre(oppgave.copy(tilstand = Tilstand.Opprettet, speil = gjelderSpeil)) + metrikk.tellUtsattOppgave_Opprett() + logger.info( + "Endret oppgave: ${oppgave.inntektsmeldingId} til tilstand: ${Tilstand.Opprettet.name} gosys oppgaveID: ${resultat.oppgaveId} duplikat? ${resultat.duplikat}", + ) + } else { + if (oppgave.tilstand == Tilstand.Utsatt) { + oppgave.oppdatert = LocalDateTime.now() + lagre(oppgave.copy(tilstand = Tilstand.Forkastet, speil = gjelderSpeil)) + sikkerlogger.info("Endret oppgave: ${oppgave.inntektsmeldingId} til tilstand: ${Tilstand.Forkastet.name} pga behandlingskategori: $behandlingsKategori") + } + logger.info("Oppgave blir ikke opprettet for inntektsmeldingId: ${oppgave.inntektsmeldingId}") + sikkerlogger.info("ppgave blir ikke opprettet for inntektsmeldingId: ${oppgave.inntektsmeldingId}, har behandlingskategori: $behandlingsKategori") + } + } + .onFailure { sikkerlogger.error(it.message, it) } } else -> { metrikk.tellUtsattOppgave_Irrelevant() @@ -85,9 +93,18 @@ class UtsattOppgaveService( fun opprett(utsattOppgave: UtsattOppgaveEntitet) { utsattOppgaveDAO.opprett(utsattOppgave) } + fun opprettOppgave( + oppgave: UtsattOppgaveEntitet, + behandlingsKategori: BehandlingsKategori + ): OppgaveResultat = opprettOppgaveIGosys(oppgave, oppgaveClient, utsattOppgaveDAO, behandlingsKategori) +} - fun opprettOppgave(oppgave: UtsattOppgaveEntitet, gjelderSpeil: Boolean, inntektsmeldingEntitet: InntektsmeldingEntitet): OppgaveResultat { - return opprettOppgaveIGosys(oppgave, oppgaveClient, utsattOppgaveDAO, behandlendeEnhetConsumer, gjelderSpeil, inntektsmeldingEntitet, om) +fun InntektsmeldingRepository.hentInntektsmelding(oppgave: UtsattOppgaveEntitet, om: ObjectMapper): Result { + val inntektsmeldingData = this.findByUuid(oppgave.inntektsmeldingId)?.data + return if (inntektsmeldingData != null) { + Result.success(om.readValue(inntektsmeldingData)) + } else { + Result.failure(Exception("Fant ikke inntektsmelding for ID '${oppgave.inntektsmeldingId}'.")) } } @@ -95,28 +112,16 @@ fun opprettOppgaveIGosys( utsattOppgave: UtsattOppgaveEntitet, oppgaveClient: OppgaveClient, utsattOppgaveDAO: UtsattOppgaveDAO, - behandlendeEnhetConsumer: BehandlendeEnhetConsumer, - speil: Boolean, - imEntitet: InntektsmeldingEntitet, - om: ObjectMapper + behandlingsKategori: BehandlingsKategori ): OppgaveResultat { - val logger = LoggerFactory.getLogger(UtsattOppgaveService::class.java)!! - val behandlendeEnhet = behandlendeEnhetConsumer.hentBehandlendeEnhet( - utsattOppgave.fnr, - utsattOppgave.inntektsmeldingId - ) - val gjelderUtland = (SYKEPENGER_UTLAND == behandlendeEnhet) - val inntektsmelding = om.readValue(imEntitet.data!!) - val behandlingsKategori = finnBehandlingsKategori(inntektsmelding, speil, gjelderUtland) - logger.info("Fant enhet $behandlendeEnhet for ${utsattOppgave.arkivreferanse}") - val resultat = runBlocking { - oppgaveClient.opprettOppgave( - journalpostId = utsattOppgave.journalpostId, - aktoerId = utsattOppgave.aktørId, - behandlingsKategori = behandlingsKategori - ) - } - utsattOppgave.enhet = behandlendeEnhet + val resultat = + runBlocking { + oppgaveClient.opprettOppgave( + journalpostId = utsattOppgave.journalpostId, + aktoerId = utsattOppgave.aktørId, + behandlingsKategori = behandlingsKategori, + ) + } utsattOppgave.gosysOppgaveId = resultat.oppgaveId.toString() utsattOppgave.utbetalingBruker = resultat.utbetalingBruker utsattOppgaveDAO.lagre(utsattOppgave) diff --git a/src/test/kotlin/no/nav/syfo/UtsattOppgaveTestData.kt b/src/test/kotlin/no/nav/syfo/UtsattOppgaveTestData.kt new file mode 100644 index 000000000..5913f9398 --- /dev/null +++ b/src/test/kotlin/no/nav/syfo/UtsattOppgaveTestData.kt @@ -0,0 +1,40 @@ +package no.nav.syfo + +import no.nav.syfo.dto.InntektsmeldingEntitet +import no.nav.syfo.dto.Tilstand +import no.nav.syfo.dto.UtsattOppgaveEntitet +import no.nav.syfo.koin.buildObjectMapper +import no.nav.syfo.repository.buildIM +import java.time.LocalDateTime +import java.util.UUID + +object UtsattOppgaveTestData { + val fnr = "fnr" + val aktørId = "aktørId" + val journalpostId = "journalpostId" + val arkivreferanse = "123" + + val timeout = LocalDateTime.of(2023, 4, 6, 9, 0) + val oppgave = UtsattOppgaveEntitet( + fnr = fnr, + aktørId = aktørId, + journalpostId = journalpostId, + arkivreferanse = arkivreferanse, + timeout = timeout, + inntektsmeldingId = UUID.randomUUID().toString(), + tilstand = Tilstand.Utsatt, + gosysOppgaveId = null, + oppdatert = null, + speil = false, + utbetalingBruker = false + ) + + val inntektsmeldingEntitet = InntektsmeldingEntitet( + aktorId = "aktoerid-123", + behandlet = LocalDateTime.now(), + orgnummer = "arb-org-123", + journalpostId = "jp-123", + data = buildObjectMapper().writeValueAsString(buildIM()), + ) + val inntektsmeldingEntitetIkkeFravaer = inntektsmeldingEntitet.copy(data = buildObjectMapper().writeValueAsString(buildIM().copy(begrunnelseRedusert = "IkkeFravaer"))) +} diff --git a/src/test/kotlin/no/nav/syfo/prosesser/FinnAlleUtgaandeOppgaverProcessorTest.kt b/src/test/kotlin/no/nav/syfo/prosesser/FinnAlleUtgaandeOppgaverProcessorTest.kt new file mode 100644 index 000000000..e1af78a44 --- /dev/null +++ b/src/test/kotlin/no/nav/syfo/prosesser/FinnAlleUtgaandeOppgaverProcessorTest.kt @@ -0,0 +1,67 @@ +package no.nav.syfo.prosesser + +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every +import io.mockk.mockk +import io.mockk.spyk +import io.mockk.verify +import no.nav.syfo.UtsattOppgaveTestData +import no.nav.syfo.client.OppgaveClient +import no.nav.syfo.domain.OppgaveResultat +import no.nav.syfo.dto.Tilstand +import no.nav.syfo.koin.buildObjectMapper +import no.nav.syfo.repository.InntektsmeldingRepository +import no.nav.syfo.service.BehandlendeEnhetConsumer +import no.nav.syfo.util.Metrikk +import no.nav.syfo.utsattoppgave.UtsattOppgaveDAO +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import java.time.LocalDateTime +import kotlin.random.Random + +class FinnAlleUtgaandeOppgaverProcessorTest { + private val utsattOppgaveDAO: UtsattOppgaveDAO = mockk(relaxed = true) + private val oppgaveClient: OppgaveClient = mockk(relaxed = true) + private val behandlendeEnhetConsumer: BehandlendeEnhetConsumer = mockk(relaxed = true) + private val metrikk: Metrikk = mockk(relaxed = true) + private val inntektsmeldingRepository: InntektsmeldingRepository = mockk(relaxed = true) + private val om = buildObjectMapper() + private lateinit var processor: FinnAlleUtgaandeOppgaverProcessor + + private val oppgave = UtsattOppgaveTestData.oppgave.copy() + private val timeout = LocalDateTime.of(2023, 4, 6, 9, 0) + + @BeforeEach + fun setup() { + processor = spyk( + FinnAlleUtgaandeOppgaverProcessor( + utsattOppgaveDAO, + oppgaveClient, + behandlendeEnhetConsumer, + metrikk, + inntektsmeldingRepository, + om + ) + ) + every { utsattOppgaveDAO.finnAlleUtgåtteOppgaver() } returns listOf(oppgave.copy()) + coEvery { oppgaveClient.opprettOppgave(any(), any(), any()) } returns OppgaveResultat(Random.nextInt(), false, false) + every { inntektsmeldingRepository.findByUuid(any()) } returns UtsattOppgaveTestData.inntektsmeldingEntitet + every { behandlendeEnhetConsumer.hentBehandlendeEnhet(any(), any()) } returns "4488" + } + + @Test + fun `Oppretter oppgave ved timout og lagrer tilstand OpprettetTimeout`() { + processor.doJob() + verify { utsattOppgaveDAO.lagre(match { it.tilstand == Tilstand.OpprettetTimeout && !it.speil && it.timeout == timeout && it.oppdatert != oppgave.oppdatert }) } + coVerify { oppgaveClient.opprettOppgave(any(), any(), any()) } + } + + @Test + fun `Oppretter ikke oppgave ved timeout hvis begrunnelseRedusert = IkkeFravaer`() { + every { inntektsmeldingRepository.findByUuid(any()) } returns UtsattOppgaveTestData.inntektsmeldingEntitetIkkeFravaer + processor.doJob() + verify { utsattOppgaveDAO.lagre(match { it.tilstand == Tilstand.Forkastet && !it.speil && it.timeout == timeout && it.oppdatert != oppgave.oppdatert }) } + coVerify(exactly = 0) { oppgaveClient.opprettOppgave(any(), any(), any()) } + } +} diff --git a/src/test/kotlin/no/nav/syfo/utsattoppgave/FinnBehandlingsKategoriTest.kt b/src/test/kotlin/no/nav/syfo/utsattoppgave/FinnBehandlingsKategoriTest.kt index e01ab1aeb..2406a0431 100644 --- a/src/test/kotlin/no/nav/syfo/utsattoppgave/FinnBehandlingsKategoriTest.kt +++ b/src/test/kotlin/no/nav/syfo/utsattoppgave/FinnBehandlingsKategoriTest.kt @@ -64,6 +64,12 @@ internal class FinnBehandlingsKategoriTest { assertEquals(BehandlingsKategori.UTLAND, finnBehandlingsKategori(inntektsmelding = inntektsmelding, speilRelatert = false, gjelderUtland = true)) } + @Test + fun ikke_fravaer() { + val inntektsmelding = mockInntektsmelding(Refusjon(beloepPrMnd = BigDecimal(17000), null), BigDecimal(17000)).copy(begrunnelseRedusert = "IkkeFravaer") + assertEquals(BehandlingsKategori.IKKE_FRAVAER, finnBehandlingsKategori(inntektsmelding = inntektsmelding, speilRelatert = false, gjelderUtland = false)) + } + fun mockInntektsmelding(refusjon: Refusjon, inntekt: BigDecimal): Inntektsmelding { return Inntektsmelding( id = "", diff --git a/src/test/kotlin/no/nav/syfo/utsattoppgave/UtsattOppgaveServiceTest.kt b/src/test/kotlin/no/nav/syfo/utsattoppgave/UtsattOppgaveServiceTest.kt index 16557d0cf..67c0cc5fc 100644 --- a/src/test/kotlin/no/nav/syfo/utsattoppgave/UtsattOppgaveServiceTest.kt +++ b/src/test/kotlin/no/nav/syfo/utsattoppgave/UtsattOppgaveServiceTest.kt @@ -1,14 +1,17 @@ package no.nav.syfo.utsattoppgave -import com.fasterxml.jackson.databind.ObjectMapper +import io.mockk.Called +import io.mockk.coEvery +import io.mockk.coVerify import io.mockk.every import io.mockk.mockk import io.mockk.spyk import io.mockk.verify +import no.nav.syfo.UtsattOppgaveTestData import no.nav.syfo.client.OppgaveClient import no.nav.syfo.domain.OppgaveResultat import no.nav.syfo.dto.Tilstand -import no.nav.syfo.dto.UtsattOppgaveEntitet +import no.nav.syfo.koin.buildObjectMapper import no.nav.syfo.repository.InntektsmeldingRepository import no.nav.syfo.service.BehandlendeEnhetConsumer import no.nav.syfo.util.Metrikk @@ -20,29 +23,25 @@ import kotlin.random.Random open class UtsattOppgaveServiceTest { - private var utsattOppgaveDAO: UtsattOppgaveDAO = mockk(relaxed = true) - private var oppgaveClient: OppgaveClient = mockk(relaxed = true) - private var behandlendeEnhetConsumer: BehandlendeEnhetConsumer = mockk() + private val utsattOppgaveDAO: UtsattOppgaveDAO = mockk(relaxed = true) + private val oppgaveClient: OppgaveClient = mockk(relaxed = true) + private val behandlendeEnhetConsumer: BehandlendeEnhetConsumer = mockk(relaxed = true) private lateinit var oppgaveService: UtsattOppgaveService - private var metrikk: Metrikk = mockk(relaxed = true) - private var inntektsmeldingRepository: InntektsmeldingRepository = mockk(relaxed = true) - private var om: ObjectMapper = mockk() + private val metrikk: Metrikk = mockk(relaxed = true) + private val inntektsmeldingRepository: InntektsmeldingRepository = mockk(relaxed = true) + private val om = buildObjectMapper() + private val oppgave = UtsattOppgaveTestData.oppgave.copy() + private val timeout = LocalDateTime.of(2023, 4, 6, 9, 0) @BeforeEach fun setup() { oppgaveService = spyk(UtsattOppgaveService(utsattOppgaveDAO, oppgaveClient, behandlendeEnhetConsumer, inntektsmeldingRepository, om, metrikk)) - every { utsattOppgaveDAO.finn(any()) } returns oppgave - every { oppgaveService.opprettOppgave(any(), any(), any()) } returns OppgaveResultat(Random.nextInt(), false, false) + every { utsattOppgaveDAO.finn(any()) } returns oppgave.copy() + coEvery { oppgaveClient.opprettOppgave(any(), any(), any()) } returns OppgaveResultat(Random.nextInt(), false, false) + every { inntektsmeldingRepository.findByUuid(any()) } returns UtsattOppgaveTestData.inntektsmeldingEntitet + every { behandlendeEnhetConsumer.hentBehandlendeEnhet(any(), any()) } returns "4488" } - private val fnr = "fnr" - private val aktørId = "aktørId" - private val journalpostId = "journalpostId" - private val arkivreferanse = "123" - - private val timeout = LocalDateTime.of(2023, 4, 6, 9, 0) - private val oppgave = enOppgave(timeout) - @Test fun `Oppretter forsinket oppgave med timeout`() { oppgaveService.opprett(oppgave) @@ -58,7 +57,8 @@ open class UtsattOppgaveServiceTest { OppdateringstypeDTO.OpprettSpeilRelatert ) oppgaveService.prosesser(oppgaveOppdatering) - verify { utsattOppgaveDAO.lagre(eq(oppgave.copy(tilstand = Tilstand.Opprettet, speil = true, timeout = timeout))) } + verify { utsattOppgaveDAO.lagre(match { it.tilstand == Tilstand.Opprettet && it.speil && it.timeout == timeout }) } + coVerify { oppgaveClient.opprettOppgave(any(), any(), any()) } } @Test @@ -70,7 +70,8 @@ open class UtsattOppgaveServiceTest { OppdateringstypeDTO.Opprett ) oppgaveService.prosesser(oppgaveOppdatering) - verify { utsattOppgaveDAO.lagre(eq(oppgave.copy(tilstand = Tilstand.Opprettet, speil = false, timeout = timeout))) } + verify { utsattOppgaveDAO.lagre(match { it.tilstand == Tilstand.Opprettet && !it.speil && it.timeout == timeout }) } + coVerify { oppgaveClient.opprettOppgave(any(), any(), any()) } } @Test @@ -83,8 +84,10 @@ open class UtsattOppgaveServiceTest { OppdateringstypeDTO.Utsett ) oppgaveService.prosesser(oppgaveOppdatering) - verify { utsattOppgaveDAO.lagre(eq(oppgave.copy(tilstand = Tilstand.Utsatt, timeout = nyTimeout))) } + verify { utsattOppgaveDAO.lagre(match { it.tilstand == Tilstand.Utsatt && it.timeout == nyTimeout && it.oppdatert != oppgave.oppdatert }) } + coVerify { oppgaveClient.opprettOppgave(any(), any(), any()) wasNot Called } } + @Test fun `Lagrer utsatt oppgave med tilstand Forkastet ved Ferdigbehandlet`() { val oppgaveOppdatering = OppgaveOppdatering( @@ -94,20 +97,38 @@ open class UtsattOppgaveServiceTest { OppdateringstypeDTO.Ferdigbehandlet ) oppgaveService.prosesser(oppgaveOppdatering) - verify { utsattOppgaveDAO.lagre(eq(oppgave.copy(tilstand = Tilstand.Forkastet, timeout = timeout))) } + verify { utsattOppgaveDAO.lagre(match { it.tilstand == Tilstand.Forkastet && it.timeout == timeout && it.oppdatert != oppgave.oppdatert }) } + coVerify(exactly = 0) { oppgaveClient.opprettOppgave(any(), any(), any()) } + } + + @Test + fun `Oppretter Ikke Oppgave hvis begrunnelseRedusert = IkkeFravaer hvis oppgave utsatt`() { + every { inntektsmeldingRepository.findByUuid(any()) } returns UtsattOppgaveTestData.inntektsmeldingEntitetIkkeFravaer + val oppgaveOppdatering = OppgaveOppdatering( + UUID.randomUUID(), + OppdateringstypeDTO.Opprett.tilHandling(), + timeout.plusDays(7), + OppdateringstypeDTO.Opprett + ) + oppgaveService.prosesser(oppgaveOppdatering) + verify { utsattOppgaveDAO.lagre(match { it.tilstand == Tilstand.Forkastet && it.oppdatert != oppgave.oppdatert }) } + coVerify(exactly = 0) { oppgaveClient.opprettOppgave(any(), any(), any()) } } - private fun enOppgave(timeout: LocalDateTime, tilstand: Tilstand = Tilstand.Utsatt) = UtsattOppgaveEntitet( - fnr = fnr, - aktørId = aktørId, - journalpostId = journalpostId, - arkivreferanse = arkivreferanse, - timeout = timeout, - inntektsmeldingId = UUID.randomUUID().toString(), - tilstand = tilstand, - gosysOppgaveId = null, - oppdatert = null, - speil = false, - utbetalingBruker = false - ) + @Test + fun `Oppretter Ikke Oppgave hvis begrunnelseRedusert = IkkeFravaer og oppgave allerede forkastet`() { + every { inntektsmeldingRepository.findByUuid(any()) } returns UtsattOppgaveTestData.inntektsmeldingEntitetIkkeFravaer + val forkastetTidspunkt = LocalDateTime.of(2023, 4, 6, 9, 0) + val forkastetOppgave = oppgave.copy(tilstand = Tilstand.Forkastet, oppdatert = forkastetTidspunkt) + every { utsattOppgaveDAO.finn(any()) } returns forkastetOppgave + val oppgaveOppdatering = OppgaveOppdatering( + UUID.randomUUID(), + OppdateringstypeDTO.Opprett.tilHandling(), + timeout.plusDays(7), + OppdateringstypeDTO.Opprett + ) + oppgaveService.prosesser(oppgaveOppdatering) + verify(exactly = 0) { utsattOppgaveDAO.lagre(any()) } + coVerify(exactly = 0) { oppgaveClient.opprettOppgave(any(), any(), any()) } + } }