diff --git a/.nais/feature.yaml b/.nais/feature.yaml index 8e6f3c609..ffddcc5e3 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 + 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 @@ -32,6 +34,7 @@ database: autoResize: false tier: db-f1-micro outbound-access-apps: + - bidrag-person - bidrag-beregn-forskudd-rest-feature - bidrag-grunnlag-feature - bidrag-dokument-forsendelse-feature diff --git a/.nais/main.yaml b/.nais/main.yaml index 42f1f80b7..eaaab7e4e 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 + 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 @@ -32,6 +34,7 @@ database: autoResize: false tier: db-f1-micro outbound-access-apps: + - bidrag-person - bidrag-beregn-forskudd-rest - bidrag-grunnlag - bidrag-dokument-forsendelse diff --git a/.nais/prod.yaml b/.nais/prod.yaml index a9c3a9b7e..e7cacfbec 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 + 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 @@ -31,6 +33,7 @@ database: autoResize: false tier: db-custom-1-3840 outbound-access-apps: + - bidrag-person - bidrag-beregn-forskudd-rest - bidrag-grunnlag - bidrag-dokument-forsendelse 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 0ee0d18d3..71957c387 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/test/kotlin/no/nav/bidrag/behandling/service/BehandlingServiceTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/service/BehandlingServiceTest.kt index a75eaa25d..8e72c5259 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/service/BehandlingServiceTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/service/BehandlingServiceTest.kt @@ -114,7 +114,7 @@ class BehandlingServiceTest : TestContainerRunner() { ), ) - assertEquals(2, behandlingService.hentBehandlingById(b.id!!).roller.filter { r -> r.rolleType == Rolletype.BARN }.size) + assertEquals(2, behandlingService.hentBehandlingById(b.id!!).getSøknadsBarn().size) } @Test 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