Skip to content
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

Job for å prosessere klagevedtak fra KA #631

Merged
merged 6 commits into from
Jan 11, 2022
Merged
Show file tree
Hide file tree
Changes from 5 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
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,10 @@ internal class OppgaveHttpClient(
"--- ${
Tidspunkt.now(clock).toOppgaveFormat()
} - Opprettet av Supplerende Stønad ---\nSaksnummer : ${config.saksreferanse}"
is OppgaveConfig.Klage.Vedtak ->
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
is OppgaveConfig.Klage.Vedtak ->
is OppgaveConfig.Klageinstans.Vedtak ->

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Da blir det också OppgaveConfig.Klageinstans.Saksbehandler og OppgaveConfig.Klageinstans.Attestering for saksbehandlings & attesteringsoppgaver for klagene som behandles. Blir det ikke rart? Klageinstansen er ikke involvert i de.

Kanske kunde endre navnet fra Vedtak til VedtakFraKlageinstans eller noe istedet?

Copy link
Contributor

Choose a reason for hiding this comment

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

Hmm. Hvorfor trenger vi .Attestering? Kan ikke attesteringsoppgaven heller gå inn i den vanlige flyten vår.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Per nå så ser vår oppgave-config klasse såhär for Klage:

sealed class Klage(..) {
  data class Saksbehandler(...): Klage()
  data class Attestering(...): Klage()
  data class Vedtak(...): Klage()
}

Hvis vi endrer Klage til Klageinstans så påverkas alla de tre. Men kanske jag kunne trekt ut Vedtak og lagt det som en egen liksom? Är de det du tänker? 😊

"--- ${
Tidspunkt.now(clock).toOppgaveFormat()
} - Opprettet av Supplerende Stønad ---\nSaksnummer : ${config.saksreferanse}\n${OppgavebeskrivelseMapper.map(config.utfall)}"
is OppgaveConfig.Klage ->
"--- ${
Tidspunkt.now(clock).toOppgaveFormat()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package no.nav.su.se.bakover.client.oppgave

import no.nav.su.se.bakover.domain.hendelse.Personhendelse
import no.nav.su.se.bakover.domain.klage.KlagevedtakUtfall
import no.nav.su.se.bakover.domain.person.SivilstandTyper

