Skip to content

Commit

Permalink
Merge branch 'main' into dev/paaminnelser
Browse files Browse the repository at this point in the history
  • Loading branch information
magnusae committed Oct 29, 2024
2 parents 2591f6f + 77c4280 commit 1b1f29d
Show file tree
Hide file tree
Showing 22 changed files with 76 additions and 280 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,7 @@ import io.ktor.server.routing.Route
import io.ktor.server.routing.get
import io.ktor.util.pipeline.PipelineContext
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonObject
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Ferie
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntekt
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.InntektEndringAarsak
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Permisjon
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Permittering
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykefravaer
import no.nav.helsearbeidsgiver.felles.domene.ResultJson
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisConnection
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisPrefix
Expand All @@ -33,7 +24,6 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.sikkerLogger
import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondBadRequest
import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondInternalServerError
import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.respondOk
import no.nav.helsearbeidsgiver.utils.collection.mapValuesNotNull
import no.nav.helsearbeidsgiver.utils.json.fromJson
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.log.MdcUtils
Expand Down Expand Up @@ -103,10 +93,7 @@ private suspend fun PipelineContext<Unit, ApplicationCall>.sendOkResponse(inntek
}
val response =
ResultJson(
// Midlertidig, for å håndtere ulikt format på frontend og backend
success =
tilResponseMedEkstraFelt(inntektsmelding)
?: HentSelvbestemtImResponseSuccess(inntektsmelding).toJson(HentSelvbestemtImResponseSuccess.serializer()),
success = HentSelvbestemtImResponseSuccess(inntektsmelding).toJson(HentSelvbestemtImResponseSuccess.serializer()),
)
respondOk(response, ResultJson.serializer())
}
Expand Down Expand Up @@ -149,49 +136,3 @@ private suspend fun PipelineContext<Unit, ApplicationCall>.sendRedisErrorRespons
}
}
}

private fun tilResponseMedEkstraFelt(inntektsmelding: Inntektsmelding): JsonElement? {
val inntekt = inntektsmelding.inntekt
val endringAarsak = inntekt?.endringAarsak
val backendFelt =
when (endringAarsak) {
is Ferie -> Ferie::ferier.name
is Permisjon -> Permisjon::permisjoner.name
is Permittering -> Permittering::permitteringer.name
is Sykefravaer -> Sykefravaer::sykefravaer.name
else -> null
}

return if (inntekt != null && endringAarsak != null && backendFelt != null) {
val nyEndringAarsak =
endringAarsak
.toJson(InntektEndringAarsak.serializer())
.jsonObject
.let {
it.plus("perioder" to it[backendFelt])
}.mapValuesNotNull { it }
.let(::JsonObject)

val nyInntektJson =
inntekt
.toJson(Inntekt.serializer())
.jsonObject
.plus(Inntekt::endringAarsak.name to nyEndringAarsak)
.let(::JsonObject)

val nyInntektsmeldingJson =
inntektsmelding
.toJson(Inntektsmelding.serializer())
.jsonObject
.plus(Inntektsmelding::inntekt.name to nyInntektJson)
.let(::JsonObject)

HentSelvbestemtImResponseSuccess(inntektsmelding)
.toJson(HentSelvbestemtImResponseSuccess.serializer())
.jsonObject
.plus(HentSelvbestemtImResponseSuccess::selvbestemtInntektsmelding.name to nyInntektsmeldingJson)
.let(::JsonObject)
} else {
null
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,8 @@ import io.ktor.server.request.receiveText
import io.ktor.server.routing.Route
import io.ktor.server.routing.post
import io.ktor.util.pipeline.PipelineContext
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.MissingFieldException
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonObject
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Ferie
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Inntekt
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Permisjon
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Permittering
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykefravaer
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmeldingSelvbestemt
import no.nav.helsearbeidsgiver.felles.domene.ResultJson
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisConnection
Expand Down Expand Up @@ -101,7 +92,6 @@ fun Route.lagreSelvbestemtImRoute(
}
}

@OptIn(ExperimentalSerializationApi::class)
private suspend fun PipelineContext<Unit, ApplicationCall>.lesRequestOrNull(): SkjemaInntektsmeldingSelvbestemt? =
call
.receiveText()
Expand All @@ -112,12 +102,7 @@ private suspend fun PipelineContext<Unit, ApplicationCall>.lesRequestOrNull(): S
sikkerLogger.info("$it:\n${json.toPretty()}")
}
}.runCatching {
try {
fromJson(SkjemaInntektsmeldingSelvbestemt.serializer())
} catch (e: MissingFieldException) {
// Midlertidig, for å håndtere ulikt format på frontend og backend
fromJsonBackup(e)
}
fromJson(SkjemaInntektsmeldingSelvbestemt.serializer())
}.onFailure { e ->
"Kunne ikke parse json.".let {
logger.error(it)
Expand Down Expand Up @@ -169,29 +154,3 @@ private suspend fun PipelineContext<Unit, ApplicationCall>.sendResponse(resultat
}
}
}

