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 2e8d96234..c621a2917 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 @@ -164,7 +164,6 @@ open class Behandling( val søknadsbarn get() = roller.filter { it.rolletype == Rolletype.BARN } val bidragsmottaker get() = roller.find { it.rolletype == Rolletype.BIDRAGSMOTTAKER } val bidragspliktig get() = roller.find { it.rolletype == Rolletype.BIDRAGSPLIKTIG } - val rolleGrunnlagSkalHentesFor get() = if (stonadstype == Stønadstype.FORSKUDD) bidragsmottaker else bidragspliktig val erVedtakFattet get() = vedtaksid != null val virkningstidspunktEllerSøktFomDato get() = virkningstidspunkt ?: søktFomDato diff --git a/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Person.kt b/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Person.kt index 4203562c9..894a98fc9 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Person.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Person.kt @@ -7,6 +7,7 @@ import jakarta.persistence.GeneratedValue import jakarta.persistence.GenerationType import jakarta.persistence.Id import jakarta.persistence.OneToMany +import no.nav.bidrag.domene.ident.Personident import java.time.LocalDate import java.time.LocalDateTime @@ -34,6 +35,10 @@ open class Person( ) open val rolle: MutableSet = mutableSetOf(), ) { + val personident get() = ident?.let { Personident(it) } ?: rolle.first().ident?.let { Personident(it) } + + val henteFødselsdato get() = fødselsdato ?: rolle.first().fødselsdato + override fun toString(): String = "Person(id=$id, ident=$ident, navn=$navn, fødselsdato=$fødselsdato, opprettet=$opprettet, roller=$rolle)" } diff --git a/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Rolle.kt b/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Rolle.kt index 0377da76e..40c38ee8f 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Rolle.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/database/datamodell/Rolle.kt @@ -90,6 +90,10 @@ open class Rolle( ) open var person: Person? = null, ) { + val personident get() = person?.ident?.let { Personident(it) } ?: this.ident?.let { Personident(it) } + + val henteFødselsdato get() = person?.fødselsdato ?: this.fødselsdato + override fun toString(): String = "Rolle(id=$id, behandling=${behandling.id}, rolletype=$rolletype, ident=$ident, fødselsdato=$fødselsdato, opprettet=$opprettet, navn=$navn, deleted=$deleted, innbetaltBeløp=$innbetaltBeløp)" } diff --git a/src/main/kotlin/no/nav/bidrag/behandling/dto/v2/behandling/BehandlingDtoV2.kt b/src/main/kotlin/no/nav/bidrag/behandling/dto/v2/behandling/BehandlingDtoV2.kt index c4526f917..75a749513 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/dto/v2/behandling/BehandlingDtoV2.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/dto/v2/behandling/BehandlingDtoV2.kt @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat import com.fasterxml.jackson.annotation.JsonIgnore import com.fasterxml.jackson.databind.annotation.JsonDeserialize import io.swagger.v3.oas.annotations.media.Schema +import no.nav.bidrag.behandling.database.datamodell.Behandling import no.nav.bidrag.behandling.dto.v1.behandling.BegrunnelseDto import no.nav.bidrag.behandling.dto.v1.behandling.RolleDto import no.nav.bidrag.behandling.dto.v1.behandling.SivilstandDto @@ -13,10 +14,12 @@ import no.nav.bidrag.behandling.dto.v2.gebyr.GebyrValideringsfeilDto import no.nav.bidrag.behandling.dto.v2.inntekt.InntekterDtoV2 import no.nav.bidrag.behandling.dto.v2.inntekt.InntektspostDtoV2 import no.nav.bidrag.behandling.dto.v2.samvær.SamværDto +import no.nav.bidrag.behandling.dto.v2.underhold.StønadTilBarnetilsynDto import no.nav.bidrag.behandling.dto.v2.underhold.UnderholdDto import no.nav.bidrag.behandling.dto.v2.utgift.MaksGodkjentBeløpDto import no.nav.bidrag.behandling.dto.v2.validering.UtgiftValideringsfeilDto import no.nav.bidrag.behandling.transformers.PeriodeDeserialiserer +import no.nav.bidrag.behandling.transformers.tilType import no.nav.bidrag.domene.enums.behandling.TypeBehandling import no.nav.bidrag.domene.enums.beregning.Resultatkode import no.nav.bidrag.domene.enums.diverse.Kilde @@ -40,6 +43,7 @@ import no.nav.bidrag.domene.util.visningsnavn import no.nav.bidrag.domene.util.visningsnavnIntern import no.nav.bidrag.organisasjon.dto.SaksbehandlerDto import no.nav.bidrag.transport.behandling.grunnlag.response.ArbeidsforholdGrunnlagDto +import no.nav.bidrag.transport.behandling.grunnlag.response.BarnetilsynGrunnlagDto import no.nav.bidrag.transport.behandling.grunnlag.response.SivilstandGrunnlagDto import java.math.BigDecimal import java.time.LocalDate @@ -246,6 +250,7 @@ data class AktiveGrunnlagsdata( val husstandsmedlem: Set, val andreVoksneIHusstanden: AndreVoksneIHusstandenGrunnlagDto? = null, val sivilstand: SivilstandAktivGrunnlagDto? = null, + val stønadTilBarnetilsyn: StønadTilBarnetilsynAktiveGrunnlagDto? = null, ) { @Deprecated("Erstattes av husstandsmedlem") @Schema(description = "Erstattes av husstandsmedlem", deprecated = true) @@ -258,6 +263,7 @@ data class IkkeAktiveGrunnlagsdata( val arbeidsforhold: Set = emptySet(), val andreVoksneIHusstanden: AndreVoksneIHusstandenGrunnlagDto? = null, val sivilstand: SivilstandIkkeAktivGrunnlagDto? = null, + val stønadTilBarnetilsyn: StønadTilBarnetilsynIkkeAktiveGrunnlagDto? = null, ) { @Deprecated("Erstattes av husstandsmedlem") @Schema(description = "Erstattes av husstandsmedlem", deprecated = true) @@ -335,6 +341,17 @@ data class SivilstandIkkeAktivGrunnlagDto( val innhentetTidspunkt: LocalDateTime = LocalDateTime.now(), ) +data class StønadTilBarnetilsynAktiveGrunnlagDto( + val grunnlag: Map> = emptyMap(), + val innhentetTidspunkt: LocalDateTime = LocalDateTime.now(), +) + +data class StønadTilBarnetilsynIkkeAktiveGrunnlagDto( + val stønadTilBarnetilsyn: Map> = emptyMap(), + val grunnlag: Map> = emptyMap(), + val innhentetTidspunkt: LocalDateTime = LocalDateTime.now(), +) + data class HusstandsmedlemGrunnlagDto( val perioder: Set, val ident: String? = null, @@ -386,7 +403,7 @@ data class AndreVoksneIHusstandenDetaljerDto( @Schema(enumAsRef = true, name = "OpplysningerType") enum class Grunnlagsdatatype( - val behandlinstypeMotRolletyper: Map> = emptyMap(), + val behandlingstypeMotRolletyper: Map> = emptyMap(), val erGjeldende: Boolean = true, ) { ARBEIDSFORHOLD( @@ -496,11 +513,11 @@ enum class Grunnlagsdatatype( when (rolletype != null) { true -> entries - .filter { it.behandlinstypeMotRolletyper.keys.contains(behandlingstype) } - .filter { it.behandlinstypeMotRolletyper.values.any { roller -> roller.contains(rolletype) } } + .filter { it.behandlingstypeMotRolletyper.keys.contains(behandlingstype) } + .filter { it.behandlingstypeMotRolletyper.values.any { roller -> roller.contains(rolletype) } } .toSet() - false -> entries.filter { it.behandlinstypeMotRolletyper.keys.contains(behandlingstype) }.toSet() + false -> entries.filter { it.behandlingstypeMotRolletyper.keys.contains(behandlingstype) }.toSet() } fun gjeldende() = Grunnlagsdatatype.entries.filter { it.erGjeldende } @@ -526,3 +543,19 @@ fun Grunnlagsdatatype.tilInntektrapporteringYtelse() = Grunnlagsdatatype.KONTANTSTØTTE -> Inntektsrapportering.KONTANTSTØTTE else -> null } + +fun Grunnlagsdatatype.innhentesForRolle(behandling: Behandling) = + when (this) { + Grunnlagsdatatype.BARNETILSYN, Grunnlagsdatatype.BOFORHOLD, Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN -> { + val t = this.behandlingstypeMotRolletyper[behandling.tilType()] + t?.let { + when (it.first()) { + Rolletype.BIDRAGSMOTTAKER -> behandling.bidragsmottaker + Rolletype.BIDRAGSPLIKTIG -> behandling.bidragspliktig + else -> null + } + } + } + + else -> null + } diff --git a/src/main/kotlin/no/nav/bidrag/behandling/dto/v2/underhold/Underhold.kt b/src/main/kotlin/no/nav/bidrag/behandling/dto/v2/underhold/Underhold.kt index eb54db260..b1774fa99 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/dto/v2/underhold/Underhold.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/dto/v2/underhold/Underhold.kt @@ -144,8 +144,8 @@ data class FaktiskTilsynsutgiftDto( data class StønadTilBarnetilsynDto( val id: Long? = null, val periode: DatoperiodeDto, - val skolealder: Skolealder, - val tilsynstype: Tilsynstype, + val skolealder: Skolealder? = null, + val tilsynstype: Tilsynstype? = null, val kilde: Kilde = Kilde.MANUELL, ) diff --git a/src/main/kotlin/no/nav/bidrag/behandling/service/BehandlingService.kt b/src/main/kotlin/no/nav/bidrag/behandling/service/BehandlingService.kt index d1dd134d9..9ddff5de9 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/service/BehandlingService.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/service/BehandlingService.kt @@ -299,6 +299,11 @@ class BehandlingService( ) { val erVirkningstidspunktEndret = request.virkningstidspunkt != behandling.virkningstidspunkt + fun oppdatereUnderhold() { + log.info { "Tilpasse perioder for underhold til ny virkningsdato i behandling ${behandling.id}" } + underholdService.tilpasseUnderholdEtterVirkningsdato(behandling) + } + fun oppdaterBoforhold() { log.info { "Virkningstidspunkt er endret. Beregner husstandsmedlemsperioder på ny for behandling ${behandling.id}" } grunnlagService.oppdaterAktiveBoforholdEtterEndretVirkningstidspunkt(behandling) @@ -353,8 +358,8 @@ class BehandlingService( oppdaterBoforhold() oppdaterAndreVoksneIHusstanden() oppdaterInntekter() + oppdatereUnderhold() oppdaterSamvær() - // TODO Underholdskostnad } } } @@ -482,7 +487,7 @@ class BehandlingService( oppdatereHusstandsmedlemmerForRoller(behandling, rollerSomLeggesTil) oppdatereSamværForRoller(behandling, rollerSomLeggesTil) - // TODO oppdater underholdskostnader ( legge til når ny barn legges til ) + // TODO: Underholdskostnad versjon 3: Opprette underholdskostnad for nytt søknadsbarn behandlingRepository.save(behandling) diff --git a/src/main/kotlin/no/nav/bidrag/behandling/service/BoforholdService.kt b/src/main/kotlin/no/nav/bidrag/behandling/service/BoforholdService.kt index c7f61085e..0cf00fe49 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/service/BoforholdService.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/service/BoforholdService.kt @@ -28,6 +28,7 @@ import no.nav.bidrag.behandling.dto.v1.behandling.BoforholdValideringsfeil import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagstype import no.nav.bidrag.behandling.dto.v2.behandling.OppdatereBegrunnelse +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.dto.v2.boforhold.OppdatereAndreVoksneIHusstanden import no.nav.bidrag.behandling.dto.v2.boforhold.OppdatereBoforholdResponse import no.nav.bidrag.behandling.dto.v2.boforhold.OppdatereHusstandsmedlem @@ -107,7 +108,7 @@ class BoforholdService( behandling = behandling, notattype = Notattype.BOFORHOLD, notattekst = request.henteNyttNotat() ?: "", - rolle = behandling.rolleGrunnlagSkalHentesFor!!, + rolle = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!, ) return OppdatereBoforholdResponse( @@ -1187,7 +1188,7 @@ class BoforholdService( data = tilJson(boforholdrespons), innhentet = LocalDateTime.now(), aktiv = LocalDateTime.now(), - rolle = behandling.rolleGrunnlagSkalHentesFor!!, + rolle = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!, gjelder = personidentBarn.verdi, ), ) diff --git a/src/main/kotlin/no/nav/bidrag/behandling/service/GrunnlagService.kt b/src/main/kotlin/no/nav/bidrag/behandling/service/GrunnlagService.kt index 12df226a5..a4b65a645 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/service/GrunnlagService.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/service/GrunnlagService.kt @@ -25,6 +25,7 @@ import no.nav.bidrag.behandling.dto.v2.behandling.AktivereGrunnlagRequestV2 import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagstype import no.nav.bidrag.behandling.dto.v2.behandling.getOrMigrate +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.lagringAvGrunnlagFeiletException import no.nav.bidrag.behandling.objectmapper import no.nav.bidrag.behandling.ressursIkkeFunnetException @@ -38,15 +39,20 @@ import no.nav.bidrag.behandling.transformers.behandling.filtrerSivilstandBeregne import no.nav.bidrag.behandling.transformers.behandling.finnEndringerBoforhold import no.nav.bidrag.behandling.transformers.behandling.hentEndringerInntekter import no.nav.bidrag.behandling.transformers.behandling.hentEndringerSivilstand +import no.nav.bidrag.behandling.transformers.behandling.henteAktiverteGrunnlag import no.nav.bidrag.behandling.transformers.behandling.henteEndringerIBoforhold +import no.nav.bidrag.behandling.transformers.behandling.henteUaktiverteGrunnlag import no.nav.bidrag.behandling.transformers.boforhold.tilBoforholdBarnRequest import no.nav.bidrag.behandling.transformers.boforhold.tilBoforholdVoksneRequest import no.nav.bidrag.behandling.transformers.boforhold.tilSivilstandRequest +import no.nav.bidrag.behandling.transformers.grunnlag.henteNyesteGrunnlag import no.nav.bidrag.behandling.transformers.grunnlag.inntekterOgYtelser import no.nav.bidrag.behandling.transformers.grunnlag.summertAinntektstyper import no.nav.bidrag.behandling.transformers.grunnlag.summertSkattegrunnlagstyper import no.nav.bidrag.behandling.transformers.inntekt.opprettTransformerInntekterRequest import no.nav.bidrag.behandling.transformers.tilType +import no.nav.bidrag.behandling.transformers.underhold.aktivereBarnetilsynHvisIngenEndringerMåAksepteres +import no.nav.bidrag.behandling.transformers.underhold.tilBarnetilsyn import no.nav.bidrag.boforhold.BoforholdApi import no.nav.bidrag.boforhold.dto.BoforholdResponseV2 import no.nav.bidrag.boforhold.dto.Bostatus @@ -64,6 +70,7 @@ import no.nav.bidrag.inntekt.InntektApi import no.nav.bidrag.sivilstand.SivilstandApi import no.nav.bidrag.sivilstand.dto.Sivilstand import no.nav.bidrag.transport.behandling.grunnlag.request.GrunnlagRequestDto +import no.nav.bidrag.transport.behandling.grunnlag.response.BarnetilsynGrunnlagDto import no.nav.bidrag.transport.behandling.grunnlag.response.FeilrapporteringDto import no.nav.bidrag.transport.behandling.grunnlag.response.HentGrunnlagDto import no.nav.bidrag.transport.behandling.grunnlag.response.RelatertPersonGrunnlagDto @@ -91,6 +98,7 @@ class GrunnlagService( private val inntektApi: InntektApi, private val inntektService: InntektService, private val mapper: Dtomapper, + private val underholdService: UnderholdService, ) { @Value("\${egenskaper.grunnlag.min-antall-minutter-siden-forrige-innhenting}") private lateinit var grenseInnhenting: String @@ -145,14 +153,17 @@ class GrunnlagService( ) { val rolleGrunnlagErInnhentetFor = when (request.grunnlagstype) { - Grunnlagsdatatype.BOFORHOLD -> behandling.rolleGrunnlagSkalHentesFor - Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN -> behandling.rolleGrunnlagSkalHentesFor + Grunnlagsdatatype.BARNETILSYN, Grunnlagsdatatype.BOFORHOLD, Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN -> + request.grunnlagstype.innhentesForRolle( + behandling, + ) + else -> - behandling.roller.find { request.personident?.verdi == it.ident } - ?: behandling.rolleGrunnlagSkalHentesFor + behandling.roller.find { request.personident == it.personident } + ?: request.grunnlagstype.innhentesForRolle(behandling) } - if (Grunnlagsdatatype.BOFORHOLD != request.grunnlagstype) { + if (!listOf(Grunnlagsdatatype.BARNETILSYN, Grunnlagsdatatype.BOFORHOLD).contains(request.grunnlagstype)) { Validate.notNull( rolleGrunnlagErInnhentetFor, "Personident oppgitt i AktivereGrunnlagRequest har ikke rolle i behandling ${behandling.id}", @@ -178,10 +189,15 @@ class GrunnlagService( if (inntekterOgYtelser.contains(request.grunnlagstype)) { aktivereYtelserOgInntekter(behandling, request.grunnlagstype, rolleGrunnlagErInnhentetFor!!) + } else if (Grunnlagsdatatype.BARNETILSYN == request.grunnlagstype) { + underholdService.oppdatereAutomatiskInnhentaStønadTilBarnetilsyn( + behandling, + request.gjelderIdent!!, + request.overskriveManuelleOpplysninger, + ) } else if (Grunnlagsdatatype.BOFORHOLD == request.grunnlagstype) { aktivereBoforhold( behandling, - request.grunnlagstype, request.gjelderIdent!!, request.overskriveManuelleOpplysninger, ) @@ -209,9 +225,10 @@ class GrunnlagService( @Transactional fun oppdatereAktivSivilstandEtterEndretVirkningstidspunkt(behandling: Behandling) { + val grunnlagsdatatype = Grunnlagsdatatype.SIVILSTAND val sisteAktiveGrunnlag = behandling.henteNyesteAktiveGrunnlag( - Grunnlagstype(Grunnlagsdatatype.SIVILSTAND, false), + Grunnlagstype(grunnlagsdatatype, false), behandling.bidragsmottaker!!, ) ?: run { log.warn { "Fant ingen aktive sivilstandsgrunnlag. Gjør ingen endring etter oppdatert virkningstidspunkt" } @@ -225,7 +242,7 @@ class GrunnlagService( ) behandling .henteNyesteAktiveGrunnlag( - Grunnlagstype(Grunnlagsdatatype.SIVILSTAND, true), + Grunnlagstype(grunnlagsdatatype, true), behandling.bidragsmottaker!!, )?.let { it.data = commonObjectmapper.writeValueAsString(sivilstandPeriodisert) @@ -234,9 +251,10 @@ class GrunnlagService( @Transactional fun oppdatereIkkeAktivSivilstandEtterEndretVirkningsdato(behandling: Behandling) { + val grunnlagsdatatype = Grunnlagsdatatype.SIVILSTAND val sisteIkkeAktiveGrunnlag = behandling.henteNyesteIkkeAktiveGrunnlag( - Grunnlagstype(Grunnlagsdatatype.SIVILSTAND, false), + Grunnlagstype(grunnlagsdatatype, false), behandling.bidragsmottaker!!, ) ?: run { log.debug { "Fant ingen ikke-aktive sivilstandsgrunnlag. Gjør ingen endringer" } @@ -252,7 +270,7 @@ class GrunnlagService( behandling .henteNyesteIkkeAktiveGrunnlag( - Grunnlagstype(Grunnlagsdatatype.SIVILSTAND, true), + Grunnlagstype(grunnlagsdatatype, true), behandling.bidragsmottaker!!, )?.let { it.data = commonObjectmapper.writeValueAsString(periodisertHistorikk) @@ -261,10 +279,11 @@ class GrunnlagService( @Transactional fun oppdaterIkkeAktiveBoforholdEtterEndretVirkningstidspunkt(behandling: Behandling) { + val grunnlagsdatatype = Grunnlagsdatatype.BOFORHOLD val sisteIkkeAktiveGrunnlag = behandling.henteNyesteIkkeAktiveGrunnlag( - Grunnlagstype(Grunnlagsdatatype.BOFORHOLD, false), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagstype(grunnlagsdatatype, false), + grunnlagsdatatype.innhentesForRolle(behandling)!!, ) ?: run { log.debug { "Fant ingen ikke-aktive boforholdsgrunnlag. Gjør ingen endringer" } return @@ -277,7 +296,7 @@ class GrunnlagService( val sisteAktiveGrunnlag = behandling.henteNyesteAktiveGrunnlag( Grunnlagstype(Grunnlagsdatatype.BOFORHOLD, false), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!, ) ?: run { log.warn { "Fant ingen aktive boforholdsgrunnlag. Oppdaterer ikke boforhold beregnet etter virkningstidspunkt ble endret" } return @@ -287,10 +306,11 @@ class GrunnlagService( @Transactional fun oppdatereAktiveBoforholdAndreVoksneIHusstandenEtterEndretVirkningstidspunkt(behandling: Behandling) { + val grunnlagsdatatype = Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN val sisteAktiveGrunnlag = behandling.henteNyesteAktiveGrunnlag( - Grunnlagstype(Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN, false), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagstype(grunnlagsdatatype, false), + grunnlagsdatatype.innhentesForRolle(behandling)!!, ) ?: run { log.warn { "Fant ingen aktive andre voksne i husstanden. Oppdaterer ikke andre voksne i husstanden beregnet etter virkningstidspunkt ble endret" @@ -302,10 +322,11 @@ class GrunnlagService( @Transactional fun oppdatereIkkeAktiveBoforholdAndreVoksneIHusstandenEtterEndretVirkningstidspunkt(behandling: Behandling) { + val grunnlagsdatatype = Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN val sisteIkkeAktiveGrunnlag = behandling.henteNyesteIkkeAktiveGrunnlag( - Grunnlagstype(Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN, false), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagstype(grunnlagsdatatype, false), + grunnlagsdatatype.innhentesForRolle(behandling)!!, ) ?: run { log.debug { "Fant ingen ikke-aktive andre voksne i husstanden grunnlag. Gjør ingen endringer" } return @@ -358,16 +379,18 @@ class GrunnlagService( perioder: List, rekalkulerOgOverskriveAktiverte: Boolean = true, ) { + val grunnlagsdatatype = Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN + val grunnlagSomSkalOverskrives = if (rekalkulerOgOverskriveAktiverte) { behandling.henteAktiverteGrunnlag( - Grunnlagstype(Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN, true), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagstype(grunnlagsdatatype, true), + grunnlagsdatatype.innhentesForRolle(behandling)!!, ) } else { behandling.henteUaktiverteGrunnlag( - Grunnlagstype(Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN, true), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagstype(grunnlagsdatatype, true), + grunnlagsdatatype.innhentesForRolle(behandling)!!, ) } grunnlagSomSkalOverskrives.forEach { @@ -381,21 +404,21 @@ class GrunnlagService( perioder: List, rekalkulerOgOverskriveAktiverte: Boolean = true, ) { + val grunnlagsdatatype = Grunnlagsdatatype.BOFORHOLD + val grunnlagSomSkalOverskrives = if (rekalkulerOgOverskriveAktiverte) { behandling.henteAktiverteGrunnlag( - Grunnlagstype(Grunnlagsdatatype.BOFORHOLD, true), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagstype(grunnlagsdatatype, true), + grunnlagsdatatype.innhentesForRolle(behandling)!!, ) } else { behandling.henteUaktiverteGrunnlag( - Grunnlagstype(Grunnlagsdatatype.BOFORHOLD, true), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagstype(grunnlagsdatatype, true), + grunnlagsdatatype.innhentesForRolle(behandling)!!, ) } - grunnlagSomSkalOverskrives.find { it.gjelder == gjelder }?.let { - it.data = tilJson(perioder) - } + grunnlagSomSkalOverskrives.find { it.gjelder == gjelder }?.let { it.data = tilJson(perioder) } } fun hentSistInnhentet( @@ -465,38 +488,41 @@ class GrunnlagService( private fun aktivereBoforhold( behandling: Behandling, - grunnlagstype: Grunnlagsdatatype, gjelderHusstandsmedlem: Personident, overskriveManuelleOpplysninger: Boolean, ) { + val grunnlagsdatatype = Grunnlagsdatatype.BOFORHOLD val nyesteIkkeAktiverteBoforholdForHusstandsmedlem = behandling.grunnlag .hentSisteIkkeAktiv() - .filter { gjelderHusstandsmedlem.verdi == it.gjelder && grunnlagstype == it.type } + .filter { gjelderHusstandsmedlem.verdi == it.gjelder && grunnlagsdatatype == it.type } .firstOrNull { it.erBearbeidet } if (nyesteIkkeAktiverteBoforholdForHusstandsmedlem == null) { throw HttpClientErrorException( HttpStatus.NOT_FOUND, - "Fant ingen grunnlag av type $grunnlagstype å aktivere for oppgitt husstandsmeldem i behandling " + + "Fant ingen grunnlag av type $grunnlagsdatatype å aktivere for oppgitt husstandsmeldem i behandling " + behandling.id, ) } val bmsEgneBarnIHusstandenFraNyesteGrunnlagsinnhenting = behandling.grunnlag.hentIdenterForEgneBarnIHusstandFraGrunnlagForRolle( - behandling.rolleGrunnlagSkalHentesFor!!, + grunnlagsdatatype.innhentesForRolle(behandling) ?: throw HttpClientErrorException( + HttpStatus.INTERNAL_SERVER_ERROR, + "Det oppstod en feil ved aktivering av boforhold i behandling ${behandling.id}", + ), ) // TOOD: Vurdere å trigge ny grunnlagsinnhenting if (bmsEgneBarnIHusstandenFraNyesteGrunnlagsinnhenting.isNullOrEmpty()) { log.error { - "Fant ingen husstandsmedlemmer som er barn av ${behandling.rolleGrunnlagSkalHentesFor!!.rolletype} i " + + "Fant ingen husstandsmedlemmer som er barn av ${grunnlagsdatatype.innhentesForRolle(behandling)!!.rolletype} i " + "nyeste boforholdsgrunnlag i behandling ${behandling.id}" } throw HttpClientErrorException( HttpStatus.INTERNAL_SERVER_ERROR, - "Fant ingen husstandsmedlemmer som er barn av ${behandling.rolleGrunnlagSkalHentesFor!!.rolletype} " + + "Fant ingen husstandsmedlemmer som er barn av ${grunnlagsdatatype.innhentesForRolle(behandling)!!.rolletype} " + "i nyeste boforholdsgrunnlag i behandling ${behandling.id}", ) } @@ -514,10 +540,11 @@ class GrunnlagService( } private fun aktivereInnhentetBoforholdsgrunnlagHvisBearbeidetGrunnlagErAktivertForAlleHusstandsmedlemmene(behandling: Behandling) { + val grunnlagsdatatype = Grunnlagsdatatype.BOFORHOLD val nyesteIkkeBearbeidaBoforholdsgrunnlag = behandling.henteNyesteGrunnlag( - Grunnlagstype(Grunnlagsdatatype.BOFORHOLD, false), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagstype(grunnlagsdatatype, false), + grunnlagsdatatype.innhentesForRolle(behandling)!!, ) nyesteIkkeBearbeidaBoforholdsgrunnlag?.let { @@ -536,6 +563,7 @@ class GrunnlagService( bmsNyesteIkkeBearbeidaBoforholdsgrunnlag: Grunnlag, behandling: Behandling, ): Boolean { + val grunnlagsdatatype = Grunnlagsdatatype.BOFORHOLD jsonListeTilObjekt(bmsNyesteIkkeBearbeidaBoforholdsgrunnlag.data) .filter { it.gjelderPersonId != null && it.erBarn @@ -544,8 +572,8 @@ class GrunnlagService( }.forEach { val nyesteGrunnlagForHusstandsmedlem = behandling.henteNyesteGrunnlag( - Grunnlagstype(Grunnlagsdatatype.BOFORHOLD, true), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagstype(grunnlagsdatatype, true), + grunnlagsdatatype.innhentesForRolle(behandling)!!, Personident(it.key!!), ) if (nyesteGrunnlagForHusstandsmedlem?.aktiv == null) { @@ -630,7 +658,7 @@ class GrunnlagService( // Husstandsmedlem og bostedsperiode innhentetGrunnlag.hentGrunnlagDto?.let { if (behandling.søknadsbarn.isNotEmpty() && - behandling.rolleGrunnlagSkalHentesFor?.ident == grunnlagsrequest.key.verdi && + Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)?.ident == grunnlagsrequest.key.verdi && !innhentingAvBoforholdFeilet ) { periodisereOgLagreBoforhold( @@ -638,7 +666,7 @@ class GrunnlagService( it.husstandsmedlemmerOgEgneBarnListe.toSet(), ) - if (Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN.behandlinstypeMotRolletyper[behandling.tilType()]?.contains( + if (Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN.behandlingstypeMotRolletyper[behandling.tilType()]?.contains( rolleInnhentetFor.rolletype, ) == true ) { @@ -660,6 +688,56 @@ class GrunnlagService( } } + val innhentingAvBarnetilsynFeilet = + feilrapporteringer.filter { Grunnlagsdatatype.BARNETILSYN == it.key }.isNotEmpty() + + // Oppdatere barnetilsyn + innhentetGrunnlag.hentGrunnlagDto?.let { grunnlag -> + if (grunnlag.barnetilsynListe.isNotEmpty() && !innhentingAvBarnetilsynFeilet) { + val nyesteBearbeidaBarnetilsynFørLagring = + sistAktiverteGrunnlag( + behandling, + Grunnlagstype(Grunnlagsdatatype.BARNETILSYN, true), + rolleInnhentetFor, + ) + + // Lagrer barnetilsyn per søknadsbarn som bearbeida grunnlag + grunnlag.barnetilsynListe.groupBy { it.barnPersonId }.forEach { barnetilsyn -> + + if (behandling.søknadsbarn.find { it.personident?.verdi == barnetilsyn.key } != null) { + lagreGrunnlagHvisEndret( + behandling, + rolleInnhentetFor, + Grunnlagstype(Grunnlagsdatatype.BARNETILSYN, true), + barnetilsyn.value.toSet(), + null, + Personident(barnetilsyn.key), + ) + } + } + + val nyesteBearbeidaBarnetilsynEtterLagring = + sistAktiverteGrunnlag( + behandling, + Grunnlagstype(Grunnlagsdatatype.BARNETILSYN, true), + rolleInnhentetFor, + ) + + if (nyesteBearbeidaBarnetilsynFørLagring.isEmpty() && nyesteBearbeidaBarnetilsynEtterLagring.isNotEmpty()) { + grunnlag.barnetilsynListe.groupBy { it.barnPersonId }.forEach { barnetilsyn -> + behandling.underholdskostnader.find { it.barnetsRolleIBehandlingen?.personident?.verdi == barnetilsyn.key }?.let { + if (it.barnetilsyn.isEmpty()) { + it.barnetilsyn.addAll(barnetilsyn.value.toSet().tilBarnetilsyn(it)) + it.harTilsynsordning = true + } + } + } + } + + behandling.aktivereBarnetilsynHvisIngenEndringerMåAksepteres() + } + } + return feilrapporteringer } @@ -746,6 +824,7 @@ class GrunnlagService( behandling: Behandling, husstandsmedlemmerOgEgneBarn: Set, ) { + val grunnlagsdatatype = Grunnlagsdatatype.BOFORHOLD val boforholdPeriodisert = BoforholdApi.beregnBoforholdBarnV3( behandling.virkningstidspunktEllerSøktFomDato, @@ -756,8 +835,8 @@ class GrunnlagService( val nyesteBearbeidaBoforholdFørLagring = sistAktiverteGrunnlag( behandling, - Grunnlagstype(Grunnlagsdatatype.BOFORHOLD, true), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagstype(grunnlagsdatatype, true), + grunnlagsdatatype.innhentesForRolle(behandling)!!, ) // lagre bearbeidet grunnlag per husstandsmedlem i grunnlagstabellen @@ -767,8 +846,8 @@ class GrunnlagService( .forEach { lagreGrunnlagHvisEndret( behandling = behandling, - innhentetForRolle = behandling.rolleGrunnlagSkalHentesFor!!, - grunnlagstype = Grunnlagstype(Grunnlagsdatatype.BOFORHOLD, true), + innhentetForRolle = grunnlagsdatatype.innhentesForRolle(behandling)!!, + grunnlagstype = Grunnlagstype(grunnlagsdatatype, true), innhentetGrunnlag = it.value.toSet(), gjelderPerson = Personident(it.key!!), ) @@ -777,8 +856,8 @@ class GrunnlagService( val innhentetRollesNyesteBearbeidaBoforholdEtterLagring = sistAktiverteGrunnlag( behandling, - Grunnlagstype(Grunnlagsdatatype.BOFORHOLD, true), - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagstype(grunnlagsdatatype, true), + grunnlagsdatatype.innhentesForRolle(behandling)!!, ) // oppdatere husstandsmedlem og bostatusperiode-tabellene hvis førstegangslagring @@ -814,14 +893,13 @@ class GrunnlagService( } fun aktiverGrunnlagForBoforholdHvisIngenEndringerMåAksepteres(behandling: Behandling) { - val rolleInhentetFor = behandling.rolleGrunnlagSkalHentesFor!! + val rolleInhentetFor = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!! val ikkeAktiveGrunnlag = behandling.grunnlag.hentAlleIkkeAktiv() val aktiveGrunnlag = behandling.grunnlag.hentAlleAktiv() if (ikkeAktiveGrunnlag.isEmpty()) return val endringerSomMåBekreftes = ikkeAktiveGrunnlag.henteEndringerIBoforhold(aktiveGrunnlag, behandling) - behandling.husstandsmedlem - .barn + behandling.husstandsmedlem.barn .filter { it.kilde == Kilde.OFFENTLIG } .filter { hb -> endringerSomMåBekreftes.none { it.ident == hb.ident } } .forEach { hb -> @@ -1263,7 +1341,7 @@ class GrunnlagService( innhentetForRolle: Rolle, ): Boolean { val nyesteRådata = jsonTilObjekt>(sisteInnhentedeIkkeBearbeidaGrunnlag!!.data) - nyesteRådata.mapNotNull { it.relatertPersonPersonId }.forEach { + nyesteRådata.mapNotNull { it.gjelderPersonId }.forEach { val nyesteBearbeidaDataForHusstandsmedlem = behandling.henteNyesteGrunnlag( Grunnlagstype( @@ -1360,50 +1438,6 @@ class GrunnlagService( else -> false } - private fun Behandling.henteUaktiverteGrunnlag( - grunnlagstype: Grunnlagstype, - rolle: Rolle, - ): Set = - grunnlag - .hentAlleIkkeAktiv() - .filter { - it.type == grunnlagstype.type && it.rolle.id == rolle.id && grunnlagstype.erBearbeidet == it.erBearbeidet - }.toSet() - - private fun Behandling.henteAktiverteGrunnlag( - grunnlagstype: Grunnlagstype, - rolle: Rolle, - ): Set = - grunnlag - .hentAlleAktiv() - .filter { - it.type == grunnlagstype.type && it.rolle.id == rolle.id && grunnlagstype.erBearbeidet == it.erBearbeidet - }.toSet() - - private fun Behandling.henteNyesteGrunnlag( - grunnlagstype: Grunnlagstype, - rolle: Rolle, - gjelder: Personident?, - ): Grunnlag? = - grunnlag - .filter { - it.type == grunnlagstype.type && - it.rolle.id == rolle.id && - grunnlagstype.erBearbeidet == it.erBearbeidet && - it.gjelder == gjelder?.verdi - }.toSet() - .maxByOrNull { it.innhentet } - - private fun Behandling.henteNyesteGrunnlag( - grunnlagstype: Grunnlagstype, - rolleInnhentetFor: Rolle, - ): Grunnlag? = - grunnlag - .filter { - it.type == grunnlagstype.type && it.rolle.id == rolleInnhentetFor.id && grunnlagstype.erBearbeidet == it.erBearbeidet - }.toSet() - .maxByOrNull { it.innhentet } - private inline fun Behandling.hentSisteInnhentetGrunnlagSet( grunnlagstype: Grunnlagstype, rolle: Rolle, @@ -1562,9 +1596,15 @@ class GrunnlagService( } Grunnlagsdatatype.BARNETILSYN -> { - if (innhentetGrunnlag.barnetilsynListe.isNotEmpty()) { - log.info { "Barnetilsyn er ikke relevant for forskudd." } - } + lagreGrunnlagHvisEndret( + behandling, + rolleInhentetFor, + Grunnlagstype(grunnlagsdatatype, false), + innhentetGrunnlag.barnetilsynListe + .filter { + harBarnRolleIBehandling(it.barnPersonId, behandling) + }.toSet(), + ) } Grunnlagsdatatype.KONTANTSTØTTE -> { diff --git a/src/main/kotlin/no/nav/bidrag/behandling/service/NotatOpplysningerService.kt b/src/main/kotlin/no/nav/bidrag/behandling/service/NotatOpplysningerService.kt index 2bd5fbff5..dfb43f089 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/service/NotatOpplysningerService.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/service/NotatOpplysningerService.kt @@ -21,6 +21,7 @@ import no.nav.bidrag.behandling.dto.v2.behandling.SærbidragUtgifterDto import no.nav.bidrag.behandling.dto.v2.behandling.TotalBeregningUtgifterDto import no.nav.bidrag.behandling.dto.v2.behandling.UtgiftBeregningDto import no.nav.bidrag.behandling.dto.v2.behandling.UtgiftspostDto +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.dto.v2.samvær.SamværDto import no.nav.bidrag.behandling.service.NotatService.Companion.henteInntektsnotat import no.nav.bidrag.behandling.service.NotatService.Companion.henteNotatinnhold @@ -45,6 +46,8 @@ import no.nav.bidrag.commons.security.utils.TokenUtils import no.nav.bidrag.commons.service.finnVisningsnavn import no.nav.bidrag.commons.service.organisasjon.SaksbehandlernavnProvider import no.nav.bidrag.commons.util.secureLogger +import no.nav.bidrag.domene.enums.barnetilsyn.Skolealder +import no.nav.bidrag.domene.enums.barnetilsyn.Tilsynstype import no.nav.bidrag.domene.enums.behandling.TypeBehandling import no.nav.bidrag.domene.enums.diverse.Kilde import no.nav.bidrag.domene.enums.inntekt.Inntektsrapportering @@ -186,7 +189,7 @@ class NotatOpplysningerService( .hentAlleBearbeidaBoforhold( behandling.virkningstidspunktEllerSøktFomDato, behandling.husstandsmedlem, - behandling.rolleGrunnlagSkalHentesFor!!, + Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!, ) val opplysningerSivilstand = @@ -243,8 +246,8 @@ class NotatOpplysningerService( it.stønadTilBarnetilsyn.map { NotatUnderholdBarnDto.NotatStønadTilBarnetilsynDto( periode = DatoperiodeDto(it.periode.fom, it.periode.tom), - skolealder = it.skolealder, - tilsynstype = it.tilsynstype, + skolealder = it.skolealder ?: Skolealder.IKKE_ANGITT, + tilsynstype = it.tilsynstype ?: Tilsynstype.IKKE_ANGITT, kilde = it.kilde, ) }, @@ -500,7 +503,7 @@ private fun DelberegningBarnetilleggDto.tilNotatDto() = private fun Behandling.tilNotatBoforhold(): NotatBegrunnelseDto = NotatBegrunnelseDto( innhold = henteNotatinnhold(this, NotatType.BOFORHOLD), - gjelder = this.rolleGrunnlagSkalHentesFor!!.tilNotatRolle(), + gjelder = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(this)!!.tilNotatRolle(), ) private fun Behandling.tilNotatVirkningstidspunkt() = diff --git a/src/main/kotlin/no/nav/bidrag/behandling/service/UnderholdService.kt b/src/main/kotlin/no/nav/bidrag/behandling/service/UnderholdService.kt index d81781aba..11e8ac39e 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/service/UnderholdService.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/service/UnderholdService.kt @@ -1,13 +1,20 @@ package no.nav.bidrag.behandling.service +import io.github.oshai.kotlinlogging.KotlinLogging import no.nav.bidrag.behandling.database.datamodell.Barnetilsyn import no.nav.bidrag.behandling.database.datamodell.Behandling import no.nav.bidrag.behandling.database.datamodell.FaktiskTilsynsutgift import no.nav.bidrag.behandling.database.datamodell.Person import no.nav.bidrag.behandling.database.datamodell.Tilleggsstønad import no.nav.bidrag.behandling.database.datamodell.Underholdskostnad +import no.nav.bidrag.behandling.database.datamodell.hentAlleIkkeAktiv +import no.nav.bidrag.behandling.database.datamodell.henteNyesteAktiveGrunnlag +import no.nav.bidrag.behandling.database.datamodell.henteNyesteIkkeAktiveGrunnlag import no.nav.bidrag.behandling.database.repository.PersonRepository import no.nav.bidrag.behandling.database.repository.UnderholdskostnadRepository +import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype +import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagstype +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.dto.v2.underhold.BarnDto import no.nav.bidrag.behandling.dto.v2.underhold.OppdatereBegrunnelseRequest import no.nav.bidrag.behandling.dto.v2.underhold.OppdatereFaktiskTilsynsutgiftRequest @@ -19,19 +26,29 @@ import no.nav.bidrag.behandling.dto.v2.underhold.StønadTilBarnetilsynDto import no.nav.bidrag.behandling.dto.v2.underhold.UnderholdDto import no.nav.bidrag.behandling.dto.v2.underhold.Underholdselement import no.nav.bidrag.behandling.transformers.Dtomapper +import no.nav.bidrag.behandling.transformers.behandling.hentAlleBearbeidaBarnetilsyn +import no.nav.bidrag.behandling.transformers.underhold.aktivereBarnetilsynHvisIngenEndringerMåAksepteres import no.nav.bidrag.behandling.transformers.underhold.harAndreBarnIUnderhold import no.nav.bidrag.behandling.transformers.underhold.henteOgValidereUnderholdskostnad +import no.nav.bidrag.behandling.transformers.underhold.justerePerioderEtterVirkningsdato +import no.nav.bidrag.behandling.transformers.underhold.justerePerioderForBearbeidaBarnetilsynEtterVirkningstidspunkt +import no.nav.bidrag.behandling.transformers.underhold.tilBarnetilsyn import no.nav.bidrag.behandling.transformers.underhold.tilStønadTilBarnetilsynDto import no.nav.bidrag.behandling.transformers.underhold.validere import no.nav.bidrag.behandling.transformers.underhold.validerePerioder import no.nav.bidrag.domene.enums.barnetilsyn.Skolealder +import no.nav.bidrag.domene.enums.barnetilsyn.Tilsynstype import no.nav.bidrag.domene.enums.diverse.Kilde +import no.nav.bidrag.domene.ident.Personident import org.springframework.http.HttpStatus import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import org.springframework.web.client.HttpClientErrorException +import java.time.LocalDateTime import no.nav.bidrag.transport.behandling.felles.grunnlag.NotatGrunnlag.NotatType as Notattype +private val log = KotlinLogging.logger {} + @Service class UnderholdService( private val underholdskostnadRepository: UnderholdskostnadRepository, @@ -150,6 +167,12 @@ class UnderholdService( val oppdatertBarnetilsyn: Barnetilsyn = request.id?.let { id -> val barnetilsyn = underholdskostnad.barnetilsyn.find { id == it.id }!! + + // dersom periode endres skal kilde alltid være manuell + if (barnetilsyn.fom != request.periode.fom || barnetilsyn.tom != request.periode.tom) { + barnetilsyn.kilde = Kilde.MANUELL + } + barnetilsyn.fom = request.periode.fom barnetilsyn.tom = request.periode.tom barnetilsyn.under_skolealder = @@ -158,8 +181,8 @@ class UnderholdService( Skolealder.OVER -> false else -> null } - barnetilsyn.omfang = request.tilsynstype - barnetilsyn.kilde = Kilde.MANUELL + barnetilsyn.omfang = request.tilsynstype ?: Tilsynstype.IKKE_ANGITT + barnetilsyn } ?: run { val barnetilsyn = @@ -172,11 +195,12 @@ class UnderholdService( Skolealder.OVER -> false else -> null }, - omfang = request.tilsynstype, + omfang = request.tilsynstype ?: Tilsynstype.IKKE_ANGITT, kilde = Kilde.MANUELL, underholdskostnad = underholdskostnad, ) underholdskostnad.barnetilsyn.add(barnetilsyn) + underholdskostnad.harTilsynsordning = true underholdskostnadRepository .save(underholdskostnad) .barnetilsyn @@ -192,6 +216,72 @@ class UnderholdService( ) } + fun oppdatereAutomatiskInnhentaStønadTilBarnetilsyn( + behandling: Behandling, + gjelderSøknadsbarn: Personident, + overskriveManuelleOpplysninger: Boolean, + ) { + val ikkeAktiverteGrunnlag = + behandling.grunnlag.hentAlleIkkeAktiv().filter { Grunnlagsdatatype.BARNETILSYN == it.type } + + val nyesteIkkeaktiverteGrunnlag = + ikkeAktiverteGrunnlag + .filter { !it.erBearbeidet } + .maxByOrNull { it.innhentet } + + val ikkeaktivertBearbeidaGrunnlagForSøknadsbarn = + ikkeAktiverteGrunnlag + .filter { it.erBearbeidet } + .find { it.gjelder == gjelderSøknadsbarn.verdi } + + if (nyesteIkkeaktiverteGrunnlag == null || ikkeaktivertBearbeidaGrunnlagForSøknadsbarn == null) { + throw HttpClientErrorException( + HttpStatus.NOT_FOUND, + "Fant ingen grunnlag av type BARNETILSYN å aktivere for søknadsbarn i behandling $behandling.id", + ) + } + + val data = + behandling.grunnlag + .hentAlleIkkeAktiv() + .filter { it.gjelder == gjelderSøknadsbarn.verdi } + .toSet() + .hentAlleBearbeidaBarnetilsyn( + behandling.virkningstidspunktEllerSøktFomDato, + behandling.bidragsmottaker!!, + ) + + val u = behandling.underholdskostnader.find { it.person.personident == gjelderSøknadsbarn } + if (u == null) { + throw HttpClientErrorException( + HttpStatus.NOT_FOUND, + "Fant ingen underholdskostnad tilknyttet søknadsbarn i behandling $behandling.id i forbindelse med aktivering av BARNETILSYN.", + ) + } + + if (overskriveManuelleOpplysninger) { + u.barnetilsyn.clear() + u.barnetilsyn.addAll(data.tilBarnetilsyn(u)) + } else { + val gamleOffentligeBarnetilsyn = u.barnetilsyn.filter { it.kilde == Kilde.OFFENTLIG } + u.barnetilsyn.removeAll(gamleOffentligeBarnetilsyn) + u.barnetilsyn.addAll(data.tilBarnetilsyn(u)) + } + + ikkeaktivertBearbeidaGrunnlagForSøknadsbarn.aktiv = LocalDateTime.now() + if (ikkeAktiverteGrunnlag.filter { it.erBearbeidet }.find { it.gjelder != gjelderSøknadsbarn.verdi } == null) { + nyesteIkkeaktiverteGrunnlag.aktiv = LocalDateTime.now() + } + } + + @Transactional + fun tilpasseUnderholdEtterVirkningsdato(behandling: Behandling) { + tilpasseAktiveBarnetilsynsgrunnlagEtterVirkningsdato(behandling) + tilpasseIkkeaktiveBarnetilsynsgrunnlagEtterVirkningsdato(behandling) + behandling.aktivereBarnetilsynHvisIngenEndringerMåAksepteres() + behandling.underholdskostnader.justerePerioderEtterVirkningsdato() + } + @Transactional fun oppdatereFaktiskeTilsynsutgifter( underholdskostnad: Underholdskostnad, @@ -220,6 +310,7 @@ class UnderholdService( underholdskostnad = underholdskostnad, ) underholdskostnad.faktiskeTilsynsutgifter.add(faktiskTilsynsutgift) + underholdskostnad.harTilsynsordning = true underholdskostnadRepository .save(underholdskostnad) .faktiskeTilsynsutgifter @@ -260,6 +351,7 @@ class UnderholdService( underholdskostnad = underholdskostnad, ) underholdskostnad.tilleggsstønad.add(tilleggsstønad) + underholdskostnad.harTilsynsordning = true underholdskostnadRepository .save(underholdskostnad) .tilleggsstønad @@ -350,4 +442,30 @@ class UnderholdService( behandling.underholdskostnader.add(u) return u } + + private fun tilpasseIkkeaktiveBarnetilsynsgrunnlagEtterVirkningsdato(behandling: Behandling) { + val grunnlagsdatatype = Grunnlagsdatatype.BARNETILSYN + val sisteAktiveGrunnlag = + behandling.henteNyesteIkkeAktiveGrunnlag( + Grunnlagstype(grunnlagsdatatype, false), + grunnlagsdatatype.innhentesForRolle(behandling)!!, + ) ?: run { + log.warn { "Fant ingen aktive barnetilsynsgrunnlag som må tilpasses nytt virkingstidspunkt." } + return + } + sisteAktiveGrunnlag.justerePerioderForBearbeidaBarnetilsynEtterVirkningstidspunkt(false) + } + + private fun tilpasseAktiveBarnetilsynsgrunnlagEtterVirkningsdato(behandling: Behandling) { + val grunnlagsdatatype = Grunnlagsdatatype.BARNETILSYN + val sisteAktiveGrunnlag = + behandling.henteNyesteAktiveGrunnlag( + Grunnlagstype(grunnlagsdatatype, false), + grunnlagsdatatype.innhentesForRolle(behandling)!!, + ) ?: run { + log.warn { "Fant ingen aktive barnetilsynsgrunnlag som må tilpasses nytt virkingstidspunkt." } + return + } + sisteAktiveGrunnlag.justerePerioderForBearbeidaBarnetilsynEtterVirkningstidspunkt(true) + } } diff --git a/src/main/kotlin/no/nav/bidrag/behandling/transformers/Dtomapper.kt b/src/main/kotlin/no/nav/bidrag/behandling/transformers/Dtomapper.kt index 66c45f0c3..f94e1aea8 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/transformers/Dtomapper.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/transformers/Dtomapper.kt @@ -53,8 +53,10 @@ import no.nav.bidrag.behandling.transformers.behandling.erLik import no.nav.bidrag.behandling.transformers.behandling.hentEndringerInntekter import no.nav.bidrag.behandling.transformers.behandling.hentEndringerSivilstand import no.nav.bidrag.behandling.transformers.behandling.henteEndringerIArbeidsforhold +import no.nav.bidrag.behandling.transformers.behandling.henteEndringerIBarnetilsyn import no.nav.bidrag.behandling.transformers.behandling.henteEndringerIBoforhold import no.nav.bidrag.behandling.transformers.behandling.henteRolleForNotat +import no.nav.bidrag.behandling.transformers.behandling.tilBarnetilsynAktiveGrunnlagDto import no.nav.bidrag.behandling.transformers.behandling.tilDto import no.nav.bidrag.behandling.transformers.behandling.tilGrunnlagsinnhentingsfeil import no.nav.bidrag.behandling.transformers.behandling.tilInntektDtoV2 @@ -177,9 +179,16 @@ class Dtomapper( gjelderBarn = this.person.tilPersoninfoDto(rolleSøknadsbarn), faktiskTilsynsutgift = this.faktiskeTilsynsutgifter.sortedBy { it.fom }.tilFaktiskeTilsynsutgiftDtos(), stønadTilBarnetilsyn = - rolleSøknadsbarn?.let { this.barnetilsyn.sortedBy { it.fom }.tilStønadTilBarnetilsynDtos() } + rolleSøknadsbarn?.let { + this.barnetilsyn + .sortedBy { it.fom } + .toSet() + .tilStønadTilBarnetilsynDtos() + } + ?: emptySet(), + tilleggsstønad = + rolleSøknadsbarn?.let { this.tilleggsstønad.sortedBy { it.fom }.tilTilleggsstønadDtos() } ?: emptySet(), - tilleggsstønad = rolleSøknadsbarn?.let { this.tilleggsstønad.sortedBy { it.fom }.tilTilleggsstønadDtos() } ?: emptySet(), underholdskostnad = rolleSøknadsbarn?.let { this.behandling.tilBeregnetUnderholdskostnad() } ?: emptySet(), begrunnelse = NotatService.henteUnderholdsnotat( @@ -502,6 +511,11 @@ class Dtomapper( aktiveGrunnlag, behandling.virkningstidspunktEllerSøktFomDato, ), + stønadTilBarnetilsyn = + sisteInnhentedeIkkeAktiveGrunnlag.henteEndringerIBarnetilsyn( + aktiveGrunnlag.toSet(), + behandling, + ), ) } @@ -798,6 +812,10 @@ class Dtomapper( andreVoksneIHusstanden = tilAndreVoksneIHusstanden(true), sivilstand = find { it.type == Grunnlagsdatatype.SIVILSTAND && !it.erBearbeidet }.toSivilstand(), + stønadTilBarnetilsyn = + filter { it.type == Grunnlagsdatatype.BARNETILSYN && it.erBearbeidet } + .toSet() + .tilBarnetilsynAktiveGrunnlagDto(), ) private fun List.tilAndreVoksneIHusstanden(erAktivert: Boolean) = diff --git a/src/main/kotlin/no/nav/bidrag/behandling/transformers/behandling/AktivGrunnlagMapping.kt b/src/main/kotlin/no/nav/bidrag/behandling/transformers/behandling/AktivGrunnlagMapping.kt index df6e3edf8..9cfbdcacf 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/transformers/behandling/AktivGrunnlagMapping.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/transformers/behandling/AktivGrunnlagMapping.kt @@ -5,28 +5,37 @@ import no.nav.bidrag.behandling.database.datamodell.Grunnlag import no.nav.bidrag.behandling.database.datamodell.Inntekt import no.nav.bidrag.behandling.database.datamodell.Inntektspost import no.nav.bidrag.behandling.database.datamodell.Rolle +import no.nav.bidrag.behandling.database.datamodell.hentAlleAktiv +import no.nav.bidrag.behandling.database.datamodell.hentAlleIkkeAktiv import no.nav.bidrag.behandling.database.datamodell.henteBearbeidaInntekterForType import no.nav.bidrag.behandling.database.datamodell.konvertereData import no.nav.bidrag.behandling.dto.v1.behandling.SivilstandDto import no.nav.bidrag.behandling.dto.v2.behandling.GrunnlagInntektEndringstype import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype +import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagstype import no.nav.bidrag.behandling.dto.v2.behandling.HusstandsmedlemGrunnlagDto import no.nav.bidrag.behandling.dto.v2.behandling.IkkeAktivInntektDto import no.nav.bidrag.behandling.dto.v2.behandling.InntektspostEndringDto import no.nav.bidrag.behandling.dto.v2.behandling.SivilstandIkkeAktivGrunnlagDto +import no.nav.bidrag.behandling.dto.v2.behandling.StønadTilBarnetilsynIkkeAktiveGrunnlagDto +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.transformers.ainntekt12Og3Måneder import no.nav.bidrag.behandling.transformers.ainntekt12Og3MånederFraOpprinneligVedtakstidspunkt import no.nav.bidrag.behandling.transformers.eksplisitteYtelser import no.nav.bidrag.behandling.transformers.inntekt.tilIkkeAktivInntektDto import no.nav.bidrag.behandling.transformers.inntekt.tilInntektspostEndring import no.nav.bidrag.behandling.transformers.nærmesteHeltall +import no.nav.bidrag.behandling.transformers.underhold.tilBarnetilsyn +import no.nav.bidrag.behandling.transformers.underhold.tilStønadTilBarnetilsynDtos import no.nav.bidrag.boforhold.dto.BoforholdResponseV2 import no.nav.bidrag.boforhold.dto.Bostatus import no.nav.bidrag.commons.util.secureLogger import no.nav.bidrag.domene.enums.diverse.Kilde import no.nav.bidrag.domene.enums.inntekt.Inntektsrapportering +import no.nav.bidrag.domene.ident.Personident import no.nav.bidrag.sivilstand.dto.Sivilstand import no.nav.bidrag.transport.behandling.grunnlag.response.ArbeidsforholdGrunnlagDto +import no.nav.bidrag.transport.behandling.grunnlag.response.BarnetilsynGrunnlagDto import no.nav.bidrag.transport.behandling.grunnlag.response.SivilstandGrunnlagDto import no.nav.bidrag.transport.behandling.inntekt.response.InntektPost import no.nav.bidrag.transport.behandling.inntekt.response.SummertÅrsinntekt @@ -117,13 +126,85 @@ fun List.henteEndringerIArbeidsforhold(alleAktiveGrunnlag: List.henteEndringerIBarnetilsyn( + aktiveGrunnlag: Set, + behandling: Behandling, +): StønadTilBarnetilsynIkkeAktiveGrunnlagDto? { + fun Personident.erSøknadsbarn() = behandling.søknadsbarn.find { it.personident == this } != null + + fun Behandling.henteUnderholdskostnadPersonident(personident: Personident) = + this.underholdskostnader.find { + it.person.rolle + .first() + .personident == personident + } + + val innhentaForRolle = behandling.bidragsmottaker!! + + val virkningsdato = behandling.virkningstidspunktEllerSøktFomDato + val aktiveBarnetilsyn = aktiveGrunnlag.hentAlleBearbeidaBarnetilsyn(virkningsdato, innhentaForRolle) + val nyeBarnetilsyn = + toSet() + .hentAlleBearbeidaBarnetilsyn(virkningsdato, innhentaForRolle) + .filter { Personident(it.barnPersonId).erSøknadsbarn() } + .toSet() + + val aktiveBarnetilsynsdata = + aktiveBarnetilsyn + .filtrerePerioderEtterVirkningstidspunkt(virkningsdato) + .groupBy { it.barnPersonId } + .map { (personidentBarn, barnetilsyn) -> + Personident(personidentBarn) to barnetilsyn + }.toMap() + + val nyeBarnetilsynsdata: Map> = + nyeBarnetilsyn + .filtrerePerioderEtterVirkningstidspunkt(virkningsdato) + .groupBy { it.barnPersonId } + .map { (personidentBarn, barnetilsyn) -> + Personident(personidentBarn) to barnetilsyn.toSet() + }.toMap() + + val nyeBarnetilsynsdataTilknyttetSøknadsbarn = + nyeBarnetilsynsdata.filter { (k, v) -> + k.erSøknadsbarn() && + v.isNotEmpty() && + !aktiveBarnetilsynsdata[k].isNullOrEmpty() && + !v.toSet().erLik(aktiveBarnetilsynsdata[k]!!.toSet(), virkningsdato) + } + + if (aktiveBarnetilsynsdata.values.isNotEmpty() && nyeBarnetilsynsdataTilknyttetSøknadsbarn.values.isNotEmpty()) { + return StønadTilBarnetilsynIkkeAktiveGrunnlagDto( + stønadTilBarnetilsyn = + nyeBarnetilsynsdataTilknyttetSøknadsbarn + .map { + it.key to + it.value + .tilBarnetilsyn(behandling.henteUnderholdskostnadPersonident(it.key)!!) + .toSet() + .tilStønadTilBarnetilsynDtos() + }.toMap(), + grunnlag = + nyeBarnetilsyn + .groupBy { it.barnPersonId } + .map { (personidentBarn, barnetilsyn) -> + Personident(personidentBarn) to barnetilsyn.toSet() + }.toMap(), + innhentetTidspunkt = + find { Grunnlagsdatatype.BARNETILSYN == it.type && it.erBearbeidet }?.innhentet + ?: LocalDateTime.now(), + ) + } + return null +} + fun List.henteEndringerIBoforhold( aktiveGrunnlag: List, behandling: Behandling, ): Set { val virkniningstidspunkt = behandling.virkningstidspunktEllerSøktFomDato val husstandsmedlemmer = behandling.husstandsmedlem - val rolle = behandling.rolleGrunnlagSkalHentesFor!! + val rolle = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!! val aktiveBoforholdsdata = aktiveGrunnlag.hentAlleBearbeidaBoforhold(virkniningstidspunkt, husstandsmedlemmer, rolle).toSet() @@ -245,6 +326,29 @@ fun Set.erDetSammeSom(settB: Set.erLik( + detAndreSettet: Set, + virkningsdato: LocalDate, +): Boolean { + if (this.size != detAndreSettet.size) return false + + fun BarnetilsynGrunnlagDto.justereFradato() = + if (virkningsdato.isAfter(LocalDate.now())) { + maxOf(virkningsdato.withDayOfMonth(1)) + } else { + maxOf(virkningsdato.withDayOfMonth(1), periodeFra) + } + return this.all { barnetilsyn -> + detAndreSettet.any { + it.justereFradato() == barnetilsyn.justereFradato() && + it.periodeTil == barnetilsyn.periodeTil && + it.barnPersonId == barnetilsyn.barnPersonId && + it.skolealder == barnetilsyn.skolealder && + it.tilsynstype == barnetilsyn.tilsynstype + } + } +} + fun List.erDetSammeSom( other: List, virkniningstidspunkt: LocalDate, @@ -353,3 +457,23 @@ fun Inntekt.erDetSammeSom(grunnlag: SummertÅrsinntekt): Boolean { opprinneligPeriode!! == grunnlag.periode } } + +fun Behandling.henteUaktiverteGrunnlag( + grunnlagstype: Grunnlagstype, + rolle: Rolle, +): Set = + grunnlag + .hentAlleIkkeAktiv() + .filter { + it.type == grunnlagstype.type && it.rolle.id == rolle.id && grunnlagstype.erBearbeidet == it.erBearbeidet + }.toSet() + +fun Behandling.henteAktiverteGrunnlag( + grunnlagstype: Grunnlagstype, + rolle: Rolle, +): Set = + grunnlag + .hentAlleAktiv() + .filter { + it.type == grunnlagstype.type && it.rolle.id == rolle.id && grunnlagstype.erBearbeidet == it.erBearbeidet + }.toSet() diff --git a/src/main/kotlin/no/nav/bidrag/behandling/transformers/behandling/BehandlingDtoMapping.kt b/src/main/kotlin/no/nav/bidrag/behandling/transformers/behandling/BehandlingDtoMapping.kt index d68a4b4c6..0af2e1183 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/transformers/behandling/BehandlingDtoMapping.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/transformers/behandling/BehandlingDtoMapping.kt @@ -18,6 +18,8 @@ import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsinnhentingsfeil import no.nav.bidrag.behandling.dto.v2.behandling.KanBehandlesINyLøsningRequest import no.nav.bidrag.behandling.dto.v2.behandling.SivilstandAktivGrunnlagDto import no.nav.bidrag.behandling.dto.v2.behandling.SjekkRolleDto +import no.nav.bidrag.behandling.dto.v2.behandling.StønadTilBarnetilsynAktiveGrunnlagDto +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.dto.v2.inntekt.BeregnetInntekterDto import no.nav.bidrag.behandling.dto.v2.inntekt.InntekterDtoV2 import no.nav.bidrag.behandling.dto.v2.validering.InntektValideringsfeil @@ -53,6 +55,7 @@ import no.nav.bidrag.domene.tid.Datoperiode import no.nav.bidrag.organisasjon.dto.SaksbehandlerDto import no.nav.bidrag.sivilstand.dto.Sivilstand import no.nav.bidrag.sivilstand.response.SivilstandBeregnet +import no.nav.bidrag.transport.behandling.grunnlag.response.BarnetilsynGrunnlagDto import no.nav.bidrag.transport.behandling.grunnlag.response.FeilrapporteringDto import no.nav.bidrag.transport.behandling.grunnlag.response.SivilstandGrunnlagDto import no.nav.bidrag.transport.behandling.inntekt.response.SummertMånedsinntekt @@ -138,6 +141,21 @@ fun Grunnlag?.toSivilstand(): SivilstandAktivGrunnlagDto? { ) } +fun Set.tilBarnetilsynAktiveGrunnlagDto(): StønadTilBarnetilsynAktiveGrunnlagDto? { + if (this.isEmpty()) return null + return StønadTilBarnetilsynAktiveGrunnlagDto( + grunnlag = + this + .flatMap { it.konvertereData>() ?: emptySet() } + .toSet() + .groupBy { it.barnPersonId } + .map { (personidentBarn, barnetilsyn) -> + Personident(personidentBarn) to barnetilsyn.toSet() + }.toMap(), + innhentetTidspunkt = first().innhentet, + ) +} + fun Behandling.tilInntektDtoV2( gjeldendeAktiveGrunnlagsdata: List = emptyList(), inkluderHistoriskeInntekter: Boolean = false, @@ -366,7 +384,7 @@ fun Behandling.henteRolleForNotat( notattype: Notattype, forRolle: Rolle?, ) = when (notattype) { - Notattype.BOFORHOLD -> this.rolleGrunnlagSkalHentesFor!! + Notattype.BOFORHOLD -> Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(this)!! Notattype.UTGIFTER -> this.bidragsmottaker!! Notattype.VIRKNINGSTIDSPUNKT -> this.bidragsmottaker!! Notattype.INNTEKT -> { @@ -377,6 +395,7 @@ fun Behandling.henteRolleForNotat( forRolle } } + Notattype.UNDERHOLDSKOSTNAD -> if (forRolle == null) { log.warn { "Notattype $notattype krever spesifisering av hvilken rolle notatet gjelder." } @@ -384,6 +403,7 @@ fun Behandling.henteRolleForNotat( } else { forRolle } + Notattype.SAMVÆR -> forRolle!! } @@ -411,6 +431,23 @@ fun Behandling.notatTittel(): String { return "${prefiks?.let { "$prefiks, " }}Saksbehandlingsnotat" } +fun Set.filtrerePerioderEtterVirkningstidspunkt(virkningstidspunkt: LocalDate): Set = + groupBy { it.barnPersonId } + .flatMap { (personident, perioder) -> + val perioderFiltrert = + perioder.sortedBy { it.periodeFra }.slice( + perioder + .map { it.periodeFra } + .hentIndekserEtterVirkningstidspunkt(virkningstidspunkt, null), + ) + val cutoffPeriodeFom = finnCutoffDatoFom(virkningstidspunkt, null) + perioderFiltrert.map { periode -> + periode + .takeIf { it == perioderFiltrert.first() } + ?.copy(periodeFra = maxOf(periode.periodeFra, cutoffPeriodeFom)) ?: periode + } + }.toSet() + fun List.filtrerPerioderEtterVirkningstidspunkt( husstandsmedlemListe: Set, virkningstidspunkt: LocalDate, @@ -496,6 +533,20 @@ fun List.hentAlleBearbeidaBoforhold( virkniningstidspunkt, ).sortedBy { it.periodeFom } +fun Set.hentAlleBearbeidaBarnetilsyn( + virkniningstidspunkt: LocalDate, + rolle: Rolle, +) = asSequence() + .filter { (it.rolle.id == rolle.id) && it.type == Grunnlagsdatatype.BARNETILSYN && it.erBearbeidet } + .mapNotNull { it.konvertereData>() } + .flatten() + .distinct() + .toSet() + .filtrerePerioderEtterVirkningstidspunkt( + virkniningstidspunkt, + ).sortedBy { it.periodeFra } + .toSet() + fun Behandling.tilKanBehandlesINyLøsningRequest() = KanBehandlesINyLøsningRequest( engangsbeløpstype = engangsbeloptype, diff --git a/src/main/kotlin/no/nav/bidrag/behandling/transformers/boforhold/Husstandsmedlemmer.kt b/src/main/kotlin/no/nav/bidrag/behandling/transformers/boforhold/Husstandsmedlemmer.kt index e0e0d2519..cb9a0901a 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/transformers/boforhold/Husstandsmedlemmer.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/transformers/boforhold/Husstandsmedlemmer.kt @@ -7,6 +7,8 @@ import no.nav.bidrag.behandling.database.datamodell.Husstandsmedlem import no.nav.bidrag.behandling.database.datamodell.Rolle import no.nav.bidrag.behandling.database.datamodell.hentSisteBearbeidetBoforhold import no.nav.bidrag.behandling.database.datamodell.henteGjeldendeBoforholdsgrunnlagForAndreVoksneIHusstanden +import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.dto.v2.boforhold.BostatusperiodeDto import no.nav.bidrag.behandling.service.BoforholdService.Companion.opprettDefaultPeriodeForAndreVoksneIHusstand import no.nav.bidrag.behandling.transformers.grunnlag.finnFødselsdato @@ -56,7 +58,7 @@ private fun Behandling.leggeInnManglendeSøknadsbarnSomHusstandsbarn( if (!grunnlag.map { it.gjelderPersonId }.contains(identSøknadsbarn)) { grunnlag.add( RelatertPersonGrunnlagDto( - partPersonId = this.rolleGrunnlagSkalHentesFor?.ident, + partPersonId = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(this)?.ident, gjelderPersonId = identSøknadsbarn, borISammeHusstandDtoListe = emptyList(), fødselsdato = søknadsbarn.fødselsdato, diff --git a/src/main/kotlin/no/nav/bidrag/behandling/transformers/grunnlag/Grunnlagsmapping.kt b/src/main/kotlin/no/nav/bidrag/behandling/transformers/grunnlag/Grunnlagsmapping.kt index 2c53e271a..f8870db81 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/transformers/grunnlag/Grunnlagsmapping.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/transformers/grunnlag/Grunnlagsmapping.kt @@ -1,9 +1,12 @@ package no.nav.bidrag.behandling.transformers.grunnlag import no.nav.bidrag.behandling.database.datamodell.Behandling +import no.nav.bidrag.behandling.database.datamodell.Grunnlag import no.nav.bidrag.behandling.database.datamodell.Inntekt import no.nav.bidrag.behandling.database.datamodell.Inntektspost +import no.nav.bidrag.behandling.database.datamodell.Rolle import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype +import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagstype import no.nav.bidrag.behandling.transformers.nærmesteHeltall import no.nav.bidrag.domene.enums.diverse.Kilde import no.nav.bidrag.domene.enums.inntekt.Inntektsrapportering @@ -27,7 +30,6 @@ val summertYtelsetyper = setOf( Inntektsrapportering.BARNETILLEGG, Inntektsrapportering.KONTANTSTØTTE, - Inntektsrapportering.BARNETILSYN, Inntektsrapportering.SMÅBARNSTILLEGG, Inntektsrapportering.UTVIDET_BARNETRYGD, ) @@ -128,3 +130,27 @@ operator fun BeregnGrunnlag.plus(grunnlag: List) = copy( grunnlagListe = (grunnlagListe + grunnlag).toSet().toList(), ) + +fun Behandling.henteNyesteGrunnlag( + grunnlagstype: Grunnlagstype, + rolleInnhentetFor: Rolle, +): Grunnlag? = + grunnlag + .filter { + it.type == grunnlagstype.type && it.rolle.id == rolleInnhentetFor.id && grunnlagstype.erBearbeidet == it.erBearbeidet + }.toSet() + .maxByOrNull { it.innhentet } + +fun Behandling.henteNyesteGrunnlag( + grunnlagstype: Grunnlagstype, + rolle: Rolle, + gjelder: Personident?, +): Grunnlag? = + grunnlag + .filter { + it.type == grunnlagstype.type && + it.rolle.id == rolle.id && + grunnlagstype.erBearbeidet == it.erBearbeidet && + it.gjelder == gjelder?.verdi + }.toSet() + .maxByOrNull { it.innhentet } diff --git a/src/main/kotlin/no/nav/bidrag/behandling/transformers/grunnlag/InnhentetGrunnlagMapping.kt b/src/main/kotlin/no/nav/bidrag/behandling/transformers/grunnlag/InnhentetGrunnlagMapping.kt index fee2066ce..6913b4585 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/transformers/grunnlag/InnhentetGrunnlagMapping.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/transformers/grunnlag/InnhentetGrunnlagMapping.kt @@ -8,6 +8,7 @@ import no.nav.bidrag.behandling.database.datamodell.konvertereData import no.nav.bidrag.behandling.database.grunnlag.SkattepliktigeInntekter import no.nav.bidrag.behandling.database.grunnlag.SummerteInntekter import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.service.hentNyesteIdent import no.nav.bidrag.behandling.transformers.vedtak.hentPersonNyesteIdent import no.nav.bidrag.behandling.transformers.vedtak.mapping.tilvedtak.tilGrunnlagsobjekt @@ -152,13 +153,13 @@ fun List.opprettInnhentetHusstandsmedlemGrunnlagForSøknadsbarnHvisMan RelatertPersonGrunnlagDto( fødselsdato = it.fødselsdato, gjelderPersonId = it.ident, - partPersonId = behandling.rolleGrunnlagSkalHentesFor!!.ident, + partPersonId = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!.ident, navn = it.navn, relasjon = Familierelasjon.BARN, borISammeHusstandDtoListe = emptyList(), ).tilGrunnlagsobjekt( LocalDateTime.now(), - personobjekter.hentPersonNyesteIdent(behandling.rolleGrunnlagSkalHentesFor!!.ident)!!.referanse, + personobjekter.hentPersonNyesteIdent(Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!.ident)!!.referanse, personobjekter.hentPersonNyesteIdent(it.ident)!!.referanse, ) } diff --git a/src/main/kotlin/no/nav/bidrag/behandling/transformers/underhold/Utvidelser.kt b/src/main/kotlin/no/nav/bidrag/behandling/transformers/underhold/Utvidelser.kt index 76d8724e5..f50c14e63 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/transformers/underhold/Utvidelser.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/transformers/underhold/Utvidelser.kt @@ -1,11 +1,36 @@ package no.nav.bidrag.behandling.transformers.underhold +import io.github.oshai.kotlinlogging.KotlinLogging import no.nav.bidrag.behandling.database.datamodell.Barnetilsyn import no.nav.bidrag.behandling.database.datamodell.Behandling +import no.nav.bidrag.behandling.database.datamodell.Grunnlag +import no.nav.bidrag.behandling.database.datamodell.Underholdskostnad +import no.nav.bidrag.behandling.database.datamodell.hentAlleAktiv +import no.nav.bidrag.behandling.database.datamodell.hentAlleIkkeAktiv +import no.nav.bidrag.behandling.database.datamodell.hentGrunnlagForType +import no.nav.bidrag.behandling.database.datamodell.konvertereData +import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype +import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagstype +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.dto.v2.underhold.BarnDto import no.nav.bidrag.behandling.dto.v2.underhold.DatoperiodeDto import no.nav.bidrag.behandling.dto.v2.underhold.StønadTilBarnetilsynDto +import no.nav.bidrag.behandling.transformers.Jsonoperasjoner.Companion.tilJson +import no.nav.bidrag.behandling.transformers.behandling.henteAktiverteGrunnlag +import no.nav.bidrag.behandling.transformers.behandling.henteEndringerIBarnetilsyn +import no.nav.bidrag.behandling.transformers.behandling.henteUaktiverteGrunnlag +import no.nav.bidrag.behandling.transformers.grunnlag.henteNyesteGrunnlag import no.nav.bidrag.domene.enums.barnetilsyn.Skolealder +import no.nav.bidrag.domene.enums.barnetilsyn.Tilsynstype +import no.nav.bidrag.domene.enums.diverse.Kilde +import no.nav.bidrag.domene.ident.Personident +import no.nav.bidrag.transport.behandling.grunnlag.response.BarnetilsynGrunnlagDto +import java.time.LocalDate +import java.time.LocalDateTime + +private val log = KotlinLogging.logger {} + +const val ALDER_VED_SKOLESTART = 6L fun Barnetilsyn.tilStønadTilBarnetilsynDto(): StønadTilBarnetilsynDto = StønadTilBarnetilsynDto( @@ -15,13 +40,17 @@ fun Barnetilsyn.tilStønadTilBarnetilsynDto(): StønadTilBarnetilsynDto = when (this.under_skolealder) { true -> Skolealder.UNDER false -> Skolealder.OVER - else -> Skolealder.IKKE_ANGITT + else -> null + }, + tilsynstype = + when (this.omfang) { + Tilsynstype.IKKE_ANGITT -> null + else -> this.omfang }, - tilsynstype = this.omfang, kilde = this.kilde, ) -fun List.tilStønadTilBarnetilsynDtos() = map { it.tilStønadTilBarnetilsynDto() }.toSet() +fun Set.tilStønadTilBarnetilsynDtos() = map { it.tilStønadTilBarnetilsynDto() }.toSet() fun Behandling.harAndreBarnIUnderhold() = this.underholdskostnader.find { it.barnetsRolleIBehandlingen == null } != null @@ -34,3 +63,162 @@ fun BarnDto.annetBarnMedSammePersonidentEksistererFraFør(behandling: Behandling behandling.underholdskostnader .filter { it.person.ident != null } .find { it.person.ident == this.personident?.verdi } != null + +fun Set.tilBarnetilsyn(u: Underholdskostnad) = this.map { it.tilBarnetilsyn(u) }.toSet() + +fun BarnetilsynGrunnlagDto.tilBarnetilsyn(u: Underholdskostnad): Barnetilsyn { + fun erUnderSkolealder(fødselsdato: LocalDate) = fødselsdato.plusYears(ALDER_VED_SKOLESTART).year > LocalDate.now().year + + return Barnetilsyn( + underholdskostnad = u, + fom = this.periodeFra, + tom = this.periodeTil?.minusDays(1), + kilde = Kilde.OFFENTLIG, + omfang = this.tilsynstype ?: Tilsynstype.IKKE_ANGITT, + under_skolealder = erUnderSkolealder(u.person.henteFødselsdato), + ) +} + +fun Set.justerePerioderEtterVirkningsdato() = forEach { it.justerePerioder() } + +fun Grunnlag.justerePerioderForBearbeidaBarnetilsynEtterVirkningstidspunkt(overskriveAktiverte: Boolean = true) { + val barnetilsyn = konvertereData>()!! + + val virkningstidspunkt = behandling.virkningstidspunktEllerSøktFomDato + + barnetilsyn + .groupBy { it.barnPersonId } + .forEach { (gjelder, perioder) -> + perioder + .filter { it.periodeFra < virkningstidspunkt } + .forEach { periode -> + if (periode.periodeTil != null && virkningstidspunkt >= periode.periodeTil) { + barnetilsyn.remove(periode) + } else { + barnetilsyn.add(periode.copy(periodeFra = virkningstidspunkt)) + barnetilsyn.remove(periode) + } + } + + behandling.overskriveBearbeidaBarnetilsynsgrunnlag(gjelder, barnetilsyn, overskriveAktiverte) + } +} + +private fun Underholdskostnad.justerePerioder() { + val virkningsdato = behandling.virkningstidspunktEllerSøktFomDato + + barnetilsyn.filter { it.fom < virkningsdato }.forEach { periode -> + if (periode.tom != null && virkningsdato >= periode.tom) { + barnetilsyn.remove(periode) + } else { + periode.fom = virkningsdato + } + } + + faktiskeTilsynsutgifter.filter { it.fom < virkningsdato }.forEach { periode -> + if (periode.tom != null && virkningsdato >= periode.tom) { + faktiskeTilsynsutgifter.remove(periode) + } else { + periode.fom = virkningsdato + } + } + + tilleggsstønad.filter { it.fom < virkningsdato }.forEach { periode -> + if (periode.tom != null && virkningsdato >= periode.tom) { + tilleggsstønad.remove(periode) + } else { + periode.fom = virkningsdato + } + } +} + +private fun Behandling.overskriveBearbeidaBarnetilsynsgrunnlag( + gjelder: String?, + perioder: Set, + overskriveAktiverte: Boolean = true, +) { + val grunnlagsdatatype = Grunnlagsdatatype.BARNETILSYN + + val grunnlagSomSkalOverskrives = + if (overskriveAktiverte) { + henteAktiverteGrunnlag( + Grunnlagstype(grunnlagsdatatype, true), + grunnlagsdatatype.innhentesForRolle(this)!!, + ) + } else { + henteUaktiverteGrunnlag( + Grunnlagstype(grunnlagsdatatype, true), + grunnlagsdatatype.innhentesForRolle(this)!!, + ) + } + + grunnlagSomSkalOverskrives.find { it.gjelder == gjelder }?.let { it.data = tilJson(perioder) } +} + +fun Behandling.aktivereBarnetilsynHvisIngenEndringerMåAksepteres() { + val ikkeAktiveGrunnlag = grunnlag.hentAlleIkkeAktiv() + val aktiveGrunnlag = grunnlag.hentAlleAktiv().toSet() + if (ikkeAktiveGrunnlag.isEmpty()) return + val endringerSomMåBekreftes = ikkeAktiveGrunnlag.henteEndringerIBarnetilsyn(aktiveGrunnlag, this) + val rolleInnhentetFor = Grunnlagsdatatype.BARNETILSYN.innhentesForRolle(this) + + underholdskostnader + .filter { it.person.rolle.isNotEmpty() } + .filter { u -> + endringerSomMåBekreftes?.stønadTilBarnetilsyn?.none { it.key == u.person.personident } ?: true + }.forEach { u -> + val ikkeaktivtGrunnlag = + ikkeAktiveGrunnlag + .hentGrunnlagForType( + Grunnlagsdatatype.BARNETILSYN, + rolleInnhentetFor?.personident!!.verdi, + ).find { it.gjelder != null && it.gjelder == u.person.personident!!.verdi } ?: return@forEach + + log.info { + "Ikke-aktive grunnlag type ${Grunnlagsdatatype.BOFORHOLD} med id ${ikkeaktivtGrunnlag.id} " + + " for rolle ${rolleInnhentetFor.rolletype} i behandling ${this.id} har ingen " + + "endringer som må aksepteres av saksbehandler. Aktiverer automatisk det nyinnhenta grunnlaget." + } + + ikkeaktivtGrunnlag.aktiv = LocalDateTime.now() + } + + aktivereOriginaltBarnetilsynsgrunnlagHvisAktivertForAlleBarn() +} + +private fun Behandling.aktivereOriginaltBarnetilsynsgrunnlagHvisAktivertForAlleBarn() { + val grunnlagsdatatype = Grunnlagsdatatype.BARNETILSYN + val nyesteOriginaleBarnetilsynsgrunnlag = + grunnlagsdatatype.innhentesForRolle(this)?.let { + this.henteNyesteGrunnlag(Grunnlagstype(grunnlagsdatatype, false), it) + } + + nyesteOriginaleBarnetilsynsgrunnlag?.let { + if (nyesteOriginaleBarnetilsynsgrunnlag.aktiv == null && + this.erSamtligeBearbeidaBarnetilsynsgrunnlagAktivert(it) + ) { + nyesteOriginaleBarnetilsynsgrunnlag.aktiv = LocalDateTime.now() + } + } +} + +private fun Behandling.erSamtligeBearbeidaBarnetilsynsgrunnlagAktivert(bmsNyesteOriginaleBarnetilsynsgrunnlag: Grunnlag): Boolean { + val grunnlagsdatatype = Grunnlagsdatatype.BARNETILSYN + bmsNyesteOriginaleBarnetilsynsgrunnlag + .konvertereData>() + ?.groupBy { + it.barnPersonId + }?.forEach { + val nyesteBearbeidaBarnetilsynForBarn = + this.henteNyesteGrunnlag( + Grunnlagstype(grunnlagsdatatype, true), + grunnlagsdatatype.innhentesForRolle(this)!!, + Personident(it.key), + ) + + if (nyesteBearbeidaBarnetilsynForBarn?.aktiv == null) { + return false + } + } + return true +} diff --git a/src/main/kotlin/no/nav/bidrag/behandling/transformers/vedtak/mapping/fravedtak/VedtakGrunnlagTilGrunnlagMapping.kt b/src/main/kotlin/no/nav/bidrag/behandling/transformers/vedtak/mapping/fravedtak/VedtakGrunnlagTilGrunnlagMapping.kt index 0d19bb14c..cfa863d70 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/transformers/vedtak/mapping/fravedtak/VedtakGrunnlagTilGrunnlagMapping.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/transformers/vedtak/mapping/fravedtak/VedtakGrunnlagTilGrunnlagMapping.kt @@ -143,7 +143,7 @@ fun List.hentInnhentetSivilstand() = } } -fun List.hentBarnetilsynListe() = +fun List.henteGrunnlagBarnetilsyn() = filtrerBasertPåEgenReferanse(grunnlagType = Grunnlagstype.INNHENTET_INNTEKT_BARNETILSYN) .flatMap { val gjelder = hentPersonMedReferanse(it.gjelderReferanse)!! @@ -389,11 +389,6 @@ fun List.hentInnntekterBearbeidet( Inntektsrapportering.BARNETILLEGG, innhentetTidspunkt(Grunnlagstype.INNHENTET_INNTEKT_BARNETILLEGG), ), - opprettGrunnlagBearbeidet( - Grunnlagsdatatype.BARNETILSYN, - Inntektsrapportering.BARNETILSYN, - innhentetTidspunkt(Grunnlagstype.INNHENTET_INNTEKT_BARNETILSYN), - ), opprettGrunnlagBearbeidet( Grunnlagsdatatype.UTVIDET_BARNETRYGD, Inntektsrapportering.UTVIDET_BARNETRYGD, diff --git a/src/main/kotlin/no/nav/bidrag/behandling/transformers/vedtak/mapping/fravedtak/VedtakTilBehandlingMappingFelles.kt b/src/main/kotlin/no/nav/bidrag/behandling/transformers/vedtak/mapping/fravedtak/VedtakTilBehandlingMappingFelles.kt index 69dc40340..0b3ca0882 100644 --- a/src/main/kotlin/no/nav/bidrag/behandling/transformers/vedtak/mapping/fravedtak/VedtakTilBehandlingMappingFelles.kt +++ b/src/main/kotlin/no/nav/bidrag/behandling/transformers/vedtak/mapping/fravedtak/VedtakTilBehandlingMappingFelles.kt @@ -135,6 +135,7 @@ internal fun List.mapGrunnlag( ): MutableSet = ( hentGrunnlagIkkeInntekt(behandling, lesemodus) + + hentGrunnlagBarnetilsyn(behandling, lesemodus) + hentGrunnlagInntekt( behandling, lesemodus, @@ -341,6 +342,37 @@ fun List.hentGrunnlagIkkeInntekt( }, ).flatten() +private fun List.hentGrunnlagBarnetilsyn( + behandling: Behandling, + lesemodus: Boolean, +) = henteGrunnlagBarnetilsyn() + .groupBy { it.partPersonId } + .map { (gjelderIdent, grunnlag) -> + + val ikkebearbeida = + behandling.opprettGrunnlag( + Grunnlagsdatatype.BARNETILSYN, + grunnlag, + gjelderIdent, + innhentetTidspunkt(Grunnlagstype.INNHENTET_INNTEKT_BARNETILSYN), + lesemodus, + ) + + val bearbeida = + grunnlag.groupBy { it.barnPersonId }.map { (personidentBarn, barnetsGrunnlag) -> + behandling.opprettGrunnlag( + Grunnlagsdatatype.BARNETILSYN, + barnetsGrunnlag, + gjelderIdent, + innhentetTidspunkt(Grunnlagstype.INNHENTET_INNTEKT_BARNETILSYN), + lesemodus, + true, + personidentBarn, + ) + } + listOf(ikkebearbeida) + bearbeida + }.flatten() + private fun List.hentGrunnlagInntekt( behandling: Behandling, lesemodus: Boolean, @@ -389,17 +421,6 @@ private fun List.hentGrunnlagInntekt( lesemodus, ) }, - hentBarnetilsynListe() - .groupBy { it.partPersonId } - .map { (gjelderIdent, grunnlag) -> - behandling.opprettGrunnlag( - Grunnlagsdatatype.BARNETILSYN, - grunnlag, - gjelderIdent, - innhentetTidspunkt(Grunnlagstype.INNHENTET_INNTEKT_BARNETILSYN), - lesemodus, - ) - }, hentKontantstøtteListe() .groupBy { it.partPersonId } .map { (gjelderIdent, grunnlag) -> diff --git a/src/test/kotlin/no/nav/bidrag/behandling/controller/UnderholdControllerTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/controller/UnderholdControllerTest.kt index 6c7a71ff5..a37e21fd8 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/controller/UnderholdControllerTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/controller/UnderholdControllerTest.kt @@ -334,6 +334,7 @@ class UnderholdControllerTest : KontrollerTestRunner() { } @Test + @Transactional open fun `skal oppdatere faktiske tilsynsutgifter`() { // gitt val behandling = diff --git a/src/test/kotlin/no/nav/bidrag/behandling/controller/behandling/LesBehandlingTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/controller/behandling/LesBehandlingTest.kt index 2714b38c2..8ca7bfe6c 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/controller/behandling/LesBehandlingTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/controller/behandling/LesBehandlingTest.kt @@ -3,6 +3,7 @@ package no.nav.bidrag.behandling.controller.behandling import io.kotest.assertions.assertSoftly import io.kotest.matchers.collections.shouldBeEmpty import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.maps.shouldHaveSize import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldNotBe import no.nav.bidrag.behandling.dto.v2.behandling.BehandlingDtoV2 @@ -79,6 +80,7 @@ class LesBehandlingTest : BehandlingControllerTest() { aktiveGrunnlagsdata.arbeidsforhold shouldHaveSize 3 aktiveGrunnlagsdata.husstandsmedlem shouldHaveSize 5 aktiveGrunnlagsdata.sivilstand!!.grunnlag shouldHaveSize 2 + aktiveGrunnlagsdata.stønadTilBarnetilsyn!!.grunnlag shouldHaveSize 2 } @Test diff --git a/src/test/kotlin/no/nav/bidrag/behandling/controller/behandling/OppretteBehandlingFraVedtakTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/controller/behandling/OppretteBehandlingFraVedtakTest.kt index 418207aa7..42f87aba7 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/controller/behandling/OppretteBehandlingFraVedtakTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/controller/behandling/OppretteBehandlingFraVedtakTest.kt @@ -71,7 +71,7 @@ class OppretteBehandlingFraVedtakTest : BehandlingControllerTest() { assertSoftly(behandling) { roller shouldHaveSize 3 inntekter shouldHaveSize 15 - grunnlag shouldHaveSize 36 + grunnlag shouldHaveSize 37 innkrevingstype shouldBe Innkrevingstype.MED_INNKREVING opprinneligVedtakstidspunkt shouldHaveSize 1 opprinneligVedtakstidspunkt shouldContain LocalDateTime.parse("2024-02-23T15:34:27.275019") 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 e6c1eada4..c2238df73 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/service/BehandlingServiceTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/service/BehandlingServiceTest.kt @@ -30,6 +30,7 @@ import no.nav.bidrag.behandling.dto.v1.behandling.OpprettKategoriRequestDto import no.nav.bidrag.behandling.dto.v1.behandling.OpprettRolleDto import no.nav.bidrag.behandling.dto.v2.behandling.AktivereGrunnlagRequestV2 import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.transformers.Dtomapper import no.nav.bidrag.behandling.transformers.Jsonoperasjoner.Companion.jsonListeTilObjekt import no.nav.bidrag.behandling.transformers.Jsonoperasjoner.Companion.tilJson @@ -41,6 +42,8 @@ import no.nav.bidrag.behandling.transformers.boforhold.tilSivilstandRequest import no.nav.bidrag.behandling.transformers.tilType import no.nav.bidrag.behandling.utils.hentInntektForBarn import no.nav.bidrag.behandling.utils.testdata.TestdataManager +import no.nav.bidrag.behandling.utils.testdata.leggeTilGjeldendeBarnetillegg +import no.nav.bidrag.behandling.utils.testdata.leggeTilNyttBarnetilsyn import no.nav.bidrag.behandling.utils.testdata.oppretteArbeidsforhold import no.nav.bidrag.behandling.utils.testdata.oppretteBehandlingRoller import no.nav.bidrag.behandling.utils.testdata.oppretteTestbehandling @@ -70,6 +73,7 @@ import no.nav.bidrag.domene.enums.vedtak.VirkningstidspunktÅrsakstype import no.nav.bidrag.domene.ident.Personident import no.nav.bidrag.sivilstand.SivilstandApi import no.nav.bidrag.sivilstand.dto.Sivilstand +import no.nav.bidrag.transport.behandling.grunnlag.response.BarnetilsynGrunnlagDto import no.nav.bidrag.transport.behandling.grunnlag.response.BorISammeHusstandDto import no.nav.bidrag.transport.behandling.grunnlag.response.RelatertPersonGrunnlagDto import no.nav.bidrag.transport.behandling.grunnlag.response.SivilstandGrunnlagDto @@ -1260,7 +1264,76 @@ class BehandlingServiceTest : TestContainerRunner() { } @Test - open fun `skal aktivere andre voksne i husstan`() { + open fun `skal aktivere andre voksne i husstanden`() { + } + } + + @Nested + open inner class Bidrag { + @Test + @Transactional + open fun `skal aktivere barnetilsyn`() { + // gitt + val b = + oppretteTestbehandling( + false, + false, + false, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + kjøreStubber(b) + val barnetilsynInnhentesForRolle = Grunnlagsdatatype.BARNETILSYN.innhentesForRolle(b)!! + barnetilsynInnhentesForRolle shouldBe b.bidragsmottaker!! + val innhentet = LocalDateTime.now() + + // gjeldende barnetilsyn + b.leggeTilGjeldendeBarnetillegg() + + // nytt barnetilsyn + b.leggeTilNyttBarnetilsyn() + + testdataManager.lagreBehandlingNewTransaction(b) + + assertSoftly(b.grunnlag.filter { Grunnlagsdatatype.BARNETILSYN == it.type }) { g -> + g shouldHaveSize 5 + g.filter { it.aktiv == null } shouldHaveSize 3 + } + + // hvis + behandlingService.aktivereGrunnlag( + b.id!!, + AktivereGrunnlagRequestV2( + b.bidragsmottaker!!.personident!!, + Grunnlagsdatatype.BARNETILSYN, + true, + Personident(testdataBarn1.ident), + ), + ) + + // så + var oppdatertBehandling = behandlingRepository.findBehandlingById(b.id!!).get() + assertSoftly(oppdatertBehandling.grunnlag.filter { Grunnlagsdatatype.BARNETILSYN == it.type }) { a -> + a shouldHaveSize 5 + a.filter { it.aktiv != null } shouldHaveSize 3 + } + + // hvis + behandlingService.aktivereGrunnlag( + b.id!!, + AktivereGrunnlagRequestV2( + b.bidragsmottaker!!.personident!!, + Grunnlagsdatatype.BARNETILSYN, + true, + Personident(testdataBarn2.ident), + ), + ) + + oppdatertBehandling = behandlingRepository.findBehandlingById(b.id!!).get() + assertSoftly(oppdatertBehandling.grunnlag.filter { Grunnlagsdatatype.BARNETILSYN == it.type }) { a -> + a shouldHaveSize 5 + a.filter { it.aktiv != null } shouldHaveSize 5 + } } } } @@ -1544,6 +1617,59 @@ class BehandlingServiceTest : TestContainerRunner() { } } + @Test + @Transactional + open fun `skal oppdatere ikke aktivert barnetilsyn ved endring av virkningsdato fremover i tid`() { + // gitt + val b = + testdataManager.oppretteBehandling( + false, + false, + false, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + kjøreStubber(b) + val barnetilsynInnhentesForRolle = Grunnlagsdatatype.BARNETILSYN.innhentesForRolle(b)!! + barnetilsynInnhentesForRolle shouldBe b.bidragsmottaker!! + stubUtils.stubbeGrunnlagsinnhentingForBehandling(b) + stubPersonConsumer() + grunnlagService.oppdatereGrunnlagForBehandling(b) + + b.leggeTilGjeldendeBarnetillegg() + b.leggeTilNyttBarnetilsyn() + + assertSoftly(b.grunnlag.filter { Grunnlagsdatatype.BARNETILSYN == it.type }) { g -> + g shouldHaveSize 5 + g.filter { it.aktiv == null } shouldHaveSize 3 + } + + val ikkeAktive = b.grunnlag.hentSisteIkkeAktiv().filter { Grunnlagsdatatype.BARNETILSYN == it.type } + + val nyVirkningsdato = + ikkeAktive + .flatMap { it.konvertereData>()!! } + .minBy { it.periodeFra } + .periodeFra + .plusMonths(6) + + // hvis + behandlingService.oppdatereVirkningstidspunkt( + b.id!!, + OppdatereVirkningstidspunkt(virkningstidspunkt = nyVirkningsdato), + ) + + // så + entityManager.flush() + entityManager.refresh(b) + assertSoftly(b.grunnlag.filter { Grunnlagsdatatype.BARNETILSYN == it.type }) { s -> + s shouldHaveSize 5 + jsonListeTilObjekt( + s.first { it.erBearbeidet && it.aktiv == null }.data, + ).minByOrNull { it.periodeFra }!!.periodeFra shouldBeEqual nyVirkningsdato + } + } + @Test @Transactional open fun `skal oppdatere perioder på andre voksne i husstand boforhold og inntekter når virkningstidspunkt på særbidrag endres`() { diff --git a/src/test/kotlin/no/nav/bidrag/behandling/service/GrunnlagServiceTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/service/GrunnlagServiceTest.kt index b6846111d..02b26d5e5 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/service/GrunnlagServiceTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/service/GrunnlagServiceTest.kt @@ -25,6 +25,7 @@ import no.nav.bidrag.behandling.database.repository.SivilstandRepository import no.nav.bidrag.behandling.dto.v2.behandling.AktivereGrunnlagRequestV2 import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagstype +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.service.GrunnlagServiceTest.Companion.tilAinntektspostDto import no.nav.bidrag.behandling.transformers.Jsonoperasjoner.Companion.jsonListeTilObjekt import no.nav.bidrag.behandling.transformers.Jsonoperasjoner.Companion.jsonTilObjekt @@ -45,6 +46,8 @@ import no.nav.bidrag.behandling.utils.testdata.tilTransformerInntekterRequest import no.nav.bidrag.behandling.utils.testdata.voksenPersonIBpsHusstand import no.nav.bidrag.boforhold.BoforholdApi import no.nav.bidrag.boforhold.dto.BoforholdResponseV2 +import no.nav.bidrag.domene.enums.barnetilsyn.Skolealder +import no.nav.bidrag.domene.enums.barnetilsyn.Tilsynstype import no.nav.bidrag.domene.enums.behandling.TypeBehandling import no.nav.bidrag.domene.enums.diverse.Kilde import no.nav.bidrag.domene.enums.grunnlag.GrunnlagRequestType @@ -77,6 +80,8 @@ import no.nav.bidrag.transport.behandling.grunnlag.response.UtvidetBarnetrygdGru import no.nav.bidrag.transport.behandling.inntekt.response.SummertÅrsinntekt import no.nav.bidrag.transport.felles.commonObjectmapper import org.assertj.core.api.Assertions.assertThat +import org.assertj.core.error.ShouldHaveDimensions.shouldHaveSize +import org.assertj.core.error.ShouldHaveSize.shouldHaveSize import org.junit.experimental.runners.Enclosed import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName @@ -232,6 +237,108 @@ class GrunnlagServiceTest : TestContainerRunner() { } } + @Test + @Transactional + open fun `skal hente og lagre barnetilsyn`() { + // gitt + val behandling = + oppretteTestbehandling( + false, + false, + false, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + testdataManager.lagreBehandlingNewTransaction(behandling) + + stubbeHentingAvPersoninfoForTestpersoner() + stubUtils.stubHentePersoninfo(personident = behandling.bidragsmottaker!!.ident!!) + behandling.roller.forEach { + when (it.rolletype) { + Rolletype.BIDRAGSMOTTAKER -> + stubUtils.stubHenteGrunnlag( + rolle = it, + navnResponsfil = "hente-grunnlagrespons-bidrag-barnetilsyn-bm.json", + ) + + else -> stubUtils.stubHenteGrunnlag(rolle = it, tomRespons = true) + } + } + + behandling.underholdskostnader shouldHaveSize 2 + behandling.underholdskostnader.flatMap { it.barnetilsyn } shouldHaveSize 0 + + // hvis + grunnlagService.oppdatereGrunnlagForBehandling(behandling) + + // så + behandling.grunnlagSistInnhentet?.toLocalDate() shouldBe LocalDate.now() + + assertSoftly(behandling.grunnlag.filter { Grunnlagsdatatype.BARNETILSYN == it.type }) { + filter { it.aktiv == null } shouldHaveSize 0 + filter { it.aktiv != null } shouldHaveSize 2 + filter { it.aktiv != null && it.erBearbeidet } shouldHaveSize 1 + filter { it.aktiv != null && !it.erBearbeidet } shouldHaveSize 1 + } + + behandling.grunnlag.filter { Rolletype.BIDRAGSMOTTAKER == it.rolle.rolletype } shouldHaveSize 2 + + val barnetilsyn = + behandling.grunnlag.find { Rolletype.BIDRAGSMOTTAKER == it.rolle.rolletype && Grunnlagsdatatype.BARNETILSYN == it.type } + assertSoftly(barnetilsyn) { + it.shouldNotBeNull() + it.aktiv.shouldNotBeNull() + it.innhentet.shouldNotBeNull() + it.data.shouldNotBeNull() + } + + assertSoftly(jsonListeTilObjekt(barnetilsyn?.data!!).sortedBy { it.periodeFra }) { + shouldHaveSize(2) + it.elementAt(0).beløp shouldBe 4000 + it.elementAt(0).periodeFra shouldBe LocalDate.of(2023, 1, 1) + it.elementAt(0).periodeTil shouldBe LocalDate.of(2024, 1, 1) + it.elementAt(0).skolealder shouldBe Skolealder.OVER + it.elementAt(0).tilsynstype shouldBe Tilsynstype.HELTID + it.elementAt(0).partPersonId shouldBe "313213213" + it.elementAt(0).barnPersonId shouldBe "1344124" + } + + behandling.underholdskostnader.flatMap { it.barnetilsyn } shouldHaveSize 2 + + val uTestbarn1 = + behandling.underholdskostnader + .find { + it.person.rolle + .first() + .personident + ?.verdi == testdataBarn1.ident + } + + assertSoftly(uTestbarn1) { + shouldNotBeNull() + harTilsynsordning shouldBe true + } + + val stønadTilBarnetilsyn = uTestbarn1!!.barnetilsyn.sortedBy { it.fom } + stønadTilBarnetilsyn shouldHaveSize 2 + + assertSoftly(stønadTilBarnetilsyn.elementAt(0)) { + it.omfang shouldBe Tilsynstype.HELTID + it.under_skolealder shouldBe true + it.fom shouldBe LocalDate.of(2023, 1, 1) + it.tom shouldBe LocalDate.of(2023, 12, 31) + it.kilde shouldBe Kilde.OFFENTLIG + } + + assertSoftly(stønadTilBarnetilsyn.elementAt(1)) { + it.omfang shouldBe Tilsynstype.HELTID + it.under_skolealder shouldBe true + it.fom shouldBe LocalDate.of(2024, 1, 1) + it.tom shouldBe null + it.kilde shouldBe Kilde.OFFENTLIG + } + } + @Test @Transactional open fun `skal lagre arbeidsforhold`() { @@ -1561,7 +1668,7 @@ class GrunnlagServiceTest : TestContainerRunner() { grunnlagService.oppdatereGrunnlagForBehandling(behandling) // så - behandling.grunnlag.size shouldBe totaltAntallGrunnlag + 1 + behandling.grunnlag.size shouldBe totaltAntallGrunnlag + 2 val grunnlagBarnetillegg = behandling.grunnlag @@ -2745,7 +2852,7 @@ class GrunnlagServiceTest : TestContainerRunner() { behandling = behandling, innhentet = LocalDateTime.now().minusDays(3), data = commonObjectmapper.writeValueAsString(voksneIBpsHusstand), - rolle = behandling.rolleGrunnlagSkalHentesFor!!, + rolle = Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN.innhentesForRolle(behandling)!!, type = Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN, erBearbeidet = true, ), @@ -2757,7 +2864,7 @@ class GrunnlagServiceTest : TestContainerRunner() { behandling = behandling, innhentet = LocalDateTime.now().minusDays(3), data = bfg!!.data, - rolle = behandling.rolleGrunnlagSkalHentesFor!!, + rolle = Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN.innhentesForRolle(behandling)!!, type = Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN, erBearbeidet = false, ), diff --git a/src/test/kotlin/no/nav/bidrag/behandling/service/UnderholdServiceTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/service/UnderholdServiceTest.kt index b7e8f4e48..b435f34b5 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/service/UnderholdServiceTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/service/UnderholdServiceTest.kt @@ -5,9 +5,12 @@ import io.kotest.assertions.assertSoftly import io.kotest.matchers.collections.shouldBeEmpty import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.collections.shouldNotBeEmpty +import io.kotest.matchers.comparables.shouldBeGreaterThan +import io.kotest.matchers.date.shouldBeBefore import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.nulls.shouldNotBeNull import io.kotest.matchers.shouldBe +import io.kotest.matchers.shouldNotBe import io.mockk.every import io.mockk.impl.annotations.MockK import io.mockk.junit5.MockKExtension @@ -17,8 +20,16 @@ import no.nav.bidrag.behandling.database.datamodell.FaktiskTilsynsutgift import no.nav.bidrag.behandling.database.datamodell.Person import no.nav.bidrag.behandling.database.datamodell.Tilleggsstønad import no.nav.bidrag.behandling.database.datamodell.Underholdskostnad +import no.nav.bidrag.behandling.database.datamodell.hentAlleAktiv +import no.nav.bidrag.behandling.database.datamodell.hentAlleIkkeAktiv +import no.nav.bidrag.behandling.database.datamodell.henteNyesteAktiveGrunnlag +import no.nav.bidrag.behandling.database.datamodell.henteNyesteIkkeAktiveGrunnlag +import no.nav.bidrag.behandling.database.datamodell.konvertereData import no.nav.bidrag.behandling.database.repository.PersonRepository import no.nav.bidrag.behandling.database.repository.UnderholdskostnadRepository +import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype +import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagstype +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.dto.v2.underhold.BarnDto import no.nav.bidrag.behandling.dto.v2.underhold.DatoperiodeDto import no.nav.bidrag.behandling.dto.v2.underhold.OppdatereBegrunnelseRequest @@ -30,9 +41,14 @@ import no.nav.bidrag.behandling.dto.v2.underhold.StønadTilBarnetilsynDto import no.nav.bidrag.behandling.dto.v2.underhold.Underholdselement import no.nav.bidrag.behandling.transformers.Dtomapper import no.nav.bidrag.behandling.transformers.beregning.ValiderBeregning +import no.nav.bidrag.behandling.transformers.underhold.aktivereBarnetilsynHvisIngenEndringerMåAksepteres import no.nav.bidrag.behandling.transformers.vedtak.mapping.tilvedtak.BehandlingTilGrunnlagMappingV2 import no.nav.bidrag.behandling.transformers.vedtak.mapping.tilvedtak.VedtakGrunnlagMapper +import no.nav.bidrag.behandling.utils.testdata.leggeTilGjeldendeBarnetillegg +import no.nav.bidrag.behandling.utils.testdata.leggeTilNyttBarnetilsyn import no.nav.bidrag.behandling.utils.testdata.oppretteTestbehandling +import no.nav.bidrag.behandling.utils.testdata.testdataBarn1 +import no.nav.bidrag.behandling.utils.testdata.testdataBarn2 import no.nav.bidrag.beregn.barnebidrag.BeregnBarnebidragApi import no.nav.bidrag.beregn.barnebidrag.BeregnGebyrApi import no.nav.bidrag.beregn.barnebidrag.BeregnSamværsklasseApi @@ -44,6 +60,7 @@ import no.nav.bidrag.domene.enums.behandling.TypeBehandling import no.nav.bidrag.domene.enums.diverse.Kilde import no.nav.bidrag.domene.ident.Personident import no.nav.bidrag.transport.behandling.felles.grunnlag.NotatGrunnlag +import no.nav.bidrag.transport.behandling.grunnlag.response.BarnetilsynGrunnlagDto import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Nested @@ -581,7 +598,7 @@ class UnderholdServiceTest { Skolealder.UNDER -> true else -> null }, - request.tilsynstype, + request.tilsynstype!!, kilde = Kilde.OFFENTLIG, ), ) @@ -662,6 +679,130 @@ class UnderholdServiceTest { kilde shouldBe Kilde.MANUELL } } + + @Test + open fun `skal sette kilde til manuell dersom periode på offentlig barnetilsynsinnslag endres`() { + // gitt + val behandling = + oppretteTestbehandling( + setteDatabaseider = true, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + + val barnIBehandling = behandling.søknadsbarn.first() + barnIBehandling.ident.shouldNotBeNull() + + val underholdskostnad = + behandling.underholdskostnader.find { + barnIBehandling.ident!! == it.barnetsRolleIBehandlingen?.ident + } + underholdskostnad.shouldNotBeNull() + + underholdskostnad.barnetilsyn.add( + Barnetilsyn( + id = 1, + underholdskostnad = underholdskostnad, + fom = LocalDate.now(), + under_skolealder = true, + kilde = Kilde.OFFENTLIG, + omfang = Tilsynstype.HELTID, + ), + ) + + underholdskostnad.barnetilsyn shouldHaveSize 1 + + val request = + StønadTilBarnetilsynDto( + id = 1, + periode = + DatoperiodeDto( + LocalDate.now().minusMonths(6).withDayOfMonth(1), + null, + ), + skolealder = Skolealder.OVER, + tilsynstype = Tilsynstype.DELTID, + ) + + // hvis + underholdService.oppdatereStønadTilBarnetilsynManuelt(underholdskostnad, request) + + // så + val u = behandling.underholdskostnader.first() + u.shouldNotBeNull() + u.barnetilsyn.shouldNotBeEmpty() + u.barnetilsyn shouldHaveSize 1 + + assertSoftly(u.barnetilsyn.first()) { + fom shouldBe request.periode.fom + tom shouldBe request.periode.tom + under_skolealder shouldBe false + omfang shouldBe request.tilsynstype + kilde shouldBe Kilde.MANUELL + } + } + + @Test + open fun `skal ikke endre kilde på offentlig innslag så lenge periode ikke endres`() { + // gitt + val behandling = + oppretteTestbehandling( + setteDatabaseider = true, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + + val barnIBehandling = behandling.søknadsbarn.first() + barnIBehandling.ident.shouldNotBeNull() + + val underholdskostnad = + behandling.underholdskostnader.find { + barnIBehandling.ident!! == it.barnetsRolleIBehandlingen?.ident + } + underholdskostnad.shouldNotBeNull() + + underholdskostnad.barnetilsyn.add( + Barnetilsyn( + id = 1, + underholdskostnad = underholdskostnad, + fom = LocalDate.now(), + under_skolealder = true, + kilde = Kilde.OFFENTLIG, + omfang = Tilsynstype.HELTID, + ), + ) + + underholdskostnad.barnetilsyn shouldHaveSize 1 + + val request = + StønadTilBarnetilsynDto( + id = 1, + periode = + DatoperiodeDto( + LocalDate.now(), + null, + ), + skolealder = Skolealder.OVER, + tilsynstype = Tilsynstype.DELTID, + ) + + // hvis + underholdService.oppdatereStønadTilBarnetilsynManuelt(underholdskostnad, request) + + // så + val u = behandling.underholdskostnader.first() + u.shouldNotBeNull() + u.barnetilsyn.shouldNotBeEmpty() + u.barnetilsyn shouldHaveSize 1 + + assertSoftly(u.barnetilsyn.first()) { + fom shouldBe request.periode.fom + tom shouldBe request.periode.tom + under_skolealder shouldBe false + omfang shouldBe request.tilsynstype + kilde shouldBe Kilde.OFFENTLIG + } + } } @Nested @@ -869,4 +1010,238 @@ class UnderholdServiceTest { } } } + + @Nested + @DisplayName("Tester justering av perioder i fbm endring av virkningsdato") + open inner class OppdatereVirkningsdato { + @Test + open fun `skal tilpasse perioder for aktive bearbeida barnetilsynsgrunnlag etter virkningstidspunkt`() { + // gitt + val grunnlagsdatatype = Grunnlagsdatatype.BARNETILSYN + + val b = + oppretteTestbehandling( + setteDatabaseider = true, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + + b.leggeTilGjeldendeBarnetillegg() + + val nyVirkningsdato = + b + .henteNyesteAktiveGrunnlag( + Grunnlagstype(grunnlagsdatatype, false), + grunnlagsdatatype.innhentesForRolle(b)!!, + ).konvertereData>() + ?.minBy { it.periodeFra } + ?.periodeFra + ?.plusMonths(4) + + nyVirkningsdato shouldNotBe null + + b.grunnlag + .filter { Grunnlagsdatatype.BARNETILSYN == it.type && it.erBearbeidet && it.aktiv != null } + .maxBy { it.innhentet } + .konvertereData>() + ?.minBy { it.periodeFra } + ?.periodeFra + ?.shouldBeBefore(nyVirkningsdato!!) + b.virkningstidspunkt = nyVirkningsdato + + // hvis + underholdService.tilpasseUnderholdEtterVirkningsdato(b) + + // så + val aktiveBearbeidaBarnetilsyn = + b.grunnlag.hentAlleAktiv().filter { Grunnlagsdatatype.BARNETILSYN == it.type && it.erBearbeidet } + aktiveBearbeidaBarnetilsyn shouldHaveSize 1 + assertSoftly(aktiveBearbeidaBarnetilsyn.first()) { + gjelder.shouldNotBeNull() + aktiv.shouldNotBeNull() + erBearbeidet shouldBe true + } + + aktiveBearbeidaBarnetilsyn.first().konvertereData>()?.shouldHaveSize(1) + + assertSoftly(aktiveBearbeidaBarnetilsyn.first().konvertereData>()?.first()) { + it?.periodeFra.shouldNotBeNull() + it!!.periodeFra shouldBe nyVirkningsdato + it.periodeTil shouldBe null + it.beløp shouldBe 4000 + it.barnPersonId shouldBe testdataBarn1.ident + } + } + + @Test + open fun `skal tilpasse perioder for ikke-aktive bearbeida barnetilsynsgrunnlag etter virkningstidspunkt`() { + // gitt + val grunnlagsdatatype = Grunnlagsdatatype.BARNETILSYN + + val b = + oppretteTestbehandling( + setteDatabaseider = true, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + + b.leggeTilGjeldendeBarnetillegg() + b.leggeTilNyttBarnetilsyn() + + val nyVirkningsdato = + b + .henteNyesteIkkeAktiveGrunnlag( + Grunnlagstype(grunnlagsdatatype, false), + grunnlagsdatatype.innhentesForRolle(b)!!, + ).konvertereData>() + ?.filter { it.barnPersonId == testdataBarn1.ident } + ?.minBy { it.periodeFra } + ?.periodeFra + ?.plusMonths(1) + + nyVirkningsdato shouldNotBe null + + b.grunnlag + .filter { Grunnlagsdatatype.BARNETILSYN == it.type && it.erBearbeidet && it.aktiv == null } + .maxBy { it.innhentet } + .konvertereData>() + ?.minBy { it.periodeFra } + ?.periodeFra + ?.shouldBeBefore(nyVirkningsdato!!) + b.virkningstidspunkt = nyVirkningsdato + + // hvis + underholdService.tilpasseUnderholdEtterVirkningsdato(b) + + // så + val ikkeaktiveBearbeidaBarnetilsyn = + b.grunnlag.hentAlleIkkeAktiv().filter { Grunnlagsdatatype.BARNETILSYN == it.type && it.erBearbeidet } + ikkeaktiveBearbeidaBarnetilsyn shouldHaveSize 1 + assertSoftly(ikkeaktiveBearbeidaBarnetilsyn.find { it.gjelder == testdataBarn1.ident }!!) { + gjelder.shouldNotBeNull() + aktiv.shouldBeNull() + erBearbeidet shouldBe true + } + + ikkeaktiveBearbeidaBarnetilsyn + .find { it.gjelder == testdataBarn1.ident }!! + .konvertereData>() + ?.shouldHaveSize(4) + + assertSoftly( + ikkeaktiveBearbeidaBarnetilsyn + .find { it.gjelder == testdataBarn1.ident }!! + .konvertereData>() + ?.minBy { it.periodeFra }, + ) { + it?.periodeFra.shouldNotBeNull() + it!!.periodeFra shouldBe nyVirkningsdato + it.periodeTil shouldNotBe null + it.beløp shouldBe 4500 + it.barnPersonId shouldBe testdataBarn1.ident + } + } + + @Test + open fun `skal tilpasse perioder etter virkningsdato for alle tabeller i underholdskostnad`() { + // gitt + val b = + oppretteTestbehandling( + setteDatabaseider = true, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + + b.leggeTilGjeldendeBarnetillegg() + val u = + b.underholdskostnader.find { it.barnetsRolleIBehandlingen?.personident?.verdi == testdataBarn1.ident }!! + + u.barnetilsyn.first().fom = b.virkningstidspunktEllerSøktFomDato.minusMonths(2) + + u.faktiskeTilsynsutgifter.add( + FaktiskTilsynsutgift( + underholdskostnad = u, + fom = b.virkningstidspunktEllerSøktFomDato.minusMonths(2), + tilsynsutgift = BigDecimal(5000), + kostpenger = BigDecimal(900), + ), + ) + + u.tilleggsstønad.add( + Tilleggsstønad( + underholdskostnad = u, + dagsats = BigDecimal(120), + fom = b.virkningstidspunktEllerSøktFomDato.minusMonths(2), + ), + ) + + b.virkningstidspunkt = b.virkningstidspunkt?.plusMonths(1) + + // hvis + underholdService.tilpasseUnderholdEtterVirkningsdato(b) + + // så + u.barnetilsyn.first().fom shouldBe b.virkningstidspunkt + u.faktiskeTilsynsutgifter.first().fom shouldBe b.virkningstidspunkt + u.tilleggsstønad.first().fom shouldBe b.virkningstidspunkt + } + } + + @Nested + @DisplayName("Tester automatisk aktivering av barnetilsyn") + open inner class Aktivere { + @Test + open fun `skal aktivere nytt barnetilsynsgrunnlag dersom det ikke inneholder endringer som må godkjennes`() { + // gitt + val b = + oppretteTestbehandling( + setteDatabaseider = true, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + + b.leggeTilGjeldendeBarnetillegg() + b.leggeTilNyttBarnetilsyn() + + // hvis + b.aktivereBarnetilsynHvisIngenEndringerMåAksepteres() + + // så + val ikkeaktiveBearbeidaBarnetilsyn = + b.grunnlag.hentAlleIkkeAktiv().filter { Grunnlagsdatatype.BARNETILSYN == it.type && it.erBearbeidet } + ikkeaktiveBearbeidaBarnetilsyn shouldHaveSize 1 + assertSoftly(ikkeaktiveBearbeidaBarnetilsyn.find { it.gjelder == testdataBarn1.ident }!!) { + gjelder.shouldNotBeNull() + aktiv.shouldBeNull() + erBearbeidet shouldBe true + } + + ikkeaktiveBearbeidaBarnetilsyn + .find { it.gjelder == testdataBarn1.ident }!! + .konvertereData>() + ?.shouldHaveSize(3) + + val aktiveBearbeidaBarnetilsyn = b.grunnlag.hentAlleAktiv().filter { Grunnlagsdatatype.BARNETILSYN == it.type && it.erBearbeidet } + aktiveBearbeidaBarnetilsyn shouldHaveSize 2 + + aktiveBearbeidaBarnetilsyn.filter { it.gjelder == testdataBarn2.ident } shouldHaveSize 1 + + assertSoftly(aktiveBearbeidaBarnetilsyn.find { it.gjelder == testdataBarn2.ident }) { + it?.aktiv.shouldNotBeNull() + it?.erBearbeidet shouldBe true + } + + val dataTestbarn2 = aktiveBearbeidaBarnetilsyn.find { it.gjelder == testdataBarn2.ident }.konvertereData>()!! + dataTestbarn2 shouldHaveSize 1 + + assertSoftly(dataTestbarn2.first()) { + beløp shouldBe 4000 + barnPersonId shouldBe testdataBarn2.ident + periodeFra shouldBeGreaterThan b.virkningstidspunktEllerSøktFomDato + periodeTil shouldBe null + tilsynstype shouldBe null + skolealder shouldBe null + } + } + } } diff --git a/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingBidragTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingBidragTest.kt index 08312e801..6cd4c02f1 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingBidragTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingBidragTest.kt @@ -426,7 +426,7 @@ class VedtakTilBehandlingBidragTest : CommonVedtakTilBehandlingTest() { private fun Behandling.validerGrunnlag() { assertSoftly(grunnlagListe) { - size shouldBe 16 + size shouldBe 15 filtrerEtterTypeOgIdent( Grunnlagsdatatype.SKATTEPLIKTIGE_INNTEKTER, testdataBM.ident, diff --git a/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingForskuddTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingForskuddTest.kt index ef41977f0..7cee266b6 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingForskuddTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingForskuddTest.kt @@ -325,9 +325,9 @@ class VedtakTilBehandlingForskuddTest : CommonVedtakTilBehandlingTest() { } assertSoftly(behandling.grunnlag) { - this shouldHaveSize 24 + this shouldHaveSize 25 filter { it.erBearbeidet && it.rolle.rolletype == Rolletype.BIDRAGSMOTTAKER }.shouldHaveSize( - 13, + 14, ) filter { it.erBearbeidet && it.rolle.rolletype == Rolletype.BARN }.shouldHaveSize(1) filter { !it.erBearbeidet && it.rolle.rolletype == Rolletype.BIDRAGSMOTTAKER }.shouldHaveSize( @@ -591,7 +591,7 @@ class VedtakTilBehandlingForskuddTest : CommonVedtakTilBehandlingTest() { private fun Behandling.validerGrunnlag() { assertSoftly(grunnlagListe) { - size shouldBe 24 + size shouldBe 25 filtrerEtterTypeOgIdent( Grunnlagsdatatype.SKATTEPLIKTIGE_INNTEKTER, testdataBarn2.ident, @@ -653,7 +653,7 @@ class VedtakTilBehandlingForskuddTest : CommonVedtakTilBehandlingTest() { Grunnlagsdatatype.BARNETILSYN, testdataBM.ident, true, - ) shouldHaveSize 1 + ) shouldHaveSize 2 filtrerEtterTypeOgIdent( Grunnlagsdatatype.SMÅBARNSTILLEGG, testdataBM.ident, diff --git "a/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingS\303\246rbidragTest.kt" "b/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingS\303\246rbidragTest.kt" index a4397bf46..0cd6bb485 100644 --- "a/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingS\303\246rbidragTest.kt" +++ "b/src/test/kotlin/no/nav/bidrag/behandling/service/VedtakTilBehandlingS\303\246rbidragTest.kt" @@ -559,7 +559,7 @@ class VedtakTilBehandlingSærbidragTest : CommonVedtakTilBehandlingTest() { private fun Behandling.validerGrunnlag() { assertSoftly(grunnlagListe) { - size shouldBe 17 + size shouldBe 16 filtrerEtterTypeOgIdent( Grunnlagsdatatype.SKATTEPLIKTIGE_INNTEKTER, testdataBM.ident, diff --git a/src/test/kotlin/no/nav/bidrag/behandling/transformers/DtoMapperTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/transformers/DtoMapperTest.kt index c942011ab..c7389542a 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/transformers/DtoMapperTest.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/transformers/DtoMapperTest.kt @@ -3,6 +3,7 @@ package no.nav.bidrag.behandling.transformers import com.ninjasquad.springmockk.MockkBean import io.kotest.assertions.assertSoftly import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.maps.shouldHaveSize import io.kotest.matchers.nulls.shouldBeNull import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldNotBe @@ -13,6 +14,8 @@ import no.nav.bidrag.behandling.database.datamodell.Grunnlag import no.nav.bidrag.behandling.database.datamodell.Notat import no.nav.bidrag.behandling.database.datamodell.Person import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle +import no.nav.bidrag.behandling.dto.v2.underhold.DatoperiodeDto import no.nav.bidrag.behandling.service.BehandlingService import no.nav.bidrag.behandling.service.BeregningEvnevurderingService import no.nav.bidrag.behandling.service.PersonService @@ -31,6 +34,8 @@ import no.nav.bidrag.beregn.barnebidrag.BeregnSamværsklasseApi import no.nav.bidrag.boforhold.dto.BoforholdResponseV2 import no.nav.bidrag.commons.web.mock.stubSjablonProvider import no.nav.bidrag.commons.web.mock.stubSjablonService +import no.nav.bidrag.domene.enums.barnetilsyn.Skolealder +import no.nav.bidrag.domene.enums.barnetilsyn.Tilsynstype import no.nav.bidrag.domene.enums.behandling.TypeBehandling import no.nav.bidrag.domene.enums.diverse.Kilde import no.nav.bidrag.domene.enums.person.Bostatuskode @@ -39,6 +44,7 @@ import no.nav.bidrag.domene.enums.rolle.Rolletype import no.nav.bidrag.domene.ident.Personident import no.nav.bidrag.sivilstand.dto.Sivilstand import no.nav.bidrag.transport.behandling.felles.grunnlag.NotatGrunnlag +import no.nav.bidrag.transport.behandling.grunnlag.response.BarnetilsynGrunnlagDto import no.nav.bidrag.transport.felles.commonObjectmapper import no.nav.bidrag.transport.person.PersonDto import org.junit.jupiter.api.BeforeEach @@ -88,7 +94,14 @@ class DtoMapperTest : TestContainerRunner() { personService, BeregnGebyrApi(stubSjablonService()), ) - dtomapper = Dtomapper(tilgangskontrollService, validering, validerBehandlingService, vedtakGrunnlagsmapper, BeregnBarnebidragApi()) + dtomapper = + Dtomapper( + tilgangskontrollService, + validering, + validerBehandlingService, + vedtakGrunnlagsmapper, + BeregnBarnebidragApi(), + ) stubUtils.stubTilgangskontrollPersonISak() every { tilgangskontrollService.harBeskyttelse(any()) } returns false every { tilgangskontrollService.harTilgang(any(), any()) } returns true @@ -184,6 +197,143 @@ class DtoMapperTest : TestContainerRunner() { } } + @Test + fun `skal returnere diff for Barnetilsyn`() { + // gitt + val behandling = + oppretteTestbehandling( + false, + false, + false, + setteDatabaseider = true, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + + val barnetilsynInnhentesForRolle = Grunnlagsdatatype.BARNETILSYN.innhentesForRolle(behandling)!! + barnetilsynInnhentesForRolle shouldBe behandling.bidragsmottaker!! + val innhentet = LocalDateTime.now() + + // gjeldende barnetilsyn + behandling.grunnlag.add( + Grunnlag( + aktiv = LocalDateTime.now().minusDays(5), + behandling = behandling, + innhentet = LocalDateTime.now().minusDays(5), + gjelder = testdataBarn1.ident, + erBearbeidet = true, + rolle = barnetilsynInnhentesForRolle, + type = Grunnlagsdatatype.BARNETILSYN, + data = + commonObjectmapper.writeValueAsString( + setOf( + BarnetilsynGrunnlagDto( + beløp = 4000, + periodeFra = LocalDate.now().minusYears(13), + periodeTil = null, + skolealder = null, + tilsynstype = null, + barnPersonId = testdataBarn1.ident, + partPersonId = barnetilsynInnhentesForRolle.ident!!, + ), + ), + ), + ), + ) + + // nytt barnetilsyn + behandling.grunnlag.add( + Grunnlag( + aktiv = null, + behandling = behandling, + innhentet = innhentet, + gjelder = testdataBarn1.ident, + erBearbeidet = true, + rolle = barnetilsynInnhentesForRolle, + type = Grunnlagsdatatype.BARNETILSYN, + data = + commonObjectmapper.writeValueAsString( + setOf( + BarnetilsynGrunnlagDto( + beløp = 4500, + periodeFra = LocalDate.now().minusYears(1), + periodeTil = LocalDate.now().minusMonths(6), + skolealder = Skolealder.IKKE_ANGITT, + tilsynstype = Tilsynstype.IKKE_ANGITT, + barnPersonId = testdataBarn1.ident, + partPersonId = barnetilsynInnhentesForRolle.ident!!, + ), + BarnetilsynGrunnlagDto( + beløp = 4600, + periodeFra = LocalDate.now().minusMonths(6), + periodeTil = LocalDate.now().minusMonths(4), + skolealder = Skolealder.OVER, + tilsynstype = Tilsynstype.HELTID, + barnPersonId = testdataBarn1.ident, + partPersonId = barnetilsynInnhentesForRolle.ident!!, + ), + BarnetilsynGrunnlagDto( + beløp = 4700, + periodeFra = LocalDate.now().minusMonths(4), + periodeTil = null, + skolealder = null, + tilsynstype = null, + barnPersonId = testdataBarn1.ident, + partPersonId = barnetilsynInnhentesForRolle.ident!!, + ), + ), + ), + ), + ) + + // hvis + val ikkeAktivereGrunnlagsdata = + dtomapper.tilAktivereGrunnlagResponseV2(behandling).ikkeAktiverteEndringerIGrunnlagsdata + + // så + ikkeAktivereGrunnlagsdata.stønadTilBarnetilsyn shouldNotBe null + + assertSoftly(ikkeAktivereGrunnlagsdata.stønadTilBarnetilsyn!!) { + stønadTilBarnetilsyn shouldNotBe null + grunnlag shouldNotBe null + innhentetTidspunkt shouldBe innhentet + } + + ikkeAktivereGrunnlagsdata.stønadTilBarnetilsyn.stønadTilBarnetilsyn.shouldHaveSize(1) + + val nyttBarnetilsyn = ikkeAktivereGrunnlagsdata.stønadTilBarnetilsyn.stønadTilBarnetilsyn[Personident(testdataBarn1.ident)] + nyttBarnetilsyn?.shouldHaveSize(3) + + assertSoftly(nyttBarnetilsyn!!.elementAt(0)) { + periode shouldBe + DatoperiodeDto( + LocalDate.now().minusYears(1), + LocalDate.now().minusMonths(6).minusDays(1), + ) + tilsynstype shouldBe null + skolealder shouldBe Skolealder.UNDER + kilde shouldBe Kilde.OFFENTLIG + } + + assertSoftly(nyttBarnetilsyn.elementAt(1)) { + skolealder shouldBe Skolealder.UNDER + tilsynstype shouldBe Tilsynstype.HELTID + periode shouldBe + DatoperiodeDto( + LocalDate.now().minusMonths(6), + LocalDate.now().minusMonths(4).minusDays(1), + ) + kilde shouldBe Kilde.OFFENTLIG + } + + assertSoftly(nyttBarnetilsyn.elementAt(2)) { + skolealder shouldBe Skolealder.UNDER + tilsynstype shouldBe null + periode shouldBe DatoperiodeDto(LocalDate.now().minusMonths(4), null) + kilde shouldBe Kilde.OFFENTLIG + } + } + @Test fun `skal returnere diff for arbeidsforhold`() { // gitt diff --git a/src/test/kotlin/no/nav/bidrag/behandling/transformers/underhold/UtvidelserTest.kt b/src/test/kotlin/no/nav/bidrag/behandling/transformers/underhold/UtvidelserTest.kt new file mode 100644 index 000000000..4a63f6788 --- /dev/null +++ b/src/test/kotlin/no/nav/bidrag/behandling/transformers/underhold/UtvidelserTest.kt @@ -0,0 +1,115 @@ +package no.nav.bidrag.behandling.transformers.underhold + +import io.kotest.matchers.comparables.shouldBeGreaterThan +import io.kotest.matchers.comparables.shouldNotBeGreaterThan +import io.kotest.matchers.shouldBe +import no.nav.bidrag.behandling.database.datamodell.Person +import no.nav.bidrag.behandling.database.datamodell.Rolle +import no.nav.bidrag.behandling.database.datamodell.Underholdskostnad +import no.nav.bidrag.behandling.utils.testdata.oppretteBarnetilsynGrunnlagDto +import no.nav.bidrag.behandling.utils.testdata.oppretteTestbehandling +import no.nav.bidrag.domene.enums.behandling.TypeBehandling +import no.nav.bidrag.domene.enums.rolle.Rolletype +import java.time.LocalDate +import kotlin.test.Test + +class UtvidelserTest { + @Test + fun `barn som ikke har nådd skolealder ved inneværende år skal registreres som under skolealder`() { + // gitt + val b = + oppretteTestbehandling( + setteDatabaseider = true, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + + val barnetilsynGrunnlagDto = oppretteBarnetilsynGrunnlagDto(b, periodeFraAntallMndTilbake = 13) + + val u = b.underholdskostnader.first() + + u.person.henteFødselsdato + .plusYears(ALDER_VED_SKOLESTART) + .year shouldBeGreaterThan LocalDate.now().year + + // hvis + val barnetilsyn = barnetilsynGrunnlagDto.tilBarnetilsyn(u) + + // så + barnetilsyn.under_skolealder shouldBe true + } + + @Test + fun `barn som når skolealder i inneværende år skal registreres som over skolealder`() { + // gitt + val b = + oppretteTestbehandling( + setteDatabaseider = true, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + + val idUnderhold = 123L + val fødselsdato = LocalDate.now().withDayOfYear(365).minusYears(6) + val rolleBarnSomNårSkolealderIInneværendeÅr = Rolle(b, ident = null, rolletype = Rolletype.BARN, fødselsdato = fødselsdato) + + val personSøknadsbarn = Person(ident = "123", rolle = mutableSetOf(rolleBarnSomNårSkolealderIInneværendeÅr)) + b.underholdskostnader.add( + Underholdskostnad( + id = idUnderhold, + behandling = b, + person = personSøknadsbarn, + ), + ) + + val u = b.underholdskostnader.first { it.id == idUnderhold } + + u.person.henteFødselsdato + .plusYears(ALDER_VED_SKOLESTART) + .year shouldNotBeGreaterThan LocalDate.now().year + val barnetilsynGrunnlagDto = oppretteBarnetilsynGrunnlagDto(b, periodeFraAntallMndTilbake = 13) + + // hvis + val barnetilsyn = barnetilsynGrunnlagDto.tilBarnetilsyn(u) + + // så + barnetilsyn.under_skolealder shouldBe false + } + + @Test + fun `barn som når skolealder til neste år skal registreres som under skolealder`() { + // gitt + val b = + oppretteTestbehandling( + setteDatabaseider = true, + inkludereBp = true, + behandlingstype = TypeBehandling.BIDRAG, + ) + + val idUnderhold = 123L + val fødselsdato = LocalDate.now().withDayOfYear(365).minusYears(5) + val rolleBarnSomNårSkolealderIInneværendeÅr = Rolle(b, ident = null, rolletype = Rolletype.BARN, fødselsdato = fødselsdato) + + val personSøknadsbarn = Person(ident = "123", rolle = mutableSetOf(rolleBarnSomNårSkolealderIInneværendeÅr)) + b.underholdskostnader.add( + Underholdskostnad( + id = idUnderhold, + behandling = b, + person = personSøknadsbarn, + ), + ) + + val u = b.underholdskostnader.first { it.id == idUnderhold } + + u.person.henteFødselsdato + .plusYears(ALDER_VED_SKOLESTART) + .year shouldBeGreaterThan LocalDate.now().year + val barnetilsynGrunnlagDto = oppretteBarnetilsynGrunnlagDto(b, periodeFraAntallMndTilbake = 13) + + // hvis + val barnetilsyn = barnetilsynGrunnlagDto.tilBarnetilsyn(u) + + // så + barnetilsyn.under_skolealder shouldBe true + } +} diff --git a/src/test/kotlin/no/nav/bidrag/behandling/utils/testdata/Testdata.kt b/src/test/kotlin/no/nav/bidrag/behandling/utils/testdata/Testdata.kt index 825c8491f..e5f3009c4 100644 --- a/src/test/kotlin/no/nav/bidrag/behandling/utils/testdata/Testdata.kt +++ b/src/test/kotlin/no/nav/bidrag/behandling/utils/testdata/Testdata.kt @@ -24,10 +24,12 @@ import no.nav.bidrag.behandling.database.datamodell.Tilleggsstønad import no.nav.bidrag.behandling.database.datamodell.Underholdskostnad import no.nav.bidrag.behandling.database.datamodell.Utgift import no.nav.bidrag.behandling.database.datamodell.Utgiftspost +import no.nav.bidrag.behandling.database.datamodell.konvertereData import no.nav.bidrag.behandling.database.grunnlag.SkattepliktigeInntekter import no.nav.bidrag.behandling.database.grunnlag.SummerteInntekter import no.nav.bidrag.behandling.dto.v1.forsendelse.ForsendelseRolleDto import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype +import no.nav.bidrag.behandling.dto.v2.behandling.innhentesForRolle import no.nav.bidrag.behandling.dto.v2.inntekt.OppdatereManuellInntekt import no.nav.bidrag.behandling.service.tilSummerteInntekter import no.nav.bidrag.behandling.transformers.behandling.henteRolleForNotat @@ -42,10 +44,12 @@ import no.nav.bidrag.behandling.transformers.grunnlag.skattegrunnlagListe import no.nav.bidrag.behandling.transformers.grunnlag.tilGrunnlagPerson import no.nav.bidrag.behandling.transformers.grunnlag.tilInntekt import no.nav.bidrag.behandling.transformers.tilType +import no.nav.bidrag.behandling.transformers.underhold.tilBarnetilsyn import no.nav.bidrag.beregn.barnebidrag.BeregnSamværsklasseApi import no.nav.bidrag.boforhold.BoforholdApi import no.nav.bidrag.boforhold.dto.BoforholdResponseV2 import no.nav.bidrag.commons.web.mock.stubSjablonService +import no.nav.bidrag.domene.enums.barnetilsyn.Skolealder import no.nav.bidrag.domene.enums.barnetilsyn.Tilsynstype import no.nav.bidrag.domene.enums.behandling.TypeBehandling import no.nav.bidrag.domene.enums.beregning.Samværsklasse @@ -85,6 +89,7 @@ import no.nav.bidrag.transport.behandling.felles.grunnlag.delberegningSamværskl import no.nav.bidrag.transport.behandling.grunnlag.response.AinntektspostDto import no.nav.bidrag.transport.behandling.grunnlag.response.Ansettelsesdetaljer import no.nav.bidrag.transport.behandling.grunnlag.response.ArbeidsforholdGrunnlagDto +import no.nav.bidrag.transport.behandling.grunnlag.response.BarnetilsynGrunnlagDto import no.nav.bidrag.transport.behandling.grunnlag.response.BorISammeHusstandDto import no.nav.bidrag.transport.behandling.grunnlag.response.HentGrunnlagDto import no.nav.bidrag.transport.behandling.grunnlag.response.RelatertPersonGrunnlagDto @@ -722,6 +727,7 @@ fun opprettGyldigBehandlingForBeregningOgVedtak( behandling.inntekter.addAll(inntekterBp) behandling.inntekter.addAll(inntekterBm) } + else -> {} } @@ -839,7 +845,11 @@ fun opprettAlleAktiveGrunnlagFraFil( grunnlagListe.addAll( listOf( opprettBeregnetInntektFraGrunnlag(behandling, filJsonString, testdataBP), - opprettGrunnlagFraFil(behandling, filJsonString, Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN), + opprettGrunnlagFraFil( + behandling, + filJsonString, + Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN, + ), ).flatten(), ) } @@ -1245,7 +1255,7 @@ fun oppretteTestbehandling( } if (inkludereArbeidsforhold) { - oppretteArbeidsforhold(behandling, behandling.rolleGrunnlagSkalHentesFor!!.ident!!) + oppretteArbeidsforhold(behandling, Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!.ident!!) } return behandling @@ -1289,7 +1299,7 @@ fun oppretteArbeidsforhold( behandling = behandling, innhentet = LocalDateTime.now().minusDays(3), data = commonObjectmapper.writeValueAsString(setOf(arbeidsforhold)), - rolle = behandling.rolleGrunnlagSkalHentesFor!!, + rolle = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!, type = Grunnlagsdatatype.ARBEIDSFORHOLD, erBearbeidet = false, ), @@ -1314,7 +1324,7 @@ private fun oppretteBoforhold( erBarnAvBmBp = true, relasjon = Familierelasjon.BARN, navn = "Lyrisk Sopp", - partPersonId = behandling.rolleGrunnlagSkalHentesFor!!.ident, + partPersonId = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!.ident, borISammeHusstandDtoListe = listOf( BorISammeHusstandDto( @@ -1329,7 +1339,7 @@ private fun oppretteBoforhold( erBarnAvBmBp = true, relasjon = Familierelasjon.BARN, navn = "Lyrisk Sopp", - partPersonId = behandling.rolleGrunnlagSkalHentesFor!!.ident, + partPersonId = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!.ident, borISammeHusstandDtoListe = listOf( BorISammeHusstandDto( @@ -1348,7 +1358,7 @@ private fun oppretteBoforhold( erBarnAvBmBp = false, relasjon = Familierelasjon.INGEN, navn = voksenPersonIBpsHusstand.navn, - partPersonId = behandling.rolleGrunnlagSkalHentesFor!!.ident, + partPersonId = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!.ident, borISammeHusstandDtoListe = listOf( BorISammeHusstandDto( @@ -1369,7 +1379,7 @@ private fun oppretteBoforhold( behandling = behandling, innhentet = LocalDateTime.now().minusDays(3), data = commonObjectmapper.writeValueAsString(grunnlagHusstandsmedlemmer), - rolle = behandling.rolleGrunnlagSkalHentesFor!!, + rolle = Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN.innhentesForRolle(behandling)!!, type = Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN, erBearbeidet = false, ), @@ -1401,7 +1411,7 @@ private fun oppretteBoforhold( behandling = behandling, innhentet = LocalDateTime.now().minusDays(3), data = commonObjectmapper.writeValueAsString(grunnlagHusstandsmedlemmer), - rolle = behandling.rolleGrunnlagSkalHentesFor!!, + rolle = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!, type = Grunnlagsdatatype.BOFORHOLD, erBearbeidet = false, ), @@ -1424,7 +1434,7 @@ private fun oppretteBoforhold( behandling = behandling, innhentet = LocalDateTime.now().minusDays(3), data = commonObjectmapper.writeValueAsString(it.value), - rolle = behandling.rolleGrunnlagSkalHentesFor!!, + rolle = Grunnlagsdatatype.BOFORHOLD.innhentesForRolle(behandling)!!, type = Grunnlagsdatatype.BOFORHOLD, gjelder = it.key, erBearbeidet = true, @@ -1619,6 +1629,28 @@ fun lagVedtaksdata(filnavn: String): VedtakDto { return grunnlag } +fun oppretteBarnetilsynGrunnlagDto( + behandling: Behandling, + beløp: Int = 4000, + periodeFra: LocalDate? = null, + periodeFraAntallMndTilbake: Long = 1, + periodeTil: LocalDate? = null, + periodeTilAntallMndTilbake: Long? = null, + barnPersonId: String = + behandling.søknadsbarn + .first() + .personident!! + .verdi, +) = BarnetilsynGrunnlagDto( + beløp = beløp, + periodeFra = periodeFra ?: LocalDate.now().minusMonths(periodeFraAntallMndTilbake), + periodeTil = periodeTil ?: periodeTilAntallMndTilbake?.let { LocalDate.now().minusMonths(it) }, + skolealder = null, + tilsynstype = null, + barnPersonId = barnPersonId, + partPersonId = behandling.bidragsmottaker!!.personident!!.verdi, +) + fun opprettLøpendeBidragGrunnlag( gjelderBarn: TestDataPerson, stønadstype: Stønadstype, @@ -1789,7 +1821,11 @@ fun Behandling.leggTilSamvær( samvær = samværBarn, fom = periode.fom.atDay(1), tom = periode.til?.minusMonths(1)?.atEndOfMonth(), - samværsklasse = samværsklasse ?: BeregnSamværsklasseApi(stubSjablonService()).beregnSamværsklasse(samværsklasseDetaljer).delberegningSamværsklasse.samværsklasse, + samværsklasse = + samværsklasse ?: BeregnSamværsklasseApi(stubSjablonService()) + .beregnSamværsklasse( + samværsklasseDetaljer, + ).delberegningSamværsklasse.samværsklasse, beregningJson = if (medBeregning) commonObjectmapper.writeValueAsString(samværsklasseDetaljer) else null, ), ) @@ -1823,3 +1859,160 @@ fun Behandling.leggTilBarnetillegg( ) inntekter.add(inntekt) } + +fun Behandling.leggeTilGjeldendeBarnetillegg() { + this.grunnlag.add( + Grunnlag( + aktiv = LocalDateTime.now().minusDays(5), + behandling = this, + innhentet = LocalDateTime.now().minusDays(5), + erBearbeidet = false, + rolle = Grunnlagsdatatype.BARNETILSYN.innhentesForRolle(this)!!, + type = Grunnlagsdatatype.BARNETILSYN, + data = + commonObjectmapper.writeValueAsString( + setOf( + oppretteBarnetilsynGrunnlagDto(this, periodeFraAntallMndTilbake = 13), + ), + ), + ), + ) + + this.grunnlag.add( + Grunnlag( + aktiv = LocalDateTime.now().minusDays(5), + behandling = this, + innhentet = LocalDateTime.now().minusDays(5), + gjelder = testdataBarn1.ident, + erBearbeidet = true, + rolle = Grunnlagsdatatype.BARNETILSYN.innhentesForRolle(this)!!, + type = Grunnlagsdatatype.BARNETILSYN, + data = + commonObjectmapper.writeValueAsString( + setOf( + oppretteBarnetilsynGrunnlagDto(this, periodeFraAntallMndTilbake = 13), + ), + ), + ), + ) + + this.grunnlag + .filter { Grunnlagsdatatype.BARNETILSYN == it.type && it.erBearbeidet && it.aktiv != null } + .forEach { g -> + val u = this.underholdskostnader.find { it.person.ident == g.gjelder } + g.konvertereData>()?.tilBarnetilsyn(u!!)?.let { u.barnetilsyn.addAll(it) } + } +} + +fun Behandling.leggeTilNyttBarnetilsyn( + innhentet: LocalDateTime = LocalDateTime.now(), + fraDato: LocalDate = LocalDate.now().minusYears(1), +) { + val barnetilsynInnhentesForRolle = Grunnlagsdatatype.BARNETILSYN.innhentesForRolle(this)!! + + this.grunnlag.add( + Grunnlag( + aktiv = null, + behandling = this, + innhentet = innhentet, + erBearbeidet = false, + rolle = barnetilsynInnhentesForRolle, + type = Grunnlagsdatatype.BARNETILSYN, + data = + commonObjectmapper.writeValueAsString( + setOf( + oppretteBarnetilsynGrunnlagDto(this, barnPersonId = testdataBarn2.ident), + BarnetilsynGrunnlagDto( + beløp = 4500, + periodeFra = fraDato, + periodeTil = fraDato.plusMonths(6), + skolealder = Skolealder.IKKE_ANGITT, + tilsynstype = Tilsynstype.IKKE_ANGITT, + barnPersonId = testdataBarn1.ident, + partPersonId = barnetilsynInnhentesForRolle.ident!!, + ), + BarnetilsynGrunnlagDto( + beløp = 4600, + periodeFra = fraDato.plusMonths(6), + periodeTil = fraDato.plusMonths(8), + skolealder = Skolealder.OVER, + tilsynstype = Tilsynstype.HELTID, + barnPersonId = testdataBarn1.ident, + partPersonId = barnetilsynInnhentesForRolle.ident!!, + ), + BarnetilsynGrunnlagDto( + beløp = 4700, + periodeFra = fraDato.plusMonths(8), + periodeTil = null, + skolealder = null, + tilsynstype = null, + barnPersonId = testdataBarn1.ident, + partPersonId = barnetilsynInnhentesForRolle.ident!!, + ), + ), + ), + ), + ) + + this.grunnlag.add( + Grunnlag( + aktiv = null, + behandling = this, + innhentet = innhentet, + gjelder = testdataBarn1.ident, + erBearbeidet = true, + rolle = barnetilsynInnhentesForRolle, + type = Grunnlagsdatatype.BARNETILSYN, + data = + commonObjectmapper.writeValueAsString( + setOf( + BarnetilsynGrunnlagDto( + beløp = 4500, + periodeFra = fraDato, + periodeTil = fraDato.plusMonths(6), + skolealder = Skolealder.IKKE_ANGITT, + tilsynstype = Tilsynstype.IKKE_ANGITT, + barnPersonId = testdataBarn1.ident, + partPersonId = barnetilsynInnhentesForRolle.ident!!, + ), + BarnetilsynGrunnlagDto( + beløp = 4600, + periodeFra = fraDato.plusMonths(6), + periodeTil = fraDato.plusMonths(8), + skolealder = Skolealder.OVER, + tilsynstype = Tilsynstype.HELTID, + barnPersonId = testdataBarn1.ident, + partPersonId = barnetilsynInnhentesForRolle.ident!!, + ), + BarnetilsynGrunnlagDto( + beløp = 4700, + periodeFra = fraDato.plusMonths(8), + periodeTil = null, + skolealder = null, + tilsynstype = null, + barnPersonId = testdataBarn1.ident, + partPersonId = barnetilsynInnhentesForRolle.ident!!, + ), + ), + ), + ), + ) + + this.grunnlag.add( + Grunnlag( + aktiv = null, + behandling = this, + innhentet = innhentet, + gjelder = testdataBarn2.ident, + erBearbeidet = true, + rolle = barnetilsynInnhentesForRolle, + type = Grunnlagsdatatype.BARNETILSYN, + data = + commonObjectmapper.writeValueAsString( + setOf( + oppretteBarnetilsynGrunnlagDto(this, barnPersonId = testdataBarn2.ident), + ), + ), + ), + ) +} diff --git a/src/test/resources/__files/hente-grunnlagrespons-bidrag-barnetilsyn-bm.json b/src/test/resources/__files/hente-grunnlagrespons-bidrag-barnetilsyn-bm.json new file mode 100644 index 000000000..dbd14cffe --- /dev/null +++ b/src/test/resources/__files/hente-grunnlagrespons-bidrag-barnetilsyn-bm.json @@ -0,0 +1,40 @@ +{ + "ainntektListe": [], + "arbeidsforholdListe": [], + "barnetilleggListe": [], + "barnetilsynListe": [ + { + "barnPersonId": "1344124", + "beløp": 4000, + "partPersonId": "313213213", + "periodeFra": "2023-01-01", + "periodeTil": "2024-01-01", + "skolealder": "OVER", + "tilsynstype": "HELTID" + }, + { + "barnPersonId": "1344124", + "beløp": 5000, + "partPersonId": "313213213", + "periodeFra": "2024-01-01", + "skolealder": "OVER", + "tilsynstype": "HELTID" + }, + { + "barnPersonId": "15043215", + "beløp": 3500, + "partPersonId": "313213213", + "periodeFra": "2024-01-01", + "skolealder": "OVER", + "tilsynstype": "DELTID" + } + ], + "hentetTidspunkt": "2024-01-16T15:10:44.003848261", + "husstandsmedlemmerOgEgneBarnListe": [], + "kontantstøtteListe": [], + "sivilstandListe": [], + "skattegrunnlagListe": [], + "småbarnstilleggListe": [], + "utvidetBarnetrygdListe": [], + "feilrapporteringListe": [] +} \ No newline at end of file diff --git a/src/test/resources/__files/vedtak_response.json b/src/test/resources/__files/vedtak_response.json index 486cabf27..7713fe5f2 100644 --- a/src/test/resources/__files/vedtak_response.json +++ b/src/test/resources/__files/vedtak_response.json @@ -68,6 +68,16 @@ "skolealder": "IKKE_ANGITT", "beløp": 2000.0, "tilsynstype": "HELTID" + }, + { + "periode": { + "fom": "2023-01-01", + "til": "2024-01-01" + }, + "gjelderBarn": "person_PERSON_SØKNADSBARN_20050623_68", + "skolealder": "OVER", + "beløp": 3000.0, + "tilsynstype": "HELTID" } ] },