Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Returner kvittering basert på skjema til frontend #817

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,7 @@ object Routes {
}

fun main() {
startServer()
}

fun startServer(env: Map<String, String> = System.getenv()) {
val rapid = RapidApplication.create(env)
val rapid = RapidApplication.create(System.getenv())
val redisConnection = RedisConnection(Env.Redis.url)

embeddedServer(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,20 @@ import com.github.navikt.tbd_libs.rapids_and_rivers_api.RapidsConnection
import io.ktor.server.application.call
import io.ktor.server.routing.Route
import io.ktor.server.routing.get
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.builtins.serializer
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntekt
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Kvittering
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.KvitteringEkstern
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.KvitteringSimba
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Avsender
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Periode
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykmeldt
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding
import no.nav.helsearbeidsgiver.felles.Tekst
import no.nav.helsearbeidsgiver.felles.domene.EksternInntektsmelding
import no.nav.helsearbeidsgiver.felles.domene.InnsendtInntektsmelding
import no.nav.helsearbeidsgiver.felles.domene.KvitteringResultat
import no.nav.helsearbeidsgiver.felles.metrics.Metrics
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisConnection
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisPrefix
Expand Down Expand Up @@ -70,13 +74,13 @@ fun Route.kvittering(
kvitteringProducer.publish(transaksjonId, forespoerselId)
val resultatJson = redisPoller.hent(transaksjonId)

val resultat = resultatJson.success?.fromJson(InnsendtInntektsmelding.serializer())
val resultat = resultatJson.success?.fromJson(KvitteringResultat.serializer())
if (resultat != null) {
sikkerLogger.info("Hentet kvittering for '$forespoerselId'.\n${resultatJson.success?.toPretty()}")
if (resultat.dokument == null && resultat.eksternInntektsmelding == null) {
if (resultat.skjema == null && resultat.inntektsmelding == null && resultat.eksternInntektsmelding == null) {
respondNotFound("Kvittering ikke funnet for forespørselId: $forespoerselId", String.serializer())
} else {
respondOk(resultat.tilKvittering(), Kvittering.serializer())
respondOk(resultat.tilResponse(), KvitteringResponse.serializer())
}
} else {
val feilmelding = resultatJson.failure?.fromJson(String.serializer()) ?: Tekst.TEKNISK_FEIL_FORBIGAAENDE
Expand All @@ -99,12 +103,52 @@ fun Route.kvittering(
}
}

private fun InnsendtInntektsmelding.tilKvittering(): Kvittering =
Kvittering(
kvitteringDokument = dokument?.tilKvitteringSimba(),
@Serializable
private data class KvitteringResponse(
val kvitteringNavNo: KvitteringNavNo?,
val kvitteringDokument: KvitteringSimba?,
val kvitteringEkstern: KvitteringEkstern?,
)

@Serializable
private data class KvitteringNavNo(
val sykmeldt: Sykmeldt,
val avsender: Avsender,
val sykmeldingsperioder: List<Periode>,
val skjema: SkjemaInntektsmelding,
)

private fun KvitteringResultat.tilResponse(): KvitteringResponse =
KvitteringResponse(
kvitteringNavNo = tilKvitteringNavNo(),
kvitteringDokument = inntektsmelding?.tilKvitteringSimba(),
kvitteringEkstern = eksternInntektsmelding?.tilKvitteringEkstern(),
)

private fun KvitteringResultat.tilKvitteringNavNo(): KvitteringNavNo? {
val skjemaKvittering = skjema
return if (skjemaKvittering != null) {
KvitteringNavNo(
sykmeldt =
Sykmeldt(
fnr = forespoersel.fnr,
navn = sykmeldtNavn,
),
avsender =
Avsender(
orgnr = forespoersel.orgnr,
orgNavn = orgNavn,
navn = avsenderNavn,
tlf = skjemaKvittering.avsenderTlf,
),
sykmeldingsperioder = forespoersel.sykmeldingsperioder,
skjema = skjemaKvittering,
)
} else {
null
}
}

private fun Inntektsmelding.tilKvitteringSimba(): KvitteringSimba =
KvitteringSimba(
orgnrUnderenhet = orgnrUnderenhet,
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@ package no.nav.helsearbeidsgiver.inntektsmelding.api.kvittering

import io.ktor.http.HttpStatusCode
import io.mockk.coEvery
import no.nav.helsearbeidsgiver.felles.domene.KvitteringResultat
import no.nav.helsearbeidsgiver.felles.domene.ResultJson
import no.nav.helsearbeidsgiver.felles.json.toJson
import no.nav.helsearbeidsgiver.felles.test.mock.mockEksternInntektsmelding
import no.nav.helsearbeidsgiver.felles.test.mock.mockForespoersel
import no.nav.helsearbeidsgiver.felles.test.mock.mockInntektsmelding
import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding
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.utils.json.parseJson
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.test.json.removeJsonWhitespace
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import java.util.UUID
Expand Down Expand Up @@ -38,7 +41,7 @@ class KvitteringRouteKtTest : ApiTest() {
listOf(
harTilgangResultat,
ResultJson(
success = resultatMedInntektsmelding.parseJson(),
success = resultat.toJson(KvitteringResultat.serializer()),
).toJson()
.toString(),
)
Expand All @@ -49,46 +52,13 @@ class KvitteringRouteKtTest : ApiTest() {
}
}

private val resultatMedInntektsmelding =
"""
{
"dokument": {
"orgnrUnderenhet": "123456789",
"identitetsnummer": "12345678901",
"fulltNavn": "Ukjent",
"virksomhetNavn": "Ukjent",
"behandlingsdager": [],
"egenmeldingsperioder": [],
"bestemmendeFraværsdag": "2023-01-01",
"fraværsperioder": [
{
"fom": "2023-01-01",
"tom": "2023-01-31"
}
],
"arbeidsgiverperioder": [
{
"fom": "2023-01-01",
"tom": "2023-01-16"
}
],
"beregnetInntekt": 3000,
"fullLønnIArbeidsgiverPerioden": {
"utbetalerFullLønn": true,
"begrunnelse": null,
"utbetalt": null
},
"refusjon": {
"utbetalerHeleEllerDeler": false,
"refusjonPrMnd": null,
"refusjonOpphører": null,
"refusjonEndringer": null
},
"naturalytelser": null,
"tidspunkt": "2023-04-13T16:28:16.095083285+02:00",
"årsakInnsending": "NY",
"identitetsnummerInnsender": ""
},
"eksternInntektsmelding": null
}
""".removeJsonWhitespace()
private val resultat =
KvitteringResultat(
forespoersel = mockForespoersel(),
sykmeldtNavn = "Syk Meldt",
avsenderNavn = "Avs Ender",
orgNavn = "Orga Nisasjon",
skjema = mockSkjemaInntektsmelding(),
inntektsmelding = mockInntektsmelding(),
eksternInntektsmelding = mockEksternInntektsmelding(),
)
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,25 @@ class InntektsmeldingRepository(
private val logger = logger()
private val sikkerLogger = sikkerLogger()

fun hentNyesteEksternEllerInternInntektsmelding(forespoerselId: UUID): Pair<Inntektsmelding?, EksternInntektsmelding?> =
fun hentNyesteEksternEllerInternInntektsmelding(forespoerselId: UUID): Triple<SkjemaInntektsmelding?, Inntektsmelding?, EksternInntektsmelding?> =
Metrics.dbInntektsmelding.recordTime(InntektsmeldingRepository::hentNyesteEksternEllerInternInntektsmelding) {
transaction(db) {
InntektsmeldingEntitet
.select(InntektsmeldingEntitet.dokument, InntektsmeldingEntitet.eksternInntektsmelding)
.where { InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString() }
.select(
InntektsmeldingEntitet.skjema,
InntektsmeldingEntitet.dokument,
InntektsmeldingEntitet.eksternInntektsmelding,
).where { InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString() }
.orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC)
.limit(1)
.map {
Pair(
Triple(
it[InntektsmeldingEntitet.skjema],
it[InntektsmeldingEntitet.dokument],
it[InntektsmeldingEntitet.eksternInntektsmelding],
)
}.firstOrNull()
}.orDefault(Pair(null, null))
}.orDefault(Triple(null, null, null))
}

fun oppdaterJournalpostId(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,29 @@
package no.nav.helsearbeidsgiver.inntektsmelding.db.river

import kotlinx.serialization.json.JsonElement
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convert
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convertAgp
import no.nav.helsearbeidsgiver.domene.inntektsmelding.Utils.convertInntekt
import no.nav.helsearbeidsgiver.domene.inntektsmelding.deprecated.Inntektsmelding
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding
import no.nav.helsearbeidsgiver.felles.BehovType
import no.nav.helsearbeidsgiver.felles.EventName
import no.nav.helsearbeidsgiver.felles.Key
import no.nav.helsearbeidsgiver.felles.domene.EksternInntektsmelding
import no.nav.helsearbeidsgiver.felles.domene.ResultJson
import no.nav.helsearbeidsgiver.felles.json.krev
import no.nav.helsearbeidsgiver.felles.json.les
import no.nav.helsearbeidsgiver.felles.json.lesOrNull
import no.nav.helsearbeidsgiver.felles.json.toJson
import no.nav.helsearbeidsgiver.felles.json.toMap
import no.nav.helsearbeidsgiver.felles.rapidsrivers.KafkaKey
import no.nav.helsearbeidsgiver.felles.rapidsrivers.model.Fail
import no.nav.helsearbeidsgiver.felles.rapidsrivers.river.ObjectRiver
import no.nav.helsearbeidsgiver.felles.utils.Log
import no.nav.helsearbeidsgiver.inntektsmelding.db.InntektsmeldingRepository
import no.nav.helsearbeidsgiver.utils.json.serializer.UuidSerializer
import no.nav.helsearbeidsgiver.utils.json.toJson
import no.nav.helsearbeidsgiver.utils.json.toPretty
import no.nav.helsearbeidsgiver.utils.log.logger
import no.nav.helsearbeidsgiver.utils.log.sikkerLogger
import java.util.UUID
Expand All @@ -26,6 +33,7 @@ data class HentLagretImMelding(
val behovType: BehovType,
val transaksjonId: UUID,
val data: Map<Key, JsonElement>,
val svarKafkaKey: KafkaKey?,
val forespoerselId: UUID,
)

Expand All @@ -46,15 +54,33 @@ class HentLagretImRiver(
behovType = Key.BEHOV.krev(BehovType.HENT_LAGRET_IM, BehovType.serializer(), json),
transaksjonId = Key.KONTEKST_ID.les(UuidSerializer, json),
data = data,
svarKafkaKey = Key.SVAR_KAFKA_KEY.lesOrNull(KafkaKey.serializer(), data),
forespoerselId = Key.FORESPOERSEL_ID.les(UuidSerializer, data),
)
}

override fun HentLagretImMelding.haandter(json: Map<Key, JsonElement>): Map<Key, JsonElement> {
val (inntektsmelding, eksternInntektsmelding) =
val (
skjema,
inntektsmelding,
eksternInntektsmelding,
) =
imRepo
.hentNyesteEksternEllerInternInntektsmelding(forespoerselId)
.tilPayloadPair()
.let { (skjema, inntektsmelding, eksternInntektsmelding) ->
val bakoverkompatibeltSkjema =
skjema ?: inntektsmelding?.let {
SkjemaInntektsmelding(
forespoerselId = forespoerselId,
avsenderTlf = it.telefonnummer.orEmpty(),

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Telefonnr. kommer også i "avsender". Den passer vel bedre inn der?

Copy link
Contributor Author

@bjerga bjerga Dec 27, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hvilken "avsender" tenker du på?

agp = it.convertAgp(),
inntekt = it.convertInntekt(),
refusjon = it.refusjon.convert(),
)
}

Triple(bakoverkompatibeltSkjema, inntektsmelding, eksternInntektsmelding)
}.tilPayloadTriple()

loggHentet(inntektsmelding, eksternInntektsmelding)

Expand All @@ -65,6 +91,7 @@ class HentLagretImRiver(
data
.plus(
mapOf(
Key.SKJEMA_INNTEKTSMELDING to skjema.toJson(),
Key.LAGRET_INNTEKTSMELDING to inntektsmelding.toJson(),
Key.EKSTERN_INNTEKTSMELDING to eksternInntektsmelding.toJson(),
),
Expand Down Expand Up @@ -109,7 +136,7 @@ class HentLagretImRiver(
}
} else {
logger.info("Fant lagret inntektsmelding.")
sikkerLogger.info("Fant lagret inntektsmelding:\n${inntektsmelding.success}")
sikkerLogger.info("Fant lagret inntektsmelding.\n${inntektsmelding.success?.toPretty()}")
}

if (eksternInntektsmelding.success == null) {
Expand All @@ -119,15 +146,16 @@ class HentLagretImRiver(
}
} else {
logger.info("Fant lagret ekstern inntektsmelding.")
sikkerLogger.info("Fant lagret ekstern inntektsmelding:\n${eksternInntektsmelding.success}")
sikkerLogger.info("Fant lagret ekstern inntektsmelding.\n${eksternInntektsmelding.success?.toPretty()}")
}
}
}

private fun Pair<Inntektsmelding?, EksternInntektsmelding?>.tilPayloadPair(): Pair<ResultJson, ResultJson> =
Pair(
first?.toJson(Inntektsmelding.serializer()).toSuccess(),
second?.toJson(EksternInntektsmelding.serializer()).toSuccess(),
private fun Triple<SkjemaInntektsmelding?, Inntektsmelding?, EksternInntektsmelding?>.tilPayloadTriple(): Triple<ResultJson, ResultJson, ResultJson> =
Triple(
first?.toJson(SkjemaInntektsmelding.serializer()).toSuccess(),
second?.toJson(Inntektsmelding.serializer()).toSuccess(),
third?.toJson(EksternInntektsmelding.serializer()).toSuccess(),
)

private fun JsonElement?.toSuccess(): ResultJson = ResultJson(success = this)
Loading
Loading