Skip to content

Commit 75dda66

Browse files
committed
Egen oppgavetabell for partisjonert
1 parent b86507d commit 75dda66

28 files changed

+474
-327
lines changed

src/main/kotlin/no/nav/k9/los/K9Los.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ fun Application.k9Los() {
284284
localSetup.initSaksbehandlere()
285285
localSetup.initPunsjoppgaver(0)
286286
localSetup.initTilbakeoppgaver(0)
287-
localSetup.initK9SakOppgaver(0)
287+
localSetup.initK9SakOppgaver(10)
288288
api()
289289
} else {
290290
authenticate(*issuers.allIssuers()) {

src/main/kotlin/no/nav/k9/los/KoinProfiles.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ import no.nav.k9.los.nyoppgavestyring.mottak.omraade.OmrådeRepository
6868
import no.nav.k9.los.nyoppgavestyring.mottak.oppgave.AktivOppgaveRepository
6969
import no.nav.k9.los.nyoppgavestyring.mottak.oppgave.OppgaveV3Repository
7070
import no.nav.k9.los.nyoppgavestyring.mottak.oppgave.OppgaveV3Tjeneste
71-
import no.nav.k9.los.nyoppgavestyring.mottak.oppgave.OppgavefeltverdiPartisjonertRepository
71+
import no.nav.k9.los.nyoppgavestyring.mottak.oppgave.OppgaveV3PartisjonertRepository
7272
import no.nav.k9.los.nyoppgavestyring.mottak.oppgavetype.OppgavetypeRepository
7373
import no.nav.k9.los.nyoppgavestyring.mottak.oppgavetype.OppgavetypeTjeneste
7474
import no.nav.k9.los.nyoppgavestyring.pep.PepCacheRepository
@@ -407,7 +407,7 @@ fun common(app: Application, config: Configuration) = module {
407407
)
408408
}
409409
single {
410-
OppgavefeltverdiPartisjonertRepository(
410+
OppgaveV3PartisjonertRepository(
411411
oppgavetypeRepository = get()
412412
)
413413
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package no.nav.k9.los.nyoppgavestyring.mottak.oppgave
2-
sealed class OppgaveId(open val id : Long)
32

4-
data class OppgaveV3Id(override val id : Long) : OppgaveId(id)
5-
data class AktivOppgaveId(override val id : Long) : OppgaveId(id)
3+
sealed class OppgaveId
4+
5+
data class OppgaveV3Id(val id: Long) : OppgaveId()
6+
data class AktivOppgaveId(val id: Long) : OppgaveId()
7+
data class PartisjonertOppgaveId(val oppgaveEksternId: String, val oppgaveEksternVersjon: String) : OppgaveId()

src/main/kotlin/no/nav/k9/los/nyoppgavestyring/mottak/oppgave/OppgaveV3.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import no.nav.k9.los.nyoppgavestyring.mottak.oppgavetype.Oppgavetype
66
import java.time.LocalDateTime
77

88
class OppgaveV3(
9-
val id: OppgaveId? = null, //TODO fjerne? blir kun brukt i innsikt-tjenesten
9+
val id: OppgaveId? = null,
1010
val eksternId: String,
1111
val eksternVersjon: String,
1212
val oppgavetype: Oppgavetype,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
package no.nav.k9.los.nyoppgavestyring.mottak.oppgave
2+
3+
import io.opentelemetry.instrumentation.annotations.WithSpan
4+
import kotliquery.TransactionalSession
5+
import kotliquery.queryOf
6+
import no.nav.k9.los.nyoppgavestyring.mottak.oppgavetype.OppgavetypeRepository
7+
import org.slf4j.LoggerFactory
8+
9+
class OppgaveV3PartisjonertRepository(val oppgavetypeRepository: OppgavetypeRepository) {
10+
11+
private val log = LoggerFactory.getLogger(OppgaveV3PartisjonertRepository::class.java)
12+
13+
@WithSpan
14+
fun ajourhold(oppgave: OppgaveV3, tx: TransactionalSession) {
15+
oppdaterOppgaveV3(oppgave, tx)
16+
oppdaterOppgavefeltverdier(oppgave, tx)
17+
}
18+
19+
private fun oppdaterOppgaveV3(oppgave: OppgaveV3, tx: TransactionalSession) {
20+
val eksisterendeOppgave = hentOppgave(oppgave, tx)
21+
if (eksisterendeOppgave == null) {
22+
nyOppgave(oppgave, tx)
23+
} else {
24+
oppdaterOppgave(oppgave, tx)
25+
}
26+
}
27+
28+
private fun oppdaterOppgavefeltverdier(oppgave: OppgaveV3, tx: TransactionalSession) {
29+
val eksisterendeFelter = hentFeltverdier(oppgave, tx)
30+
val nyeFelter = oppgave.felter
31+
32+
if (erForskjellige(eksisterendeFelter, nyeFelter)) {
33+
slettOppgavefeltverdier(oppgave, tx)
34+
nyeOppgavefeltverdier(oppgave, tx)
35+
}
36+
}
37+
38+
private fun erForskjellige(
39+
eksisterendeFelter: List<OppgaveFeltverdi>,
40+
nyeFelter: List<OppgaveFeltverdi>
41+
): Boolean {
42+
return eksisterendeFelter.size != nyeFelter.size ||
43+
!eksisterendeFelter.map { FeltverdiNøkkel(it) }.containsAll(nyeFelter.map { FeltverdiNøkkel(it) }) ||
44+
!nyeFelter.map { FeltverdiNøkkel(it) }.containsAll(eksisterendeFelter.map { FeltverdiNøkkel(it) })
45+
}
46+
47+
private fun hentOppgave(
48+
oppgave: OppgaveV3,
49+
tx: TransactionalSession
50+
): OppgaveV3? {
51+
return tx.run(
52+
queryOf(
53+
"""
54+
select * from oppgave_v3_part where oppgave_ekstern_id = :oppgave_ekstern_id
55+
""".trimIndent(),
56+
mapOf("oppgave_ekstern_id" to oppgave.eksternId)
57+
).map { row ->
58+
OppgaveV3(
59+
eksternId = row.string("oppgave_ekstern_id"),
60+
eksternVersjon = row.string("oppgave_ekstern_versjon"),
61+
oppgavetype = oppgave.oppgavetype,
62+
status = Oppgavestatus.valueOf(row.string("oppgavestatus")),
63+
endretTidspunkt = oppgave.endretTidspunkt,
64+
reservasjonsnøkkel = row.string("reservasjonsnokkel"),
65+
felter = hentFeltverdier(oppgave, tx),
66+
aktiv = true,
67+
kildeområde = oppgave.kildeområde
68+
)
69+
}.asSingle)
70+
}
71+
72+
private fun hentFeltverdier(
73+
oppgave: OppgaveV3,
74+
tx: TransactionalSession
75+
): List<OppgaveFeltverdi> {
76+
return tx.run(
77+
queryOf(
78+
"""
79+
select * from oppgavefelt_verdi_part where oppgave_ekstern_id = :oppgave_ekstern_id
80+
""".trimIndent(),
81+
mapOf(
82+
"oppgave_ekstern_id" to oppgave.eksternId
83+
)
84+
).map { row ->
85+
OppgaveFeltverdi(
86+
oppgavefelt = oppgave.hentFelt(row.string("feltdefinisjon_ekstern_id")),
87+
verdi = row.string("verdi"),
88+
verdiBigInt = row.longOrNull("verdi_bigint"),
89+
)
90+
}.asList
91+
)
92+
}
93+
94+
private fun nyOppgave(
95+
oppgave: OppgaveV3,
96+
tx: TransactionalSession
97+
) {
98+
tx.run(
99+
queryOf(
100+
"""
101+
insert into oppgave_v3_part(oppgave_ekstern_id, oppgave_ekstern_versjon, oppgavetype_ekstern_id, reservasjonsnokkel, endret_tidspunkt, oppgavestatus, ferdigstilt_dato)
102+
VALUES (:oppgave_ekstern_id, :oppgave_ekstern_versjon, :oppgavetype_ekstern_id, :reservasjonsnokkel, :endret_tidspunkt, :oppgavestatus, :ferdigstilt_dato)
103+
""".trimIndent(),
104+
mapOf(
105+
"oppgave_ekstern_id" to oppgave.eksternId,
106+
"oppgave_ekstern_versjon" to oppgave.eksternVersjon,
107+
"oppgavetype_ekstern_id" to oppgave.oppgavetype.eksternId,
108+
"reservasjonsnokkel" to oppgave.reservasjonsnøkkel,
109+
"endret_tidspunkt" to oppgave.endretTidspunkt,
110+
"oppgavestatus" to oppgave.status.kode,
111+
"ferdigstilt_dato" to if (oppgave.status == Oppgavestatus.LUKKET) oppgave.endretTidspunkt.toLocalDate() else null,
112+
)
113+
).asUpdate
114+
)
115+
}
116+
117+
private fun oppdaterOppgave(
118+
oppgave: OppgaveV3,
119+
tx: TransactionalSession
120+
) {
121+
tx.run(
122+
queryOf(
123+
"""
124+
update oppgave_v3_part
125+
set
126+
oppgave_ekstern_versjon = :oppgave_ekstern_versjon,
127+
oppgavetype_ekstern_id = :oppgavetype_ekstern_id,
128+
reservasjonsnokkel = :reservasjonsnokkel,
129+
endret_tidspunkt = :endret_tidspunkt,
130+
oppgavestatus = :oppgavestatus,
131+
ferdigstilt_dato = :ferdigstilt_dato
132+
where oppgave_ekstern_id = :oppgave_ekstern_id
133+
""".trimIndent(),
134+
mapOf(
135+
"oppgave_ekstern_id" to oppgave.eksternId,
136+
"oppgave_ekstern_versjon" to oppgave.eksternVersjon,
137+
"oppgavetype_ekstern_id" to oppgave.oppgavetype.eksternId,
138+
"reservasjonsnokkel" to oppgave.reservasjonsnøkkel,
139+
"endret_tidspunkt" to oppgave.endretTidspunkt,
140+
"oppgavestatus" to oppgave.status.kode,
141+
"ferdigstilt_dato" to if (oppgave.status == Oppgavestatus.LUKKET) oppgave.endretTidspunkt.toLocalDate() else null,
142+
)
143+
).asUpdate
144+
)
145+
}
146+
147+
private fun nyeOppgavefeltverdier(oppgave: OppgaveV3, tx: TransactionalSession) {
148+
if (oppgave.felter.isEmpty()) {
149+
return
150+
}
151+
152+
tx.batchPreparedNamedStatement(
153+
"""
154+
insert into oppgavefelt_verdi_part(oppgave_ekstern_id, oppgave_ekstern_versjon, omrade_ekstern_id, oppgavetype_ekstern_id, feltdefinisjon_ekstern_id, verdi, verdi_bigint, oppgavestatus, ferdigstilt_dato)
155+
VALUES (:oppgave_ekstern_id, :oppgave_ekstern_versjon, :omrade_ekstern_id, :oppgavetype_ekstern_id, :feltdefinisjon_ekstern_id, :verdi, :verdi_bigint, :oppgavestatus, :ferdigstilt_dato)
156+
""".trimIndent(),
157+
oppgave.felter.map {
158+
mapOf(
159+
"oppgave_ekstern_id" to oppgave.eksternId,
160+
"oppgave_ekstern_versjon" to oppgave.eksternVersjon,
161+
"omrade_ekstern_id" to it.oppgavefelt.feltDefinisjon.område.eksternId,
162+
"oppgavetype_ekstern_id" to oppgave.oppgavetype.eksternId,
163+
"feltdefinisjon_ekstern_id" to it.oppgavefelt.feltDefinisjon.eksternId,
164+
"verdi" to it.verdi,
165+
"verdi_bigint" to it.verdiBigInt,
166+
"oppgavestatus" to oppgave.status.kode,
167+
"ferdigstilt_dato" to if (oppgave.status == Oppgavestatus.LUKKET) oppgave.endretTidspunkt.toLocalDate() else null,
168+
)
169+
}
170+
)
171+
}
172+
173+
private fun slettOppgavefeltverdier(oppgave: OppgaveV3, tx: TransactionalSession) {
174+
tx.run(
175+
queryOf(
176+
"delete from oppgavefelt_verdi_part where oppgave_ekstern_id = :oppgave_ekstern_id",
177+
mapOf(
178+
"oppgave_ekstern_id" to oppgave.eksternId
179+
)
180+
).asUpdate,
181+
)
182+
}
183+
184+
private data class FeltverdiNøkkel(
185+
val feltdefinisjonEksternId: String,
186+
val verdi: String,
187+
val verdiBigInt: Long?
188+
) {
189+
constructor(fv: OppgaveFeltverdi) : this(
190+
feltdefinisjonEksternId = fv.oppgavefelt.feltDefinisjon.eksternId,
191+
verdi = fv.verdi,
192+
verdiBigInt = fv.verdiBigInt
193+
)
194+
}
195+
}

src/main/kotlin/no/nav/k9/los/nyoppgavestyring/mottak/oppgave/OppgaveV3Repository.kt

+8-9
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class OppgaveV3Repository(
1616
private val dataSource: DataSource,
1717
private val oppgavetypeRepository: OppgavetypeRepository,
1818
) {
19-
private val oppgavefeltverdiPartisjonertRepository = OppgavefeltverdiPartisjonertRepository(oppgavetypeRepository)
19+
private val oppgaveV3PartisjonertRepository = OppgaveV3PartisjonertRepository(oppgavetypeRepository)
2020
private val log = LoggerFactory.getLogger(OppgaveV3Repository::class.java)
2121

2222
fun nyOppgaveversjon(oppgave: OppgaveV3, tx: TransactionalSession) {
@@ -30,7 +30,6 @@ class OppgaveV3Repository(
3030
eksisterendeId?.let {
3131
deaktiverVersjon(eksisterendeId, oppgave.endretTidspunkt, tx)
3232
deaktiverOppgavefelter(eksisterendeId, tx)
33-
oppgavefeltverdiPartisjonertRepository.deaktiverOppgavefelter(eksisterendeId, tx)
3433
}
3534

3635
val nyVersjon = eksisterendeVersjon?.plus(1) ?: 0
@@ -43,7 +42,7 @@ class OppgaveV3Repository(
4342
log.info("Oppdaterer ikke aktiv oppgave, da hendelsen gjaldt frisinn for oppgaveId ${oppgave.eksternId}")
4443
} else {
4544
AktivOppgaveRepository.ajourholdAktivOppgave(oppgave, nyVersjon, tx)
46-
oppgavefeltverdiPartisjonertRepository.insertFelter(oppgaveId, oppgave, tx)
45+
oppgaveV3PartisjonertRepository.ajourhold(oppgave, tx)
4746
}
4847
}
4948

@@ -212,7 +211,7 @@ class OppgaveV3Repository(
212211
}
213212

214213
@VisibleForTesting
215-
fun nyOppgaveversjon(oppgave: OppgaveV3, nyVersjon: Long, tx: TransactionalSession): OppgaveId {
214+
fun nyOppgaveversjon(oppgave: OppgaveV3, nyVersjon: Long, tx: TransactionalSession): OppgaveV3Id {
216215
return OppgaveV3Id(tx.updateAndReturnGeneratedKey(
217216
queryOf(
218217
"""
@@ -235,7 +234,7 @@ class OppgaveV3Repository(
235234
}
236235

237236
private fun hentFeltverdier(
238-
oppgaveId: OppgaveId,
237+
oppgaveId: OppgaveV3Id,
239238
oppgavetype: Oppgavetype,
240239
tx: TransactionalSession
241240
): List<OppgaveFeltverdi> {
@@ -260,7 +259,7 @@ class OppgaveV3Repository(
260259

261260
@VisibleForTesting
262261
fun lagreFeltverdier(
263-
oppgaveId: OppgaveId,
262+
oppgaveId: OppgaveV3Id,
264263
oppgave: OppgaveV3,
265264
tx: TransactionalSession
266265
) {
@@ -346,7 +345,7 @@ class OppgaveV3Repository(
346345
oppgaveEksternId: String,
347346
oppgaveTypeEksternId: String,
348347
områdeEksternId: String
349-
): Triple<OppgaveId?, Oppgavestatus?, Long?> {
348+
): Triple<OppgaveV3Id?, Oppgavestatus?, Long?> {
350349
return tx.run(
351350
queryOf(
352351
"""
@@ -379,7 +378,7 @@ class OppgaveV3Repository(
379378
}
380379

381380
@VisibleForTesting
382-
fun deaktiverVersjon(eksisterendeId: OppgaveId, deaktivertTidspunkt: LocalDateTime, tx: TransactionalSession) {
381+
fun deaktiverVersjon(eksisterendeId: OppgaveV3Id, deaktivertTidspunkt: LocalDateTime, tx: TransactionalSession) {
383382
tx.run(
384383
queryOf(
385384
"""
@@ -394,7 +393,7 @@ class OppgaveV3Repository(
394393
}
395394

396395
@VisibleForTesting
397-
fun deaktiverOppgavefelter(oppgaveId: OppgaveId, tx: TransactionalSession) {
396+
fun deaktiverOppgavefelter(oppgaveId: OppgaveV3Id, tx: TransactionalSession) {
398397
tx.run(
399398
queryOf(
400399
"""

src/main/kotlin/no/nav/k9/los/nyoppgavestyring/mottak/oppgave/OppgaveV3Tjeneste.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import no.nav.k9.los.nyoppgavestyring.mottak.oppgavetype.OppgavetypeRepository
66

77
class OppgaveV3Tjeneste(
88
private val oppgaveV3Repository: OppgaveV3Repository,
9-
private val oppgaveV3RepositoryPartisjonertRepository: OppgavefeltverdiPartisjonertRepository,
9+
private val oppgaveV3RepositoryPartisjonertRepository: OppgaveV3PartisjonertRepository,
1010
private val oppgavetypeRepository: OppgavetypeRepository,
1111
private val områdeRepository: OmrådeRepository
1212
) {
@@ -78,6 +78,7 @@ class OppgaveV3Tjeneste(
7878

7979
fun ajourholdAktivOppgave(innkommendeOppgave: OppgaveV3, internVersjon: Long, tx: TransactionalSession) {
8080
AktivOppgaveRepository.ajourholdAktivOppgave(innkommendeOppgave, internVersjon, tx)
81+
oppgaveV3RepositoryPartisjonertRepository.ajourhold(innkommendeOppgave, tx)
8182
}
8283

8384
fun slettAktivOppgave(innkommendeOppgave: OppgaveV3, tx: TransactionalSession){
@@ -138,8 +139,6 @@ class OppgaveV3Tjeneste(
138139
internVersjon = eventNr,
139140
reservasjonsnokkel = innkommendeOppgave.reservasjonsnøkkel,
140141
tx = tx)
141-
142-
oppgaveV3RepositoryPartisjonertRepository.ajourholdOppgavefeltverdier(innkommendeOppgave, eventNr, tx)
143142
}
144143

145144
fun hentHøyesteInternVersjon(oppgaveEksternId: String, opppgaveTypeEksternId: String, områdeEksternId: String, tx: TransactionalSession): Long? {

0 commit comments

Comments
 (0)