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

Avkorting feil etter varselbrevjobb #6444

Merged
merged 4 commits into from
Nov 25, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
Expand Up @@ -62,6 +62,9 @@ class AarligInntektsjusteringService(
fom = YearMonth.of(aar, 1),
)

// Avkorting opprettes her med tidligere årsoppgjør
avkortingService.hentOpprettEllerReberegnAvkorting(behandlingId, brukerTokenInfo)

avkortingService.beregnAvkortingMedNyttGrunnlag(behandlingId, brukerTokenInfo, nyttGrunnlag)
return avkortingRepository.hentAvkorting(behandlingId)
?: throw AvkortingFinnesIkkeException(behandlingId)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package no.nav.etterlatte.avkorting

import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException
import no.nav.etterlatte.libs.common.sak.SakId
import no.nav.etterlatte.libs.common.vedtak.VedtakSammendragDto
import no.nav.etterlatte.libs.common.vedtak.VedtakType
import org.slf4j.LoggerFactory
import java.time.YearMonth

/*
* Inntektsjobb for 2025 innførte en feil i alle behandlinger som ble gjort automatisk som kompanseres for her.
* Alle behandlinger skal inneholde alle tidligere årsoppgjør men de automatiske behandlingene i jobben består kun av 2025.
* Det medfører at revurdering tilbake til 2024 mangler inntekten for 2024 når forrige behandling/avkorting kopieres.
*
* For å reparere dette gjøres det ekstra håndtering for å flette forrige avkorting med forrige avkorting i 2024.
* Denne må kjøre helt til alle saker har lagd en ny revurdering.
*
* Når alle saker har en ny revurdering hver (f.eks ved regulering eller etteroppgjør)
* kan dette fjernes og kun kopiere forrige avkorting.
*
*/
class AvkortingReparerAarsoppgjoeret(
val avkortingRepository: AvkortingRepository,
) {
private val logger = LoggerFactory.getLogger(this::class.java)

fun hentSisteAvkortingMedReparertAarsoppgjoer(
forrigeAvkorting: Avkorting,
virkningstidspunkt: YearMonth,
sakId: SakId,
alleVedtak: List<VedtakSammendragDto>,
): Avkorting {
if (YearMonth.now() > YearMonth.of(2025, 5)) {
logger.warn("AvkortingReparerAarsoppgjoeret.kt har nå med sikkerhet blitt kjørt på alle saker etter regulering og kan fjernes!")
Copy link
Contributor

@andreasbalevik andreasbalevik Nov 25, 2024

Choose a reason for hiding this comment

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

Burde denne være en error så vi fanger det opp i Slack?

}

val alleAarMedAarsoppgjoer = avkortingRepository.hentAlleAarsoppgjoer(sakId).map { it.aar }.distinct()
val alleAarNyAvkortng = forrigeAvkorting.aarsoppgjoer.map { it.aar }
val manglerAar = alleAarMedAarsoppgjoer != alleAarNyAvkortng

if (manglerAar) {
val sisteAarsoppgjoer = forrigeAvkorting.aarsoppgjoer.maxBy { it.aar }
if (sisteAarsoppgjoer.aar < virkningstidspunkt.year) {
if (virkningstidspunkt != YearMonth.of(virkningstidspunkt.year, 1)) {
throw FoersteRevurderingSenereEnnJanuar()
}
return forrigeAvkorting
}

val manglendeAar =
when (alleAarNyAvkortng.contains(virkningstidspunkt.year)) {
true -> virkningstidspunkt.year.minus(1)
false -> virkningstidspunkt.year
}

val sisteBehandlingManglendeAar = alleVedtak.sisteLoependeVedtakForAar(manglendeAar).behandlingId
val sisteAvkortingManglendeAar =
avkortingRepository.hentAvkorting(sisteBehandlingManglendeAar)
?: throw TidligereAvkortingFinnesIkkeException(sisteBehandlingManglendeAar)

return sisteAvkortingManglendeAar.copy(
aarsoppgjoer = sisteAvkortingManglendeAar.aarsoppgjoer + forrigeAvkorting.aarsoppgjoer,
)
} else {
return forrigeAvkorting
}
}
}

fun List<VedtakSammendragDto>.sisteLoependeVedtakForAar(aar: Int) =
filter {
val vedtakAar = it.virkningstidspunkt?.year ?: throw InternfeilException("Vedtak mangler virk")
it.vedtakType != VedtakType.OPPHOER && vedtakAar == aar
}.maxBy {
it.datoAttestert ?: throw InternfeilException("Iverksatt vedtak mangler dato attestert")
}
Original file line number Diff line number Diff line change
Expand Up @@ -501,4 +501,23 @@ class AvkortingRepository(
sanksjonId = uuid("sanksjon_id"),
sanksjonType = enumValueOf(string("sanksjon_type")),
)

