Skip to content

Commit 9cf9b59

Browse files
vskjefstJMLindseth
andcommitted
Lagre inntekt (WiP, squash før merge)
Co-authored-by: John Martin Lindseth <[email protected]>
1 parent d25cace commit 9cf9b59

File tree

8 files changed

+152
-49
lines changed

8 files changed

+152
-49
lines changed

buildSrc/src/main/kotlin/common.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
2-
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
32
import org.gradle.api.tasks.testing.logging.TestLogEvent
3+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
44

55
plugins {
66
kotlin("jvm")

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,16 @@ fun main() {
4747
val cachedInntektsGetter = BehandlingsInntektsGetter(inntektskomponentHttpClient, postgresInntektStore)
4848
// Marks inntekt as used
4949
val subsumsjonBruktDataConsumer =
50-
KafkaSubsumsjonBruktDataConsumer(config, postgresInntektStore).apply {
51-
listen()
52-
}.also {
53-
Runtime.getRuntime().addShutdownHook(
54-
Thread {
55-
it.stop()
56-
},
57-
)
58-
}
50+
KafkaSubsumsjonBruktDataConsumer(config, postgresInntektStore)
51+
.apply {
52+
listen()
53+
}.also {
54+
Runtime.getRuntime().addShutdownHook(
55+
Thread {
56+
it.stop()
57+
},
58+
)
59+
}
5960

6061
// Provides a HTTP API for getting inntekt
6162
embeddedServer(Netty, port = config.application.httpPort) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ data class GUIInntekt(
2121
)
2222

2323
data class Inntektsmottaker(
24-
val pnr: String?,
24+
val fnr: String?,
2525
val navn: String?,
2626
)
2727

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

Lines changed: 72 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
package no.nav.dagpenger.inntekt.mapping
22

33
import de.huxhorn.sulky.ulid.ULID
4-
import mu.KotlinLogging
54
import no.nav.dagpenger.inntekt.db.DetachedInntekt
65
import no.nav.dagpenger.inntekt.db.InntektId
76
import no.nav.dagpenger.inntekt.db.StoredInntekt
7+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Aktoer
8+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.AktoerType
89
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.ArbeidsInntektInformasjon
910
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.ArbeidsInntektMaaned
1011
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Inntekt
1112
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentResponse
1213
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjon
1314
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjonsDetaljer
14-
15-
private val logg = KotlinLogging.logger {}
16-
private val sikkerlogg = KotlinLogging.logger("tjenestekall.MapFromGUIInntekt")
15+
import java.time.LocalDateTime.now
1716

1817
fun mapToStoredInntekt(guiInntekt: GUIInntekt): StoredInntekt =
1918
StoredInntekt(
@@ -26,6 +25,17 @@ fun mapToStoredInntekt(guiInntekt: GUIInntekt): StoredInntekt =
2625
guiInntekt.manueltRedigert,
2726
)
2827

28+
fun mapToStoredInntekt(
29+
inntekterDto: InntekterDto,
30+
inntektId: String,
31+
): StoredInntekt =
32+
StoredInntekt(
33+
inntektId = InntektId(id = inntektId),
34+
inntekt = mapToInntektkomponentResponse(inntekterDto),
35+
manueltRedigert = true,
36+
timestamp = now(),
37+
)
38+
2939
fun mapToDetachedInntekt(guiInntekt: GUIInntekt): DetachedInntekt =
3040
DetachedInntekt(
3141
InntektkomponentResponse(
@@ -36,13 +46,66 @@ fun mapToDetachedInntekt(guiInntekt: GUIInntekt): DetachedInntekt =
3646
guiInntekt.manueltRedigert,
3747
)
3848

39-
private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektMaaned>?): List<ArbeidsInntektMaaned>? {
40-
return arbeidsMaaneder?.map { GUIarbeidsInntektMaaned ->
49+
private fun mapToInntektkomponentResponse(inntekterDto: InntekterDto): InntektkomponentResponse {
50+
val arbeidsInntektMaaneder: MutableList<ArbeidsInntektMaaned> = mutableListOf()
51+
52+
inntekterDto.virksomheter.forEach { virksomhet ->
53+
arbeidsInntektMaaneder.addAll(
54+
virksomhet.inntekter?.map {
55+
ArbeidsInntektMaaned(
56+
it.aarMaaned,
57+
virksomhet.avvikListe,
58+
ArbeidsInntektInformasjon(
59+
virksomhet.inntekter.map { inntektMaaned ->
60+
Inntekt(
61+
inntektMaaned.belop,
62+
inntektMaaned.inntektskilde,
63+
inntektMaaned.beskrivelse,
64+
inntektMaaned.inntektskilde,
65+
inntektMaaned.inntektsstatus,
66+
inntektMaaned.inntektsperiodetype ?: "Maaned",
67+
inntektMaaned.leveringstidspunkt,
68+
inntektMaaned.opptjeningsland,
69+
inntektMaaned.opptjeningsperiode,
70+
inntektMaaned.skattemessigBosattLand,
71+
inntektMaaned.utbetaltIMaaned,
72+
// TODO: Er det mottaker som skal brukes her?
73+
mapToAktoerNaturligIdent(inntekterDto.mottaker.fnr),
74+
// TODO: Er det virksomhet som skal brukes her?
75+
mapToAktoerOrganisasjon(virksomhet),
76+
mapToAktoerOrganisasjon(virksomhet),
77+
mapToAktoerNaturligIdent(inntekterDto.mottaker.fnr),
78+
inntektMaaned.inngaarIGrunnlagForTrekk,
79+
inntektMaaned.utloeserArbeidsgiveravgift,
80+
inntektMaaned.informasjonsstatus,
81+
inntektMaaned.inntektType,
82+
inntektMaaned.tilleggsinformasjon,
83+
)
84+
},
85+
),
86+
)
87+
} ?: listOf(),
88+
)
89+
}
90+
91+
return InntektkomponentResponse(
92+
arbeidsInntektMaaneder,
93+
mapToAktoerNaturligIdent(inntekterDto.mottaker.fnr),
94+
)
95+
}
96+
97+
private fun mapToAktoerOrganisasjon(virksomhet: Virksomhet): Aktoer = Aktoer(AktoerType.ORGANISASJON, virksomhet.virksomhetsnummer)
98+
99+
private fun mapToAktoerNaturligIdent(fnr: String?): Aktoer =
100+
Aktoer(AktoerType.NATURLIG_IDENT, fnr ?: throw IllegalArgumentException("Fødselsenummer mangler"))
101+
102+
private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektMaaned>?): List<ArbeidsInntektMaaned>? =
103+
arbeidsMaaneder?.map { guiArbeidsInntektMaaned ->
41104
ArbeidsInntektMaaned(
42-
GUIarbeidsInntektMaaned.aarMaaned,
43-
GUIarbeidsInntektMaaned.avvikListe,
105+
guiArbeidsInntektMaaned.aarMaaned,
106+
guiArbeidsInntektMaaned.avvikListe,
44107
ArbeidsInntektInformasjon(
45-
GUIarbeidsInntektMaaned.arbeidsInntektInformasjon?.inntektListe?.map { inntekt ->
108+
guiArbeidsInntektMaaned.arbeidsInntektInformasjon?.inntektListe?.map { inntekt ->
46109
val datagrunnlagForVerdikode: DatagrunnlagKlassifisering = dataGrunnlag(inntekt.verdikode)
47110
Inntekt(
48111
inntekt.beloep,
@@ -78,4 +141,3 @@ private fun mapToArbeidsInntektMaaneder(arbeidsMaaneder: List<GUIArbeidsInntektM
78141
),
79142
)
80143
}
81-
}

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

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@ import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Avvik
55
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektBeskrivelse
66
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektType
77
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentResponse
8+
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.Periode
89
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.TilleggInformasjon
910
import java.math.BigDecimal
1011
import java.time.YearMonth
1112

1213
fun InntektkomponentResponse.mapToFrontend(
1314
person: Inntektsmottaker,
1415
organisasjonsInfoListe: MutableList<OrganisasjonNavnOgIdMapping>,
15-
): InntekterResponse {
16+
): InntekterDto {
1617
val inntekt = arbeidsInntektMaaned
17-
val virksomhetListe: MutableList<Virksomhet> = mutableListOf()
18+
val virksomheter: MutableList<Virksomhet> = mutableListOf()
1819

1920
inntekt?.forEach { arbeidsInntektMaaned ->
2021
val inntektsInformasjon = arbeidsInntektMaaned.arbeidsInntektInformasjon
@@ -34,10 +35,12 @@ fun InntektkomponentResponse.mapToFrontend(
3435
fordel = inntekt.fordel,
3536
beskrivelse = inntekt.beskrivelse,
3637
inntektsstatus = inntekt.inntektsstatus,
38+
inntektsperiodetype = inntekt.inntektsperiodetype,
3739
utbetaltIMaaned = inntekt.utbetaltIMaaned,
3840
inntektType = inntekt.inntektType,
3941
leveringstidspunkt = inntekt.leveringstidspunkt,
4042
opptjeningsland = inntekt.opptjeningsland,
43+
opptjeningsperiode = inntekt.opptjeningsperiode,
4144
skattemessigBosattLand = inntekt.skattemessigBosattLand,
4245
inntektsinnsender = inntekt.inntektsinnsender,
4346
virksomhet = inntekt.virksomhet,
@@ -50,7 +53,7 @@ fun InntektkomponentResponse.mapToFrontend(
5053
)
5154

5255
val eksisterendeVirksomhet =
53-
virksomhetListe.find { it.virksomhetsnummer == virksomhet?.identifikator }
56+
virksomheter.find { it.virksomhetsnummer == virksomhet?.identifikator }
5457
if (eksisterendeVirksomhet != null) {
5558
eksisterendeVirksomhet.inntekter?.addAll(inntekter)
5659
eksisterendeVirksomhet.periode =
@@ -60,7 +63,7 @@ fun InntektkomponentResponse.mapToFrontend(
6063
)
6164
eksisterendeVirksomhet.totalBeløp = eksisterendeVirksomhet.inntekter.sumOf { it.belop }
6265
} else {
63-
virksomhetListe.add(
66+
virksomheter.add(
6467
Virksomhet(
6568
virksomhetsnummer = virksomhet?.identifikator ?: "",
6669
virksomhetsnavn = virksomhetNavn,
@@ -79,14 +82,14 @@ fun InntektkomponentResponse.mapToFrontend(
7982
}
8083
}
8184

82-
return InntekterResponse(
83-
virksomhetsinntekt = virksomhetListe,
85+
return InntekterDto(
86+
virksomheter = virksomheter,
8487
mottaker = person,
8588
)
8689
}
8790

88-
data class InntekterResponse(
89-
val virksomhetsinntekt: List<Virksomhet>,
91+
data class InntekterDto(
92+
val virksomheter: List<Virksomhet>,
9093
val mottaker: Inntektsmottaker,
9194
)
9295

@@ -110,8 +113,10 @@ data class InntektMaaned(
110113
val beskrivelse: InntektBeskrivelse,
111114
val inntektskilde: String,
112115
val inntektsstatus: String,
116+
val inntektsperiodetype: String?,
113117
val leveringstidspunkt: YearMonth? = null,
114118
val opptjeningsland: String? = null,
119+
val opptjeningsperiode: Periode? = null,
115120
val skattemessigBosattLand: String? = null,
116121
val utbetaltIMaaned: YearMonth,
117122
val inntektsinnsender: Aktoer? = null,

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import no.nav.dagpenger.inntekt.inntektskomponenten.v1.AktoerType
2828
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektkomponentRequest
2929
import no.nav.dagpenger.inntekt.inntektskomponenten.v1.InntektskomponentClient
3030
import no.nav.dagpenger.inntekt.mapping.GUIInntekt
31+
import no.nav.dagpenger.inntekt.mapping.InntekterDto
3132
import no.nav.dagpenger.inntekt.mapping.Inntektsmottaker
3233
import no.nav.dagpenger.inntekt.mapping.OrganisasjonNavnOgIdMapping
3334
import no.nav.dagpenger.inntekt.mapping.dataGrunnlagKlassifiseringToVerdikode
@@ -167,6 +168,40 @@ fun Route.uklassifisertInntekt(
167168
}
168169
}
169170
}
171+
post {
172+
withContext(Dispatchers.IO) {
173+
mapToStoredInntekt(
174+
inntekterDto = call.receive<InntekterDto>(),
175+
inntektId = call.parameters["inntektId"]!!,
176+
).let {
177+
val person = personOppslag.hentPerson(it.inntekt.ident.identifikator)
178+
inntektStore.storeInntekt(
179+
StoreInntektCommand(
180+
inntektparametre =
181+
Inntektparametre(
182+
aktørId = person.aktørId,
183+
fødselsnummer = person.fødselsnummer,
184+
// TODO: Hent ut dette fra databasen: RegelKontekst(this.kontekstId, this.kontekstType),
185+
regelkontekst = RegelKontekst("KONTEKSTID", "KONTEKSTTYPE"),
186+
// TODO: Hent ut dette fra databasen også.
187+
beregningsdato = LocalDate.now(),
188+
),
189+
inntekt = it.inntekt,
190+
manueltRedigert =
191+
ManueltRedigert.from(
192+
// TODO: Riktig verdi her, alltid true, kanskje?
193+
true,
194+
call.getSubject(),
195+
),
196+
),
197+
)
198+
}.let {
199+
call.respond(HttpStatusCode.OK)
200+
}.also {
201+
inntektKorrigeringCounter.inc()
202+
}
203+
}
204+
}
170205
}
171206

172207
route("/uklassifisert/uncached/{aktørId}/{kontekstType}/{kontekstId}/{beregningsDato}") {

dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/mapping/MapToInntektFrontendTest.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ val inntektkomponentResponse =
166166

167167
val mottaker =
168168
Inntektsmottaker(
169-
pnr = "2044350291600",
169+
fnr = "2044350291600",
170170
navn = "Ola Nordmann",
171171
)
172172

@@ -191,39 +191,39 @@ class MapToInntektFrontendTest {
191191
organisasjonNavnOgIdMappingForTesting,
192192
)
193193

194-
assertEquals(2, mappedToInntektFrontend.virksomhetsinntekt.size)
194+
assertEquals(2, mappedToInntektFrontend.virksomheter.size)
195195
assertEquals(mottaker, mappedToInntektFrontend.mottaker)
196196

197-
assertTrue { mappedToInntektFrontend.virksomhetsinntekt.any { it.virksomhetsnummer == "896929119" } }
198-
assertTrue { mappedToInntektFrontend.virksomhetsinntekt.any { it.virksomhetsnummer == "896929120" } }
199-
assertFalse { mappedToInntektFrontend.virksomhetsinntekt.any { it.virksomhetsnummer == "8969291001" } }
197+
assertTrue { mappedToInntektFrontend.virksomheter.any { it.virksomhetsnummer == "896929119" } }
198+
assertTrue { mappedToInntektFrontend.virksomheter.any { it.virksomhetsnummer == "896929120" } }
199+
assertFalse { mappedToInntektFrontend.virksomheter.any { it.virksomhetsnummer == "8969291001" } }
200200

201201
assertEquals(
202202
2,
203-
mappedToInntektFrontend.virksomhetsinntekt
203+
mappedToInntektFrontend.virksomheter
204204
.filter { it.virksomhetsnummer == "896929119" }[0]
205205
.inntekter
206206
?.size,
207207
)
208208

209209
assertEquals(
210210
BigDecimal(100000),
211-
mappedToInntektFrontend.virksomhetsinntekt
211+
mappedToInntektFrontend.virksomheter
212212
.filter { it.virksomhetsnummer == "896929119" }[0]
213213
.totalBeløp,
214214
)
215215

216216
assertEquals(
217217
1,
218-
mappedToInntektFrontend.virksomhetsinntekt
218+
mappedToInntektFrontend.virksomheter
219219
.filter { it.virksomhetsnummer == "896929120" }[0]
220220
.inntekter
221221
?.size,
222222
)
223223

224224
assertEquals(
225225
BigDecimal(50000),
226-
mappedToInntektFrontend.virksomhetsinntekt
226+
mappedToInntektFrontend.virksomheter
227227
.filter { it.virksomhetsnummer == "896929120" }[0]
228228
.totalBeløp,
229229
)
@@ -332,9 +332,9 @@ class MapToInntektFrontendTest {
332332

333333
val mapTilFrontendMedNullVirksomhet =
334334
inntektkomponentResponseMedTomVirksomhet.mapToFrontend(mottaker, organisasjonNavnOgIdMappingForTesting)
335-
assertEquals(3, mapTilFrontendMedNullVirksomhet.virksomhetsinntekt.size)
336-
assertEquals(2, mapTilFrontendMedNullVirksomhet.virksomhetsinntekt.filter { it.virksomhetsnummer == "" }.size)
337-
assertEquals(1, mapTilFrontendMedNullVirksomhet.virksomhetsinntekt.filter { it.virksomhetsnummer == "896929120" }.size)
335+
assertEquals(3, mapTilFrontendMedNullVirksomhet.virksomheter.size)
336+
assertEquals(2, mapTilFrontendMedNullVirksomhet.virksomheter.filter { it.virksomhetsnummer == "" }.size)
337+
assertEquals(1, mapTilFrontendMedNullVirksomhet.virksomheter.filter { it.virksomhetsnummer == "896929120" }.size)
338338

339339
jacksonObjectMapper.writeValueAsString(mapTilFrontendMedNullVirksomhet)
340340
println(

dp-inntekt-api/src/test/kotlin/no/nav/dagpenger/inntekt/v1/UklassifisertInntektRouteTest.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import no.nav.dagpenger.inntekt.mapping.GUIArbeidsInntektMaaned
3333
import no.nav.dagpenger.inntekt.mapping.GUIInntekt
3434
import no.nav.dagpenger.inntekt.mapping.GUIInntektsKomponentResponse
3535
import no.nav.dagpenger.inntekt.mapping.InntektMedVerdikode
36-
import no.nav.dagpenger.inntekt.mapping.InntekterResponse
36+
import no.nav.dagpenger.inntekt.mapping.InntekterDto
3737
import no.nav.dagpenger.inntekt.oppslag.Person
3838
import no.nav.dagpenger.inntekt.oppslag.PersonOppslag
3939
import no.nav.dagpenger.inntekt.oppslag.enhetsregister.EnhetsregisterClient
@@ -487,13 +487,13 @@ internal class UklassifisertInntektRouteTest {
487487

488488
assertEquals(HttpStatusCode.OK, response.status)
489489
val storedInntekt =
490-
jacksonObjectMapper.readValue<InntekterResponse>(response.bodyAsText())
491-
assertEquals(2, storedInntekt.virksomhetsinntekt.size)
492-
assertEquals(4, storedInntekt.virksomhetsinntekt[0].inntekter?.size)
493-
assertEquals("1111111", storedInntekt.virksomhetsinntekt.first().virksomhetsnummer)
494-
assertEquals("Test Org", storedInntekt.virksomhetsinntekt.first().virksomhetsnavn)
495-
assertEquals("2222222", storedInntekt.virksomhetsinntekt[1].virksomhetsnummer)
496-
assertEquals("", storedInntekt.virksomhetsinntekt[1].virksomhetsnavn)
490+
jacksonObjectMapper.readValue<InntekterDto>(response.bodyAsText())
491+
assertEquals(2, storedInntekt.virksomheter.size)
492+
assertEquals(4, storedInntekt.virksomheter[0].inntekter?.size)
493+
assertEquals("1111111", storedInntekt.virksomheter.first().virksomhetsnummer)
494+
assertEquals("Test Org", storedInntekt.virksomheter.first().virksomhetsnavn)
495+
assertEquals("2222222", storedInntekt.virksomheter[1].virksomhetsnummer)
496+
assertEquals("", storedInntekt.virksomheter[1].virksomhetsnavn)
497497
}
498498
}
499499
}

0 commit comments

Comments
 (0)