Skip to content

Commit

Permalink
(modellkode for) nytt event når en generasjon opprettes
Browse files Browse the repository at this point in the history
Dette er tenkt brukt til styringsinfo

Co-authored-by: Håkon Arneng Holmstedt <[email protected]>
Co-authored-by: David Steinsland <[email protected]>
Co-authored-by: Øyvind Hagen <[email protected]>
Co-authored-by: Morten Tholander <[email protected]>
Co-authored-by: Amalie Erdal Mansåker <[email protected]>
Co-authored-by: Kjetil JD <[email protected]>
  • Loading branch information
7 people committed Jan 23, 2024
1 parent edaaab9 commit 4ace66d
Show file tree
Hide file tree
Showing 11 changed files with 190 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package no.nav.helse.person

import java.time.LocalDateTime
import java.util.UUID
import no.nav.helse.hendelser.Avsender
import no.nav.helse.hendelser.Periode
import no.nav.helse.person.aktivitetslogg.IAktivitetslogg

Expand All @@ -23,4 +24,13 @@ internal interface GenerasjonObserver {
utbetalingId: UUID,
vedtakFattetTidspunkt: LocalDateTime
)

fun nyGenerasjon(
id: UUID,
meldingsreferanseId: UUID,
innsendt: LocalDateTime,
registert: LocalDateTime,
avsender: Avsender,
type: PersonObserver.GenerasjonOpprettetEvent.Type
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import java.time.LocalDate
import java.time.LocalDateTime
import java.util.UUID
import no.nav.helse.etterlevelse.MaskinellJurist
import no.nav.helse.hendelser.Avsender
import no.nav.helse.hendelser.Hendelse
import no.nav.helse.hendelser.Periode
import no.nav.helse.hendelser.Simulering
Expand Down Expand Up @@ -45,7 +46,7 @@ internal class Generasjoner(generasjoner: List<Generasjon>) {
generasjoner.forEach { it.addObserver(observatør) }
}

internal fun accept(visitor: GenerasjonerVisistor) {
internal fun accept(visitor: GenerasjonerVisitor) {
visitor.preVisitGenerasjoner(generasjoner)
generasjoner.forEach { generasjon ->
generasjon.accept(visitor)
Expand Down Expand Up @@ -149,8 +150,11 @@ internal class Generasjoner(generasjoner: List<Generasjon>) {
check(generasjoner.last().tillaterNyGenerasjon(generasjon)) {
"siste generasjon ${generasjoner.last()} tillater ikke opprettelse av ny generasjon $generasjon"
}
observatører.forEach { generasjon.addObserver(it) }
observatører.forEach {
generasjon.addObserver(it)
}
this.generasjoner.add(generasjon)
generasjon.nyGenerasjon()
}

fun klarForUtbetaling(): Boolean {
Expand Down Expand Up @@ -193,22 +197,25 @@ internal class Generasjoner(generasjoner: List<Generasjon>) {
}

internal fun trengerArbeidsgiverperiode() = generasjoner.dokumentsporing.sisteInntektsmeldingId() == null
internal fun førsteGenerasjonOpprettet() {
generasjoner.single().nyGenerasjon()
}

internal class Generasjonkilde private constructor(
private val meldingsreferanseId: UUID,
private val innsendt: LocalDateTime,
private val registert: LocalDateTime,
private val avsender: String
val meldingsreferanseId: UUID,
val innsendt: LocalDateTime,
val registert: LocalDateTime,
val avsender: Avsender
) {
constructor(hendelse: Hendelse): this(hendelse.meldingsreferanseId(), hendelse.innsendt(), hendelse.registrert(), hendelse.avsender().toString())
constructor(hendelse: Hendelse): this(hendelse.meldingsreferanseId(), hendelse.innsendt(), hendelse.registrert(), hendelse.avsender())

internal fun accept(visitor: GenerasjonerVisistor) {
internal fun accept(visitor: GenerasjonerVisitor) {
visitor.preVisitGenerasjonkilde(meldingsreferanseId, innsendt, registert, avsender)
}
}


internal class Generasjon constructor(
internal class Generasjon(
private val id: UUID,
private var tilstand: Tilstand,
private val endringer: MutableList<Endring>,
Expand Down Expand Up @@ -237,7 +244,7 @@ internal class Generasjoner(generasjoner: List<Generasjon>) {

override fun toString() = "$periode - $tilstand"

fun accept(visitor: GenerasjonerVisistor) {
fun accept(visitor: GenerasjonerVisitor) {
visitor.preVisitGenerasjon(id, tidsstempel, tilstand, periode, vedtakFattet, avsluttet, kilde)
endringer.forEach { it.accept(visitor) }
kilde?.accept(visitor)
Expand Down Expand Up @@ -280,7 +287,7 @@ internal class Generasjoner(generasjoner: List<Generasjon>) {
return this.dokumentsporing == other.dokumentsporing
}

internal fun accept(visitor: GenerasjonerVisistor) {
internal fun accept(visitor: GenerasjonerVisitor) {
visitor.preVisitGenerasjonendring(id, tidsstempel, sykmeldingsperiode, periode, grunnlagsdata, utbetaling, dokumentsporing, sykdomstidslinje)
grunnlagsdata?.accept(visitor)
utbetaling?.accept(visitor)
Expand Down Expand Up @@ -490,6 +497,15 @@ internal class Generasjoner(generasjoner: List<Generasjon>) {
observatører.forEach { it.avsluttetUtenVedtak(hendelse, id, avsluttet!!, periode, dokumentsporing.ider()) }
}

internal fun nyGenerasjon() {
val type = when(tilstand) {
Tilstand.UberegnetRevurdering -> PersonObserver.GenerasjonOpprettetEvent.Type.Revurdering
Tilstand.UberegnetOmgjøring -> PersonObserver.GenerasjonOpprettetEvent.Type.Omgjøring
else -> PersonObserver.GenerasjonOpprettetEvent.Type.Førstegangsbehandling
}
observatører.forEach { it.nyGenerasjon(id, kilde!!.meldingsreferanseId, kilde.innsendt, kilde.registert, kilde.avsender, type) }
}

/*
enum class Periodetilstand {
TilUtbetaling,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -553,6 +553,10 @@ class Person private constructor(
observers.forEach { it.vedtakFattet(vedtakFattetEvent) }
}

internal fun nyGenerasjon(nyGenerasjon: PersonObserver.GenerasjonOpprettetEvent) {
observers.forEach { it.nyGenerasjon(nyGenerasjon) }
}

internal fun avsluttetUtenVedtak(event: PersonObserver.AvsluttetUtenVedtakEvent) {
observers.forEach { it.avsluttetUtenVedtak(event) }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import java.time.LocalDate
import java.time.LocalDateTime
import java.util.UUID
import no.nav.helse.Personidentifikator
import no.nav.helse.hendelser.Avsender
import no.nav.helse.hendelser.Periode
import no.nav.helse.hendelser.Påminnelse
import no.nav.helse.hendelser.SimuleringResultat
Expand Down Expand Up @@ -579,6 +580,28 @@ interface PersonObserver : SykefraværstilfelleeventyrObserver {
val avsluttetTidspunkt: LocalDateTime
)

data class GenerasjonOpprettetEvent(
valdselsnummer: String,
val aktørId: String,
val organisasjonsnummer: String,
val vedtaksperiodeId: UUID,
val generasjonId: UUID,
val type: Type,
val kilde: Kilde
) {
enum class Type {
Førstegangsbehandling,
Omgjøring,
Revurdering
}
data class Kilde(
private val meldingsreferanseId: UUID,
private val innsendt: LocalDateTime,
private val registert: LocalDateTime,
private val avsender: Avsender
)
}

data class VedtakFattetEvent(
valdselsnummer: String,
val aktørId: String,
Expand Down Expand Up @@ -681,6 +704,8 @@ interface PersonObserver : SykefraværstilfelleeventyrObserver {
fun annullering(event: UtbetalingAnnullertEvent) {}
fun avstemt(result: Map<String, Any>) {}
fun vedtakFattet(event: VedtakFattetEvent) {}

fun nyGenerasjon(event: GenerasjonOpprettetEvent) {}
fun avsluttetUtenVedtak(event: AvsluttetUtenVedtakEvent) {}
fun nyVedtaksperiodeUtbetaling(
personidentifikator: Personidentifikator,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import java.time.Year
import java.util.UUID
import no.nav.helse.AlderVisitor
import no.nav.helse.Personidentifikator
import no.nav.helse.hendelser.Avsender
import no.nav.helse.hendelser.Medlemskapsvurdering
import no.nav.helse.hendelser.Periode
import no.nav.helse.person.Vedtaksperiode.Vedtaksperiodetilstand
Expand Down Expand Up @@ -315,13 +316,13 @@ internal interface FeriepengeutbetalingVisitor : OppdragVisitor {
fun postVisitFeriepengeutbetalinger(feriepengeutbetalinger: List<Feriepengeutbetaling>) {}
}

internal interface GenerasjonerVisistor : GenerasjonVisistor {
internal interface GenerasjonerVisitor : GenerasjonVisitor {

fun preVisitGenerasjoner(generasjoner: List<Generasjoner.Generasjon>) {}
fun postVisitGenerasjoner(generasjoner: List<Generasjoner.Generasjon>) {}
}

internal interface GenerasjonVisistor : UtbetalingVisitor, VilkårsgrunnlagHistorikkVisitor, SykdomstidslinjeVisitor {
internal interface GenerasjonVisitor : UtbetalingVisitor, VilkårsgrunnlagHistorikkVisitor, SykdomstidslinjeVisitor {
fun preVisitGenerasjon(
id: UUID,
tidsstempel: LocalDateTime,
Expand Down Expand Up @@ -355,7 +356,7 @@ internal interface GenerasjonVisistor : UtbetalingVisitor, VilkårsgrunnlagHisto
meldingsreferanseId: UUID,
innsendt: LocalDateTime,
registrert: LocalDateTime,
avsender: String
avsender: Avsender
) {}
fun postVisitGenerasjon(
id: UUID,
Expand All @@ -368,7 +369,7 @@ internal interface GenerasjonVisistor : UtbetalingVisitor, VilkårsgrunnlagHisto
) {}
}

internal interface VedtaksperiodeVisitor : GenerasjonerVisistor, UtbetalingsdagVisitor {
internal interface VedtaksperiodeVisitor : GenerasjonerVisitor, UtbetalingsdagVisitor {
fun preVisitVedtaksperiode(
vedtaksperiode: Vedtaksperiode,
id: UUID,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import no.nav.helse.etterlevelse.SubsumsjonObserver.Companion.NullObserver
import no.nav.helse.forrigeDag
import no.nav.helse.hendelser.AnmodningOmForkasting
import no.nav.helse.hendelser.ArbeidstakerHendelse
import no.nav.helse.hendelser.Avsender
import no.nav.helse.hendelser.FunksjonelleFeilTilVarsler
import no.nav.helse.hendelser.Hendelse
import no.nav.helse.hendelser.Inntektsmelding
Expand Down Expand Up @@ -180,6 +181,7 @@ internal class Vedtaksperiode private constructor(
) {
kontekst(søknad)
person.vedtaksperiodeOpprettet(id, organisasjonsnummer, periode, skjæringstidspunkt, opprettet)
generasjoner.førsteGenerasjonOpprettet()
}

init {
Expand Down Expand Up @@ -872,6 +874,26 @@ internal class Vedtaksperiode private constructor(
person.gjenopptaBehandling(hendelse)
}

override fun nyGenerasjon(
id: UUID,
meldingsreferanseId: UUID,
innsendt: LocalDateTime,
registert: LocalDateTime,
avsender: Avsender,
type: PersonObserver.GenerasjonOpprettetEvent.Type
) {
val nyGenerasjon = PersonObserver.GenerasjonOpprettetEvent(
fødselsnummer = fødselsnummer,
aktørId = aktørId,
organisasjonsnummer = organisasjonsnummer,
vedtaksperiodeId = this.id,
generasjonId = id,
type = type,
kilde = PersonObserver.GenerasjonOpprettetEvent.Kilde(meldingsreferanseId, innsendt, registert, avsender)
)
person.nyGenerasjon(nyGenerasjon)
}

private fun høstingsresultater(hendelse: ArbeidstakerHendelse, simuleringtilstand: Vedtaksperiodetilstand, godkjenningtilstand: Vedtaksperiodetilstand) = when {
generasjoner.harUtbetalinger() -> tilstand(hendelse, simuleringtilstand) {
hendelse.info("""Saken oppfyller krav for behandling, settes til "Avventer simulering"""")
Expand Down
2 changes: 1 addition & 1 deletion sykepenger-model/src/test/kotlin/no/nav/helse/Datoer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import no.nav.helse.hendelser.til

// 2018 har blitt valgt fordi det starter på en mandag og er ikke et skuddår
private const val startår = 2018
private val mandagsfrø = LocalDate.of(startår, 1, 1)
private val mandagsfrø = LocalDate.of(startår, 1, 1) // fredet variabel
val Int.mandag get() = mandagsfrø.plusWeeks(this.toLong() - 1)
val Int.tirsdag get() = this.mandag.plusDays(1)
val Int.onsdag get() = this.mandag.plusDays(2)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.helse.inspectors
import java.time.LocalDate
import java.time.LocalDateTime
import java.util.UUID
import no.nav.helse.hendelser.Avsender
import no.nav.helse.hendelser.Periode
import no.nav.helse.person.Dokumentsporing
import no.nav.helse.person.Generasjoner
Expand Down Expand Up @@ -53,7 +54,7 @@ internal class VedtaksperiodeInspektør(vedtaksperiode: Vedtaksperiode) : Vedtak
val meldingsreferanseId: UUID,
val innsendt: LocalDateTime,
val registert: LocalDateTime,
val avsender: String
val avsender: Avsender
)
}

Expand Down Expand Up @@ -117,7 +118,7 @@ internal class VedtaksperiodeInspektør(vedtaksperiode: Vedtaksperiode) : Vedtak
meldingsreferanseId: UUID,
innsendt: LocalDateTime,
registrert: LocalDateTime,
avsender: String
avsender: Avsender
) {
val sisteGenerasjon = this.generasjoner.last()
this.generasjoner[this.generasjoner.lastIndex] = sisteGenerasjon.copy(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ internal class TestObservatør(person: Person? = null) : PersonObserver {
val utbetaltEndretEventer = mutableListOf<PersonObserver.UtbetalingEndretEvent>()
val vedtakFattetEvent = mutableMapOf<UUID, PersonObserver.VedtakFattetEvent>()
val vedtakFattetEventer = mutableMapOf<UUID, MutableList<PersonObserver.VedtakFattetEvent>>()
val generasjonOpprettetEventer = mutableListOf<PersonObserver.GenerasjonOpprettetEvent>()
val avsluttetUtenVedtakEventer = mutableMapOf<UUID, MutableList<PersonObserver.AvsluttetUtenVedtakEvent>>()
val sykefraværstilfelleeventyr = mutableListOf<List<SykefraværstilfelleeventyrObserver.SykefraværstilfelleeventyrObserverEvent>>()
val overstyringIgangsatt = mutableListOf<PersonObserver.OverstyringIgangsatt>()
Expand Down Expand Up @@ -108,6 +109,10 @@ internal class TestObservatør(person: Person? = null) : PersonObserver {
vedtakFattetEventer.getOrPut(event.vedtaksperiodeId) { mutableListOf() }.add(event)
}

override fun nyGenerasjon(event: PersonObserver.GenerasjonOpprettetEvent) {
generasjonOpprettetEventer.add(event)
}

override fun avsluttetUtenVedtak(event: PersonObserver.AvsluttetUtenVedtakEvent) {
avsluttetUtenVedtakEventer.getOrPut(event.vedtaksperiodeId) { mutableListOf() }.add(event)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package no.nav.helse.spleis.e2e.generasjoner

import java.time.LocalDateTime
import java.util.UUID
import no.nav.helse.desember
import no.nav.helse.dsl.AbstractDslTest
import no.nav.helse.dsl.TestPerson.Companion.INNTEKT
import no.nav.helse.hendelser.Avsender
import no.nav.helse.hendelser.Søknad.Søknadsperiode.Sykdom
import no.nav.helse.hendelser.til
import no.nav.helse.januar
import no.nav.helse.person.AbstractPersonTest.Companion.UNG_PERSON_FNR_2018
import no.nav.helse.person.PersonObserver
import no.nav.helse.økonomi.Prosentdel.Companion.prosent
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

internal class GenerasjonOpprettetEventTest : AbstractDslTest() {

@Test
fun `event om opprettet generasjon`() {
a1 {
val søknadId = UUID.randomUUID()
val opprettet = LocalDateTime.now()
val innsendt = opprettet.minusHours(2)
håndterSøknad(Sykdom(1.januar, 20.januar, 100.prosent), søknadId = søknadId, sendtTilNAVEllerArbeidsgiver = innsendt, opprettet = opprettet)
val generasjonOpprettetEvent = observatør.generasjonOpprettetEventer.last()
inspektør(1.vedtaksperiode).generasjoner.also { generasjoner ->
val generasjonId = generasjoner.single().id
val forventetGenerasjonEvent = PersonObserver.GenerasjonOpprettetEvent(
fødselsnummer = UNG_PERSON_FNR_2018.toString(),
aktørId = "42",
organisasjonsnummer = a1,
vedtaksperiodeId = 1.vedtaksperiode,
generasjonId = generasjonId,
type = PersonObserver.GenerasjonOpprettetEvent.Type.Førstegangsbehandling,
kilde = PersonObserver.GenerasjonOpprettetEvent.Kilde(
meldingsreferanseId = søknadId,
innsendt = innsendt,
registert = opprettet,
avsender = Avsender.SYKMELDT
)
)
assertEquals(forventetGenerasjonEvent, generasjonOpprettetEvent)
}
}
}

@Test
fun `revurdering`() {
a1 {
nyttVedtak(1.januar, 31.januar, 100.prosent)
håndterSøknad(Sykdom(1.januar, 31.januar, 80.prosent))
val generasjonOpprettetEventer = observatør.generasjonOpprettetEventer
assertEquals(2, generasjonOpprettetEventer.size)
val førsteEvent = generasjonOpprettetEventer.first()
val andreEvent = generasjonOpprettetEventer.last()
assertEquals(PersonObserver.GenerasjonOpprettetEvent.Type.Førstegangsbehandling, førsteEvent.type)
assertEquals(PersonObserver.GenerasjonOpprettetEvent.Type.Revurdering, andreEvent.type)
}
}

@Test
fun `omgjøring`() {
a1 {
håndterSøknad(Sykdom(1.januar, 16.januar, 100.prosent))
håndterInntektsmelding(listOf(25.desember(2017) til 10.januar), beregnetInntekt = INNTEKT)
val generasjonOpprettetEventer = observatør.generasjonOpprettetEventer
assertEquals(2, generasjonOpprettetEventer.size)
val førsteEvent = generasjonOpprettetEventer.first()
val andreEvent = generasjonOpprettetEventer.last()
assertEquals(PersonObserver.GenerasjonOpprettetEvent.Type.Førstegangsbehandling, førsteEvent.type)
assertEquals(PersonObserver.GenerasjonOpprettetEvent.Type.Omgjøring, andreEvent.type)
}
}
}
Loading

0 comments on commit 4ace66d

Please sign in to comment.