Skip to content

Commit

Permalink
Hent tidspunkt for mottagelse, og send data som klasse
Browse files Browse the repository at this point in the history
  • Loading branch information
bjerga committed Jan 7, 2025
1 parent 5bc5c56 commit 5adf2a0
Show file tree
Hide file tree
Showing 17 changed files with 299 additions and 303 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,14 @@ 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.Forespoersel
import no.nav.helsearbeidsgiver.felles.domene.KvitteringResultat
import no.nav.helsearbeidsgiver.felles.domene.LagretInntektsmelding
import no.nav.helsearbeidsgiver.felles.metrics.Metrics
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisConnection
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisPrefix
import no.nav.helsearbeidsgiver.felles.rapidsrivers.redis.RedisStore
import no.nav.helsearbeidsgiver.felles.utils.zoneIdOslo
import no.nav.helsearbeidsgiver.felles.utils.toOffsettDateTimeOslo
import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPoller
import no.nav.helsearbeidsgiver.inntektsmelding.api.RedisPollerTimeoutException
import no.nav.helsearbeidsgiver.inntektsmelding.api.Routes
Expand Down Expand Up @@ -77,10 +78,18 @@ fun Route.kvittering(
val resultat = resultatJson.success?.fromJson(KvitteringResultat.serializer())
if (resultat != null) {
sikkerLogger.info("Hentet kvittering for '$forespoerselId'.\n${resultatJson.success?.toPretty()}")
if (resultat.skjema == null && resultat.eksternInntektsmelding == null) {
respondNotFound("Kvittering ikke funnet for forespørselId: $forespoerselId", String.serializer())
} else {
respondOk(resultat.tilResponse(), KvitteringResponse.serializer())

when (val lagret = resultat.lagret) {
is LagretInntektsmelding.Skjema -> {
val skjemaResponse = lagResponse(resultat.forespoersel, resultat.sykmeldtNavn, resultat.orgNavn, lagret)
respondOk(skjemaResponse, KvitteringResponse.serializer())
}
is LagretInntektsmelding.Ekstern -> {
val eksternResponse = lagResponse(lagret)
respondOk(eksternResponse, KvitteringResponse.serializer())
}
null ->
respondNotFound("Kvittering ikke funnet for forespørselId: $forespoerselId", String.serializer())
}
} else {
val feilmelding = resultatJson.failure?.fromJson(String.serializer()) ?: Tekst.TEKNISK_FEIL_FORBIGAAENDE
Expand All @@ -105,61 +114,61 @@ fun Route.kvittering(

@Serializable
private data class KvitteringResponse(
val kvitteringNavNo: KvitteringNavNo?,
val kvitteringEkstern: KvitteringEkstern?,
)

@Serializable
private data class KvitteringNavNo(
val sykmeldt: Sykmeldt,
val avsender: Avsender,
val sykmeldingsperioder: List<Periode>,
val skjema: SkjemaInntektsmelding,
val mottatt: OffsetDateTime,
)
val kvitteringNavNo: NavNo?,
val kvitteringEkstern: Ekstern?,
) {
@Serializable
data class NavNo(
val sykmeldt: Sykmeldt,
val avsender: Avsender,
val sykmeldingsperioder: List<Periode>,
val skjema: SkjemaInntektsmelding,
val mottatt: OffsetDateTime,
)

@Serializable
data class KvitteringEkstern(
val avsenderSystem: String,
val referanse: String,
val mottatt: OffsetDateTime,
)
@Serializable
data class Ekstern(
val avsenderSystem: String,
val referanse: String,
val mottatt: OffsetDateTime,
)
}

private fun KvitteringResultat.tilResponse(): KvitteringResponse =
private fun lagResponse(
forespoersel: Forespoersel,
sykmeldtNavn: String,
orgNavn: String,
lagret: LagretInntektsmelding.Skjema,
): KvitteringResponse =
KvitteringResponse(
kvitteringNavNo = tilKvitteringNavNo(),
kvitteringEkstern = eksternInntektsmelding?.tilKvitteringEkstern(),
kvitteringNavNo =
KvitteringResponse.NavNo(
sykmeldt =
Sykmeldt(
fnr = forespoersel.fnr,
navn = sykmeldtNavn,
),
avsender =
Avsender(
orgnr = forespoersel.orgnr,
orgNavn = orgNavn,
navn = lagret.avsenderNavn ?: "Ukjent navn",
tlf = lagret.skjema.avsenderTlf,
),
sykmeldingsperioder = forespoersel.sykmeldingsperioder,
skjema = lagret.skjema,
mottatt = lagret.mottatt.toOffsettDateTimeOslo(),
),
kvitteringEkstern = null,
)

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,
// TODO hent fra database
mottatt = OffsetDateTime.now(),
)
} else {
null
}
}

