From 637f70512ee252e65cbe789048ca19a5fe1a2cb6 Mon Sep 17 00:00:00 2001 From: bragejahren <70642183+bragejahren@users.noreply.github.com> Date: Wed, 13 Nov 2024 14:31:14 +0100 Subject: [PATCH] NAV-22995: Ny klassekode for utvidet barnetrygd (BAUTV-OP) (#4852) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Favro: [NAV-22995](https://favro.com/organization/98c34fb974ce445eac854de0/1844bbac3b6605eacc8f5543?card=NAV-22995) ### 💰 Hva skal gjøres, og hvorfor? Bruker nå ny klassekode `BAUTV-OP` for utvidet barnetrygd fremfor `BATR` som ble brukt tidligere. Endringen er lagt bak feature toggle som vi vil skru på for enkelte fagsaker til å begynne med. Det er laget skreddersydd håndtering dersom utvidet barnetrygd opphører i fagsaker som ikke er over på ny klassekode for utvidet. I disse tilfellene vil vi fortsette å bruke `BATR`. Ved opphør av utvidet barnetrygd i fagsaker som er over på ny klassekode vil vi fortsette å bruke den nye klassekoden `BAUTV-OP`. ### 🔎️ Er det noe spesielt du ønsker tilbakemelding om? Vi har også omstrukturert koden rundt generering av utbetalingsoppdrag og oppdatering av tilkjent ytelse. Kun strukturelle endringer. ### ✅ Checklist - [x] Jeg har testet mine endringer i henhold til akseptansekriteriene 🕵️ - [ ] Jeg har config- eller sql-endringer. - [x] Jeg har skrevet tester. ### 💬 Ønsker du en muntlig gjennomgang? - [ ] Ja - [x] Nei, men tar gjerne en gjennomgang om ønskelig. Detaljer for siste utbetaling på Min side -> Utbetalinger: ![image](https://github.com/user-attachments/assets/a01f0654-d56c-4488-887d-eac254ba41fe) --------- Co-authored-by: thoalm Co-authored-by: Thomas Alm <106926075+thoalm@users.noreply.github.com> --- .../featureToggle/FeatureToggleConfig.kt | 3 + .../BehandlingsinformasjonUtleder.kt" | 79 ++ .../EndretMigreringsdatoUtleder.kt" | 54 ++ .../utbetalingsoppdrag/FagsystemBA.kt" | 1 + .../KlassifiseringKorrigerer.kt" | 66 ++ .../OppdaterTilkjentYtelseService.kt" | 102 +++ .../UtbetalingsoppdragGenerator.kt" | 128 +-- .../UtbetalingsoppdragGeneratorService.kt" | 178 ---- .../utbetalingsoppdrag/YtelsetypeBA.kt" | 3 +- .../\303\270konomi/\303\230konomiService.kt" | 34 +- .../beregning/domene/AndelTilkjentYtelse.kt | 10 +- .../domene/TilkjentYtelseRepository.kt | 11 + .../kjerne/simulering/SimuleringService.kt | 17 +- .../ba/sak/common/TestClockProvider.kt | 11 +- .../\303\270konomi/HentStatusTest.kt" | 10 +- .../BehandlingsinformasjonUtlederTest.kt" | 777 ++++++++++++++++ .../EndretMigreringsdatoUtlederTest.kt" | 351 +++++++ .../utbetalingsoppdrag/FagsystemBATest.kt" | 1 + .../KlassifiseringKorrigererTest.kt" | 189 ++++ .../OppdaterTilkjentYtelseServiceTest.kt" | 508 +++++++++++ ...UtbetalingsoppdragGeneratorServiceTest.kt" | 862 ------------------ .../UtbetalingsoppdragGeneratorTest.kt" | 273 ++++++ .../utbetalingsoppdrag/YtelsetypeBATest.kt" | 9 + .../kjerne/beregning/domene/YtelseTypeTest.kt | 47 + .../simulering/SimuleringServiceEnhetTest.kt | 9 +- .../familie/ba/sak/cucumber/OppdragSteg.kt | 145 ++- .../ba/sak/cucumber/VedtaksperiodeUtil.kt | 30 +- ...aksperioderOgBegrunnelserStepDefinition.kt | 19 +- .../cucumber/domeneparser/DomeneparserUtil.kt | 2 + .../cucumber/domeneparser/OppdragParser.kt | 55 +- .../ba/sak/cucumber/mock/CucumberMock.kt | 40 +- .../MockAndelTilkjentYtelseRepository.kt | 16 +- .../MockTilkjentYtelseRepository.kt | 8 + .../sak/kjerne/beregning/BeregningTestUtil.kt | 7 +- .../domene/TilkjentYtelseRepositoryTest.kt | 72 ++ .../oppdrag/endretMigreringsdato.feature | 20 +- .../ba/sak/cucumber/oppdrag/opphoer.feature | 41 + 37 files changed, 2974 insertions(+), 1214 deletions(-) create mode 100644 "src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/BehandlingsinformasjonUtleder.kt" create mode 100644 "src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/EndretMigreringsdatoUtleder.kt" create mode 100644 "src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/KlassifiseringKorrigerer.kt" create mode 100644 "src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/OppdaterTilkjentYtelseService.kt" delete mode 100644 "src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorService.kt" create mode 100644 "src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/BehandlingsinformasjonUtlederTest.kt" create mode 100644 "src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/EndretMigreringsdatoUtlederTest.kt" create mode 100644 "src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/KlassifiseringKorrigererTest.kt" create mode 100644 "src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/OppdaterTilkjentYtelseServiceTest.kt" delete mode 100644 "src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorServiceTest.kt" create mode 100644 "src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorTest.kt" create mode 100644 src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/YtelseTypeTest.kt create mode 100644 src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/TilkjentYtelseRepositoryTest.kt diff --git a/src/main/kotlin/no/nav/familie/ba/sak/config/featureToggle/FeatureToggleConfig.kt b/src/main/kotlin/no/nav/familie/ba/sak/config/featureToggle/FeatureToggleConfig.kt index 89d57cbb539..f276203a437 100644 --- a/src/main/kotlin/no/nav/familie/ba/sak/config/featureToggle/FeatureToggleConfig.kt +++ b/src/main/kotlin/no/nav/familie/ba/sak/config/featureToggle/FeatureToggleConfig.kt @@ -16,6 +16,9 @@ class FeatureToggleConfig { // NAV-22311 const val OPPRETT_SAK_PÅ_RIKTIG_ENHET_OG_SAKSBEHANDLER = "familie-ba-ks-sak.opprett-sak-paa-riktig-enhet-og-saksbehandler" + // NAV-22995 + const val SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD = "familie-ba-sak.skal-bruke-ny-klassekode-for-utvidet-barnetrygd" + // satsendring // Oppretter satsendring-tasker for de som ikke har fått ny task const val SATSENDRING_ENABLET: String = "familie-ba-sak.satsendring-enablet" diff --git "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/BehandlingsinformasjonUtleder.kt" "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/BehandlingsinformasjonUtleder.kt" new file mode 100644 index 00000000000..ca6985b41c3 --- /dev/null +++ "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/BehandlingsinformasjonUtleder.kt" @@ -0,0 +1,79 @@ +package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag + +import no.nav.familie.ba.sak.common.ClockProvider +import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse +import no.nav.familie.ba.sak.kjerne.fagsak.Fagsak +import no.nav.familie.ba.sak.kjerne.fagsak.FagsakType +import no.nav.familie.ba.sak.kjerne.vedtak.Vedtak +import no.nav.familie.felles.utbetalingsgenerator.domain.Behandlingsinformasjon +import no.nav.familie.felles.utbetalingsgenerator.domain.IdentOgType +import org.springframework.stereotype.Component +import java.time.LocalDate +import java.time.YearMonth + +@Component +class BehandlingsinformasjonUtleder( + private val endretMigreringsdatoUtleder: EndretMigreringsdatoUtleder, + private val clockProvider: ClockProvider, +) { + fun utled( + saksbehandlerId: String, + vedtak: Vedtak, + forrigeTilkjentYtelse: TilkjentYtelse?, + sisteAndelPerKjede: Map, + erSimulering: Boolean, + ): Behandlingsinformasjon { + val behandling = vedtak.behandling + val fagsak = behandling.fagsak + val endretMigreringsdato = endretMigreringsdatoUtleder.utled(fagsak, forrigeTilkjentYtelse) + return Behandlingsinformasjon( + saksbehandlerId = saksbehandlerId, + behandlingId = behandling.id.toString(), + eksternBehandlingId = behandling.id, + eksternFagsakId = fagsak.id, + fagsystem = FagsystemBA.BARNETRYGD, + personIdent = fagsak.aktør.aktivFødselsnummer(), + vedtaksdato = vedtak.vedtaksdato?.toLocalDate() ?: LocalDate.now(clockProvider.get()), + opphørAlleKjederFra = finnOpphørsdatoForAlleKjeder(forrigeTilkjentYtelse, sisteAndelPerKjede, endretMigreringsdato), + utbetalesTil = finnUtebetalesTil(fagsak), + opphørKjederFraFørsteUtbetaling = finnOpphørKjederFraFørsteUtbetaling(endretMigreringsdato, erSimulering), + ) + } + + private fun finnOpphørsdatoForAlleKjeder( + forrigeTilkjentYtelse: TilkjentYtelse?, + sisteAndelPerKjede: Map, + endretMigreringsdato: YearMonth?, + ): YearMonth? = + if (forrigeTilkjentYtelse == null || sisteAndelPerKjede.isEmpty()) { + null + } else { + endretMigreringsdato + } + + private fun finnUtebetalesTil(fagsak: Fagsak): String = + when (fagsak.type) { + FagsakType.NORMAL, + FagsakType.BARN_ENSLIG_MINDREÅRIG, + -> fagsak.aktør.aktivFødselsnummer() + + FagsakType.INSTITUSJON, + -> { + fagsak.institusjon?.tssEksternId ?: throw IllegalStateException( + "Fagsak ${fagsak.id} er av type institusjon og mangler informasjon om institusjonen", + ) + } + } + + private fun finnOpphørKjederFraFørsteUtbetaling( + endretMigreringsdato: YearMonth?, + erSimulering: Boolean, + ) = + if (endretMigreringsdato != null) { + false + } else { + // Ved simulering når migreringsdato er endret, skal vi opphøre fra den nye datoen og ikke fra første utbetaling per kjede. + erSimulering + } +} diff --git "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/EndretMigreringsdatoUtleder.kt" "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/EndretMigreringsdatoUtleder.kt" new file mode 100644 index 00000000000..a966cf18f0e --- /dev/null +++ "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/EndretMigreringsdatoUtleder.kt" @@ -0,0 +1,54 @@ +package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag + +import no.nav.familie.ba.sak.common.toYearMonth +import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService +import no.nav.familie.ba.sak.kjerne.behandling.BehandlingService +import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingType +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse +import no.nav.familie.ba.sak.kjerne.fagsak.Fagsak +import org.springframework.stereotype.Component +import java.time.YearMonth + +@Component +class EndretMigreringsdatoUtleder( + private val behandlingHentOgPersisterService: BehandlingHentOgPersisterService, + private val behandlingService: BehandlingService, +) { + fun utled( + fagsak: Fagsak, + forrigeTilkjentYtelse: TilkjentYtelse?, + ): YearMonth? { + val forrigeTilstandFraDato = forrigeTilkjentYtelse?.andelerTilkjentYtelse?.minOfOrNull { it.stønadFom } + + if (forrigeTilstandFraDato == null) { + return null + } + + val erMigrertSak = + behandlingHentOgPersisterService + .hentBehandlinger(fagsak.id) + .any { it.type == BehandlingType.MIGRERING_FRA_INFOTRYGD } + + if (!erMigrertSak) { + return null + } + + val migreringsdatoPåFagsak = behandlingService.hentMigreringsdatoPåFagsak(fagsakId = fagsak.id) + + if (migreringsdatoPåFagsak == null) { + return null + } + + val nyTilstandFraDato = migreringsdatoPåFagsak.toYearMonth().plusMonths(1) + + if (nyTilstandFraDato.isAfter(forrigeTilstandFraDato)) { + throw IllegalStateException("Ny migreringsdato kan ikke være etter forrige migreringsdato") + } + + return if (forrigeTilstandFraDato.isAfter(nyTilstandFraDato)) { + nyTilstandFraDato + } else { + null + } + } +} diff --git "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/FagsystemBA.kt" "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/FagsystemBA.kt" index 965c2015600..d7efc82c238 100644 --- "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/FagsystemBA.kt" +++ "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/FagsystemBA.kt" @@ -11,6 +11,7 @@ enum class FagsystemBA( setOf( YtelsetypeBA.ORDINÆR_BARNETRYGD, YtelsetypeBA.UTVIDET_BARNETRYGD, + YtelsetypeBA.UTVIDET_BARNETRYGD_GAMMEL, YtelsetypeBA.SMÅBARNSTILLEGG, ), ), diff --git "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/KlassifiseringKorrigerer.kt" "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/KlassifiseringKorrigerer.kt" new file mode 100644 index 00000000000..b07fdbc29dd --- /dev/null +++ "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/KlassifiseringKorrigerer.kt" @@ -0,0 +1,66 @@ +package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag + +import no.nav.familie.ba.sak.config.FeatureToggleConfig +import no.nav.familie.ba.sak.config.featureToggle.UnleashNextMedContextService +import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository +import no.nav.familie.felles.utbetalingsgenerator.domain.BeregnetUtbetalingsoppdragLongId +import org.springframework.stereotype.Component + +@Component +class KlassifiseringKorrigerer( + private val tilkjentYtelseRepository: TilkjentYtelseRepository, + private val unleashNextMedContextService: UnleashNextMedContextService, +) { + fun korrigerKlassifiseringVedBehov( + beregnetUtbetalingsoppdrag: BeregnetUtbetalingsoppdragLongId, + behandling: Behandling, + ): BeregnetUtbetalingsoppdragLongId { + // For fagsaker vi ikke har skrudd på ny klassekode for, returnerer vi det originale utbetalingsoppdraget. + if (!unleashNextMedContextService.isEnabled( + toggleId = FeatureToggleConfig.SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD, + behandlingId = behandling.id, + ) + ) { + return beregnetUtbetalingsoppdrag + } + + val erFagsakOverPåNyKlassekodeForUtvidetBarnetrygd = + tilkjentYtelseRepository.harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd( + fagsakId = behandling.fagsak.id, + ) + + // Fagsak er over på ny klassekode for utvidet barnetrygd. Trenger ikke gjøre noen justeringer. + if (erFagsakOverPåNyKlassekodeForUtvidetBarnetrygd) { + return beregnetUtbetalingsoppdrag + } + + val utvidetBarnetrygdErOpphørt = + beregnetUtbetalingsoppdrag + .utbetalingsoppdrag + .utbetalingsperiode + .any { it.opphør != null && it.klassifisering == YtelsetypeBA.UTVIDET_BARNETRYGD.klassifisering } + + // Fagsak er ikke over på ny klassekode for utvidet barnetrygd, men det finnes heller ikke noe + // opphør på en utvidet-kjede. Trenger ikke gjøre noen justeringer. + if (!utvidetBarnetrygdErOpphørt) { + return beregnetUtbetalingsoppdrag + } + + // Når fagsak ikke er over på ny klassekode for utvidet barnetrygd og vi opphører en utvidet kjede, + // må vi bruke gammel klassekode. + return beregnetUtbetalingsoppdrag.copy( + utbetalingsoppdrag = + beregnetUtbetalingsoppdrag.utbetalingsoppdrag.copy( + utbetalingsperiode = + beregnetUtbetalingsoppdrag.utbetalingsoppdrag.utbetalingsperiode.map { + if (it.opphør != null && it.klassifisering == YtelsetypeBA.UTVIDET_BARNETRYGD.klassifisering) { + it.copy(klassifisering = YtelsetypeBA.UTVIDET_BARNETRYGD_GAMMEL.klassifisering) + } else { + it + } + }, + ), + ) + } +} diff --git "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/OppdaterTilkjentYtelseService.kt" "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/OppdaterTilkjentYtelseService.kt" new file mode 100644 index 00000000000..89eb225d47e --- /dev/null +++ "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/OppdaterTilkjentYtelseService.kt" @@ -0,0 +1,102 @@ +package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag + +import no.nav.familie.ba.sak.common.ClockProvider +import no.nav.familie.ba.sak.common.secureLogger +import no.nav.familie.ba.sak.common.toYearMonth +import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository +import no.nav.familie.ba.sak.kjerne.beregning.domene.tilAndelerTilkjentYtelseMedEndreteUtbetalinger +import no.nav.familie.ba.sak.kjerne.endretutbetaling.EndretUtbetalingAndelHentOgPersisterService +import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.EndretUtbetalingAndel +import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.førerTilOpphør +import no.nav.familie.felles.utbetalingsgenerator.domain.AndelMedPeriodeIdLongId +import no.nav.familie.felles.utbetalingsgenerator.domain.BeregnetUtbetalingsoppdragLongId +import no.nav.familie.felles.utbetalingsgenerator.domain.Utbetalingsoppdrag +import no.nav.familie.kontrakter.felles.objectMapper +import org.springframework.stereotype.Service +import java.time.LocalDate +import java.time.YearMonth + +@Service +class OppdaterTilkjentYtelseService( + private val endretUtbetalingAndelHentOgPersisterService: EndretUtbetalingAndelHentOgPersisterService, + private val tilkjentYtelseRepository: TilkjentYtelseRepository, + private val clockProvider: ClockProvider, +) { + fun oppdaterTilkjentYtelseMedUtbetalingsoppdrag( + tilkjentYtelse: TilkjentYtelse, + beregnetUtbetalingsoppdrag: BeregnetUtbetalingsoppdragLongId, + ) { + secureLogger.info( + "Oppdaterer TilkjentYtelse med utbetalingsoppdrag og offsets på andeler for behandling ${tilkjentYtelse.behandling.id}", + ) + + oppdaterTilkjentYtelseMedUtbetalingsoppdrag( + tilkjentYtelse = tilkjentYtelse, + utbetalingsoppdrag = beregnetUtbetalingsoppdrag.utbetalingsoppdrag, + endretUtbetalingAndeler = endretUtbetalingAndelHentOgPersisterService.hentForBehandling(tilkjentYtelse.behandling.id), + ) + + oppdaterAndelerMedPeriodeOffset( + tilkjentYtelse = tilkjentYtelse, + andelerMedPeriodeId = beregnetUtbetalingsoppdrag.andeler, + ) + + tilkjentYtelseRepository.save(tilkjentYtelse) + } + + private fun oppdaterTilkjentYtelseMedUtbetalingsoppdrag( + tilkjentYtelse: TilkjentYtelse, + utbetalingsoppdrag: Utbetalingsoppdrag, + endretUtbetalingAndeler: List, + ) { + val opphør = Opphør.opprettFor(utbetalingsoppdrag, tilkjentYtelse.behandling) + tilkjentYtelse.utbetalingsoppdrag = objectMapper.writeValueAsString(utbetalingsoppdrag) + tilkjentYtelse.stønadTom = utledStønadTom(tilkjentYtelse.andelerTilkjentYtelse, endretUtbetalingAndeler) + tilkjentYtelse.stønadFom = if (opphør.erRentOpphør) null else tilkjentYtelse.andelerTilkjentYtelse.minOf { it.stønadFom } + tilkjentYtelse.endretDato = LocalDate.now(clockProvider.get()) + tilkjentYtelse.opphørFom = opphør.opphørsdato?.toYearMonth() + } + + private fun utledStønadTom( + andelerTilkjentYtelse: Set, + endretUtbetalingAndeler: List, + ): YearMonth? { + val andelerMedEndringer = andelerTilkjentYtelse.tilAndelerTilkjentYtelseMedEndreteUtbetalinger(endretUtbetalingAndeler) + + val andelerMedRelevantUtbetaling = + andelerMedEndringer.filterNot { andelTilkjentYtelseMedEndreteUtbetalinger -> + andelTilkjentYtelseMedEndreteUtbetalinger.endreteUtbetalinger.any { endretUtbetaling -> + endretUtbetaling.førerTilOpphør() + } + } + + return andelerMedRelevantUtbetaling.maxOfOrNull { it.stønadTom } + } + + private fun oppdaterAndelerMedPeriodeOffset( + tilkjentYtelse: TilkjentYtelse, + andelerMedPeriodeId: List, + ) { + val andelerPåId = andelerMedPeriodeId.associateBy { it.id } + val andelerTilkjentYtelse = tilkjentYtelse.andelerTilkjentYtelse + val andelerSomSkalSendesTilOppdrag = andelerTilkjentYtelse.filter { it.erAndelSomSkalSendesTilOppdrag() } + if (andelerMedPeriodeId.size != andelerSomSkalSendesTilOppdrag.size) { + throw IllegalStateException( + "Antallet andeler med oppdatert periodeOffset, forrigePeriodeOffset og kildeBehandlingId fra ny generator skal være likt antallet andeler med kalkulertUtbetalingsbeløp != 0. Generator gir ${andelerMedPeriodeId.size} andeler men det er ${andelerSomSkalSendesTilOppdrag.size} andeler med kalkulertUtbetalingsbeløp != 0", + ) + } + andelerSomSkalSendesTilOppdrag.forEach { andel -> + val andelMedOffset = andelerPåId[andel.id] + if (andelMedOffset == null) { + throw IllegalStateException( + "Feil ved oppdaterig av offset på andeler. Finner ikke andel med id ${andel.id} blandt andelene med oppdatert offset fra ny generator. Ny generator returnerer andeler med ider ${andelerPåId.values.map { it.id }}", + ) + } + andel.periodeOffset = andelMedOffset.periodeId + andel.forrigePeriodeOffset = andelMedOffset.forrigePeriodeId + andel.kildeBehandlingId = andelMedOffset.kildeBehandlingId + } + } +} diff --git "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGenerator.kt" "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGenerator.kt" index 76d21e4f878..0999ce65d4a 100644 --- "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGenerator.kt" +++ "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGenerator.kt" @@ -1,92 +1,98 @@ package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag +import no.nav.familie.ba.sak.config.FeatureToggleConfig +import no.nav.familie.ba.sak.config.featureToggle.UnleashNextMedContextService +import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService +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.AndelTilkjentYtelseRepository import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse -import no.nav.familie.ba.sak.kjerne.fagsak.Fagsak -import no.nav.familie.ba.sak.kjerne.fagsak.FagsakType +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository import no.nav.familie.ba.sak.kjerne.vedtak.Vedtak import no.nav.familie.felles.utbetalingsgenerator.Utbetalingsgenerator import no.nav.familie.felles.utbetalingsgenerator.domain.AndelDataLongId -import no.nav.familie.felles.utbetalingsgenerator.domain.Behandlingsinformasjon import no.nav.familie.felles.utbetalingsgenerator.domain.BeregnetUtbetalingsoppdragLongId import no.nav.familie.felles.utbetalingsgenerator.domain.IdentOgType import org.springframework.stereotype.Component -import java.time.LocalDate -import java.time.YearMonth @Component -class UtbetalingsoppdragGenerator { +class UtbetalingsoppdragGenerator( + private val utbetalingsgenerator: Utbetalingsgenerator, + private val klassifiseringKorrigerer: KlassifiseringKorrigerer, + private val unleashNextMedContextService: UnleashNextMedContextService, + private val behandlingsinformasjonUtleder: BehandlingsinformasjonUtleder, + private val andelTilkjentYtelseRepository: AndelTilkjentYtelseRepository, + private val behandlingHentOgPersisterService: BehandlingHentOgPersisterService, + private val tilkjentYtelseRepository: TilkjentYtelseRepository, +) { fun lagUtbetalingsoppdrag( saksbehandlerId: String, vedtak: Vedtak, - forrigeTilkjentYtelse: TilkjentYtelse?, - nyTilkjentYtelse: TilkjentYtelse, - sisteAndelPerKjede: Map, - erSimulering: Boolean, - endretMigreringsDato: YearMonth? = null, - ): BeregnetUtbetalingsoppdragLongId = - Utbetalingsgenerator().lagUtbetalingsoppdrag( - behandlingsinformasjon = - Behandlingsinformasjon( - saksbehandlerId = saksbehandlerId, - behandlingId = vedtak.behandling.id.toString(), - eksternBehandlingId = vedtak.behandling.id, - eksternFagsakId = vedtak.behandling.fagsak.id, - fagsystem = FagsystemBA.BARNETRYGD, - personIdent = - vedtak.behandling.fagsak.aktør - .aktivFødselsnummer(), - vedtaksdato = vedtak.vedtaksdato?.toLocalDate() ?: LocalDate.now(), - opphørAlleKjederFra = - finnOpphørsdatoForAlleKjeder( - forrigeTilkjentYtelse = forrigeTilkjentYtelse, - sisteAndelPerKjede = sisteAndelPerKjede, - endretMigreringsDato = endretMigreringsDato, - ), - utbetalesTil = hentUtebetalesTil(vedtak.behandling.fagsak), - // Ved simulering når migreringsdato er endret, skal vi opphøre fra den nye datoen og ikke fra første utbetaling per kjede. - opphørKjederFraFørsteUtbetaling = if (endretMigreringsDato != null) false else erSimulering, - ), - forrigeAndeler = forrigeTilkjentYtelse?.tilAndelData() ?: emptyList(), - nyeAndeler = nyTilkjentYtelse.tilAndelData(), - sisteAndelPerKjede = sisteAndelPerKjede.mapValues { it.value.tilAndelDataLongId() }, + tilkjentYtelse: TilkjentYtelse, + erSimulering: Boolean = false, + ): BeregnetUtbetalingsoppdragLongId { + val forrigeTilkjentYtelse = hentForrigeTilkjentYtelse(vedtak.behandling) + val sisteAndelPerKjede = hentSisteAndelTilkjentYtelse(vedtak.behandling) + + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId, + vedtak, + forrigeTilkjentYtelse, + sisteAndelPerKjede, + erSimulering, + ) + + val beregnetUtbetalingsoppdrag = + utbetalingsgenerator.lagUtbetalingsoppdrag( + behandlingsinformasjon = behandlingsinformasjon, + forrigeAndeler = forrigeTilkjentYtelse?.tilAndelData() ?: emptyList(), + nyeAndeler = tilkjentYtelse.tilAndelData(), + sisteAndelPerKjede = sisteAndelPerKjede.mapValues { it.value.tilAndelDataLongId() }, + ) + + return klassifiseringKorrigerer.korrigerKlassifiseringVedBehov( + beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdrag, + behandling = vedtak.behandling, ) + } + + private fun hentSisteAndelTilkjentYtelse(behandling: Behandling): Map { + val skalBrukeNyKlassekodeForUtvidetBarnetrygd = + unleashNextMedContextService.isEnabled( + toggleId = FeatureToggleConfig.SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD, + behandlingId = behandling.id, + ) + return andelTilkjentYtelseRepository + .hentSisteAndelPerIdentOgType(fagsakId = behandling.fagsak.id) + .associateBy { IdentOgType(it.aktør.aktivFødselsnummer(), it.type.tilYtelseType(skalBrukeNyKlassekodeForUtvidetBarnetrygd)) } + } + + private fun hentForrigeTilkjentYtelse(behandling: Behandling): TilkjentYtelse? = + behandlingHentOgPersisterService + .hentForrigeBehandlingSomErIverksatt(behandling = behandling) + ?.let { tilkjentYtelseRepository.findByBehandlingAndHasUtbetalingsoppdrag(behandlingId = it.id) } private fun TilkjentYtelse.tilAndelData(): List = this.andelerTilkjentYtelse.map { it.tilAndelDataLongId() } - private fun AndelTilkjentYtelse.tilAndelDataLongId(): AndelDataLongId = - AndelDataLongId( + private fun AndelTilkjentYtelse.tilAndelDataLongId(): AndelDataLongId { + // Skrur på ny klassekode for enkelte fagsaker til å begynne med. + val skalBrukeNyKlassekodeForUtvidetBarnetrygd = + unleashNextMedContextService.isEnabled( + toggleId = FeatureToggleConfig.SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD, + behandlingId = this.behandlingId, + ) + return AndelDataLongId( id = id, fom = periode.fom, tom = periode.tom, beløp = kalkulertUtbetalingsbeløp, personIdent = aktør.aktivFødselsnummer(), - type = type.tilYtelseType(), + type = type.tilYtelseType(skalBrukeNyKlassekodeForUtvidetBarnetrygd), periodeId = periodeOffset, forrigePeriodeId = forrigePeriodeOffset, kildeBehandlingId = kildeBehandlingId, ) - - private fun finnOpphørsdatoForAlleKjeder( - forrigeTilkjentYtelse: TilkjentYtelse?, - sisteAndelPerKjede: Map, - endretMigreringsDato: YearMonth?, - ): YearMonth? { - if (forrigeTilkjentYtelse == null || sisteAndelPerKjede.isEmpty()) return null - if (endretMigreringsDato != null) return endretMigreringsDato - return null } - - private fun hentUtebetalesTil(fagsak: Fagsak): String = - when (fagsak.type) { - FagsakType.INSTITUSJON -> { - fagsak.institusjon?.tssEksternId - ?: error("Fagsak ${fagsak.id} er av type institusjon og mangler informasjon om institusjonen") - } - - else -> { - fagsak.aktør.aktivFødselsnummer() - } - } } diff --git "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorService.kt" "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorService.kt" deleted file mode 100644 index e03ec114766..00000000000 --- "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorService.kt" +++ /dev/null @@ -1,178 +0,0 @@ -package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag - -import no.nav.familie.ba.sak.common.secureLogger -import no.nav.familie.ba.sak.common.toYearMonth -import no.nav.familie.ba.sak.config.featureToggle.UnleashNextMedContextService -import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService -import no.nav.familie.ba.sak.kjerne.behandling.BehandlingService -import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling -import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingType -import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse -import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelseRepository -import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse -import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository -import no.nav.familie.ba.sak.kjerne.beregning.domene.tilAndelerTilkjentYtelseMedEndreteUtbetalinger -import no.nav.familie.ba.sak.kjerne.endretutbetaling.EndretUtbetalingAndelHentOgPersisterService -import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.EndretUtbetalingAndel -import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.førerTilOpphør -import no.nav.familie.ba.sak.kjerne.fagsak.Fagsak -import no.nav.familie.ba.sak.kjerne.vedtak.Vedtak -import no.nav.familie.felles.utbetalingsgenerator.domain.AndelMedPeriodeIdLongId -import no.nav.familie.felles.utbetalingsgenerator.domain.BeregnetUtbetalingsoppdragLongId -import no.nav.familie.felles.utbetalingsgenerator.domain.IdentOgType -import no.nav.familie.kontrakter.felles.objectMapper -import org.springframework.stereotype.Service -import org.springframework.transaction.annotation.Transactional -import java.time.LocalDate -import java.time.YearMonth - -@Service -class UtbetalingsoppdragGeneratorService( - private val behandlingHentOgPersisterService: BehandlingHentOgPersisterService, - private val behandlingService: BehandlingService, - private val tilkjentYtelseRepository: TilkjentYtelseRepository, - private val andelTilkjentYtelseRepository: AndelTilkjentYtelseRepository, - private val endretUtbetalingAndelHentOgPersisterService: EndretUtbetalingAndelHentOgPersisterService, - private val utbetalingsoppdragGenerator: UtbetalingsoppdragGenerator, - private val unleashNextMedContextService: UnleashNextMedContextService, -) { - @Transactional - fun genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( - vedtak: Vedtak, - saksbehandlerId: String, - erSimulering: Boolean = false, - ): BeregnetUtbetalingsoppdragLongId { - val forrigeTilkjentYtelse = hentForrigeTilkjentYtelse(vedtak.behandling) - val nyTilkjentYtelse = tilkjentYtelseRepository.findByBehandling(behandlingId = vedtak.behandling.id) - val endretMigreringsDato = - beregnOmMigreringsDatoErEndret( - vedtak.behandling, - forrigeTilkjentYtelse?.andelerTilkjentYtelse?.minOfOrNull { it.stønadFom }, - ) - val sisteAndelPerKjede = hentSisteAndelTilkjentYtelse(vedtak.behandling.fagsak) - val beregnetUtbetalingsoppdrag = - utbetalingsoppdragGenerator.lagUtbetalingsoppdrag( - saksbehandlerId = saksbehandlerId, - vedtak = vedtak, - forrigeTilkjentYtelse = forrigeTilkjentYtelse, - nyTilkjentYtelse = nyTilkjentYtelse, - sisteAndelPerKjede = sisteAndelPerKjede, - erSimulering = erSimulering, - endretMigreringsDato = endretMigreringsDato, - ) - - if (!erSimulering) { - oppdaterTilkjentYtelse(nyTilkjentYtelse, beregnetUtbetalingsoppdrag) - } - - return beregnetUtbetalingsoppdrag - } - - private fun oppdaterTilkjentYtelse( - tilkjentYtelse: TilkjentYtelse, - beregnetUtbetalingsoppdrag: BeregnetUtbetalingsoppdragLongId, - ) { - secureLogger.info("Oppdaterer TilkjentYtelse med utbetalingsoppdrag og offsets på andeler for behandling ${tilkjentYtelse.behandling.id}") - - oppdaterTilkjentYtelseMedUtbetalingsoppdrag( - tilkjentYtelse = tilkjentYtelse, - utbetalingsoppdrag = beregnetUtbetalingsoppdrag.utbetalingsoppdrag, - endretUtbetalingAndeler = endretUtbetalingAndelHentOgPersisterService.hentForBehandling(tilkjentYtelse.behandling.id), - ) - oppdaterAndelerMedPeriodeOffset( - tilkjentYtelse = tilkjentYtelse, - andelerMedPeriodeId = beregnetUtbetalingsoppdrag.andeler, - ) - tilkjentYtelseRepository.save(tilkjentYtelse) - } - - private fun hentForrigeTilkjentYtelse(behandling: Behandling): TilkjentYtelse? = - behandlingHentOgPersisterService - .hentForrigeBehandlingSomErIverksatt(behandling = behandling) - ?.let { tilkjentYtelseRepository.findByBehandlingAndHasUtbetalingsoppdrag(behandlingId = it.id) } - - private fun hentSisteAndelTilkjentYtelse(fagsak: Fagsak) = - andelTilkjentYtelseRepository - .hentSisteAndelPerIdentOgType(fagsakId = fagsak.id) - .associateBy { IdentOgType(it.aktør.aktivFødselsnummer(), it.type.tilYtelseType()) } - - private fun beregnOmMigreringsDatoErEndret( - behandling: Behandling, - forrigeTilstandFraDato: YearMonth?, - ): YearMonth? { - val erMigrertSak = - behandlingHentOgPersisterService - .hentBehandlinger(behandling.fagsak.id) - .any { it.type == BehandlingType.MIGRERING_FRA_INFOTRYGD } - - if (!erMigrertSak) { - return null - } - - val nyttTilstandFraDato = - behandlingService - .hentMigreringsdatoPåFagsak(fagsakId = behandling.fagsak.id) - ?.toYearMonth() - ?.plusMonths(1) - - return if (forrigeTilstandFraDato != null && - nyttTilstandFraDato != null && - forrigeTilstandFraDato.isAfter(nyttTilstandFraDato) - ) { - nyttTilstandFraDato - } else { - null - } - } -} - -fun utledStønadTom( - andelerTilkjentYtelse: Set, - endretUtbetalingAndeler: List, -): YearMonth? { - val andelerMedEndringer = andelerTilkjentYtelse.tilAndelerTilkjentYtelseMedEndreteUtbetalinger(endretUtbetalingAndeler) - - val andelerMedRelevantUtbetaling = - andelerMedEndringer.filterNot { andelTilkjentYtelseMedEndreteUtbetalinger -> - andelTilkjentYtelseMedEndreteUtbetalinger.endreteUtbetalinger.any { endretUtbetaling -> - endretUtbetaling.førerTilOpphør() - } - } - - return andelerMedRelevantUtbetaling.maxOfOrNull { it.stønadTom } -} - -fun oppdaterTilkjentYtelseMedUtbetalingsoppdrag( - tilkjentYtelse: TilkjentYtelse, - utbetalingsoppdrag: no.nav.familie.felles.utbetalingsgenerator.domain.Utbetalingsoppdrag, - endretUtbetalingAndeler: List, -) { - val opphør = Opphør.opprettFor(utbetalingsoppdrag, tilkjentYtelse.behandling) - - tilkjentYtelse.utbetalingsoppdrag = objectMapper.writeValueAsString(utbetalingsoppdrag) - tilkjentYtelse.stønadTom = utledStønadTom(tilkjentYtelse.andelerTilkjentYtelse, endretUtbetalingAndeler) - tilkjentYtelse.stønadFom = - if (opphør.erRentOpphør) null else tilkjentYtelse.andelerTilkjentYtelse.minOfOrNull { it.stønadFom } - tilkjentYtelse.endretDato = LocalDate.now() - tilkjentYtelse.opphørFom = opphør.opphørsdato?.toYearMonth() -} - -fun oppdaterAndelerMedPeriodeOffset( - tilkjentYtelse: TilkjentYtelse, - andelerMedPeriodeId: List, -) { - val andelerPåId = andelerMedPeriodeId.associateBy { it.id } - val andelerTilkjentYtelse = tilkjentYtelse.andelerTilkjentYtelse - val andelerSomSkalSendesTilOppdrag = andelerTilkjentYtelse.filter { it.erAndelSomSkalSendesTilOppdrag() } - if (andelerMedPeriodeId.size != andelerSomSkalSendesTilOppdrag.size) { - error("Antallet andeler med oppdatert periodeOffset, forrigePeriodeOffset og kildeBehandlingId fra ny generator skal være likt antallet andeler med kalkulertUtbetalingsbeløp != 0. Generator gir ${andelerMedPeriodeId.size} andeler men det er ${andelerSomSkalSendesTilOppdrag.size} andeler med kalkulertUtbetalingsbeløp != 0") - } - andelerSomSkalSendesTilOppdrag.forEach { andel -> - val andelMedOffset = - andelerPåId[andel.id] - ?: error("Feil ved oppdaterig av offset på andeler. Finner ikke andel med id ${andel.id} blandt andelene med oppdatert offset fra ny generator. Ny generator returnerer andeler med ider [${andelerPåId.values.map { it.id }}]") - andel.periodeOffset = andelMedOffset.periodeId - andel.forrigePeriodeOffset = andelMedOffset.forrigePeriodeId - andel.kildeBehandlingId = andelMedOffset.kildeBehandlingId - } -} diff --git "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/YtelsetypeBA.kt" "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/YtelsetypeBA.kt" index ab34d8af7ff..7f95fc45cd1 100644 --- "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/YtelsetypeBA.kt" +++ "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/YtelsetypeBA.kt" @@ -8,6 +8,7 @@ enum class YtelsetypeBA( override val satsType: Utbetalingsperiode.SatsType = Utbetalingsperiode.SatsType.MND, ) : Ytelsestype { ORDINÆR_BARNETRYGD("BATR"), - UTVIDET_BARNETRYGD("BATR"), + UTVIDET_BARNETRYGD("BAUTV-OP"), + UTVIDET_BARNETRYGD_GAMMEL("BATR"), SMÅBARNSTILLEGG("BATRSMA"), } diff --git "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/\303\230konomiService.kt" "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/\303\230konomiService.kt" index 16774b9a655..048887799e5 100644 --- "a/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/\303\230konomiService.kt" +++ "b/src/main/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/\303\230konomiService.kt" @@ -1,7 +1,8 @@ package no.nav.familie.ba.sak.integrasjoner.økonomi import io.micrometer.core.instrument.Metrics -import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGeneratorService +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.OppdaterTilkjentYtelseService +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGenerator import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.tilRestUtbetalingsoppdrag import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService import no.nav.familie.ba.sak.kjerne.beregning.TilkjentYtelseValideringService @@ -23,8 +24,9 @@ class ØkonomiService( private val økonomiKlient: ØkonomiKlient, private val tilkjentYtelseValideringService: TilkjentYtelseValideringService, private val tilkjentYtelseRepository: TilkjentYtelseRepository, - private val utbetalingsoppdragGeneratorService: UtbetalingsoppdragGeneratorService, private val behandlingHentOgPersisterService: BehandlingHentOgPersisterService, + private val utbetalingsoppdragGenerator: UtbetalingsoppdragGenerator, + private val oppdaterTilkjentYtelseService: OppdaterTilkjentYtelseService, ) { private val sammeOppdragSendtKonflikt = Metrics.counter("familie.ba.sak.samme.oppdrag.sendt.konflikt") @@ -32,19 +34,31 @@ class ØkonomiService( vedtak: Vedtak, saksbehandlerId: String, ): Utbetalingsoppdrag { - val oppdatertBehandling = vedtak.behandling + val behandling = vedtak.behandling + + val tilkjentYtelse = tilkjentYtelseRepository.findByBehandling(behandlingId = behandling.id) + + val beregnetUtbetalingsoppdrag = + utbetalingsoppdragGenerator.lagUtbetalingsoppdrag( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + tilkjentYtelse = tilkjentYtelse, + ) + + oppdaterTilkjentYtelseService.oppdaterTilkjentYtelseMedUtbetalingsoppdrag( + tilkjentYtelse = tilkjentYtelse, + beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdrag, + ) val utbetalingsoppdrag = - utbetalingsoppdragGeneratorService - .genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( - vedtak, - saksbehandlerId, - ).utbetalingsoppdrag + beregnetUtbetalingsoppdrag + .utbetalingsoppdrag .tilRestUtbetalingsoppdrag() - tilkjentYtelseValideringService.validerIngenAndelerTilkjentYtelseMedSammeOffsetIBehandling(behandlingId = vedtak.behandling.id) + tilkjentYtelseValideringService.validerIngenAndelerTilkjentYtelseMedSammeOffsetIBehandling(behandlingId = behandling.id) + + iverksettOppdrag(utbetalingsoppdrag, behandling.id) - iverksettOppdrag(utbetalingsoppdrag, oppdatertBehandling.id) return utbetalingsoppdrag } diff --git a/src/main/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/AndelTilkjentYtelse.kt b/src/main/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/AndelTilkjentYtelse.kt index e0753f142e3..8ac6c8f382b 100644 --- a/src/main/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/AndelTilkjentYtelse.kt +++ b/src/main/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/AndelTilkjentYtelse.kt @@ -179,10 +179,16 @@ enum class YtelseType( SMÅBARNSTILLEGG("BATRSMA"), ; - fun tilYtelseType(): YtelsetypeBA = + fun tilYtelseType(skalBrukeNyKlassekodeForUtvidetBarnetrygd: Boolean): YtelsetypeBA = when (this) { ORDINÆR_BARNETRYGD -> YtelsetypeBA.ORDINÆR_BARNETRYGD - UTVIDET_BARNETRYGD -> YtelsetypeBA.UTVIDET_BARNETRYGD + UTVIDET_BARNETRYGD -> + if (skalBrukeNyKlassekodeForUtvidetBarnetrygd) { + YtelsetypeBA.UTVIDET_BARNETRYGD + } else { + YtelsetypeBA.UTVIDET_BARNETRYGD_GAMMEL + } + SMÅBARNSTILLEGG -> YtelsetypeBA.SMÅBARNSTILLEGG } diff --git a/src/main/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/TilkjentYtelseRepository.kt b/src/main/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/TilkjentYtelseRepository.kt index 4c9b0a9ff3f..729809d76ea 100644 --- a/src/main/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/TilkjentYtelseRepository.kt +++ b/src/main/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/TilkjentYtelseRepository.kt @@ -18,4 +18,15 @@ interface TilkjentYtelseRepository : JpaRepository { @Query("SELECT ty FROM TilkjentYtelse ty JOIN ty.behandling b WHERE b.id = :behandlingId AND ty.utbetalingsoppdrag is not null") fun findByBehandlingAndHasUtbetalingsoppdrag(behandlingId: Long): TilkjentYtelse? + + @Query( + """ + SELECT EXISTS( + SELECT 1 FROM Behandling b + JOIN TilkjentYtelse ty ON ty.behandling.id = b.id + WHERE ty.utbetalingsoppdrag IS NOT NULL AND ty.utbetalingsoppdrag like '%"klassifisering":"BAUTV-OP"%' and b.fagsak.id = :fagsakId + ) + """, + ) + fun harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd(fagsakId: Long): Boolean } diff --git a/src/main/kotlin/no/nav/familie/ba/sak/kjerne/simulering/SimuleringService.kt b/src/main/kotlin/no/nav/familie/ba/sak/kjerne/simulering/SimuleringService.kt index 8bda8d9735c..3009cd0202e 100644 --- a/src/main/kotlin/no/nav/familie/ba/sak/kjerne/simulering/SimuleringService.kt +++ b/src/main/kotlin/no/nav/familie/ba/sak/kjerne/simulering/SimuleringService.kt @@ -5,13 +5,14 @@ import jakarta.transaction.Transactional import no.nav.familie.ba.sak.common.Feil import no.nav.familie.ba.sak.common.isSameOrBefore import no.nav.familie.ba.sak.config.BehandlerRolle -import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGeneratorService +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGenerator import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.tilRestUtbetalingsoppdrag import no.nav.familie.ba.sak.integrasjoner.økonomi.ØkonomiKlient import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingStatus import no.nav.familie.ba.sak.kjerne.beregning.BeregningService +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.PersongrunnlagService import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.barn import no.nav.familie.ba.sak.kjerne.simulering.domene.RestSimulering @@ -37,9 +38,10 @@ class SimuleringService( private val økonomiSimuleringMottakerRepository: ØkonomiSimuleringMottakerRepository, private val tilgangService: TilgangService, private val vedtakRepository: VedtakRepository, - private val utbetalingsoppdragGeneratorService: UtbetalingsoppdragGeneratorService, + private val utbetalingsoppdragGenerator: UtbetalingsoppdragGenerator, private val behandlingHentOgPersisterService: BehandlingHentOgPersisterService, private val persongrunnlagService: PersongrunnlagService, + private val tilkjentYtelseRepository: TilkjentYtelseRepository, ) { private val simulert = Metrics.counter("familie.ba.sak.oppdrag.simulert") @@ -48,16 +50,21 @@ class SimuleringService( return null } + val tilkjentYtelse = tilkjentYtelseRepository.findByBehandling(behandlingId = vedtak.behandling.id) + /** * SOAP integrasjonen støtter ikke full epost som MQ, * så vi bruker bare første 8 tegn av saksbehandlers epost for simulering. * Denne verdien brukes ikke til noe i simulering. */ + val saksbehandlerId = SikkerhetContext.hentSaksbehandler().take(8) + val utbetalingsoppdrag: Utbetalingsoppdrag = - utbetalingsoppdragGeneratorService - .genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( + utbetalingsoppdragGenerator + .lagUtbetalingsoppdrag( + saksbehandlerId = saksbehandlerId, vedtak = vedtak, - saksbehandlerId = SikkerhetContext.hentSaksbehandler().take(8), + tilkjentYtelse = tilkjentYtelse, erSimulering = true, ).utbetalingsoppdrag .tilRestUtbetalingsoppdrag() diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/common/TestClockProvider.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/common/TestClockProvider.kt index 6098b2ff26e..64ec633ef2e 100644 --- a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/common/TestClockProvider.kt +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/common/TestClockProvider.kt @@ -4,10 +4,9 @@ import no.nav.familie.ba.sak.common.ClockProvider import no.nav.familie.ba.sak.common.toLocalDate import java.time.Clock import java.time.LocalDate -import java.time.LocalDateTime import java.time.YearMonth import java.time.ZoneId -import java.time.ZoneOffset +import java.time.ZonedDateTime class TestClockProvider( private val clock: Clock = Clock.systemDefaultZone(), @@ -15,11 +14,13 @@ class TestClockProvider( override fun get(): Clock = clock companion object { - fun lagClockProviderMedFastTidspunkt(localDateTime: LocalDateTime): TestClockProvider = - TestClockProvider(Clock.fixed(localDateTime.toInstant(ZoneOffset.UTC), ZoneId.systemDefault())) + private val zoneId = ZoneId.of("Europe/Oslo") + + fun lagClockProviderMedFastTidspunkt(localDateTime: ZonedDateTime): TestClockProvider = + TestClockProvider(Clock.fixed(localDateTime.toInstant(), zoneId)) fun lagClockProviderMedFastTidspunkt(localDate: LocalDate): TestClockProvider = - lagClockProviderMedFastTidspunkt(localDate.atStartOfDay()) + lagClockProviderMedFastTidspunkt(localDate.atStartOfDay(zoneId)) fun lagClockProviderMedFastTidspunkt(yearMonth: YearMonth): TestClockProvider = lagClockProviderMedFastTidspunkt(yearMonth.toLocalDate()) diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/HentStatusTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/HentStatusTest.kt" index 099c4a4837c..4a7d411ed3e 100644 --- "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/HentStatusTest.kt" +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/HentStatusTest.kt" @@ -9,7 +9,8 @@ import no.nav.familie.ba.sak.common.lagInitiellTilkjentYtelse import no.nav.familie.ba.sak.common.tilfeldigPerson import no.nav.familie.ba.sak.common.årMnd import no.nav.familie.ba.sak.config.TaskRepositoryWrapper -import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGeneratorService +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.OppdaterTilkjentYtelseService +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGenerator import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling import no.nav.familie.ba.sak.kjerne.beregning.BeregningService import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository @@ -41,7 +42,9 @@ class HentStatusTest { private val tilkjentYtelseRepository = mockk() - private val utbetalingsoppdragGeneratorService: UtbetalingsoppdragGeneratorService = mockk() + private val oppdaterTilkjentYtelseService = mockk() + + private val utbetalingsoppdragGenerator: UtbetalingsoppdragGenerator = mockk() private val unleashService: UnleashService = mockk() @@ -52,8 +55,9 @@ class HentStatusTest { økonomiKlient = økonomiKlient, tilkjentYtelseValideringService = mockk(), tilkjentYtelseRepository = tilkjentYtelseRepository, - utbetalingsoppdragGeneratorService = utbetalingsoppdragGeneratorService, + utbetalingsoppdragGenerator = utbetalingsoppdragGenerator, behandlingHentOgPersisterService = mockk(), + oppdaterTilkjentYtelseService = oppdaterTilkjentYtelseService, ) statusFraOppdrag = StatusFraOppdrag( diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/BehandlingsinformasjonUtlederTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/BehandlingsinformasjonUtlederTest.kt" new file mode 100644 index 00000000000..3a27708d7b5 --- /dev/null +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/BehandlingsinformasjonUtlederTest.kt" @@ -0,0 +1,777 @@ +package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag + +import io.mockk.every +import io.mockk.mockk +import no.nav.familie.ba.sak.TestClockProvider +import no.nav.familie.ba.sak.common.lagAndelTilkjentYtelse +import no.nav.familie.ba.sak.common.lagBehandling +import no.nav.familie.ba.sak.common.lagFagsak +import no.nav.familie.ba.sak.common.lagInstitusjon +import no.nav.familie.ba.sak.common.lagTilkjentYtelse +import no.nav.familie.ba.sak.common.lagVedtak +import no.nav.familie.ba.sak.kjerne.fagsak.FagsakType +import no.nav.familie.felles.utbetalingsgenerator.domain.IdentOgType +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows +import java.time.Clock +import java.time.Instant +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.YearMonth +import java.time.ZoneId + +class BehandlingsinformasjonUtlederTest { + private val clock: Clock = + Clock.fixed( + Instant.parse("2024-11-01T10:00:00Z"), + ZoneId.of("Europe/Oslo"), + ) + private val endretMigreringsdatoUtleder: EndretMigreringsdatoUtleder = mockk() + private val behandlingsinformasjonUtleder: BehandlingsinformasjonUtleder = + BehandlingsinformasjonUtleder( + endretMigreringsdatoUtleder, + TestClockProvider(clock), + ) + + @Test + fun `skal utlede mininal behandlingsinformasjon`() { + // Arrange + val saksbehandlerId = "123" + + val fagsak = + lagFagsak( + type = FagsakType.NORMAL, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = null + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns null + + // Act + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = mapOf(), + false, + ) + + // Assert + assertThat(behandlingsinformasjon.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(behandlingsinformasjon.behandlingId).isEqualTo(vedtak.behandling.id.toString()) + assertThat(behandlingsinformasjon.eksternBehandlingId).isEqualTo(vedtak.behandling.id) + assertThat(behandlingsinformasjon.eksternFagsakId).isEqualTo(vedtak.behandling.fagsak.id) + assertThat(behandlingsinformasjon.fagsystem).isEqualTo(FagsystemBA.BARNETRYGD) + assertThat(behandlingsinformasjon.personIdent).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.vedtaksdato).isEqualTo(LocalDate.of(2024, 11, 1)) + assertThat(behandlingsinformasjon.opphørAlleKjederFra).isNull() + assertThat(behandlingsinformasjon.utbetalesTil).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.opphørKjederFraFørsteUtbetaling).isFalse() + } + + @Test + fun `skal utlede behandlingsinformasjon hvor vedtaksdato er satt til vedtaksdatoen fra vedtaket`() { + // Arrange + val saksbehandlerId = "123" + + val fagsak = + lagFagsak( + type = FagsakType.NORMAL, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = LocalDateTime.now(clock), + ) + + val forrigeTilkjentYtelse = null + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns null + + // Act + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = mapOf(), + false, + ) + + // Assert + assertThat(behandlingsinformasjon.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(behandlingsinformasjon.behandlingId).isEqualTo(vedtak.behandling.id.toString()) + assertThat(behandlingsinformasjon.eksternBehandlingId).isEqualTo(vedtak.behandling.id) + assertThat(behandlingsinformasjon.eksternFagsakId).isEqualTo(vedtak.behandling.fagsak.id) + assertThat(behandlingsinformasjon.fagsystem).isEqualTo(FagsystemBA.BARNETRYGD) + assertThat(behandlingsinformasjon.personIdent).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.vedtaksdato).isEqualTo(vedtak.vedtaksdato!!.toLocalDate()) + assertThat(behandlingsinformasjon.opphørAlleKjederFra).isNull() + assertThat(behandlingsinformasjon.utbetalesTil).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.opphørKjederFraFørsteUtbetaling).isFalse() + } + + @Test + fun `skal utlede behandlingsinformasjon hvor opphørAlleKjederFra er null da forrige tilkjent ytelse ikke er null`() { + // Arrange + val saksbehandlerId = "123" + + val fagsak = + lagFagsak( + type = FagsakType.NORMAL, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + ) + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns null + + // Act + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = mapOf(), + false, + ) + + // Assert + assertThat(behandlingsinformasjon.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(behandlingsinformasjon.behandlingId).isEqualTo(vedtak.behandling.id.toString()) + assertThat(behandlingsinformasjon.eksternBehandlingId).isEqualTo(vedtak.behandling.id) + assertThat(behandlingsinformasjon.eksternFagsakId).isEqualTo(vedtak.behandling.fagsak.id) + assertThat(behandlingsinformasjon.fagsystem).isEqualTo(FagsystemBA.BARNETRYGD) + assertThat(behandlingsinformasjon.personIdent).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.vedtaksdato).isEqualTo(LocalDate.now(clock)) + assertThat(behandlingsinformasjon.opphørAlleKjederFra).isNull() + assertThat(behandlingsinformasjon.utbetalesTil).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.opphørKjederFraFørsteUtbetaling).isFalse() + } + + @Test + fun `skal utlede behandlingsinformasjon hvor opphørAlleKjederFra er null da forrige tilkjent ytelse ikke er null og siste andel per kjede ikke er tom`() { + // Arrange + val saksbehandlerId = "123" + + val fagsak = + lagFagsak( + type = FagsakType.NORMAL, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + ) + + val lagAndelTilkjentYtelse = + lagAndelTilkjentYtelse( + behandling = behandling, + fom = YearMonth.now(clock), + tom = YearMonth.now(clock), + ) + + val sisteAndelPerKjede = + mapOf( + IdentOgType("1", YtelsetypeBA.ORDINÆR_BARNETRYGD) to lagAndelTilkjentYtelse, + ) + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns null + + // Act + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = sisteAndelPerKjede, + false, + ) + + // Assert + assertThat(behandlingsinformasjon.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(behandlingsinformasjon.behandlingId).isEqualTo(vedtak.behandling.id.toString()) + assertThat(behandlingsinformasjon.eksternBehandlingId).isEqualTo(vedtak.behandling.id) + assertThat(behandlingsinformasjon.eksternFagsakId).isEqualTo(vedtak.behandling.fagsak.id) + assertThat(behandlingsinformasjon.fagsystem).isEqualTo(FagsystemBA.BARNETRYGD) + assertThat(behandlingsinformasjon.personIdent).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.vedtaksdato).isEqualTo(LocalDate.now(clock)) + assertThat(behandlingsinformasjon.opphørAlleKjederFra).isNull() + assertThat(behandlingsinformasjon.utbetalesTil).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.opphørKjederFraFørsteUtbetaling).isFalse() + } + + @Test + fun `skal utlede behandlingsinformasjon hvor opphørAlleKjederFra er satt til endret migreringsdato`() { + // Arrange + val saksbehandlerId = "123" + + val fagsak = + lagFagsak( + type = FagsakType.NORMAL, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + ) + + val lagAndelTilkjentYtelse = + lagAndelTilkjentYtelse( + behandling = behandling, + fom = YearMonth.now(clock), + tom = YearMonth.now(clock), + ) + + val sisteAndelPerKjede = + mapOf( + IdentOgType("1", YtelsetypeBA.ORDINÆR_BARNETRYGD) to lagAndelTilkjentYtelse, + ) + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns YearMonth.now(clock) + + // Act + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = sisteAndelPerKjede, + false, + ) + + // Assert + assertThat(behandlingsinformasjon.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(behandlingsinformasjon.behandlingId).isEqualTo(vedtak.behandling.id.toString()) + assertThat(behandlingsinformasjon.eksternBehandlingId).isEqualTo(vedtak.behandling.id) + assertThat(behandlingsinformasjon.eksternFagsakId).isEqualTo(vedtak.behandling.fagsak.id) + assertThat(behandlingsinformasjon.fagsystem).isEqualTo(FagsystemBA.BARNETRYGD) + assertThat(behandlingsinformasjon.personIdent).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.vedtaksdato).isEqualTo(LocalDate.now(clock)) + assertThat(behandlingsinformasjon.opphørAlleKjederFra).isEqualTo(YearMonth.now(clock)) + assertThat(behandlingsinformasjon.utbetalesTil).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.opphørKjederFraFørsteUtbetaling).isFalse() + } + + @Test + fun `skal utlede behandlingsinformasjon hvor utbetalesTil settes til fagsak aktør for NORMAL fagsaktype`() { + // Arrange + val saksbehandlerId = "123" + + val fagsak = + lagFagsak( + type = FagsakType.NORMAL, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = null + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns null + + // Act + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = mapOf(), + false, + ) + + // Assert + assertThat(behandlingsinformasjon.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(behandlingsinformasjon.behandlingId).isEqualTo(vedtak.behandling.id.toString()) + assertThat(behandlingsinformasjon.eksternBehandlingId).isEqualTo(vedtak.behandling.id) + assertThat(behandlingsinformasjon.eksternFagsakId).isEqualTo(vedtak.behandling.fagsak.id) + assertThat(behandlingsinformasjon.fagsystem).isEqualTo(FagsystemBA.BARNETRYGD) + assertThat(behandlingsinformasjon.personIdent).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.vedtaksdato).isEqualTo(LocalDate.of(2024, 11, 1)) + assertThat(behandlingsinformasjon.opphørAlleKjederFra).isNull() + assertThat(behandlingsinformasjon.utbetalesTil).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.opphørKjederFraFørsteUtbetaling).isFalse() + } + + @Test + fun `skal utlede behandlingsinformasjon hvor utbetalesTil settes til fagsak aktør for BARN_ENSLIG_MINDREÅRIG fagsaktype`() { + // Arrange + val saksbehandlerId = "123" + + val fagsak = + lagFagsak( + type = FagsakType.BARN_ENSLIG_MINDREÅRIG, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = null + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns null + + // Act + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = mapOf(), + false, + ) + + // Assert + assertThat(behandlingsinformasjon.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(behandlingsinformasjon.behandlingId).isEqualTo(vedtak.behandling.id.toString()) + assertThat(behandlingsinformasjon.eksternBehandlingId).isEqualTo(vedtak.behandling.id) + assertThat(behandlingsinformasjon.eksternFagsakId).isEqualTo(vedtak.behandling.fagsak.id) + assertThat(behandlingsinformasjon.fagsystem).isEqualTo(FagsystemBA.BARNETRYGD) + assertThat(behandlingsinformasjon.personIdent).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.vedtaksdato).isEqualTo(LocalDate.of(2024, 11, 1)) + assertThat(behandlingsinformasjon.opphørAlleKjederFra).isNull() + assertThat(behandlingsinformasjon.utbetalesTil).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.opphørKjederFraFørsteUtbetaling).isFalse() + } + + @Test + fun `skal utlede behandlingsinformasjon hvor utbetalesTil settes til institusjon for INSTITUSJON fagsaktype`() { + // Arrange + val saksbehandlerId = "123" + + val institusjon = + lagInstitusjon( + tssEksternId = "eksternId", + ) + + val fagsak = + lagFagsak( + type = FagsakType.INSTITUSJON, + institusjon = institusjon, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = null + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns null + + // Act + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = mapOf(), + false, + ) + + // Assert + assertThat(behandlingsinformasjon.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(behandlingsinformasjon.behandlingId).isEqualTo(vedtak.behandling.id.toString()) + assertThat(behandlingsinformasjon.eksternBehandlingId).isEqualTo(vedtak.behandling.id) + assertThat(behandlingsinformasjon.eksternFagsakId).isEqualTo(vedtak.behandling.fagsak.id) + assertThat(behandlingsinformasjon.fagsystem).isEqualTo(FagsystemBA.BARNETRYGD) + assertThat(behandlingsinformasjon.personIdent).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.vedtaksdato).isEqualTo(LocalDate.of(2024, 11, 1)) + assertThat(behandlingsinformasjon.opphørAlleKjederFra).isNull() + assertThat(behandlingsinformasjon.utbetalesTil).isEqualTo(institusjon.tssEksternId!!) + assertThat(behandlingsinformasjon.opphørKjederFraFørsteUtbetaling).isFalse() + } + + @Test + fun `skal kaste exception om institusjon er null for INSTITUSJON fagsaktype`() { + // Arrange + val saksbehandlerId = "123" + + val fagsak = + lagFagsak( + type = FagsakType.INSTITUSJON, + institusjon = null, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = null + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns null + + // Act & assert + val exception = + assertThrows { + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = mapOf(), + false, + ) + } + assertThat(exception.message).isEqualTo("Fagsak ${fagsak.id} er av type institusjon og mangler informasjon om institusjonen") + } + + @Test + fun `skal kaste exception om tssEksternId på institusjon er null for INSTITUSJON fagsaktype`() { + // Arrange + val saksbehandlerId = "123" + + val institusjon = + lagInstitusjon( + tssEksternId = null, + ) + + val fagsak = + lagFagsak( + type = FagsakType.INSTITUSJON, + institusjon = institusjon, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = null + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns null + + // Act & assert + val exception = + assertThrows { + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = mapOf(), + false, + ) + } + assertThat(exception.message).isEqualTo("Fagsak ${fagsak.id} er av type institusjon og mangler informasjon om institusjonen") + } + + @Test + fun `skal utlede behandlingsinformasjon hvor opphørKjederFraFørsteUtbetaling er satt til false da en endret migrereingsdato ikke er null`() { + // Arrange + val saksbehandlerId = "123" + + val fagsak = + lagFagsak( + type = FagsakType.NORMAL, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = null + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns YearMonth.now(clock) + + // Act + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = mapOf(), + false, + ) + + // Assert + assertThat(behandlingsinformasjon.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(behandlingsinformasjon.behandlingId).isEqualTo(vedtak.behandling.id.toString()) + assertThat(behandlingsinformasjon.eksternBehandlingId).isEqualTo(vedtak.behandling.id) + assertThat(behandlingsinformasjon.eksternFagsakId).isEqualTo(vedtak.behandling.fagsak.id) + assertThat(behandlingsinformasjon.fagsystem).isEqualTo(FagsystemBA.BARNETRYGD) + assertThat(behandlingsinformasjon.personIdent).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.vedtaksdato).isEqualTo(LocalDate.of(2024, 11, 1)) + assertThat(behandlingsinformasjon.opphørAlleKjederFra).isNull() + assertThat(behandlingsinformasjon.utbetalesTil).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.opphørKjederFraFørsteUtbetaling).isFalse() + } + + @Test + fun `skal utlede behandlingsinformasjon hvor opphørKjederFraFørsteUtbetaling er satt til false da en endret migrereingsdato er null og det ikke er for simulering`() { + // Arrange + val saksbehandlerId = "123" + + val fagsak = + lagFagsak( + type = FagsakType.NORMAL, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = null + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns null + + // Act + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = mapOf(), + false, + ) + + // Assert + assertThat(behandlingsinformasjon.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(behandlingsinformasjon.behandlingId).isEqualTo(vedtak.behandling.id.toString()) + assertThat(behandlingsinformasjon.eksternBehandlingId).isEqualTo(vedtak.behandling.id) + assertThat(behandlingsinformasjon.eksternFagsakId).isEqualTo(vedtak.behandling.fagsak.id) + assertThat(behandlingsinformasjon.fagsystem).isEqualTo(FagsystemBA.BARNETRYGD) + assertThat(behandlingsinformasjon.personIdent).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.vedtaksdato).isEqualTo(LocalDate.of(2024, 11, 1)) + assertThat(behandlingsinformasjon.opphørAlleKjederFra).isNull() + assertThat(behandlingsinformasjon.utbetalesTil).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.opphørKjederFraFørsteUtbetaling).isFalse() + } + + @Test + fun `skal utlede behandlingsinformasjon hvor opphørKjederFraFørsteUtbetaling er satt til true da en endret migrereingsdato er null og det er for simulering`() { + // Arrange + val saksbehandlerId = "123" + + val fagsak = + lagFagsak( + type = FagsakType.NORMAL, + ) + + val behandling = + lagBehandling( + fagsak = fagsak, + ) + + val vedtak = + lagVedtak( + behandling = behandling, + vedtaksdato = null, + ) + + val forrigeTilkjentYtelse = null + + every { + endretMigreringsdatoUtleder.utled(vedtak.behandling.fagsak, forrigeTilkjentYtelse) + } returns null + + // Act + val behandlingsinformasjon = + behandlingsinformasjonUtleder.utled( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + forrigeTilkjentYtelse = forrigeTilkjentYtelse, + sisteAndelPerKjede = mapOf(), + true, + ) + + // Assert + assertThat(behandlingsinformasjon.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(behandlingsinformasjon.behandlingId).isEqualTo(vedtak.behandling.id.toString()) + assertThat(behandlingsinformasjon.eksternBehandlingId).isEqualTo(vedtak.behandling.id) + assertThat(behandlingsinformasjon.eksternFagsakId).isEqualTo(vedtak.behandling.fagsak.id) + assertThat(behandlingsinformasjon.fagsystem).isEqualTo(FagsystemBA.BARNETRYGD) + assertThat(behandlingsinformasjon.personIdent).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.vedtaksdato).isEqualTo(LocalDate.of(2024, 11, 1)) + assertThat(behandlingsinformasjon.opphørAlleKjederFra).isNull() + assertThat(behandlingsinformasjon.utbetalesTil).isEqualTo( + vedtak.behandling.fagsak.aktør + .aktivFødselsnummer(), + ) + assertThat(behandlingsinformasjon.opphørKjederFraFørsteUtbetaling).isTrue() + } +} diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/EndretMigreringsdatoUtlederTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/EndretMigreringsdatoUtlederTest.kt" new file mode 100644 index 00000000000..0848e8822b6 --- /dev/null +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/EndretMigreringsdatoUtlederTest.kt" @@ -0,0 +1,351 @@ +package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag + +import io.mockk.every +import io.mockk.mockk +import no.nav.familie.ba.sak.common.lagAndelTilkjentYtelse +import no.nav.familie.ba.sak.common.lagBehandling +import no.nav.familie.ba.sak.common.lagTilkjentYtelse +import no.nav.familie.ba.sak.common.randomAktør +import no.nav.familie.ba.sak.common.toYearMonth +import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService +import no.nav.familie.ba.sak.kjerne.behandling.BehandlingService +import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingType +import no.nav.familie.ba.sak.kjerne.fagsak.Fagsak +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows +import java.time.LocalDate +import java.time.YearMonth + +class EndretMigreringsdatoUtlederTest { + private val behandlingHentOgPersisterService: BehandlingHentOgPersisterService = mockk() + private val behandlingService: BehandlingService = mockk() + private val endretMigreringsdatoUtleder: EndretMigreringsdatoUtleder = + EndretMigreringsdatoUtleder( + behandlingHentOgPersisterService, + behandlingService, + ) + + @Test + fun `skal returnere null hvis forrige tilkjente ytelse er null`() { + // Arrange + val fagsak = Fagsak(0L, randomAktør()) + + // Act + val endretMigreringsdato = + endretMigreringsdatoUtleder.utled( + fagsak = fagsak, + forrigeTilkjentYtelse = null, + ) + + // Assert + assertThat(endretMigreringsdato).isNull() + } + + @Test + fun `skal returnere null om tilkjent ytelser andeler er tom`() { + // Arrange + val fagsak = Fagsak(0L, randomAktør()) + + val behandling = + lagBehandling( + fagsak = fagsak, + behandlingType = BehandlingType.MIGRERING_FRA_INFOTRYGD, + ) + + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + lagAndelerTilkjentYtelse = { + emptySet() + }, + ) + + // Act + val endretMigreringsdato = + endretMigreringsdatoUtleder.utled( + fagsak = fagsak, + forrigeTilkjentYtelse = tilkjentYtelse, + ) + + // Assert + assertThat(endretMigreringsdato).isNull() + } + + @Test + fun `skal returnere null om det ikke er en migrert sak`() { + // Arrange + val dagensDato = LocalDate.of(2024, 11, 1) + + val fagsak = Fagsak(0L, randomAktør()) + + val behandling = + lagBehandling( + fagsak = fagsak, + behandlingType = BehandlingType.FØRSTEGANGSBEHANDLING, + ) + + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + fom = dagensDato.plusMonths(1).toYearMonth(), + tom = dagensDato.plusMonths(2).toYearMonth(), + ), + ) + }, + ) + + every { + behandlingHentOgPersisterService.hentBehandlinger(fagsak.id) + } returns listOf(behandling) + + // Act + val endretMigreringsdato = + endretMigreringsdatoUtleder.utled( + fagsak = fagsak, + forrigeTilkjentYtelse = tilkjentYtelse, + ) + + // Assert + assertThat(endretMigreringsdato).isNull() + } + + @Test + fun `skal returnere null om det ikke finnes en migreringsdato på fagsaken`() { + // Arrange + val dagensDato = LocalDate.of(2024, 11, 1) + + val fagsak = Fagsak(0L, randomAktør()) + + val behandling = + lagBehandling( + fagsak = fagsak, + behandlingType = BehandlingType.MIGRERING_FRA_INFOTRYGD, + ) + + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + fom = dagensDato.plusMonths(1).toYearMonth(), + tom = dagensDato.plusMonths(2).toYearMonth(), + ), + ) + }, + ) + + every { + behandlingHentOgPersisterService.hentBehandlinger(fagsak.id) + } returns listOf(behandling) + + every { + behandlingService.hentMigreringsdatoPåFagsak(fagsak.id) + } returns null + + // Act + val endretMigreringsdato = + endretMigreringsdatoUtleder.utled( + fagsak = fagsak, + forrigeTilkjentYtelse = tilkjentYtelse, + ) + + // Assert + assertThat(endretMigreringsdato).isNull() + } + + @Test + fun `skal skal kaste exception om man prøver å sette ny migreringsdato etter forrige migreringsdato`() { + // Arrange + val dagensDato = LocalDate.of(2024, 11, 1) + + val fagsak = Fagsak(0L, randomAktør()) + + val behandling = + lagBehandling( + fagsak = fagsak, + behandlingType = BehandlingType.MIGRERING_FRA_INFOTRYGD, + ) + + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + fom = dagensDato.toYearMonth(), + tom = dagensDato.plusMonths(1).toYearMonth(), + ), + ) + }, + ) + + every { + behandlingHentOgPersisterService.hentBehandlinger(fagsak.id) + } returns listOf(behandling) + + every { + behandlingService.hentMigreringsdatoPåFagsak(fagsak.id) + } returns dagensDato + + // Act & assert + val exception = + assertThrows { + endretMigreringsdatoUtleder.utled( + fagsak = fagsak, + forrigeTilkjentYtelse = tilkjentYtelse, + ) + } + assertThat(exception.message).isEqualTo("Ny migreringsdato kan ikke være etter forrige migreringsdato") + } + + @Test + fun `skal returnere ny migreringsdato om ny migreringsdato er før forrige migreringsdato`() { + // Arrange + val dagensDato = LocalDate.of(2024, 11, 1) + + val fagsak = Fagsak(0L, randomAktør()) + + val behandling = + lagBehandling( + fagsak = fagsak, + behandlingType = BehandlingType.MIGRERING_FRA_INFOTRYGD, + ) + + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + fom = dagensDato.plusMonths(2).toYearMonth(), + tom = dagensDato.plusMonths(3).toYearMonth(), + ), + ) + }, + ) + + every { + behandlingHentOgPersisterService.hentBehandlinger(fagsak.id) + } returns listOf(behandling) + + every { + behandlingService.hentMigreringsdatoPåFagsak(fagsak.id) + } returns dagensDato + + // Act + val endretMigreringsdato = + endretMigreringsdatoUtleder.utled( + fagsak = fagsak, + forrigeTilkjentYtelse = tilkjentYtelse, + ) + + // Assert + assertThat(endretMigreringsdato).isEqualTo(YearMonth.of(2024, 12)) + } + + @Test + fun `skal returnere ny migreringsdato om ny migreringsdato er før forrige migreringsdato med flere andeler`() { + // Arrange + val dagensDato = LocalDate.of(2024, 11, 1) + + val fagsak = Fagsak(0L, randomAktør()) + + val behandling = + lagBehandling( + fagsak = fagsak, + behandlingType = BehandlingType.MIGRERING_FRA_INFOTRYGD, + ) + + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + fom = dagensDato.plusMonths(2).toYearMonth(), + tom = dagensDato.plusMonths(3).toYearMonth(), + ), + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + fom = dagensDato.plusMonths(4).toYearMonth(), + tom = dagensDato.plusMonths(5).toYearMonth(), + ), + ) + }, + ) + + every { + behandlingHentOgPersisterService.hentBehandlinger(fagsak.id) + } returns listOf(behandling) + + every { + behandlingService.hentMigreringsdatoPåFagsak(fagsak.id) + } returns dagensDato + + // Act + val endretMigreringsdato = + endretMigreringsdatoUtleder.utled( + fagsak = fagsak, + forrigeTilkjentYtelse = tilkjentYtelse, + ) + + // Assert + assertThat(endretMigreringsdato).isEqualTo(YearMonth.of(2024, 12)) + } + + @Test + fun `skal returnere null om ny migreringsdato er lik forrige migreringsdato`() { + // Arrange + val dagensDato = LocalDate.of(2024, 11, 1) + + val fagsak = Fagsak(0L, randomAktør()) + + val behandling = + lagBehandling( + fagsak = fagsak, + behandlingType = BehandlingType.MIGRERING_FRA_INFOTRYGD, + ) + + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + fom = dagensDato.plusMonths(1).toYearMonth(), + tom = dagensDato.plusMonths(2).toYearMonth(), + ), + ) + }, + ) + + every { + behandlingHentOgPersisterService.hentBehandlinger(fagsak.id) + } returns listOf(behandling) + + every { + behandlingService.hentMigreringsdatoPåFagsak(fagsak.id) + } returns dagensDato + + // Act + val endretMigreringsdato = + endretMigreringsdatoUtleder.utled( + fagsak = fagsak, + forrigeTilkjentYtelse = tilkjentYtelse, + ) + + // Assert + assertThat(endretMigreringsdato).isNull() + } +} diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/FagsystemBATest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/FagsystemBATest.kt" index 1488fac58ba..b4c6aa06e5a 100644 --- "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/FagsystemBATest.kt" +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/FagsystemBATest.kt" @@ -22,6 +22,7 @@ class FagsystemBATest { assertThat(gyldigeSatstyper).containsOnly( YtelsetypeBA.ORDINÆR_BARNETRYGD, YtelsetypeBA.UTVIDET_BARNETRYGD, + YtelsetypeBA.UTVIDET_BARNETRYGD_GAMMEL, YtelsetypeBA.SMÅBARNSTILLEGG, ) } diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/KlassifiseringKorrigererTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/KlassifiseringKorrigererTest.kt" new file mode 100644 index 00000000000..f69a8d2baca --- /dev/null +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/KlassifiseringKorrigererTest.kt" @@ -0,0 +1,189 @@ +package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag + +import io.mockk.every +import io.mockk.mockk +import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned +import no.nav.familie.ba.sak.common.sisteDagIMåned +import no.nav.familie.ba.sak.config.FeatureToggleConfig +import no.nav.familie.ba.sak.config.featureToggle.UnleashNextMedContextService +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository +import no.nav.familie.ba.sak.kjerne.simulering.lagBehandling +import no.nav.familie.felles.utbetalingsgenerator.domain.Opphør +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import java.time.LocalDate + +class KlassifiseringKorrigererTest { + private val tilkjentYtelseRepository = mockk() + private val unleashNextMedContextService = mockk() + private val klassifiseringKorrigerer = + KlassifiseringKorrigerer( + tilkjentYtelseRepository = tilkjentYtelseRepository, + unleashNextMedContextService = unleashNextMedContextService, + ) + + @Test + fun `skal returnere originalt utbetalingsoppdrag dersom toggle er av for fagsak`() { + // Arrange + val behandling = lagBehandling() + val beregnetUtbetalingsoppdragLongId = + lagBeregnetUtbetalingsoppdragLongId( + utbetalingsperioder = + listOf( + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 0, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.UTVIDET_BARNETRYGD, + fom = LocalDate.now().førsteDagIInneværendeMåned(), + tom = LocalDate.now().sisteDagIMåned(), + ), + ), + andeler = emptyList(), + ) + + every { unleashNextMedContextService.isEnabled(FeatureToggleConfig.SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD, behandling.id) } returns false + + // Act + val justertUtbetalingsoppdrag = + klassifiseringKorrigerer.korrigerKlassifiseringVedBehov( + beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdragLongId, + behandling = behandling, + ) + + // Assert + assertThat(justertUtbetalingsoppdrag).isEqualTo(beregnetUtbetalingsoppdragLongId) + } + + @Test + fun `skal returnere originalt utbetalingsoppdrag dersom fagsak er over på ny klassekode`() { + // Arrange + val behandling = lagBehandling() + val beregnetUtbetalingsoppdragLongId = + lagBeregnetUtbetalingsoppdragLongId( + utbetalingsperioder = + listOf( + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 0, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.UTVIDET_BARNETRYGD, + fom = LocalDate.now().førsteDagIInneværendeMåned(), + tom = LocalDate.now().sisteDagIMåned(), + ), + ), + andeler = emptyList(), + ) + + every { unleashNextMedContextService.isEnabled(FeatureToggleConfig.SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD, behandling.id) } returns true + every { tilkjentYtelseRepository.harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd(behandling.fagsak.id) } returns true + + // Act + val justertUtbetalingsoppdrag = + klassifiseringKorrigerer.korrigerKlassifiseringVedBehov( + beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdragLongId, + behandling = behandling, + ) + + // Assert + assertThat(justertUtbetalingsoppdrag).isEqualTo(beregnetUtbetalingsoppdragLongId) + } + + @Test + fun `skal returnere originalt utbetalingsoppdrag dersom behandling ikke inneholder et opphør av utvidet barnetrygd`() { + // Arrange + val behandling = lagBehandling() + val beregnetUtbetalingsoppdragLongId = + lagBeregnetUtbetalingsoppdragLongId( + utbetalingsperioder = + listOf( + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 0, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.UTVIDET_BARNETRYGD, + fom = LocalDate.now().førsteDagIInneværendeMåned(), + tom = LocalDate.now().sisteDagIMåned(), + ), + ), + andeler = emptyList(), + ) + + every { unleashNextMedContextService.isEnabled(FeatureToggleConfig.SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD, behandling.id) } returns true + every { tilkjentYtelseRepository.harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd(behandling.fagsak.id) } returns false + + // Act + val justertUtbetalingsoppdrag = + klassifiseringKorrigerer.korrigerKlassifiseringVedBehov( + beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdragLongId, + behandling = behandling, + ) + + // Assert + assertThat(justertUtbetalingsoppdrag).isEqualTo(beregnetUtbetalingsoppdragLongId) + } + + @Test + fun `skal erstatte klassekode for periode med opphør av utvidet barnetrygd når toggle er på og fagsak ikke er over på ny klassekode`() { + // Arrange + val behandling = lagBehandling() + val beregnetUtbetalingsoppdragLongId = + lagBeregnetUtbetalingsoppdragLongId( + utbetalingsperioder = + listOf( + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 0, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.UTVIDET_BARNETRYGD, + fom = LocalDate.now().førsteDagIInneværendeMåned(), + tom = LocalDate.now().sisteDagIMåned(), + opphør = Opphør(opphørDatoFom = LocalDate.now()), + ), + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 2, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.ORDINÆR_BARNETRYGD, + fom = LocalDate.now().førsteDagIInneværendeMåned(), + tom = LocalDate.now().sisteDagIMåned(), + opphør = Opphør(opphørDatoFom = LocalDate.now()), + ), + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 1, + forrigePeriodeId = 0, + ytelseTypeBa = YtelsetypeBA.UTVIDET_BARNETRYGD, + fom = LocalDate.now().plusMonths(1).førsteDagIInneværendeMåned(), + tom = LocalDate.now().plusMonths(1).sisteDagIMåned(), + ), + ), + andeler = emptyList(), + ) + + val forventetUtbetalingsoppdrag = + beregnetUtbetalingsoppdragLongId.copy( + utbetalingsoppdrag = + beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.copy( + utbetalingsperiode = + beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.utbetalingsperiode.map { + if (it.opphør != null) it.copy(klassifisering = YtelsetypeBA.UTVIDET_BARNETRYGD_GAMMEL.klassifisering) else it + }, + ), + ) + + every { unleashNextMedContextService.isEnabled(FeatureToggleConfig.SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD, behandling.id) } returns true + every { tilkjentYtelseRepository.harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd(behandling.fagsak.id) } returns false + + // Act + val justertUtbetalingsoppdrag = + klassifiseringKorrigerer.korrigerKlassifiseringVedBehov( + beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdragLongId, + behandling = behandling, + ) + + // Assert + assertThat(justertUtbetalingsoppdrag).isNotEqualTo(beregnetUtbetalingsoppdragLongId) + assertThat(justertUtbetalingsoppdrag).isEqualTo(forventetUtbetalingsoppdrag) + } +} diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/OppdaterTilkjentYtelseServiceTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/OppdaterTilkjentYtelseServiceTest.kt" new file mode 100644 index 00000000000..b28d42d2b4b --- /dev/null +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/OppdaterTilkjentYtelseServiceTest.kt" @@ -0,0 +1,508 @@ +package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag + +import io.mockk.every +import io.mockk.mockk +import no.nav.familie.ba.sak.TestClockProvider +import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned +import no.nav.familie.ba.sak.common.lagAndelTilkjentYtelse +import no.nav.familie.ba.sak.common.lagBehandling +import no.nav.familie.ba.sak.common.lagEndretUtbetalingAndel +import no.nav.familie.ba.sak.common.lagPerson +import no.nav.familie.ba.sak.common.lagTilkjentYtelse +import no.nav.familie.ba.sak.common.sisteDagIInneværendeMåned +import no.nav.familie.ba.sak.common.toYearMonth +import no.nav.familie.ba.sak.kjerne.beregning.SatsService +import no.nav.familie.ba.sak.kjerne.beregning.domene.SatsType +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository +import no.nav.familie.ba.sak.kjerne.beregning.domene.YtelseType +import no.nav.familie.ba.sak.kjerne.endretutbetaling.EndretUtbetalingAndelHentOgPersisterService +import no.nav.familie.felles.utbetalingsgenerator.domain.Opphør +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows +import java.time.Clock +import java.time.LocalDate +import java.time.ZoneId + +class OppdaterTilkjentYtelseServiceTest { + private val endretUtbetalingAndelHentOgPersisterService = mockk() + private val tilkjentYtelseRepository = mockk() + private val zoneId = ZoneId.of("Europe/Oslo") + private val dagensDato = LocalDate.of(2024, 11, 6) + private val clock: Clock = + Clock.fixed( + dagensDato.atStartOfDay(zoneId).toInstant(), + zoneId, + ) + private val oppdaterTilkjentYtelseService = + OppdaterTilkjentYtelseService( + endretUtbetalingAndelHentOgPersisterService = endretUtbetalingAndelHentOgPersisterService, + tilkjentYtelseRepository = tilkjentYtelseRepository, + clockProvider = TestClockProvider(clock), + ) + + @Test + fun `skal oppdatere tilkjent ytelse med beregnet utbetalingsoppdrag`() { + // Arrange + val behandling = lagBehandling() + val fom = dagensDato.plusMonths(1).toYearMonth() + val tom = dagensDato.plusMonths(2).toYearMonth() + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + stønadFom = null, + stønadTom = null, + opphørFom = null, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + ytelseType = YtelseType.ORDINÆR_BARNETRYGD, + beløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + id = 1, + fom = fom, + tom = tom, + ), + ) + }, + ) + val beregnetUtbetalingsoppdragLongId = + lagBeregnetUtbetalingsoppdragLongId( + listOf( + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 0, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.ORDINÆR_BARNETRYGD, + fom = fom.førsteDagIInneværendeMåned(), + tom = tom.sisteDagIInneværendeMåned(), + ), + ), + listOf( + lagAndelMedPeriodeIdLong( + id = 1, + periodeId = 0, + forrigePeriodeId = null, + kildeBehandlingId = behandling.id, + ), + ), + ) + + every { endretUtbetalingAndelHentOgPersisterService.hentForBehandling(behandling.id) } returns emptyList() + every { tilkjentYtelseRepository.save(any()) } returns tilkjentYtelse + + // Act + oppdaterTilkjentYtelseService.oppdaterTilkjentYtelseMedUtbetalingsoppdrag(tilkjentYtelse, beregnetUtbetalingsoppdragLongId) + + // Assert + assertThat(tilkjentYtelse.utbetalingsoppdrag).isNotNull() + assertThat(tilkjentYtelse.stønadFom).isEqualTo(fom) + assertThat(tilkjentYtelse.stønadTom).isEqualTo(tom) + assertThat(tilkjentYtelse.endretDato).isEqualTo(dagensDato) + assertThat(tilkjentYtelse.opphørFom).isNull() + + val andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag = tilkjentYtelse.andelerTilkjentYtelse.filter { it.erAndelSomSkalSendesTilOppdrag() } + assertThat(andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag).hasSize(1) + val oppdatertAndel = andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag.single() + assertThat(oppdatertAndel.periodeOffset).isEqualTo(0) + assertThat(oppdatertAndel.forrigePeriodeOffset).isNull() + assertThat(oppdatertAndel.kildeBehandlingId).isEqualTo(behandling.id) + } + + @Test + fun `skal oppdatere tilkjent ytelse med beregnet utbetalingsoppdrag når det finnes endrede utbetalingsandeler`() { + // Arrange + val behandling = lagBehandling() + val fom = dagensDato.plusMonths(1).toYearMonth() + val tom = dagensDato.plusMonths(2).toYearMonth() + val søker = lagPerson() + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + stønadFom = null, + stønadTom = null, + opphørFom = null, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + ytelseType = YtelseType.ORDINÆR_BARNETRYGD, + beløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + person = søker, + id = 1, + fom = fom, + tom = tom, + ), + ) + }, + ) + val beregnetUtbetalingsoppdragLongId = + lagBeregnetUtbetalingsoppdragLongId( + listOf( + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 0, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.ORDINÆR_BARNETRYGD, + fom = fom.førsteDagIInneværendeMåned(), + tom = tom.sisteDagIInneværendeMåned(), + ), + ), + listOf( + lagAndelMedPeriodeIdLong( + id = 1, + periodeId = 0, + forrigePeriodeId = null, + kildeBehandlingId = behandling.id, + ), + ), + ) + + every { endretUtbetalingAndelHentOgPersisterService.hentForBehandling(behandling.id) } returns + listOf( + lagEndretUtbetalingAndel( + behandlingId = behandling.id, + barn = søker, + fom = fom, + tom = tom, + prosent = 0, + ), + ) + every { tilkjentYtelseRepository.save(any()) } returns tilkjentYtelse + + // Act + oppdaterTilkjentYtelseService.oppdaterTilkjentYtelseMedUtbetalingsoppdrag(tilkjentYtelse, beregnetUtbetalingsoppdragLongId) + + // Assert + assertThat(tilkjentYtelse.utbetalingsoppdrag).isNotNull() + assertThat(tilkjentYtelse.stønadFom).isEqualTo(fom) + assertThat(tilkjentYtelse.stønadTom).isEqualTo(tom) + assertThat(tilkjentYtelse.endretDato).isEqualTo(dagensDato) + assertThat(tilkjentYtelse.opphørFom).isNull() + + val andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag = tilkjentYtelse.andelerTilkjentYtelse.filter { it.erAndelSomSkalSendesTilOppdrag() } + assertThat(andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag).hasSize(1) + val oppdatertAndel = andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag.single() + assertThat(oppdatertAndel.periodeOffset).isEqualTo(0) + assertThat(oppdatertAndel.forrigePeriodeOffset).isNull() + assertThat(oppdatertAndel.kildeBehandlingId).isEqualTo(behandling.id) + } + + @Test + fun `skal oppdatere tilkjent ytelse med beregnet utbetalingsoppdrag ved rent opphør`() { + // Arrange + val behandling = lagBehandling() + val fom = dagensDato.plusMonths(1).toYearMonth() + val tom = dagensDato.plusMonths(2).toYearMonth() + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + stønadFom = null, + stønadTom = null, + opphørFom = null, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + ytelseType = YtelseType.ORDINÆR_BARNETRYGD, + beløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + id = 1, + fom = fom, + tom = tom, + ), + ) + }, + ) + val beregnetUtbetalingsoppdragLongId = + lagBeregnetUtbetalingsoppdragLongId( + listOf( + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 0, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.ORDINÆR_BARNETRYGD, + fom = fom.førsteDagIInneværendeMåned(), + tom = tom.plusMonths(1).sisteDagIInneværendeMåned(), + opphør = Opphør(opphørDatoFom = tom.plusMonths(1).førsteDagIInneværendeMåned()), + ), + ), + listOf( + lagAndelMedPeriodeIdLong( + id = 1, + periodeId = 0, + forrigePeriodeId = null, + kildeBehandlingId = behandling.id, + ), + ), + ) + + every { endretUtbetalingAndelHentOgPersisterService.hentForBehandling(behandling.id) } returns emptyList() + every { tilkjentYtelseRepository.save(any()) } returns tilkjentYtelse + + // Act + oppdaterTilkjentYtelseService.oppdaterTilkjentYtelseMedUtbetalingsoppdrag(tilkjentYtelse, beregnetUtbetalingsoppdragLongId) + + // Assert + assertThat(tilkjentYtelse.utbetalingsoppdrag).isNotNull() + assertThat(tilkjentYtelse.stønadFom).isNull() + assertThat(tilkjentYtelse.stønadTom).isEqualTo(tom) + assertThat(tilkjentYtelse.endretDato).isEqualTo(dagensDato) + assertThat(tilkjentYtelse.opphørFom).isEqualTo(tom.plusMonths(1)) + + val andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag = tilkjentYtelse.andelerTilkjentYtelse.filter { it.erAndelSomSkalSendesTilOppdrag() } + assertThat(andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag).hasSize(1) + val oppdatertAndel = andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag.single() + assertThat(oppdatertAndel.periodeOffset).isEqualTo(0) + assertThat(oppdatertAndel.forrigePeriodeOffset).isNull() + assertThat(oppdatertAndel.kildeBehandlingId).isEqualTo(behandling.id) + } + + @Test + fun `skal oppdatere tilkjent ytelse med beregnet utbetalingsoppdrag ved opphør`() { + // Arrange + val behandling = lagBehandling() + val fom = dagensDato.plusMonths(1).toYearMonth() + val tom = dagensDato.plusMonths(2).toYearMonth() + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + stønadFom = null, + stønadTom = null, + opphørFom = null, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + ytelseType = YtelseType.ORDINÆR_BARNETRYGD, + beløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + id = 1, + fom = fom, + tom = tom, + ), + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + ytelseType = YtelseType.UTVIDET_BARNETRYGD, + beløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + id = 2, + fom = fom, + tom = tom, + ), + ) + }, + ) + val beregnetUtbetalingsoppdragLongId = + lagBeregnetUtbetalingsoppdragLongId( + listOf( + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 0, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.ORDINÆR_BARNETRYGD, + fom = fom.førsteDagIInneværendeMåned(), + tom = tom.plusMonths(1).sisteDagIInneværendeMåned(), + opphør = Opphør(opphørDatoFom = tom.plusMonths(1).førsteDagIInneværendeMåned()), + ), + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 1, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.UTVIDET_BARNETRYGD, + fom = fom.førsteDagIInneværendeMåned(), + tom = tom.sisteDagIInneværendeMåned(), + ), + ), + listOf( + lagAndelMedPeriodeIdLong( + id = 1, + periodeId = 0, + forrigePeriodeId = null, + kildeBehandlingId = behandling.id, + ), + lagAndelMedPeriodeIdLong( + id = 2, + periodeId = 1, + forrigePeriodeId = null, + kildeBehandlingId = behandling.id, + ), + ), + ) + + every { endretUtbetalingAndelHentOgPersisterService.hentForBehandling(behandling.id) } returns emptyList() + every { tilkjentYtelseRepository.save(any()) } returns tilkjentYtelse + + // Act + oppdaterTilkjentYtelseService.oppdaterTilkjentYtelseMedUtbetalingsoppdrag(tilkjentYtelse, beregnetUtbetalingsoppdragLongId) + + // Assert + assertThat(tilkjentYtelse.utbetalingsoppdrag).isNotNull() + assertThat(tilkjentYtelse.stønadFom).isEqualTo(fom) + assertThat(tilkjentYtelse.stønadTom).isEqualTo(tom) + assertThat(tilkjentYtelse.endretDato).isEqualTo(dagensDato) + assertThat(tilkjentYtelse.opphørFom).isNull() + + val andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag = tilkjentYtelse.andelerTilkjentYtelse.filter { it.erAndelSomSkalSendesTilOppdrag() } + assertThat(andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag).hasSize(2) + val førsteOppdaterteAndel = andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag.first() + val andreOppdaterteAndel = andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag.last() + assertThat(førsteOppdaterteAndel.periodeOffset).isEqualTo(0) + assertThat(andreOppdaterteAndel.periodeOffset).isEqualTo(1) + andelerSomSkalOppdateresMedDataFraBeregnetUtbetalingsoppdrag.forEach { + assertThat(it.forrigePeriodeOffset).isNull() + assertThat(it.kildeBehandlingId).isEqualTo(behandling.id) + } + } + + @Test + fun `skal kaste feil dersom antall andeler med utbetaling ikke stemmer overens med antall andeler med periode id i beregnet utbetalingsoppdrag`() { + // Arrange + val behandling = lagBehandling() + val fom = dagensDato.plusMonths(1).toYearMonth() + val tom = dagensDato.plusMonths(2).toYearMonth() + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + stønadFom = null, + stønadTom = null, + opphørFom = null, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + ytelseType = YtelseType.ORDINÆR_BARNETRYGD, + beløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + id = 1, + fom = fom, + tom = tom, + ), + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + ytelseType = YtelseType.ORDINÆR_BARNETRYGD, + beløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + id = 2, + forrigeperiodeIdOffset = 1, + fom = fom.plusMonths(1), + tom = tom.plusMonths(4), + ), + ) + }, + ) + val beregnetUtbetalingsoppdragLongId = + lagBeregnetUtbetalingsoppdragLongId( + listOf( + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 0, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.ORDINÆR_BARNETRYGD, + fom = fom.førsteDagIInneværendeMåned(), + tom = tom.sisteDagIInneværendeMåned(), + ), + ), + listOf( + lagAndelMedPeriodeIdLong( + id = 1, + periodeId = 0, + forrigePeriodeId = null, + kildeBehandlingId = behandling.id, + ), + ), + ) + + every { endretUtbetalingAndelHentOgPersisterService.hentForBehandling(behandling.id) } returns emptyList() + every { tilkjentYtelseRepository.save(any()) } returns tilkjentYtelse + + // Act & Assert + val exception = assertThrows { oppdaterTilkjentYtelseService.oppdaterTilkjentYtelseMedUtbetalingsoppdrag(tilkjentYtelse, beregnetUtbetalingsoppdragLongId) } + + assertThat(exception.message).isEqualTo("Antallet andeler med oppdatert periodeOffset, forrigePeriodeOffset og kildeBehandlingId fra ny generator skal være likt antallet andeler med kalkulertUtbetalingsbeløp != 0. Generator gir 1 andeler men det er 2 andeler med kalkulertUtbetalingsbeløp != 0") + } + + @Test + fun `skal kaste feil dersom vi ikke finner andel med periode id i beregnet utbetalingsoppdrag som matcher andel med utbetaling`() { + // Arrange + val behandling = lagBehandling() + val fom = dagensDato.plusMonths(1).toYearMonth() + val tom = dagensDato.plusMonths(2).toYearMonth() + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + stønadFom = null, + stønadTom = null, + opphørFom = null, + lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + ytelseType = YtelseType.ORDINÆR_BARNETRYGD, + beløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + id = 1, + fom = fom, + tom = tom, + ), + lagAndelTilkjentYtelse( + tilkjentYtelse = it, + ytelseType = YtelseType.ORDINÆR_BARNETRYGD, + beløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + id = 2, + forrigeperiodeIdOffset = 1, + fom = fom.plusMonths(1), + tom = tom.plusMonths(4), + ), + ) + }, + ) + val beregnetUtbetalingsoppdragLongId = + lagBeregnetUtbetalingsoppdragLongId( + listOf( + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 0, + forrigePeriodeId = null, + ytelseTypeBa = YtelsetypeBA.ORDINÆR_BARNETRYGD, + fom = fom.førsteDagIInneværendeMåned(), + tom = tom.sisteDagIInneværendeMåned(), + ), + lagUtbetalingsperiode( + behandlingId = behandling.id, + periodeId = 1, + forrigePeriodeId = 0, + ytelseTypeBa = YtelsetypeBA.ORDINÆR_BARNETRYGD, + fom = fom.førsteDagIInneværendeMåned(), + tom = tom.sisteDagIInneværendeMåned(), + ), + ), + listOf( + lagAndelMedPeriodeIdLong( + id = 1, + periodeId = 0, + forrigePeriodeId = null, + kildeBehandlingId = behandling.id, + ), + // Følgende andel med periode id, har ulik id enn andelen den skal representere + lagAndelMedPeriodeIdLong( + id = 3, + periodeId = 1, + forrigePeriodeId = 0, + kildeBehandlingId = behandling.id, + ), + ), + ) + + every { endretUtbetalingAndelHentOgPersisterService.hentForBehandling(behandling.id) } returns emptyList() + every { tilkjentYtelseRepository.save(any()) } returns tilkjentYtelse + + // Act & Assert + val exception = assertThrows { oppdaterTilkjentYtelseService.oppdaterTilkjentYtelseMedUtbetalingsoppdrag(tilkjentYtelse, beregnetUtbetalingsoppdragLongId) } + + assertThat(exception.message).isEqualTo("Feil ved oppdaterig av offset på andeler. Finner ikke andel med id 2 blandt andelene med oppdatert offset fra ny generator. Ny generator returnerer andeler med ider [1, 3]") + } +} diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorServiceTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorServiceTest.kt" deleted file mode 100644 index 0f1a9c09ad0..00000000000 --- "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorServiceTest.kt" +++ /dev/null @@ -1,862 +0,0 @@ -package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag - -import io.mockk.CapturingSlot -import io.mockk.every -import io.mockk.impl.annotations.InjectMockKs -import io.mockk.impl.annotations.MockK -import io.mockk.junit5.MockKExtension -import io.mockk.mockk -import io.mockk.slot -import io.mockk.verify -import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned -import no.nav.familie.ba.sak.common.lagAndelTilkjentYtelse -import no.nav.familie.ba.sak.common.lagBehandling -import no.nav.familie.ba.sak.common.lagEndretUtbetalingAndel -import no.nav.familie.ba.sak.common.lagInitiellTilkjentYtelse -import no.nav.familie.ba.sak.common.lagVedtak -import no.nav.familie.ba.sak.common.tilfeldigPerson -import no.nav.familie.ba.sak.common.toLocalDate -import no.nav.familie.ba.sak.config.featureToggle.UnleashNextMedContextService -import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService -import no.nav.familie.ba.sak.kjerne.behandling.BehandlingService -import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling -import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingType -import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse -import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelseRepository -import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse -import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository -import no.nav.familie.ba.sak.kjerne.endretutbetaling.EndretUtbetalingAndelHentOgPersisterService -import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.EndretUtbetalingAndel -import no.nav.familie.ba.sak.kjerne.endretutbetaling.domene.Årsak -import no.nav.familie.felles.utbetalingsgenerator.domain.BeregnetUtbetalingsoppdragLongId -import org.assertj.core.api.Assertions.assertThat -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import java.math.BigDecimal -import java.time.LocalDate -import java.time.YearMonth - -@ExtendWith(MockKExtension::class) -class UtbetalingsoppdragGeneratorServiceTest { - @MockK - private lateinit var behandlingHentOgPersisterService: BehandlingHentOgPersisterService - - @MockK - private lateinit var behandlingService: BehandlingService - - @MockK - private lateinit var tilkjentYtelseRepository: TilkjentYtelseRepository - - @MockK - private lateinit var andelTilkjentYtelseRepository: AndelTilkjentYtelseRepository - - @MockK - private lateinit var unleashNextMedContextService: UnleashNextMedContextService - - @MockK - private lateinit var endretUtbetalingAndelHentOgPersisterService: EndretUtbetalingAndelHentOgPersisterService - - @InjectMockKs - private lateinit var utbetalingsoppdragGenerator: UtbetalingsoppdragGenerator - - @InjectMockKs - private lateinit var utbetalingsoppdragGeneratorService: UtbetalingsoppdragGeneratorService - - @Test - fun `genererUtbetalingsoppdrag - skal generere nytt utbetalingsoppdrag og oppdatere andeler med offset når det ikke finnes en forrige behandling`() { - val vedtak = lagVedtak() - val tilkjentYtelse = lagInitiellTilkjentYtelse(vedtak.behandling) - val person = tilfeldigPerson() - tilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 1, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 3), - beløp = 250, - person = person, - ), - lagAndelTilkjentYtelse( - id = 2, - fom = YearMonth.of(2023, 4), - tom = YearMonth.of(2023, 5), - beløp = 350, - person = person, - ), - lagAndelTilkjentYtelse( - id = 3, - fom = YearMonth.of(2023, 6), - tom = YearMonth.of(2023, 8), - beløp = 250, - person = person, - ), - ), - ) - val tilkjentYtelseSlot = slot() - setUpMocks( - behandling = vedtak.behandling, - tilkjentYtelse = tilkjentYtelse, - tilkjentYtelseSlot = tilkjentYtelseSlot, - ) - - val beregnetUtbetalingsoppdrag = - utbetalingsoppdragGeneratorService.genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( - vedtak = vedtak, - "abc123", - ) - - val lagredeAndeler = tilkjentYtelseSlot.captured.andelerTilkjentYtelse - - verify(exactly = 1) { tilkjentYtelseRepository.save(any()) } - - validerBeregnetUtbetalingsoppdragOgAndeler( - beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdrag, - andelerTilkjentYtelse = lagredeAndeler, - forventetAntallAndeler = 3, - forventetAntallUtbetalingsperioder = 3, - forventedeOffsets = - listOf( - Pair(0L, null), - Pair(1L, 0L), - Pair(2L, 1L), - ), - ) - } - - @Test - fun `genererUtbetalingsoppdrag - skal generere nytt utbetalingsoppdrag og oppdatere andeler med offset når det finnes en forrige behandling`() { - val vedtak = lagVedtak() - val tilkjentYtelse = lagInitiellTilkjentYtelse(vedtak.behandling) - val person = tilfeldigPerson() - tilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 4, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 8), - beløp = 300, - person = person, - ), - ), - ) - - val forrigeBehandling = lagBehandling() - val forrigeTilkjentYtelse = lagInitiellTilkjentYtelse(forrigeBehandling) - forrigeTilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 1, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 3), - beløp = 250, - person = person, - periodeIdOffset = 0, - forrigeperiodeIdOffset = null, - ), - lagAndelTilkjentYtelse( - id = 2, - fom = YearMonth.of(2023, 4), - tom = YearMonth.of(2023, 5), - beløp = 350, - person = person, - periodeIdOffset = 1, - forrigeperiodeIdOffset = 0, - ), - lagAndelTilkjentYtelse( - id = 3, - fom = YearMonth.of(2023, 6), - tom = YearMonth.of(2023, 8), - beløp = 250, - person = person, - periodeIdOffset = 2, - forrigeperiodeIdOffset = 1, - ), - ), - ) - - val tilkjentYtelseSlot = slot() - setUpMocks( - behandling = vedtak.behandling, - tilkjentYtelse = tilkjentYtelse, - forrigeTilkjentYtelse = forrigeTilkjentYtelse, - tilkjentYtelseSlot = tilkjentYtelseSlot, - ) - - val beregnetUtbetalingsoppdrag = - utbetalingsoppdragGeneratorService.genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( - vedtak = vedtak, - "abc123", - ) - - val lagredeAndeler = tilkjentYtelseSlot.captured.andelerTilkjentYtelse - - verify(exactly = 1) { tilkjentYtelseRepository.save(any()) } - - validerBeregnetUtbetalingsoppdragOgAndeler( - beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdrag, - andelerTilkjentYtelse = lagredeAndeler, - forventetAntallAndeler = 1, - forventetAntallUtbetalingsperioder = 1, - forventedeOffsets = - listOf( - Pair(3L, 2L), - ), - ) - } - - @Test - fun `genererUtbetalingsoppdrag - skal generere nytt utbetalingsoppdrag og oppdatere andeler med offset for 2 personer`() { - val vedtak = lagVedtak() - val tilkjentYtelse = lagInitiellTilkjentYtelse(vedtak.behandling) - val person = tilfeldigPerson() - val barn = tilfeldigPerson() - tilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 1, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 3), - beløp = 250, - person = person, - ), - lagAndelTilkjentYtelse( - id = 2, - fom = YearMonth.of(2023, 4), - tom = YearMonth.of(2023, 5), - beløp = 350, - person = person, - ), - lagAndelTilkjentYtelse( - id = 3, - fom = YearMonth.of(2023, 6), - tom = YearMonth.of(2023, 8), - beløp = 250, - person = person, - ), - lagAndelTilkjentYtelse( - id = 4, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 3), - beløp = 250, - person = barn, - ), - lagAndelTilkjentYtelse( - id = 5, - fom = YearMonth.of(2023, 4), - tom = YearMonth.of(2023, 8), - beløp = 350, - person = barn, - ), - ), - ) - val tilkjentYtelseSlot = slot() - setUpMocks( - behandling = vedtak.behandling, - tilkjentYtelse = tilkjentYtelse, - tilkjentYtelseSlot = tilkjentYtelseSlot, - ) - - val beregnetUtbetalingsoppdrag = - utbetalingsoppdragGeneratorService.genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( - vedtak = vedtak, - "abc123", - ) - - val lagredeAndeler = tilkjentYtelseSlot.captured.andelerTilkjentYtelse - - verify(exactly = 1) { tilkjentYtelseRepository.save(any()) } - - validerBeregnetUtbetalingsoppdragOgAndeler( - beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdrag, - andelerTilkjentYtelse = lagredeAndeler, - forventetAntallAndeler = 5, - forventetAntallUtbetalingsperioder = 5, - forventedeOffsets = - listOf( - Pair(0L, null), - Pair(1L, 0L), - Pair(2L, 1L), - Pair(3L, null), - Pair(4L, 3L), - ), - ) - } - - @Test - fun `genererUtbetalingsoppdrag - skal generere nytt utbetalingsoppdrag og oppdatere andeler med offset for 2 personer og tidligere behandling`() { - val vedtak = lagVedtak() - val tilkjentYtelse = lagInitiellTilkjentYtelse(vedtak.behandling) - val person = tilfeldigPerson() - val barn = tilfeldigPerson() - tilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 6, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 8), - beløp = 250, - person = person, - ), - lagAndelTilkjentYtelse( - id = 7, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 8), - beløp = 350, - person = barn, - ), - ), - ) - - val forrigeBehandling = lagBehandling() - val forrigeTilkjentYtelse = lagInitiellTilkjentYtelse(forrigeBehandling) - forrigeTilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 1, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 3), - beløp = 250, - person = person, - periodeIdOffset = 0L, - ), - lagAndelTilkjentYtelse( - id = 2, - fom = YearMonth.of(2023, 4), - tom = YearMonth.of(2023, 5), - beløp = 350, - person = person, - periodeIdOffset = 1L, - forrigeperiodeIdOffset = 0L, - ), - lagAndelTilkjentYtelse( - id = 3, - fom = YearMonth.of(2023, 6), - tom = YearMonth.of(2023, 8), - beløp = 250, - person = person, - periodeIdOffset = 2L, - forrigeperiodeIdOffset = 1L, - ), - lagAndelTilkjentYtelse( - id = 4, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 3), - beløp = 250, - person = barn, - periodeIdOffset = 3L, - ), - lagAndelTilkjentYtelse( - id = 5, - fom = YearMonth.of(2023, 4), - tom = YearMonth.of(2023, 8), - beløp = 350, - person = barn, - periodeIdOffset = 4L, - forrigeperiodeIdOffset = 3L, - ), - ), - ) - val tilkjentYtelseSlot = slot() - setUpMocks( - behandling = vedtak.behandling, - tilkjentYtelse = tilkjentYtelse, - tilkjentYtelseSlot = tilkjentYtelseSlot, - forrigeTilkjentYtelse = forrigeTilkjentYtelse, - ) - - val beregnetUtbetalingsoppdrag = - utbetalingsoppdragGeneratorService.genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( - vedtak = vedtak, - "abc123", - ) - - val lagredeAndeler = tilkjentYtelseSlot.captured.andelerTilkjentYtelse - - verify(exactly = 1) { tilkjentYtelseRepository.save(any()) } - - validerBeregnetUtbetalingsoppdragOgAndeler( - beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdrag, - andelerTilkjentYtelse = lagredeAndeler, - forventetAntallAndeler = 2, - forventetAntallUtbetalingsperioder = 2, - forventedeOffsets = - listOf( - Pair(5L, 2L), - Pair(6L, 4L), - ), - ) - } - - @Test - fun `genererUtbetalingsoppdrag - skal generere nytt utbetalingsoppdrag med endret migreringsdato for en eksisterende kjede og en ny kjede`() { - val vedtak = lagVedtak(behandling = lagBehandling(behandlingType = BehandlingType.MIGRERING_FRA_INFOTRYGD)) - val tilkjentYtelse = lagInitiellTilkjentYtelse(vedtak.behandling) - val person = tilfeldigPerson() - val barn = tilfeldigPerson() - tilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 6, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 8), - beløp = 250, - person = person, - ), - lagAndelTilkjentYtelse( - id = 7, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 8), - beløp = 350, - person = barn, - ), - ), - ) - - val forrigeBehandling = lagBehandling() - val forrigeTilkjentYtelse = lagInitiellTilkjentYtelse(forrigeBehandling) - forrigeTilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 1, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 3), - beløp = 250, - person = person, - periodeIdOffset = 0L, - ), - lagAndelTilkjentYtelse( - id = 2, - fom = YearMonth.of(2023, 4), - tom = YearMonth.of(2023, 5), - beløp = 350, - person = person, - periodeIdOffset = 1L, - forrigeperiodeIdOffset = 0L, - ), - lagAndelTilkjentYtelse( - id = 3, - fom = YearMonth.of(2023, 6), - tom = YearMonth.of(2023, 8), - beløp = 250, - person = person, - periodeIdOffset = 2L, - forrigeperiodeIdOffset = 1L, - ), - ), - ) - val tilkjentYtelseSlot = slot() - setUpMocks( - behandling = vedtak.behandling, - tilkjentYtelse = tilkjentYtelse, - tilkjentYtelseSlot = tilkjentYtelseSlot, - forrigeTilkjentYtelse = forrigeTilkjentYtelse, - migreringsdato = YearMonth.of(2022, 11).førsteDagIInneværendeMåned(), - ) - - val beregnetUtbetalingsoppdrag = - utbetalingsoppdragGeneratorService.genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( - vedtak = vedtak, - "abc123", - ) - - val lagredeAndeler = tilkjentYtelseSlot.captured.andelerTilkjentYtelse - - verify(exactly = 1) { tilkjentYtelseRepository.save(any()) } - - validerBeregnetUtbetalingsoppdragOgAndeler( - beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdrag, - andelerTilkjentYtelse = lagredeAndeler, - forventetAntallAndeler = 2, - forventetAntallUtbetalingsperioder = 3, - forventedeOffsets = - listOf( - Pair(3L, 2L), - Pair(4L, null), - ), - ) - } - - @Test - fun `genererUtbetalingsoppdrag - skal generere nytt utbetalingsoppdrag for simulering med en eksisterende kjede og en ny kjede`() { - val vedtak = lagVedtak() - val tilkjentYtelse = lagInitiellTilkjentYtelse(vedtak.behandling) - val person = tilfeldigPerson() - val barn = tilfeldigPerson() - tilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 6, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 8), - beløp = 250, - person = person, - ), - lagAndelTilkjentYtelse( - id = 7, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 8), - beløp = 350, - person = barn, - ), - ), - ) - - val forrigeBehandling = lagBehandling() - val forrigeTilkjentYtelse = lagInitiellTilkjentYtelse(forrigeBehandling) - forrigeTilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 1, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 3), - beløp = 250, - person = person, - periodeIdOffset = 0L, - ), - lagAndelTilkjentYtelse( - id = 2, - fom = YearMonth.of(2023, 4), - tom = YearMonth.of(2023, 5), - beløp = 350, - person = person, - periodeIdOffset = 1L, - forrigeperiodeIdOffset = 0L, - ), - lagAndelTilkjentYtelse( - id = 3, - fom = YearMonth.of(2023, 6), - tom = YearMonth.of(2023, 8), - beløp = 250, - person = person, - periodeIdOffset = 2L, - forrigeperiodeIdOffset = 1L, - ), - ), - ) - val tilkjentYtelseSlot = slot() - setUpMocks( - behandling = vedtak.behandling, - tilkjentYtelse = tilkjentYtelse, - tilkjentYtelseSlot = tilkjentYtelseSlot, - forrigeTilkjentYtelse = forrigeTilkjentYtelse, - ) - - val beregnetUtbetalingsoppdrag = - utbetalingsoppdragGeneratorService.genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( - vedtak = vedtak, - saksbehandlerId = "abc123", - erSimulering = true, - ) - - verify(exactly = 0) { tilkjentYtelseRepository.save(any()) } - - validerBeregnetUtbetalingsoppdragOgAndeler( - beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdrag, - andelerTilkjentYtelse = emptySet(), - forventetAntallAndeler = 2, - forventetAntallUtbetalingsperioder = 3, - forventedeOffsets = - listOf( - Pair(3L, 2L), - Pair(4L, null), - ), - ) - } - - @Test - fun `genererUtbetalingsoppdrag - revurdering hvor 0-utbetaling går til betaling skal ikke opprette noe opphør ved simulering`() { - val vedtak = lagVedtak() - val tilkjentYtelse = lagInitiellTilkjentYtelse(vedtak.behandling) - val person = tilfeldigPerson() - val barn = tilfeldigPerson() - tilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 3, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 8), - beløp = 250, - person = person, - ), - lagAndelTilkjentYtelse( - id = 4, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 8), - beløp = 350, - person = barn, - ), - ), - ) - - val forrigeBehandling = lagBehandling() - val forrigeTilkjentYtelse = lagInitiellTilkjentYtelse(forrigeBehandling) - forrigeTilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 1, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 8), - beløp = 0, - person = person, - ), - lagAndelTilkjentYtelse( - id = 2, - fom = YearMonth.of(2023, 1), - tom = YearMonth.of(2023, 8), - beløp = 0, - person = barn, - ), - ), - ) - val tilkjentYtelseSlot = slot() - setUpMocks( - behandling = vedtak.behandling, - tilkjentYtelse = tilkjentYtelse, - tilkjentYtelseSlot = tilkjentYtelseSlot, - forrigeTilkjentYtelse = forrigeTilkjentYtelse, - ) - - val beregnetUtbetalingsoppdrag = - utbetalingsoppdragGeneratorService.genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( - vedtak = vedtak, - saksbehandlerId = "abc123", - erSimulering = true, - ) - - verify(exactly = 0) { tilkjentYtelseRepository.save(any()) } - - validerBeregnetUtbetalingsoppdragOgAndeler( - beregnetUtbetalingsoppdrag = beregnetUtbetalingsoppdrag, - andelerTilkjentYtelse = emptySet(), - forventetAntallAndeler = 2, - forventetAntallUtbetalingsperioder = 2, - forventedeOffsets = - listOf( - Pair(0L, null), - Pair(1L, null), - ), - ) - } - - @Test - fun `genererUtbetalingsoppdrag - stønadTom settes til tidspunkt for endret utbetaling dersom årsaken er ENDRE_MOTTAKER`() { - val vedtak = lagVedtak() - val tilkjentYtelse = lagInitiellTilkjentYtelse(vedtak.behandling) - val nåDato = YearMonth.now() - val barn1 = tilfeldigPerson(fødselsdato = nåDato.toLocalDate().minusYears(16)) - val barn2 = tilfeldigPerson(fødselsdato = nåDato.toLocalDate().minusYears(14)) - tilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 2, - fom = nåDato.minusYears(5), - tom = nåDato.minusMonths(4), - beløp = 350, - person = barn1, - ), - lagAndelTilkjentYtelse( - id = 3, - fom = nåDato.minusMonths(3), - tom = nåDato.plusYears(2).minusMonths(1), - prosent = BigDecimal.ZERO, - beløp = 0, - person = barn1, - ), - lagAndelTilkjentYtelse( - id = 4, - fom = nåDato.minusYears(3), - tom = nåDato.minusMonths(4), - beløp = 350, - person = barn2, - ), - lagAndelTilkjentYtelse( - id = 5, - fom = nåDato.minusMonths(3), - tom = nåDato.plusYears(4).minusMonths(1), - prosent = BigDecimal.ZERO, - beløp = 0, - person = barn2, - ), - ), - ) - - val endretUtbetaling = - listOf( - lagEndretUtbetalingAndel( - behandlingId = tilkjentYtelse.behandling.id, - person = barn1, - fom = nåDato.minusMonths(3), - tom = nåDato.plusYears(2).minusMonths(1), - prosent = BigDecimal.ZERO, - årsak = Årsak.ENDRE_MOTTAKER, - ), - lagEndretUtbetalingAndel( - behandlingId = tilkjentYtelse.behandling.id, - person = barn2, - fom = nåDato.minusMonths(3), - tom = nåDato.plusYears(4).minusMonths(1), - prosent = BigDecimal.ZERO, - årsak = Årsak.ENDRE_MOTTAKER, - ), - ) - - val tilkjentYtelseSlot = slot() - setUpMocks( - behandling = vedtak.behandling, - tilkjentYtelse = tilkjentYtelse, - tilkjentYtelseSlot = tilkjentYtelseSlot, - endretUtbetalingAndeler = endretUtbetaling, - ) - - utbetalingsoppdragGeneratorService.genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( - vedtak = vedtak, - saksbehandlerId = "abc123", - ) - - verify(exactly = 1) { tilkjentYtelseRepository.save(any()) } - - assertThat(tilkjentYtelseSlot.captured.stønadTom).isEqualTo(nåDato.minusMonths(4)) - } - - @Test - fun `genererUtbetalingsoppdrag - stønadTom settes ikke til tidspunkt for endret utbetaling dersom det kommer utbetalinger igjen etter endret utbetaling`() { - val vedtak = lagVedtak() - val tilkjentYtelse = lagInitiellTilkjentYtelse(vedtak.behandling) - val nåDato = YearMonth.now() - val barn = tilfeldigPerson(fødselsdato = nåDato.toLocalDate().minusYears(16)) - tilkjentYtelse.andelerTilkjentYtelse.addAll( - mutableSetOf( - lagAndelTilkjentYtelse( - id = 2, - fom = nåDato.minusYears(5), - tom = nåDato.minusMonths(4), - beløp = 350, - person = barn, - ), - lagAndelTilkjentYtelse( - id = 3, - fom = nåDato.minusMonths(3), - tom = nåDato.minusMonths(1), - beløp = 0, - prosent = BigDecimal.ZERO, - person = barn, - ), - lagAndelTilkjentYtelse( - id = 4, - fom = nåDato, - tom = nåDato.plusYears(2).minusMonths(1), - beløp = 350, - person = barn, - ), - ), - ) - - val endretUtbetaling = - listOf( - lagEndretUtbetalingAndel( - behandlingId = tilkjentYtelse.behandling.id, - person = barn, - fom = nåDato.minusMonths(3), - tom = nåDato.minusMonths(1), - prosent = BigDecimal.ZERO, - årsak = Årsak.ENDRE_MOTTAKER, - ), - ) - - val tilkjentYtelseSlot = slot() - setUpMocks( - behandling = vedtak.behandling, - tilkjentYtelse = tilkjentYtelse, - tilkjentYtelseSlot = tilkjentYtelseSlot, - endretUtbetalingAndeler = endretUtbetaling, - ) - - utbetalingsoppdragGeneratorService.genererUtbetalingsoppdragOgOppdaterTilkjentYtelse( - vedtak = vedtak, - saksbehandlerId = "abc123", - ) - - verify(exactly = 1) { tilkjentYtelseRepository.save(any()) } - - assertThat(tilkjentYtelseSlot.captured.stønadTom).isEqualTo(nåDato.plusYears(2).minusMonths(1)) - } - - private fun validerBeregnetUtbetalingsoppdragOgAndeler( - beregnetUtbetalingsoppdrag: BeregnetUtbetalingsoppdragLongId, - andelerTilkjentYtelse: Set, - forventedeOffsets: List>, - forventetAntallAndeler: Int, - forventetAntallUtbetalingsperioder: Int, - ) { - assertThat(beregnetUtbetalingsoppdrag.utbetalingsoppdrag).isNotNull - assertThat(beregnetUtbetalingsoppdrag.utbetalingsoppdrag.utbetalingsperiode.size).isEqualTo( - forventetAntallUtbetalingsperioder, - ) - - assertThat(beregnetUtbetalingsoppdrag.andeler).isNotEmpty - assertThat(beregnetUtbetalingsoppdrag.andeler.size).isEqualTo(forventetAntallAndeler) - - if (andelerTilkjentYtelse.isNotEmpty()) { - assertThat(andelerTilkjentYtelse.size).isEqualTo(forventetAntallAndeler) - assertThat( - andelerTilkjentYtelse.map { - Pair( - it.periodeOffset, - it.forrigePeriodeOffset, - ) - }, - ).isEqualTo( - forventedeOffsets, - ) - } else { - assertThat( - beregnetUtbetalingsoppdrag.andeler.map { - Pair( - it.periodeId, - it.forrigePeriodeId, - ) - }, - ).isEqualTo( - forventedeOffsets, - ) - } - } - - private fun setUpMocks( - behandling: Behandling, - tilkjentYtelse: TilkjentYtelse, - tilkjentYtelseSlot: CapturingSlot, - forrigeTilkjentYtelse: TilkjentYtelse? = null, - migreringsdato: LocalDate? = null, - endretUtbetalingAndeler: List = emptyList(), - ) { - if (forrigeTilkjentYtelse == null) { - every { behandlingHentOgPersisterService.hentForrigeBehandlingSomErIverksatt(behandling) } returns null - every { andelTilkjentYtelseRepository.hentSisteAndelPerIdentOgType(behandling.fagsak.id) } returns emptyList() - } else { - every { behandlingHentOgPersisterService.hentForrigeBehandlingSomErIverksatt(behandling) } returns forrigeTilkjentYtelse.behandling - - every { tilkjentYtelseRepository.findByBehandlingAndHasUtbetalingsoppdrag(forrigeTilkjentYtelse.behandling.id) } returns forrigeTilkjentYtelse - - every { andelTilkjentYtelseRepository.hentSisteAndelPerIdentOgType(behandling.fagsak.id) } returns - forrigeTilkjentYtelse.andelerTilkjentYtelse - .filter { it.erAndelSomSkalSendesTilOppdrag() } - .groupBy { it.aktør.aktivFødselsnummer() } - .mapValues { it.value.maxBy { it.periodeOffset!! } } - .values - .toList() - } - - every { tilkjentYtelseRepository.findByBehandling(behandling.id) } returns tilkjentYtelse - - every { behandlingHentOgPersisterService.hentBehandlinger(behandling.fagsak.id) } returns listOf(behandling) - - every { behandlingService.hentMigreringsdatoPåFagsak(behandling.fagsak.id) } returns migreringsdato - - every { tilkjentYtelseRepository.save(capture(tilkjentYtelseSlot)) } returns mockk() - - every { endretUtbetalingAndelHentOgPersisterService.hentForBehandling(any()) } returns endretUtbetalingAndeler - - every { unleashNextMedContextService.isEnabled(any()) } returns true - } -} diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorTest.kt" new file mode 100644 index 00000000000..6e059ba03fb --- /dev/null +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/UtbetalingsoppdragGeneratorTest.kt" @@ -0,0 +1,273 @@ +package no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag + +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import no.nav.familie.ba.sak.common.førsteDagIInneværendeMåned +import no.nav.familie.ba.sak.common.lagAndelTilkjentYtelse +import no.nav.familie.ba.sak.common.lagBehandling +import no.nav.familie.ba.sak.common.lagPerson +import no.nav.familie.ba.sak.common.lagTilkjentYtelse +import no.nav.familie.ba.sak.common.lagVedtak +import no.nav.familie.ba.sak.common.sisteDagIMåned +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.kjerne.behandling.BehandlingHentOgPersisterService +import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingType +import no.nav.familie.ba.sak.kjerne.beregning.SatsService +import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelseRepository +import no.nav.familie.ba.sak.kjerne.beregning.domene.SatsType +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository +import no.nav.familie.ba.sak.kjerne.beregning.domene.YtelseType +import no.nav.familie.felles.utbetalingsgenerator.Utbetalingsgenerator +import no.nav.familie.felles.utbetalingsgenerator.domain.Behandlingsinformasjon +import no.nav.familie.felles.utbetalingsgenerator.domain.Utbetalingsoppdrag +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.ValueSource +import java.time.LocalDate + +class UtbetalingsoppdragGeneratorTest { + private val klassifiseringKorrigerer: KlassifiseringKorrigerer = mockk() + private val unleashNextMedContextService: UnleashNextMedContextService = mockk() + private val behandlingsinformasjonUtleder: BehandlingsinformasjonUtleder = mockk() + private val andelTilkjentYtelseRepository: AndelTilkjentYtelseRepository = mockk() + private val behandlingHentOgPersisterService: BehandlingHentOgPersisterService = mockk() + private val tilkjentYtelseRepository: TilkjentYtelseRepository = mockk() + private val utbetalingsoppdragGenerator = + UtbetalingsoppdragGenerator( + utbetalingsgenerator = Utbetalingsgenerator(), + klassifiseringKorrigerer = klassifiseringKorrigerer, + unleashNextMedContextService = unleashNextMedContextService, + behandlingsinformasjonUtleder = behandlingsinformasjonUtleder, + andelTilkjentYtelseRepository = andelTilkjentYtelseRepository, + behandlingHentOgPersisterService = behandlingHentOgPersisterService, + tilkjentYtelseRepository = tilkjentYtelseRepository, + ) + + @ParameterizedTest + @ValueSource(booleans = [true, false]) + fun `skal lage utbetalingsoppdrag for førstegangsbehandling`(erSimulering: Boolean) { + // Arrange + val saksbehandlerId = "123abc" + val behandling = lagBehandling(behandlingType = BehandlingType.FØRSTEGANGSBEHANDLING) + val vedtak = lagVedtak(behandling = behandling) + val barn = lagPerson() + val andelerTilkjentYtelse = + setOf( + lagAndelTilkjentYtelse( + behandling = behandling, + fom = LocalDate.now().toYearMonth(), + tom = LocalDate.now().toYearMonth(), + person = barn, + ytelseType = YtelseType.ORDINÆR_BARNETRYGD, + kildeBehandlingId = null, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + ), + ) + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + lagAndelerTilkjentYtelse = { andelerTilkjentYtelse }, + ) + + every { + behandlingHentOgPersisterService + .hentForrigeBehandlingSomErIverksatt(behandling = behandling) + } returns null + every { + andelTilkjentYtelseRepository + .hentSisteAndelPerIdentOgType(fagsakId = behandling.fagsak.id) + } returns emptyList() + every { + behandlingsinformasjonUtleder.utled( + any(), + any(), + any(), + any(), + any(), + ) + } returns + Behandlingsinformasjon( + saksbehandlerId = saksbehandlerId, + behandlingId = behandling.id.toString(), + eksternBehandlingId = behandling.id, + eksternFagsakId = behandling.fagsak.id, + fagsystem = FagsystemBA.BARNETRYGD, + personIdent = barn.aktør.aktivFødselsnummer(), + vedtaksdato = LocalDate.now(), + opphørAlleKjederFra = null, + ) + + every { + unleashNextMedContextService.isEnabled( + toggleId = FeatureToggleConfig.SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD, + behandlingId = behandling.id, + ) + } returns true + + every { + klassifiseringKorrigerer.korrigerKlassifiseringVedBehov( + beregnetUtbetalingsoppdrag = any(), + behandling = vedtak.behandling, + ) + } answers { + firstArg() + } + + // Act + val beregnetUtbetalingsoppdragLongId = + utbetalingsoppdragGenerator.lagUtbetalingsoppdrag( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + tilkjentYtelse = tilkjentYtelse, + erSimulering = erSimulering, + ) + + // Assert + verify(exactly = 1) { behandlingsinformasjonUtleder.utled(any(), any(), any(), any(), any()) } + verify(exactly = 1) { + klassifiseringKorrigerer.korrigerKlassifiseringVedBehov(any(), any()) + } + + assertThat(beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.kodeEndring).isEqualTo(Utbetalingsoppdrag.KodeEndring.NY) + assertThat(beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.saksnummer).isEqualTo(behandling.fagsak.id.toString()) + assertThat(beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.utbetalingsperiode).hasSize(1) + assertThat(beregnetUtbetalingsoppdragLongId.andeler).hasSize(1) + assertThat( + beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.utbetalingsperiode + .single() + .vedtakdatoFom, + ).isEqualTo(LocalDate.now().førsteDagIInneværendeMåned()) + assertThat( + beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.utbetalingsperiode + .single() + .vedtakdatoTom, + ).isEqualTo(LocalDate.now().sisteDagIMåned()) + } + + @ParameterizedTest + @ValueSource(booleans = [true, false]) + fun `skal lage utbetalingsoppdrag for revurdering`(erSimulering: Boolean) { + // Arrange + val saksbehandlerId = "123abc" + val barn = lagPerson() + val forrigeBehandling = lagBehandling(behandlingType = BehandlingType.FØRSTEGANGSBEHANDLING) + val forrigeTilkjenteYtelse = + lagTilkjentYtelse(behandling = forrigeBehandling, lagAndelerTilkjentYtelse = { + setOf( + lagAndelTilkjentYtelse( + id = 1, + behandling = forrigeBehandling, + fom = LocalDate.now().toYearMonth(), + tom = LocalDate.now().toYearMonth(), + periodeIdOffset = 0, + forrigeperiodeIdOffset = null, + person = barn, + ytelseType = YtelseType.ORDINÆR_BARNETRYGD, + kildeBehandlingId = null, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + ), + ) + }) + val behandling = lagBehandling(behandlingType = BehandlingType.REVURDERING) + val vedtak = lagVedtak(behandling = behandling) + val andelerTilkjentYtelse = + setOf( + lagAndelTilkjentYtelse( + id = 2, + behandling = behandling, + fom = LocalDate.now().toYearMonth(), + tom = LocalDate.now().plusMonths(2).toYearMonth(), + person = barn, + ytelseType = YtelseType.ORDINÆR_BARNETRYGD, + kildeBehandlingId = null, + kalkulertUtbetalingsbeløp = SatsService.finnSisteSatsFor(SatsType.ORBA).beløp, + ), + ) + val tilkjentYtelse = + lagTilkjentYtelse( + behandling = behandling, + lagAndelerTilkjentYtelse = { andelerTilkjentYtelse }, + ) + + every { + behandlingHentOgPersisterService + .hentForrigeBehandlingSomErIverksatt(behandling = behandling) + } returns forrigeBehandling + + every { tilkjentYtelseRepository.findByBehandlingAndHasUtbetalingsoppdrag(behandlingId = forrigeBehandling.id) } returns forrigeTilkjenteYtelse + every { + andelTilkjentYtelseRepository + .hentSisteAndelPerIdentOgType(fagsakId = behandling.fagsak.id) + } returns forrigeTilkjenteYtelse.andelerTilkjentYtelse.toList() + every { + behandlingsinformasjonUtleder.utled( + any(), + any(), + any(), + any(), + any(), + ) + } returns + Behandlingsinformasjon( + saksbehandlerId = saksbehandlerId, + behandlingId = behandling.id.toString(), + eksternBehandlingId = behandling.id, + eksternFagsakId = behandling.fagsak.id, + fagsystem = FagsystemBA.BARNETRYGD, + personIdent = barn.aktør.aktivFødselsnummer(), + vedtaksdato = LocalDate.now(), + opphørAlleKjederFra = null, + ) + + every { + unleashNextMedContextService.isEnabled( + toggleId = FeatureToggleConfig.SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD, + behandlingId = any(), + ) + } returns true + + every { + klassifiseringKorrigerer.korrigerKlassifiseringVedBehov( + beregnetUtbetalingsoppdrag = any(), + behandling = vedtak.behandling, + ) + } answers { + firstArg() + } + + // Act + val beregnetUtbetalingsoppdragLongId = + utbetalingsoppdragGenerator.lagUtbetalingsoppdrag( + saksbehandlerId = saksbehandlerId, + vedtak = vedtak, + tilkjentYtelse = tilkjentYtelse, + erSimulering = erSimulering, + ) + + // Assert + verify(exactly = 1) { behandlingsinformasjonUtleder.utled(any(), any(), any(), any(), any()) } + verify(exactly = 1) { + klassifiseringKorrigerer.korrigerKlassifiseringVedBehov(any(), any()) + } + + assertThat(beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.saksbehandlerId).isEqualTo(saksbehandlerId) + assertThat(beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.kodeEndring).isEqualTo(Utbetalingsoppdrag.KodeEndring.ENDR) + assertThat(beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.saksnummer).isEqualTo(behandling.fagsak.id.toString()) + assertThat(beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.utbetalingsperiode).hasSize(1) + assertThat(beregnetUtbetalingsoppdragLongId.andeler).hasSize(1) + assertThat( + beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.utbetalingsperiode + .single() + .vedtakdatoFom, + ).isEqualTo(LocalDate.now().førsteDagIInneværendeMåned()) + assertThat( + beregnetUtbetalingsoppdragLongId.utbetalingsoppdrag.utbetalingsperiode + .single() + .vedtakdatoTom, + ).isEqualTo(LocalDate.now().plusMonths(2).sisteDagIMåned()) + } +} diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/YtelsetypeBATest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/YtelsetypeBATest.kt" index 628f5a82e89..aeb1e40f216 100644 --- "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/YtelsetypeBATest.kt" +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/integrasjoner/\303\270konomi/utbetalingsoppdrag/YtelsetypeBATest.kt" @@ -18,6 +18,15 @@ class YtelsetypeBATest { // Act val klassifisering = YtelsetypeBA.UTVIDET_BARNETRYGD.klassifisering + // Assert + assertThat(klassifisering).isEqualTo("BAUTV-OP") + } + + @Test + fun `UTVIDET_BARNETRYGD_GAMMEL skal ha riktig klassifisering`() { + // Act + val klassifisering = YtelsetypeBA.UTVIDET_BARNETRYGD_GAMMEL.klassifisering + // Assert assertThat(klassifisering).isEqualTo("BATR") } diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/YtelseTypeTest.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/YtelseTypeTest.kt new file mode 100644 index 00000000000..2be1b12df23 --- /dev/null +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/YtelseTypeTest.kt @@ -0,0 +1,47 @@ +package no.nav.familie.ba.sak.kjerne.beregning.domene + +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.YtelsetypeBA +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.ValueSource + +class YtelseTypeTest { + @ParameterizedTest + @ValueSource(booleans = [true, false]) + fun `skal mappe ORDINÆR_BARNETRYGD ytelsestype til ORDINÆR_BARNETRYGD ytelsetypeBA`(skalBrukeNyKlassekodeForUtvidetBarnetrygd: Boolean) { + // Act + val ytelsetypeBA = YtelseType.ORDINÆR_BARNETRYGD.tilYtelseType(skalBrukeNyKlassekodeForUtvidetBarnetrygd) + + // Assert + assertThat(ytelsetypeBA).isEqualTo(YtelsetypeBA.ORDINÆR_BARNETRYGD) + } + + @Test + fun `skal mappe UTVIDET_BARNETRYGD ytelsestype til UTVIDET_BARNETRYGD ytelsetypeBA når skalBrukeNyKlassekodeForUtvidetBarnetrygd er true`() { + // Act + val ytelsetypeBA = YtelseType.UTVIDET_BARNETRYGD.tilYtelseType(true) + + // Assert + assertThat(ytelsetypeBA).isEqualTo(YtelsetypeBA.UTVIDET_BARNETRYGD) + } + + @Test + fun `skal mappe UTVIDET_BARNETRYGD ytelsestype til UTVIDET_BARNETRYGD_GAMMEL ytelsetypeBA når skalBrukeNyKlassekodeForUtvidetBarnetrygd er false`() { + // Act + val ytelsetypeBA = YtelseType.UTVIDET_BARNETRYGD.tilYtelseType(false) + + // Assert + assertThat(ytelsetypeBA).isEqualTo(YtelsetypeBA.UTVIDET_BARNETRYGD_GAMMEL) + } + + @ParameterizedTest + @ValueSource(booleans = [true, false]) + fun `skal mappe SMÅBARNSTILLEGG ytelsestype til SMÅBARNSTILLEGG ytelsetypeBA`(skalBrukeNyKlassekodeForUtvidetBarnetrygd: Boolean) { + // Act + val ytelsetypeBA = YtelseType.SMÅBARNSTILLEGG.tilYtelseType(skalBrukeNyKlassekodeForUtvidetBarnetrygd) + + // Assert + assertThat(ytelsetypeBA).isEqualTo(YtelsetypeBA.SMÅBARNSTILLEGG) + } +} diff --git a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/simulering/SimuleringServiceEnhetTest.kt b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/simulering/SimuleringServiceEnhetTest.kt index 41bf83f4068..e6fd00be246 100644 --- a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/simulering/SimuleringServiceEnhetTest.kt +++ b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/simulering/SimuleringServiceEnhetTest.kt @@ -6,13 +6,14 @@ import no.nav.familie.ba.sak.common.Feil import no.nav.familie.ba.sak.common.lagPerson import no.nav.familie.ba.sak.common.randomFnr import no.nav.familie.ba.sak.common.tilPersonEnkel -import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGeneratorService +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGenerator import no.nav.familie.ba.sak.integrasjoner.økonomi.ØkonomiKlient import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingType import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingÅrsak import no.nav.familie.ba.sak.kjerne.beregning.BeregningService +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.PersonType import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.PersongrunnlagService import no.nav.familie.ba.sak.kjerne.simulering.domene.ØkonomiSimuleringMottaker @@ -41,7 +42,8 @@ internal class SimuleringServiceEnhetTest { private val vedtakRepository: VedtakRepository = mockk() private val behandlingHentOgPersisterService: BehandlingHentOgPersisterService = mockk() private val persongrunnlagService: PersongrunnlagService = mockk() - private val utbetalingsoppdragGeneratorService: UtbetalingsoppdragGeneratorService = mockk() + private val utbetalingsoppdragGenerator: UtbetalingsoppdragGenerator = mockk() + private val tilkjentYtelseRepository: TilkjentYtelseRepository = mockk() private val simuleringService: SimuleringService = SimuleringService( @@ -50,9 +52,10 @@ internal class SimuleringServiceEnhetTest { økonomiSimuleringMottakerRepository = økonomiSimuleringMottakerRepository, tilgangService = tilgangService, vedtakRepository = vedtakRepository, - utbetalingsoppdragGeneratorService = utbetalingsoppdragGeneratorService, + utbetalingsoppdragGenerator = utbetalingsoppdragGenerator, behandlingHentOgPersisterService = behandlingHentOgPersisterService, persongrunnlagService = persongrunnlagService, + tilkjentYtelseRepository = tilkjentYtelseRepository, ) val februar2023 = LocalDate.of(2023, 2, 1) diff --git a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/OppdragSteg.kt b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/OppdragSteg.kt index 6a33a3eb407..25c85dba2cd 100644 --- a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/OppdragSteg.kt +++ b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/OppdragSteg.kt @@ -4,9 +4,14 @@ import io.cucumber.datatable.DataTable import io.cucumber.java.no.Gitt import io.cucumber.java.no.Når import io.cucumber.java.no.Så +import io.mockk.every +import io.mockk.mockk +import no.nav.familie.ba.sak.TestClockProvider import no.nav.familie.ba.sak.common.defaultFagsak import no.nav.familie.ba.sak.common.lagBehandling import no.nav.familie.ba.sak.common.lagVedtak +import no.nav.familie.ba.sak.common.toLocalDate +import no.nav.familie.ba.sak.config.FeatureToggleConfig.Companion.SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD import no.nav.familie.ba.sak.cucumber.ValideringUtil.assertSjekkBehandlingIder import no.nav.familie.ba.sak.cucumber.domeneparser.Domenebegrep import no.nav.familie.ba.sak.cucumber.domeneparser.DomeneparserUtil.groupByBehandlingId @@ -14,36 +19,114 @@ import no.nav.familie.ba.sak.cucumber.domeneparser.ForventetUtbetalingsoppdrag import no.nav.familie.ba.sak.cucumber.domeneparser.ForventetUtbetalingsperiode import no.nav.familie.ba.sak.cucumber.domeneparser.OppdragParser import no.nav.familie.ba.sak.cucumber.domeneparser.OppdragParser.mapTilkjentYtelse +import no.nav.familie.ba.sak.cucumber.domeneparser.parseBoolean +import no.nav.familie.ba.sak.cucumber.domeneparser.parseString +import no.nav.familie.ba.sak.cucumber.domeneparser.parseValgfriEnum import no.nav.familie.ba.sak.cucumber.domeneparser.parseÅrMåned +import no.nav.familie.ba.sak.cucumber.mock.komponentMocks.mockUnleashNextMedContextService +import no.nav.familie.ba.sak.cucumber.mock.mockAndelTilkjentYtelseRepository +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.BehandlingsinformasjonUtleder +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.EndretMigreringsdatoUtleder +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.KlassifiseringKorrigerer import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGenerator import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.tilRestUtbetalingsoppdrag +import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService +import no.nav.familie.ba.sak.kjerne.behandling.BehandlingService import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling +import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingMigreringsinfoRepository +import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingType import no.nav.familie.ba.sak.kjerne.beregning.BeregningTestUtil.sisteAndelPerIdentNy import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelseRepository +import no.nav.familie.felles.utbetalingsgenerator.Utbetalingsgenerator import no.nav.familie.felles.utbetalingsgenerator.domain.BeregnetUtbetalingsoppdragLongId import no.nav.familie.kontrakter.felles.oppdrag.Utbetalingsoppdrag import no.nav.familie.kontrakter.felles.oppdrag.Utbetalingsperiode import org.assertj.core.api.Assertions.assertThat import org.slf4j.LoggerFactory +import java.time.Clock import java.time.YearMonth @Suppress("ktlint:standard:function-naming") class OppdragSteg { - private val utbetalingsoppdragGenerator = UtbetalingsoppdragGenerator() - private var behandlinger = mapOf() - private var tilkjenteYtelser = listOf() + private val clockProvider = TestClockProvider(Clock.systemDefaultZone()) + + private var behandlinger = mutableMapOf() + private var tilkjenteYtelser = mutableMapOf() private var beregnetUtbetalingsoppdrag = mutableMapOf() private var beregnetUtbetalingsoppdragSimulering = mutableMapOf() private var endretMigreringsdatoMap = mutableMapOf() private var kastedeFeil = mutableMapOf() + private var toggles = mutableMapOf>() + + private val tilkjentYtelseRepository = mockk() + private val unleashNextMedContextService = mockUnleashNextMedContextService() + private val behandlingHentOgPersisterService = mockk() + private val andelTilkjentYtelseRepository = mockAndelTilkjentYtelseRepository(tilkjenteYtelser, behandlinger) + private val behandlingMigreringsinfoRepository = mockk() + + val behandlingService = + BehandlingService( + behandlingHentOgPersisterService = behandlingHentOgPersisterService, + behandlingstemaService = mockk(), + behandlingSøknadsinfoService = mockk(), + behandlingMigreringsinfoRepository = behandlingMigreringsinfoRepository, + behandlingMetrikker = mockk(), + saksstatistikkEventPublisher = mockk(), + fagsakRepository = mockk(), + vedtakRepository = mockk(), + andelTilkjentYtelseRepository = andelTilkjentYtelseRepository, + loggService = mockk(), + arbeidsfordelingService = mockk(), + infotrygdService = mockk(), + vedtaksperiodeService = mockk(), + taskRepository = mockk(), + vilkårsvurderingService = mockk(), + ) + + private val utbetalingsoppdragGenerator = + UtbetalingsoppdragGenerator( + Utbetalingsgenerator(), + KlassifiseringKorrigerer( + tilkjentYtelseRepository, + unleashNextMedContextService, + ), + unleashNextMedContextService, + BehandlingsinformasjonUtleder( + EndretMigreringsdatoUtleder( + behandlingHentOgPersisterService, + behandlingService, + ), + clockProvider, + ), + andelTilkjentYtelseRepository, + behandlingHentOgPersisterService, + tilkjentYtelseRepository, + ) private val logger = LoggerFactory.getLogger(javaClass) + @Gitt("følgende feature toggles") + fun følgendeFeatureToggles(dataTable: DataTable) { + toggles = + dataTable + .groupByBehandlingId() + .mapValues { + val map = mutableMapOf() + it.value.forEach { rad -> + val featureToggleId = parseString(Domenebegrep.FEATURE_TOGGLE_ID, rad) + val featureToggleVerdi = parseBoolean(Domenebegrep.ER_FEATURE_TOGGLE_TOGGLET_PÅ, rad) + map[featureToggleId] = featureToggleVerdi + } + map + }.toMutableMap() + } + @Gitt("følgende tilkjente ytelser") fun følgendeTilkjenteYtelser(dataTable: DataTable) { genererBehandlinger(dataTable) tilkjenteYtelser = mapTilkjentYtelse(dataTable, behandlinger) - if (tilkjenteYtelser.flatMap { it.andelerTilkjentYtelse }.any { it.kildeBehandlingId != null }) { + if (tilkjenteYtelser.flatMap { (_, tilkjentYtelse) -> tilkjentYtelse.andelerTilkjentYtelse }.any { it.kildeBehandlingId != null }) { error("Kildebehandling skal ikke settes på input, denne settes fra utbetalingsgeneratorn") } } @@ -62,7 +145,7 @@ class OppdragSteg { @Når("beregner utbetalingsoppdrag") fun `beregner utbetalingsoppdrag`() { - tilkjenteYtelser.fold(emptyList()) { tidligereTilkjenteYtelser, tilkjentYtelse -> + tilkjenteYtelser.values.fold(emptyList()) { tidligereTilkjenteYtelser, tilkjentYtelse -> val behandlingId = tilkjentYtelse.behandling.id try { beregnetUtbetalingsoppdragSimulering[behandlingId] = beregnUtbetalingsoppdragNy(tidligereTilkjenteYtelser, tilkjentYtelse, true) @@ -95,18 +178,46 @@ class OppdragSteg { tilkjentYtelse: TilkjentYtelse, erSimulering: Boolean = false, ): BeregnetUtbetalingsoppdragLongId { - val forrigeTilkjentYtelse = tidligereTilkjenteYtelser.lastOrNull() - + every { + behandlingHentOgPersisterService.hentForrigeBehandlingSomErIverksatt(any()) + } returns tidligereTilkjenteYtelser.lastOrNull()?.behandling + every { + tilkjentYtelseRepository.findByBehandlingAndHasUtbetalingsoppdrag(any()) + } returns tidligereTilkjenteYtelser.lastOrNull() + every { + behandlingHentOgPersisterService.hentBehandlinger(any()) + } returns behandlinger.filter { it.value.fagsak.id == tilkjentYtelse.behandling.fagsak.id }.values.toList() + every { + andelTilkjentYtelseRepository.hentSisteAndelPerIdentOgType(any()) + } answers { + val skalBrukeNyKlassekodeForUtvidetBarnetrygd = toggles[tilkjentYtelse.behandling.id]?.get(SKAL_BRUKE_NY_KLASSEKODE_FOR_UTVIDET_BARNETRYGD) ?: false + sisteAndelPerIdentNy(tidligereTilkjenteYtelser, skalBrukeNyKlassekodeForUtvidetBarnetrygd).values.toList() + } + every { + behandlingMigreringsinfoRepository.finnSisteMigreringsdatoPåFagsak(any()) + } returns endretMigreringsdatoMap[tilkjentYtelse.behandling.id]?.toLocalDate() + every { + unleashNextMedContextService.isEnabled( + any(), + any(), + ) + } answers { + val featureToggleId = firstArg() + toggles[tilkjentYtelse.behandling.id]?.get(featureToggleId) ?: true + } + every { tilkjentYtelseRepository.harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd(any()) } answers { + beregnetUtbetalingsoppdrag.values.any { beregnetUtbetalingsoppdrag -> + beregnetUtbetalingsoppdrag.utbetalingsoppdrag.utbetalingsperiode.any { utbetalingsperiode -> + utbetalingsperiode.klassifisering == "BAUTV-OP" + } + } + } val vedtak = lagVedtak(behandling = tilkjentYtelse.behandling) - val sisteAndelPerIdent = sisteAndelPerIdentNy(tidligereTilkjenteYtelser) return utbetalingsoppdragGenerator.lagUtbetalingsoppdrag( saksbehandlerId = "saksbehandlerId", vedtak = vedtak, - forrigeTilkjentYtelse = forrigeTilkjentYtelse, - sisteAndelPerKjede = sisteAndelPerIdent, - nyTilkjentYtelse = tilkjentYtelse, + tilkjentYtelse = tilkjentYtelse, erSimulering = erSimulering, - endretMigreringsDato = endretMigreringsdatoMap[tilkjentYtelse.behandling.id], ) } @@ -175,8 +286,14 @@ class OppdragSteg { behandlinger = dataTable .groupByBehandlingId() - .map { lagBehandling(fagsak = fagsak).copy(id = it.key) } - .associateBy { it.id } + .mapValues { + val sisteRad = it.value.last() + lagBehandling( + id = it.key, + fagsak = fagsak, + behandlingType = parseValgfriEnum(Domenebegrep.BEHANDLINGSTYPE, sisteRad) ?: BehandlingType.FØRSTEGANGSBEHANDLING, + ) + }.toMutableMap() } private fun assertUtbetalingsoppdrag( diff --git a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/VedtaksperiodeUtil.kt b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/VedtaksperiodeUtil.kt index aa44bd37bb4..c0b381a399b 100644 --- a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/VedtaksperiodeUtil.kt +++ b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/VedtaksperiodeUtil.kt @@ -31,10 +31,7 @@ import no.nav.familie.ba.sak.cucumber.domeneparser.parseValgfriLong import no.nav.familie.ba.sak.cucumber.domeneparser.parseValgfriString import no.nav.familie.ba.sak.cucumber.domeneparser.parseValgfriStringList import no.nav.familie.ba.sak.cucumber.domeneparser.parseValgfriÅrMåned -import no.nav.familie.ba.sak.cucumber.mock.tilSisteAndelPerAktørOgType -import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGenerator -import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.oppdaterAndelerMedPeriodeOffset -import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.oppdaterTilkjentYtelseMedUtbetalingsoppdrag +import no.nav.familie.ba.sak.cucumber.mock.CucumberMock 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.behandling.domene.BehandlingKategori @@ -82,7 +79,6 @@ import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.UtdypendeVilkårsvu import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.Vilkår import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.VilkårResultat import no.nav.familie.ba.sak.kjerne.vilkårsvurdering.domene.Vilkårsvurdering -import no.nav.familie.felles.utbetalingsgenerator.domain.IdentOgType import java.math.BigDecimal import java.time.LocalDate import kotlin.random.Random @@ -462,6 +458,7 @@ fun lagPersonGrunnlag(dataTable: DataTable): Map }.associateBy { it.behandlingId } fun lagTilkjentYtelse( + dataFraCucumber: VedtaksperioderOgBegrunnelserStepDefinition, dataTable: DataTable, behandlinger: MutableMap, personGrunnlag: Map, @@ -524,7 +521,7 @@ fun lagTilkjentYtelse( (skalIverksettesMotOppdrag(nåværendeAndeler, forrigeAndeler) || behandling.type == BehandlingType.MIGRERING_FRA_INFOTRYGD) ) { val vedtak = vedtaksliste.single { it.behandling.id == tilkjentYtelse.value.behandling.id && it.aktiv } - tilkjentYtelse.value.oppdaterMedUtbetalingsoppdrag(vedtak) + tilkjentYtelse.value.oppdaterMedUtbetalingsoppdrag(dataFraCucumber, vedtak) } } @@ -541,26 +538,21 @@ private fun skalIverksettesMotOppdrag( .any { it.innhold == true } private fun TilkjentYtelse.oppdaterMedUtbetalingsoppdrag( + dataFraCucumber: VedtaksperioderOgBegrunnelserStepDefinition, vedtak: Vedtak, ) { + if (this.andelerTilkjentYtelse.none { it.erAndelSomSkalSendesTilOppdrag() }) { + return + } + val mock = CucumberMock(dataFraCucumber, behandling.id) val beregnetUtbetalingsoppdrag = - UtbetalingsoppdragGenerator().lagUtbetalingsoppdrag( + mock.utbetalingsoppdragGenerator.lagUtbetalingsoppdrag( saksbehandlerId = "saksbehandlerId", vedtak = vedtak, - forrigeTilkjentYtelse = null, - nyTilkjentYtelse = this, - sisteAndelPerKjede = andelerTilkjentYtelse.tilSisteAndelPerAktørOgType().associateBy { IdentOgType(it.aktør.aktivFødselsnummer(), it.type.tilYtelseType()) }, + tilkjentYtelse = this, erSimulering = false, ) - oppdaterTilkjentYtelseMedUtbetalingsoppdrag( - tilkjentYtelse = this, - utbetalingsoppdrag = beregnetUtbetalingsoppdrag.utbetalingsoppdrag, - endretUtbetalingAndeler = emptyList(), - ) - oppdaterAndelerMedPeriodeOffset( - tilkjentYtelse = this, - andelerMedPeriodeId = beregnetUtbetalingsoppdrag.andeler, - ) + mock.oppdaterTilkjentYtelseService.oppdaterTilkjentYtelseMedUtbetalingsoppdrag(this, beregnetUtbetalingsoppdrag) } fun lagOvergangsstønad( diff --git a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/VedtaksperioderOgBegrunnelserStepDefinition.kt b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/VedtaksperioderOgBegrunnelserStepDefinition.kt index b5a4a99a95a..f2dbb9e8f66 100644 --- a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/VedtaksperioderOgBegrunnelserStepDefinition.kt +++ b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/VedtaksperioderOgBegrunnelserStepDefinition.kt @@ -259,7 +259,15 @@ class VedtaksperioderOgBegrunnelserStepDefinition { */ @Og("med andeler tilkjent ytelse") fun `med andeler tilkjent ytelse`(dataTable: DataTable) { - tilkjenteYtelser = lagTilkjentYtelse(dataTable = dataTable, behandlinger = behandlinger, personGrunnlag = persongrunnlag, vedtaksliste = vedtaksliste, behandlingTilForrigeBehandling = behandlingTilForrigeBehandling) + tilkjenteYtelser = + lagTilkjentYtelse( + dataFraCucumber = this, + dataTable = dataTable, + behandlinger = behandlinger, + personGrunnlag = persongrunnlag, + vedtaksliste = vedtaksliste, + behandlingTilForrigeBehandling = behandlingTilForrigeBehandling, + ) } /** @@ -556,7 +564,14 @@ class VedtaksperioderOgBegrunnelserStepDefinition { .sortedWith(compareBy({ it.aktør.aktørId }, { it.stønadFom }, { it.stønadTom })) val forventedeAndeler = - lagTilkjentYtelse(dataTable = dataTable, behandlinger = behandlinger, personGrunnlag = persongrunnlag, vedtaksliste = vedtaksliste, behandlingTilForrigeBehandling = behandlingTilForrigeBehandling)[behandlingId]!! + lagTilkjentYtelse( + dataFraCucumber = this, + dataTable = dataTable, + behandlinger = behandlinger, + personGrunnlag = persongrunnlag, + vedtaksliste = vedtaksliste, + behandlingTilForrigeBehandling = behandlingTilForrigeBehandling, + )[behandlingId]!! .andelerTilkjentYtelse .sortedWith(compareBy({ it.aktør.aktørId }, { it.stønadFom }, { it.stønadTom })) diff --git a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/domeneparser/DomeneparserUtil.kt b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/domeneparser/DomeneparserUtil.kt index 520a81d7b65..78235fecd14 100644 --- a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/domeneparser/DomeneparserUtil.kt +++ b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/domeneparser/DomeneparserUtil.kt @@ -30,6 +30,8 @@ enum class Domenebegrep( BEHANDLINGSTYPE("Behandlingstype"), BEHANDLINGSSTEG("Behandlingssteg"), UNDERKATEGORI("Underkategori"), + FEATURE_TOGGLE_ID("FeatureToggleId"), + ER_FEATURE_TOGGLE_TOGGLET_PÅ("Er togglet på"), } object DomeneparserUtil { diff --git a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/domeneparser/OppdragParser.kt b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/domeneparser/OppdragParser.kt index ca43a2cb474..773a97851ae 100644 --- a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/domeneparser/OppdragParser.kt +++ b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/domeneparser/OppdragParser.kt @@ -3,6 +3,7 @@ package no.nav.familie.ba.sak.cucumber.domeneparser import io.cucumber.datatable.DataTable import no.nav.familie.ba.sak.common.lagAndelTilkjentYtelse import no.nav.familie.ba.sak.cucumber.domeneparser.DomeneparserUtil.groupByBehandlingId +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.YtelsetypeBA 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.TilkjentYtelse @@ -18,31 +19,33 @@ object OppdragParser { dataTable: DataTable, behandlinger: Map, tilkjentYtelseId: Long = 0, - ): List { + ): MutableMap { var index = 0 var tilkjentYtelseIdIterator = tilkjentYtelseId - return dataTable.groupByBehandlingId().map { (behandlingId, rader) -> - - val behandling = behandlinger.getValue(behandlingId) - val andeler = parseAndelder(behandling, rader, index) - index += andeler.size - - val tilkjentYtelse = - TilkjentYtelse( - id = tilkjentYtelseIdIterator++, - behandling = behandling, - stønadFom = null, - stønadTom = null, - opphørFom = null, - opprettetDato = LocalDate.now(), - endretDato = LocalDate.now(), - utbetalingsoppdrag = null, - andelerTilkjentYtelse = andeler, - ) - andeler.forEach { it.tilkjentYtelse = tilkjentYtelse } - - tilkjentYtelse - } + return dataTable + .groupByBehandlingId() + .mapValues { (behandlingId, rader) -> + + val behandling = behandlinger.getValue(behandlingId) + val andeler = parseAndelder(behandling, rader, index) + index += andeler.size + + val tilkjentYtelse = + TilkjentYtelse( + id = tilkjentYtelseIdIterator++, + behandling = behandling, + stønadFom = null, + stønadTom = null, + opphørFom = null, + opprettetDato = LocalDate.now(), + endretDato = LocalDate.now(), + utbetalingsoppdrag = null, + andelerTilkjentYtelse = andeler, + ) + andeler.forEach { it.tilkjentYtelse = tilkjentYtelse } + + tilkjentYtelse + }.toMutableMap() } private fun parseAndelder( @@ -79,8 +82,8 @@ object OppdragParser { forrigePeriodeId = parseValgfriLong(DomenebegrepUtbetalingsoppdrag.FORRIGE_PERIODE_ID, it), sats = parseInt(DomenebegrepUtbetalingsoppdrag.BELØP, it), ytelse = - parseValgfriEnum(DomenebegrepUtbetalingsoppdrag.YTELSE_TYPE, it) - ?: YtelseType.ORDINÆR_BARNETRYGD, + parseValgfriEnum(DomenebegrepUtbetalingsoppdrag.YTELSE_TYPE, it) + ?: YtelsetypeBA.ORDINÆR_BARNETRYGD, fom = parseÅrMåned(Domenebegrep.FRA_DATO, it).atDay(1), tom = parseÅrMåned(Domenebegrep.TIL_DATO, it).atEndOfMonth(), opphør = parseValgfriÅrMåned(DomenebegrepUtbetalingsoppdrag.OPPHØRSDATO, it)?.atDay(1), @@ -164,7 +167,7 @@ data class ForventetUtbetalingsperiode( val periodeId: Long, val forrigePeriodeId: Long?, val sats: Int, - val ytelse: YtelseType, + val ytelse: YtelsetypeBA, val fom: LocalDate, val tom: LocalDate, val opphør: LocalDate?, diff --git a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/CucumberMock.kt b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/CucumberMock.kt index 67d247c1d8e..a144e28b976 100644 --- a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/CucumberMock.kt +++ b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/CucumberMock.kt @@ -14,8 +14,11 @@ import no.nav.familie.ba.sak.cucumber.mock.komponentMocks.mockVurderingsstrategi import no.nav.familie.ba.sak.integrasjoner.ecb.ECBService import no.nav.familie.ba.sak.integrasjoner.ef.EfSakRestClient import no.nav.familie.ba.sak.integrasjoner.infotrygd.InfotrygdService +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.BehandlingsinformasjonUtleder +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.EndretMigreringsdatoUtleder +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.KlassifiseringKorrigerer +import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.OppdaterTilkjentYtelseService import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGenerator -import no.nav.familie.ba.sak.integrasjoner.økonomi.utbetalingsoppdrag.UtbetalingsoppdragGeneratorService import no.nav.familie.ba.sak.integrasjoner.økonomi.ØkonomiService import no.nav.familie.ba.sak.internal.TestVerktøyService import no.nav.familie.ba.sak.kjerne.autovedtak.AutovedtakService @@ -70,11 +73,15 @@ import no.nav.familie.ba.sak.task.FerdigstillBehandlingTask import no.nav.familie.ba.sak.task.IverksettMotOppdragTask import no.nav.familie.ba.sak.task.OpprettTaskService import no.nav.familie.ba.sak.task.StatusFraOppdragTask +import no.nav.familie.felles.utbetalingsgenerator.Utbetalingsgenerator import org.slf4j.Logger import org.slf4j.LoggerFactory +import java.time.ZoneId val logger: Logger = LoggerFactory.getLogger("CucumberMock") +private val zoneId = ZoneId.of("Europe/Oslo") + class CucumberMock( dataFraCucumber: VedtaksperioderOgBegrunnelserStepDefinition, nyBehandlingId: Long, @@ -367,15 +374,33 @@ class CucumberMock( behandlingHentOgPersisterService = behandlingHentOgPersisterService, ) - val utbetalingsoppdragGeneratorService = - UtbetalingsoppdragGeneratorService( + val utbetalingsoppdragGenerator = + UtbetalingsoppdragGenerator( behandlingHentOgPersisterService = behandlingHentOgPersisterService, - behandlingService = behandlingService, tilkjentYtelseRepository = tilkjentYtelseRepository, andelTilkjentYtelseRepository = andelTilkjentYtelseRepository, - utbetalingsoppdragGenerator = UtbetalingsoppdragGenerator(), - endretUtbetalingAndelHentOgPersisterService = endretUtbetalingAndelHentOgPersisterService, unleashNextMedContextService = unleashNextMedContextService, + klassifiseringKorrigerer = + KlassifiseringKorrigerer( + tilkjentYtelseRepository, + unleashNextMedContextService, + ), + behandlingsinformasjonUtleder = + BehandlingsinformasjonUtleder( + EndretMigreringsdatoUtleder( + behandlingHentOgPersisterService, + behandlingService, + ), + clockProvider, + ), + utbetalingsgenerator = Utbetalingsgenerator(), + ) + + val oppdaterTilkjentYtelseService = + OppdaterTilkjentYtelseService( + endretUtbetalingAndelHentOgPersisterService, + tilkjentYtelseRepository, + clockProvider, ) val økonomiService = @@ -383,8 +408,9 @@ class CucumberMock( økonomiKlient = mockØkonomiKlient(), behandlingHentOgPersisterService = behandlingHentOgPersisterService, tilkjentYtelseValideringService = tilkjentYtelseValideringService, - utbetalingsoppdragGeneratorService = utbetalingsoppdragGeneratorService, + utbetalingsoppdragGenerator = utbetalingsoppdragGenerator, tilkjentYtelseRepository = tilkjentYtelseRepository, + oppdaterTilkjentYtelseService = oppdaterTilkjentYtelseService, ) val håndterIverksettMotØkonomiSteg = diff --git a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/komponentMocks/MockAndelTilkjentYtelseRepository.kt b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/komponentMocks/MockAndelTilkjentYtelseRepository.kt index 82b6b18bb44..a7f273908d1 100644 --- a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/komponentMocks/MockAndelTilkjentYtelseRepository.kt +++ b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/komponentMocks/MockAndelTilkjentYtelseRepository.kt @@ -3,25 +3,33 @@ import io.mockk.every import io.mockk.mockk import no.nav.familie.ba.sak.cucumber.VedtaksperioderOgBegrunnelserStepDefinition +import no.nav.familie.ba.sak.kjerne.behandling.domene.Behandling import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingStatus import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelse import no.nav.familie.ba.sak.kjerne.beregning.domene.AndelTilkjentYtelseRepository +import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse -fun mockAndelTilkjentYtelseRepository(dataFraCucumber: VedtaksperioderOgBegrunnelserStepDefinition): AndelTilkjentYtelseRepository { +fun mockAndelTilkjentYtelseRepository(dataFraCucumber: VedtaksperioderOgBegrunnelserStepDefinition): AndelTilkjentYtelseRepository = + mockAndelTilkjentYtelseRepository(dataFraCucumber.tilkjenteYtelser, dataFraCucumber.behandlinger) + +fun mockAndelTilkjentYtelseRepository( + tilkjenteYtelser: MutableMap, + behandlinger: MutableMap, +): AndelTilkjentYtelseRepository { val andelTilkjentYtelseRepository = mockk() every { andelTilkjentYtelseRepository.finnAndelerTilkjentYtelseForBehandling(any()) } answers { val behandlingId = firstArg() - dataFraCucumber.tilkjenteYtelser[behandlingId]?.andelerTilkjentYtelse?.toList() ?: emptyList() + tilkjenteYtelser[behandlingId]?.andelerTilkjentYtelse?.toList() ?: emptyList() } every { andelTilkjentYtelseRepository.hentSisteAndelPerIdentOgType(any()) } answers { val fagsakId = firstArg() val behandlingId = - dataFraCucumber.behandlinger + behandlinger .filter { it.value.fagsak.id == fagsakId } .filter { it.value.status == BehandlingStatus.AVSLUTTET } .maxByOrNull { it.value.id } ?.key - val andelerPåBehandling = dataFraCucumber.tilkjenteYtelser[behandlingId]?.andelerTilkjentYtelse ?: emptyList() + val andelerPåBehandling = tilkjenteYtelser[behandlingId]?.andelerTilkjentYtelse ?: emptyList() andelerPåBehandling.tilSisteAndelPerAktørOgType() } return andelTilkjentYtelseRepository diff --git a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/komponentMocks/MockTilkjentYtelseRepository.kt b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/komponentMocks/MockTilkjentYtelseRepository.kt index 53fa55954b9..f406e723864 100644 --- a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/komponentMocks/MockTilkjentYtelseRepository.kt +++ b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/cucumber/mock/komponentMocks/MockTilkjentYtelseRepository.kt @@ -36,5 +36,13 @@ fun mockTilkjentYtelseRepository(dataFraCucumber: VedtaksperioderOgBegrunnelserS val behandlingId = firstArg() dataFraCucumber.tilkjenteYtelser[behandlingId] } + every { tilkjentYtelseRepository.harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd(any()) } answers { + val fagsakId = firstArg() + dataFraCucumber.tilkjenteYtelser + .map { it.value } + .filter { it.behandling.fagsak.id == fagsakId } + .mapNotNull { it.utbetalingsoppdrag } + .any { it.contains("\"klassifisering\":\"BAUTV-OP\"") } + } return tilkjentYtelseRepository } diff --git a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/BeregningTestUtil.kt b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/BeregningTestUtil.kt index bc857098fe6..a860faa5cf5 100644 --- a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/BeregningTestUtil.kt +++ b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/BeregningTestUtil.kt @@ -5,9 +5,12 @@ import no.nav.familie.ba.sak.kjerne.beregning.domene.TilkjentYtelse import no.nav.familie.felles.utbetalingsgenerator.domain.IdentOgType object BeregningTestUtil { - fun sisteAndelPerIdentNy(tilkjenteYtelser: List): Map = + fun sisteAndelPerIdentNy( + tilkjenteYtelser: List, + skalBrukeNyKlassekodeForUtvidetBarnetrygd: Boolean, + ): Map = tilkjenteYtelser .flatMap { it.andelerTilkjentYtelse } - .groupBy { IdentOgType(it.aktør.aktivFødselsnummer(), it.type.tilYtelseType()) } + .groupBy { IdentOgType(it.aktør.aktivFødselsnummer(), it.type.tilYtelseType(skalBrukeNyKlassekodeForUtvidetBarnetrygd)) } .mapValues { it.value.maxBy { it.periodeOffset ?: 0 } } } diff --git a/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/TilkjentYtelseRepositoryTest.kt b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/TilkjentYtelseRepositoryTest.kt new file mode 100644 index 00000000000..bdbeefbd0e0 --- /dev/null +++ b/src/test/integrasjonstester/kotlin/no/nav/familie/ba/sak/kjerne/beregning/domene/TilkjentYtelseRepositoryTest.kt @@ -0,0 +1,72 @@ +package no.nav.familie.ba.sak.kjerne.beregning.domene + +import no.nav.familie.ba.sak.common.lagBehandling +import no.nav.familie.ba.sak.common.lagFagsak +import no.nav.familie.ba.sak.common.lagTilkjentYtelse +import no.nav.familie.ba.sak.common.randomAktør +import no.nav.familie.ba.sak.config.AbstractSpringIntegrationTest +import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingRepository +import no.nav.familie.ba.sak.kjerne.fagsak.FagsakRepository +import no.nav.familie.ba.sak.kjerne.personident.AktørIdRepository +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired + +class TilkjentYtelseRepositoryTest( + @Autowired + private val aktørIdRepository: AktørIdRepository, + @Autowired + private val tilkjentYtelseRepository: TilkjentYtelseRepository, + @Autowired + private val fagsakRepository: FagsakRepository, + @Autowired + private val behandlingRepository: BehandlingRepository, +) : AbstractSpringIntegrationTest() { + @Nested + inner class HarFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygdTest { + @Test + fun `skal returnere true hvis klassifisering er BAUTV-OP`() { + // Arrange + val aktør = aktørIdRepository.save(randomAktør()) + val fagsak = fagsakRepository.save(lagFagsak(aktør = aktør)) + val behandling = behandlingRepository.save(lagBehandling(fagsak = fagsak)) + + tilkjentYtelseRepository.save( + lagTilkjentYtelse( + behandling = behandling, + utbetalingsoppdrag = "\"klassifisering\":\"BAUTV-OP\"", + ), + ) + + // Act + val harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd = + tilkjentYtelseRepository.harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd(fagsak.id) + + // Assert + assertThat(harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd).isTrue() + } + + @Test + fun `skal returnere false hvis klassifisering ikke er BAUTV-OP`() { + // Arrange + val aktør = aktørIdRepository.save(randomAktør()) + val fagsak = fagsakRepository.save(lagFagsak(aktør = aktør)) + val behandling = behandlingRepository.save(lagBehandling(fagsak = fagsak)) + + tilkjentYtelseRepository.save( + lagTilkjentYtelse( + behandling = behandling, + utbetalingsoppdrag = "\"klassifisering\":\"BATR\"", + ), + ) + + // Act + val harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd = + tilkjentYtelseRepository.harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd(fagsak.id) + + // Assert + assertThat(harFagsakTattIBrukNyKlassekodeForUtvidetBarnetrygd).isFalse() + } + } +} diff --git a/src/test/resources/no/nav/familie/ba/sak/cucumber/oppdrag/endretMigreringsdato.feature b/src/test/resources/no/nav/familie/ba/sak/cucumber/oppdrag/endretMigreringsdato.feature index c92eb0bc89b..00d4b500c73 100644 --- a/src/test/resources/no/nav/familie/ba/sak/cucumber/oppdrag/endretMigreringsdato.feature +++ b/src/test/resources/no/nav/familie/ba/sak/cucumber/oppdrag/endretMigreringsdato.feature @@ -8,13 +8,13 @@ Egenskap: Utbetalingsoppdrag: Endring av migreringsdato Gitt følgende behandlingsinformasjon | BehandlingId | Endret migreringsdato | - | 1 | 03.2021 | - | 2 | 01.2021 | + | 1 | 02.2021 | + | 2 | 12.2020 | Gitt følgende tilkjente ytelser - | BehandlingId | Fra dato | Til dato | Beløp | - | 1 | 03.2021 | 03.2021 | 700 | - | 2 | 03.2021 | 03.2021 | 700 | + | BehandlingId | Fra dato | Til dato | Beløp | Behandlingstype | + | 1 | 03.2021 | 03.2021 | 700 | MIGRERING_FRA_INFOTRYGD | + | 2 | 03.2021 | 03.2021 | 700 | MIGRERING_FRA_INFOTRYGD | Når beregner utbetalingsoppdrag @@ -29,13 +29,13 @@ Egenskap: Utbetalingsoppdrag: Endring av migreringsdato Gitt følgende behandlingsinformasjon | BehandlingId | Endret migreringsdato | - | 1 | 03.2021 | - | 2 | 04.2021 | + | 1 | 02.2021 | + | 2 | 03.2021 | Gitt følgende tilkjente ytelser - | BehandlingId | Fra dato | Til dato | Beløp | - | 1 | 03.2021 | 03.2021 | 700 | - | 2 | 03.2021 | 03.2021 | 700 | + | BehandlingId | Fra dato | Til dato | Beløp | Behandlingstype | + | 1 | 03.2021 | 03.2021 | 700 | MIGRERING_FRA_INFOTRYGD | + | 2 | 03.2021 | 03.2021 | 700 | MIGRERING_FRA_INFOTRYGD | Når beregner utbetalingsoppdrag diff --git a/src/test/resources/no/nav/familie/ba/sak/cucumber/oppdrag/opphoer.feature b/src/test/resources/no/nav/familie/ba/sak/cucumber/oppdrag/opphoer.feature index bc6772baf61..121600270c0 100644 --- a/src/test/resources/no/nav/familie/ba/sak/cucumber/oppdrag/opphoer.feature +++ b/src/test/resources/no/nav/familie/ba/sak/cucumber/oppdrag/opphoer.feature @@ -161,3 +161,44 @@ Egenskap: Utbetalingsoppdrag: Opphør | 2 | 04.2021 | 08.2021 | 06.2021 | 700 | ENDR | Ja | 1 | 0 | | 3 | 04.2021 | 08.2021 | 04.2021 | 700 | ENDR | Ja | 1 | 0 | + Scenario: Ved opphør av utvidet barnetrygd i fagsak som ikke er over på ny klassekode skal opphøret gjøres på gammel klassekode + + Gitt følgende feature toggles + | BehandlingId | FeatureToggleId | Er togglet på | + | 1 | familie-ba-sak.skal-bruke-ny-klassekode-for-utvidet-barnetrygd | Nei | + | 2 | familie-ba-sak.skal-bruke-ny-klassekode-for-utvidet-barnetrygd | Ja | + + Gitt følgende tilkjente ytelser + | BehandlingId | Fra dato | Til dato | Beløp | Ytelse | + | 1 | 03.2021 | 08.2021 | 700 | UTVIDET_BARNETRYGD | + | 2 | 03.2021 | 04.2021 | 700 | UTVIDET_BARNETRYGD | + | 2 | 07.2021 | 08.2021 | 700 | UTVIDET_BARNETRYGD | + + Når beregner utbetalingsoppdrag + + Så forvent følgende utbetalingsoppdrag + | BehandlingId | Fra dato | Til dato | Opphørsdato | Beløp | Kode endring | Er endring | Periode id | Forrige periode id | Ytelse | + | 1 | 03.2021 | 08.2021 | | 700 | NY | Nei | 0 | | UTVIDET_BARNETRYGD_GAMMEL | + | 2 | 03.2021 | 08.2021 | 05.2021 | 700 | ENDR | Ja | 0 | | UTVIDET_BARNETRYGD_GAMMEL | + | 2 | 07.2021 | 08.2021 | | 700 | ENDR | Nei | 1 | 0 | UTVIDET_BARNETRYGD | + + Scenario: Ved opphør av utvidet barnetrygd i fagsak som er over på ny klassekode skal opphøret gjøres på ny klassekode + + Gitt følgende feature toggles + | BehandlingId | FeatureToggleId | Er togglet på | + | 1 | familie-ba-sak.skal-bruke-ny-klassekode-for-utvidet-barnetrygd | Ja | + | 2 | familie-ba-sak.skal-bruke-ny-klassekode-for-utvidet-barnetrygd | Ja | + + Gitt følgende tilkjente ytelser + | BehandlingId | Fra dato | Til dato | Beløp | Ytelse | + | 1 | 03.2021 | 08.2021 | 700 | UTVIDET_BARNETRYGD | + | 2 | 03.2021 | 04.2021 | 700 | UTVIDET_BARNETRYGD | + | 2 | 07.2021 | 08.2021 | 700 | UTVIDET_BARNETRYGD | + + Når beregner utbetalingsoppdrag + + Så forvent følgende utbetalingsoppdrag + | BehandlingId | Fra dato | Til dato | Opphørsdato | Beløp | Kode endring | Er endring | Periode id | Forrige periode id | Ytelse | + | 1 | 03.2021 | 08.2021 | | 700 | NY | Nei | 0 | | UTVIDET_BARNETRYGD | + | 2 | 03.2021 | 08.2021 | 05.2021 | 700 | ENDR | Ja | 0 | | UTVIDET_BARNETRYGD | + | 2 | 07.2021 | 08.2021 | | 700 | ENDR | Nei | 1 | 0 | UTVIDET_BARNETRYGD |