Skip to content

Commit

Permalink
renamer generasjon->behandling
Browse files Browse the repository at this point in the history
Co-authored-by: Erik Maximilian Forsman <[email protected]>
  • Loading branch information
davidsteinsland and fraadsbrandth committed Mar 7, 2024
1 parent 5f0ad19 commit 1309174
Show file tree
Hide file tree
Showing 23 changed files with 523 additions and 202 deletions.
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,31 @@ pølsefabrikk
Bygger opp en representasjon pølser i Speil, dvs.
rekkefølgen på pølsene og radene.

![håndtering av generasjon_opprettet](docs/flyt.png)
![håndtering av behandling_opprettet](docs/flyt.png)

Spleis oppretter nye generasjoner på en Vedtaksperiode når det skal startes en ny behandling.
Det vil si at når en generasjon opprettes så har det skjedd noe nytt i saken, og det skal fattes nytt vedtak.
Spleis oppretter nye behandlinger på en Vedtaksperiode når det skal startes en ny behandling.
Det vil si at når en behandling opprettes så har det skjedd noe nytt i saken, og det skal fattes nytt vedtak.

Derfor vil Spekemat i all hovedsak lage ny rad hver gang den mottar en ny generasjon dersom
Derfor vil Spekemat i all hovedsak lage ny rad hver gang den mottar en ny behandling dersom
Vedtaksperioden er kjent fra før.

#### Hvordan gjenkjennes en revurdering?

Spekemat mottar en ny generasjon når Spekemat har kjennskap til Vedtaksperioden fra før (dvs. har mottatt en generasjon tidligere).
Spekemat mottar en ny behandling når Spekemat har kjennskap til Vedtaksperioden fra før (dvs. har mottatt en behandling tidligere).

#### Hvordan gjenkjennes en annullering?

På samme måte som en revurdering, bare at den nye generasjonen forkastes. Dvs. en annullering
gjenkjennes ved at det er en generasjon `status=FORKASTET`, og andre generasjoner i eldre rader som er `status=LUKKET`
På samme måte som en revurdering, bare at den nye behandlingen forkastes. Dvs. en annullering
gjenkjennes ved at det er en behandling `status=FORKASTET`, og andre behandlinger i eldre rader som er `status=LUKKET`

#### Hvordan gjenkjennes ting som forkastes før vedtak er fattet?

Det er en generasjon med `status=FORKASTET` uten at det finnes en annen generasjon for samme Vedtaksperiode i en eldre rad
Det er en behandling med `status=FORKASTET` uten at det finnes en annen behandling for samme Vedtaksperiode i en eldre rad

#### Hvordan sikrer Spekemat at en revurdering som revurderer `n` andre vedtaksperioder ikke lager `n` rader?

Når Spekemat lager en ny rad så beholder Spekemat en referanse til `kildeID` som medførte ny rad; i praksis den første
nye revurdering-generasjonen. På alle påfølgende nye generasjoner så vil `kildeID` peke til den samme som raden ble opprettet med,
nye revurdering-behandlingen. På alle påfølgende nye behandlinger så vil `kildeID` peke til den samme som raden ble opprettet med,
og da vet Spekemat at den allerede har laget ny rad.

# Henvendelser
Expand Down
15 changes: 10 additions & 5 deletions fabrikk/src/main/kotlin/no/nav/helse/spekemat/fabrikk/Pølse.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ import java.util.*

