Skip to content

Commit 41668a6

Browse files
Slår sammen aleneOmsorg fra Infotrygd, Rammemeldinger & K9 (navikt#61)
* Henter også alene-om fra Infotrygd * Lagt til gateway for å hente alene-omsorg fra rammemeldinger. * Tester sammenslåing av aleneOmsorg fra 3 kilder. * Legger til test på formatet i kontrakten. * Dependency updates * Integrasjon for å hente rammemeldinger & nais-config * Mock på rammemeldinger & outgoing i naiserator for rammemeldinger * Test på RammemeldingerGateway
1 parent 3d25b01 commit 41668a6

24 files changed

+473
-29
lines changed

app/build.gradle.kts

+7-7
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
22
import org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL
33

44
val junitJupiterVersion = "5.7.2"
5-
val k9rapidVersion = "1.f20388f"
6-
val dusseldorfVersion = "2.1.6.0-d31132e"
5+
val k9rapidVersion = "1.20210621113727-637d57e"
6+
val dusseldorfVersion = "2.1.6.0-ef0acb6"
77
val ktorVersion = "1.6.0"
88
val jsonassertVersion = "1.5.0"
99
val mockkVersion = "1.11.0"
10-
val assertjVersion = "3.19.0"
10+
val assertjVersion = "3.20.2"
1111

1212
// Database
13-
val flywayVersion = "7.9.1"
13+
val flywayVersion = "7.10.0"
1414
val hikariVersion = "4.0.3"
1515
val kotliqueryVersion = "1.3.1"
16-
val postgresVersion = "42.2.20"
17-
val embeddedPostgres = "1.2.10"
16+
val postgresVersion = "42.2.22"
17+
val embeddedPostgres = "1.3.0"
1818

1919
val mainClass = "no.nav.omsorgsdager.ApplicationKt"
2020

@@ -105,6 +105,6 @@ tasks {
105105
}
106106

107107
withType<Wrapper> {
108-
gradleVersion = "7.0.2"
108+
gradleVersion = "7.1"
109109
}
110110
}

app/src/main/kotlin/no/nav/omsorgsdager/ApplicationContext.kt

+14-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import no.nav.omsorgsdager.tilgangsstyring.TokenResolver
2121
import no.nav.omsorgsdager.vedtak.InnvilgedeVedtakService
2222
import no.nav.omsorgsdager.vedtak.infotrygd.InfotrygdInnvilgetVedtakService
2323
import no.nav.omsorgsdager.vedtak.infotrygd.OmsorgspengerInfotrygdRammevedtakGateway
24+
import no.nav.omsorgsdager.vedtak.rammemeldinger.RammemeldingerGateway
2425
import java.net.URI
2526
import javax.sql.DataSource
2627