private fun EksternInntektsmelding.tilKvitteringEkstern(): KvitteringEkstern =
KvitteringEkstern(
avsenderSystem = avsenderSystemNavn,
referanse = arkivreferanse,
mottatt = tidspunkt.atZone(zoneIdOslo).toOffsetDateTime(),
private fun lagResponse(lagret: LagretInntektsmelding.Ekstern): KvitteringResponse =
KvitteringResponse(
kvitteringNavNo = null,
kvitteringEkstern =
KvitteringResponse.Ekstern(
avsenderSystem = lagret.ekstern.avsenderSystemNavn,
referanse = lagret.ekstern.arkivreferanse,
mottatt = lagret.ekstern.tidspunkt.toOffsettDateTimeOslo(),
),
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ 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.LagretInntektsmelding
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.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.toJson
import no.nav.helsearbeidsgiver.utils.test.date.mars
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
import java.util.UUID
Expand Down Expand Up @@ -55,8 +56,11 @@ private val resultat =
KvitteringResultat(
forespoersel = mockForespoersel(),
sykmeldtNavn = "Syk Meldt",
avsenderNavn = "Avs Ender",
orgNavn = "Orga Nisasjon",
skjema = mockSkjemaInntektsmelding(),
eksternInntektsmelding = mockEksternInntektsmelding(),
lagret =
LagretInntektsmelding.Skjema(
avsenderNavn = "Avs Ender",
skjema = mockSkjemaInntektsmelding(),
mottatt = 4.mars.atStartOfDay(),
),
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.Sykmeldt
import no.nav.helsearbeidsgiver.domene.inntektsmelding.v1.skjema.SkjemaInntektsmelding
import no.nav.helsearbeidsgiver.felles.domene.Forespoersel
import no.nav.helsearbeidsgiver.felles.domene.ForslagInntekt
import no.nav.helsearbeidsgiver.felles.utils.zoneIdOslo
import no.nav.helsearbeidsgiver.felles.utils.toOffsettDateTimeOslo
import java.time.LocalDateTime
import java.util.UUID

Expand Down Expand Up @@ -76,7 +76,7 @@ fun mapInntektsmelding(
inntekt = inntekt,
refusjon = refusjon,
aarsakInnsending = aarsakInnsending,
mottatt = mottatt.atZone(zoneIdOslo).toOffsetDateTime(),
mottatt = mottatt.toOffsettDateTimeOslo(),
vedtaksperiodeId = forespoersel.vedtaksperiodeId,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import no.nav.helsearbeidsgiver.felles.test.mock.mockSkjemaInntektsmelding
import no.nav.helsearbeidsgiver.felles.test.mock.utenPaakrevdAGP
import no.nav.helsearbeidsgiver.felles.test.mock.utenPaakrevdInntekt
import no.nav.helsearbeidsgiver.felles.test.mock.utenPaakrevdRefusjon
import no.nav.helsearbeidsgiver.felles.utils.zoneIdOslo
import no.nav.helsearbeidsgiver.felles.utils.toOffsettDateTimeOslo
import no.nav.helsearbeidsgiver.utils.test.date.august
import no.nav.helsearbeidsgiver.utils.test.date.desember
import no.nav.helsearbeidsgiver.utils.test.date.juli
Expand Down Expand Up @@ -83,7 +83,7 @@ class MapInntektsmeldingKtTest :

vedtaksperiodeId shouldBe forespoersel.vedtaksperiodeId

mottatt shouldBe imMottatt.atZone(zoneIdOslo).toOffsetDateTime()
mottatt shouldBe imMottatt.toOffsettDateTimeOslo()
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ 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.domene.EksternInntektsmelding
import no.nav.helsearbeidsgiver.felles.domene.LagretInntektsmelding
import no.nav.helsearbeidsgiver.felles.metrics.Metrics
import no.nav.helsearbeidsgiver.inntektsmelding.db.tabell.InntektsmeldingEntitet
import no.nav.helsearbeidsgiver.utils.log.logger
import no.nav.helsearbeidsgiver.utils.log.sikkerLogger
import no.nav.helsearbeidsgiver.utils.pipe.orDefault
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.Query
import org.jetbrains.exposed.sql.SortOrder
Expand All @@ -28,39 +28,51 @@ class InntektsmeldingRepository(
private val logger = logger()
private val sikkerLogger = sikkerLogger()

fun hentNyesteEksternEllerInternInntektsmelding(forespoerselId: UUID): Triple<String?, SkjemaInntektsmelding?, EksternInntektsmelding?> =
fun hentNyesteEksternEllerInternInntektsmelding(forespoerselId: UUID): LagretInntektsmelding? =
Metrics.dbInntektsmelding.recordTime(InntektsmeldingRepository::hentNyesteEksternEllerInternInntektsmelding) {
transaction(db) {
InntektsmeldingEntitet
.select(
InntektsmeldingEntitet.dokument,
InntektsmeldingEntitet.skjema,
InntektsmeldingEntitet.eksternInntektsmelding,
InntektsmeldingEntitet.innsendt,
).where { InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString() }
.orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC)
.limit(1)
.map {
Triple(
Quadruple(
it[InntektsmeldingEntitet.dokument],
it[InntektsmeldingEntitet.skjema],
it[InntektsmeldingEntitet.eksternInntektsmelding],
it[InntektsmeldingEntitet.innsendt],
)
}
}.firstOrNull()
?.let { (inntektsmelding, skjema, eksternInntektsmelding) ->
val bakoverkompatibeltSkjema =
skjema ?: inntektsmelding?.let {
SkjemaInntektsmelding(
forespoerselId = forespoerselId,
avsenderTlf = it.telefonnummer.orEmpty(),
agp = it.convertAgp(),
inntekt = it.convertInntekt(),
refusjon = it.refusjon.convert(),
)
}
?.let { result ->
val inntektsmelding = result.first
val skjema = result.second
val eksternInntektsmelding = result.third
val mottatt = result.fourth

when {
skjema != null -> LagretInntektsmelding.Skjema(inntektsmelding?.innsenderNavn, skjema, mottatt)
inntektsmelding != null -> {
val bakoverkompatibeltSkjema =
SkjemaInntektsmelding(
forespoerselId = forespoerselId,
avsenderTlf = inntektsmelding.telefonnummer.orEmpty(),
agp = inntektsmelding.convertAgp(),
inntekt = inntektsmelding.convertInntekt(),
refusjon = inntektsmelding.refusjon.convert(),
)

Triple(inntektsmelding?.innsenderNavn, bakoverkompatibeltSkjema, eksternInntektsmelding)
}.orDefault(Triple(null, null, null))
LagretInntektsmelding.Skjema(inntektsmelding.innsenderNavn, bakoverkompatibeltSkjema, mottatt)
}
eksternInntektsmelding != null -> LagretInntektsmelding.Ekstern(eksternInntektsmelding)
else -> null
}
}
}

fun oppdaterJournalpostId(
Expand Down Expand Up @@ -99,7 +111,7 @@ class InntektsmeldingRepository(
InntektsmeldingEntitet.insert {
it[this.forespoerselId] = forespoerselId.toString()
it[eksternInntektsmelding] = eksternIm
it[innsendt] = LocalDateTime.now()
it[innsendt] = eksternIm.tidspunkt
}
}
}
Expand Down Expand Up @@ -166,18 +178,25 @@ class InntektsmeldingRepository(
}
}
}

private fun hentNyesteImQuery(forespoerselId: UUID): Query =
InntektsmeldingEntitet
.selectAll()
.where { (InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString()) and InntektsmeldingEntitet.dokument.isNotNull() }
.orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC)
.limit(1)

private fun hentNyesteImSkjemaQuery(forespoerselId: UUID): Query =
InntektsmeldingEntitet
.selectAll()
.where { InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString() }
.orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC)
.limit(1)
}

private class Quadruple<A, B, C, D>(
val first: A,
val second: B,
val third: C,
val fourth: D,
)

private fun hentNyesteImQuery(forespoerselId: UUID): Query =
InntektsmeldingEntitet
.selectAll()
.where { (InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString()) and InntektsmeldingEntitet.dokument.isNotNull() }
.orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC)
.limit(1)

private fun hentNyesteImSkjemaQuery(forespoerselId: UUID): Query =
InntektsmeldingEntitet
.selectAll()
.where { InntektsmeldingEntitet.forespoerselId eq forespoerselId.toString() }
.orderBy(InntektsmeldingEntitet.innsendt, SortOrder.DESC)
.limit(1)
Loading

0 comments on commit 5adf2a0

Please sign in to comment.