Skip to content

Commit 3ca6d09

Browse files
Legg til endepunkt for å hente inntekt data med inntektId bare for nye frontend.
1 parent 7ff74a0 commit 3ca6d09

File tree

8 files changed

+391
-147
lines changed

8 files changed

+391
-147
lines changed

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/BehandlingsInntektsGetter.kt

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,34 +22,28 @@ class BehandlingsInntektsGetter(
2222
suspend fun getKlassifisertInntekt(
2323
inntektparametre: Inntektparametre,
2424
callId: String? = null,
25-
): Inntekt {
26-
return klassifiserOgMapInntekt(getSpesifisertInntekt(inntektparametre, callId))
27-
}
25+
): Inntekt = klassifiserOgMapInntekt(getSpesifisertInntekt(inntektparametre, callId))
2826

29-
fun getKlassifisertInntekt(inntektId: InntektId): Inntekt {
30-
return klassifiserOgMapInntekt(inntektStore.getSpesifisertInntekt(inntektId))
31-
}
27+
fun getKlassifisertInntekt(inntektId: InntektId): Inntekt = klassifiserOgMapInntekt(inntektStore.getSpesifisertInntekt(inntektId))
3228

3329
suspend fun getSpesifisertInntekt(
3430
inntektparametre: Inntektparametre,
3531
callId: String? = null,
36-
): SpesifisertInntekt {
37-
return mapToSpesifisertInntekt(
32+
): SpesifisertInntekt =
33+
mapToSpesifisertInntekt(
3834
getBehandlingsInntekt(inntektparametre, callId),
3935
inntektparametre.opptjeningsperiode.sisteAvsluttendeKalenderMåned,
4036
)
41-
}
4237

4338
internal suspend fun getBehandlingsInntekt(
4439
inntektparametre: Inntektparametre,
4540
callId: String? = null,
46-
): StoredInntekt {
47-
return isInntektStored(inntektparametre)?.let {
41+
): StoredInntekt =
42+
isInntektStored(inntektparametre)?.let {
4843
LOGGER.info { "Henter stored inntekt: ${inntektparametre.toDebugString()}" }
4944
inntektStore.getInntekt(it)
5045
}
5146
?: fetchAndStoreInntekt(inntektparametre, callId)
52-
}
5347

