Skip to content

Commit

Permalink
Feat/brevperiode (#4024)
Browse files Browse the repository at this point in the history
### 💰 Hva skal gjøres, og hvorfor?
Legger til logikk for å fylle inn data i de nye brevperiodene fra
objektene vi får fra den nye vedtaksløypa. Det meste er bare kopi fra
den gamle løypa med annen input.

### ✅ Checklist
_Har du husket alle punktene i listen?_
- [ ] 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
  • Loading branch information
halvorbmundal authored Sep 29, 2023
1 parent ca0affc commit 5c783e1
Show file tree
Hide file tree
Showing 10 changed files with 210 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -252,15 +252,11 @@ class BrevPeriodeGenerator(
brevPeriodeType == BrevPeriodeType.INNVILGELSE_INGEN_UTBETALING -> " til $tomDato"
else -> "til $tomDato "
},
belop = Utils.formaterBeløp(utbetalingsbeløp),
beløp = Utils.formaterBeløp(utbetalingsbeløp),
begrunnelser = begrunnelserOgFritekster,
brevPeriodeType = brevPeriodeType,
antallBarn = barnIPeriode.size.toString(),
barnasFodselsdager = barnIPeriode.tilBarnasFødselsdatoer(),
antallBarnMedUtbetaling = barnMedUtbetaling.size.toString(),
antallBarnMedNullutbetaling = barnMedNullutbetaling.size.toString(),
fodselsdagerBarnMedUtbetaling = barnMedUtbetaling.tilBarnasFødselsdatoer(),
fodselsdagerBarnMedNullutbetaling = barnMedNullutbetaling.tilBarnasFødselsdatoer(),
duEllerInstitusjonen = duEllerInstitusjonen,
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
package no.nav.familie.ba.sak.kjerne.brev.brevPeriodeProdusent

import lagBrevBegrunnelse
import no.nav.familie.ba.sak.common.Utils
import no.nav.familie.ba.sak.common.tilKortString
import no.nav.familie.ba.sak.common.tilMånedÅr
import no.nav.familie.ba.sak.kjerne.brev.brevBegrunnelseProdusent.GrunnlagForBegrunnelse
import no.nav.familie.ba.sak.kjerne.brev.brevBegrunnelseProdusent.lagBrevBegrunnelse
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.BrevPeriodeType
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.brevperioder.BrevPeriode
import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.Årsak
import no.nav.familie.ba.sak.kjerne.fagsak.FagsakType
import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.Person
import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.PersonType
import no.nav.familie.ba.sak.kjerne.vedtak.domene.BrevBegrunnelse
import no.nav.familie.ba.sak.kjerne.vedtak.domene.FritekstBegrunnelse
import no.nav.familie.ba.sak.kjerne.vedtak.domene.VedtaksperiodeMedBegrunnelser
import no.nav.familie.ba.sak.kjerne.vedtak.domene.hentBrevPeriodeType
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.Vedtaksperiodetype
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.vedtakBegrunnelseProdusent.IBegrunnelseGrunnlagForPeriode
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.vedtakBegrunnelseProdusent.erUtbetalingEllerDeltBostedIPeriode
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.vedtakBegrunnelseProdusent.finnBegrunnelseGrunnlagPerPerson

fun VedtaksperiodeMedBegrunnelser.lagBrevPeriode(
Expand Down Expand Up @@ -41,19 +48,66 @@ fun VedtaksperiodeMedBegrunnelser.lagBrevPeriode(

val fritekster = this.fritekster.map { FritekstBegrunnelse(it.fritekst) }

val barnMedUtbetaling = begrunnelsesGrunnlagPerPerson.finnBarnMedUtbetaling()

val begrunnelserOgFritekster =
standardbegrunnelser + eøsBegrunnelser + fritekster

if (begrunnelserOgFritekster.isEmpty()) return null

return this.byggBrevPeriode(
begrunnelserOgFritekster = begrunnelserOgFritekster,
begrunnelseGrunnlagPerPerson = begrunnelsesGrunnlagPerPerson,
grunnlagForBegrunnelse = grunnlagForBegrunnelse,

)
}

private fun VedtaksperiodeMedBegrunnelser.byggBrevPeriode(
begrunnelserOgFritekster: List<BrevBegrunnelse>,
begrunnelseGrunnlagPerPerson: Map<Person, IBegrunnelseGrunnlagForPeriode>,
grunnlagForBegrunnelse: GrunnlagForBegrunnelse,
): BrevPeriode {
val barnMedUtbetaling = begrunnelseGrunnlagPerPerson.finnBarnMedUtbetaling().keys
val beløp = begrunnelseGrunnlagPerPerson.hentTotaltUtbetaltIPeriode()

val brevPeriodeType = hentBrevPeriodeType(
vedtaksperiodeMedBegrunnelser = this,
erUtbetalingEllerDeltBostedIPeriode = erUtbetalingEllerDeltBostedIPeriode(begrunnelseGrunnlagPerPerson),
)

return BrevPeriode(
fom = this.fom?.tilMånedÅr() ?: "",
tom = hentTomTekstForBrev(brevPeriodeType),
beløp = beløp.toString(),
begrunnelser = begrunnelserOgFritekster,
brevPeriodeType = brevPeriodeType,
antallBarn = barnMedUtbetaling.size.toString(),
barnasFodselsdager = barnMedUtbetaling.tilBarnasFødselsdatoer(),
duEllerInstitusjonen = hentDuEllerInstitusjonenTekst(
brevPeriodeType = brevPeriodeType,
fagsakType = grunnlagForBegrunnelse.behandlingsGrunnlagForVedtaksperioder.fagsakType,
),
)
}

private fun VedtaksperiodeMedBegrunnelser.hentTomTekstForBrev(
brevPeriodeType: BrevPeriodeType,
) = if (this.tom == null) {
""
} else {
val tomDato = this.tom.tilMånedÅr()
when (brevPeriodeType) {
BrevPeriodeType.UTBETALING -> "til $tomDato"
BrevPeriodeType.INGEN_UTBETALING -> if (this.type == Vedtaksperiodetype.AVSLAG) "til og med $tomDato " else ""
BrevPeriodeType.INGEN_UTBETALING_UTEN_PERIODE -> ""
BrevPeriodeType.FORTSATT_INNVILGET -> ""
BrevPeriodeType.FORTSATT_INNVILGET_NY -> ""
else -> error("$brevPeriodeType skal ikke brukes")
}
}

private fun Map<Person, IBegrunnelseGrunnlagForPeriode>.hentTotaltUtbetaltIPeriode() =
this.values.sumOf { it.dennePerioden.andeler.sumOf { andeler -> andeler.kalkulertUtbetalingsbeløp } }

private fun Map<Person, IBegrunnelseGrunnlagForPeriode>.finnBarnMedUtbetaling() =
filterKeys { it.type == PersonType.BARN }
.filterValues {
Expand All @@ -64,23 +118,27 @@ private fun Map<Person, IBegrunnelseGrunnlagForPeriode>.finnBarnMedUtbetaling()
utbetalingssumIPeriode != 0 || endretUtbetalingAndelIPeriodeErDeltBosted
}

private fun VedtaksperiodeMedBegrunnelser.byggBrevPeriode(
begrunnelserOgFritekster: List<BrevBegrunnelse>,
antallBarn: String,
): BrevPeriode {
return BrevPeriode(
fun Set<Person>.tilBarnasFødselsdatoer(): String {
val barnasFødselsdatoerListe: List<String> = this.filter { it.type == PersonType.BARN }
.sortedBy { it.fødselsdato }
.map { it.fødselsdato.tilKortString() }

fom = "",
tom = "",
belop = "",
begrunnelser = begrunnelserOgFritekster,
brevPeriodeType = BrevPeriodeType.INNVILGELSE,
antallBarn = antallBarn,
barnasFodselsdager = "",
antallBarnMedUtbetaling = "",
antallBarnMedNullutbetaling = "",
fodselsdagerBarnMedUtbetaling = "",
fodselsdagerBarnMedNullutbetaling = "",
duEllerInstitusjonen = "",
)
return Utils.slåSammen(barnasFødselsdatoerListe)
}

private fun hentDuEllerInstitusjonenTekst(brevPeriodeType: BrevPeriodeType, fagsakType: FagsakType): String =
when (fagsakType) {
FagsakType.INSTITUSJON -> {
when (brevPeriodeType) {
BrevPeriodeType.UTBETALING, BrevPeriodeType.INGEN_UTBETALING -> "institusjonen"
else -> "Institusjonen"
}
}

FagsakType.NORMAL, FagsakType.BARN_ENSLIG_MINDREÅRIG -> {
when (brevPeriodeType) {
BrevPeriodeType.UTBETALING, BrevPeriodeType.INGEN_UTBETALING -> "du"
else -> "Du"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,37 +13,24 @@ data class BrevPeriode(
val barnasFodselsdager: Flettefelt,
val begrunnelser: List<BrevBegrunnelse>,
val type: Flettefelt,

val antallBarnMedUtbetaling: Flettefelt,
val antallBarnMedNullutbetaling: Flettefelt,
val fodselsdagerBarnMedUtbetaling: Flettefelt,
val fodselsdagerBarnMedNullutbetaling: Flettefelt,
val duEllerInstitusjonen: Flettefelt,
) {

constructor(
fom: String,
tom: String,
belop: String,
beløp: String,
begrunnelser: List<BrevBegrunnelse>,
brevPeriodeType: BrevPeriodeType,
antallBarn: String,
barnasFodselsdager: String,
antallBarnMedUtbetaling: String,
antallBarnMedNullutbetaling: String,
fodselsdagerBarnMedUtbetaling: String,
fodselsdagerBarnMedNullutbetaling: String,
duEllerInstitusjonen: String,
) : this(
fom = flettefelt(fom),
tom = flettefelt(tom),
belop = flettefelt(belop),
belop = flettefelt(beløp),
antallBarn = flettefelt(antallBarn),
barnasFodselsdager = flettefelt(barnasFodselsdager),
antallBarnMedUtbetaling = flettefelt(antallBarnMedUtbetaling),
antallBarnMedNullutbetaling = flettefelt(antallBarnMedNullutbetaling),
fodselsdagerBarnMedUtbetaling = flettefelt(fodselsdagerBarnMedUtbetaling),
fodselsdagerBarnMedNullutbetaling = flettefelt(fodselsdagerBarnMedNullutbetaling),
begrunnelser = begrunnelser,
type = flettefelt(brevPeriodeType.apiNavn),
duEllerInstitusjonen = flettefelt(duEllerInstitusjonen),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,16 @@ private fun List<AndelTilkjentYtelseMedEndreteUtbetalinger>.tilUtbetalingerTidsl
}.kombiner { it.takeIf { it.toList().isNotEmpty() } }
.slåSammenLike()

fun hentBrevPeriodeType(
vedtaksperiodeMedBegrunnelser: VedtaksperiodeMedBegrunnelser,
erUtbetalingEllerDeltBostedIPeriode: Boolean,
): BrevPeriodeType =
hentBrevPeriodeType(
vedtaksperiodetype = vedtaksperiodeMedBegrunnelser.type,
fom = vedtaksperiodeMedBegrunnelser.fom,
erUtbetalingEllerDeltBostedIPeriode = erUtbetalingEllerDeltBostedIPeriode,
)

fun hentBrevPeriodeType(
vedtaksperiodetype: Vedtaksperiodetype,
fom: LocalDate?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import no.nav.familie.ba.sak.kjerne.brev.brevPeriodeProdusent.lagBrevPeriode
import no.nav.familie.ba.sak.kjerne.brev.domene.RestSanityBegrunnelse
import no.nav.familie.ba.sak.kjerne.brev.domene.SanityBegrunnelse
import no.nav.familie.ba.sak.kjerne.brev.domene.SanityEØSBegrunnelse
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.brevperioder.BrevPeriode
import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.EndretUtbetalingAndel
import no.nav.familie.ba.sak.kjerne.eøs.kompetanse.domene.Kompetanse
import no.nav.familie.ba.sak.kjerne.fagsak.Fagsak
Expand Down Expand Up @@ -322,6 +323,31 @@ class BegrunnelseTeksterStepDefinition {
.isEqualTo(forvendtedeBegrunnelser.sortedBy { it.apiNavn })
}

/**
* Mulige verdier: | Type | Fra dato | Til dato | Beløp | Antall barn | Barnas fødselsdager | Du eller institusjonen |
*/
@Så("forvent følgende brevperioder for behandling {}")
fun `forvent følgende brevperioder for behandling i periode`(
behandlingId: Long,
dataTable: DataTable,
) {
val forrigeBehandlingId = behandlingTilForrigeBehandling[behandlingId]
val vedtak = vedtaksliste.find { it.behandling.id == behandlingId && it.aktiv } ?: error("Finner ikke vedtak")
val grunnlagForBegrunnelse = hentGrunnlagForBegrunnelser(behandlingId, vedtak, forrigeBehandlingId)

val faktiskeBrevperioder: List<BrevPeriode> =
vedtaksperioderMedBegrunnelser.sortedBy { it.fom }.mapNotNull {
it.lagBrevPeriode(grunnlagForBegrunnelse, LANDKODER)
}

val forvendtedeBrevperioder = parseBrevPerioder(dataTable)

assertThat(faktiskeBrevperioder)
.usingRecursiveComparison()
.ignoringFields("begrunnelser")
.isEqualTo(forvendtedeBrevperioder)
}

// For å laste ned begrunnelsene på nytt anbefales https://familie-brev.sanity.studio/ba-test/vision med query fra SanityQueries.kt .
// Kopier URL fra resultatet og kjør
// curl -XGET <URL> | jq '.result' > <Path-til-familie-ba-sak>/familie-ba-sak/src/test/resources/no/nav/familie/ba/sak/cucumber/begrunnelsetekster/restSanityTestBegrunnelser
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ fun parseStandardBegrunnelse(rad: Tabellrad) =
).sanityApiNavn,

gjelderSoker = parseBoolean(BrevPeriodeParser.DomenebegrepBrevBegrunnelse.GJELDER_SØKER, rad),
barnasFodselsdatoer = parseString(
barnasFodselsdatoer = parseValgfriString(
BrevPeriodeParser.DomenebegrepBrevBegrunnelse.BARNAS_FØDSELSDAGER,
rad,
),
) ?: "",

fodselsdatoerBarnOppfyllerTriggereOgHarUtbetaling = "",
fodselsdatoerBarnOppfyllerTriggereOgHarNullutbetaling = "",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package no.nav.familie.ba.sak.cucumber

import io.cucumber.datatable.DataTable
import no.nav.familie.ba.sak.cucumber.domeneparser.BrevPeriodeParser
import no.nav.familie.ba.sak.cucumber.domeneparser.Domenebegrep
import no.nav.familie.ba.sak.cucumber.domeneparser.parseEnum
import no.nav.familie.ba.sak.cucumber.domeneparser.parseInt
import no.nav.familie.ba.sak.cucumber.domeneparser.parseString
import no.nav.familie.ba.sak.cucumber.domeneparser.parseValgfriString
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.brevperioder.BrevPeriode
import no.nav.familie.ba.sak.kjerne.vedtak.domene.BrevBegrunnelse

fun parseBrevPerioder(dataTable: DataTable): List<BrevPeriode> {
return dataTable.asMaps().map { rad: Tabellrad ->

val beløp = parseString(BrevPeriodeParser.DomenebegrepBrevBegrunnelse.BELØP, rad)
val antallBarn = parseInt(BrevPeriodeParser.DomenebegrepBrevBegrunnelse.ANTALL_BARN, rad)
val barnasFodselsdatoer = parseValgfriString(
BrevPeriodeParser.DomenebegrepBrevBegrunnelse.BARNAS_FØDSELSDAGER,
rad,
) ?: ""
val duEllerInstitusjonen =
parseString(BrevPeriodeParser.DomenebegrepBrevBegrunnelse.DU_ELLER_INSTITUSJONEN, rad)

BrevPeriode(
fom = parseValgfriString(Domenebegrep.FRA_DATO, rad) ?: "",
tom = parseValgfriString(Domenebegrep.TIL_DATO, rad) ?: "",
beløp = beløp,
// egen test for dette. Se `forvent følgende brevbegrunnelser for behandling i periode`()
begrunnelser = emptyList<BrevBegrunnelse>(),
brevPeriodeType = parseEnum(BrevPeriodeParser.DomenebegrepBrevBegrunnelse.TYPE, rad),
antallBarn = antallBarn.toString(),
barnasFodselsdager = barnasFodselsdatoer,
duEllerInstitusjonen = duEllerInstitusjonen,
)
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,31 @@
package no.nav.familie.ba.sak.cucumber.domeneparser

import no.nav.familie.ba.sak.common.nbLocale
import java.math.BigDecimal
import java.time.LocalDate
import java.time.YearMonth
import java.time.format.DateTimeFormatter

val norskDatoFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy")
val norskDatoFormatterKort = DateTimeFormatter.ofPattern("dd.MM.yy", nbLocale)
val norskÅrMånedFormatter = DateTimeFormatter.ofPattern("MM.yyyy")
val isoDatoFormatter = DateTimeFormatter.ISO_LOCAL_DATE
val isoÅrMånedFormatter = DateTimeFormatter.ofPattern("yyyy-MM")

fun parseValgfriDatoListe(domenebegrep: Domenenøkkel, rad: Map<String, String>): List<LocalDate> {
val stringVerdier = parseValgfriString(domenebegrep, rad)?.split(",")?.map { it.trim() } ?: emptyList()
return stringVerdier.map {
parseDato(it)
}
}

fun parseDatoListe(domenebegrep: Domenenøkkel, rad: Map<String, String>): List<LocalDate> {
val stringVerdier = parseString(domenebegrep, rad).split(",").map { it.trim() }
return stringVerdier.map {
parseDato(it)
}
}

fun parseDato(domenebegrep: Domenenøkkel, rad: Map<String, String>): LocalDate {
return parseDato(domenebegrep.nøkkel, rad)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@ object BrevPeriodeParser {
AVTALETIDSPUNKT_DELT_BOSTED("Avtaletidspunkt delt bosted"),
SØKERS_RETT_TIL_UTVIDET("Søkers rett til utvidet"),
TYPE("Type"),
DU_ELLER_INSTITUSJONEN("Du eller institusjonen"),
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# language: no
# encoding: UTF-8

Egenskap: Brevbegrunnelser ved endring av vilkår

Bakgrunn:
Gitt følgende behandling
| BehandlingId |
| 1 |

Og følgende persongrunnlag for begrunnelse
| BehandlingId | AktørId | Persontype | Fødselsdato |
| 1 | 1234 | SØKER | 11.01.1970 |
| 1 | 3456 | BARN | 13.04.2020 |

Scenario: Skal lage vedtaksperioder for mor med et barn med vilkår
Og lag personresultater for begrunnelse for behandling 1

Og legg til nye vilkårresultater for begrunnelse for behandling 1
| AktørId | Vilkår | Fra dato | Til dato | Resultat |
| 1234 | BOSATT_I_RIKET, LOVLIG_OPPHOLD | 11.01.1970 | | Oppfylt |
| 3456 | UNDER_18_ÅR | 13.04.2020 | 12.04.2038 | Oppfylt |
| 3456 | GIFT_PARTNERSKAP, BOSATT_I_RIKET, LOVLIG_OPPHOLD | 13.04.2020 | | Oppfylt |
| 3456 | BOR_MED_SØKER | 13.04.2020 | 10.03.2021 | Oppfylt |

Og med andeler tilkjent ytelse for begrunnelse
| AktørId | Fra dato | Til dato | Beløp | BehandlingId |
| 3456 | 01.05.2020 | 31.03.2021 | 1354 | 1 |

Og med vedtaksperioder for behandling 1
| Fra dato | Til dato | Standardbegrunnelser | Eøsbegrunnelser | Fritekster |
| 01.04.2021 | | OPPHØR_BARN_FLYTTET_FRA_SØKER | | |

forvent følgende brevperioder for behandling 1
| Type | Fra dato | Til dato | Beløp | Antall barn | Barnas fødselsdager | Du eller institusjonen |
| INGEN_UTBETALING | april 2021 | | 0 | 0 | | du |

0 comments on commit 5c783e1

Please sign in to comment.