Skip to content

Commit

Permalink
Nytt api for søkeboksen (#2662)
Browse files Browse the repository at this point in the history
Skal erstatte FagsakApi på sikt.
  • Loading branch information
mbolstad authored Oct 3, 2024
1 parent 2fa6e81 commit a9e37d3
Show file tree
Hide file tree
Showing 16 changed files with 256 additions and 164 deletions.
36 changes: 18 additions & 18 deletions src/main/kotlin/no/nav/k9/los/K9Los.kt
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import no.nav.k9.los.nyoppgavestyring.mottak.oppgave.OppgaveV3Api
import no.nav.k9.los.nyoppgavestyring.mottak.oppgavetype.OppgavetypeApi
import no.nav.k9.los.nyoppgavestyring.pep.PepCacheOppdaterer
import no.nav.k9.los.nyoppgavestyring.query.OppgaveQueryApis
import no.nav.k9.los.nyoppgavestyring.søkeboks.SøkeboksApi
import no.nav.k9.los.tjenester.avdelingsleder.AvdelingslederApis
import no.nav.k9.los.tjenester.avdelingsleder.nokkeltall.DataeksportApis
import no.nav.k9.los.tjenester.avdelingsleder.nokkeltall.NokkeltallApis
Expand Down Expand Up @@ -324,12 +325,12 @@ fun Application.k9Los() {
route("k9saktillos") { K9SakTilLosApi() }
route("k9klagetillos") { K9KlageTilLosApi() }
route("statistikk") { StatistikkApi() }
route("/swagger") {
route("openapi.json") {
openApiSpec()
}
swaggerUI("openapi.json")
}
route("/swagger") {
route("openapi.json") {
openApiSpec()
}
swaggerUI("openapi.json")
}
} else {
authenticate(*issuers.allIssuers()) {
Expand Down Expand Up @@ -378,24 +379,22 @@ private fun Route.api(sseChannel: BroadcastChannel<SseEvent>) {
sseChannel = sseChannel
)

route("api", {
hidden = true
}) {
route("driftsmeldinger") {
route("api") {
route("driftsmeldinger", { hidden = true }) {
DriftsmeldingerApis()
}
route("fagsak") {
route("fagsak", { hidden = true }) {
FagsakApis()
}
route("saksbehandler") {
route("saksbehandler", { hidden = true }) {
route("oppgaver") {
OppgaveApis()
}

SaksbehandlerOppgavekoApis()
SaksbehandlerNøkkeltallApis()
}
route("avdelingsleder") {
route("avdelingsleder", { hidden = true }) {
AvdelingslederApis()
route("oppgavekoer") {
AvdelingslederOppgavekøApis() // Erstattet av OppgaveKoApis i V3
Expand All @@ -408,15 +407,16 @@ private fun Route.api(sseChannel: BroadcastChannel<SseEvent>) {

NavAnsattApis()

route("konfig") { KonfigApis() }
route("konfig", { hidden = true }) { KonfigApis() }
KodeverkApis()

route("ny-oppgavestyring") {
route("ko") { OppgaveKoApis() }
route("oppgave") { OppgaveQueryApis() }
route("feltdefinisjon") { FeltdefinisjonApi() }
route("oppgavetype") { OppgavetypeApi() }
route("oppgave-v3") { OppgaveV3Api() }
route("ko", { hidden = true }) { OppgaveKoApis() }
route("oppgave", { hidden = true }) { OppgaveQueryApis() }
route("feltdefinisjon", { hidden = true }) { FeltdefinisjonApi() }
route("oppgavetype", { hidden = true }) { OppgavetypeApi() }
route("oppgave-v3", { hidden = true }) { OppgaveV3Api() }
route("sok") { SøkeboksApi() }
}
}
}
12 changes: 12 additions & 0 deletions src/main/kotlin/no/nav/k9/los/KoinProfiles.kt
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ import no.nav.k9.los.nyoppgavestyring.query.OppgaveQueryService
import no.nav.k9.los.nyoppgavestyring.query.db.OppgaveQueryRepository
import no.nav.k9.los.nyoppgavestyring.reservasjon.ReservasjonV3Repository
import no.nav.k9.los.nyoppgavestyring.reservasjon.ReservasjonV3Tjeneste
import no.nav.k9.los.nyoppgavestyring.søkeboks.SøkeboksTjeneste
import no.nav.k9.los.nyoppgavestyring.visningoguttrekk.OppgaveRepository
import no.nav.k9.los.tjenester.avdelingsleder.AvdelingslederTjeneste
import no.nav.k9.los.tjenester.avdelingsleder.nokkeltall.NokkeltallTjeneste
Expand Down Expand Up @@ -652,6 +653,17 @@ fun common(app: Application, config: Configuration) = module {
transactionalManager = get()
)
}

single {
SøkeboksTjeneste(
queryService = get(),
oppgaveRepository = get(),
pdlService = get(),
pepClient = get(),
reservasjonV3Tjeneste = get(),
saksbehandlerRepository = get()
)
}
}

fun localDevConfig() = module {
Expand Down
4 changes: 4 additions & 0 deletions src/main/kotlin/no/nav/k9/los/integrasjon/pdl/PersonPdl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,7 @@ internal fun PersonPdl.fnr(): String {
internal fun PersonPdl.kjoenn(): String {
return if(data.hentPerson.kjoenn.isNotEmpty()) data.hentPerson.kjoenn[0].kjoenn else "Uten kjønn"
}

internal fun PersonPdl.doedsdato(): LocalDate? {
return if(data.hentPerson.doedsfall.isNotEmpty()) data.hentPerson.doedsfall[0].doedsdato else null
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package no.nav.k9.los.integrasjon.pdl

class PersonPdlResponse(
data class PersonPdlResponse(
val ikkeTilgang: Boolean,
val person: PersonPdl?
)
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
package no.nav.k9.los.nyoppgavestyring.domeneadaptere.k9.punsjtillos

import no.nav.k9.kodeverk.behandling.BehandlingStatus
import no.nav.k9.kodeverk.behandling.FagsakYtelseType
import no.nav.k9.kodeverk.behandling.aksjonspunkt.*
import no.nav.k9.kodeverk.behandling.aksjonspunkt.AksjonspunktStatus
import no.nav.k9.los.domene.modell.BehandlingType
import no.nav.k9.los.integrasjon.kafka.dto.BehandlingProsessEventDto
import no.nav.k9.los.integrasjon.kafka.dto.PunsjEventDto
import no.nav.k9.los.nyoppgavestyring.mottak.oppgave.OppgaveDto
import no.nav.k9.los.nyoppgavestyring.mottak.oppgave.OppgaveFeltverdiDto
import no.nav.k9.los.nyoppgavestyring.mottak.oppgave.OppgaveV3
import no.nav.k9.los.nyoppgavestyring.mottak.oppgave.Oppgavestatus
import no.nav.k9.sak.kontrakt.aksjonspunkt.AksjonspunktTilstandDto

class EventTilDtoMapper {
companion object {
Expand Down Expand Up @@ -71,12 +67,10 @@ class EventTilDtoMapper {
verdi = BehandlingType.fraKode(it).kode,
)
},
event.ytelse?.let {
OppgaveFeltverdiDto(
nøkkel = "ytelsestype",
verdi = it,
)
},
OppgaveFeltverdiDto(
nøkkel = "ytelsestype",
verdi = event.ytelse,
),
event.ferdigstiltAv?.let {
OppgaveFeltverdiDto(
nøkkel = "ansvarligSaksbehandler",
Expand Down Expand Up @@ -105,117 +99,5 @@ class EventTilDtoMapper {
)
)
}

internal fun utledVentetype(
behandlingSteg: String?,
behandlingStatus: String?,
åpneAksjonspunkter: List<AksjonspunktTilstandDto>
): Ventekategori? {
if (behandlingStatus == BehandlingStatus.AVSLUTTET.kode) {
return null
}

if (åpneAksjonspunkter.isEmpty()) {
return Ventekategori.AVVENTER_ANNET
}

val førsteAPMedFristOgVenteårsak = åpneAksjonspunkter
.filter { aksjonspunktTilstandDto -> aksjonspunktTilstandDto.fristTid != null && aksjonspunktTilstandDto.venteårsak != null }
.sortedBy { aksjonspunktTilstandDto -> aksjonspunktTilstandDto.fristTid }
.firstOrNull()

if (førsteAPMedFristOgVenteårsak != null) {
return førsteAPMedFristOgVenteårsak.venteårsak.ventekategori
}

val autopunkter = åpneAksjonspunkter.filter { åpentAksjonspunkt ->
val aksjonspunktDefinisjon = AksjonspunktDefinisjon.fraKode(åpentAksjonspunkt.aksjonspunktKode)
aksjonspunktDefinisjon.erAutopunkt()
}

val ventekategorierPrioritert = listOf(
Ventekategori.AVVENTER_TEKNISK_FEIL,
Ventekategori.AVVENTER_SAKSBEHANDLER,
Ventekategori.AVVENTER_ANNET,
Ventekategori.AVVENTER_ARBEIDSGIVER,
Ventekategori.AVVENTER_SØKER,
Ventekategori.AVVENTER_ANNET_IKKE_SAKSBEHANDLINGSTID
)

// Prioriter autopunkter fremfor andre aksjonspunkter
ventekategorierPrioritert.forEach { ventekategori ->
if (apInneholder(autopunkter, ventekategori)) {
return ventekategori
}
}

val løsbareManuelleAksjonspunkter = åpneAksjonspunkter.filter { åpentAksjonspunkt ->
val aksjonspunktDefinisjon = AksjonspunktDefinisjon.fraKode(åpentAksjonspunkt.aksjonspunktKode)
aksjonspunktDefinisjon.behandlingSteg != null && aksjonspunktDefinisjon.behandlingSteg.kode == behandlingSteg
}
ventekategorierPrioritert.forEach { ventekategori ->
if (apInneholder(løsbareManuelleAksjonspunkter, ventekategori)) {
return ventekategori
}
}

return Ventekategori.AVVENTER_ANNET
}

private fun ventekategoriTilFlagg(
ventekategori: Ventekategori?
): List<OppgaveFeltverdiDto> {
if (ventekategori == null) {
return avventerflagg("")
}
return when (ventekategori) {
Ventekategori.AVVENTER_SØKER -> avventerflagg("avventerSøker")
Ventekategori.AVVENTER_ARBEIDSGIVER -> avventerflagg("avventerArbeidsgiver")
Ventekategori.AVVENTER_SAKSBEHANDLER -> avventerflagg("avventerSaksbehandler")
Ventekategori.AVVENTER_TEKNISK_FEIL -> avventerflagg("avventerTekniskFeil")
Ventekategori.AVVENTER_ANNET -> avventerflagg("avventerAnnet")
Ventekategori.AVVENTER_ANNET_IKKE_SAKSBEHANDLINGSTID -> avventerflagg("avventerAnnetIkkeSaksbehandlingstid")
else -> throw IllegalArgumentException("Ukjent ventekategori: ${ventekategori}")
}
}

private fun apInneholder(
sbareAksjonspunkt: List<AksjonspunktTilstandDto>,
ventekategori: Ventekategori
): Boolean {
return løsbareAksjonspunkt.firstOrNull { aksjonspunktTilstandDto ->
AksjonspunktDefinisjon.fraKode(aksjonspunktTilstandDto.aksjonspunktKode).defaultVentekategori == ventekategori
} != null
}

private fun avventerflagg(skalSettesTrue: String): List<OppgaveFeltverdiDto> {
val oppgavefelter = mutableListOf<OppgaveFeltverdiDto>()
listOf(
"avventerSøker",
"avventerArbeidsgiver",
"avventerSaksbehandler",
"avventerTekniskFeil",
"avventerAnnet",
"avventerAnnetIkkeSaksbehandlingstid"
).forEach {
if (skalSettesTrue == it) {
oppgavefelter.add(
OppgaveFeltverdiDto(
nøkkel = it,
verdi = true.toString()
)
)
} else {
oppgavefelter.add(
OppgaveFeltverdiDto(
nøkkel = it,
verdi = false.toString()
)
)
}
}

return oppgavefelter
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import no.nav.k9.los.nyoppgavestyring.query.dto.query.OppgaveQuery
data class QueryRequest(
val oppgaveQuery: OppgaveQuery,
val fjernReserverte: Boolean = false,

val avgrensning: Avgrensning? = null,
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class OppgaveQuerySqlBuilder(
}

private fun hentTransientFeltutleder(feltområde: String?, feltkode: String): TransientFeltutleder? {
return felter[OmrådeOgKode(feltområde, feltkode)]!!.transientFeltutleder
return felter[OmrådeOgKode(feltområde, feltkode)]?.transientFeltutleder
}

fun medFeltverdi(combineOperator: CombineOperator, feltområde: String?, feltkode: String, operator: FeltverdiOperator, feltverdi: Any?) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,14 @@ class ReservasjonV3Tjeneste(
return ansvarligSaksbehandlerIdent == saksbehandlerIdentSomSkalHaReservasjon
}

fun finnAktivReservasjon(
reservasjonsnøkkel: String,
): ReservasjonV3? {
return transactionalManager.transaction { tx ->
reservasjonV3Repository.hentAktivReservasjonForReservasjonsnøkkel(reservasjonsnøkkel, tx)
}
}

private fun finnAktivReservasjon(
reservasjonsnøkkel: String,
tx: TransactionalSession
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package no.nav.k9.los.nyoppgavestyring.søkeboks

data class SøkQuery (
val searchString: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package no.nav.k9.los.nyoppgavestyring.søkeboks

import io.github.smiley4.ktorswaggerui.dsl.routing.post
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import no.nav.k9.los.integrasjon.rest.RequestContextService
import org.koin.ktor.ext.inject


fun Route.SøkeboksApi() {
val requestContextService by inject<RequestContextService>()
val søkeboksTjeneste by inject<SøkeboksTjeneste>()

post(
{
description =
"Søk etter oppgaver og tilhørende person. Dersom input er på 9 tegn antas den som journalpostId, ved 11 tegn som fødselsnummer, og ellers som fagsaknummer."
request { body<SøkQuery>() }
response {
HttpStatusCode.OK to { body<List<SøkeboksOppgaveDto>>() }
}
}
) {
val søkQuery = call.receive<SøkQuery>()
requestContextService.withRequestContext(call) {
call.respond(søkeboksTjeneste.finnOppgaver(søkQuery.searchString))
}
}
}
Loading

0 comments on commit a9e37d3

Please sign in to comment.