Skip to content

Commit 5742ac9

Browse files
committed
Endret håndtering av svar frister når ansvaret går tilbake til registeret
1 parent 943060f commit 5742ac9

File tree

11 files changed

+119
-9
lines changed

11 files changed

+119
-9
lines changed

apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/paavegneav/HaandterBekreftelsePaaVegneAv.kt

+73-2
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@ package no.nav.paw.bekreftelsetjeneste.paavegneav
22

33
import no.nav.paw.bekreftelse.internehendelser.BekreftelseHendelse
44
import no.nav.paw.bekreftelse.internehendelser.BekreftelsePaaVegneAvStartet
5+
import no.nav.paw.bekreftelse.internehendelser.RegisterGracePeriodeUtloeptEtterEksternInnsamling
56
import no.nav.paw.bekreftelse.paavegneav.v1.PaaVegneAv
67
import no.nav.paw.bekreftelse.paavegneav.v1.vo.Start
78
import no.nav.paw.bekreftelse.paavegneav.v1.vo.Stopp
9+
import no.nav.paw.bekreftelsetjeneste.config.BekreftelseKonfigurasjon
10+
import no.nav.paw.bekreftelsetjeneste.logger
811
import no.nav.paw.bekreftelsetjeneste.tilstand.BekreftelseTilstand
912
import no.nav.paw.bekreftelsetjeneste.tilstand.GracePeriodeVarselet
1013
import no.nav.paw.bekreftelsetjeneste.tilstand.IkkeKlarForUtfylling
1114
import no.nav.paw.bekreftelsetjeneste.tilstand.InternBekreftelsePaaVegneAvStartet
1215
import no.nav.paw.bekreftelsetjeneste.tilstand.KlarForUtfylling
16+
import no.nav.paw.bekreftelsetjeneste.tilstand.Levert
1317
import no.nav.paw.bekreftelsetjeneste.tilstand.VenterSvar
18+
import no.nav.paw.bekreftelsetjeneste.tilstand.has
19+
import no.nav.paw.bekreftelsetjeneste.tilstand.opprettFoersteBekreftelse
1420
import no.nav.paw.bekreftelsetjeneste.tilstand.plus
1521
import no.nav.paw.bekreftelsetjeneste.tilstand.sisteTilstand
1622
import no.nav.paw.bekreftelsetjeneste.topology.Feil
@@ -19,13 +25,15 @@ import no.nav.paw.bekreftelsetjeneste.topology.logWarning
1925
import no.nav.paw.bekreftelsetjeneste.topology.paaVegneAvStartet
2026
import no.nav.paw.bekreftelsetjeneste.topology.paaVegneAvStoppet
2127
import java.time.Duration
28+
import java.time.Duration.between
2229
import java.time.Instant
2330
import java.util.*
2431

2532
@JvmInline
2633
value class WallClock(val value: Instant)
2734