object OppgavebeskrivelseMapper {
fun map(Utfall: KlagevedtakUtfall) {
aryani1 marked this conversation as resolved.
Show resolved Hide resolved
"Utfall: ${Utfall.toReadableName()}\n\n${Utfall.LukkBeskrivelse()}"
}

fun map(hendelse: Personhendelse.Hendelse) = when (hendelse) {
is Personhendelse.Hendelse.Dødsfall -> {
"Dødsfall\n" +
Expand Down Expand Up @@ -33,4 +38,31 @@ object OppgavebeskrivelseMapper {
SivilstandTyper.SKILT_PARTNER -> "Skilt partner"
SivilstandTyper.GJENLEVENDE_PARTNER -> "Gjenlevende partner"
}

private fun KlagevedtakUtfall.toReadableName() = when (this) {
KlagevedtakUtfall.TRUKKET -> "Trukket"
KlagevedtakUtfall.RETUR -> "Retur"
KlagevedtakUtfall.OPPHEVET -> "Opphevet"
KlagevedtakUtfall.MEDHOLD -> "Medhold"
KlagevedtakUtfall.DELVIS_MEDHOLD -> "Delvis medhold"
KlagevedtakUtfall.STADFESTELSE -> "Stadfestelse"
KlagevedtakUtfall.UGUNST -> "Ugunst"
KlagevedtakUtfall.AVVIST -> "Avvist"
}
private fun KlagevedtakUtfall.LukkBeskrivelse() = when (this) {
/*
* Informasjonsoppgaver som må lukkes manuellt.
aryani1 marked this conversation as resolved.
Show resolved Hide resolved
* */
KlagevedtakUtfall.TRUKKET,
KlagevedtakUtfall.STADFESTELSE,
KlagevedtakUtfall.AVVIST -> "Denna oppgaven er kun til opplysning. Oppgaven må lukkes manuellt."
aryani1 marked this conversation as resolved.
Show resolved Hide resolved
/*
* Oppgaver som krever handling. Lukkes automatiskt av oss.
aryani1 marked this conversation as resolved.
Show resolved Hide resolved
* */
KlagevedtakUtfall.RETUR,
KlagevedtakUtfall.OPPHEVET,
KlagevedtakUtfall.MEDHOLD,
KlagevedtakUtfall.DELVIS_MEDHOLD,
KlagevedtakUtfall.UGUNST -> "Klagen krever ytterliggere saksbehandling. Lukking av oppgaven håndteres automatiskt."
aryani1 marked this conversation as resolved.
Show resolved Hide resolved
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,28 @@ package no.nav.su.se.bakover.database.klage

import arrow.core.Either
import kotliquery.Row
import no.nav.su.se.bakover.common.persistence.TransactionContext
import no.nav.su.se.bakover.database.PostgresSessionFactory
import no.nav.su.se.bakover.database.PostgresTransactionContext.Companion.withTransaction
import no.nav.su.se.bakover.database.hentListe
import no.nav.su.se.bakover.database.insert
import no.nav.su.se.bakover.database.oppdatering
import no.nav.su.se.bakover.database.tidspunkt
import no.nav.su.se.bakover.database.uuid
import no.nav.su.se.bakover.domain.klage.KlagevedtakRepo
import no.nav.su.se.bakover.domain.klage.ProsessertKlagevedtak
import no.nav.su.se.bakover.domain.klage.UprosessertFattetKlagevedtak
import org.postgresql.util.PSQLException
import java.util.UUID

internal class KlagevedtakPostgresRepo(private val sessionFactory: PostgresSessionFactory) : KlagevedtakRepo {
internal enum class KlagevedtakType(private val verdi: String) {
UPROSESSERT("UPROSESSERT"),
PROSESSERT("PROSESSERT"),
FEIL("FEIL");

override fun toString(): String = verdi
}

override fun lagre(klagevedtak: UprosessertFattetKlagevedtak) {
Either.catch {
Expand All @@ -24,7 +36,7 @@ internal class KlagevedtakPostgresRepo(private val sessionFactory: PostgresSessi
params = mapOf(
"id" to klagevedtak.id,
"opprettet" to klagevedtak.opprettet,
"type" to "UPROSESSERT",
"type" to KlagevedtakType.UPROSESSERT.toString(),
"metadata" to klagevedtak.metadata.toDatabaseJson(),
),
session = session,
Expand All @@ -40,22 +52,52 @@ internal class KlagevedtakPostgresRepo(private val sessionFactory: PostgresSessi
}
}

override fun lagre(klagevedtak: ProsessertKlagevedtak, transactionContext: TransactionContext) {
transactionContext.withTransaction { transaction ->
"""
update klagevedtak
set type = :type, oppgaveId = :oppgaveid
where id = :id
""".trimIndent()
.insert(
params = mapOf(
"id" to klagevedtak.id,
"type" to KlagevedtakType.PROSESSERT.toString(),
"oppgaveid" to klagevedtak.oppgaveId,
),
session = transaction,
)
}
}

override fun hentUbehandlaKlagevedtak(): List<UprosessertFattetKlagevedtak> {
return sessionFactory.withSession { session ->
"""
select * from klagevedtak where type = 'UPROSESSERT'
select * from klagevedtak where type = '${KlagevedtakType.UPROSESSERT}'
""".trimIndent().hentListe(
emptyMap(),
session,
) { rowToKlage(it) }
}
}

override fun markerSomFeil(id: UUID) {
sessionFactory.withSession { session ->
"""
update klagevedtak set type = '${KlagevedtakType.FEIL}' where id = :id
""".trimIndent().oppdatering(mapOf("id" to id), session)
}
}

private fun rowToKlage(row: Row): UprosessertFattetKlagevedtak {
return UprosessertFattetKlagevedtak(
id = row.uuid("id"),
opprettet = row.tidspunkt("opprettet"),
metadata = KlagevedtakMetadataJson.toKlagevedtakMetadata(row.string("metadata")),
)
}

override fun defaultTransactionContext(): TransactionContext {
return sessionFactory.newTransactionContext()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
alter table klagevedtak add column oppgaveid text
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
import no.nav.su.se.bakover.database.TestDataHelper
import no.nav.su.se.bakover.database.withMigratedDb
import no.nav.su.se.bakover.domain.klage.KlagevedtakUtfall
import no.nav.su.se.bakover.domain.klage.ProsessertKlagevedtak
import no.nav.su.se.bakover.domain.klage.UprosessertFattetKlagevedtak
import no.nav.su.se.bakover.test.fixedTidspunkt
import org.junit.jupiter.api.Test
Expand Down Expand Up @@ -81,4 +83,37 @@ internal class KlagevedtakPostgresRepoTest {
}
}
}

@Test
fun `Endrer og lagrer type til PROSESSERT`() {
withMigratedDb { dataSource ->
val testDataHelper = TestDataHelper(dataSource)
val klagevedtakRepo = testDataHelper.klagevedtakPostgresRepo
val id = UUID.randomUUID()
UprosessertFattetKlagevedtak(
id = id,
opprettet = fixedTidspunkt,
metadata = UprosessertFattetKlagevedtak.Metadata(
hendelseId = UUID.randomUUID().toString(),
offset = 1,
partisjon = 2,
key = UUID.randomUUID().toString(),
value = "{}",
),
).also {
klagevedtakRepo.lagre(it)
klagevedtakRepo.lagre(
ProsessertKlagevedtak(
id = it.id,
eventId = it.metadata.hendelseId,
klageId = UUID.randomUUID(),
utfall = KlagevedtakUtfall.STADFESTELSE,
vedtaksbrevReferanse = UUID.randomUUID().toString(),
oppgaveId = null
)
)
klagevedtakRepo.hentUbehandlaKlagevedtak() shouldBe emptyList()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package no.nav.su.se.bakover.domain.klage

import no.nav.su.se.bakover.domain.oppgave.OppgaveId
import java.util.UUID

/**
* Representerer ett fattet klagevedtak av Kabal.
*/
data class UprosessertKlagevedtak(
val id: UUID,
val eventId: String,
val klageId: UUID,
val utfall: KlagevedtakUtfall,
val vedtaksbrevReferanse: String,
) {
fun tilProsessert(oppgaveId: OppgaveId?) = ProsessertKlagevedtak(
id = id,
eventId = eventId,
klageId = klageId,
utfall = utfall,
vedtaksbrevReferanse = vedtaksbrevReferanse,
oppgaveId = oppgaveId,
)
}

data class ProsessertKlagevedtak(
val id: UUID,
val eventId: String,
val klageId: UUID,
val utfall: KlagevedtakUtfall,
val vedtaksbrevReferanse: String,
val oppgaveId: OppgaveId?,
)

enum class KlagevedtakUtfall {
TRUKKET,
RETUR,
OPPHEVET,
MEDHOLD,
DELVIS_MEDHOLD,
STADFESTELSE,
UGUNST,
AVVIST
}

sealed interface KanIkkeTolkeKlagevedtak {
object KunneIkkeDeserialisere : KanIkkeTolkeKlagevedtak
object UgyldigeVerdier : KanIkkeTolkeKlagevedtak
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package no.nav.su.se.bakover.domain.klage

import no.nav.su.se.bakover.common.persistence.TransactionContext
import java.util.UUID

interface KlagevedtakRepo {
fun lagre(klagevedtak: UprosessertFattetKlagevedtak)
fun lagre(klagevedtak: ProsessertKlagevedtak, transactionContext: TransactionContext = defaultTransactionContext())
fun hentUbehandlaKlagevedtak(): List<UprosessertFattetKlagevedtak>
fun markerSomFeil(id: UUID)
fun defaultTransactionContext(): TransactionContext
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import no.nav.su.se.bakover.domain.NavIdentBruker
import no.nav.su.se.bakover.domain.Oppgavetype
import no.nav.su.se.bakover.domain.Saksnummer
import no.nav.su.se.bakover.domain.journal.JournalpostId
import no.nav.su.se.bakover.domain.klage.KlagevedtakUtfall
import java.time.Clock
import java.time.LocalDate
import java.util.UUID
Expand Down Expand Up @@ -125,6 +126,37 @@ sealed class OppgaveConfig {
override val aktivDato: LocalDate by lazy { LocalDate.now(clock) }
override val fristFerdigstillelse: LocalDate by lazy { aktivDato.plusDays(30) }

/**
* Opprettes av en job som prosesserer vedtaken fra Klageinstans. Består av:
* 1) Oppgaver som bara formidler informasjon, disse må lukkes av saksbehandler selv i gosys.
* 2) Oppgaver som krever ytterliggere saksbehandling på klagen. Disse lukker systemet selv.
* */
sealed class Vedtak : Klage() {
abstract val utfall: KlagevedtakUtfall

data class Handling(
override val saksnummer: Saksnummer,
override val aktørId: AktørId,
override val journalpostId: JournalpostId,
Copy link
Contributor

Choose a reason for hiding this comment

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

Tror denne er optional fra Klageinstansen. aka. nullable

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Den står som required i deras schema.
Ref: https://github.com/navikt/kabal-api/blob/main/docs/schema/klagevedtak-fattet.json (vedtaksbrevReferanse)

override val tilordnetRessurs: NavIdentBruker?,
override val clock: Clock,
override val utfall: KlagevedtakUtfall,
) : Vedtak() {
override val oppgavetype = Oppgavetype.BEHANDLE_SAK
}

data class Informasjon(
override val saksnummer: Saksnummer,
override val aktørId: AktørId,
override val journalpostId: JournalpostId,
override val tilordnetRessurs: NavIdentBruker?,
override val clock: Clock,
override val utfall: KlagevedtakUtfall
) : Vedtak() {
override val oppgavetype = Oppgavetype.VURDER_KONSEKVENS_FOR_YTELSE
}
}

/**
* Dette er saksbehandlingsoppgaven som opprettes:
* 1) Når en klage opprettes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import no.nav.su.se.bakover.domain.beregning.Beregning
import no.nav.su.se.bakover.domain.brev.LagBrevRequest
import no.nav.su.se.bakover.domain.dokument.Dokument
import no.nav.su.se.bakover.domain.grunnlag.Grunnlag
import no.nav.su.se.bakover.domain.klage.KanIkkeTolkeKlagevedtak
import no.nav.su.se.bakover.domain.klage.KlageTilAttestering
import no.nav.su.se.bakover.domain.klage.KunneIkkeBekrefteKlagesteg
import no.nav.su.se.bakover.domain.klage.KunneIkkeOppretteKlage
Expand All @@ -34,6 +35,7 @@ import no.nav.su.se.bakover.domain.klage.KunneIkkeVurdereKlage
import no.nav.su.se.bakover.domain.klage.OpprettetKlage
import no.nav.su.se.bakover.domain.klage.OversendtKlage
import no.nav.su.se.bakover.domain.klage.UprosessertFattetKlagevedtak
import no.nav.su.se.bakover.domain.klage.UprosessertKlagevedtak
import no.nav.su.se.bakover.domain.klage.VilkårsvurdertKlage
import no.nav.su.se.bakover.domain.klage.VurdertKlage
import no.nav.su.se.bakover.domain.nøkkeltall.Nøkkeltall
Expand Down Expand Up @@ -828,6 +830,9 @@ open class AccessCheckProxy(
},
klagevedtakService = object : KlagevedtakService {
override fun lagre(klageVedtak: UprosessertFattetKlagevedtak) = kastKanKunKallesFraAnnenService()
override fun håndterUtfallFraKlageinstans(deserializeAndMap: (id: UUID, json: String) -> Either<KanIkkeTolkeKlagevedtak, UprosessertKlagevedtak>) {
kastKanKunKallesFraAnnenService()
}
},
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,10 @@ object ServiceBuilder {
)
val klagevedtakService = KlagevedtakServiceImpl(
klagevedtakRepo = databaseRepos.klageVedtakRepo,
klageRepo = databaseRepos.klageRepo,
oppgaveService = oppgaveService,
personService = personService,
sessionFactory = databaseRepos.sessionFactory
)
return Services(
avstemming = AvstemmingServiceImpl(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package no.nav.su.se.bakover.service.klage

import arrow.core.Either
import no.nav.su.se.bakover.domain.klage.KanIkkeTolkeKlagevedtak
import no.nav.su.se.bakover.domain.klage.UprosessertFattetKlagevedtak
import no.nav.su.se.bakover.domain.klage.UprosessertKlagevedtak
import java.util.UUID

interface KlagevedtakService {
fun lagre(klageVedtak: UprosessertFattetKlagevedtak)
fun håndterUtfallFraKlageinstans(deserializeAndMap: (id: UUID, json: String) -> Either<KanIkkeTolkeKlagevedtak, UprosessertKlagevedtak>)
}
Loading