Skip to content

Commit

Permalink
Transient feltutleder klar til lokal test (#1774)
Browse files Browse the repository at this point in the history
* Transient feltutleder klar til lokal test

* Retter diverse SQL- og typefeil.

* Oppdaterer riktig SQL-fragment og oppdaterer index for å hindre parameternavnkollisjon.

* Saksbehandlingstidutleder

* Fjerner : fra parameternavn.

* Retter SQL-syntaks.

* Legger til felt- og oppgavedefinisjon for saksbehandlingstid.

* Hentverdi på løpendeDurationTransientFeltutleder

* Retter rekkefølge på parametere ved utregning av duration.

* Saksbehandlingstid og feilfiks

* Døper om saksbehandlingstid til oppgavesaksbehandlingstid siden det går saksbehandlingstid før oppgaven har blitt opprettet (f.eks. i k9-punsj).

* Feltutledere for akkumulert ventetid enkeltfelter

* Gjør det optional å sende med durationFelter og løpendetidfelter.

* Legger til felt for "Tid siden mottatt dato".

* Legger til gjenglemt fil.

* Retter testfeil som skyldes bruk av felt som nå er deaktivert ved bruk i query (aktorId).

---------

Co-authored-by: Stian Grenborgen <[email protected]>
  • Loading branch information
boerta and stiangre authored Dec 5, 2023
1 parent 4ab40ed commit 18afc66
Show file tree
Hide file tree
Showing 34 changed files with 764 additions and 112 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -272,15 +272,15 @@ class EventTilDtoMapper {
ventekategori: Ventekategori?
): List<OppgaveFeltverdiDto> {
if (ventekategori == null) {
return avventerIngen()
return avventerflagg("")
}
return when (ventekategori) {
Ventekategori.AVVENTER_SØKER -> avventerSøker()
Ventekategori.AVVENTER_ARBEIDSGIVER -> avventerArbeidsgiver()
Ventekategori.AVVENTER_SAKSBEHANDLER -> avventerSaksbehandler()
Ventekategori.AVVENTER_TEKNISK_FEIL -> avventerTekniskFeil()
Ventekategori.AVVENTER_ANNET -> avventerAnnet()
Ventekategori.AVVENTER_ANNET_IKKE_SAKSBEHANDLINGSTID -> avventerAnnetIkkeSaksbehandlingstid()
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}")
}
}
Expand All @@ -294,34 +294,6 @@ class EventTilDtoMapper {
} != null
}

private fun avventerSøker(): List<OppgaveFeltverdiDto> {
return avventerflagg("avventerSøker")
}

private fun avventerArbeidsgiver(): List<OppgaveFeltverdiDto> {
return avventerflagg("avventerArbeidsgiver")
}

private fun avventerSaksbehandler(): List<OppgaveFeltverdiDto> {
return avventerflagg("avventerSaksbehandler")
}

private fun avventerTekniskFeil(): List<OppgaveFeltverdiDto> {
return avventerflagg("avventerTekniskFeil")
}

private fun avventerAnnet(): List<OppgaveFeltverdiDto> {
return avventerflagg("avventerAnnet")
}

private fun avventerAnnetIkkeSaksbehandlingstid(): List<OppgaveFeltverdiDto> {
return avventerflagg("avventerAnnetIkkeSaksbehandlingstid")
}

private fun avventerIngen(): List<OppgaveFeltverdiDto> {
return avventerflagg("")
}