// TODO slett når frontend bruker korrekte navn
private fun JsonElement.fromJsonBackup(error: Throwable): SkjemaInntektsmeldingSelvbestemt {
val skjemaJson = jsonObject
val inntektJson = skjemaJson[SkjemaInntektsmeldingSelvbestemt::inntekt.name]!!.jsonObject
val endringAarsakJson = inntektJson[Inntekt::endringAarsak.name]!!.jsonObject
val aarsak = endringAarsakJson["aarsak"]!!.fromJson(String.serializer())

val nyttFelt =
when (aarsak) {
"Ferie" -> Ferie::ferier.name
"Permisjon" -> Permisjon::permisjoner.name
"Permittering" -> Permittering::permitteringer.name
"Sykefravaer" -> Sykefravaer::sykefravaer.name
else -> throw error
}

val nyEndringAarsakJson = endringAarsakJson.plus(nyttFelt to endringAarsakJson["perioder"]!!).let(::JsonObject)

val nyInntektJson = inntektJson.plus(Inntekt::endringAarsak.name to nyEndringAarsakJson).let(::JsonObject)

return skjemaJson
.plus(SkjemaInntektsmeldingSelvbestemt::inntekt.name to nyInntektJson)
.let(::JsonObject)
.fromJson(SkjemaInntektsmeldingSelvbestemt.serializer())
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ class RedisPollerTest :
val expectedJson =
"""
{
"type": "${expected.type}",
"orgnr": "${expected.orgnr}",
"fnr": "${expected.fnr}",
"vedtaksperiodeId": ${expected.vedtaksperiodeId.toJson()},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import kotlinx.serialization.json.JsonObject
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Periode
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.til
import no.nav.helsearbeidsgiver.felles.domene.Forespoersel
import no.nav.helsearbeidsgiver.felles.domene.ForespoerselType
import no.nav.helsearbeidsgiver.felles.domene.ForespurtData
import no.nav.helsearbeidsgiver.felles.domene.ForrigeInntekt
import no.nav.helsearbeidsgiver.felles.domene.ForslagInntekt
Expand Down Expand Up @@ -153,7 +152,6 @@ private object Mock {

private val forespoersel =
Forespoersel(
type = ForespoerselType.KOMPLETT,
orgnr = "123",
fnr = "abc",
sykmeldingsperioder =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykefravaer
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykmeldt
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Tariffendring
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.VarigLoennsendring
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.til
import no.nav.helsearbeidsgiver.felles.domene.ResultJson
import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingV1
import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPollerTimeoutException
Expand All @@ -43,7 +42,6 @@ import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.hardcodedJson
import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ikkeTilgangResultat
import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.jsonStrOrNull
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.test.date.februar
import no.nav.helsearbeidsgiver.utils.test.json.removeJsonWhitespace
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
Expand Down Expand Up @@ -82,40 +80,6 @@ class HentSelvbestemtImRouteKtTest : ApiTest() {
actualJson shouldBe Mock.successResponseJson(expectedInntektsmelding)
}

@Test
fun `gir OK med inntektsmelding med ekstra 'perioder'-felt i inntektsendringsårsak`() =
testApi {
val expectedInntektsmelding =
mockInntektsmeldingV1().let {
it.copy(
inntekt =
it.inntekt?.copy(
endringAarsak =
Ferie(
ferier =
listOf(
15.februar(2024) til 16.februar(2024),
22.februar(2024) til 23.februar(2024),
),
),
),
)
}

coEvery { mockRedisConnection.get(any()) } returnsMany
listOf(
Mock.successResult(expectedInntektsmelding),
harTilgangResultat,
)

val response = get(pathMedId)

val actualJson = response.bodyAsText()

response.status shouldBe HttpStatusCode.OK
actualJson shouldBe Mock.successResponseJson(expectedInntektsmelding)
}

@Test
fun `manglende tilgang gir 500-feil`() =
testApi {
Expand Down Expand Up @@ -387,37 +351,14 @@ private fun InntektEndringAarsak.hardcodedJson(): String =
when (this) {
Bonus -> """{ "aarsak": "Bonus" }"""
Feilregistrert -> """{ "aarsak": "Feilregistrert" }"""
// is Ferie -> """{ "aarsak": "Ferie", "ferier": [${ferier.joinToString(transform = Periode::hardcodedJson)}] }"""
is Ferie -> """{ "aarsak": "Ferie", "ferier": [${ferier.joinToString(transform = Periode::hardcodedJson)}], "perioder": [${
ferier.joinToString(
transform = Periode::hardcodedJson,
)
}] }"""
is Ferie -> """{ "aarsak": "Ferie", "ferier": [${ferier.joinToString(transform = Periode::hardcodedJson)}] }"""
Ferietrekk -> """{ "aarsak": "Ferietrekk"}"""
is NyStilling -> """{ "aarsak": "NyStilling", "gjelderFra": "$gjelderFra" }"""
is NyStillingsprosent -> """{ "aarsak": "NyStillingsprosent", "gjelderFra": "$gjelderFra" }"""
Nyansatt -> """{ "aarsak": "Nyansatt" }"""
// is Permisjon -> """{ "aarsak": "Permisjon", "permisjoner": [${permisjoner.joinToString(transform = Periode::hardcodedJson)}] }"""
is Permisjon -> """{ "aarsak": "Permisjon", "permisjoner": [${permisjoner.joinToString(transform = Periode::hardcodedJson)}], "perioder": [${
permisjoner.joinToString(
transform = Periode::hardcodedJson,
)
}] }"""
// is Permittering -> """{ "aarsak": "Permittering", "permitteringer": [${permitteringer.joinToString(transform = Periode::hardcodedJson)}] }"""
is Permittering -> """{ "aarsak": "Permittering", "permitteringer": [${permitteringer.joinToString(
transform = Periode::hardcodedJson,
)}], "perioder": [${
permitteringer.joinToString(
transform = Periode::hardcodedJson,
)
}] }"""
// is Sykefravaer -> """{ "aarsak": "Sykefravaer", "sykefravaer": [${sykefravaer.joinToString(transform = Periode::hardcodedJson)}] }"""
is Sykefravaer -> """{ "aarsak": "Sykefravaer", "sykefravaer": [${sykefravaer.joinToString(transform = Periode::hardcodedJson)}], "perioder": [${
sykefravaer.joinToString(
transform = Periode::hardcodedJson,
)
}] }"""

is Permisjon -> """{ "aarsak": "Permisjon", "permisjoner": [${permisjoner.joinToString(transform = Periode::hardcodedJson)}] }"""
is Permittering -> """{ "aarsak": "Permittering", "permitteringer": [${permitteringer.joinToString(transform = Periode::hardcodedJson)}] }"""
is Sykefravaer -> """{ "aarsak": "Sykefravaer", "sykefravaer": [${sykefravaer.joinToString(transform = Periode::hardcodedJson)}] }"""
is Tariffendring -> """{ "aarsak": "Tariffendring", "gjelderFra": "$gjelderFra", "bleKjent": "$bleKjent" }"""
is VarigLoennsendring -> """{ "aarsak": "VarigLoennsendring", "gjelderFra": "$gjelderFra" }"""
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,55 +53,6 @@ class LagreSelvbestemtImRouteKtTest : ApiTest() {
actualJson shouldBe Mock.successResponseJson(selvbestemtId)
}

@Test
fun `skal godta og returnere id ved innsending som bruker 'perioder'-felt i inntektsendringsårsak`() =
testApi {
val selvbestemtId = UUID.randomUUID()

coEvery { mockRedisConnection.get(any()) } returnsMany
listOf(
harTilgangResultat,
Mock.successResult(selvbestemtId),
)

val skjemaJson =
"""
{
"selvbestemtId": "$selvbestemtId",
"type": {
"type": "Selvbestemt",
"id": "${UUID.randomUUID()}"
},
"sykmeldtFnr": "${Fnr.genererGyldig()}",
"avsender": {
"orgnr": "${Orgnr.genererGyldig()}",
"tlf": "${randomDigitString(8)}"
},
"sykmeldingsperioder": [{"fom": "2024-02-12", "tom": "2024-02-28"}],
"agp": null,
"inntekt": {
"beloep": 1000.10,
"inntektsdato": "2024-02-12",
"naturalytelser": [],
"endringAarsak": {
"aarsak": "Ferie",
"perioder": [{"fom": "2024-02-14", "tom": "2024-02-15"}, {"fom": "2024-02-21", "tom": "2024-02-21"}]
}
},
"refusjon": null,
"vedtaksperiodeId": null
}
""".removeJsonWhitespace()
.parseJson()

val response = post(path, skjemaJson, JsonElement.serializer())

val actualJson = response.bodyAsText()

response.status shouldBe HttpStatusCode.OK
actualJson shouldBe Mock.successResponseJson(selvbestemtId)
}

@Test
fun `skal godta og returnere id ved innsending som mangler vedtaksperiodeId`() =
testApi {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import java.util.UUID

@Serializable
data class Forespoersel(
val type: ForespoerselType,
val orgnr: String,
val fnr: String,
val vedtaksperiodeId: UUID,
Expand Down Expand Up @@ -57,8 +56,3 @@ data class Forespoersel(
}
}
}

enum class ForespoerselType {
KOMPLETT,
BEGRENSET,
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package no.nav.helsearbeidsgiver.felles.test.mock

import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.til
import no.nav.helsearbeidsgiver.felles.domene.Forespoersel
import no.nav.helsearbeidsgiver.felles.domene.ForespoerselType
import no.nav.helsearbeidsgiver.felles.domene.ForespurtData
import no.nav.helsearbeidsgiver.felles.domene.ForrigeInntekt
import no.nav.helsearbeidsgiver.felles.domene.ForslagInntekt
Expand All @@ -17,7 +16,6 @@ import java.util.UUID
fun mockForespoersel(): Forespoersel {
val orgnr = Orgnr.genererGyldig()
return Forespoersel(
type = ForespoerselType.KOMPLETT,
orgnr = orgnr.verdi,
fnr = Fnr.genererGyldig().verdi,
vedtaksperiodeId = UUID.randomUUID(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.UseSerializers
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Periode
import no.nav.helsearbeidsgiver.felles.domene.Forespoersel
import no.nav.helsearbeidsgiver.felles.domene.ForespoerselType
import no.nav.helsearbeidsgiver.felles.domene.ForespurtData
import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateSerializer
import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer
Expand All @@ -17,7 +16,6 @@ import java.util.UUID

@Serializable
data class Forespoersel(
val type: ForespoerselType,
val orgnr: Orgnr,
val fnr: Fnr,
/** Ikke bruk ved henting av én forespørsel (Storebror lekker feil id). */
Expand All @@ -31,7 +29,6 @@ data class Forespoersel(
) {
fun toForespoersel(): Forespoersel =
Forespoersel(
type = type,
orgnr = orgnr.verdi,
fnr = fnr.verdi,
vedtaksperiodeId = vedtaksperiodeId,
Expand Down
Loading

0 comments on commit 1b1f29d

Please sign in to comment.