Skip to content

Commit

Permalink
Omdøpt tilstander til henholdsvis BekreftelseTilstand og PaaVegneAvTi…
Browse files Browse the repository at this point in the history
…lstand, skrevet om fra ansvar til bekreftelsePaaVegneAv gjennomgående, oppdatert tester til å reflektere navnendringene. Fikset feilende tester i IngenStarterBekreftelsePaaVegneAvTest
  • Loading branch information
robertkittilsen committed Oct 29, 2024
1 parent 79e6bc6 commit 8c8a5c2
Show file tree
Hide file tree
Showing 23 changed files with 252 additions and 245 deletions.
29 changes: 12 additions & 17 deletions apps/bekreftelse-tjeneste/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,53 +13,48 @@ sequenceDiagram
```mermaid
sequenceDiagram
Registeret->>PeriodeTopic: Periode startet
Dagpenger-->>AnsvarsTopic: Dagpenger startet
AnsvarsTopic-->>MeldepliktTjeneste: Dagpenger tar over
MeldepliktTjeneste-->>EndringerTopic:
Dagpenger-->>BekreftelsePaaVegneAvTopic: Dagpenger startet
BekreftelsePaaVegneAvTopic-->>BekreftelseTjeneste: Dagpenger tar over
```

```mermaid
graph LR
periodeTopic((PeriodeTopic)) -- Startet --> Ansvar[Ansvar]
```
```
periode topic:
startet: lagre initiell tilstand
avsluttet: send ok(avsluttet)
:slett tilstand
ansvar topic:
tar ansvar: lagre info om ansvar
:sett tidspunkt for siste melding til record ts for ansvars endring
avslutter ansvar: slett info om ansvar
bekreftelse paaVegneAv topic:
starter paaVegneAv: lagre paaVegneAv info
:sett tidspunkt for siste melding til record ts for paaVegneAv endring
stopper paaVegneAv: slett paaVegneAv info
melding topic:
bekreftelse melding topic:
mottatt: lagre tidspunkt for siste melding
:send OK(mottatt)
dersom ikke ønsker å fortsette:
:send VilAvsluttePerioden
hver x time:
for alle perioder ingen har ansvar for:
for alle perioder ingen har bekreftelse paaVegneAv for:
dersom tid siden siste melding (eller periode start) > Y dager:
send melding om frist nærmer seg
dersom tid siden siste melding (eller periode start) > Z dager:
send melding om frist utløpt
dersom tid siden siste melding (eller periode start) > Z+Grace dager:
send melding om graceperiode utløpt
for alle perioder andre har ansvar for:
for alle perioder andre sender bekreftelse paaVegneAv for:
dersom tid siden siste melding (eller periode start) > Z+G+1dag dager:
send melding om graceperiode utløpt
:slett ansvar, vi overtar
:stopp paaVegneAv, vi overtar
```

Modul: endringer til frontend
```
meldings topic:
- OK(mottatt) -> sett oppgave fullført
- OK(avsluttet) -> slett oppgave kansellert
- OK(ansvar) -> sett oppgave fullført
- OK(paaVegneAv) -> sett oppgave fullført
- frist nærmer seg -> opprett oppgave
- frist utløpt -> opprett oppgave
- graceperiode utløpt -> ingenting
Expand All @@ -71,5 +66,5 @@ Modul: endringer til eventlogg
- VilAvsluttePerioden -> send avslutt hendelse til eventlogg
```
* OK (grunn: RapportMottatt, AnsvarFlyttet, PeriodeAvsluttet)
* OK (grunn: BekreftelseMottatt, PaaVegneAv Start, PeriodeAvsluttet)
*
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,22 @@ value class WallClock(val value: Instant)