2835
fun haandterBekreftelsePaaVegneAvEndret(
36+
bekreftelseKonfigurasjon: BekreftelseKonfigurasjon,
2937
wallclock: WallClock,
3038
bekreftelseTilstand: BekreftelseTilstand?,
3139
paaVegneAvTilstand: PaaVegneAvTilstand?,
@@ -40,11 +48,13 @@ fun haandterBekreftelsePaaVegneAvEndret(
4048
handling = handling
4149
)
4250

43-
is Stopp -> stoppPaaVegneAv(
51+
is Stopp -> haandterStoppPaaVegneAv(
52+
bekreftelseKonfigurasjon = bekreftelseKonfigurasjon,
53+
wallclock = wallclock,
54+
bekreftelseTilstand = bekreftelseTilstand,
4455
paaVegneAvTilstand = paaVegneAvTilstand,
4556
paaVegneAvHendelse = paaVegneAvHendelse
4657
)
47-
4858
else -> emptyList()
4959
}.also { _ ->
5060
val action = when (paaVegneAvHendelse.handling) {
@@ -74,6 +84,67 @@ fun haandterBekreftelsePaaVegneAvEndret(
7484
}
7585
}
7686

87+
fun haandterStoppPaaVegneAv(
88+
bekreftelseKonfigurasjon: BekreftelseKonfigurasjon,
89+
wallclock: WallClock,
90+
bekreftelseTilstand: BekreftelseTilstand?,
91+
paaVegneAvTilstand: PaaVegneAvTilstand?,
92+
paaVegneAvHendelse: PaaVegneAv
93+
): List<Handling> {
94+
val handlingerKnyttetTilFrister = if (bekreftelseTilstand != null) {
95+
verifiserBekreftelseFrist(bekreftelseTilstand, bekreftelseKonfigurasjon, wallclock, paaVegneAvHendelse)
96+
} else {
97+
null
98+
}
99+
return stoppPaaVegneAv(
100+
paaVegneAvTilstand = paaVegneAvTilstand,
101+
paaVegneAvHendelse = paaVegneAvHendelse
102+
) + listOfNotNull(handlingerKnyttetTilFrister)
103+
}
104+
105+
fun verifiserBekreftelseFrist(
106+
bekreftelseTilstand: BekreftelseTilstand,
107+
bekreftelseKonfigurasjon: BekreftelseKonfigurasjon,
108+
wallclock: WallClock,
109+
paaVegneAvHendelse: PaaVegneAv
110+
): SendHendelse? {
111+
val sisteLevering = bekreftelseTilstand?.bekreftelser
112+
?.filter { it.has<Levert>() }
113+
?.maxByOrNull { it.gjelderTil }
114+
val frist = bekreftelseKonfigurasjon.interval + bekreftelseKonfigurasjon.graceperiode
115+
val tidSidenFrist = sisteLevering?.let { between(it.gjelderTil, wallclock.value).toString() } ?: "null"
116+
logger.info("[${wallclock.value}]Siste levering: ${sisteLevering?.gjelderTil}, frist: $frist, tid siden frist: $tidSidenFrist")
117+
return when {
118+
sisteLevering != null && between(sisteLevering.gjelderTil, wallclock.value) > frist -> {
119+
SendHendelse(
120+
RegisterGracePeriodeUtloeptEtterEksternInnsamling(
121+
hendelseId = UUID.randomUUID(),
122+
periodeId = paaVegneAvHendelse.periodeId,
123+
arbeidssoekerId = bekreftelseTilstand.periode.arbeidsoekerId,
124+
hendelseTidspunkt = wallclock.value
125+
)
126+
)
127+
}
128+
129+
sisteLevering == null -> opprettFoersteBekreftelse(
130+
tidligsteStartTidspunktForBekreftelse = bekreftelseKonfigurasjon.migreringstidspunkt,
131+
periode = bekreftelseTilstand.periode,
132+
interval = bekreftelseKonfigurasjon.interval
133+
).takeIf { between(it.gjelderTil, wallclock.value) > bekreftelseKonfigurasjon.graceperiode }
134+
?.let {
135+
SendHendelse(
136+
RegisterGracePeriodeUtloeptEtterEksternInnsamling(
137+
hendelseId = UUID.randomUUID(),
138+
periodeId = paaVegneAvHendelse.periodeId,
139+
arbeidssoekerId = bekreftelseTilstand.periode.arbeidsoekerId,
140+
hendelseTidspunkt = wallclock.value
141+
)
142+
)
143+
}
144+
else -> null
145+
}
146+
}
147+
77148
fun stoppPaaVegneAv(
78149
paaVegneAvTilstand: PaaVegneAvTilstand?,
79150
paaVegneAvHendelse: PaaVegneAv

apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/topology/BekreftelsePaaVegneAvStroem.kt

+4-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import no.nav.paw.bekreftelse.internehendelser.BekreftelseHendelseSerde
99
import no.nav.paw.bekreftelse.paavegneav.v1.PaaVegneAv
1010
import no.nav.paw.bekreftelse.paavegneav.v1.vo.Start
1111
import no.nav.paw.bekreftelse.paavegneav.v1.vo.Stopp
12+
import no.nav.paw.bekreftelsetjeneste.config.BekreftelseKonfigurasjon
1213
import no.nav.paw.bekreftelsetjeneste.paavegneav.*
1314
import no.nav.paw.bekreftelsetjeneste.config.KafkaTopologyConfig
1415
import no.nav.paw.bekreftelsetjeneste.metrics.tellPaVegneAv
@@ -22,6 +23,7 @@ import java.time.Instant
2223
import java.util.*
2324

2425
fun StreamsBuilder.byggBekreftelsePaaVegneAvStroem(
26+
bekreftelseKonfigurasjon: BekreftelseKonfigurasjon,
2527
registry: PrometheusMeterRegistry,
2628
kafkaTopologyConfig: KafkaTopologyConfig,
2729
bekreftelseHendelseSerde: BekreftelseHendelseSerde
@@ -43,7 +45,8 @@ fun StreamsBuilder.byggBekreftelsePaaVegneAvStroem(
4345
ansvarlige = paaVegneAvTilstand?.paaVegneAvList?.map { it.loesning } ?: emptyList()
4446
)
4547
haandterBekreftelsePaaVegneAvEndret(
46-
wallclock = WallClock(Instant.now()),
48+
wallclock = WallClock(Instant.ofEpochMilli(this.currentSystemTimeMs())),
49+
bekreftelseKonfigurasjon = bekreftelseKonfigurasjon,
4750
bekreftelseTilstand = bekreftelseTilstand,
4851
paaVegneAvTilstand = paaVegneAvTilstand,
4952
paaVegneAvHendelse = message

apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/topology/BekreftelsePunctuator.kt

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import no.nav.paw.bekreftelse.internehendelser.RegisterGracePeriodeUtloept
1212
import no.nav.paw.bekreftelsetjeneste.paavegneav.PaaVegneAvTilstand
1313
import no.nav.paw.bekreftelsetjeneste.paavegneav.WallClock
1414
import no.nav.paw.bekreftelsetjeneste.config.BekreftelseKonfigurasjon
15+
import no.nav.paw.bekreftelsetjeneste.logger
1516
import no.nav.paw.bekreftelsetjeneste.tilstand.*
1617
import no.nav.paw.collections.toPawNonEmptyListOrNull
1718
import org.apache.kafka.streams.KeyValue

apps/bekreftelse-tjeneste/src/main/kotlin/no/nav/paw/bekreftelsetjeneste/topology/Topology.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ fun StreamsBuilder.buildTopology(
2222
byggBekreftelsePaaVegneAvStroem(
2323
registry = applicationContext.prometheusMeterRegistry,
2424
kafkaTopologyConfig = applicationContext.applicationConfig.kafkaTopology,
25-
bekreftelseHendelseSerde = applicationContext.bekreftelseHendelseSerde
25+
bekreftelseHendelseSerde = applicationContext.bekreftelseHendelseSerde,
26+
bekreftelseKonfigurasjon = applicationContext.bekreftelseKonfigurasjon
2627
)
2728
return build()
2829
}

apps/bekreftelse-tjeneste/src/test/kotlin/no/nav/paw/bekreftelsetjeneste/BekreftelseHappyPathSimulator.kt

+6-3
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ import no.nav.paw.bekreftelse.internehendelser.BekreftelseHendelse
1212
import no.nav.paw.bekreftelse.internehendelser.BekreftelseMeldingMottatt
1313
import no.nav.paw.bekreftelse.internehendelser.BekreftelseTilgjengelig
1414
import no.nav.paw.bekreftelse.internehendelser.RegisterGracePeriodeUtloept
15+
import no.nav.paw.bekreftelse.internehendelser.RegisterGracePeriodeUtloeptEtterEksternInnsamling
1516
import no.nav.paw.bekreftelse.melding.v1.Bekreftelse
1617
import no.nav.paw.bekreftelse.melding.v1.vo.Bekreftelsesloesning
1718
import no.nav.paw.bekreftelse.melding.v1.vo.Svar
1819
import no.nav.paw.bekreftelse.paavegneav.v1.PaaVegneAv
20+
import no.nav.paw.bekreftelse.paavegneav.v1.vo.Stopp
1921
import java.time.Duration
2022
import java.time.Instant
2123
import java.util.*
@@ -35,7 +37,7 @@ fun main() {
3537
)
3638
) {
3739
val opploesning = Duration.ofSeconds(60)
38-
val stoppTid = "01.06.2025 00:00".timestamp
40+
val stoppTid = "02.05.2025 00:00".timestamp
3941
with(KafkaKeyContext(this.kafkaKeysClient)) {
4042
val periode = periode(
4143
identitetsnummer = identietsnummer,
@@ -123,7 +125,8 @@ fun ApplicationTestContext.run(
123125
if (!bekreftelseHendelseloggTopicOut.isEmpty) {
124126
val kv = bekreftelseHendelseloggTopicOut.readKeyValue()
125127
when (val hendelse = kv.value) {
126-
is RegisterGracePeriodeUtloept -> {
128+
is RegisterGracePeriodeUtloept,
129+
is RegisterGracePeriodeUtloeptEtterEksternInnsamling -> {
127130
perioder
128131
.first { it.id == kv.value.periodeId }
129132
.let { periode ->
@@ -144,7 +147,7 @@ fun ApplicationTestContext.run(
144147
}
145148
still_klokken_frem(opploesning)
146149
counter++
147-
if (counter % 100000 == 0) {
150+
if (counter % 1000 == 0) {
148151
println("Tidspunkt: ${wallclock.get().prettyPrint}")
149152
}
150153
}

apps/bekreftelse-tjeneste/src/test/kotlin/no/nav/paw/bekreftelsetjeneste/TestUtils.kt

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import no.nav.paw.bekreftelse.internehendelser.LeveringsfristUtloept
1313
import no.nav.paw.bekreftelse.internehendelser.PeriodeAvsluttet
1414
import no.nav.paw.bekreftelse.internehendelser.RegisterGracePeriodeGjenstaaendeTid
1515
import no.nav.paw.bekreftelse.internehendelser.RegisterGracePeriodeUtloept
16+
import no.nav.paw.bekreftelse.internehendelser.RegisterGracePeriodeUtloeptEtterEksternInnsamling
1617
import no.nav.paw.bekreftelsetjeneste.config.BekreftelseKonfigurasjon
1718
import no.nav.paw.bekreftelsetjeneste.tilstand.*
1819
import no.nav.paw.test.days
@@ -214,6 +215,7 @@ fun BekreftelseHendelse.prettyPrint(): String {
214215
is PeriodeAvsluttet -> null
215216
is RegisterGracePeriodeGjenstaaendeTid -> "\tgjenstående tid: ${this.gjenstaandeTid}"
216217
is RegisterGracePeriodeUtloept -> "\tperiode avsluttes"
218+
is RegisterGracePeriodeUtloeptEtterEksternInnsamling -> null
217219
}
218220
return if (detaljer == null) {
219221
header

apps/bekreftelse-tjeneste/src/test/kotlin/no/nav/paw/bekreftelsetjeneste/paavegneav/DagpengerStarterBekreftelsePaaVegneAv1DagFoerGraceperiodenUtloeper.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ class DagpengerStarterBekreftelsePaaVegneAv1DagFoerGraceperiodenUtloeper : FreeS
3434
wallclock = WallClock(intervaller.gracePeriodeUtloeper(periodeStart) - 1.days),
3535
bekreftelseTilstand = tilstand,
3636
paaVegneAvTilstand = null,
37-
paaVegneAvHendelse = dagpengerStarterBekreftelsePaaVegneAv
37+
paaVegneAvHendelse = dagpengerStarterBekreftelsePaaVegneAv,
38+
bekreftelseKonfigurasjon = intervaller
3839
)
3940
"BekreftelsePaaVegneAv skal skrives til key-value store" {
4041
handlinger.assertExactlyOne<Handling, SkrivPaaVegneAvTilstand> {

apps/bekreftelse-tjeneste/src/test/resources/logback-test.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@
1919

2020
<logger name="punctuator.bekreftelse" level="trace"/>
2121
<logger name="org.apache.kafka" level="WARN"/>
22-
<logger name="bekreftelse" level="INFO"/>
22+
<logger name="bekreftelse" level="trace"/>
23+
<logger name="bekreftelse.tjeneste.punctuator" level="warn"/>
2324
</configuration>

apps/bekreftelse-utgang/src/main/kotlin/no/nav/paw/bekreftelseutgang/topology/BekreftelseUtgangStream.kt

+11
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.Metadata
99
import no.nav.paw.bekreftelse.internehendelser.BekreftelseHendelse
1010
import no.nav.paw.bekreftelse.internehendelser.BekreftelseHendelseSerde
1111
import no.nav.paw.bekreftelse.internehendelser.baOmAaAvsluttePeriodeHendelsesType
12+
import no.nav.paw.bekreftelse.internehendelser.registerGracePeriodeUtloeptEtterEksternInnsamlingHendelseType
1213
import no.nav.paw.bekreftelse.internehendelser.registerGracePeriodeUtloeptHendelseType
1314
import no.nav.paw.bekreftelseutgang.config.ApplicationConfig
1415
import no.nav.paw.bekreftelseutgang.tilstand.InternTilstand
@@ -58,6 +59,16 @@ fun processBekreftelseHendelse(
5859
),
5960
aarsak = "Graceperiode utløpt"
6061
)
62+
registerGracePeriodeUtloeptEtterEksternInnsamlingHendelseType -> avsluttetHendelse(
63+
identitetsnummer = identitetsnummer,
64+
periodeId = bekreftelseHendelse.periodeId,
65+
arbeidssoekerId = bekreftelseHendelse.arbeidssoekerId,
66+
utfoertAv = Bruker(
67+
type = BrukerType.SYSTEM,
68+
id = applicationConfig.getAppImage()
69+
),
70+
aarsak = "Graceperiode utløpt etter ekstern innsamling"
71+
)
6172
baOmAaAvsluttePeriodeHendelsesType -> avsluttetHendelse(
6273
identitetsnummer = identitetsnummer,
6374
periodeId = bekreftelseHendelse.periodeId,

domain/bekreftelse-interne-hendelser/src/main/kotlin/no/nav/paw/bekreftelse/internehendelser/BekreftelseHendelseSerde.kt

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class BekreftelseHendelseDeserializer: Deserializer<BekreftelseHendelse> {
4646
registerGracePeriodeGjenstaaendeTid -> objectMapper.readValue<RegisterGracePeriodeGjenstaaendeTid>(node.traverse())
4747
baOmAaAvsluttePeriodeHendelsesType -> objectMapper.readValue<BaOmAaAvsluttePeriode>(node.traverse())
4848
bekreftelsePaaVegneAvStartetHendelsesType -> objectMapper.readValue<BekreftelsePaaVegneAvStartet>(node.traverse())
49+
registerGracePeriodeUtloeptEtterEksternInnsamlingHendelseType -> objectMapper.readValue<RegisterGracePeriodeUtloeptEtterEksternInnsamling>(node.traverse())
4950
else -> throw IllegalArgumentException("Ukjent hendelseType: $hendelseType")
5051
}
5152
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package no.nav.paw.bekreftelse.internehendelser
2+
3+
import java.time.Instant
4+
import java.util.*
5+
6+
const val registerGracePeriodeUtloeptEtterEksternInnsamlingHendelseType = "bekreftelse.register_grace_periode_utloept_etter_ekstern_innsamling"
7+
8+
data class RegisterGracePeriodeUtloeptEtterEksternInnsamling(
9+
override val hendelseId: UUID,
10+
override val periodeId: UUID,
11+
override val arbeidssoekerId: Long,
12+
override val hendelseTidspunkt: Instant
13+
) : BekreftelseHendelse {
14+
override val hendelseType: String = registerGracePeriodeUtloeptEtterEksternInnsamlingHendelseType
15+
}

0 commit comments

Comments
 (0)