Skip to content

Commit

Permalink
Returner kvittering basert på frontend til skjema
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga committed Dec 23, 2024
1 parent 32d79f4 commit 8f1e6b5
Show file tree
Hide file tree
Showing 16 changed files with 476 additions and 202 deletions.
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(),
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

0 comments on commit 8f1e6b5

Please sign in to comment.