data class Pølse(
val vedtaksperiodeId: UUID,
@Deprecated("", ReplaceWith("behandlingId"))
val generasjonId: UUID,
// hvorvidt generasjonen er åpen for endringer (dvs. til behandling) eller ikke (vedtak fattet / generasjon avsluttet)
val behandlingId: UUID,
// hvorvidt behandlingen er åpen for endringer (dvs. til behandling) eller ikke (vedtak fattet / behandling avsluttet)
private val status: Pølsestatus,
// tingen som gjorde at generasjonen ble opprettet
// tingen som gjorde at behandlingen ble opprettet
private val kilde: UUID
) {
fun erOpprettetFraSammeKilde(otherKilde: UUID) = this.kilde == otherKilde
Expand All @@ -27,13 +29,15 @@ data class Pølse(
fun dto() = PølseDto(
vedtaksperiodeId = vedtaksperiodeId,
generasjonId = generasjonId,
behandlingId = behandlingId,
status = status,
kilde = kilde
)

fun oppdaterPølse(vedtaksperiodeId: UUID, generasjonId: UUID, status: Pølsestatus): Pølse {
fun oppdaterPølse(vedtaksperiodeId: UUID, behandlingId: UUID, status: Pølsestatus): Pølse {
if (this.vedtaksperiodeId != vedtaksperiodeId) return this
if (this.generasjonId != generasjonId) throw OppdatererEldreGenerasjonException("Det er gjort forsøk på å oppdatere en generasjon som ikke samsvarer med den som er registrert i nyeste rad")
if (this.generasjonId != behandlingId) throw OppdatererEldreBehandlingException("Det er gjort forsøk på å oppdatere en generasjon som ikke samsvarer med den som er registrert i nyeste rad")
if (this.behandlingId != this.behandlingId) throw OppdatererEldreBehandlingException("Det er gjort forsøk på å oppdatere en behandling som ikke samsvarer med den som er registrert i nyeste rad")
return this.copy(status = status)
}

Expand All @@ -45,10 +49,11 @@ data class Pølse(
fun fraDto(dto: PølseDto) = Pølse(
vedtaksperiodeId = dto.vedtaksperiodeId,
generasjonId = dto.generasjonId,
behandlingId = dto.behandlingId,
status = dto.status,
kilde = dto.kilde
)
}
}

class OppdatererEldreGenerasjonException(override val message: String?) : IllegalStateException()
class OppdatererEldreBehandlingException(override val message: String?) : IllegalStateException()
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import java.util.*

data class PølseDto(
val vedtaksperiodeId: UUID,
@Deprecated("", ReplaceWith("behandlingId"))
val generasjonId: UUID,
val behandlingId: UUID,
val status: Pølsestatus,
// tingen som gjorde at generasjonen ble opprettet
// tingen som gjorde at behandlingen ble opprettet
val kilde: UUID
)
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@ class Pølsefabrikk private constructor(

private fun håndtertFør(pølse: Pølse) =
pakken.any { rad ->
rad.pølser.any { it.generasjonId == pølse.generasjonId }
rad.pølser.any { it.behandlingId == pølse.behandlingId }
}

fun oppdaterPølse(vedtaksperiodeId: UUID, generasjonId: UUID, status: Pølsestatus): PølseDto {
fun oppdaterPølse(vedtaksperiodeId: UUID, behandlingId: UUID, status: Pølsestatus): PølseDto {
if (pakken.isEmpty()) throw TomPølsepakkeException("Pølsepakken er tom")
pakken[0] = pakken[0].oppdaterPølse(vedtaksperiodeId, generasjonId, status)
return pakken[0].pølser.singleOrNull { it.vedtaksperiodeId == vedtaksperiodeId }?.dto() ?: throw PølseFinnesIkkeException("Ingen pølse registrert for vedtaksperiodeId=$vedtaksperiodeId og generasjon=$generasjonId")
pakken[0] = pakken[0].oppdaterPølse(vedtaksperiodeId, behandlingId, status)
return pakken[0].pølser.singleOrNull { it.vedtaksperiodeId == vedtaksperiodeId }?.dto() ?: throw PølseFinnesIkkeException("Ingen pølse registrert for vedtaksperiodeId=$vedtaksperiodeId og behandling=$behandlingId")
}

private fun skalLageNyrad(pølse: Pølse) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ data class Pølserad(
return this.copy(pølser = setOf(pølse) + pølser)
}

fun oppdaterPølse(vedtaksperiodeId: UUID, generasjonId: UUID, status: Pølsestatus): Pølserad {
fun oppdaterPølse(vedtaksperiodeId: UUID, behandlingId: UUID, status: Pølsestatus): Pølserad {
return this.copy(
pølser = pølser.map { it.oppdaterPølse(vedtaksperiodeId, generasjonId, status) }.toSet()
pølser = pølser.map { it.oppdaterPølse(vedtaksperiodeId, behandlingId, status) }.toSet()
)
}
fun dto() = PølseradDto(pølser.map { it.dto() }, kildeTilRad)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ class DuplikathåndteringTest : PølseTest() {

fabrikk.nyPølse(p1)
fabrikk.lukketPølse(p1)
fabrikk.nyPølse(p2) // f.eks. at spekemat har lest inn generasjon_opprettet på nytt, eller at noen har sendt feil
fabrikk.nyPølse(p2) // f.eks. at spekemat har lest inn behandling_opprettet på nytt, eller at noen har sendt feil

val result = fabrikk.pakke()
assertEquals(1, result.size) // forventer én rad
Expand All @@ -36,14 +36,14 @@ class DuplikathåndteringTest : PølseTest() {
@Test
fun `en duplikat ny pølse etter at pølsen er revurdert`() {
val p1 = 1.januar til 5.januar
val p1Revurdering = p1.nyGenerasjon()
val p1Revurdering = p1.nyBehandling()
val p2 = p1 fordi UUID.randomUUID()

fabrikk.nyPølse(p1)
fabrikk.lukketPølse(p1)
fabrikk.nyPølse(p1Revurdering)
fabrikk.lukketPølse(p1Revurdering.lukket())
fabrikk.nyPølse(p2) // f.eks. at spekemat har lest inn generasjon_opprettet på nytt, eller at noen har sendt feil
fabrikk.nyPølse(p2) // f.eks. at spekemat har lest inn behandling_opprettet på nytt, eller at noen har sendt feil

val result = fabrikk.pakke()
assertEquals(2, result.size)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ abstract class PølseTest {
vedtaksperiodeId: UUID,
kilde: UUID = UUID.randomUUID(),
status: Pølsestatus = Pølsestatus.ÅPEN
) = Pølse(vedtaksperiodeId, UUID.randomUUID(), status, kilde)
) = UUID.randomUUID().let { behandlingId -> Pølse(vedtaksperiodeId, behandlingId, behandlingId, status, kilde) }

protected infix fun LocalDate.til(tom: LocalDate) = pølse(UUID.randomUUID())
protected infix fun Pølse.som(vedtaksperiodeId: UUID) = this.copy(vedtaksperiodeId = vedtaksperiodeId)
protected fun Pølse.nyGenerasjon(generasjonId: UUID = UUID.randomUUID(), kilde: UUID = UUID.randomUUID()) = fordi(kilde).copy(generasjonId = UUID.randomUUID())
protected fun Pølse.nyBehandling(behandlingId: UUID = UUID.randomUUID(), kilde: UUID = UUID.randomUUID()) = fordi(kilde).copy(behandlingId = behandlingId, generasjonId = behandlingId)
protected infix fun Pølse.fordi(kilde: UUID) = this.copy(kilde = kilde)

protected fun Pølse.lukket() = this.copy(status = Pølsestatus.LUKKET)
Expand All @@ -40,10 +40,10 @@ abstract class PølseTest {
}

protected fun Pølsefabrikk.lukketPølse(pølse: Pølse) {
this.oppdaterPølse(pølse.vedtaksperiodeId, pølse.generasjonId, Pølsestatus.LUKKET)
this.oppdaterPølse(pølse.vedtaksperiodeId, pølse.behandlingId, Pølsestatus.LUKKET)
}

protected fun Pølsefabrikk.pølseForkastet(pølse: Pølse) {
this.oppdaterPølse(pølse.vedtaksperiodeId, pølse.generasjonId, Pølsestatus.FORKASTET)
this.oppdaterPølse(pølse.vedtaksperiodeId, pølse.behandlingId, Pølsestatus.FORKASTET)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class PølsefabrikkTest : PølseTest() {
fun pølsesett() {
val p1 = 1.januar til 2.januar
val p2 = p1.som(vedtaksperiodeId = UUID.randomUUID())
val p3 = p1.nyGenerasjon()
val p3 = p1.nyBehandling()
assertEquals(setOf(p1), setOf(p1, p1))
assertEquals(setOf(p1, p2), setOf(p1, p2))
assertEquals(setOf(p1), setOf(p1, p3))
Expand Down Expand Up @@ -40,13 +40,13 @@ class PølsefabrikkTest : PølseTest() {
@Test
fun `oppdatering på eldre pølse`() {
val p1 = 1.januar til 5.januar
val p1Revurdering = p1.nyGenerasjon()
val p1Revurdering = p1.nyBehandling()

fabrikk.nyPølse(p1)
fabrikk.lukketPølse(p1)
fabrikk.nyPølse(p1Revurdering)

assertThrows<OppdatererEldreGenerasjonException> {
assertThrows<OppdatererEldreBehandlingException> {
fabrikk.lukketPølse(p1)
}
}
Expand Down Expand Up @@ -90,7 +90,7 @@ class PølsefabrikkTest : PølseTest() {
@Test
fun `ett forkastet vedtak`() {
val p1 = 1.januar til 5.januar
val p1Annullert = p1.nyGenerasjon()
val p1Annullert = p1.nyBehandling()

fabrikk.nyPølse(p1)
fabrikk.lukketPølse(p1)
Expand All @@ -107,8 +107,8 @@ class PølsefabrikkTest : PølseTest() {
fun `to annullerte vedtak etter hverandre`() {
val p1 = 1.januar til 5.januar
val p2 = 20.januar til 31.januar
val p1Annullert = p1.nyGenerasjon()
val p2Annullert = p2.nyGenerasjon()
val p1Annullert = p1.nyBehandling()
val p2Annullert = p2.nyBehandling()

fabrikk.nyPølse(p1)
fabrikk.lukketPølse(p1)
Expand All @@ -131,8 +131,8 @@ class PølsefabrikkTest : PølseTest() {
val p1 = 1.januar til 5.januar
val p2 = 20.januar til 21.januar
val p3 = 25.januar til 31.januar
val p1Annullert = p1.nyGenerasjon()
val p2Annullert = p2.nyGenerasjon()
val p1Annullert = p1.nyBehandling()
val p2Annullert = p2.nyBehandling()

fabrikk.nyPølse(p1)
fabrikk.lukketPølse(p1)
Expand Down Expand Up @@ -165,7 +165,7 @@ class PølsefabrikkTest : PølseTest() {
fun `revurdering av pølse etter forkasting`() {
val p1 = 1.januar til 5.januar
val p2 = 20.januar til 21.januar
val p1Revurdering = p1.nyGenerasjon()
val p1Revurdering = p1.nyBehandling()

fabrikk.nyPølse(p1)
fabrikk.lukketPølse(p1)
Expand All @@ -187,9 +187,9 @@ class PølsefabrikkTest : PølseTest() {
val p2 = 20.januar til 21.januar
val p3 = 25.januar til 31.januar

val p1Annullert = p1.nyGenerasjon()
val p2Annullert = p2.nyGenerasjon()
val p3Revurdering = p3.nyGenerasjon()
val p1Annullert = p1.nyBehandling()
val p2Annullert = p2.nyBehandling()
val p3Revurdering = p3.nyBehandling()

fabrikk.nyPølse(p1)
fabrikk.lukketPølse(p1)
Expand Down Expand Up @@ -258,7 +258,7 @@ class PølsefabrikkTest : PølseTest() {
val p1 = 1.januar til 5.januar som v1
val p2 = 6.januar til 10.januar som v2
val revurderingkilde = UUID.randomUUID()
val p2Revurdering = p2.nyGenerasjon(kilde = revurderingkilde)
val p2Revurdering = p2.nyBehandling(kilde = revurderingkilde)

fabrikk.nyPølse(p1)
fabrikk.nyPølse(p2)
Expand All @@ -281,8 +281,8 @@ class PølsefabrikkTest : PølseTest() {

val p1 = 1.januar til 5.januar som v1
val p2 = 6.januar til 10.januar som v2
val p2Revurdering = p2.nyGenerasjon(kilde = revurderingkilde)
val p1Revurdering = p1.nyGenerasjon(kilde = revurderingkilde)
val p2Revurdering = p2.nyBehandling(kilde = revurderingkilde)
val p1Revurdering = p1.nyBehandling(kilde = revurderingkilde)

fabrikk.nyPølse(p1)
fabrikk.nyPølse(p2)
Expand All @@ -304,8 +304,8 @@ class PølsefabrikkTest : PølseTest() {

val p1 = 1.januar til 5.januar som v1
val p2 = 6.januar til 10.januar som v2
val p2Revurdering = p2.nyGenerasjon(kilde = UUID.randomUUID())
val p1Revurdering = p1.nyGenerasjon(kilde = UUID.randomUUID())
val p2Revurdering = p2.nyBehandling(kilde = UUID.randomUUID())
val p1Revurdering = p1.nyBehandling(kilde = UUID.randomUUID())

fabrikk.nyPølse(p1)
fabrikk.nyPølse(p2)
Expand All @@ -328,8 +328,8 @@ class PølsefabrikkTest : PølseTest() {

val p1 = 1.januar til 5.januar som v1
val p2 = 6.januar til 10.januar som v2
val p2Revurdering = p2.nyGenerasjon(kilde = UUID.randomUUID())
val p1Revurdering = p1.nyGenerasjon(kilde = UUID.randomUUID())
val p2Revurdering = p2.nyBehandling(kilde = UUID.randomUUID())
val p1Revurdering = p1.nyBehandling(kilde = UUID.randomUUID())

fabrikk.nyPølse(p1)
fabrikk.nyPølse(p2)
Expand All @@ -356,8 +356,8 @@ class PølsefabrikkTest : PølseTest() {
val p1 = 10.januar til 20.januar som v1
val p2 = 21.januar til 31.januar som v2
val p3 = 1.januar til 5.januar som v3 fordi oufOrderOrderkilde
val p2Revurdering = p2.nyGenerasjon(kilde = oufOrderOrderkilde)
val p1Revurdering = p1.nyGenerasjon(kilde = oufOrderOrderkilde)
val p2Revurdering = p2.nyBehandling(kilde = oufOrderOrderkilde)
val p1Revurdering = p1.nyBehandling(kilde = oufOrderOrderkilde)

fabrikk.nyPølse(p1)
fabrikk.nyPølse(p2)
Expand Down Expand Up @@ -386,10 +386,10 @@ class PølsefabrikkTest : PølseTest() {
val p1 = 10.januar til 20.januar som v2
val p2 = 21.januar til 31.januar som v3

val p3Revurdering = p3.nyGenerasjon(kilde = revurderingkilde)
val p2Revurdering = p2.nyGenerasjon(kilde = revurderingkilde)
val p1Revurdering = p1.nyGenerasjon(kilde = revurderingkilde)
val p1Revurdering2 = p1.nyGenerasjon(kilde = UUID.randomUUID())
val p3Revurdering = p3.nyBehandling(kilde = revurderingkilde)
val p2Revurdering = p2.nyBehandling(kilde = revurderingkilde)
val p1Revurdering = p1.nyBehandling(kilde = revurderingkilde)
val p1Revurdering2 = p1.nyBehandling(kilde = UUID.randomUUID())

fabrikk.nyPølse(p1)
fabrikk.nyPølse(p2)
Expand Down
Loading

0 comments on commit 1309174

Please sign in to comment.