Skip to content

Commit

Permalink
Hent riktige personer til brevbegrunnelse ved automatisk behandling (#…
Browse files Browse the repository at this point in the history
…4032)

### 💰 Hva skal gjøres, og hvorfor?

[Favro](https://favro.com/organization/98c34fb974ce445eac854de0/1844bbac3b6605eacc8f5543?card=NAV-15884)

Når vi henter personene som er relevante for brevbegrunnelsene bruker vi
samme løype som når vi finner gyldige begrunnelser. Er en begrunnelse
gyldig for en person, så er den personen relevant for begrunnelsen og
skal være med i flettefeltene vi sender med videre.

Siden vi aldri trenger å velge begrunnelsene for automatiske
behandlinger har vi heller ikke laget logikk for å finne hvilke
begrunnelser som er gyldige. Nå som vi skal finne ut hvilke personer som
skal sendes med behandlingen må vi også lage logikk for begrunnelsene
til de automatiske behandlingene.

### ✅ Checklist
_Har du husket alle punktene i listen?_
- [x] Jeg har testet mine endringer i henhold til akseptansekriteriene
🕵️
- [ ] Jeg har config- eller sql-endringer. I så fall, husk manuell
deploy til miljø for å verifisere endringene.
- [x] Jeg har skrevet tester.

---------

Co-authored-by: FredrikP <[email protected]>
  • Loading branch information
halvorbmundal and fredrikpf authored Oct 10, 2023
1 parent 98c1d60 commit bc1ff04
Show file tree
Hide file tree
Showing 11 changed files with 87 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,13 @@ fun hentTekstForBehandlinger(behandling: Behandling, forrigeBehandling: Behandli
"""
Gitt følgende behandling
| BehandlingId | FagsakId | ForrigeBehandlingId | Behandlingsresultat | Behandlingsårsak |${
| BehandlingId | FagsakId | ForrigeBehandlingId | Behandlingsresultat | Behandlingsårsak | Skal behandles automatisk |${
forrigeBehandling?.let {
"""
| ${it.id} | ${it.fagsak.id} | | ${it.resultat} | ${it.opprettetÅrsak} |"""
| ${it.id} | ${it.fagsak.id} | | ${it.resultat} | ${it.opprettetÅrsak} | ${if (it.skalBehandlesAutomatisk) "Ja" else "Nei"} |"""
} ?: ""
}
| ${behandling.id} | ${behandling.fagsak.id} | ${forrigeBehandling?.id ?: ""} |${behandling.resultat} | ${behandling.opprettetÅrsak} |"""
| ${behandling.id} | ${behandling.fagsak.id} | ${forrigeBehandling?.id ?: ""} |${behandling.resultat} | ${behandling.opprettetÅrsak} | ${if (behandling.skalBehandlesAutomatisk) "Ja" else "Nei"} |"""