fun hentAlleAarsoppgjoer(sakId: SakId): List<Aarsoppgjoer> =
dataSource.transaction { tx ->
queryOf(
"SELECT * FROM avkorting_aarsoppgjoer WHERE sak_id= ? ORDER BY aar ASC",
sakId.sakId,
).let { query ->
tx.run(
query
.map { row ->
Aarsoppgjoer(
id = row.uuid("id"),
aar = row.int("aar"),
fom = row.sqlDate("fom").let { YearMonth.from(it.toLocalDate()) },
)
}.asList,
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import no.nav.etterlatte.libs.common.vedtak.VedtakType
import no.nav.etterlatte.libs.ktor.token.BrukerTokenInfo
import no.nav.etterlatte.sanksjon.SanksjonService
import org.slf4j.LoggerFactory
import java.time.YearMonth
import java.util.UUID

enum class AvkortingToggles(
Expand All @@ -40,6 +41,7 @@ class AvkortingService(
private val sanksjonService: SanksjonService,
private val grunnlagKlient: GrunnlagKlient,
private val vedtakKlient: VedtaksvurderingKlient,
private val avkortingReparerAarsoppgjoeret: AvkortingReparerAarsoppgjoeret,
private val featureToggleService: FeatureToggleService,
) {
private val logger = LoggerFactory.getLogger(this::class.java)
Expand Down Expand Up @@ -69,7 +71,8 @@ class AvkortingService(
}
}

val forrigeAvkorting = hentAvkortingForrigeBehandling(behandling.sak, brukerTokenInfo)
val forrigeAvkorting =
hentAvkortingForrigeBehandling(behandling.sak, brukerTokenInfo, behandling.virkningstidspunkt().dato)
return if (eksisterendeAvkorting == null) {
val nyAvkorting =
kopierOgReberegnAvkorting(behandling, forrigeAvkorting, brukerTokenInfo)
Expand Down Expand Up @@ -148,7 +151,12 @@ class AvkortingService(
if (behandling.behandlingType == BehandlingType.FØRSTEGANGSBEHANDLING) {
avkortingMedTillegg(lagretAvkorting, behandling)
} else {
val forrigeAvkorting = hentAvkortingForrigeBehandling(behandling.sak, brukerTokenInfo)
val forrigeAvkorting =
hentAvkortingForrigeBehandling(
behandling.sak,
brukerTokenInfo,
behandling.virkningstidspunkt().dato,
)
avkortingMedTillegg(
lagretAvkorting,
behandling,
Expand Down Expand Up @@ -240,16 +248,23 @@ class AvkortingService(
suspend fun hentAvkortingForrigeBehandling(
sakId: SakId,
brukerTokenInfo: BrukerTokenInfo,
virkningstidspunkt: YearMonth,
): Avkorting {
val alleVedtak = vedtakKlient.hentIverksatteVedtak(sakId, brukerTokenInfo)
val forrigeBehandlingId =
vedtakKlient
.hentIverksatteVedtak(sakId, brukerTokenInfo)
alleVedtak
.filter {
it.vedtakType != VedtakType.OPPHOER
}.maxBy {
it.datoAttestert ?: throw InternfeilException("Iverksatt vedtak mangler dato attestert")
}.behandlingId
return hentForrigeAvkorting(forrigeBehandlingId)
val forrigeAvkorting = hentForrigeAvkorting(forrigeBehandlingId)
return avkortingReparerAarsoppgjoeret.hentSisteAvkortingMedReparertAarsoppgjoer(
forrigeAvkorting,
virkningstidspunkt,
sakId,
alleVedtak,
)
}

fun hentForrigeAvkorting(forrigeBehandlingId: UUID): Avkorting =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.etterlatte.config
import com.typesafe.config.Config
import com.typesafe.config.ConfigFactory
import no.nav.etterlatte.avkorting.AarligInntektsjusteringService
import no.nav.etterlatte.avkorting.AvkortingReparerAarsoppgjoeret
import no.nav.etterlatte.avkorting.AvkortingRepository
import no.nav.etterlatte.avkorting.AvkortingService
import no.nav.etterlatte.avkorting.AvkortingTidligAlderspensjonService
Expand Down Expand Up @@ -105,6 +106,9 @@ class ApplicationContext {
sanksjonService = sanksjonService,
)
val avkortingRepository = AvkortingRepository(dataSource)

val avkortingReparerAarsoppgjoeret = AvkortingReparerAarsoppgjoeret(avkortingRepository)

val avkortingService =
AvkortingService(
behandlingKlient = behandlingKlient,
Expand All @@ -113,6 +117,7 @@ class ApplicationContext {
sanksjonService = sanksjonService,
grunnlagKlient = grunnlagKlient,
vedtakKlient = vedtaksvurderingKlient,
avkortingReparerAarsoppgjoeret = avkortingReparerAarsoppgjoeret,
featureToggleService = featureToggleService,
)
val avkortingTidligAlderspensjonService =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,11 @@ class BeregningOgAvkortingBrevService(
BehandlingType.FØRSTEGANGSBEHANDLING -> false
else -> {
val forrigeAvkorting =
avkortingService.hentAvkortingForrigeBehandling(behandling.sak, brukerTokenInfo)
avkortingService.hentAvkortingForrigeBehandling(
behandling.sak,
brukerTokenInfo,
behandling.virkningstidspunkt().dato,
)
val sisteBeloep =
forrigeAvkorting
.toDto()
Expand Down
Loading
Loading