Skip to content

Commit

Permalink
Merge branch 'main' into dev/fjern-forespoersel-type
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga committed Oct 29, 2024
2 parents 1134c19 + a991e27 commit 8aa862f
Show file tree
Hide file tree
Showing 23 changed files with 74 additions and 389 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -202,12 +202,7 @@ private object Mock {
sykmeldtFnr to SYKMELDT_NAVN,
avsenderFnr to AVSENDER_NAVN,
).associate { (fnr, navn) ->
fnr to
Person(
fnr = fnr,
navn = navn,
foedselsdato = Person.foedselsdato(fnr),
)
fnr to Person(fnr, navn)
}

fun successResult(orgnr: Orgnr): JsonElement =
Expand Down
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 @@ -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 @@ -164,22 +164,16 @@ private object Mock {
val inntektsmelding = mockInntektsmeldingV1()

val avsender =
Fnr.genererGyldig().let {
Person(
fnr = it,
navn = "Skrue McDuck",
foedselsdato = Person.foedselsdato(it),
)
}
Person(
fnr = Fnr.genererGyldig(),
navn = "Skrue McDuck",
)

val sykmeldt =
Fnr(forespoersel.fnr).let {
Person(
fnr = it,
navn = "Dolly Duck",
foedselsdato = Person.foedselsdato(it),
)
}
Person(
fnr = Fnr(forespoersel.fnr),
navn = "Dolly Duck",
)

val orgnrMedNavn = mapOf(Orgnr(forespoersel.orgnr) to "Lasses kasserollesjappe")

Expand Down
Original file line number Diff line number Diff line change
@@ -1,38 +1,10 @@
@file:UseSerializers(LocalDateSerializer::class)

package no.nav.helsearbeidsgiver.felles.domene

import kotlinx.serialization.Serializable
import kotlinx.serialization.UseSerializers
import no.nav.helsearbeidsgiver.utils.json.serializer.LocalDateSerializer
import no.nav.helsearbeidsgiver.utils.wrapper.Fnr
import java.time.LocalDate
import java.time.format.DateTimeFormatter

private val fnrFoedselsdatoFormatter = DateTimeFormatter.ofPattern("ddMMyyyy")

@Serializable
data class Person(
val fnr: Fnr,
val navn: String,
val foedselsdato: LocalDate,
) {
companion object {
// For info om fødselsdato i fnr, se https://lovdata.no/dokument/SF/forskrift/2017-07-14-1201/KAPITTEL_2#%C2%A72-2-1
fun foedselsdato(fnr: Fnr): LocalDate {
val foedtEtterAar39 = fnr.verdi[4].digitToInt() >= 4
val individsifferUnder500 = fnr.verdi[6].digitToInt() < 5

val aarhundre =
if (foedtEtterAar39 || individsifferUnder500) {
"19"
} else {
"20"
}

val foedseldato = fnr.verdi.take(4) + aarhundre + fnr.verdi.slice(4..5)

return LocalDate.parse(foedseldato, fnrFoedselsdatoFormatter)
}
}
}
)
Loading

0 comments on commit 8aa862f

Please sign in to comment.