fun haandterBekreftelsePaaVegneAvEndret(
wallclock: WallClock,
tilstand: InternTilstand?,
bekreftelseTilstand: BekreftelseTilstand?,
paaVegneAvTilstand: PaaVegneAvTilstand?,
paaVegneAv: PaaVegneAv
paaVegneAvHendelse: PaaVegneAv
): List<Handling> {
return when (val handling = paaVegneAv.handling) {
return when (val handling = paaVegneAvHendelse.handling) {
is Start -> startPaaVegneAv(
wallclock = wallclock,
tilstand = tilstand,
bekreftelseTilstand = bekreftelseTilstand,
paaVegneAvTilstand = paaVegneAvTilstand,
paaVegneAv = paaVegneAv,
paaVegneAvHendelse = paaVegneAvHendelse,
handling = handling
)

is Stopp -> stoppPaaVegneAv(
paaVegneAvTilstand = paaVegneAvTilstand,
paaVegneAv = paaVegneAv
paaVegneAvHendelse = paaVegneAvHendelse
)

else -> emptyList()
Expand All @@ -39,40 +39,40 @@ fun haandterBekreftelsePaaVegneAvEndret(

fun stoppPaaVegneAv(
paaVegneAvTilstand: PaaVegneAvTilstand?,
paaVegneAv: PaaVegneAv
paaVegneAvHendelse: PaaVegneAv
): List<Handling> {
val oppdatertPaaVegneAv = paaVegneAvTilstand - Loesning.from(paaVegneAv.bekreftelsesloesning)
val oppdatertPaaVegneAv = paaVegneAvTilstand - Loesning.from(paaVegneAvHendelse.bekreftelsesloesning)
val paaVegneAvHandling = when {
paaVegneAvTilstand != null && oppdatertPaaVegneAv == null -> SlettBekreftelsePaaVegneAv(paaVegneAv.periodeId)
paaVegneAvTilstand != null && oppdatertPaaVegneAv != null -> SkrivBekreftelsePaaVegneAv(paaVegneAv.periodeId, oppdatertPaaVegneAv)
paaVegneAvTilstand != null && oppdatertPaaVegneAv == null -> SlettPaaVegneAvTilstand(paaVegneAvHendelse.periodeId)
paaVegneAvTilstand != null && oppdatertPaaVegneAv != null -> SkrivPaaVegneAvTilstand(paaVegneAvHendelse.periodeId, oppdatertPaaVegneAv)
else -> null
}
return listOfNotNull(paaVegneAvHandling)
}

fun startPaaVegneAv(
wallclock: WallClock,
tilstand: InternTilstand?,
bekreftelseTilstand: BekreftelseTilstand?,
paaVegneAvTilstand: PaaVegneAvTilstand?,
paaVegneAv: PaaVegneAv,
paaVegneAvHendelse: PaaVegneAv,
handling: Start
): List<Handling> {
val oppdatertInternPaaVegneAv =
(paaVegneAvTilstand ?: bekreftelsePaaVegneAvTilstand(paaVegneAv.periodeId)) +
val oppdatertPaaVegneAvTilstand =
(paaVegneAvTilstand ?: opprettPaaVegneAvTilstand(paaVegneAvHendelse.periodeId)) +
InternPaaVegneAv(
loesning = Loesning.from(paaVegneAv.bekreftelsesloesning),
loesning = Loesning.from(paaVegneAvHendelse.bekreftelsesloesning),
intervall = Duration.ofMillis(handling.intervalMS),
gracePeriode = Duration.ofMillis(handling.graceMS)
)
val hendelse = tilstand?.let {
val hendelse = bekreftelseTilstand?.let {
BekreftelsePaaVegneAvStartet(
hendelseId = UUID.randomUUID(),
periodeId = paaVegneAv.periodeId,
arbeidssoekerId = tilstand.periode.arbeidsoekerId,
periodeId = paaVegneAvHendelse.periodeId,
arbeidssoekerId = bekreftelseTilstand.periode.arbeidsoekerId,
hendelseTidspunkt = wallclock.value,
)
}
val oppdaterInternTilstand = tilstand?.let {
val oppdaterBekreftelseTilstand = bekreftelseTilstand?.let {
val oppdaterteBekreftelser = it.bekreftelser
.map { bekreftelse ->
when (bekreftelse.sisteTilstand()) {
Expand All @@ -85,19 +85,19 @@ fun startPaaVegneAv(
}
it.copy(bekreftelser = oppdaterteBekreftelser)
}
?.takeIf { oppdatertTilstand -> oppdatertTilstand != tilstand }
?.let { oppdatertTilstand -> SkrivInternTilstand(oppdatertTilstand.periode.periodeId, oppdatertTilstand) }
?.takeIf { oppdatertBekreftelseTilstand -> oppdatertBekreftelseTilstand != bekreftelseTilstand }
?.let { oppdatertBekreftelseTilstand -> SkrivBekreftelseTilstand(oppdatertBekreftelseTilstand.periode.periodeId, oppdatertBekreftelseTilstand) }

return listOfNotNull(
if (paaVegneAvTilstand != oppdatertInternPaaVegneAv) SkrivBekreftelsePaaVegneAv(paaVegneAv.periodeId, oppdatertInternPaaVegneAv) else null,
oppdaterInternTilstand,
if (paaVegneAvTilstand != oppdatertPaaVegneAvTilstand) SkrivPaaVegneAvTilstand(paaVegneAvHendelse.periodeId, oppdatertPaaVegneAvTilstand) else null,
oppdaterBekreftelseTilstand,
hendelse?.let(::SendHendelse)
)
}


sealed interface Handling
data class SlettBekreftelsePaaVegneAv(val id: UUID) : Handling
data class SkrivBekreftelsePaaVegneAv(val id: UUID, val value: PaaVegneAvTilstand) : Handling
data class SkrivInternTilstand(val id: UUID, val value: InternTilstand) : Handling
data class SlettPaaVegneAvTilstand(val id: UUID) : Handling
data class SkrivPaaVegneAvTilstand(val id: UUID, val value: PaaVegneAvTilstand) : Handling
data class SkrivBekreftelseTilstand(val id: UUID, val value: BekreftelseTilstand) : Handling
data class SendHendelse(val hendelse: BekreftelseHendelse) : Handling
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import java.util.*

data class PaaVegneAvTilstand(
val periodeId: UUID,
val internPaaVegneAvList: List<InternPaaVegneAv>
val paaVegneAvList: List<InternPaaVegneAv>
)

data class InternPaaVegneAv(
Expand Down Expand Up @@ -34,21 +34,21 @@ enum class Loesning {
}
}

fun bekreftelsePaaVegneAvTilstand(
fun opprettPaaVegneAvTilstand(
periodeId: UUID,
internPaaVegneAv: InternPaaVegneAv? = null
paaVegneAv: InternPaaVegneAv? = null
): PaaVegneAvTilstand = PaaVegneAvTilstand(
periodeId = periodeId,
internPaaVegneAvList = listOfNotNull(internPaaVegneAv)
paaVegneAvList = listOfNotNull(paaVegneAv)
)

operator fun PaaVegneAvTilstand.plus(internPaaVegneAv: InternPaaVegneAv): PaaVegneAvTilstand =
copy(internPaaVegneAvList = internPaaVegneAvList
.filterNot { it.loesning == internPaaVegneAv.loesning} + internPaaVegneAv
operator fun PaaVegneAvTilstand.plus(paaVegneAv: InternPaaVegneAv): PaaVegneAvTilstand =
copy(paaVegneAvList = paaVegneAvList
.filterNot { it.loesning == paaVegneAv.loesning} + paaVegneAv
)

operator fun PaaVegneAvTilstand?.minus(loesning: Loesning): PaaVegneAvTilstand? =
this?.internPaaVegneAvList
this?.paaVegneAvList
?.filterNot { it.loesning == loesning }
?.takeIf(List<InternPaaVegneAv>::isNotEmpty)
?.let { copy(internPaaVegneAvList = it) }
?.let { copy(paaVegneAvList = it) }
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ data class Bekreftelse(
val gjelderTil: Instant
)

inline fun <reified T: BekreftelseTilstand> Bekreftelse.tilstand(): T? = tilstandsLogg.get()
inline fun <reified T: BekreftelseTilstandStatus> Bekreftelse.tilstand(): T? = tilstandsLogg.get()

inline fun <reified T: BekreftelseTilstand> Bekreftelse.has(): Boolean = tilstand<T>() != null
inline fun <reified T: BekreftelseTilstandStatus> Bekreftelse.has(): Boolean = tilstand<T>() != null

fun Bekreftelse.sisteTilstand(): BekreftelseTilstand = tilstandsLogg.siste
fun Bekreftelse.sisteTilstand(): BekreftelseTilstandStatus = tilstandsLogg.siste

operator fun Bekreftelse.plus(bekreftelseTilstand: BekreftelseTilstand): Bekreftelse =
copy(tilstandsLogg = tilstandsLogg + bekreftelseTilstand)
operator fun Bekreftelse.plus(bekreftelseTilstandStatus: BekreftelseTilstandStatus): Bekreftelse =
copy(tilstandsLogg = tilstandsLogg + bekreftelseTilstandStatus)

fun opprettFoersteBekreftelse(
tidligsteStartTidspunktForBekreftelse: Instant,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,43 @@
package no.nav.paw.bekreftelsetjeneste.tilstand

import com.fasterxml.jackson.annotation.JsonSubTypes
import com.fasterxml.jackson.annotation.JsonTypeInfo
import java.time.Instant
import no.nav.paw.arbeidssokerregisteret.api.v1.Periode

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type"
)
@JsonSubTypes(
JsonSubTypes.Type(value = IkkeKlarForUtfylling::class, name = "IkkeKlarForUtfylling"),
JsonSubTypes.Type(value = KlarForUtfylling::class, name = "KlarForUtfylling"),
JsonSubTypes.Type(value = VenterSvar::class, name = "VenterSvar"),
JsonSubTypes.Type(value = GracePeriodeUtloept::class, name = "GracePeriodeUtloept"),
JsonSubTypes.Type(value = Levert::class, name = "Levert")
const val MAKS_ANTALL_HISTRISKE_BEKREFTELSER = 20

@JvmRecord
data class BekreftelseTilstand(
val periode: PeriodeInfo,
val bekreftelser: List<Bekreftelse>
)
sealed interface BekreftelseTilstand {
val timestamp: Instant

fun opprettBekreftelseTilstand(
id: Long,
key: Long,
periode: Periode,
): BekreftelseTilstand =
BekreftelseTilstand(
periode = PeriodeInfo(
periodeId = periode.id,
identitetsnummer = periode.identitetsnummer,
arbeidsoekerId = id,
recordKey = key,
startet = periode.startet.tidspunkt,
avsluttet = periode.avsluttet?.tidspunkt
),
bekreftelser = emptyList()
)

fun BekreftelseTilstand.oppdaterBekreftelse(ny: Bekreftelse): BekreftelseTilstand {
val nyBekreftelser = bekreftelser.map {
if (it.bekreftelseId == ny.bekreftelseId) ny else it
}
return copy(bekreftelser = nyBekreftelser)
}

fun BekreftelseTilstand.leggTilNyEllerOppdaterBekreftelse(ny: Bekreftelse): BekreftelseTilstand {
val nyBekreftelser = bekreftelser
.filter { it.bekreftelseId != ny.bekreftelseId }
.plus(ny)
return copy(bekreftelser = nyBekreftelser)
}

data class GracePeriodeUtloept(override val timestamp: Instant) : BekreftelseTilstand
data class GracePeriodeVarselet(override val timestamp: Instant) : BekreftelseTilstand
data class IkkeKlarForUtfylling(override val timestamp: Instant) : BekreftelseTilstand
data class KlarForUtfylling(override val timestamp: Instant) : BekreftelseTilstand
data class Levert(override val timestamp: Instant) : BekreftelseTilstand
data class VenterSvar(override val timestamp: Instant) : BekreftelseTilstand
data class InternBekreftelsePaaVegneAvStartet(override val timestamp: Instant) : BekreftelseTilstand
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package no.nav.paw.bekreftelsetjeneste.tilstand

import com.fasterxml.jackson.annotation.JsonSubTypes
import com.fasterxml.jackson.annotation.JsonTypeInfo
import java.time.Instant

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type"
)
@JsonSubTypes(
JsonSubTypes.Type(value = IkkeKlarForUtfylling::class, name = "IkkeKlarForUtfylling"),
JsonSubTypes.Type(value = KlarForUtfylling::class, name = "KlarForUtfylling"),
JsonSubTypes.Type(value = VenterSvar::class, name = "VenterSvar"),
JsonSubTypes.Type(value = GracePeriodeUtloept::class, name = "GracePeriodeUtloept"),
JsonSubTypes.Type(value = Levert::class, name = "Levert"),
)
sealed interface BekreftelseTilstandStatus {
val timestamp: Instant
}

data class GracePeriodeUtloept(override val timestamp: Instant) : BekreftelseTilstandStatus
data class GracePeriodeVarselet(override val timestamp: Instant) : BekreftelseTilstandStatus
data class IkkeKlarForUtfylling(override val timestamp: Instant) : BekreftelseTilstandStatus
data class KlarForUtfylling(override val timestamp: Instant) : BekreftelseTilstandStatus
data class Levert(override val timestamp: Instant) : BekreftelseTilstandStatus
data class VenterSvar(override val timestamp: Instant) : BekreftelseTilstandStatus
data class InternBekreftelsePaaVegneAvStartet(override val timestamp: Instant) : BekreftelseTilstandStatus
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ import org.slf4j.LoggerFactory

@JvmRecord
data class BekreftelseTilstandsLogg(
val siste: BekreftelseTilstand,
val tidligere: List<BekreftelseTilstand>
val siste: BekreftelseTilstandStatus,
val tidligere: List<BekreftelseTilstandStatus>
)

private val bekreftelseTilstandsLoggProblemerLogger = LoggerFactory.getLogger(BekreftelseTilstandsLogg::class.java)
operator fun BekreftelseTilstandsLogg.plus(bekreftelseTilstand: BekreftelseTilstand): BekreftelseTilstandsLogg =
(tidligere + siste + bekreftelseTilstand)
operator fun BekreftelseTilstandsLogg.plus(bekreftelseTilstandStatus: BekreftelseTilstandStatus): BekreftelseTilstandsLogg =
(tidligere + siste + bekreftelseTilstandStatus)
.groupBy { it::class }
.values
.map { gruppe ->
Expand All @@ -28,7 +28,7 @@ operator fun BekreftelseTilstandsLogg.plus(bekreftelseTilstand: BekreftelseTilst
BekreftelseTilstandsLogg(siste, tidligere)
}

inline fun <reified T : BekreftelseTilstand> BekreftelseTilstandsLogg.get(): T? =
inline fun <reified T : BekreftelseTilstandStatus> BekreftelseTilstandsLogg.get(): T? =
tidligere.filterIsInstance<T>().firstOrNull() ?: siste as? T

fun BekreftelseTilstandsLogg.asList(): NonEmptyList<BekreftelseTilstand> = nonEmptyListOf(siste) + tidligere
fun BekreftelseTilstandsLogg.asList(): NonEmptyList<BekreftelseTilstandStatus> = nonEmptyListOf(siste) + tidligere
Loading

0 comments on commit 8c8a5c2

Please sign in to comment.