@@ -40,6 +41,7 @@ internal class ApplicationContext(
4041
internal val omsorgspengerSaksnummerService: OmsorgspengerSaksnummerService,
4142
internal val innvilgedeVedtakService: InnvilgedeVedtakService,
4243
internal val personInfoGatway: PersonInfoGateway,
44+
internal val rammemeldingerGateway: RammemeldingerGateway,
4345
internal val configure: (application: Application) -> Unit,
4446
private val onStart: (applicationContext: ApplicationContext) -> Unit,
4547
private val onStop: (applicationContext: ApplicationContext) -> Unit) {
@@ -64,6 +66,7 @@ internal class ApplicationContext(
6466
var omsorgspengerSaksnummerService: OmsorgspengerSaksnummerService? = null,
6567
var innvilgedeVedtakService: InnvilgedeVedtakService? = null,
6668
var personInfoGatway: PersonInfoGateway? = null,
69+
var rammemeldingerGateway: RammemeldingerGateway? = null,
6770
var configure: (application: Application) -> Unit = {},
6871
var onStart: (applicationContext: ApplicationContext) -> Unit = {
6972
it.dataSource.migrate()
@@ -127,10 +130,17 @@ internal class ApplicationContext(
127130
omsorgspengerSakGateway = benyttetOmsorgspengerSakGateway,
128131
partRepository = benyttetPartRepository
129132
)
133+
val benyttetRammemeldingerGateway = rammemeldingerGateway ?: RammemeldingerGateway(
134+
accessTokenClient = benyttetAccessTokenClient,
135+
scopes = benyttetEnv.hentRequiredEnv("OMSORGSPENGER_RAMMEMELDINGER_SCOPES").csvTilSet(),
136+
baseUrl = URI(benyttetEnv.hentRequiredEnv("OMSORGSPENGER_RAMMEMELDINGER_BASE_URL"))
137+
)
138+
130139
val benyttetInnvilgedeVedtakService = innvilgedeVedtakService ?: InnvilgedeVedtakService(
131140
behandlingService = benyttetBehandlingService,
132141
omsorgspengerSaksnummerService = benyttetOmsorgspengerSaksnummerService,
133-
infotrygdInnvilgetVedtakService = benyttetInfotrygdInnvilgetVedtakService
142+
infotrygdInnvilgetVedtakService = benyttetInfotrygdInnvilgetVedtakService,
143+
rammemeldingerGateway = benyttetRammemeldingerGateway
134144
)
135145

136146
val benyttetPersonInfoGateway = personInfoGatway ?: PdlPersonInfoGateway(
@@ -146,7 +156,8 @@ internal class ApplicationContext(
146156
benyttetOmsorgspengerTilgangsstyringGateway,
147157
benyttetOmsorgspengerInfotrygdRammevedtakGateway,
148158
benyttetOmsorgspengerSakGateway,
149-
benyttetPersonInfoGateway
159+
benyttetPersonInfoGateway,
160+
benyttetRammemeldingerGateway
150161
),
151162
omsorgspengerTilgangsstyringGateway = benyttetOmsorgspengerTilgangsstyringGateway,
152163
tokenResolver = benyttetTokenResolver,
@@ -161,6 +172,7 @@ internal class ApplicationContext(
161172
omsorgspengerInfotrygdRammevedtakGateway = benyttetOmsorgspengerInfotrygdRammevedtakGateway,
162173
partRepository = benyttetPartRepository,
163174
personInfoGatway = benyttetPersonInfoGateway,
175+
rammemeldingerGateway = benyttetRammemeldingerGateway,
164176
onStart = onStart,
165177
onStop = onStop
166178
)

app/src/main/kotlin/no/nav/omsorgsdager/tid/Periode.kt

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ internal data class Periode(
2828
internal companion object {
2929
internal fun utcNå() = ZonedDateTime.now(ZoneOffset.UTC)
3030
internal fun String.dato() = LocalDate.parse(this)
31+
internal fun String.tidspunkt() = ZonedDateTime.parse(this)
3132
internal fun String.periode() = Periode(this)
3233
private val Oslo = ZoneId.of("Europe/Oslo")
3334
internal fun ZonedDateTime.toLocalDateOslo() = withZoneSameInstant(Oslo).toLocalDate()

app/src/main/kotlin/no/nav/omsorgsdager/vedtak/InnvilgedeVedtakService.kt

+18-6
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ import no.nav.omsorgsdager.tid.Gjeldende.flatten
1717
import no.nav.omsorgsdager.tid.Gjeldende.gjeldende
1818
import no.nav.omsorgsdager.tid.Gjeldende.gjeldendePer
1919
import no.nav.omsorgsdager.tid.Periode
20-
import no.nav.omsorgsdager.vedtak.InnvilgedeVedtakService.Companion.medMestInfo
21-
import no.nav.omsorgsdager.vedtak.InnvilgedeVedtakService.Companion.somBarn
2220
import no.nav.omsorgsdager.vedtak.dto.*
2321
import no.nav.omsorgsdager.vedtak.dto.AleneOmsorgInnvilgetVedtak
2422
import no.nav.omsorgsdager.vedtak.dto.Barn.Companion.sammenlignPå
@@ -27,13 +25,15 @@ import no.nav.omsorgsdager.vedtak.dto.Kilde.Companion.somKilde
2725
import no.nav.omsorgsdager.vedtak.dto.Kilde.Companion.somKilder
2826
import no.nav.omsorgsdager.vedtak.dto.KroniskSyktBarnInnvilgetVedtak
2927
import no.nav.omsorgsdager.vedtak.dto.MidlertidigAleneInnvilgetVedtak
28+
import no.nav.omsorgsdager.vedtak.rammemeldinger.RammemeldingerGateway
3029
import org.slf4j.LoggerFactory
3130
import java.time.Duration
3231

3332
internal class InnvilgedeVedtakService(
3433
private val behandlingService: BehandlingService,
3534
private val omsorgspengerSaksnummerService: OmsorgspengerSaksnummerService,
36-
private val infotrygdInnvilgetVedtakService: InfotrygdInnvilgetVedtakService) {
35+
private val infotrygdInnvilgetVedtakService: InfotrygdInnvilgetVedtakService,
36+
private val rammemeldingerGateway: RammemeldingerGateway) {
3737

3838
private val cache: Cache<Pair<Identitetsnummer, Periode>, InnvilgedeVedtak> =
3939
Caffeine.newBuilder()
@@ -62,17 +62,29 @@ internal class InnvilgedeVedtakService(
6262
correlationId = correlationId
6363
)
6464

65+
val fraRammemeldinger = when (omsorgspengerSaksnummer) {
66+
null -> emptyList()
67+
else -> rammemeldingerGateway.hentAleneOmsorg(
68+
saksnummer = omsorgspengerSaksnummer,
69+
correlationId = correlationId
70+
)
71+
}
72+
val fraAndreKilder = fraInfotrygd.copy(
73+
aleneOmsorg = fraInfotrygd.aleneOmsorg.plus(fraRammemeldinger)
74+
)
75+
76+
6577
return when (omsorgspengerSaksnummer) {
66-
null -> fraInfotrygd.slåSammenMed(GjeldendeBehandlinger()).also { logger.info("Ingen behandlinger i K9-Sak") }
67-
else -> fraInfotrygd.slåSammenMed(
78+
null -> fraAndreKilder.slåSammenMed(GjeldendeBehandlinger()).also { logger.info("Ingen behandlinger i K9-Sak") }
79+
else -> fraAndreKilder.slåSammenMed(
6880
gjeldendeBehandlinger = behandlingService.hentAlleGjeldende(
6981
saksnummer = omsorgspengerSaksnummer,
7082
periode = periode
7183
)[Involvering.SØKER]?: GjeldendeBehandlinger()
7284
)
7385
}.also {
7486
logger.info(
75-
"FraInfotrygd[KroniskSyktBarn=${fraInfotrygd.kroniskSyktBarn.size}, MidlertidigAlene=${fraInfotrygd.midlertidigAlene.size}] " +
87+
"FraAndreKilder[KroniskSyktBarn=${fraAndreKilder.kroniskSyktBarn.size}, MidlertidigAlene=${fraAndreKilder.midlertidigAlene.size}] " +
7688
"SlåttSammen[KroniskSyktBarn=${it.kroniskSyktBarn.size}, MidlertidigAlene=${it.midlertidigAlene.size}]"
7789
)
7890
cache.put(identitetsnummer to periode, it)

app/src/main/kotlin/no/nav/omsorgsdager/vedtak/dto/InnvilgedeVedtak.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,6 @@ internal data class AleneOmsorgInnvilgetVedtak(
111111
@get:JsonIgnore override val periode: Periode,
112112
@get:JsonIgnore override val enPer: Any = barn) : InnvilgetVedtak {
113113
override fun kopiMedNyPeriode(nyPeriode: Periode) = copy(
114-
periode = nyPeriode
114+
periode = nyPeriode
115115
)
116116
}

app/src/main/kotlin/no/nav/omsorgsdager/vedtak/infotrygd/InfotrygdInnvilgetVedtak.kt

+8
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,11 @@ internal data class MidlertidigAleneInfotrygdInnvilgetVedtak(
2424
override val gyldigFraOgMed: LocalDate,
2525
override val gyldigTilOgMed: LocalDate,
2626
override val kilder: Set<Kilde>) : InfotrygdInnvilgetVedtak
27+
28+
internal data class AleneOmsorgInfotrygdInnvilgetVedtak(
29+
override val vedtatt: LocalDate,
30+
override val gyldigFraOgMed: LocalDate,
31+
override val gyldigTilOgMed: LocalDate,
32+
override val kilder: Set<Kilde>,
33+
internal val barnetsFødselsdato: LocalDate,
34+
internal val barnetsIdentitetsnummer: Identitetsnummer?) : InfotrygdInnvilgetVedtak

app/src/main/kotlin/no/nav/omsorgsdager/vedtak/infotrygd/InfotrygdInnvilgetVedtakService.kt

+9-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,15 @@ internal class InfotrygdInnvilgetVedtakService(
4040
)
4141
)}
4242

43-
// TODO: har vi noe fra infotrygd å slå sammen?
44-
val aleneOmsorg = emptyList<AleneOmsorgInnvilgetVedtak>()
43+
val aleneOmsorg = fraInfotrygd.filterIsInstance<AleneOmsorgInfotrygdInnvilgetVedtak>().map { AleneOmsorgInnvilgetVedtak(
44+
barn = Barn(identitetsnummer = it.barnetsIdentitetsnummer, fødselsdato = it.barnetsFødselsdato),
45+
kilder = it.kilder,
46+
tidspunkt = it.vedtatt.startenAvDagenOslo(),
47+
periode = Periode(
48+
fom = it.gyldigFraOgMed,
49+
tom = it.gyldigTilOgMed
50+
)
51+
)}
4552

4653
return InnvilgedeVedtak(
4754
kroniskSyktBarn = kroniskSyktBarn,

app/src/main/kotlin/no/nav/omsorgsdager/vedtak/infotrygd/OmsorgspengerInfotrygdRammevedtakGateway.kt

+13-1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ internal class OmsorgspengerInfotrygdRammevedtakGateway(
4646
return when (httpStatusCode) {
4747
HttpStatusCode.OK -> {
4848
val rammevedtak = JSONObject(responseBody).getJSONObject("rammevedtak")
49+
4950
val utvidetRett = rammevedtak.getArray("UtvidetRett").mapJSONObject().map {
5051
KroniskSyktBarnInfotrygdInnvilgetVedtak(
5152
kilder = it.kilder(),
@@ -64,9 +65,20 @@ internal class OmsorgspengerInfotrygdRammevedtakGateway(
6465
gyldigFraOgMed = it.periode().fom,
6566
gyldigTilOgMed = it.periode().tom
6667
)
68+
}
6769

70+
val aleneOmsorg = rammevedtak.getArray("AleneOmOmsorgen").mapJSONObject().map {
71+
AleneOmsorgInfotrygdInnvilgetVedtak(
72+
kilder = it.kilder(),
73+
vedtatt = it.vedtatt(),
74+
gyldigFraOgMed = it.periode().fom,
75+
gyldigTilOgMed = it.periode().tom,
76+
barnetsIdentitetsnummer = it.barn().identitetsnummer(),
77+
barnetsFødselsdato = it.barn().fødselsdato()
78+
)
6879
}
69-
utvidetRett.plus(midlertidigAlene)
80+
81+
utvidetRett.plus(midlertidigAlene).plus(aleneOmsorg)
7082

7183
}
7284
else -> throw IllegalStateException("HttpStatusCode=[${httpStatusCode.value}], Response=[${responseBody}] fra omsorgspenger-infotrygd-rammevedtak.")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package no.nav.omsorgsdager.vedtak.rammemeldinger
2+
3+
import io.ktor.client.request.*
4+
import io.ktor.http.*
5+
import no.nav.helse.dusseldorf.ktor.client.SimpleHttpClient.httpGet
6+
import no.nav.helse.dusseldorf.ktor.client.SimpleHttpClient.readTextOrThrow
7+
import no.nav.helse.dusseldorf.oauth2.client.AccessTokenClient
8+
import no.nav.omsorgsdager.AzureAwareGateway
9+
import no.nav.omsorgsdager.CorrelationId
10+
import no.nav.omsorgsdager.Identitetsnummer.Companion.somIdentitetsnummer
11+
import no.nav.omsorgsdager.OmsorgspengerSaksnummer
12+
import no.nav.omsorgsdager.tid.Periode
13+
import no.nav.omsorgsdager.tid.Periode.Companion.dato
14+
import no.nav.omsorgsdager.tid.Periode.Companion.tidspunkt
15+
import no.nav.omsorgsdager.vedtak.dto.AleneOmsorgInnvilgetVedtak
16+
import no.nav.omsorgsdager.vedtak.dto.Barn
17+
import no.nav.omsorgsdager.vedtak.dto.Kilde
18+
import org.json.JSONObject
19+
import java.net.URI
20+
21+
internal class RammemeldingerGateway(
22+
accessTokenClient: AccessTokenClient,
23+
scopes: Set<String>,
24+
baseUrl: URI
25+
) : AzureAwareGateway(
26+
navn = "RammemeldingerGateway",
27+
accessTokenClient = accessTokenClient,
28+
scopes = scopes,
29+
pingUri = URI("$baseUrl/isready")) {
30+
31+
private val hentAleneOmsorgUrl = "$baseUrl/alene-om-omsorgen?saksnummer="
32+
33+
internal suspend fun hentAleneOmsorg(
34+
saksnummer: OmsorgspengerSaksnummer,
35+
correlationId: CorrelationId) : List<AleneOmsorgInnvilgetVedtak> {
36+
37+
val urlMedSaksnummer = "${hentAleneOmsorgUrl}${saksnummer}"
38+
39+
val (httpStatusCode, response) = urlMedSaksnummer.httpGet { builder ->
40+
builder.header(HttpHeaders.Authorization, authorizationHeader())
41+
builder.header(HttpHeaders.XCorrelationId, "$correlationId")
42+
builder.accept(ContentType.Application.Json)
43+
}.readTextOrThrow()
44+
45+
require(httpStatusCode == HttpStatusCode.OK) {
46+
"HTTP ${httpStatusCode.value} fra $urlMedSaksnummer. Response=$response"
47+
}
48+
49+
return JSONObject(response).getJSONArray("aleneOmOmsorgen").map { it as JSONObject }.map { aleneOm -> AleneOmsorgInnvilgetVedtak(
50+
tidspunkt = aleneOm.getString("registrert").tidspunkt(),
51+
periode = Periode(
52+
fom = aleneOm.getString("gjelderFraOgMed").dato(),
53+
tom = aleneOm.getString("gjelderTilOgMed").dato()
54+
),
55+
barn = aleneOm.getJSONObject("barn").let { barn -> Barn(
56+
identitetsnummer = barn.getString("identitetsnummer").somIdentitetsnummer(),
57+
fødselsdato = barn.getString("fødselsdato").dato()
58+
)},
59+
kilder = aleneOm.getJSONObject("kilde").let { kilde -> setOf(Kilde(
60+
id = kilde.getString("id"),
61+
type = kilde.getString("type")
62+
))}
63+
)}
64+
}
65+
}

app/src/test/kotlin/no/nav/omsorgsdager/aleneomsorg/AleneOmsorgMeldinger.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package no.nav.omsorgsdager.AleneOmsorg
1+
package no.nav.omsorgsdager.aleneomsorg
22

33
import no.nav.k9.rapid.behov.Behov
44
import no.nav.k9.rapid.behov.Behovssekvens

app/src/test/kotlin/no/nav/omsorgsdager/aleneomsorg/AleneOmsorgRiverTest.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
package no.nav.omsorgsdager.AleneOmsorg
1+
package no.nav.omsorgsdager.aleneomsorg
22

33
import no.nav.helse.rapids_rivers.testsupport.TestRapid
44
import no.nav.omsorgsdager.ApplicationContext
55
import no.nav.omsorgsdager.K9BehandlingId
66
import no.nav.omsorgsdager.K9BehandlingId.Companion.somK9BehandlingId
7-
import no.nav.omsorgsdager.aleneomsorg.AleneOmsorgBehandling
87
import no.nav.omsorgsdager.behandling.BehandlingStatus
98
import no.nav.omsorgsdager.person.AktørId.Companion.somAktørId
109
import no.nav.omsorgsdager.person.MockedPersonInfoGateway

app/src/test/kotlin/no/nav/omsorgsdager/testutils/ApplicationContextExtension.kt

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import no.nav.helse.dusseldorf.testsupport.wiremock.getAzureV2JwksUrl
1010
import no.nav.helse.dusseldorf.testsupport.wiremock.getAzureV2TokenUrl
1111
import no.nav.helse.dusseldorf.testsupport.wiremock.getNaisStsJwksUrl
1212
import no.nav.omsorgsdager.ApplicationContext
13+
import no.nav.omsorgsdager.testutils.wiremock.*
1314
import no.nav.omsorgsdager.testutils.wiremock.infotrygdRammevedtakBaseUrl
1415
import no.nav.omsorgsdager.testutils.wiremock.omsorgspengerSakBaseUrl
1516
import no.nav.omsorgsdager.testutils.wiremock.pdlBaseUrl
@@ -45,6 +46,8 @@ internal class ApplicationContextExtension : ParameterResolver {
4546
"OPEN_AM_AUTHORIZED_CLIENTS" to "k9-sak",
4647
"OMSORGSPENGER_INFOTRYGD_RAMMEVEDTAK_BASE_URL" to mockedEnvironment.wireMockServer.infotrygdRammevedtakBaseUrl(),
4748
"OMSORGSPENGER_INFOTRYGD_RAMMEVEDTAK_SCOPES" to "omsorgspenger-infotrygd-rammevedtak/.default",
49+
"OMSORGSPENGER_RAMMEMELDINGER_BASE_URL" to mockedEnvironment.wireMockServer.omsorgspengerRammemeldingerBaseUrl(),
50+
"OMSORGSPENGER_RAMMEMELDINGER_SCOPES" to "omsorgspenger-rammemeldinger/.default",
4851
"OMSORGSPENGER_SAK_BASE_URL" to mockedEnvironment.wireMockServer.omsorgspengerSakBaseUrl(),
4952
"OMSORGSPENGER_SAK_SCOPES" to "omsorgspenger-sak/.default",
5053
"PDL_BASE_URL" to mockedEnvironment.wireMockServer.pdlBaseUrl(),

app/src/test/kotlin/no/nav/omsorgsdager/testutils/MockedEnvironment.kt

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ internal class MockedEnvironment {
2121
.stubTilgangApi()
2222
.stubOmsorgspengerInfotrygdRammevedtak()
2323
.stubOmsorgspengerSakApi()
24+
.stubOmsorgspengerRammemeldinger()
2425
.stubPdl()
2526

2627
internal fun start() = this

app/src/test/kotlin/no/nav/omsorgsdager/testutils/wiremock/OmsorgspengerInfotrygdRammevedtakMock.kt

+15
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,21 @@ private fun WireMockServer.stubUtvidetOchMidlAlene(): WireMockServer {
8080
"gyldigFraOgMed": "1998-06-25",
8181
"gyldigTilOgMed": "2001-06-25",
8282
"lengde": "PT408H"
83+
}],
84+
"AleneOmOmsorgen": [{
85+
"vedtatt": "1998-06-21",
86+
"kilder": [{
87+
"id": "alene.om*9d*29099011111",
88+
"type": "Personkort"
89+
}],
90+
"barn": {
91+
"id": "29099011111",
92+
"type": "PersonIdent",
93+
"fødselsdato": "1990-09-29"
94+
},
95+
"gyldigFraOgMed": "1998-06-25",
96+
"gyldigTilOgMed": "2001-06-25",
97+
"lengde": "PT216H"
8398
}]
8499
}
85100
}

0 commit comments

Comments
 (0)