Skip to content

Commit

Permalink
Flytte kode for oppgaveflytting til backend (#4572)
Browse files Browse the repository at this point in the history
  • Loading branch information
Watercolours authored Apr 19, 2024
1 parent 54ea28e commit 065a419
Show file tree
Hide file tree
Showing 7 changed files with 205 additions and 93 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ internal class ApplicationContext(
val tilbakekreving = TilbakekrevingHendelserServiceImpl(rapid)
val oppgaveService = OppgaveService(oppgaveDaoEndringer, sakDao, behandlingsHendelser)

val gosysOppgaveService = GosysOppgaveServiceImpl(gosysOppgaveKlient, pdlTjenesterKlient)
val gosysOppgaveService = GosysOppgaveServiceImpl(gosysOppgaveKlient, pdlTjenesterKlient, oppgaveService)
val grunnlagsService = GrunnlagServiceImpl(grunnlagKlient)
val behandlingService =
BehandlingServiceImpl(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import io.ktor.server.routing.Route
import io.ktor.server.routing.get
import io.ktor.server.routing.post
import io.ktor.server.routing.route
import kotlinx.coroutines.runBlocking
import no.nav.etterlatte.inTransaction
import no.nav.etterlatte.libs.common.oppgave.RedigerFristGosysRequest
import no.nav.etterlatte.libs.common.oppgave.SaksbehandlerEndringGosysDto
import no.nav.etterlatte.libs.ktor.brukerTokenInfo
Expand Down Expand Up @@ -41,6 +43,19 @@ internal fun Route.gosysOppgaveRoute(gosysService: GosysOppgaveService) {
}
}

post("/flytt-til-gjenny") {
kunSaksbehandler {
val sakId = call.request.queryParameters["sakid"]!!.toLong()
val nyOppgave =
inTransaction {
runBlocking {
gosysService.flyttTilGjenny(gosysOppgaveId.toLong(), sakId, brukerTokenInfo)
}
}
call.respond(nyOppgave)
}
}

post("tildel-saksbehandler") {
kunSaksbehandler {
val saksbehandlerEndringDto = call.receive<SaksbehandlerEndringGosysDto>()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,14 @@ import no.nav.etterlatte.SaksbehandlerMedEnheterOgRoller
import no.nav.etterlatte.User
import no.nav.etterlatte.common.Enheter
import no.nav.etterlatte.common.klienter.PdlTjenesterKlient
import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException
import no.nav.etterlatte.libs.common.oppgave.OppgaveIntern
import no.nav.etterlatte.libs.common.oppgave.OppgaveKilde
import no.nav.etterlatte.libs.common.oppgave.OppgaveSaksbehandler
import no.nav.etterlatte.libs.common.oppgave.OppgaveType
import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt
import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo
import no.nav.etterlatte.oppgave.OppgaveService
import org.slf4j.LoggerFactory
import java.time.Duration
import java.time.LocalTime
Expand All @@ -32,6 +37,12 @@ interface GosysOppgaveService {
brukerTokenInfo: BrukerTokenInfo,
): GosysOppgave?

suspend fun flyttTilGjenny(
oppgaveId: Long,
sakId: Long,
brukerTokenInfo: BrukerTokenInfo,
): OppgaveIntern

suspend fun tildelOppgaveTilSaksbehandler(
oppgaveId: String,
oppgaveVersjon: Long,
Expand Down Expand Up @@ -62,6 +73,7 @@ interface GosysOppgaveService {
class GosysOppgaveServiceImpl(
private val gosysOppgaveKlient: GosysOppgaveKlient,
private val pdltjenesterKlient: PdlTjenesterKlient,
private val oppgaveService: OppgaveService,
) : GosysOppgaveService {
private val logger = LoggerFactory.getLogger(this::class.java)

Expand Down Expand Up @@ -142,6 +154,50 @@ class GosysOppgaveServiceImpl(
}.also { cache.put(id, it) }
}

override suspend fun flyttTilGjenny(
oppgaveId: Long,
sakId: Long,
brukerTokenInfo: BrukerTokenInfo,
): OppgaveIntern {
logger.info("Starter flytting av gosys-oppgave (id=$oppgaveId) til Gjenny")

val gosysOppgave = hentOppgave(oppgaveId, brukerTokenInfo)

if (gosysOppgave.oppgavetype !in listOf("JFR", "JFR_UT")) {
logger.error("Fikk forespørsel om flytting av oppgavetype=${gosysOppgave.oppgavetype}. Burde det støttes?")
throw StoetterKunFlyttingAvJournalfoeringsoppgave()
}

check(!gosysOppgave.journalpostId.isNullOrBlank()) {
"Kan ikke flytte oppgave når journalpostId mangler (oppgaveId=${gosysOppgave.id})"
}

val nyOppgave =
oppgaveService.opprettNyOppgaveMedSakOgReferanse(
referanse = gosysOppgave.journalpostId,
sakId = sakId,
oppgaveKilde = OppgaveKilde.SAKSBEHANDLER,
oppgaveType = OppgaveType.JOURNALFOERING,
merknad = gosysOppgave.beskrivelse,
frist = gosysOppgave.frist,
saksbehandler = brukerTokenInfo.ident(),
)

val feilregistrertOppgaveId =
feilregistrer(
oppgaveId.toString(),
FeilregistrerOppgaveRequest(
beskrivelse = "Oppgave overført til Gjenny",
versjon = gosysOppgave.versjon,
),
brukerTokenInfo,
)

logger.info("Feilregistrerte Gosys-oppgave $feilregistrertOppgaveId")

return nyOppgave
}

override suspend fun tildelOppgaveTilSaksbehandler(
oppgaveId: String,
oppgaveVersjon: Long,
Expand Down Expand Up @@ -187,7 +243,7 @@ class GosysOppgaveServiceImpl(
beskrivelse = request.beskrivelse,
)

return gosysOppgaveKlient.feilregistrer(oppgaveId, endreStatusRequest, brukerTokenInfo).versjon
return gosysOppgaveKlient.feilregistrer(oppgaveId, endreStatusRequest, brukerTokenInfo).id
}

companion object {
Expand All @@ -212,3 +268,8 @@ class GosysOppgaveServiceImpl(
}
}
}

class StoetterKunFlyttingAvJournalfoeringsoppgave : UgyldigForespoerselException(
code = "UGYLDIG_OPPGAVETYPE_FOR_FLYTTING",
detail = "Støtter foreløpig kun flytting av journalføringsoppgaver",
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,46 @@ package no.nav.etterlatte.oppgaveGosys

import com.nimbusds.jwt.JWTClaimsSet
import io.kotest.matchers.collections.shouldHaveSize
import io.mockk.clearAllMocks
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.runBlocking
import no.nav.etterlatte.SaksbehandlerMedEnheterOgRoller
import no.nav.etterlatte.azureAdAttestantClaim
import no.nav.etterlatte.azureAdSaksbehandlerClaim
import no.nav.etterlatte.azureAdStrengtFortroligClaim
import no.nav.etterlatte.common.Enheter
import no.nav.etterlatte.common.klienter.PdlTjenesterKlient
import no.nav.etterlatte.libs.common.oppgave.OppgaveKilde
import no.nav.etterlatte.libs.common.oppgave.OppgaveType
import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt
import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo
import no.nav.etterlatte.libs.ktor.token.Saksbehandler
import no.nav.etterlatte.nyKontekstMedBruker
import no.nav.etterlatte.oppgave.OppgaveService
import no.nav.etterlatte.tilgangsstyring.AzureGroup
import no.nav.etterlatte.tilgangsstyring.SaksbehandlerMedRoller
import no.nav.security.token.support.core.jwt.JwtTokenClaims
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import java.time.LocalDate
import java.time.LocalTime
import java.time.temporal.ChronoUnit
import kotlin.random.Random

@TestInstance(TestInstance.Lifecycle.PER_METHOD)
class GosysOppgaveServiceImplTest {
private val gosysOppgaveKlient = mockk<GosysOppgaveKlient>()
private val pdltjenesterKlient = mockk<PdlTjenesterKlient>()
private val oppgaveService = mockk<OppgaveService>()
private val brukerTokenInfo = mockk<BrukerTokenInfo>()

private val service = GosysOppgaveServiceImpl(gosysOppgaveKlient, pdltjenesterKlient)
private val service = GosysOppgaveServiceImpl(gosysOppgaveKlient, pdltjenesterKlient, oppgaveService)
private val saksbehandler = mockk<SaksbehandlerMedEnheterOgRoller>()

val azureGroupToGroupIDMap =
Expand Down Expand Up @@ -60,6 +70,11 @@ class GosysOppgaveServiceImplTest {
every { saksbehandler.saksbehandlerMedRoller } returns saksbehandlerRoller
}

@AfterEach
fun afterEach() {
clearAllMocks()
}

@Test
fun `skal hente oppgaver og deretter folkeregisterIdent for unike identer`() {
val saksbehandlerRoller = generateSaksbehandlerMedRoller(AzureGroup.SAKSBEHANDLER)
Expand Down Expand Up @@ -156,7 +171,14 @@ class GosysOppgaveServiceImplTest {

every { saksbehandler.saksbehandlerMedRoller } returns saksbehandlerRoller

coEvery { gosysOppgaveKlient.hentOppgaver(any(), any(), Enheter.STRENGT_FORTROLIG.enhetNr, brukerTokenInfo) } returns
coEvery {
gosysOppgaveKlient.hentOppgaver(
any(),
any(),
Enheter.STRENGT_FORTROLIG.enhetNr,
brukerTokenInfo,
)
} returns
enhetsfiltrererGosysOppgaver(
Enheter.STRENGT_FORTROLIG.enhetNr,
listOf(
Expand Down Expand Up @@ -232,25 +254,77 @@ class GosysOppgaveServiceImplTest {
tildeles = "A012345",
brukerTokenInfo,
)
} returns
GosysApiOppgave(
id = 123,
versjon = 2,
tema = "EYO",
behandlingstema = "",
oppgavetype = "",
journalpostId = null,
opprettetTidspunkt = Tidspunkt.now().minus(3L, ChronoUnit.DAYS),
tildeltEnhetsnr = Enheter.STEINKJER.enhetNr,
tilordnetRessurs = "A012345",
aktoerId = "78324720383742",
beskrivelse = "Omstillingsstønad oppgavebeskrivelse",
status = "NY",
fristFerdigstillelse = LocalDate.now().plusDays(4),
)
} returns mockGosysOppgave("EYO", "GEN")

runBlocking {
service.tildelOppgaveTilSaksbehandler(oppgaveId = "123", oppgaveVersjon = 2L, "A012345", brukerTokenInfo)
}
}

@Test
fun `Flytt oppgave til Gjenny`() {
val sakId = Random.nextLong()
val gosysOppgave = mockGosysOppgave("EYO", "JFR", Random.nextLong().toString())
val brukerTokenInfo = BrukerTokenInfo.of("", "Z123456", null, null, null)

coEvery { gosysOppgaveKlient.hentOppgave(any(), any()) } returns gosysOppgave
coEvery { gosysOppgaveKlient.feilregistrer(any(), any(), any()) } returns gosysOppgave
coEvery {
oppgaveService.opprettNyOppgaveMedSakOgReferanse(any(), any(), any(), any(), any(), any(), any())
} returns mockk()
every {
pdltjenesterKlient.hentFolkeregisterIdenterForAktoerIdBolk(setOf(gosysOppgave.aktoerId!!))
} returns mapOf("78324720383742" to "29048012345")

runBlocking {
service.flyttTilGjenny(gosysOppgave.id, sakId, brukerTokenInfo)
}

verify(exactly = 1) {
oppgaveService.opprettNyOppgaveMedSakOgReferanse(
gosysOppgave.journalpostId!!,
sakId,
OppgaveKilde.SAKSBEHANDLER,
OppgaveType.JOURNALFOERING,
gosysOppgave.beskrivelse,
Tidspunkt.ofNorskTidssone(gosysOppgave.fristFerdigstillelse!!, LocalTime.MIDNIGHT),
brukerTokenInfo.ident(),
)
}
coVerify(exactly = 1) {
gosysOppgaveKlient.feilregistrer(
id = gosysOppgave.id.toString(),
request =
EndreStatusRequest(
versjon = gosysOppgave.versjon.toString(),
status = "FEILREGISTRERT",
beskrivelse = "Oppgave overført til Gjenny",
),
brukerTokenInfo = brukerTokenInfo,
)
}
coVerify(exactly = 1) {
pdltjenesterKlient.hentFolkeregisterIdenterForAktoerIdBolk(setOf(gosysOppgave.aktoerId!!))
}
}

private fun mockGosysOppgave(
tema: String,
oppgavetype: String,
journalpostId: String? = null,
) = GosysApiOppgave(
id = Random.nextLong(),
versjon = Random.nextLong(),
tema = tema,
behandlingstema = "",
oppgavetype = oppgavetype,
journalpostId = journalpostId,
opprettetTidspunkt = Tidspunkt.now().minus(3L, ChronoUnit.DAYS),
tildeltEnhetsnr = Enheter.STEINKJER.enhetNr,
tilordnetRessurs = "A012345",
aktoerId = "78324720383742",
beskrivelse = "Beskrivelse for oppgaven",
status = "OPPRETTET",
fristFerdigstillelse = LocalDate.now().plusDays(4),
)
}
Loading

0 comments on commit 065a419

Please sign in to comment.