Skip to content
This repository was archived by the owner on Nov 5, 2024. It is now read-only.

Commit 6e71529

Browse files
author
Martine Enger
authored
Merge pull request #693 from navikt/perioder-flere-fnr
Håndter at personer kan ha flere identer når vi starter, avslutter og henter periode
2 parents 5826862 + 8bb0ad6 commit 6e71529

File tree

13 files changed

+132
-52
lines changed

13 files changed

+132
-52
lines changed

src/main/kotlin/no/nav/fo/veilarbregistrering/arbeidssoker/ArbeidssokerperiodeRepository.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,7 @@ import java.time.LocalDateTime
66
interface ArbeidssokerperiodeRepository {
77
fun startPeriode(foedselsnummer: Foedselsnummer, fraDato: LocalDateTime)
88
fun avsluttPeriode(foedselsnummer: Foedselsnummer, tilDato: LocalDateTime)
9+
fun avsluttPeriode(id: Int, tilDato: LocalDateTime)
910
fun hentPerioder(foedselsnummer: Foedselsnummer): List<ArbeidssokerperiodeDto>
11+
fun hentPerioder(gjeldendeFoedselsnummer: Foedselsnummer, historiskeFoedselsnummer: List<Foedselsnummer>): List<ArbeidssokerperiodeDto>
1012
}
Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,55 @@
11
package no.nav.fo.veilarbregistrering.arbeidssoker
22

33
import no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.FormidlingsgruppeEndretEvent
4-
import no.nav.fo.veilarbregistrering.bruker.Foedselsnummer
4+
import no.nav.fo.veilarbregistrering.bruker.Bruker
55
import no.nav.fo.veilarbregistrering.bruker.Periode
6+
import no.nav.fo.veilarbregistrering.bruker.UserService
7+
import no.nav.fo.veilarbregistrering.log.logger
68
import java.time.LocalDateTime
79