5448
private suspend fun fetchAndStoreInntekt(
5549
inntektparametre: Inntektparametre,

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/InntektStore.kt

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ interface InntektStore {
2626
fun getManueltRedigert(inntektId: InntektId): ManueltRedigert?
2727

2828
fun markerInntektBrukt(inntektId: InntektId): Int
29+
30+
fun getInntektMedPersonFnr(inntektId: InntektId): StoredInntektMedFnr
2931
}
3032

3133
data class Inntektparametre(
@@ -36,20 +38,23 @@ data class Inntektparametre(
3638
) {
3739
val opptjeningsperiode: Opptjeningsperiode = Opptjeningsperiode(beregningsdato)
3840

39-
fun toDebugString(): String {
40-
return "Inntektparametre(aktørId='$aktørId', beregningsdato=$beregningsdato, regelkontekst=$regelkontekst)"
41-
}
41+
fun toDebugString(): String = "Inntektparametre(aktørId='$aktørId', beregningsdato=$beregningsdato, regelkontekst=$regelkontekst)"
4242
}
4343

44-
data class RegelKontekst(val id: String, val type: String)
44+
data class RegelKontekst(
45+
val id: String,
46+
val type: String,
47+
)
4548

4649
data class StoreInntektCommand(
4750
val inntektparametre: Inntektparametre,
4851
val inntekt: InntektkomponentResponse,
4952
val manueltRedigert: ManueltRedigert? = null,
5053
)
5154

52-
data class ManueltRedigert(val redigertAv: String) {
55+
data class ManueltRedigert(
56+
val redigertAv: String,
57+
) {
5358
companion object {
5459
fun from(
5560
bool: Boolean,
@@ -68,9 +73,14 @@ data class StoredInntekt(
6873
val timestamp: LocalDateTime? = null,
6974
)
7075

71-
data class DetachedInntekt(val inntekt: InntektkomponentResponse, val manueltRedigert: Boolean)
76+
data class DetachedInntekt(
77+
val inntekt: InntektkomponentResponse,
78+
val manueltRedigert: Boolean,
79+
)
7280

73-
data class InntektId(val id: String) {
81+
data class InntektId(
82+
val id: String,
83+
) {
7484
init {
7585
try {
7686
ULID.parseULID(id)
@@ -80,9 +90,23 @@ data class InntektId(val id: String) {
8090
}
8191
}
8292

83-
class InntektNotFoundException(override val message: String) : RuntimeException(message)
93+
data class StoredInntektMedFnr(
94+
val inntektId: InntektId,
95+
val inntekt: InntektkomponentResponse,
96+
val manueltRedigert: Boolean,
97+
val timestamp: LocalDateTime? = null,
98+
valdselsnummer: String,
99+
)
100+
101+
class InntektNotFoundException(
102+
override val message: String,
103+
) : RuntimeException(message)
84104

85-
class StoreException(override val message: String) : RuntimeException(message)
105+
class StoreException(
106+
override val message: String,
107+
) : RuntimeException(message)
86108

87-
class IllegalInntektIdException(override val message: String, override val cause: Throwable?) :
88-
java.lang.RuntimeException(message, cause)
109+
class IllegalInntektIdException(
110+
override val message: String,
111+
override val cause: Throwable?,
112+
) : java.lang.RuntimeException(message, cause)

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/db/PostgresInntektStore.kt

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,16 @@ import java.time.ZonedDateTime
2222
import javax.sql.DataSource
2323

2424
@Suppress("ktlint:standard:max-line-length")
25-
internal class PostgresInntektStore(private val dataSource: DataSource) : InntektStore, HealthCheck {
25+
internal class PostgresInntektStore(
26+
private val dataSource: DataSource,
27+
) : InntektStore,
28+
HealthCheck {
2629
companion object {
2730
private val ulidGenerator = ULID()
2831
private val LOGGER = KotlinLogging.logger {}
2932
private val markerInntektTimer =
30-
Summary.builder()
33+
Summary
34+
.builder()
3135
.name("marker_inntekt_brukt")
3236
.help("Hvor lang tid det tar å markere en inntekt brukt (i sekunder")
3337
.register()
@@ -110,8 +114,8 @@ internal class PostgresInntektStore(private val dataSource: DataSource) : Inntek
110114
}
111115
}
112116

113-
override fun getInntekt(inntektId: InntektId): StoredInntekt {
114-
return using(sessionOf(dataSource)) { session ->
117+
override fun getInntekt(inntektId: InntektId): StoredInntekt =
118+
using(sessionOf(dataSource)) { session ->
115119
session.run(
116120
queryOf(
117121
""" SELECT id, inntekt, manuelt_redigert, timestamp from inntekt_V1 where id = ?""",
@@ -123,12 +127,10 @@ internal class PostgresInntektStore(private val dataSource: DataSource) : Inntek
123127
manueltRedigert = row.boolean("manuelt_redigert"),
124128
timestamp = row.zonedDateTime("timestamp").toLocalDateTime(),
125129
)
126-
}
127-
.asSingle,
130+
}.asSingle,
128131
)
129132
?: throw InntektNotFoundException("Inntekt with id $inntektId not found.")
130133
}
131-
}
132134

133135
override fun getSpesifisertInntekt(inntektId: InntektId): SpesifisertInntekt {
134136
@Language("sql")
@@ -137,8 +139,9 @@ internal class PostgresInntektStore(private val dataSource: DataSource) : Inntek
137139
SELECT inntekt.id, inntekt.inntekt, inntekt.manuelt_redigert, inntekt.timestamp, mapping.beregningsdato
138140
from inntekt_V1 inntekt
139141
inner join inntekt_V1_person_mapping mapping on inntekt.id = mapping.inntektid
140-
where inntekt.id = ?"""
141-
.trimIndent()
142+
where inntekt.id = ?
143+
144+
""".trimIndent()
142145

143146
val stored =
144147
using(sessionOf(dataSource)) { session ->
@@ -153,14 +156,40 @@ internal class PostgresInntektStore(private val dataSource: DataSource) : Inntek
153156
manueltRedigert = row.boolean("manuelt_redigert"),
154157
timestamp = row.zonedDateTime("timestamp").toLocalDateTime(),
155158
) to row.localDate("beregningsdato")
156-
}
157-
.asSingle,
159+
}.asSingle,
158160
)
159161
?: throw InntektNotFoundException("Inntekt with id $inntektId not found.")
160162
}
161163
return mapToSpesifisertInntekt(stored.first, Opptjeningsperiode(stored.second).sisteAvsluttendeKalenderMåned)
162164
}
163165

166+
override fun getInntektMedPersonFnr(inntektId: InntektId): StoredInntektMedFnr {
167+
@Language("sql")
168+
val statement =
169+
"""
170+
SELECT inntekt.id, inntekt.inntekt, inntekt.manuelt_redigert, inntekt.timestamp, mapping.fnr
171+
from inntekt_V1 inntekt
172+
inner join inntekt_V1_person_mapping mapping on inntekt.id = mapping.inntektid
173+
where inntekt.id = ?
174+
175+
""".trimIndent()
176+
177+
return using(sessionOf(dataSource)) { session ->
178+
session.run(
179+
queryOf(statement, inntektId.id)
180+
.map {
181+
StoredInntektMedFnr(
182+
inntektId = InntektId(it.string("id")),
183+
inntekt = it.binaryStream("inntekt").use { jacksonObjectMapper.readValue<InntektkomponentResponse>(it) },
184+
manueltRedigert = it.boolean("manuelt_redigert"),
185+
timestamp = it.zonedDateTime("timestamp").toLocalDateTime(),
186+
fødselsnummer = it.string("fnr"),
187+
)
188+
}.asSingle,
189+
) ?: throw InntektNotFoundException("Inntekt with id $inntektId not found.")
190+
}
191+
}
192+
164193
override fun storeInntekt(
165194
command: StoreInntektCommand,
166195
created: ZonedDateTime,
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package no.nav.dagpenger.inntekt.mapping
2+
3+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Aktoer
4+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektBeskrivelse
5+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektType
6+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentResponse
7+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjon
8+
import java.math.BigDecimal
9+
import java.time.YearMonth
10+
11+
fun mapToInntektFrontend(
12+
inntektResponse: InntektkomponentResponse,
13+
person: Inntektsmottaker,
14+
): InntektForVirksomhetMaanedMedPersonInformasjon {
15+
val inntekt = inntektResponse.arbeidsInntektMaaned
16+
var virksomhetListe: MutableList<InntektForVirksomhet> = mutableListOf()
17+
18+
inntekt?.forEach { arbeidsInntektMaaned ->
19+
val inntektsInformasjon = arbeidsInntektMaaned.arbeidsInntektInformasjon
20+
inntektsInformasjon?.inntektListe?.forEach { inntekt ->
21+
val virksomhet = inntekt.virksomhet
22+
// TODO: Replace with actual logic to get virksomhetNavn
23+
val virksomhetNavn = "testNavn"
24+
val inntekter = mutableListOf<InntektVirksomhetMaaned>()
25+
inntekter.add(
26+
InntektVirksomhetMaaned(
27+
belop = inntekt.beloep,
28+
inntektsKilde = inntekt.inntektskilde,
29+
// TODO: finn ut om inntekten er redigert
30+
redigert = false,
31+
begrunnelse = inntekt.beskrivelse.name,
32+
aarMaaned = arbeidsInntektMaaned.aarMaaned,
33+
fordel = inntekt.fordel,
34+
beskrivelse = inntekt.beskrivelse,
35+
inntektsStatus = inntekt.inntektsstatus,
36+
utbetaltIMaaned = inntekt.utbetaltIMaaned,
37+
inntektType = inntekt.inntektType,
38+
leveringstidspunkt = inntekt.leveringstidspunkt,
39+
opptjeningsland = inntekt.opptjeningsland,
40+
skattemessigBosattLand = inntekt.skattemessigBosattLand,
41+
inntektsinnsender = inntekt.inntektsinnsender,
42+
virksomhet = inntekt.virksomhet,
43+
inntektsmottaker = inntekt.inntektsmottaker,
44+
inngaarIGrunnlagForTrekk = inntekt.inngaarIGrunnlagForTrekk,
45+
utloeserArbeidsgiveravgift = inntekt.utloeserArbeidsgiveravgift,
46+
informasjonsstatus = inntekt.informasjonsstatus,
47+
tilleggsinformasjon = inntekt.tilleggsinformasjon,
48+
),
49+
)
50+
51+
val eksisterendeVirksomhet =
52+
virksomhetListe.find { it.virksomhet == virksomhet?.identifikator }
53+
if (eksisterendeVirksomhet != null) {
54+
eksisterendeVirksomhet.inntekter.addAll(inntekter)
55+
} else {
56+
virksomhetListe.add(
57+
InntektForVirksomhet(
58+
virksomhet = virksomhet?.identifikator ?: "",
59+
virksomhetNavn = virksomhetNavn,
60+
periode = finnPeriode(inntekter),
61+
inntekter = inntekter,
62+
),
63+
)
64+
}
65+
}
66+
}
67+
68+
return InntektForVirksomhetMaanedMedPersonInformasjon(
69+
inntektVirksomhetMaaned = virksomhetListe,
70+
mottaker = person,
71+
)
72+
}
73+
74+
fun finnPeriode(inntekter: MutableList<InntektVirksomhetMaaned>): InntektForVirksomhetPeriode =
75+
InntektForVirksomhetPeriode(
76+
fra = inntekter.minOf { it.aarMaaned },
77+
til = inntekter.maxOf { it.aarMaaned },
78+
)
79+
80+
data class InntektForVirksomhetMaanedMedPersonInformasjon(
81+
val inntektVirksomhetMaaned: List<InntektForVirksomhet>,
82+
val mottaker: Inntektsmottaker,
83+
)
84+
85+
data class InntektForVirksomhet(
86+
val virksomhet: String,
87+
val virksomhetNavn: String,
88+
val periode: InntektForVirksomhetPeriode,
89+
val inntekter: MutableList<InntektVirksomhetMaaned>,
90+
)
91+
92+
data class InntektForVirksomhetPeriode(
93+
val fra: YearMonth,
94+
val til: YearMonth,
95+
)
96+
97+
data class InntektVirksomhetMaaned(
98+
val belop: BigDecimal,
99+
val fordel: String,
100+
val beskrivelse: InntektBeskrivelse,
101+
val inntektsKilde: String,
102+
val inntektsStatus: String,
103+
val leveringstidspunkt: YearMonth? = null,
104+
val opptjeningsland: String? = null,
105+
val skattemessigBosattLand: String? = null,
106+
val utbetaltIMaaned: YearMonth,
107+
val inntektsinnsender: Aktoer? = null,
108+
val virksomhet: Aktoer? = null,
109+
val inntektsmottaker: Aktoer? = null,
110+
val inngaarIGrunnlagForTrekk: Boolean? = null,
111+
val utloeserArbeidsgiveravgift: Boolean? = null,
112+
val informasjonsstatus: String? = null,
113+
val inntektType: InntektType,
114+
val tilleggsinformasjon: TilleggInformasjon? = null,
115+
val redigert: Boolean,
116+
val begrunnelse: String,
117+
val aarMaaned: YearMonth,
118+
)

dp-inntekt-api/src/main/kotlin/no/nav/dagpenger/inntekt/oppslag/PersonOppslag.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ interface PersonOppslag {
44
suspend fun hentPerson(ident: String): Person
55
}
66

7-
class PersonNotFoundException(val ident: String?, msg: String = "Fant ikke person") : RuntimeException(msg)
7+
class PersonNotFoundException(
8+
val ident: String?,
9+
msg: String = "Fant ikke person",
10+
) : RuntimeException(msg)
811

912
data class Person(
1013
valdselsnummer: String,

0 commit comments

Comments
 (0)