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

Start arbeidet på å lage en ny, mer generisk modell #1689

Merged
merged 1 commit into from
Mar 24, 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
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ dependencies {

api(project(":kontrakter-intern"))
api(project(":kontrakter-ekstern"))
api(project(":modell"))
api("no.nav.familie:prosessering-core:2.20250219093533_62416e5") {
// La spring boot håndtere flyway versjon selv om den er eldre enn den som er inkludert i prosessering-core
exclude("org.flywaydb")
Expand Down
14 changes: 14 additions & 0 deletions kontrakter-ekstern-v2/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
plugins {
kotlin("jvm")
}

group = "no.nav"

repositories {
mavenCentral()
}

dependencies {
api("com.fasterxml.jackson.core:jackson-annotations:2.18.3")
api(project("::kontrakter-felles"))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package no.nav.tilbakekreving.api.v2

import no.nav.tilbakekreving.kontrakter.bruker.Språkkode

data class BrukerDto(
val ident: String,
val språkkode: Språkkode,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package no.nav.tilbakekreving.api.v2

import no.nav.tilbakekreving.kontrakter.ytelse.Fagsystem
import no.nav.tilbakekreving.kontrakter.ytelse.Ytelsestype

data class EksternFagsakDto(
val eksternId: String,
val ytelsestype: Ytelsestype,
val fagsystem: Fagsystem,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package no.nav.tilbakekreving.api.v2

data class OpprettTilbakekrevingEvent(
val eksternFagsak: EksternFagsakDto,
val opprettelsesvalg: Opprettelsevalg,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package no.nav.tilbakekreving.api.v2

enum class Opprettelsevalg {
UTSETT_BEHANDLING_MED_VARSEL,
UTSETT_BEHANDLING_UTEN_VARSEL,
OPPRETT_BEHANDLING_MED_VARSEL,
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package no.nav.tilbakekreving.api.v1.dto

import no.nav.tilbakekreving.kontrakter.behandling.Behandlingsstatus
import no.nav.tilbakekreving.kontrakter.behandling.Behandlingstype
import no.nav.tilbakekreving.kontrakter.bruker.BrukerDto
import no.nav.tilbakekreving.kontrakter.bruker.FrontendBrukerDto
import no.nav.tilbakekreving.kontrakter.bruker.Språkkode
import no.nav.tilbakekreving.kontrakter.ytelse.Fagsystem
import no.nav.tilbakekreving.kontrakter.ytelse.Ytelsestype
Expand All @@ -13,7 +13,7 @@ data class FagsakDto(
val ytelsestype: Ytelsestype,
val fagsystem: Fagsystem,
val språkkode: Språkkode,
val bruker: BrukerDto,
val bruker: FrontendBrukerDto,
val behandlinger: List<BehandlingsoppsummeringDto>,
val institusjon: InstitusjonDto? = null,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ package no.nav.tilbakekreving.kontrakter.bruker

import java.time.LocalDate

data class BrukerDto(
data class FrontendBrukerDto(
val personIdent: String,
val navn: String,
val fødselsdato: LocalDate,
val fødselsdato: LocalDate?,
val kjønn: Kjønn,
val dødsdato: LocalDate? = null,
)
22 changes: 22 additions & 0 deletions modell/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
plugins {
kotlin("jvm")
}

group = "no.nav"

repositories {
mavenCentral()
}

dependencies {
api(project(":kontrakter-intern"))
api(project(":kontrakter-ekstern-v2"))

testImplementation("org.junit.jupiter:junit-jupiter:5.12.0")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
testImplementation("io.kotest:kotest-assertions-core:5.9.1")
}

tasks.test {
useJUnitPlatform()
}
5 changes: 5 additions & 0 deletions modell/src/main/kotlin/no/nav/tilbakekreving/FrontendDto.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package no.nav.tilbakekreving

interface FrontendDto<Dto> {
fun tilFrontendDto(): Dto
}
54 changes: 54 additions & 0 deletions modell/src/main/kotlin/no/nav/tilbakekreving/Tilbakekreving.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package no.nav.tilbakekreving

import no.nav.tilbakekreving.api.v1.dto.FagsakDto
import no.nav.tilbakekreving.api.v2.OpprettTilbakekrevingEvent
import no.nav.tilbakekreving.eksternfagsak.EksternFagsak
import no.nav.tilbakekreving.kontrakter.bruker.Språkkode
import no.nav.tilbakekreving.person.Bruker
import no.nav.tilbakekreving.person.Bruker.Companion.tilNullableFrontendDto
import no.nav.tilbakekreving.tilstand.Start
import no.nav.tilbakekreving.tilstand.Tilstand
import java.time.LocalDateTime

class Tilbakekreving(
private val eksternFagsak: EksternFagsak,
private val opprettet: LocalDateTime,
) : FrontendDto<FagsakDto> {
var tilstand: Tilstand = Start
private var bruker: Bruker? = null

fun byttTilstand(nyTilstand: Tilstand) {
tilstand = nyTilstand
tilstand.entering(this)
}

fun håndter(opprettTilbakekrevingEvent: OpprettTilbakekrevingEvent) {
tilstand.håndter(this, opprettTilbakekrevingEvent)
}

override fun tilFrontendDto(): FagsakDto {
val eksternFagsakDto = eksternFagsak.tilFrontendDto()
return FagsakDto(
eksternFagsakId = eksternFagsakDto.eksternId,
ytelsestype = eksternFagsakDto.ytelsestype,
fagsystem = eksternFagsakDto.fagsystem,
språkkode = bruker?.språkkode ?: Språkkode.NB,
bruker = bruker.tilNullableFrontendDto(),
behandlinger = emptyList(),
)
}

companion object {
fun opprett(opprettTilbakekrevingEvent: OpprettTilbakekrevingEvent): Tilbakekreving {
return Tilbakekreving(
opprettet = LocalDateTime.now(),
eksternFagsak =
EksternFagsak(
eksternId = opprettTilbakekrevingEvent.eksternFagsak.eksternId,
ytelsestype = opprettTilbakekrevingEvent.eksternFagsak.ytelsestype,
fagsystem = opprettTilbakekrevingEvent.eksternFagsak.fagsystem,
),
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package no.nav.tilbakekreving.eksternfagsak

import no.nav.tilbakekreving.FrontendDto
import no.nav.tilbakekreving.api.v2.EksternFagsakDto
import no.nav.tilbakekreving.kontrakter.ytelse.Fagsystem
import no.nav.tilbakekreving.kontrakter.ytelse.Ytelsestype

class EksternFagsak(
private val eksternId: String,
private val ytelsestype: Ytelsestype,
private val fagsystem: Fagsystem,
) : FrontendDto<EksternFagsakDto> {
override fun tilFrontendDto(): EksternFagsakDto {
return EksternFagsakDto(
eksternId = eksternId,
ytelsestype = ytelsestype,
fagsystem = fagsystem,
)
}
}
39 changes: 39 additions & 0 deletions modell/src/main/kotlin/no/nav/tilbakekreving/person/Bruker.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package no.nav.tilbakekreving.person

import no.nav.tilbakekreving.FrontendDto
import no.nav.tilbakekreving.kontrakter.bruker.FrontendBrukerDto
import no.nav.tilbakekreving.kontrakter.bruker.Kjønn
import no.nav.tilbakekreving.kontrakter.bruker.Språkkode
import java.time.LocalDate

class Bruker(
private val ident: String,
val språkkode: Språkkode,
) : FrontendDto<FrontendBrukerDto> {
private var navn: String? = null
private var fødselsdato: LocalDate? = null
private var kjønn: Kjønn? = null
private var dødsdato: LocalDate? = null

override fun tilFrontendDto(): FrontendBrukerDto {
return FrontendBrukerDto(
personIdent = ident,
navn = navn ?: "Ukjent",
fødselsdato = fødselsdato,
kjønn = kjønn ?: Kjønn.UKJENT,
dødsdato = dødsdato,
)
}

companion object {
fun Bruker?.tilNullableFrontendDto(): FrontendBrukerDto {
return this?.tilFrontendDto() ?: FrontendBrukerDto(
personIdent = "Ukjent",
navn = "Ukjent",
fødselsdato = null,
kjønn = Kjønn.UKJENT,
dødsdato = null,
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package no.nav.tilbakekreving.tilstand

import no.nav.tilbakekreving.Tilbakekreving

object AvventerKravgrunnlag : Tilstand {
override val navn: String = "AvventerKravgrunnlag"

override fun entering(tilbakekreving: Tilbakekreving) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package no.nav.tilbakekreving.tilstand

import no.nav.tilbakekreving.Tilbakekreving

object AvventerUtsattBehandlingMedVarsel : Tilstand {
override val navn: String = "AvventerUtsattBehandlingMedVarsel"

override fun entering(tilbakekreving: Tilbakekreving) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package no.nav.tilbakekreving.tilstand

import no.nav.tilbakekreving.Tilbakekreving

object AvventerUtsattBehandlingUtenVarsel : Tilstand {
override val navn: String = "AvventerUtsattBehandlingUtenVarsel"

override fun entering(tilbakekreving: Tilbakekreving) {
}
}
22 changes: 22 additions & 0 deletions modell/src/main/kotlin/no/nav/tilbakekreving/tilstand/Start.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package no.nav.tilbakekreving.tilstand

import no.nav.tilbakekreving.Tilbakekreving
import no.nav.tilbakekreving.api.v2.OpprettTilbakekrevingEvent
import no.nav.tilbakekreving.api.v2.Opprettelsevalg

object Start : Tilstand {
override val navn: String = "Start"

override fun entering(tilbakekreving: Tilbakekreving) {}

override fun håndter(
tilbakekreving: Tilbakekreving,
hendelse: OpprettTilbakekrevingEvent,
) {
when (hendelse.opprettelsesvalg) {
Opprettelsevalg.UTSETT_BEHANDLING_MED_VARSEL -> tilbakekreving.byttTilstand(AvventerUtsattBehandlingMedVarsel)
Opprettelsevalg.UTSETT_BEHANDLING_UTEN_VARSEL -> tilbakekreving.byttTilstand(AvventerUtsattBehandlingUtenVarsel)
Opprettelsevalg.OPPRETT_BEHANDLING_MED_VARSEL -> tilbakekreving.byttTilstand(AvventerKravgrunnlag)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package no.nav.tilbakekreving.tilstand

import no.nav.tilbakekreving.Tilbakekreving
import no.nav.tilbakekreving.api.v2.OpprettTilbakekrevingEvent

sealed interface Tilstand {
val navn: String

fun entering(tilbakekreving: Tilbakekreving)

fun håndter(
tilbakekreving: Tilbakekreving,
hendelse: OpprettTilbakekrevingEvent,
) {
error("Forventet ikke OpprettTilbakekrevingEvent i $navn")
}
}
30 changes: 30 additions & 0 deletions modell/src/test/kotlin/no/nav/tilbakekreving/Testdata.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package no.nav.tilbakekreving

import no.nav.tilbakekreving.api.v2.BrukerDto
import no.nav.tilbakekreving.api.v2.EksternFagsakDto
import no.nav.tilbakekreving.api.v2.OpprettTilbakekrevingEvent
import no.nav.tilbakekreving.api.v2.Opprettelsevalg
import no.nav.tilbakekreving.kontrakter.bruker.Språkkode
import no.nav.tilbakekreving.kontrakter.ytelse.Fagsystem
import no.nav.tilbakekreving.kontrakter.ytelse.Ytelsestype

fun eksternFagsak() =
EksternFagsakDto(
eksternId = "101010",
ytelsestype = Ytelsestype.BARNETRYGD,
fagsystem = Fagsystem.BA,
)

fun bruker() =
BrukerDto(
ident = "31126900011",
språkkode = Språkkode.NB,
)

fun opprettTilbakekrevingEvent(
eksternFagsak: EksternFagsakDto = eksternFagsak(),
opprettelsevalg: Opprettelsevalg = Opprettelsevalg.OPPRETT_BEHANDLING_MED_VARSEL,
) = OpprettTilbakekrevingEvent(
eksternFagsak = eksternFagsak,
opprettelsesvalg = opprettelsevalg,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package no.nav.tilbakekreving

import io.kotest.matchers.shouldBe
import no.nav.tilbakekreving.api.v2.Opprettelsevalg
import no.nav.tilbakekreving.tilstand.AvventerKravgrunnlag
import no.nav.tilbakekreving.tilstand.AvventerUtsattBehandlingMedVarsel
import no.nav.tilbakekreving.tilstand.AvventerUtsattBehandlingUtenVarsel
import no.nav.tilbakekreving.tilstand.Start
import org.junit.jupiter.api.Test

class TilbakekrevingTest {
@Test
fun `oppretter tilbakekreving`() {
val opprettEvent = opprettTilbakekrevingEvent(opprettelsevalg = Opprettelsevalg.OPPRETT_BEHANDLING_MED_VARSEL)
val tilbakekreving = Tilbakekreving.opprett(opprettEvent)

tilbakekreving.tilstand shouldBe Start
tilbakekreving.håndter(opprettEvent)
tilbakekreving.tilstand shouldBe AvventerKravgrunnlag
}

@Test
fun `oppretter tilbakekreving som avventer oppdatert kravgrunnlag uten varsel`() {
val opprettEvent = opprettTilbakekrevingEvent(opprettelsevalg = Opprettelsevalg.UTSETT_BEHANDLING_UTEN_VARSEL)
val tilbakekreving = Tilbakekreving.opprett(opprettEvent)

tilbakekreving.håndter(opprettEvent)
tilbakekreving.tilstand shouldBe AvventerUtsattBehandlingUtenVarsel
}

@Test
fun `oppretter tilbakekreving som avventer oppdatert kravgrunnlag med varsel`() {
val opprettEvent = opprettTilbakekrevingEvent(opprettelsevalg = Opprettelsevalg.UTSETT_BEHANDLING_MED_VARSEL)
val tilbakekreving = Tilbakekreving.opprett(opprettEvent)

tilbakekreving.håndter(opprettEvent)
tilbakekreving.tilstand shouldBe AvventerUtsattBehandlingMedVarsel
}
}
2 changes: 2 additions & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@ rootProject.name = "familie-tilbake"
include("kontrakter-intern")
include("kontrakter-ekstern")
include("kontrakter-felles")
include("modell")
include("kontrakter-ekstern-v2")
Loading
Loading