Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chore: koderydding del 3 #4494

Merged
merged 15 commits into from
Apr 19, 2024
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package no.nav.familie.ba.sak.ekstern.restDomene

import no.nav.familie.ba.sak.common.FunksjonellFeil
import no.nav.familie.ba.sak.common.erAlfanummeriskPlussKolon
import no.nav.familie.ba.sak.common.secureLogger
import no.nav.familie.ba.sak.integrasjoner.journalføring.domene.Bruker
import no.nav.familie.ba.sak.integrasjoner.journalføring.domene.OppdaterJournalpostRequest
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingKategori
Expand Down Expand Up @@ -80,3 +83,19 @@ data class RestJournalføring(
}
}
}

data class NavnOgIdent(
val navn: String,
val id: String,
) {
// Bruker init til å validere personidenten
init {
if (!id.erAlfanummeriskPlussKolon()) {
secureLogger.info("Ugyldig ident: $id")
throw FunksjonellFeil(
melding = "Ugyldig ident. Se securelog for mer informasjon.",
frontendFeilmelding = "Ugyldig ident. Normalt et fødselsnummer eller organisasjonsnummer",
)
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ import no.nav.familie.ba.sak.kjerne.vedtak.Vedtak
import no.nav.familie.ba.sak.kjerne.vedtak.domene.VedtaksperiodeMedBegrunnelser
import no.nav.familie.ba.sak.kjerne.vedtak.refusjonEøs.RefusjonEøsRepository
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.VedtaksperiodeService
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
Expand Down Expand Up @@ -284,7 +285,7 @@ class BrevService(
navnAvdode = data.grunnlag.søker.navn.storForbokstavIAlleNavn(),
virkningstidspunkt =
hentVirkningstidspunkt(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Jeg skjønner egentlig ikke hvorfor dette ikke er data.grunnlag.søker.dødsfall?.dødsfallDato ?: throw Feil( ... )

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I brevet bruker man virkningstidspunkt til å si når barnetrygden opphører fra, så tipper kanskje det isåfall ville ha vært dødsfallDato + 1 måned 🤔 men ja enig i det. Alternativt bare se på største periodeTom på andel tilkjent ytelse og plusse på 1 måned

opphørsperioder = vedtaksperiodeService.hentOpphørsperioder(vedtak.behandling),
opphørsperioder = vedtaksperiodeService.finnVedtaksperioderForBehandling(vedtak).filter { it.type == Vedtaksperiodetype.OPPHØR },
behandlingId = vedtak.behandling.id,
),
),
Expand Down
14 changes: 6 additions & 8 deletions src/main/kotlin/no/nav/familie/ba/sak/kjerne/brev/BrevUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package no.nav.familie.ba.sak.kjerne.brev

import no.nav.familie.ba.sak.common.Feil
import no.nav.familie.ba.sak.common.FunksjonellFeil
import no.nav.familie.ba.sak.common.TIDENES_MORGEN
import no.nav.familie.ba.sak.common.Utils
import no.nav.familie.ba.sak.common.tilMånedÅr
import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling
Expand All @@ -22,7 +23,6 @@ import no.nav.familie.ba.sak.kjerne.vedtak.begrunnelser.EØSStandardbegrunnelse
import no.nav.familie.ba.sak.kjerne.vedtak.begrunnelser.Standardbegrunnelse
import no.nav.familie.ba.sak.kjerne.vedtak.begrunnelser.hjemlerTilhørendeFritekst
import no.nav.familie.ba.sak.kjerne.vedtak.domene.VedtaksperiodeMedBegrunnelser
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.Opphørsperiode

fun hentAutomatiskVedtaksbrevtype(behandling: Behandling): Brevmal {
val behandlingÅrsak = behandling.opprettetÅrsak
Expand Down Expand Up @@ -252,14 +252,12 @@ private fun hentOrdinæreHjemler(
}

fun hentVirkningstidspunkt(
opphørsperioder: List<Opphørsperiode>,
opphørsperioder: List<VedtaksperiodeMedBegrunnelser>,
behandlingId: Long,
) = (
opphørsperioder
.maxOfOrNull { it.periodeFom }
?.tilMånedÅr()
?: throw Feil("Fant ikke opphørdato ved generering av dødsfallbrev på behandling $behandlingId")
)
) = opphørsperioder
.maxOfOrNull { it.fom ?: TIDENES_MORGEN }
?.tilMånedÅr()
?: throw Feil("Fant ikke opphørdato ved generering av dødsfallbrev på behandling $behandlingId")
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

En svakhet med å finne virkningstidspunkt på denne måten er at om man i fremtiden legger opp til fremtidig opphør/endringer så vil ikke dette nødvendigvis stemme for dødsfall-brev

Copy link
Contributor Author

@idaame idaame Apr 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Skjønner helt ærlig ikke helt hvorfor vi må gjøre det på denne måten. Det ble tidligere gjort på en annen måte som virker mer intuitiv, men i denne PRen endret til å bruke opphørsperioder i stedet: #1901

Føler det er litt overkill, og som den andre kommentaren her sier, ikke nødvendigvis 100% riktig i fremtiden 🤔 Men syns det er skummelt å skulle endre på noe her da... så kanskje like greit å bare la det være som det er.

Copy link
Contributor

@halvorbmundal halvorbmundal Apr 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, enig at dette er litt rart. Endringen nå er i alle fall ikke noe værre enn det var.

Kan vi eventuelt legge inn en validering på at opphørsperioden ikke er i fremtiden?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tror den kan være 1 måned frem i tid, men noe mer enn det går ikke. Jeg kan legge på validering


fun hentForvaltningsloverHjemler(vedtakKorrigertHjemmelSkalMedIBrev: Boolean): List<String> {
return if (vedtakKorrigertHjemmelSkalMedIBrev) listOf("35") else emptyList()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ import no.nav.familie.ba.sak.kjerne.vedtak.begrunnelser.Standardbegrunnelse
import no.nav.familie.ba.sak.kjerne.vedtak.begrunnelser.domene.EØSBegrunnelse
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.UtbetalingsperiodeDetalj
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.Vedtaksperiodetype
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.utledSegmenter
import no.nav.familie.ba.sak.sikkerhet.RollestyringMotDatabase
import java.time.LocalDate
import java.time.YearMonth
Expand Down Expand Up @@ -151,7 +150,7 @@ fun VedtaksperiodeMedBegrunnelser.hentUtbetalingsperiodeDetaljer(
Vedtaksperiodetype.ENDRET_UTBETALING,
->
finnUtbetalingsperioderRelevantForVedtaksperiode(utbetalingsperiodeDetaljer)?.toList() ?: throw Feil(
"Finner ikke segment for vedtaksperiode (${this.fom}, ${this.tom}) blant segmenter ${andelerTilkjentYtelse.utledSegmenter()}",
"Finner ikke segment for vedtaksperiode (${this.fom}, ${this.tom})}",
)

Vedtaksperiodetype.OPPHØR ->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,11 @@
package no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode

import no.nav.familie.ba.sak.common.TIDENES_ENDE
import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned
import no.nav.familie.ba.sak.common.inneværendeMåned
import no.nav.familie.ba.sak.common.isSameOrBefore
import no.nav.familie.ba.sak.common.nesteMåned
import no.nav.familie.ba.sak.common.toYearMonth
import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelseMedEndreteUtbetalinger
import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.PersonopplysningGrunnlag
import no.nav.familie.ba.sak.kjerne.tidslinje.Periode
import no.nav.familie.ba.sak.kjerne.tidslinje.Tidslinje
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.Innhold
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.innholdForTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.kombiner
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.kombinerMed
import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.tidslinjeFraTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Måned
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilMånedTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.MånedTidspunkt.Companion.tilTidspunkt
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.Tidsenhet
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.tilDagEllerFørsteDagIPerioden
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.tilDagEllerSisteDagIPerioden
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.tilLocalDate
import no.nav.familie.ba.sak.kjerne.tidslinje.tidsrom
import no.nav.familie.ba.sak.kjerne.tidslinje.tilTidslinje
import java.time.LocalDate

Expand All @@ -32,56 +15,6 @@ data class Opphørsperiode(
override val vedtaksperiodetype: Vedtaksperiodetype = Vedtaksperiodetype.OPPHØR,
) : Vedtaksperiode

fun mapTilOpphørsperioder(
forrigePersonopplysningGrunnlag: PersonopplysningGrunnlag? = null,
forrigeAndelerTilkjentYtelse: List<AndelTilkjentYtelseMedEndreteUtbetalinger> = emptyList(),
personopplysningGrunnlag: PersonopplysningGrunnlag,
andelerTilkjentYtelse: List<AndelTilkjentYtelseMedEndreteUtbetalinger>,
): List<Opphørsperiode> {
val forrigeUtbetalingsperioder =
if (forrigePersonopplysningGrunnlag != null) {
forrigeAndelerTilkjentYtelse.mapTilUtbetalingsperioder(forrigePersonopplysningGrunnlag)
} else {
emptyList()
}
val utbetalingsperioder =
andelerTilkjentYtelse.mapTilUtbetalingsperioder(personopplysningGrunnlag)

return listOf(
finnOpphørsperioderPåGrunnAvReduksjonIRevurdering(
forrigeUtbetalingsperioder = forrigeUtbetalingsperioder,
utbetalingsperioder = utbetalingsperioder,
),
finnOpphørsperioderMellomUtbetalingsperioder(utbetalingsperioder),
finnOpphørsperiodeEtterSisteUtbetalingsperiode(utbetalingsperioder),
).flatten().sortedBy { it.periodeFom }
}

private fun finnOpphørsperioderPåGrunnAvReduksjonIRevurdering(
forrigeUtbetalingsperioder: List<Utbetalingsperiode>,
utbetalingsperioder: List<Utbetalingsperiode>,
): List<Opphørsperiode> {
val erUtbetalingOpphørtTidslinje =
forrigeUtbetalingsperioder
.tilTidslinje()
.kombinerMed(utbetalingsperioder.tilTidslinje()) { forrigeUtbetaling, utbetaling ->
forrigeUtbetaling != null && utbetaling == null
}

return erUtbetalingOpphørtTidslinje.perioder()
.mapNotNull { erUtbetalingOpphørtPeriode ->
if (erUtbetalingOpphørtPeriode.innhold == true) {
Opphørsperiode(
periodeFom = erUtbetalingOpphørtPeriode.fraOgMed.tilDagEllerFørsteDagIPerioden().tilLocalDate(),
periodeTom = erUtbetalingOpphørtPeriode.tilOgMed.tilDagEllerSisteDagIPerioden().tilLocalDate(),
vedtaksperiodetype = Vedtaksperiodetype.OPPHØR,
)
} else {
null
}
}
}

fun List<AndelTilkjentYtelseMedEndreteUtbetalinger>.tilKombinertTidslinjePerAktørOgType(): Tidslinje<Collection<AndelTilkjentYtelseMedEndreteUtbetalinger>, Måned> {
val andelTilkjentYtelsePerPersonOgType = groupBy { Pair(it.aktør, it.type) }

Expand All @@ -100,87 +33,3 @@ fun List<AndelTilkjentYtelseMedEndreteUtbetalinger>.tilTidslinje(): Tidslinje<An
innhold = it,
)
}.tilTidslinje()

private fun List<Utbetalingsperiode>.tilTidslinje() =
this.map {
Periode(
fraOgMed = it.periodeFom.tilMånedTidspunkt(),
tilOgMed = it.periodeTom.tilMånedTidspunkt(),
innhold = it,
)
}.tilTidslinje()

private fun finnOpphørsperioderMellomUtbetalingsperioder(utbetalingsperioder: List<Utbetalingsperiode>): List<Opphørsperiode> =
utbetalingsperioder.tilTidslinje().tilHarVerdiTidslinje().perioder()
.filter { erUtbetalingIPeriode -> erUtbetalingIPeriode.innhold != true }
.map {
Opphørsperiode(
periodeFom = it.fraOgMed.tilLocalDate(),
periodeTom = it.tilOgMed.tilLocalDate(),
vedtaksperiodetype = Vedtaksperiodetype.OPPHØR,
)
}

private fun <V, T : Tidsenhet> Tidslinje<V, T>.tilHarVerdiTidslinje(): Tidslinje<Boolean, T> =
this.tidsrom().tidslinjeFraTidspunkt { tidspunkt ->
Innhold(this.innholdForTidspunkt(tidspunkt).innhold != null)
}

private fun finnOpphørsperiodeEtterSisteUtbetalingsperiode(utbetalingsperioder: List<Utbetalingsperiode>): List<Opphørsperiode> {
val sisteUtbetalingsperiodeTom =
utbetalingsperioder
.maxOfOrNull { it.periodeTom }?.toYearMonth()
?: TIDENES_ENDE.toYearMonth()
val nesteMåned = inneværendeMåned().nesteMåned()

return if (sisteUtbetalingsperiodeTom.isBefore(nesteMåned)) {
listOf(
Opphørsperiode(
periodeFom = sisteUtbetalingsperiodeTom.nesteMåned().førsteDagIInneværendeMåned(),
periodeTom = null,
vedtaksperiodetype = Vedtaksperiodetype.OPPHØR,
),
)
} else {
emptyList()
}
}

fun slåSammenOpphørsperioder(alleOpphørsperioder: List<Opphørsperiode>): List<Opphørsperiode> {
if (alleOpphørsperioder.isEmpty()) return emptyList()

val sortertOpphørsperioder = alleOpphørsperioder.sortedBy { it.periodeFom }

return sortertOpphørsperioder.fold(
mutableListOf(
sortertOpphørsperioder.first(),
),
) { acc: MutableList<Opphørsperiode>, nesteOpphørsperiode: Opphørsperiode ->
val forrigeOpphørsperiode = acc.last()
when {
nesteOpphørsperiode.periodeFom.isSameOrBefore(forrigeOpphørsperiode.periodeTom ?: TIDENES_ENDE) -> {
acc[acc.lastIndex] =
forrigeOpphørsperiode.copy(
periodeTom =
maxOfOpphørsperiodeTom(
forrigeOpphørsperiode.periodeTom,
nesteOpphørsperiode.periodeTom,
),
)
}

else -> {
acc.add(nesteOpphørsperiode)
}
}

acc
}
}

private fun maxOfOpphørsperiodeTom(
a: LocalDate?,
b: LocalDate?,
): LocalDate? {
return if (a != null && b != null) maxOf(a, b) else null
}
Loading
Loading