Skip to content

Commit

Permalink
Automatisk valutajustering: Utbetalingstabell (#4519)
Browse files Browse the repository at this point in the history
Favro:
[NAV-18502](https://favro.com/organization/98c34fb974ce445eac854de0/1844bbac3b6605eacc8f5543?card=NAV-18502)

### 💰 Hva skal gjøres, og hvorfor?
I alle EØS-sekundærlandssaker hvor endringstidspunktet er tidligere enn
minst ett av barnas valutakurs-perioder skal vi legge ved en
utbetalingstabell i vedtaksbrevet.

* Logikk for å bygge opp datagrunnlaget for utbetalingstabellen
* Utvide `Vedtaksbrev`-interface med feltet `utbetalingerPerMndEøs` for
å kunne sende datagrunnlaget til `familie-brev`
* Brev som skal inneholde tabellen, må også inneholde delmalen
`utbetalingstabellAutomatiskValutajustering` med tekst som beskriver
tabellen. Denne inneholder flettefelter for utbetalingsland og tidspunkt
for første endring.
* Lagt til delmalen `utbetalingstabellAutomatiskValutajustering` i
brevene som skal inneholde tabellen.
* Lagt ny funksjonalitet bak feature toggle.

Denne PR'en vil ikke ha noen effekt uten endringer i `familie-brev` og
`familie-sanity-brev`:
* `familie-brev`: navikt/familie-brev#657
* `familie-sanity-brev`:
navikt/familie-sanity-brev#601

### ✅ Checklist
- [x] Jeg har testet mine endringer i henhold til akseptansekriteriene
🕵️
- [ ] Jeg har config- eller sql-endringer.
- [x] Jeg har skrevet tester.
  • Loading branch information
bragejahren authored May 8, 2024
1 parent f2a95ca commit fd5d56b
Show file tree
Hide file tree
Showing 23 changed files with 561 additions and 15 deletions.
3 changes: 3 additions & 0 deletions src/main/kotlin/no/nav/familie/ba/sak/common/Tid.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ private val FORMAT_DATO_NORSK = DateTimeFormatter.ofPattern("dd.MM.yyyy", nbLoca
private val FORMAT_DATO_MÅNED_ÅR_KORT = DateTimeFormatter.ofPattern("MM.yy", nbLocale)
private val FORMAT_DATO_DAG_MÅNED_ÅR = DateTimeFormatter.ofPattern("d. MMMM yyyy", nbLocale)
private val FORMAT_DATO_MÅNED_ÅR = DateTimeFormatter.ofPattern("MMMM yyyy", nbLocale)
private val FORMAT_DATO_MÅNED_ÅR_MEDIUM = DateTimeFormatter.ofPattern("MMM yy", nbLocale)

fun LocalDate.tilddMMyy() = this.format(FORMAT_DATE_DDMMYY)

Expand All @@ -36,6 +37,8 @@ fun LocalDate.tilMånedÅr() = this.format(FORMAT_DATO_MÅNED_ÅR)

fun YearMonth.tilMånedÅr() = this.format(FORMAT_DATO_MÅNED_ÅR)

fun YearMonth.tilMånedÅrMedium() = this.format(FORMAT_DATO_MÅNED_ÅR_MEDIUM)

fun erBack2BackIMånedsskifte(
tilOgMed: LocalDate?,
fraOgMed: LocalDate?,
Expand Down
86 changes: 77 additions & 9 deletions src/main/kotlin/no/nav/familie/ba/sak/kjerne/brev/BrevService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import no.nav.familie.ba.sak.common.Utils
import no.nav.familie.ba.sak.common.Utils.storForbokstavIAlleNavn
import no.nav.familie.ba.sak.common.secureLogger
import no.nav.familie.ba.sak.common.tilDagMånedÅr
import no.nav.familie.ba.sak.common.tilMånedÅr
import no.nav.familie.ba.sak.common.toYearMonth
import no.nav.familie.ba.sak.config.FeatureToggleConfig
import no.nav.familie.ba.sak.config.featureToggle.UnleashNextMedContextService
import no.nav.familie.ba.sak.integrasjoner.familieintegrasjoner.IntegrasjonClient
Expand All @@ -16,6 +18,7 @@ import no.nav.familie.ba.sak.kjerne.arbeidsfordeling.ArbeidsfordelingService
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.domene.AndelTilkjentYtelseRepository
import no.nav.familie.ba.sak.kjerne.beregning.domene.tilTidslinjerPerPersonOgType
import no.nav.familie.ba.sak.kjerne.brev.brevBegrunnelseProdusent.BrevBegrunnelseFeil
import no.nav.familie.ba.sak.kjerne.brev.brevPeriodeProdusent.lagBrevPeriode
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.Autovedtak6og18årOgSmåbarnstillegg
Expand All @@ -40,9 +43,16 @@ import no.nav.familie.ba.sak.kjerne.brev.domene.maler.Opphørt
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.RefusjonEøsAvklart
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.RefusjonEøsUavklart
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.SignaturVedtak
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.UtbetalingstabellAutomatiskValutajustering
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.VedtakEndring
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.VedtakFellesfelter
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.Vedtaksbrev
import no.nav.familie.ba.sak.kjerne.brev.domene.maler.utbetalingEøs.UtbetalingMndEøs
import no.nav.familie.ba.sak.kjerne.eøs.kompetanse.KompetanseRepository
import no.nav.familie.ba.sak.kjerne.eøs.kompetanse.domene.UtfyltKompetanse
import no.nav.familie.ba.sak.kjerne.eøs.kompetanse.domene.tilIKompetanse
import no.nav.familie.ba.sak.kjerne.eøs.utenlandskperiodebeløp.UtenlandskPeriodebeløpRepository
import no.nav.familie.ba.sak.kjerne.eøs.valutakurs.ValutakursRepository
import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.Målform
import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.PersongrunnlagService
import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.PersonopplysningGrunnlag
Expand All @@ -60,6 +70,7 @@ import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.Vedtaksperiodetype
import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.VilkårsvurderingService
import no.nav.familie.ba.sak.sikkerhet.SaksbehandlerContext
import org.springframework.stereotype.Service
import tilLandNavn
import java.math.BigDecimal

@Service
Expand All @@ -80,6 +91,9 @@ class BrevService(
private val integrasjonClient: IntegrasjonClient,
private val testVerktøyService: TestVerktøyService,
private val andelTilkjentYtelseRepository: AndelTilkjentYtelseRepository,
private val utenlandskPeriodebeløpRepository: UtenlandskPeriodebeløpRepository,
private val kompetanseRepository: KompetanseRepository,
private val valutakursRepository: ValutakursRepository,
private val unleashService: UnleashNextMedContextService,
) {
fun hentVedtaksbrevData(vedtak: Vedtak): Vedtaksbrev {
Expand Down Expand Up @@ -112,6 +126,7 @@ class BrevService(
duMåMeldeFraOmEndringer = !skalMeldeFraOmEndringerEøsSelvstendigRett,
duMåMeldeFraOmEndringerEøsSelvstendigRett = skalMeldeFraOmEndringerEøsSelvstendigRett,
informasjonOmUtbetaling = skalInkludereInformasjonOmUtbetaling,
utbetalingstabellAutomatiskValutajustering = hentLandOgStartdatoForUtbetalingstabell(vedtak, vedtakFellesfelter),
)

Brevmal.VEDTAK_FØRSTEGANGSVEDTAK_INSTITUSJON ->
Expand All @@ -137,6 +152,7 @@ class BrevService(
duMåMeldeFraOmEndringer = !skalMeldeFraOmEndringerEøsSelvstendigRett,
duMåMeldeFraOmEndringerEøsSelvstendigRett = skalMeldeFraOmEndringerEøsSelvstendigRett,
informasjonOmUtbetaling = skalInkludereInformasjonOmUtbetaling,
utbetalingstabellAutomatiskValutajustering = hentLandOgStartdatoForUtbetalingstabell(vedtak, vedtakFellesfelter),
)

Brevmal.VEDTAK_ENDRING_INSTITUSJON ->
Expand Down Expand Up @@ -170,6 +186,7 @@ class BrevService(
refusjonEosAvklart = beskrivPerioderMedAvklartRefusjonEøs(vedtak),
refusjonEosUavklart = beskrivPerioderMedUavklartRefusjonEøs(vedtak),
erKlage = behandling.erKlage(),
utbetalingstabellAutomatiskValutajustering = hentLandOgStartdatoForUtbetalingstabell(vedtak, vedtakFellesfelter),
)

Brevmal.VEDTAK_OPPHØR_MED_ENDRING_INSTITUSJON ->
Expand Down Expand Up @@ -198,6 +215,7 @@ class BrevService(
duMåMeldeFraOmEndringer = !skalMeldeFraOmEndringerEøsSelvstendigRett,
duMåMeldeFraOmEndringerEøsSelvstendigRett = skalMeldeFraOmEndringerEøsSelvstendigRett,
informasjonOmUtbetaling = skalInkludereInformasjonOmUtbetaling,
utbetalingstabellAutomatiskValutajustering = hentLandOgStartdatoForUtbetalingstabell(vedtak, vedtakFellesfelter),
)

Brevmal.VEDTAK_FORTSATT_INNVILGET_INSTITUSJON ->
Expand Down Expand Up @@ -228,6 +246,26 @@ class BrevService(
}
}

private fun hentLandOgStartdatoForUtbetalingstabell(
vedtak: Vedtak,
vedtakFellesfelter: VedtakFellesfelter,
): UtbetalingstabellAutomatiskValutajustering? {
return vedtakFellesfelter.utbetalingerPerMndEøs?.let {
val mndÅrFørsteEndring = hentSorterteVedtaksperioderMedBegrunnelser(vedtak).first().fom!!
val landkoder = integrasjonClient.hentLandkoderISO2()
val kompetanser = kompetanseRepository.finnFraBehandlingId(behandlingId = vedtak.behandling.id).map { it.tilIKompetanse() }.filterIsInstance<UtfyltKompetanse>()
val eøsLandMedUtbetalinger =
kompetanser.filter { it.fom >= mndÅrFørsteEndring.toYearMonth() }.map {
if (it.erAnnenForelderOmfattetAvNorskLovgivning) {
it.søkersAktivitetsland.tilLandNavn(landkoder).navn
} else {
it.annenForeldersAktivitetsland?.tilLandNavn(landkoder)?.navn ?: it.barnetsBostedsland.tilLandNavn(landkoder).navn
}
}.toSet()
return UtbetalingstabellAutomatiskValutajustering(utbetalingerEosLand = eøsLandMedUtbetalinger.slåSammen(), utbetalingerEosMndAar = mndÅrFørsteEndring.tilMånedÅr())
}
}

fun sjekkOmDetErLøpendeDifferanseUtbetalingPåBehandling(behandling: Behandling): Boolean {
if (!unleashService.isEnabled(FeatureToggleConfig.KAN_OPPRETTE_AUTOMATISKE_VALUTAKURSER_PÅ_MANUELLE_SAKER)) return false

Expand Down Expand Up @@ -316,14 +354,15 @@ class BrevService(
)
}

private fun hentSorterteVedtaksperioderMedBegrunnelser(vedtak: Vedtak) =
vedtaksperiodeService.hentPersisterteVedtaksperioder(vedtak)
.filter { it.erBegrunnet() }
.sortedBy { it.fom }

fun lagVedtaksbrevFellesfelter(vedtak: Vedtak): VedtakFellesfelter {
val vedtaksperioder =
vedtaksperiodeService.hentPersisterteVedtaksperioder(vedtak)
.filter {
!(it.begrunnelser.isEmpty() && it.fritekster.isEmpty() && it.eøsBegrunnelser.isEmpty())
}.sortedBy { it.fom }
val sorterteVedtaksperioderMedBegrunnelser = hentSorterteVedtaksperioderMedBegrunnelser(vedtak)

if (vedtaksperioder.isEmpty()) {
if (sorterteVedtaksperioderMedBegrunnelser.isEmpty()) {
throw FunksjonellFeil(
"Vedtaket mangler begrunnelser. Du må legge til begrunnelser for å generere vedtaksbrevet.",
)
Expand All @@ -336,7 +375,7 @@ class BrevService(

val grunnlagForBegrunnelser = vedtaksperiodeService.hentGrunnlagForBegrunnelse(vedtak.behandling)
val brevperioder =
vedtaksperioder.mapNotNull { vedtaksperiode ->
sorterteVedtaksperioderMedBegrunnelser.mapNotNull { vedtaksperiode ->
try {
vedtaksperiode.lagBrevPeriode(
grunnlagForBegrunnelse = grunnlagForBegrunnelser,
Expand All @@ -353,14 +392,16 @@ class BrevService(
}
}

val utbetalingerPerMndEøs = hentUtbetalingerPerMndEøs(vedtak)

val korrigertVedtak = korrigertVedtakService.finnAktivtKorrigertVedtakPåBehandling(behandlingId)
val refusjonEøs = refusjonEøsRepository.finnRefusjonEøsForBehandling(behandlingId)

val hjemler =
hentHjemler(
behandlingId = behandlingId,
erFritekstIBrev = vedtaksperioder.any { it.fritekster.isNotEmpty() },
vedtaksperioder = vedtaksperioder,
erFritekstIBrev = sorterteVedtaksperioderMedBegrunnelser.any { it.fritekster.isNotEmpty() },
vedtaksperioder = sorterteVedtaksperioderMedBegrunnelser,
målform = personopplysningGrunnlag.søker.målform,
vedtakKorrigertHjemmelSkalMedIBrev = korrigertVedtak != null,
refusjonEøsHjemmelSkalMedIBrev = refusjonEøs.isNotEmpty(),
Expand All @@ -380,6 +421,7 @@ class BrevService(
organisasjonsnummer = organisasjonsnummer,
gjelder = if (organisasjonsnummer != null) grunnlagOgSignaturData.grunnlag.søker.navn else null,
korrigertVedtakData = korrigertVedtak?.let { KorrigertVedtakData(datoKorrigertVedtak = it.vedtaksdato.tilDagMånedÅr()) },
utbetalingerPerMndEøs = utbetalingerPerMndEøs,
)
}

Expand Down Expand Up @@ -446,6 +488,32 @@ class BrevService(
)
}

private fun hentUtbetalingerPerMndEøs(
vedtak: Vedtak,
): Map<String, UtbetalingMndEøs>? {
if (!unleashService.isEnabled(FeatureToggleConfig.KAN_OPPRETTE_AUTOMATISKE_VALUTAKURSER_PÅ_MANUELLE_SAKER)) {
return null
}

val behandlingId = vedtak.behandling.id
val endringstidspunkt = vedtaksperiodeService.finnEndringstidspunktForBehandling(behandlingId = behandlingId)
val valutakurser = valutakursRepository.finnFraBehandlingId(behandlingId = behandlingId)

if (!skalHenteUtbetalingerEøs(endringstidspunkt = endringstidspunkt, valutakurser)) {
return null
}

val andelerForVedtaksperioderPerAktørOgType = andelTilkjentYtelseRepository.finnAndelerTilkjentYtelseForBehandling(behandlingId = behandlingId).tilTidslinjerPerPersonOgType()
val utenlandskePeriodebeløp = utenlandskPeriodebeløpRepository.finnFraBehandlingId(behandlingId = behandlingId).toList()

return hentUtbetalingerPerMndEøs(
endringstidspunkt = endringstidspunkt,
andelerForVedtaksperioderPerAktørOgType = andelerForVedtaksperioderPerAktørOgType,
utenlandskePeriodebeløp = utenlandskePeriodebeløp,
valutakurser = valutakurser,
)
}

fun hentSaksbehandlerOgBeslutter(
behandling: Behandling,
totrinnskontroll: Totrinnskontroll?,
Expand Down
Loading

0 comments on commit fd5d56b

Please sign in to comment.