diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml
index 99619b3dc..d5c1f6d5b 100644
--- a/.github/workflows/pr.yaml
+++ b/.github/workflows/pr.yaml
@@ -1,8 +1,10 @@
name: Deploy to dev
on:
+ workflow_dispatch:
pull_request:
types: [ ready_for_review, opened, synchronize ]
branches:
+ - '**'
- '!dependabot/**'
env:
diff --git a/.nais/feature.yaml b/.nais/feature.yaml
index 8e6f3c609..c38b26335 100644
--- a/.nais/feature.yaml
+++ b/.nais/feature.yaml
@@ -2,6 +2,8 @@ name: bidrag-behandling-feature
ingresses:
- https://bidrag-behandling-feature.intern.dev.nav.no
env:
+ BIDRAG_PERSON_URL: https://bidrag-person-feature.dev-fss-pub.nais.io/bidrag-person
+ BIDRAG_PERSON_SCOPE: dev-fss.bidrag.bidrag-person-feature
BIDRAG_BEREGN_FORSKUDD_URL: http://bidrag-beregn-forskudd-rest-feature
BIDRAG_BEREGN_FORSKUDD_SCOPE: dev-gcp.bidrag.bidrag-beregn-forskudd-rest-feature
BIDRAG_GRUNNLAG_URL: http://bidrag-grunnlag-feature
@@ -35,4 +37,6 @@ outbound-access-apps:
- bidrag-beregn-forskudd-rest-feature
- bidrag-grunnlag-feature
- bidrag-dokument-forsendelse-feature
- - bidrag-tilgangskontroll-feature
\ No newline at end of file
+ - bidrag-tilgangskontroll-feature
+outbound-access-hosts:
+ - bidrag-person-feature.dev-fss-pub.nais.io
\ No newline at end of file
diff --git a/.nais/main.yaml b/.nais/main.yaml
index 42f1f80b7..3f9cbb996 100644
--- a/.nais/main.yaml
+++ b/.nais/main.yaml
@@ -2,6 +2,8 @@ name: bidrag-behandling
ingresses:
- https://bidrag-behandling.intern.dev.nav.no
env:
+ BIDRAG_PERSON_URL: https://bidrag-person.dev-fss-pub.nais.io/bidrag-person
+ BIDRAG_PERSON_SCOPE: dev-fss.bidrag.bidrag-person
BIDRAG_BEREGN_FORSKUDD_URL: http://bidrag-beregn-forskudd-rest
BIDRAG_BEREGN_FORSKUDD_SCOPE: dev-gcp.bidrag.bidrag-beregn-forskudd-rest
BIDRAG_GRUNNLAG_URL: http://bidrag-grunnlag
@@ -35,4 +37,6 @@ outbound-access-apps:
- bidrag-beregn-forskudd-rest
- bidrag-grunnlag
- bidrag-dokument-forsendelse
- - bidrag-tilgangskontroll
\ No newline at end of file
+ - bidrag-tilgangskontroll
+outbound-access-hosts:
+ - bidrag-person.dev-fss-pub.nais.io
\ No newline at end of file
diff --git a/.nais/prod.yaml b/.nais/prod.yaml
index a9c3a9b7e..773b1874e 100644
--- a/.nais/prod.yaml
+++ b/.nais/prod.yaml
@@ -2,6 +2,8 @@ name: bidrag-behandling
ingresses:
- https://bidrag-behandling.intern.nav.no
env:
+ BIDRAG_PERSON_URL: https://bidrag-person.prod-fss-pub.nais.io/bidrag-person
+ BIDRAG_PERSON_SCOPE: prod-fss.bidrag.bidrag-person
BIDRAG_BEREGN_FORSKUDD_URL: http://bidrag-beregn-forskudd-rest
BIDRAG_BEREGN_FORSKUDD_SCOPE: prod-gcp.bidrag.bidrag-beregn-forskudd-rest
BIDRAG_GRUNNLAG_URL: http://bidrag-grunnlag
@@ -34,4 +36,6 @@ outbound-access-apps:
- bidrag-beregn-forskudd-rest
- bidrag-grunnlag
- bidrag-dokument-forsendelse
- - bidrag-tilgangskontroll
\ No newline at end of file
+ - bidrag-tilgangskontroll
+outbound-access-hosts:
+ - bidrag-person.prod-fss-pub.nais.io
\ No newline at end of file
diff --git a/README.md b/README.md
index 2abd48f98..2b2ef0a92 100644
--- a/README.md
+++ b/README.md
@@ -21,6 +21,7 @@ Et lokalt Dockermiljø må være tilgjengelig for lokal kjøring. Forebredelsess
Profil: local (angis i program arguments)
Start opp applikasjonen ved å kjøre [BidragTemplateLocal.kt](src/test/kotlin/no/nav/bidrag/behandling/BidragSpringAppLocal.kt).
+
Dette starter applikasjonen med profil `local` og henter miljøvariabler for Q1 miljøet fra filen [application-local.yaml](src/test/resources/application-local.yaml).
Her mangler det noen miljøvariabler som ikke bør committes til Git (Miljøvariabler for passord/secret osv).
diff --git a/src/main/kotlin/no/nav/bidrag/behandling/aop/DefaultRestControllerAdvice.kt b/src/main/kotlin/no/nav/bidrag/behandling/aop/DefaultRestControllerAdvice.kt
index 7f5cdca02..e9a6e057e 100644
--- a/src/main/kotlin/no/nav/bidrag/behandling/aop/DefaultRestControllerAdvice.kt
+++ b/src/main/kotlin/no/nav/bidrag/behandling/aop/DefaultRestControllerAdvice.kt
@@ -98,6 +98,6 @@ class DefaultRestControllerAdvice {
val (objectName, field) = it.destructured
"$objectName.$field"
}
- return "${paths.joinToString("->")} kan ikke være null"
+ return "${paths.joinToString("->")} må fylles ut"
}
}
diff --git a/src/main/kotlin/no/nav/bidrag/behandling/beregning/ForskuddBeregning.kt b/src/main/kotlin/no/nav/bidrag/behandling/beregning/ForskuddBeregning.kt
index 62444cac1..91dfa9827 100644
--- a/src/main/kotlin/no/nav/bidrag/behandling/beregning/ForskuddBeregning.kt
+++ b/src/main/kotlin/no/nav/bidrag/behandling/beregning/ForskuddBeregning.kt
@@ -15,7 +15,6 @@ import no.nav.bidrag.behandling.database.datamodell.Rolle
import no.nav.bidrag.behandling.database.datamodell.SivilstandType
import no.nav.bidrag.behandling.transformers.INFINITY
import no.nav.bidrag.behandling.transformers.toCompactString
-import no.nav.bidrag.behandling.transformers.toLocalDate
import no.nav.bidrag.behandling.transformers.toNoString
import no.nav.bidrag.beregn.felles.enums.BostatusKode
import no.nav.bidrag.beregn.felles.enums.SivilstandKode
@@ -28,8 +27,7 @@ import java.time.LocalDate
@Service
class ForskuddBeregning {
-
- private fun prepareSoknadsBarn(soknadBarn: Rolle): List =
+ private fun prepareSoknadsBarn(soknadBarn: Rolle, fDato: String): List =
listOf(
Grunnlag(
referanse = "Mottatt_SoknadsbarnInfo_SB" + soknadBarn.id,
@@ -37,7 +35,7 @@ class ForskuddBeregning {
innhold = POJONode(
SoknadsBarnNode(
soknadsbarnId = soknadBarn.id!!.toInt(),
- fodselsdato = soknadBarn.fodtDato?.toLocalDate()?.toNoString(),
+ fodselsdato = fDato,
),
),
),
@@ -52,7 +50,11 @@ class ForskuddBeregning {
BostatusKode.BOR_IKKE_MED_FORELDRE
}
- private fun prepareBostatus(husstandsBarnPerioder: List, soknadsBarnIdent: String, soknadBarn: Rolle): List =
+ private fun prepareBostatus(
+ husstandsBarnPerioder: List,
+ soknadsBarnIdent: String,
+ soknadBarn: Rolle
+ ): List =
husstandsBarnPerioder
.filter { soknadsBarnIdent == it.ident }
.map {
@@ -211,20 +213,19 @@ class ForskuddBeregning {
roller = behandling.roller,
)
- fun toPayload(b: BehandlingBeregningModel, soknadsBarn: Rolle): BeregnGrunnlag =
+ fun toPayload(b: BehandlingBeregningModel, soknadsBarn: Rolle, fDato: String): BeregnGrunnlag =
BeregnGrunnlag(
beregnDatoFra = b.virkningsDato,
beregnDatoTil = b.datoTom,
- grunnlagListe = prepareSoknadsBarn(soknadsBarn) +
- prepareBarnIHusstand(b) +
- prepareBostatus(b.husstandsBarnPerioder, soknadsBarn.ident, soknadsBarn) +
- prepareInntekterForBeregning(
- b.inntekter,
- b.barnetillegg,
- b.utvidetbarnetrygd,
- ) +
- prepareSivilstand(b.sivilstand),
-
+ grunnlagListe = prepareSoknadsBarn(soknadsBarn, fDato) +
+ prepareBarnIHusstand(b) +
+ prepareBostatus(b.husstandsBarnPerioder, soknadsBarn.ident, soknadsBarn) +
+ prepareInntekterForBeregning(
+ b.inntekter,
+ b.barnetillegg,
+ b.utvidetbarnetrygd,
+ ) +
+ prepareSivilstand(b.sivilstand),
)
}
@@ -254,7 +255,7 @@ data class BostatusNode(
data class SoknadsBarnNode(
val soknadsbarnId: Int,
- val fodselsdato: String?,
+ val fodselsdato: String,
)
data class InntektNode(
diff --git a/src/main/kotlin/no/nav/bidrag/behandling/beregning/model/BehandlingBeregningModel.kt b/src/main/kotlin/no/nav/bidrag/behandling/beregning/model/BehandlingBeregningModel.kt
index 9ebff4052..d999e8b20 100644
--- a/src/main/kotlin/no/nav/bidrag/behandling/beregning/model/BehandlingBeregningModel.kt
+++ b/src/main/kotlin/no/nav/bidrag/behandling/beregning/model/BehandlingBeregningModel.kt
@@ -57,17 +57,17 @@ data class BehandlingBeregningModel private constructor(
behandlingId
},
{
- ensure(virkningsDato != null) { raise("Behandling virkningsDato kan ikke være null") }
+ ensure(virkningsDato != null) { raise("Behandling virkningsDato må fylles ut") }
virkningsDato.toLocalDate()
},
{
- ensure(datoTom != null) { raise("Behandling datoTom kan ikke være null") }
+ ensure(datoTom != null) { raise("Behandling Dato Til må fylles ut") }
datoTom.toLocalDate()
},
{
mapOrAccumulate(sivilstand) {
SivilstandModel(
- it.datoFom?.toLocalDate() ?: raise("Sivilstands datoFom kan ikke være null"),
+ it.datoFom?.toLocalDate() ?: raise("Sivilstand Dato Fra må fylles ut"),
it.datoTom?.toLocalDate(),
it.sivilstandType,
)
@@ -76,11 +76,10 @@ data class BehandlingBeregningModel private constructor(
{
mapOrAccumulate(inntekter.filter { it.taMed }) {
InntektModel(
- inntektType = it.inntektType ?: "INNTEKTSOPPLYSNINGER_ARBEIDSGIVER", // TODO -> DETTE ER KUN MIDLERTIDIG
-// inntektType = it.inntektType ?: raise("InntektType kan ikke være null"),
+ inntektType = it.inntektType ?: raise("InntektType kan ikke være null"),
belop = it.belop,
rolle = roller.rolleType(it.ident),
- datoFom = it.datoFom?.toLocalDate() ?: raise("Inntekts datoFom kan ikke være null"),
+ datoFom = it.datoFom?.toLocalDate() ?: raise("Inntekts Dato Fra må fylles ut"),
datoTom = it.datoTom?.toLocalDate(),
)
}
@@ -88,7 +87,7 @@ data class BehandlingBeregningModel private constructor(
{
mapOrAccumulate(barnetillegg) {
BarnetilleggModel(
- datoFom = it.datoFom?.toLocalDate() ?: raise("Barnetillegg datoFom kan ikke være null"),
+ datoFom = it.datoFom?.toLocalDate() ?: raise("Barnetillegg Dato Fra må fylles ut"),
datoTom = it.datoTom?.toLocalDate(),
belop = it.barnetillegg,
)
@@ -97,7 +96,7 @@ data class BehandlingBeregningModel private constructor(
{
mapOrAccumulate(utvidetbarnetrygd) {
UtvidetbarnetrygdModel(
- datoFom = it.datoFom?.toLocalDate() ?: raise("Utvidetbarnetrygd datoFom kan ikke være null"),
+ datoFom = it.datoFom?.toLocalDate() ?: raise("Utvidetbarnetrygd Dato Fra må fylles ut"),
datoTom = it.datoTom?.toLocalDate(),
belop = it.belop,
)
@@ -109,7 +108,7 @@ data class BehandlingBeregningModel private constructor(
.flatMap { it.perioder },
) {
HusstandsBarnPeriodeModel(
- datoFom = it.datoFom?.toLocalDate() ?: raise("HusstandsBarnPeriode datoFom kan ikke være null"),
+ datoFom = it.datoFom?.toLocalDate() ?: raise("HusstandsBarnPeriode Dato Fra må fylles ut"),
datoTom = it.datoTom?.toLocalDate(),
ident = it.husstandsBarn.ident,
boStatus = it.boStatus,
diff --git a/src/main/kotlin/no/nav/bidrag/behandling/config/CacheConfig.kt b/src/main/kotlin/no/nav/bidrag/behandling/config/CacheConfig.kt
index 83927f54c..af7a31bc5 100644
--- a/src/main/kotlin/no/nav/bidrag/behandling/config/CacheConfig.kt
+++ b/src/main/kotlin/no/nav/bidrag/behandling/config/CacheConfig.kt
@@ -17,6 +17,7 @@ import java.util.concurrent.TimeUnit
@EnableUserCache
class CacheConfig {
companion object {
+ const val PERSON_CACHE = "PERSON_CACHE"
const val SAK_CACHE = "SAK_CACHE"
const val TILGANG_TEMA_CACHE = "TILGANG_TEMA_CACHE"
const val TILGANG_PERSON_CACHE = "TILGANG_PERSON_CACHE"
@@ -26,6 +27,7 @@ class CacheConfig {
@Bean
fun cacheManager(): CacheManager {
val caffeineCacheManager = CaffeineCacheManager()
+ caffeineCacheManager.registerCustomCache(PERSON_CACHE, Caffeine.newBuilder().expireAfter(InvaliderCacheFørStartenAvArbeidsdag()).build())
caffeineCacheManager.registerCustomCache(TILGANG_TEMA_CACHE, Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).build())
caffeineCacheManager.registerCustomCache(TILGANG_PERSON_CACHE, Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).build())
caffeineCacheManager.registerCustomCache(TILGANG_SAK_CACHE, Caffeine.newBuilder().expireAfterWrite(1, TimeUnit.HOURS).build())
diff --git a/src/main/kotlin/no/nav/bidrag/behandling/consumer/BidragPersonConsumer.kt b/src/main/kotlin/no/nav/bidrag/behandling/consumer/BidragPersonConsumer.kt
new file mode 100644
index 000000000..aba70bd8e
--- /dev/null
+++ b/src/main/kotlin/no/nav/bidrag/behandling/consumer/BidragPersonConsumer.kt
@@ -0,0 +1,28 @@
+package no.nav.bidrag.behandling.consumer
+
+import no.nav.bidrag.behandling.config.CacheConfig.Companion.PERSON_CACHE
+import no.nav.bidrag.behandling.dto.HentPersonRequest
+import no.nav.bidrag.behandling.dto.HentPersonResponse
+import no.nav.bidrag.commons.cache.BrukerCacheable
+import no.nav.bidrag.commons.web.client.AbstractRestClient
+import org.springframework.beans.factory.annotation.Qualifier
+import org.springframework.beans.factory.annotation.Value
+import org.springframework.stereotype.Service
+import org.springframework.web.client.RestTemplate
+import org.springframework.web.util.UriComponentsBuilder
+import java.net.URI
+
+@Service
+class BidragPersonConsumer(
+ @Value("\${BIDRAG_PERSON_URL}") bidragPersonUrl: URI,
+ @Qualifier("azure") restTemplate: RestTemplate,
+) : AbstractRestClient(restTemplate, "bidrag-person") {
+
+ private val hentPersonUri =
+ UriComponentsBuilder.fromUri(bidragPersonUrl).pathSegment("informasjon").build().toUri()
+
+ @BrukerCacheable(PERSON_CACHE)
+ fun hentPerson(ident: String): HentPersonResponse {
+ return postForNonNullEntity(hentPersonUri, HentPersonRequest(ident))
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/no/nav/bidrag/behandling/controller/BehandlingBeregnForskuddController.kt b/src/main/kotlin/no/nav/bidrag/behandling/controller/BehandlingBeregnForskuddController.kt
index 46c9352df..fd9ecdada 100644
--- a/src/main/kotlin/no/nav/bidrag/behandling/controller/BehandlingBeregnForskuddController.kt
+++ b/src/main/kotlin/no/nav/bidrag/behandling/controller/BehandlingBeregnForskuddController.kt
@@ -7,10 +7,12 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement
import mu.KotlinLogging
import no.nav.bidrag.behandling.beregning.ForskuddBeregning
import no.nav.bidrag.behandling.consumer.BidragBeregnForskuddConsumer
+import no.nav.bidrag.behandling.consumer.BidragPersonConsumer
import no.nav.bidrag.behandling.dto.beregning.ForskuddBeregningPerBarn
import no.nav.bidrag.behandling.dto.beregning.ForskuddBeregningRespons
import no.nav.bidrag.behandling.service.BehandlingService
-import no.nav.bidrag.domain.enums.Rolletype
+import no.nav.bidrag.behandling.transformers.toLocalDate
+import no.nav.bidrag.behandling.transformers.toNoString
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.client.HttpClientErrorException
@@ -23,6 +25,7 @@ class BehandlingBeregnForskuddController(
private val behandlingService: BehandlingService,
private val bidragBeregnForskuddConsumer: BidragBeregnForskuddConsumer,
private val forskuddBeregning: ForskuddBeregning,
+ private val bidragPersonConsumer: BidragPersonConsumer
) {
private fun isPeriodOneWithinPeriodTwo(
datoFom1: LocalDate?,
@@ -49,10 +52,13 @@ class BehandlingBeregnForskuddController(
val behandlingModel = forskuddBeregning.toBehandlingBeregningModel(behandling).bind()
val results =
behandling
- .roller
- .filter { Rolletype.BARN == it.rolleType }
+ .getSøknadsBarn()
.mapOrAccumulate {
- val payload = forskuddBeregning.toPayload(behandlingModel, it)
+ val fDato = if (it.fodtDato == null) {
+ bidragPersonConsumer.hentPerson(it.ident).fødselsdato
+ } else it.fodtDato.toLocalDate().toNoString()
+
+ val payload = forskuddBeregning.toPayload(behandlingModel, it, fDato)
try {
val respons =
diff --git a/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Behandling.kt b/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Behandling.kt
index 070f7ace9..2b608221d 100644
--- a/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Behandling.kt
+++ b/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Behandling.kt
@@ -11,6 +11,7 @@ import jakarta.persistence.GenerationType
import jakarta.persistence.Id
import jakarta.persistence.OneToMany
import no.nav.bidrag.domain.enums.EngangsbelopType
+import no.nav.bidrag.domain.enums.Rolletype
import no.nav.bidrag.domain.enums.StonadType
import org.hibernate.annotations.SQLDelete
import org.hibernate.annotations.Where
@@ -70,4 +71,6 @@ class Behandling(
@OneToMany(fetch = FetchType.EAGER, mappedBy = "behandling", cascade = [CascadeType.ALL], orphanRemoval = true)
var utvidetbarnetrygd: MutableSet = mutableSetOf(),
var deleted: Boolean = false,
-)
+) {
+ fun getSøknadsBarn() = roller.filter { it.rolleType == Rolletype.BARN }
+}
diff --git a/src/main/kotlin/no/nav/bidrag/behandling/dto/HentPersonRequest.kt b/src/main/kotlin/no/nav/bidrag/behandling/dto/HentPersonRequest.kt
new file mode 100644
index 000000000..59ae8ed3e
--- /dev/null
+++ b/src/main/kotlin/no/nav/bidrag/behandling/dto/HentPersonRequest.kt
@@ -0,0 +1,3 @@
+package no.nav.bidrag.behandling.dto
+
+data class HentPersonRequest(val ident: String)
diff --git a/src/main/kotlin/no/nav/bidrag/behandling/dto/HentPersonResponse.kt b/src/main/kotlin/no/nav/bidrag/behandling/dto/HentPersonResponse.kt
new file mode 100644
index 000000000..49bd99bd8
--- /dev/null
+++ b/src/main/kotlin/no/nav/bidrag/behandling/dto/HentPersonResponse.kt
@@ -0,0 +1,6 @@
+package no.nav.bidrag.behandling.dto
+
+data class HentPersonResponse(
+ val ident: String,
+ val fødselsdato: String,
+)
\ No newline at end of file
diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml
index fca7df377..ed95e26b2 100644
--- a/src/main/resources/application.yaml
+++ b/src/main/resources/application.yaml
@@ -15,6 +15,15 @@ spring.config.activate.on-profile: nais,lokal-nais
no.nav.security.jwt:
client:
registration:
+ bidrag-person:
+ resource-url: ${BIDRAG_PERSON_URL}
+ token-endpoint-url: https://login.microsoftonline.com/${AZURE_APP_TENANT_ID}/oauth2/v2.0/token
+ grant-type: urn:ietf:params:oauth:grant-type:jwt-bearer
+ scope: api://${BIDRAG_PERSON_SCOPE}/.default
+ authentication:
+ client-id: ${AZURE_APP_CLIENT_ID}
+ client-secret: ${AZURE_APP_CLIENT_SECRET}
+ client-auth-method: client_secret_post
bidrag-beregn-forskudd-rest:
resource-url: ${BIDRAG_BEREGN_FORSKUDD_URL}
token-endpoint-url: https://login.microsoftonline.com/${AZURE_APP_TENANT_ID}/oauth2/v2.0/token
diff --git a/src/test/resources/application-test.yaml b/src/test/resources/application-test.yaml
index 7d9cea2d5..e85e4b07e 100644
--- a/src/test/resources/application-test.yaml
+++ b/src/test/resources/application-test.yaml
@@ -1,3 +1,4 @@
+BIDRAG_PERSON_URL: http://localhost:${wiremock.server.port}/bidrag-person
BIDRAG_BEREGN_FORSKUDD_URL: http://localhost:${wiremock.server.port}/beregn-forskudd
BIDRAG_FORSENDELSE_URL: http://localhost:${wiremock.server.port}/forsendelse
BIDRAG_TILGANGSKONTROLL_URL: http://localhost:${wiremock.server.port}/tilgangskontroll