1
1
package no.nav.paw.arbeidssokerregisteret.app.funksjoner
2
2
3
+ import io.opentelemetry.api.common.AttributeKey.stringKey
4
+ import io.opentelemetry.api.common.Attributes
5
+ import io.opentelemetry.api.trace.Span
3
6
import no.nav.paw.arbeidssokerregisteret.api.v4.OpplysningerOmArbeidssoeker
4
7
import no.nav.paw.arbeidssokerregisteret.app.tilstand.*
5
8
import no.nav.paw.arbeidssokerregisteret.intern.v1.Startet
9
+ import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.AvviksType
10
+ import no.nav.paw.arbeidssokerregisteret.intern.v1.vo.TidspunktFraKilde
6
11
import org.slf4j.LoggerFactory
7
12
import java.time.Duration
8
13
import java.time.Instant
9
14
import no.nav.paw.arbeidssokerregisteret.api.v1.Periode as ApiPeriode
15
+ object StartPeriodeOtelHendelser {
16
+ val starter = " startet_ny_periode"
17
+ val nyttTidspunkt = " startet_nytt_tidspunkt"
18
+ val ignorertFeilretting = " startet_feilretting_ignorert"
19
+ val aarsakTilIgnorertKey = stringKey(" arrsak_til_ignorert" )
20
+ }
10
21
22
+ fun FunctionContext <TilstandV1 ?, Long >.startPeriode (
23
+ window : Duration ,
24
+ hendelse : Startet
25
+ ): InternTilstandOgApiTilstander {
26
+ val (startetPeriode: Periode ? , nyTilstand: TilstandV1 , opplysninger: OpplysningerOmArbeidssoeker ? ) =
27
+ if (tilstand?.gjeldenePeriode != null ) {
28
+ if (hendelse.erGyldigFeilrettingAvStartTid()) {
29
+ val nyttTidspunkt = hendelse.metadata.tidspunktFraKilde?.tidspunkt ? : throw IllegalStateException (" Tidspunkt fra kilde er null" )
30
+ oppdaterTidspunktForEksiterendePeriode(
31
+ hendelseScope = scope,
32
+ nyttTidspunkt = nyttTidspunkt,
33
+ hendelse = hendelse,
34
+ tilstand = tilstand,
35
+ gjeldenePeriode = tilstand.gjeldenePeriode
36
+ ).let { (oppdatertPeriode, nyTilstand) ->
37
+ Triple (oppdatertPeriode, nyTilstand, null )
38
+ }
39
+ } else {
40
+ throw IllegalStateException (" Gjeldene periode er ikke null. Kan ikke starte ny periode." )
41
+ }
42
+ } else {
43
+ Span .current().addEvent(StartPeriodeOtelHendelser .starter)
44
+ val (startetPeriode, nyTilstand) = opprettNyPeriode(hendelse, tilstand)
45
+ val opplysninger = tilstand?.sisteOpplysningerOmArbeidssoeker
46
+ ?.takeIf { window.isWithinWindow(it.metadata.tidspunkt, hendelse.metadata.tidspunkt) }
47
+ ?.let { intern ->
48
+ OpplysningerOmArbeidssoeker (
49
+ intern.id,
50
+ startetPeriode.id,
51
+ intern.metadata.api(),
52
+ intern.utdanning?.api(),
53
+ intern.helse?.api(),
54
+ intern.jobbsituasjon.api(),
55
+ intern.annet?.api()
56
+ )
57
+ }
58
+ Triple (startetPeriode, nyTilstand, opplysninger)
59
+ }
60
+ return InternTilstandOgApiTilstander (
61
+ id = scope.id,
62
+ tilstand = nyTilstand,
63
+ nyOpplysningerOmArbeidssoekerTilstand = opplysninger,
64
+ nyPeriodeTilstand = startetPeriode?.let {
65
+ ApiPeriode (
66
+ startetPeriode.id,
67
+ startetPeriode.identitetsnummer,
68
+ startetPeriode.startet.api(),
69
+ startetPeriode.avsluttet?.api()
70
+ )
71
+ }
72
+ )
73
+ }
11
74
12
- fun FunctionContext <TilstandV1 ?, Long >.startPeriode (window : Duration , hendelse : Startet ): InternTilstandOgApiTilstander {
13
- if (tilstand?.gjeldenePeriode != null ) throw IllegalStateException (" Gjeldene periode er ikke null. Kan ikke starte ny periode." )
75
+ fun oppdaterTidspunktForEksiterendePeriode (
76
+ hendelseScope : HendelseScope <Long >,
77
+ nyttTidspunkt : Instant ,
78
+ hendelse : Startet ,
79
+ tilstand : TilstandV1 ,
80
+ gjeldenePeriode : Periode
81
+ ): Pair <Periode ?, TilstandV1 > {
82
+ val orginaltStartTidspunkt = gjeldenePeriode.startet.tidspunkt
83
+ if (nyttTidspunkt.isAfter(orginaltStartTidspunkt)) {
84
+ Span .current().addEvent(
85
+ StartPeriodeOtelHendelser .ignorertFeilretting,
86
+ Attributes .of(
87
+ StartPeriodeOtelHendelser .aarsakTilIgnorertKey,
88
+ " nytt_tidspunkt_er_etter_orginalt_tidspunkt"
89
+ )
90
+ )
91
+ return null to tilstand
92
+ } else {
93
+ Span .current().addEvent(StartPeriodeOtelHendelser .nyttTidspunkt)
94
+ val oppdatertPeriode = gjeldenePeriode.copy(
95
+ startet = gjeldenePeriode.startet.copy(
96
+ tidspunktFraKilde = TidspunktFraKilde (
97
+ tidspunkt = nyttTidspunkt,
98
+ avviksType = AvviksType .TIDSPUNKT_KORRIGERT
99
+ ),
100
+ utfoertAv = hendelse.metadata.utfoertAv,
101
+ aarsak = hendelse.metadata.aarsak,
102
+ kilde = hendelse.metadata.kilde
103
+ )
104
+ )
105
+ val nyTilstand = tilstand.copy(
106
+ gjeldenePeriode = oppdatertPeriode,
107
+ hendelseScope = hendelseScope
108
+ )
109
+ return oppdatertPeriode to nyTilstand
110
+ }
111
+
112
+ }
113
+
114
+ private fun FunctionContext <TilstandV1 ?, Long >.opprettNyPeriode (
115
+ hendelse : Startet ,
116
+ tilstand : TilstandV1 ?
117
+ ): Pair <Periode , TilstandV1 > {
14
118
val startetPeriode = Periode (
15
119
id = hendelse.hendelseId,
16
120
identitetsnummer = hendelse.identitetsnummer,
@@ -35,29 +139,7 @@ fun FunctionContext<TilstandV1?, Long>.startPeriode(window: Duration, hendelse:
35
139
sisteOpplysningerOmArbeidssoeker = null ,
36
140
forrigeOpplysningerOmArbeidssoeker = null
37
141
)
38
- return InternTilstandOgApiTilstander (
39
- id = scope.id,
40
- tilstand = nyTilstand,
41
- nyOpplysningerOmArbeidssoekerTilstand = tilstand?.sisteOpplysningerOmArbeidssoeker
42
- ?.takeIf { window.isWithinWindow(it.metadata.tidspunkt, hendelse.metadata.tidspunkt) }
43
- ?.let { intern ->
44
- OpplysningerOmArbeidssoeker (
45
- intern.id,
46
- startetPeriode.id,
47
- intern.metadata.api(),
48
- intern.utdanning?.api(),
49
- intern.helse?.api(),
50
- intern.jobbsituasjon.api(),
51
- intern.annet?.api()
52
- )
53
- },
54
- nyPeriodeTilstand = ApiPeriode (
55
- startetPeriode.id,
56
- startetPeriode.identitetsnummer,
57
- startetPeriode.startet.api(),
58
- startetPeriode.avsluttet?.api()
59
- )
60
- )
142
+ return startetPeriode to nyTilstand
61
143
}
62
144
63
145
val windowLogger = LoggerFactory .getLogger(" window_check" )
0 commit comments