Skip to content

Commit

Permalink
Midlertidig: Tål gammelt format på årsak for inntektsendring
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga committed Jun 28, 2024
1 parent 09d072a commit 0a6525f
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,17 @@ 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.helse.rapids_rivers.RapidsConnection
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.ResultJson
import no.nav.helsearbeidsgiver.felles.utils.Log
import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPoller
Expand All @@ -21,6 +30,7 @@ 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 @@ -88,7 +98,9 @@ private suspend fun PipelineContext<Unit, ApplicationCall>.sendOkResponse(inntek
sikkerLogger.info("$it\n$inntektsmelding")
}
val response = ResultJson(
success = HentSelvbestemtImResponseSuccess(inntektsmelding).toJson(HentSelvbestemtImResponseSuccess.serializer())
// Midlertidig, for å håndtere ulikt format på frontend og backend
success = tilResponseMedEkstraFelt(inntektsmelding)
?: HentSelvbestemtImResponseSuccess(inntektsmelding).toJson(HentSelvbestemtImResponseSuccess.serializer())
)
respondOk(response, ResultJson.serializer())
}
Expand Down Expand Up @@ -125,3 +137,42 @@ 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 @@ -6,9 +6,18 @@ 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.helse.rapids_rivers.RapidsConnection
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.ResultJson
import no.nav.helsearbeidsgiver.felles.utils.Log
Expand Down Expand Up @@ -87,6 +96,7 @@ fun Route.lagreSelvbestemtImRoute(
}
}

@OptIn(ExperimentalSerializationApi::class)
private suspend fun PipelineContext<Unit, ApplicationCall>.lesRequestOrNull(): SkjemaInntektsmeldingSelvbestemt? =
call.receiveText()
.parseJson()
Expand All @@ -97,7 +107,12 @@ private suspend fun PipelineContext<Unit, ApplicationCall>.lesRequestOrNull(): S
}
}
.runCatching {
fromJson(SkjemaInntektsmeldingSelvbestemt.serializer())
try {
fromJson(SkjemaInntektsmeldingSelvbestemt.serializer())
} catch (e: MissingFieldException) {
// Midlertidig, for å håndtere ulikt format på frontend og backend
fromJsonBackup(e)
}
}
.onFailure { e ->
"Kunne ikke parse json.".let {
Expand Down Expand Up @@ -153,3 +168,27 @@ private suspend fun PipelineContext<Unit, ApplicationCall>.sendResponse(resultat
}
}
}

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 @@ -30,6 +30,7 @@ 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.ResultJson
import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmeldingV1
import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPollerTimeoutException
Expand All @@ -42,6 +43,7 @@ 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 @@ -79,6 +81,34 @@ 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 { mockRedisPoller.hent(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 {
coEvery { mockRedisPoller.hent(any()) } returnsMany listOf(
Expand Down Expand Up @@ -338,14 +368,35 @@ 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)}] }"""
is Ferie -> """{ "aarsak": "Ferie", "ferier": [${ferier.joinToString(transform = Periode::hardcodedJson)}], "perioder": [${
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 Permittering -> """{ "aarsak": "Permittering", "permitteringer": [${permitteringer.joinToString(transform = Periode::hardcodedJson)}" }"""
is Sykefravaer -> """{ "aarsak": "Sykefravaer", "sykefravaer": [${sykefravaer.joinToString(transform = Periode::hardcodedJson)}" }"""
// 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 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 @@ -10,13 +10,18 @@ import kotlinx.serialization.json.JsonElement
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmeldingSelvbestemt
import no.nav.helsearbeidsgiver.felles.ResultJson
import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmeldingSelvbestemt
import no.nav.helsearbeidsgiver.felles.test.mock.randomDigitString
import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPollerTimeoutException
import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes
import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ApiTest
import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.harTilgangResultat
import no.nav.helsearbeidsgiver.inntektsmelding.api.utils.ikkeTilgangResultat
import no.nav.helsearbeidsgiver.utils.json.parseJson
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.test.json.removeJsonWhitespace
import no.nav.helsearbeidsgiver.utils.test.wrapper.genererGyldig
import no.nav.helsearbeidsgiver.utils.wrapper.Fnr
import no.nav.helsearbeidsgiver.utils.wrapper.Orgnr
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import java.util.UUID
Expand Down Expand Up @@ -46,6 +51,52 @@ 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 { mockRedisPoller.hent(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
}
""".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 `feil i request body gir 400-feil`() = testApi {
val expectedFeilmelding = "Feil under serialisering."
Expand Down

0 comments on commit 0a6525f

Please sign in to comment.