private fun avventerflagg(skalSettesTrue: String): List<OppgaveFeltverdiDto> {
val oppgavefelter = mutableListOf<OppgaveFeltverdiDto>()
listOf(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.k9.los.nyoppgavestyring.mottak.feltdefinisjon

import no.nav.k9.los.nyoppgavestyring.mottak.omraade.Område
import no.nav.k9.los.spi.felter.TransientFeltutleder


class Feltdefinisjon(
Expand All @@ -13,6 +14,7 @@ class Feltdefinisjon(
val visTilBruker: Boolean,
val kokriterie: Boolean,
val kodeverkreferanse: Kodeverkreferanse?,
val transientFeltutleder: TransientFeltutleder?
) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package no.nav.k9.los.nyoppgavestyring.mottak.feltdefinisjon

import no.nav.k9.los.spi.felter.TransientFeltutleder

data class FeltdefinisjonDto(
val id: String,
val visningsnavn: String,
Expand All @@ -8,4 +10,5 @@ data class FeltdefinisjonDto(
val visTilBruker: Boolean,
val kokriterie: Boolean,
val kodeverkreferanse: KodeverkReferanseDto?,
val transientFeltutleder: String?
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import kotliquery.queryOf
import no.nav.k9.los.nyoppgavestyring.feilhandtering.IllegalDeleteException
import no.nav.k9.los.nyoppgavestyring.mottak.omraade.Område
import no.nav.k9.los.nyoppgavestyring.mottak.omraade.OmrådeRepository
import no.nav.k9.los.nyoppgavestyring.transientfeltutleder.GyldigeTransientFeltutleder
import no.nav.k9.los.spi.felter.TransientFeltutleder
import no.nav.k9.los.utils.Cache
import org.postgresql.util.PSQLException
import org.slf4j.LoggerFactory
Expand Down Expand Up @@ -33,7 +35,8 @@ class FeltdefinisjonRepository(val områdeRepository: OmrådeRepository) {
tolkesSom = row.string("tolkes_som"),
visTilBruker = row.boolean("vis_til_bruker"),
kokriterie = row.boolean("kokriterie"),
kodeverkreferanse = row.stringOrNull("kodeverkreferanse")?.let { Kodeverkreferanse(it) }
kodeverkreferanse = row.stringOrNull("kodeverkreferanse")?.let { Kodeverkreferanse(it) },
transientFeltutleder = row.stringOrNull("transient_feltutleder")?.let { GyldigeTransientFeltutleder.hentFeltutleder(it) }
)
}.asList
)
Expand Down Expand Up @@ -63,7 +66,7 @@ class FeltdefinisjonRepository(val områdeRepository: OmrådeRepository) {
}

fun oppdater(oppdaterListe: Set<Feltdefinisjon>, område: Område, tx: TransactionalSession) {
oppdaterListe.forEach { datatype ->
oppdaterListe.forEach { feltdefinisjon ->
tx.run(
queryOf(
"""
Expand All @@ -73,17 +76,19 @@ class FeltdefinisjonRepository(val områdeRepository: OmrådeRepository) {
tolkes_som = :tolkesSom,
vis_til_bruker = :visTilBruker,
kokriterie = :kokriterie,
kodeverkreferanse = :kodeverkreferanse
kodeverkreferanse = :kodeverkreferanse,
transient_feltutleder = :transientFeltutleder
WHERE omrade_id = :omradeId AND ekstern_id = :eksternId""",
mapOf(
"eksternId" to datatype.eksternId,
"eksternId" to feltdefinisjon.eksternId,
"omradeId" to område.id,
"visningsnavn" to datatype.visningsnavn,
"listeType" to datatype.listetype,
"tolkesSom" to datatype.tolkesSom,
"visTilBruker" to datatype.visTilBruker,
"kokriterie" to datatype.kokriterie,
"kodeverkreferanse" to datatype.kodeverkreferanse?.let { it.toDatabasestreng() }
"visningsnavn" to feltdefinisjon.visningsnavn,
"listeType" to feltdefinisjon.listetype,
"tolkesSom" to feltdefinisjon.tolkesSom,
"visTilBruker" to feltdefinisjon.visTilBruker,
"kokriterie" to feltdefinisjon.kokriterie,
"kodeverkreferanse" to feltdefinisjon.kodeverkreferanse?.let { it.toDatabasestreng() },
"transientFeltutleder" to feltdefinisjon.transientFeltutleder?.let { TransientFeltutleder.hentId(it) }
)
).asUpdate
)
Expand All @@ -103,7 +108,8 @@ class FeltdefinisjonRepository(val områdeRepository: OmrådeRepository) {
tolkes_som,
vis_til_bruker,
kokriterie,
kodeverkreferanse
kodeverkreferanse,
transient_feltutleder
)
values (
:eksternId,
Expand All @@ -113,7 +119,8 @@ class FeltdefinisjonRepository(val områdeRepository: OmrådeRepository) {
:tolkesSom,
:visTilBruker,
:kokriterie,
:kodeverkreferanse
:kodeverkreferanse,
:transientFeltutleder
)""",
mapOf(
"eksternId" to feltdefinisjon.eksternId,
Expand All @@ -123,7 +130,8 @@ class FeltdefinisjonRepository(val områdeRepository: OmrådeRepository) {
"tolkesSom" to feltdefinisjon.tolkesSom,
"visTilBruker" to feltdefinisjon.visTilBruker,
"kokriterie" to feltdefinisjon.kokriterie,
"kodeverkreferanse" to feltdefinisjon.kodeverkreferanse?.let { it.toDatabasestreng() }
"kodeverkreferanse" to feltdefinisjon.kodeverkreferanse?.let { it.toDatabasestreng() },
"transientFeltutleder" to feltdefinisjon.transientFeltutleder?.let { TransientFeltutleder.hentId(it) }
)
).asUpdate
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.k9.los.nyoppgavestyring.mottak.feltdefinisjon

import no.nav.k9.los.nyoppgavestyring.mottak.omraade.Område
import no.nav.k9.los.nyoppgavestyring.transientfeltutleder.GyldigeTransientFeltutleder

class Feltdefinisjoner(
val område: Område,
Expand All @@ -18,7 +19,8 @@ class Feltdefinisjoner(
tolkesSom = feltdefinisjonDto.tolkesSom,
visTilBruker = feltdefinisjonDto.visTilBruker,
kokriterie = feltdefinisjonDto.kokriterie,
kodeverkreferanse = feltdefinisjonDto.kodeverkreferanse?.let { kodeverkreferanseDto -> Kodeverkreferanse(kodeverkreferanseDto) }
kodeverkreferanse = feltdefinisjonDto.kodeverkreferanse?.let { kodeverkreferanseDto -> Kodeverkreferanse(kodeverkreferanseDto) },
transientFeltutleder = feltdefinisjonDto.transientFeltutleder?.let { GyldigeTransientFeltutleder.hentFeltutleder(it) }
)
}.toSet()
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class OmrådeRepository(private val dataSource: DataSource) {
private val log = LoggerFactory.getLogger(OmrådeRepository::class.java)
private val områdeCache = Cache<Område>()


fun hentOmråde(eksternId: String, tx: TransactionalSession): Område {
return områdeCache.hent(nøkkel = eksternId) {
tx.run(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import no.nav.k9.los.nyoppgavestyring.visningoguttrekk.OppgaveRepository
import no.nav.k9.los.tjenester.saksbehandler.IIdToken
import org.koin.java.KoinJavaComponent.inject
import java.lang.RuntimeException
import java.time.LocalDateTime
import javax.sql.DataSource

class OppgaveQueryService() {
Expand Down Expand Up @@ -54,10 +55,11 @@ class OppgaveQueryService() {
}

fun query(tx: TransactionalSession, oppgaveQuery: OppgaveQuery, idToken: IIdToken): List<Oppgaverad> {
val oppgaver: List<Long> = oppgaveQueryRepository.query(tx, oppgaveQuery)
val now = LocalDateTime.now()
val oppgaver: List<Long> = oppgaveQueryRepository.query(tx, oppgaveQuery, now)

val oppgaverader = runBlocking(context = CoroutineRequestContext(idToken)) {
mapOppgaver(tx, oppgaveQuery, oppgaver)
mapOppgaver(tx, oppgaveQuery, oppgaver, now)
}

if (oppgaveQuery.select.isEmpty()) {
Expand All @@ -67,12 +69,12 @@ class OppgaveQueryService() {
return oppgaverader
}

private suspend fun mapOppgaver(tx: TransactionalSession, oppgaveQuery: OppgaveQuery, oppgaveIder: List<Long>): List<Oppgaverad> {
private suspend fun mapOppgaver(tx: TransactionalSession, oppgaveQuery: OppgaveQuery, oppgaveIder: List<Long>, now: LocalDateTime): List<Oppgaverad> {
val oppgaverader = mutableListOf<Oppgaverad>()
val limit = oppgaveQuery.limit
var antall = 0
for (oppgaveId in oppgaveIder) {
val oppgaverad = mapOppgave(tx, oppgaveQuery, oppgaveId)
val oppgaverad = mapOppgave(tx, oppgaveQuery, oppgaveId, now)
if (oppgaverad != null) {
oppgaverader.add(oppgaverad)
antall++
Expand All @@ -84,8 +86,8 @@ class OppgaveQueryService() {
return oppgaverader
}

private suspend fun mapOppgave(tx: TransactionalSession, oppgaveQuery: OppgaveQuery, oppgaveId: Long): Oppgaverad? {
val oppgave = oppgaveRepository.hentOppgaveForId(tx, oppgaveId)
private suspend fun mapOppgave(tx: TransactionalSession, oppgaveQuery: OppgaveQuery, oppgaveId: Long, now: LocalDateTime): Oppgaverad? {
val oppgave = oppgaveRepository.hentOppgaveForId(tx, oppgaveId, now)

// TODO: Generaliser ABAC-attributter + sjekk av disse:
val saksnummer = oppgave.hentVerdi("K9", "saksnummer")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package no.nav.k9.los.nyoppgavestyring.query.db

data class OmrådeOgKode (
val område: String?,
val kode: String
)
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import no.nav.k9.los.nyoppgavestyring.query.dto.felter.Oppgavefelt
import no.nav.k9.los.nyoppgavestyring.query.dto.felter.Oppgavefelter
import no.nav.k9.los.nyoppgavestyring.query.dto.felter.Verdiforklaring
import no.nav.k9.los.nyoppgavestyring.query.dto.query.*
import no.nav.k9.los.nyoppgavestyring.transientfeltutleder.GyldigeTransientFeltutleder
import java.time.LocalDateTime
import javax.sql.DataSource

class OppgaveQueryRepository(
Expand All @@ -26,6 +28,10 @@ class OppgaveQueryRepository(
}

private fun hentAlleFelter(tx: TransactionalSession, medKodeverk: Boolean = true): List<Oppgavefelt> {
return hentAlleFelterMedMer(tx, medKodeverk).map { it.oppgavefelt }
}

private fun hentAlleFelterMedMer(tx: TransactionalSession, medKodeverk: Boolean = true): List<OppgavefeltMedMer> {
val felterFraDatabase = tx.run(
queryOf(
"""
Expand All @@ -34,7 +40,8 @@ class OppgaveQueryRepository(
fd.visningsnavn as visningsnavn,
fd.tolkes_som as tolkes_som,
fd.kokriterie as kokriterie,
fd.kodeverkreferanse as kodeverkreferanse
fd.kodeverkreferanse as kodeverkreferanse,
fd.transient_feltutleder as transient_feltutleder
FROM Feltdefinisjon fd INNER JOIN Omrade fo ON (
fo.id = fd.omrade_id
)
Expand All @@ -45,21 +52,24 @@ class OppgaveQueryRepository(
row.stringOrNull("kodeverkreferanse")?.let {
feltdefinisjonRepository.hentKodeverk(Kodeverkreferanse(it), tx) }
} else { null }
Oppgavefelt(
område = row.string("omrade"),
kode = row.string("kode"),
visningsnavn = row.string("visningsnavn"),
tolkes_som = row.string("tolkes_som"),
kokriterie = row.boolean("kokriterie"),
verdiforklaringerErUttømmende = kodeverk?.uttømmende ?: false,
verdiforklaringer = kodeverk?.let { kodeverk ->
kodeverk.verdier.map { kodeverkverdi ->
Verdiforklaring(
verdi = kodeverkverdi.verdi,
visningsnavn = kodeverkverdi.visningsnavn
)
OppgavefeltMedMer(
Oppgavefelt(
område = row.string("omrade"),
kode = row.string("kode"),
visningsnavn = row.string("visningsnavn"),
tolkes_som = row.string("tolkes_som"),
kokriterie = row.boolean("kokriterie"),
verdiforklaringerErUttømmende = kodeverk?.uttømmende ?: false,
verdiforklaringer = kodeverk?.let { kodeverk ->
kodeverk.verdier.map { kodeverkverdi ->
Verdiforklaring(
verdi = kodeverkverdi.verdi,
visningsnavn = kodeverkverdi.visningsnavn
)
}
}
}
),
row.stringOrNull("transient_feltutleder")?.let { GyldigeTransientFeltutleder.hentFeltutleder(it) }
)
}.asList
) ?: throw IllegalStateException("Feil ved kjøring av hentAlleFelter")
Expand All @@ -81,22 +91,22 @@ class OppgaveQueryRepository(
Oppgavefelt(null, "kildeområde", "Kildeområde", "String", false,false, emptyList()),
Oppgavefelt(null, "oppgavetype", "Oppgavetype", "String", true, false, emptyList()),
Oppgavefelt(null, "oppgaveområde", "Oppgaveområde", "String", false, false, emptyList())
)
).map { OppgavefeltMedMer(it, null) }

return (felterFraDatabase + standardfelter).sortedBy { it.visningsnavn };
return (felterFraDatabase + standardfelter).sortedBy { it.oppgavefelt.visningsnavn };
}

fun query(oppgaveQuery: OppgaveQuery): List<Long> {
return using(sessionOf(datasource)) {
it.transaction { tx -> query(tx, oppgaveQuery) }
it.transaction { tx -> query(tx, oppgaveQuery, LocalDateTime.now()) }
}
}

fun query(tx: TransactionalSession, oppgaveQuery: OppgaveQuery): List<Long> {
val oppgavefelterKodeOgType = hentAlleFelter(tx, medKodeverk = false)
.associate { felt -> felt.kode to Datatype.fraKode(felt.tolkes_som) }
fun query(tx: TransactionalSession, oppgaveQuery: OppgaveQuery, now: LocalDateTime): List<Long> {
val felter = hentAlleFelterMedMer(tx, medKodeverk = false)
.associate { felt -> OmrådeOgKode(felt.oppgavefelt.område, felt.oppgavefelt.kode) to felt }

return query(tx, toSqlOppgaveQuery(oppgaveQuery, oppgavefelterKodeOgType))
return query(tx, toSqlOppgaveQuery(oppgaveQuery, felter, now))
}


Expand All @@ -109,8 +119,8 @@ class OppgaveQueryRepository(
)
}

fun toSqlOppgaveQuery(oppgaveQuery: OppgaveQuery, oppgavefelterKodeOgType: Map<String, Datatype>): SqlOppgaveQuery {
val query = SqlOppgaveQuery(oppgavefelterKodeOgType)
fun toSqlOppgaveQuery(oppgaveQuery: OppgaveQuery, felter: Map<OmrådeOgKode, OppgavefeltMedMer>, now: LocalDateTime): SqlOppgaveQuery {
val query = SqlOppgaveQuery(felter, now)
val combineOperator = CombineOperator.AND
håndterFiltere(query, oppgaveQuery.filtere, combineOperator)
håndterOrder(query, oppgaveQuery.order)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package no.nav.k9.los.nyoppgavestyring.query.db

import no.nav.k9.los.nyoppgavestyring.query.dto.felter.Oppgavefelt
import no.nav.k9.los.spi.felter.TransientFeltutleder

class OppgavefeltMedMer(
val oppgavefelt: Oppgavefelt,
val transientFeltutleder: TransientFeltutleder?
)
Loading

0 comments on commit 18afc66

Please sign in to comment.