fun hentTekstForPersongrunnlag(
persongrunnlag: PersonopplysningGrunnlag,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ private fun ISanityBegrunnelse.validerBrevbegrunnelse(
barnasFødselsdatoer: List<LocalDate>,
) {
if (!gjelderSøker && barnasFødselsdatoer.isEmpty() && !this.gjelderSatsendring && !this.erAvslagUregistrerteBarnBegrunnelse()) {
throw IllegalStateException("Ingen personer på brevbegrunnelse")
throw IllegalStateException("Ingen personer på brevbegrunnelse ${this.apiNavn}")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ private fun VedtaksperiodeMedBegrunnelser.byggBrevPeriode(
barnasFodselsdager = barnMedUtbetaling.tilBarnasFødselsdatoer(),
duEllerInstitusjonen = hentDuEllerInstitusjonenTekst(
brevPeriodeType = brevPeriodeType,
fagsakType = grunnlagForBegrunnelse.behandlingsGrunnlagForVedtaksperioder.fagsakType,
fagsakType = grunnlagForBegrunnelse.behandlingsGrunnlagForVedtaksperioder.behandling.fagsak.type,
),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ class VedtaksperiodeService(
BehandlingsGrunnlagForVedtaksperioder(
persongrunnlag = persongrunnlagService.hentAktivThrows(this.id),
personResultater = vilkårsvurderingService.hentAktivForBehandling(this.id)?.personResultater ?: emptySet(),
fagsakType = fagsak.type,
behandling = this,
kompetanser = kompetanseRepository.finnFraBehandlingId(this.id).toList(),
endredeUtbetalinger = endretUtbetalingAndelRepository.findByBehandlingId(this.id),
andelerTilkjentYtelse = andelTilkjentYtelseRepository.finnAndelerTilkjentYtelseForBehandling(this.id),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ fun hentFortsattInnvilgetBegrunnelserPerPerson(
grunnlag: GrunnlagForBegrunnelse,
vedtaksperiode: VedtaksperiodeMedBegrunnelser,
): Map<Person, Set<IVedtakBegrunnelse>> {
val fagsakType = grunnlag.behandlingsGrunnlagForVedtaksperioder.fagsakType
val fagsakType = grunnlag.behandlingsGrunnlagForVedtaksperioder.behandling.fagsak.type

val erUtbetalingEllerDeltBostedIPeriode = erUtbetalingEllerDeltBostedIPeriode(begrunnelseGrunnlagPerPerson)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.vedtakBegrunnelseProd
import no.nav.familie.ba.sak.common.TIDENES_MORGEN
import no.nav.familie.ba.sak.common.toYearMonth
import no.nav.familie.ba.sak.kjerne.autovedtak.fødselshendelse.Resultat
import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling
import no.nav.familie.ba.sak.kjerne.beregning.SatsService
import no.nav.familie.ba.sak.kjerne.beregning.domene.YtelseType
import no.nav.familie.ba.sak.kjerne.brev.brevBegrunnelseProdusent.GrunnlagForBegrunnelse
Expand Down Expand Up @@ -104,7 +105,7 @@ fun VedtaksperiodeMedBegrunnelser.hentGyldigeBegrunnelserPerPerson(
sanityBegrunnelser = grunnlag.sanityBegrunnelser,
person = person,
vedtaksperiode = this,
fagsakType = grunnlag.behandlingsGrunnlagForVedtaksperioder.fagsakType,
behandling = grunnlag.behandlingsGrunnlagForVedtaksperioder.behandling,
relevantePeriodeResultater = relevantePeriodeResultater,
erUtbetalingEllerDeltBostedIPeriode = erUtbetalingEllerDeltBostedIPeriode,
utvidetVilkårPåSøkerIPeriode = utvidetVilkårPåSøkerIPeriode,
Expand Down Expand Up @@ -188,7 +189,7 @@ private fun hentStandardBegrunnelser(
sanityBegrunnelser: Map<Standardbegrunnelse, SanityBegrunnelse>,
person: Person,
vedtaksperiode: VedtaksperiodeMedBegrunnelser,
fagsakType: FagsakType,
behandling: Behandling,
relevantePeriodeResultater: List<SanityPeriodeResultat>,
erUtbetalingEllerDeltBostedIPeriode: Boolean,
utvidetVilkårPåSøkerIPeriode: VilkårResultatForVedtaksperiode?,
Expand All @@ -199,19 +200,17 @@ private fun hentStandardBegrunnelser(
val relevantePeriodeResultaterForrigePeriode = hentResultaterForForrigePeriode(begrunnelseGrunnlag.forrigePeriode)

val filtrertPåRolle = sanityBegrunnelser.filterValues { begrunnelse ->
begrunnelse.erGjeldendeForRolle(person, fagsakType)
begrunnelse.erGjeldendeForRolle(person, behandling.fagsak.type)
}
val filtrertPåRolleOgFagsaktype = filtrertPåRolle.filterValues {
it.erGjeldendeForFagsakType(fagsakType)
it.erGjeldendeForFagsakType(behandling.fagsak.type)
}
val filtrertPåRolleFagsaktypeOgPeriodetype = filtrertPåRolleOgFagsaktype.filterValues {
it.periodeResultat in relevantePeriodeResultater
}

val filtrertPåRolleFagsaktypePeriodeTypeOgManuelleBegrunnelser =
filtrertPåRolleFagsaktypeOgPeriodetype.filterValues {
it.erManuellBegrunnelse()
}
val filtrertPåRolleFagsaktypePeriodeTypeOgManuelleBegrunnelser = filtrertPåRolleFagsaktypeOgPeriodetype
.filterValues { it.matcherErAutomatisk(behandling.skalBehandlesAutomatisk) }

val relevanteBegrunnelser = filtrertPåRolleFagsaktypePeriodeTypeOgManuelleBegrunnelser
.filterValues { it.erGjeldendeForBrevPeriodeType(vedtaksperiode, erUtbetalingEllerDeltBostedIPeriode) }
Expand Down Expand Up @@ -258,7 +257,7 @@ private fun hentStandardBegrunnelser(

val filtrertPåRolleOgPeriodetypeForrigePeriode =
begrunnelserFiltrertPåPeriodetypeForrigePeriode.filterValues { begrunnelse ->
begrunnelse.erGjeldendeForRolle(person, fagsakType)
begrunnelse.erGjeldendeForRolle(person, behandling.fagsak.type)
}

val filtrertPåEtterEndretUtbetaling = filtrertPåRolleOgPeriodetypeForrigePeriode.filterValues {
Expand All @@ -276,7 +275,10 @@ private fun hentStandardBegrunnelser(
return filtrertPåVilkårOgEndretUtbetaling + filtrertPåReduksjonFraForrigeBehandling + filtrertPåOpphørFraForrigeBehandling + filtrertPåSmåbarnstillegg + filtrertPåEtterEndretUtbetaling + filtrertPåHendelser
}

private fun SanityBegrunnelse.erManuellBegrunnelse() = ØvrigTrigger.ALLTID_AUTOMATISK !in ovrigeTriggere
private fun SanityBegrunnelse.matcherErAutomatisk(erAutomatiskBehandling: Boolean) =
this.erAutomatiskBegrunnelse() == erAutomatiskBehandling

private fun SanityBegrunnelse.erAutomatiskBegrunnelse() = ØvrigTrigger.ALLTID_AUTOMATISK in ovrigeTriggere

fun ISanityBegrunnelse.erGjeldendeForFagsakType(
fagsakType: FagsakType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import no.nav.familie.ba.sak.common.Feil
import no.nav.familie.ba.sak.common.secureLogger
import no.nav.familie.ba.sak.common.tilMånedÅr
import no.nav.familie.ba.sak.ekstern.restDomene.BarnMedOpplysninger
import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse
import no.nav.familie.ba.sak.kjerne.beregning.domene.InternPeriodeOvergangsstønad
import no.nav.familie.ba.sak.kjerne.beregning.domene.YtelseType
Expand Down Expand Up @@ -60,7 +61,7 @@ data class AktørOgRolleBegrunnelseGrunnlag(
data class BehandlingsGrunnlagForVedtaksperioder(
val persongrunnlag: PersonopplysningGrunnlag,
val personResultater: Set<PersonResultat>,
val fagsakType: FagsakType,
val behandling: Behandling,
val kompetanser: List<Kompetanse>,
val endredeUtbetalinger: List<EndretUtbetalingAndel>,
val andelerTilkjentYtelse: List<AndelTilkjentYtelse>,
Expand All @@ -81,11 +82,11 @@ data class BehandlingsGrunnlagForVedtaksperioder(
hentOrdinæreVilkårForSøkerForskjøvetTidslinje(søker, personResultater)

val erMinstEttBarnMedUtbetalingTidslinje =
hentErMinstEttBarnMedUtbetalingTidslinje(personResultater, fagsakType, persongrunnlag)
hentErMinstEttBarnMedUtbetalingTidslinje(personResultater, behandling.fagsak.type, persongrunnlag)

val erUtbetalingSmåbarnstilleggTidslinje = this.andelerTilkjentYtelse.hentErUtbetalingSmåbarnstilleggTidslinje()

val personresultaterOgRolleForVilkår = if (fagsakType.erBarnSøker()) {
val personresultaterOgRolleForVilkår = if (behandling.fagsak.type.erBarnSøker()) {
personResultater.single().splittOppVilkårForBarnOgSøkerRolle()
} else {
personResultater.map {
Expand All @@ -108,7 +109,7 @@ data class BehandlingsGrunnlagForVedtaksperioder(
person = person,
erMinstEttBarnMedUtbetalingTidslinje = erMinstEttBarnMedUtbetalingTidslinje,
ordinæreVilkårForSøkerTidslinje = ordinæreVilkårForSøkerForskjøvetTidslinje,
fagsakType = fagsakType,
fagsakType = behandling.fagsak.type,
vilkårRolle = vilkårRolle,
bareSøkerOgUregistrertBarn = bareSøkerOgUregistrertBarn,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ class BegrunnelseTeksterStepDefinition {
val grunnlagForVedtaksperiode = BehandlingsGrunnlagForVedtaksperioder(
persongrunnlag = persongrunnlag.finnPersonGrunnlagForBehandling(behandlingId),
personResultater = personResultater[behandlingId] ?: error("Finner ikke personresultater"),
fagsakType = vedtak.behandling.fagsak.type,
behandling = vedtak.behandling,
kompetanser = kompetanser[behandlingId] ?: emptyList(),
endredeUtbetalinger = endredeUtbetalinger[behandlingId] ?: emptyList(),
andelerTilkjentYtelse = andelerTilkjentYtelse[behandlingId] ?: emptyList(),
Expand All @@ -244,7 +244,7 @@ class BegrunnelseTeksterStepDefinition {
BehandlingsGrunnlagForVedtaksperioder(
persongrunnlag = persongrunnlag.finnPersonGrunnlagForBehandling(forrigeBehandlingId),
personResultater = personResultater[forrigeBehandlingId] ?: error("Finner ikke personresultater"),
fagsakType = forrigeVedtak.behandling.fagsak.type,
behandling = forrigeVedtak.behandling,
kompetanser = kompetanser[forrigeBehandlingId] ?: emptyList(),
endredeUtbetalinger = endredeUtbetalinger[forrigeBehandlingId] ?: emptyList(),
andelerTilkjentYtelse = andelerTilkjentYtelse[forrigeBehandlingId] ?: emptyList(),
Expand Down Expand Up @@ -309,10 +309,19 @@ class BegrunnelseTeksterStepDefinition {
val vedtak = vedtaksliste.find { it.behandling.id == behandlingId && it.aktiv } ?: error("Finner ikke vedtak")
val grunnlagForBegrunnelse = hentGrunnlagForBegrunnelser(behandlingId, vedtak, forrigeBehandlingId)

val vedtaksperiodeMedBegrunnelser = vedtaksperioderMedBegrunnelser.find {
it.fom == parseNullableDato(periodeFom) && it.tom == parseNullableDato(periodeTom)
} ?: throw Feil(
"Forventet å finne en vedtaksperiode med Fom: $periodeFom og Tom: $periodeTom. \n" +
"Faktiske vedtaksperioder var \n${
vedtaksperioderMedBegrunnelser.joinToString("\n") {
" Fom: ${it.fom}, Tom: ${it.tom}"
}
}",
)

val faktiskeBegrunnelser: List<BegrunnelseMedData> =
vedtaksperioderMedBegrunnelser.single {
it.fom == parseNullableDato(periodeFom) && it.tom == parseNullableDato(periodeTom)
}.lagBrevPeriode(grunnlagForBegrunnelse, LANDKODER)!!
vedtaksperiodeMedBegrunnelser.lagBrevPeriode(grunnlagForBegrunnelse, LANDKODER)!!
.begrunnelser
.filterIsInstance<BegrunnelseMedData>()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,13 @@ fun lagVedtak(
val fagsak = fagsaker[fagsakId] ?: defaultFagsak()
val behandlingÅrsak = parseValgfriEnum<BehandlingÅrsak>(Domenebegrep.BEHANDLINGSÅRSAK, rad)
val behandlingResultat = parseValgfriEnum<Behandlingsresultat>(Domenebegrep.BEHANDLINGSRESULTAT, rad)
val skalBehandlesAutomatisk = parseValgfriBoolean(Domenebegrep.SKAL_BEHANLDES_AUTOMATISK, rad) ?: false

lagBehandling(
fagsak = fagsak,
årsak = behandlingÅrsak ?: BehandlingÅrsak.SØKNAD,
resultat = behandlingResultat ?: Behandlingsresultat.IKKE_VURDERT,
skalBehandlesAutomatisk = skalBehandlesAutomatisk,
).copy(id = behandlingId)
}.associateBy { it.id },
)
Expand Down Expand Up @@ -361,7 +363,7 @@ fun lagVedtaksPerioder(
val grunnlagForVedtaksperiode = BehandlingsGrunnlagForVedtaksperioder(
persongrunnlag = personGrunnlag.finnPersonGrunnlagForBehandling(behandlingId),
personResultater = personResultater[behandlingId] ?: error("Finner ikke personresultater"),
fagsakType = vedtak.behandling.fagsak.type,
behandling = vedtak.behandling,
kompetanser = kompetanser[behandlingId] ?: emptyList(),
endredeUtbetalinger = endredeUtbetalinger[behandlingId] ?: emptyList(),
andelerTilkjentYtelse = andelerTilkjentYtelse[behandlingId] ?: emptyList(),
Expand All @@ -377,7 +379,7 @@ fun lagVedtaksPerioder(
BehandlingsGrunnlagForVedtaksperioder(
persongrunnlag = personGrunnlag.finnPersonGrunnlagForBehandling(forrigeBehandlingId),
personResultater = personResultater[forrigeBehandlingId] ?: error("Finner ikke personresultater"),
fagsakType = forrigeVedtak.behandling.fagsak.type,
behandling = forrigeVedtak.behandling,
kompetanser = kompetanser[forrigeBehandlingId] ?: emptyList(),
endredeUtbetalinger = endredeUtbetalinger[forrigeBehandlingId] ?: emptyList(),
andelerTilkjentYtelse = andelerTilkjentYtelse[forrigeBehandlingId] ?: emptyList(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ enum class Domenebegrep(override val nøkkel: String) : Domenenøkkel {
ENDRET_MIGRERINGSDATO("Endret migreringsdato"),
BEHANDLINGSÅRSAK("Behandlingsårsak"),
BEHANDLINGSRESULTAT("Behandlingsresultat"),
SKAL_BEHANLDES_AUTOMATISK("Skal behandles automatisk"),
}

object DomeneparserUtil {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# language: no
# encoding: UTF-8

Egenskap: Brevbegrunnelser ved automatiske behandlinger

Bakgrunn:
Gitt følgende fagsaker for begrunnelse
| FagsakId | Fagsaktype |
| 1 | NORMAL |

Gitt følgende behandling
| BehandlingId | FagsakId | ForrigeBehandlingId | Behandlingsresultat | Behandlingsårsak | Skal behandles automatisk |
| 1 | 1 | | INNVILGET | FØDSELSHENDELSE | Ja |

Og følgende persongrunnlag for begrunnelse
| BehandlingId | AktørId | Persontype | Fødselsdato |
| 1 | 1 | SØKER | 12.08.1995 |
| 1 | 2 | BARN | 04.06.2023 |

Scenario: Skal sette riktige felter for automatisk fødselshendelse
Og følgende dagens dato 05.06.2023
Og lag personresultater for begrunnelse for behandling 1

Og legg til nye vilkårresultater for begrunnelse for behandling 1
| AktørId | Vilkår | Utdypende vilkår | Fra dato | Til dato | Resultat | Er eksplisitt avslag |
| 2 | GIFT_PARTNERSKAP,BOSATT_I_RIKET,LOVLIG_OPPHOLD,BOR_MED_SØKER | | 04.06.2023 | | OPPFYLT | Nei |
| 2 | UNDER_18_ÅR | | 04.06.2023 | 03.06.2041 | OPPFYLT | Nei |

| 1 | LOVLIG_OPPHOLD,BOSATT_I_RIKET | | 12.08.1995 | | OPPFYLT | Nei |

Og med andeler tilkjent ytelse for begrunnelse
| AktørId | BehandlingId | Fra dato | Til dato | Beløp | Ytelse type | Prosent | Sats |
| 2 | 1 | 01.07.2023 | 31.05.2029 | 1766 | ORDINÆR_BARNETRYGD | 100 | 1766 |
| 2 | 1 | 01.06.2029 | 31.05.2041 | 1310 | ORDINÆR_BARNETRYGD | 100 | 1310 |

Når begrunnelsetekster genereres for behandling 1

Og med vedtaksperioder for behandling 1
| Fra dato | Til dato | Standardbegrunnelser | Eøsbegrunnelser | Fritekster |
| 01.07.2023 | 31.05.2029 | INNVILGET_FØDSELSHENDELSE_NYFØDT_BARN_FØRSTE | | |

forvent følgende brevbegrunnelser for behandling 1 i periode 01.07.2023 til 31.05.2029
| Begrunnelse | Gjelder søker | Barnas fødselsdatoer | Antall barn | Måned og år begrunnelsen gjelder for | Målform | Beløp | Søknadstidspunkt | Søkers rett til utvidet |
| INNVILGET_FØDSELSHENDELSE_NYFØDT_BARN_FØRSTE | Nei | 04.06.23 | 1 | juni 2023 | NB | 1 766 | | SØKER_HAR_IKKE_RETT |

0 comments on commit bc1ff04

Please sign in to comment.