Skip to content

1302: Opprett oppgave når et nytt meldekort mottas #828

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Feb 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ dependencies {

// Http
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-cio:$ktorVersion")
implementation("io.ktor:ktor-client-apache:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-client-logging:$ktorVersion")
implementation("io.ktor:ktor-http:$ktorVersion")
Expand Down
1 change: 1 addition & 0 deletions app/src/main/kotlin/no/nav/tiltakspenger/vedtak/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ internal fun start(
applicationContext.behandlingContext.journalførVedtaksbrevService.journalfør()
applicationContext.behandlingContext.distribuerVedtaksbrevService.distribuer()
applicationContext.sendTilDatadelingService.send(Configuration.isNais())
applicationContext.meldekortContext.oppgaveMeldekortService.opprettOppgaveForMeldekortSomIkkeGodkjennesAutomatisk()
if (Configuration.isNais()) {
applicationContext.endretTiltaksdeltakerJobb.opprettOppgaveForEndredeDeltakere()
applicationContext.endretTiltaksdeltakerJobb.opprydning()
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import com.fasterxml.jackson.module.kotlin.KotlinModule
import io.ktor.client.HttpClient
import io.ktor.client.engine.HttpClientEngine
import io.ktor.client.engine.cio.CIO
import io.ktor.client.engine.apache.Apache
import io.ktor.client.plugins.HttpRequestRetry
import io.ktor.client.plugins.HttpTimeout
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
Expand All @@ -23,15 +23,17 @@ private val LOG = KotlinLogging.logger {}

private const val SIXTY_SECONDS = 60L

fun httpClientCIO(timeout: Long = SIXTY_SECONDS) = HttpClient(CIO).config(timeout)
fun httpClientApache(timeout: Long = SIXTY_SECONDS) = HttpClient(Apache).config(timeout)

fun httpClientGeneric(
engine: HttpClientEngine,
engine: HttpClientEngine?,
timeout: Long = SIXTY_SECONDS,
) = HttpClient(engine).config(timeout)
) = engine
?.let { HttpClient(engine).config(timeout) }
?: HttpClient(Apache).config(timeout)

fun httpClientWithRetry(timeout: Long = SIXTY_SECONDS) =
httpClientCIO(timeout).also { httpClient ->
httpClientApache(timeout).also { httpClient ->
httpClient.config {
install(HttpRequestRetry) {
retryOnServerErrors(maxRetries = 3)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import java.time.DayOfWeek
import java.time.LocalDate

const val TEMA_TILTAKSPENGER: String = "IND"
const val OPPGAVETYPE_BEHANDLE_SAK: String = "BEH_SAK"
const val OPPGAVETYPE_VURDER_KONSEKVENS_FOR_YTELSE: String = "VUR_KONS_YTE"

const val BEHANDLES_AV_APPLIKASJON = "TILTAKSPENGER"

Expand All @@ -32,7 +30,7 @@ data class OpprettOppgaveRequest(
journalpostId = journalpostId.toString(),
beskrivelse = "Ny søknad om tiltakspenger. Behandles i ny løsning.",
behandlesAvApplikasjon = BEHANDLES_AV_APPLIKASJON,
oppgavetype = OPPGAVETYPE_BEHANDLE_SAK,
oppgavetype = OppgaveType.OPPGAVETYPE_BEHANDLE_SAK.value,
)

fun opprettOppgaveRequestForEndretTiltaksdeltaker(
Expand All @@ -42,7 +40,18 @@ data class OpprettOppgaveRequest(
journalpostId = null,
beskrivelse = "Det har skjedd en endring i tiltaksdeltakelsen som kan påvirke tiltakspengeytelsen.",
behandlesAvApplikasjon = null,
oppgavetype = OPPGAVETYPE_VURDER_KONSEKVENS_FOR_YTELSE,
oppgavetype = OppgaveType.OPPGAVETYPE_VURDER_KONSEKVENS_FOR_YTELSE.value,
)

fun opprettOppgaveRequestForMeldekort(
fnr: Fnr,
journalpostId: JournalpostId,
) = OpprettOppgaveRequest(
personident = fnr.verdi,
journalpostId = journalpostId.toString(),
beskrivelse = "Nytt meldekort for tiltakspenger. Behandles i ny løsning.",
behandlesAvApplikasjon = BEHANDLES_AV_APPLIKASJON,
oppgavetype = OppgaveType.OPPGAVETYPE_VURDER_HENVENDELSE.value,
)
}
}
Expand Down Expand Up @@ -94,3 +103,9 @@ data class FerdigstillOppgaveRequest(
val versjon: Int,
val status: OppgaveStatus,
)

enum class OppgaveType(val value: String) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dette var lurt! Mye bedre å ha det som enum 🙌

OPPGAVETYPE_BEHANDLE_SAK("BEH_SAK"),
OPPGAVETYPE_VURDER_KONSEKVENS_FOR_YTELSE("VUR_KONS_YTE"),
OPPGAVETYPE_VURDER_HENVENDELSE("VURD_HENV"),
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import kotlinx.coroutines.future.await
import mu.KotlinLogging
import no.nav.tiltakspenger.felles.OppgaveId
import no.nav.tiltakspenger.felles.journalføring.JournalpostId
import no.nav.tiltakspenger.felles.sikkerlogg
import no.nav.tiltakspenger.libs.common.AccessToken
import no.nav.tiltakspenger.libs.common.Fnr
import no.nav.tiltakspenger.libs.json.objectMapper
Expand Down Expand Up @@ -40,21 +41,33 @@ class OppgaveHttpClient(
journalpostId: JournalpostId,
oppgavebehov: Oppgavebehov,
): OppgaveId {
val opprettOppgaveRequest = when (oppgavebehov) {
Oppgavebehov.NY_SOKNAD -> {
OpprettOppgaveRequest.opprettOppgaveRequestForSoknad(
fnr = fnr,
journalpostId = journalpostId,
)
}

Oppgavebehov.NYTT_MELDEKORT -> {
OpprettOppgaveRequest.opprettOppgaveRequestForMeldekort(
fnr = fnr,
journalpostId = journalpostId,
)
}

else -> {
logger.error { "Ukjent oppgavebehov for oppgave med journalpost: ${oppgavebehov.name}" }
throw IllegalArgumentException("Ukjent oppgavebehov for oppgave med journalpost: ${oppgavebehov.name}")
}
}

val callId = UUID.randomUUID()
val oppgaveResponse = finnOppgave(journalpostId, callId)
val oppgaveResponse = finnOppgave(journalpostId, opprettOppgaveRequest.oppgavetype, callId)
if (oppgaveResponse.antallTreffTotalt > 0 && oppgaveResponse.oppgaver.isNotEmpty()) {
logger.warn { "Oppgave for journalpostId: $journalpostId finnes fra før, callId: $callId" }
return OppgaveId(oppgaveResponse.oppgaver.first().id.toString())
}
val opprettOppgaveRequest = if (oppgavebehov == Oppgavebehov.NY_SOKNAD) {
OpprettOppgaveRequest.opprettOppgaveRequestForSoknad(
fnr = fnr,
journalpostId = journalpostId,
)
} else {
logger.error { "Ukjent oppgavebehov for oppgave med journalpost: ${oppgavebehov.name}" }
throw IllegalArgumentException("Ukjent oppgavebehov for oppgave med journalpost: ${oppgavebehov.name}")
}
return opprettOppgave(opprettOppgaveRequest, callId)
}

Expand Down Expand Up @@ -99,6 +112,7 @@ class OppgaveHttpClient(
val status = httpResponse.statusCode()
if (status != 201) {
logger.error { "Kunne ikke opprette oppgave, statuskode $status. CallId: $callId ${opprettOppgaveRequest.journalpostId?.let { ", journalpostId: $it" }}" }
sikkerlogg.error { httpResponse.body() }
error("Kunne ikke opprette oppgave, statuskode $status")
}
val jsonResponse = httpResponse.body()
Expand All @@ -109,13 +123,15 @@ class OppgaveHttpClient(

private suspend fun finnOppgave(
journalpostId: JournalpostId,
oppgaveType: String,
callId: UUID,
): FinnOppgaveResponse {
val request = createGetRequest(createGetOppgaveUri(journalpostId), getToken().token, callId)
val request = createGetRequest(createGetOppgaveUri(journalpostId, oppgaveType), getToken().token, callId)
val httpResponse = client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).await()
val status = httpResponse.statusCode()
if (status != 200) {
logger.error { "Noe gikk galt ved søk etter oppgave, statuskode $status. JournalpostId: $journalpostId, callId: $callId" }
sikkerlogg.error { httpResponse.body() }
error("Noe gikk galt ved søk etter oppgave, statuskode $status")
}
val jsonResponse = httpResponse.body()
Expand All @@ -131,6 +147,7 @@ class OppgaveHttpClient(
val status = httpResponse.statusCode()
if (status != 200) {
logger.error { "Noe gikk galt ved henting av oppgave med id $oppgaveId, statuskode $status, callId: $callId" }
sikkerlogg.error { httpResponse.body() }
error("Noe gikk galt ved henting av oppgave, statuskode $status")
}
val jsonResponse = httpResponse.body()
Expand All @@ -151,6 +168,7 @@ class OppgaveHttpClient(
val status = httpResponse.statusCode()
if (status != 200) {
logger.error { "Noe gikk galt ved ferdigstilling av oppgave med id ${oppgave.id}, statuskode $status, callId: $callId" }
sikkerlogg.error { httpResponse.body() }
error("Noe gikk galt ved ferdigstilling av oppgave, statuskode $status")
}
}
Expand Down Expand Up @@ -207,7 +225,7 @@ class OppgaveHttpClient(
.build()
}

private fun createGetOppgaveUri(journalpostId: JournalpostId): URI {
return URI.create("$uri?tema=$TEMA_TILTAKSPENGER&oppgavetype=$OPPGAVETYPE_BEHANDLE_SAK&journalpostId=$journalpostId&statuskategori=AAPEN")
private fun createGetOppgaveUri(journalpostId: JournalpostId, oppgaveType: String): URI {
return URI.create("$uri?tema=$TEMA_TILTAKSPENGER&oppgavetype=$oppgaveType&journalpostId=$journalpostId&statuskategori=AAPEN")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,14 @@ import no.nav.tiltakspenger.libs.common.AccessToken
import no.nav.tiltakspenger.libs.common.CorrelationId
import no.nav.tiltakspenger.libs.common.Fnr
import no.nav.tiltakspenger.libs.tiltak.TiltakTilSaksbehandlingDTO
import no.nav.tiltakspenger.vedtak.clients.defaultHttpClient
import no.nav.tiltakspenger.vedtak.clients.httpClientGeneric

class TiltakClientImpl(
val baseUrl: String,
private val getToken: suspend () -> AccessToken,
engine: HttpClientEngine? = null,
private val httpClient: HttpClient =
defaultHttpClient(
engine = engine,
) {},
private val httpClient: HttpClient = httpClientGeneric(engine = engine),
) : TiltakClient {

val log = KotlinLogging.logger {}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ open class ApplicationContext(
personService = personContext.personService,
entraIdSystemtokenClient = entraIdSystemtokenClient,
navkontorService = navkontorService,
oppgaveGateway = oppgaveGateway,
sakRepo = sakContext.sakRepo,
)
}
open val behandlingContext by lazy {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@ import no.nav.tiltakspenger.meldekort.domene.BrukersMeldekortRepo
import no.nav.tiltakspenger.meldekort.ports.MeldekortBehandlingRepo
import no.nav.tiltakspenger.meldekort.ports.MeldeperiodeRepo
import no.nav.tiltakspenger.meldekort.service.IverksettMeldekortService
import no.nav.tiltakspenger.meldekort.service.OppgaveMeldekortService
import no.nav.tiltakspenger.meldekort.service.OpprettMeldekortBehandlingService
import no.nav.tiltakspenger.meldekort.service.SendMeldekortTilBeslutningService
import no.nav.tiltakspenger.meldekort.service.SendMeldeperiodeTilBrukerService
import no.nav.tiltakspenger.saksbehandling.ports.OppgaveGateway
import no.nav.tiltakspenger.saksbehandling.ports.SakRepo
import no.nav.tiltakspenger.saksbehandling.ports.StatistikkStønadRepo
import no.nav.tiltakspenger.saksbehandling.service.person.PersonService
import no.nav.tiltakspenger.saksbehandling.service.sak.SakService
Expand All @@ -35,6 +38,8 @@ open class MeldekortContext(
statistikkStønadRepo: StatistikkStønadRepo,
entraIdSystemtokenClient: EntraIdSystemtokenClient,
navkontorService: NavkontorService,
oppgaveGateway: OppgaveGateway,
sakRepo: SakRepo,
) {
open val meldekortBehandlingRepo: MeldekortBehandlingRepo by lazy {
MeldekortBehandlingPostgresRepo(
Expand Down Expand Up @@ -94,4 +99,12 @@ open class MeldekortContext(
meldekortApiHttpClient = meldekortApiHttpClient,
)
}

val oppgaveMeldekortService by lazy {
OppgaveMeldekortService(
oppgaveGateway = oppgaveGateway,
sakRepo = sakRepo,
brukersMeldekortRepo = brukersMeldekortRepo,
)
}
}
Loading
Loading