8-
class ArbeidssokerperiodeService(val repository: ArbeidssokerperiodeRepository) {
10+
class ArbeidssokerperiodeService(
11+
private val repository: ArbeidssokerperiodeRepository,
12+
private val userService: UserService
13+
) {
914

10-
fun startPeriode(foedselsnummer: Foedselsnummer) {
11-
if (harAktivPeriode(foedselsnummer)) {
15+
fun startPeriode(bruker: Bruker) {
16+
if (harAktivPeriode(bruker)) {
1217
throw IllegalStateException("Bruker har allerede en aktiv periode")
1318
}
1419

15-
repository.startPeriode(foedselsnummer, LocalDateTime.now())
20+
repository.startPeriode(bruker.gjeldendeFoedselsnummer, LocalDateTime.now())
1621
}
1722

1823
fun behandleFormidlingsgruppeEvent(formidlingsgruppeEndretEvent: FormidlingsgruppeEndretEvent) {
1924
if (formidlingsgruppeEndretEvent.erArbeidssoker()) {
2025
return
2126
}
2227

23-
if (!harAktivPeriode(formidlingsgruppeEndretEvent.foedselsnummer)) {
24-
return
28+
val bruker = userService.finnBrukerGjennomPdlForSystemkontekst(formidlingsgruppeEndretEvent.foedselsnummer)
29+
val aktivPeriode = hentAktivPeriode(bruker) ?: return
30+
31+
if (aktivPeriode.foedselsnummer != bruker.gjeldendeFoedselsnummer) {
32+
// TODO skal vi i dette tilfellet oppdatere fødselsnummeret på perioden?
33+
logger.warn("Avslutter periode for person som har et annet gjeldende fødselsnummer enn den aktive perioden")
2534
}
2635

27-
repository.avsluttPeriode(foedselsnummer = formidlingsgruppeEndretEvent.foedselsnummer, LocalDateTime.now())
36+
repository.avsluttPeriode(id = aktivPeriode.id, LocalDateTime.now())
2837
}
2938

30-
fun hentPerioder(foedselsnummer: Foedselsnummer): List<Periode> {
31-
return repository.hentPerioder(foedselsnummer).map { Periode(it.fra.toLocalDate(), it.til?.toLocalDate()) }
39+
fun hentPerioder(bruker: Bruker): List<Periode> {
40+
return repository.hentPerioder(bruker.gjeldendeFoedselsnummer, bruker.historiskeFoedselsnummer)
41+
.map { Periode(it.fra.toLocalDate(), it.til?.toLocalDate()) }
3242
}
3343

34-
private fun harAktivPeriode(foedselsnummer: Foedselsnummer): Boolean {
35-
return harAktivPeriode(repository.hentPerioder(foedselsnummer))
44+
private fun harAktivPeriode(bruker: Bruker): Boolean {
45+
return hentAktivPeriode(bruker) != null
3646
}
3747

38-
private fun harAktivPeriode(perioder: List<ArbeidssokerperiodeDto>): Boolean {
39-
if (perioder.isEmpty()) {
40-
return false
41-
}
48+
private fun hentAktivPeriode(bruker: Bruker): ArbeidssokerperiodeDto? {
49+
val perioder = repository.hentPerioder(bruker.gjeldendeFoedselsnummer, bruker.historiskeFoedselsnummer)
50+
51+
if (perioder.isEmpty()) return null
4252

43-
return perioder.first().til == null
53+
return perioder.find { it.til == null }
4454
}
4555
}

src/main/kotlin/no/nav/fo/veilarbregistrering/arbeidssoker/formidlingsgruppe/FormidlingsgruppeMottakService.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe
22

3-
import no.nav.common.featuretoggle.UnleashClient
43
import no.nav.fo.veilarbregistrering.aktorIdCache.AktorIdCacheService
5-
import no.nav.fo.veilarbregistrering.arbeidssoker.ArbeidssokerperiodeService
64
import no.nav.fo.veilarbregistrering.arbeidssoker.Arbeidssoker
5+
import no.nav.fo.veilarbregistrering.arbeidssoker.ArbeidssokerperiodeService
76
import no.nav.fo.veilarbregistrering.arbeidssoker.perioder.ArbeidssokerperiodeAvsluttetProducer
87
import no.nav.fo.veilarbregistrering.arbeidssoker.perioder.PopulerArbeidssokerperioderService
98
import no.nav.fo.veilarbregistrering.bruker.Foedselsnummer
@@ -18,7 +17,6 @@ class FormidlingsgruppeMottakService(
1817
private val aktorIdCacheService: AktorIdCacheService,
1918
private val populerArbeidssokerperioderService: PopulerArbeidssokerperioderService,
2019
private val arbeidssokerperiodeAvsluttetProducer: ArbeidssokerperiodeAvsluttetProducer,
21-
private val unleashClient: UnleashClient,
2220
private val arbeidssokerperiodeService: ArbeidssokerperiodeService
2321
) {
2422

src/main/kotlin/no/nav/fo/veilarbregistrering/arbeidssoker/perioder/ArbeidssokerService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class ArbeidssokerService(
1111
) {
1212

1313
fun hentArbeidssokerperioder(bruker: Bruker, forespurtPeriode: Periode?): Arbeidssokerperioder {
14-
val lagredePerioder = arbeidssokerperiodeService.hentPerioder(bruker.gjeldendeFoedselsnummer)
14+
val lagredePerioder = arbeidssokerperiodeService.hentPerioder(bruker)
1515

1616
forespurtPeriode?.let {
1717
return Arbeidssokerperioder.of(lagredePerioder.filter { it.overlapperMed(forespurtPeriode) }.map { Arbeidssokerperiode(it) })

src/main/kotlin/no/nav/fo/veilarbregistrering/bruker/UserService.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class UserService(
3636
}
3737
fun finnBrukerGjennomPdl(fnr: Foedselsnummer): Bruker = map(pdlOppslagGateway.hentIdenter(fnr))
3838

39+
fun finnBrukerGjennomPdlForSystemkontekst(fnr: Foedselsnummer): Bruker = map(pdlOppslagGateway.hentIdenter(fnr, true))
40+
3941
fun hentBruker(aktorId: AktorId): Bruker = map(pdlOppslagGateway.hentIdenter(aktorId))
4042

4143
fun getEnhetIdFromUrlOrThrow(): String =

src/main/kotlin/no/nav/fo/veilarbregistrering/config/ServiceBeansConfig.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -329,15 +329,13 @@ class ServiceBeansConfig {
329329
aktorIdCacheService: AktorIdCacheService,
330330
populerArbeidssokerperioderService: PopulerArbeidssokerperioderService,
331331
arbeidssokerperiodeAvsluttetProducer: ArbeidssokerperiodeAvsluttetProducer,
332-
unleashClient: UnleashClient,
333332
arbeidssokerperiodeService: ArbeidssokerperiodeService
334333
): FormidlingsgruppeMottakService {
335334
return FormidlingsgruppeMottakService(
336335
formidlingsgruppeRepository,
337336
aktorIdCacheService,
338337
populerArbeidssokerperioderService,
339338
arbeidssokerperiodeAvsluttetProducer,
340-
unleashClient,
341339
arbeidssokerperiodeService
342340
)
343341
}
@@ -439,7 +437,10 @@ class ServiceBeansConfig {
439437
}
440438

441439
@Bean
442-
fun arbeidssokerperiodeService(arbeidssokerperiodeRepository: ArbeidssokerperiodeRepository): ArbeidssokerperiodeService {
443-
return ArbeidssokerperiodeService(arbeidssokerperiodeRepository)
440+
fun arbeidssokerperiodeService(
441+
arbeidssokerperiodeRepository: ArbeidssokerperiodeRepository,
442+
userService: UserService
443+
): ArbeidssokerperiodeService {
444+
return ArbeidssokerperiodeService(arbeidssokerperiodeRepository, userService)
444445
}
445446
}

src/main/kotlin/no/nav/fo/veilarbregistrering/db/arbeidssoker/ArbeidssokerperiodeRepositoryImpl.kt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,36 @@ class ArbeidssokerperiodeRepositoryImpl(private val db: NamedParameterJdbcTempla
3939
}
4040
}
4141

42+
override fun avsluttPeriode(id: Int, tilDato: LocalDateTime) {
43+
val params = mapOf(
44+
"id" to id,
45+
"tilOgMed" to tilDato
46+
)
47+
val sql = "UPDATE $ARBEIDSSOKERPERIODE_TABELL SET til_og_med = :tilOgMed WHERE id = :id"
48+
49+
try {
50+
db.update(sql, params)
51+
} catch (e: DataIntegrityViolationException) {
52+
throw DataIntegrityViolationException("Avslutning av arbeidssøkerperiode feilet", e)
53+
}
54+
}
55+
4256
override fun hentPerioder(foedselsnummer: Foedselsnummer): List<ArbeidssokerperiodeDto> {
4357
val params = mapOf("foedselsnummer" to foedselsnummer.foedselsnummer)
4458
val sql = "SELECT * FROM $ARBEIDSSOKERPERIODE_TABELL WHERE foedselsnummer = :foedselsnummer ORDER BY id DESC"
4559
return db.query(sql, params, arbeidssokerperiodeMapper)
4660
}
4761

62+
override fun hentPerioder(
63+
gjeldendeFoedselsnummer: Foedselsnummer,
64+
historiskeFoedselsnummer: List<Foedselsnummer>
65+
): List<ArbeidssokerperiodeDto> {
66+
val foedselsnummerList = historiskeFoedselsnummer + gjeldendeFoedselsnummer
67+
val params = mapOf("foedselsnummerList" to foedselsnummerList.map(Foedselsnummer::stringValue))
68+
val sql = "SELECT * FROM $ARBEIDSSOKERPERIODE_TABELL WHERE foedselsnummer IN (:foedselsnummerList)"
69+
return db.query(sql, params, arbeidssokerperiodeMapper)
70+
}
71+
4872
companion object {
4973
const val ARBEIDSSOKERPERIODE_TABELL = "arbeidssokerperiode"
5074
private val arbeidssokerperiodeMapper = RowMapper { rs, _ ->

src/main/kotlin/no/nav/fo/veilarbregistrering/registrering/ordinaer/BrukerRegistreringService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ open class BrukerRegistreringService(
150150
}
151151

152152
try {
153-
arbeidssokerperiodeService.startPeriode(bruker.gjeldendeFoedselsnummer)
153+
arbeidssokerperiodeService.startPeriode(bruker)
154154
} catch (e: RuntimeException) {
155155
LOG.error("Feil ved starting av ny arbeidssøkerperiode", e)
156156
}

src/main/kotlin/no/nav/fo/veilarbregistrering/registrering/reaktivering/ReaktiveringBrukerService.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import no.nav.fo.veilarbregistrering.oppfolging.OppfolgingGateway
1111
import no.nav.fo.veilarbregistrering.registrering.Tilstandsfeil
1212
import no.nav.fo.veilarbregistrering.registrering.bruker.BrukerTilstandService
1313
import no.nav.fo.veilarbregistrering.registrering.bruker.RegistreringType
14-
import no.nav.fo.veilarbregistrering.registrering.ordinaer.BrukerRegistreringService
1514
import org.springframework.transaction.annotation.Transactional
1615

1716
open class ReaktiveringBrukerService(
@@ -39,7 +38,7 @@ open class ReaktiveringBrukerService(
3938
oppfolgingGateway.reaktiverBruker(bruker.gjeldendeFoedselsnummer)
4039

4140
try {
42-
arbeidssokerperiodeService.startPeriode(bruker.gjeldendeFoedselsnummer)
41+
arbeidssokerperiodeService.startPeriode(bruker)
4342
} catch (e: RuntimeException) {
4443
LOG.error("Feil ved starting av ny arbeidssøkerperiode", e)
4544
}
Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package no.nav.fo.veilarbregistrering.arbeidssoker
22

3-
import io.mockk.every
4-
import io.mockk.mockk
5-
import io.mockk.verify
3+
import io.mockk.*
64
import no.nav.fo.veilarbregistrering.arbeidssoker.formidlingsgruppe.FormidlingsgruppeEndretEventTestdataBuilder.formidlingsgruppeEndret
5+
import no.nav.fo.veilarbregistrering.bruker.AktorId
6+
import no.nav.fo.veilarbregistrering.bruker.Bruker
77
import no.nav.fo.veilarbregistrering.bruker.Foedselsnummer
8+
import no.nav.fo.veilarbregistrering.bruker.UserService
89
import org.junit.jupiter.api.Assertions.assertThrows
910
import org.junit.jupiter.api.BeforeEach
1011
import org.junit.jupiter.api.Test
@@ -13,59 +14,66 @@ import java.time.LocalDateTime
1314
internal class ArbeidssokerperiodeServiceTest {
1415
private lateinit var repository: ArbeidssokerperiodeRepository
1516
private lateinit var service: ArbeidssokerperiodeService
17+
private lateinit var userService: UserService
1618

1719
@BeforeEach
1820
fun setUp () {
1921
repository = mockk()
20-
service = ArbeidssokerperiodeService(repository)
22+
userService = mockk()
23+
service = ArbeidssokerperiodeService(repository, userService)
2124
}
2225

2326
@Test
2427
fun `kaster exception hvis bruker har en aktiv periode`() {
2528
val fnr = Foedselsnummer("42")
26-
every { repository.hentPerioder(any()) } returns listOf(ArbeidssokerperiodeDto(1, fnr, LocalDateTime.now()))
29+
every { repository.hentPerioder(any(), any()) } returns listOf(ArbeidssokerperiodeDto(1, fnr, LocalDateTime.now()))
2730

2831
assertThrows(IllegalStateException::class.java) {
29-
service.startPeriode(fnr)
32+
service.startPeriode(Bruker(fnr, AktorId("1234"), emptyList()))
3033
}
3134
}
3235

3336
@Test
3437
fun `starter periode for bruker`() {
35-
val fnr = Foedselsnummer("42")
36-
every { repository.hentPerioder(any()) } returns emptyList()
37-
every { repository.startPeriode(any(), any()) } returns Unit
38+
val bruker = Bruker(Foedselsnummer("42"), AktorId("1234"), emptyList())
39+
every { repository.hentPerioder(any(), any()) } returns emptyList()
40+
every { repository.startPeriode(any(), any()) } just Runs
3841

39-
service.startPeriode(fnr)
42+
service.startPeriode(bruker)
4043

41-
verify(exactly = 1) { repository.startPeriode(foedselsnummer = fnr, any())}
44+
verify(exactly = 1) { repository.startPeriode(bruker.gjeldendeFoedselsnummer, any()) }
4245
}
4346

4447
@Test
4548
fun `gjør ingenting hvis ikke formidlingsgruppe er ISERV eller IARBS`() {
46-
every { repository.avsluttPeriode(any(), any()) } returns Unit
49+
every { repository.avsluttPeriode(any<Int>(), any()) } just Runs
4750
service.behandleFormidlingsgruppeEvent(formidlingsgruppeEndretEvent = formidlingsgruppeEndret(LocalDateTime.now(), formidlingsgruppe = "ARBS"))
48-
verify(exactly = 0) { repository.avsluttPeriode(any(), any()) }
51+
verify(exactly = 0) { repository.avsluttPeriode(any<Int>(), any()) }
4952
}
5053

5154
@Test
5255
fun `gjør ingenting hvis ikke bruker har en aktiv periode` () {
53-
every { repository.avsluttPeriode(any(), any()) } returns Unit
54-
every { repository.hentPerioder(any())} returns emptyList()
56+
every { userService.finnBrukerGjennomPdlForSystemkontekst(any()) } returns
57+
Bruker(Foedselsnummer("12345678910"), AktorId("1234"), emptyList())
58+
every { repository.avsluttPeriode(any<Int>(), any()) } just Runs
59+
every { repository.hentPerioder(any(), any()) } returns emptyList()
5560

5661
service.behandleFormidlingsgruppeEvent(formidlingsgruppeEndretEvent = formidlingsgruppeEndret(LocalDateTime.now(), formidlingsgruppe = "ISERV"))
5762

58-
verify(exactly = 0) { repository.avsluttPeriode(any(), any()) }
63+
verify(exactly = 0) { repository.avsluttPeriode(any<Int>(), any()) }
5964
}
6065

6166
@Test
6267
fun `avslutte periode for bruker`() {
63-
every { repository.avsluttPeriode(any(), any()) } returns Unit
64-
every { repository.hentPerioder(Foedselsnummer("12345678910"))} returns listOf(ArbeidssokerperiodeDto(1, Foedselsnummer("12345678910"), LocalDateTime.now()))
68+
every { userService.finnBrukerGjennomPdlForSystemkontekst(any()) } returns
69+
Bruker(Foedselsnummer("12345678910"), AktorId("1234"), emptyList())
70+
every { repository.avsluttPeriode(any<Int>(), any()) } just Runs
71+
every { repository.hentPerioder(Foedselsnummer("12345678910"), any()) } returns
72+
listOf(ArbeidssokerperiodeDto(1, Foedselsnummer("12345678910"), LocalDateTime.now()))
6573

6674
service.behandleFormidlingsgruppeEvent(formidlingsgruppeEndretEvent = formidlingsgruppeEndret(LocalDateTime.now(), formidlingsgruppe = "ISERV"))
6775

68-
verify(exactly = 1) { repository.avsluttPeriode(Foedselsnummer("12345678910"), any()) }
76+
verify(exactly = 1) { repository.avsluttPeriode(any<Int>(), any()) }
6977
}
7078

7179
}

0 commit comments

Comments
 (0)