diff --git "a/src/main/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/endringsabonnement/TilpassValutakurserTilUtenlandskePeriodebel\303\270pService.kt" "b/src/main/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/endringsabonnement/TilpassValutakurserTilUtenlandskePeriodebel\303\270pService.kt" index aefbcb09fa0..d8eeede8c75 100644 --- "a/src/main/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/endringsabonnement/TilpassValutakurserTilUtenlandskePeriodebel\303\270pService.kt" +++ "b/src/main/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/endringsabonnement/TilpassValutakurserTilUtenlandskePeriodebel\303\270pService.kt" @@ -1,5 +1,7 @@ package no.nav.familie.ba.sak.kjerne.eøs.endringsabonnement +import no.nav.familie.ba.sak.common.ClockProvider +import no.nav.familie.ba.sak.common.isSameOrAfter import no.nav.familie.ba.sak.kjerne.eøs.felles.BehandlingId import no.nav.familie.ba.sak.kjerne.eøs.felles.FinnPeriodeOgBarnSkjemaRepository import no.nav.familie.ba.sak.kjerne.eøs.felles.PeriodeOgBarnSkjemaEndringAbonnent @@ -13,12 +15,14 @@ import no.nav.familie.ba.sak.kjerne.eøs.valutakurs.Valutakurs import no.nav.familie.ba.sak.kjerne.tidslinje.komposisjon.outerJoin import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional +import java.time.YearMonth @Service class TilpassValutakurserTilUtenlandskePeriodebeløpService( valutakursRepository: PeriodeOgBarnSkjemaRepository, private val utenlandskPeriodebeløpRepository: FinnPeriodeOgBarnSkjemaRepository, endringsabonnenter: Collection>, + private val clockProvider: ClockProvider, ) : PeriodeOgBarnSkjemaEndringAbonnent { val skjemaService = PeriodeOgBarnSkjemaService( @@ -51,6 +55,7 @@ class TilpassValutakurserTilUtenlandskePeriodebeløpService( tilpassValutakurserTilUtenlandskePeriodebeløp( forrigeValutakurser, gjeldendeUtenlandskePeriodebeløp, + clockProvider, ).medBehandlingId(behandlingId) skjemaService.lagreDifferanseOgVarsleAbonnenter(behandlingId, forrigeValutakurser, oppdaterteValutakurser) @@ -60,12 +65,14 @@ class TilpassValutakurserTilUtenlandskePeriodebeløpService( internal fun tilpassValutakurserTilUtenlandskePeriodebeløp( forrigeValutakurser: Collection, gjeldendeUtenlandskePeriodebeløp: Collection, + clockProvider: ClockProvider, ): Collection { val barnasUtenlandskePeriodebeløpTidslinjer = gjeldendeUtenlandskePeriodebeløp .tilSeparateTidslinjerForBarna() - return forrigeValutakurser + val korrigerteValutakurser = korrigerValutakurserMedFremdtidigTom(forrigeValutakurser, clockProvider) + return korrigerteValutakurser .tilSeparateTidslinjerForBarna() .outerJoin(barnasUtenlandskePeriodebeløpTidslinjer) { valutakurs, utenlandskPeriodebeløp -> when { @@ -76,3 +83,17 @@ internal fun tilpassValutakurserTilUtenlandskePeriodebeløp( } }.tilSkjemaer() } + +private fun korrigerValutakurserMedFremdtidigTom( + gjeldendeValutakurser: Iterable, + clockProvider: ClockProvider, +): Iterable = + gjeldendeValutakurser + .mapNotNull { + val inneværendeMåned = YearMonth.now(clockProvider.get()) + when { + it.fom != null && it.fom.isAfter(inneværendeMåned) -> null + it.tom != null && it.tom.isSameOrAfter(inneværendeMåned) -> it.copy(tom = null) + else -> it + } + } 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 ecd895c092c..6098b2ff26e 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 @@ -1,10 +1,27 @@ package no.nav.familie.ba.sak 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 class TestClockProvider( - private val clock: Clock, + private val clock: Clock = Clock.systemDefaultZone(), ) : ClockProvider { override fun get(): Clock = clock + + companion object { + fun lagClockProviderMedFastTidspunkt(localDateTime: LocalDateTime): TestClockProvider = + TestClockProvider(Clock.fixed(localDateTime.toInstant(ZoneOffset.UTC), ZoneId.systemDefault())) + + fun lagClockProviderMedFastTidspunkt(localDate: LocalDate): TestClockProvider = + lagClockProviderMedFastTidspunkt(localDate.atStartOfDay()) + + fun lagClockProviderMedFastTidspunkt(yearMonth: YearMonth): TestClockProvider = + lagClockProviderMedFastTidspunkt(yearMonth.toLocalDate()) + } } diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/AutomatiskOppdaterValutakursServiceTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/AutomatiskOppdaterValutakursServiceTest.kt" index 2e7c5f8139a..c8ca736c7d2 100644 --- "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/AutomatiskOppdaterValutakursServiceTest.kt" +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/AutomatiskOppdaterValutakursServiceTest.kt" @@ -3,6 +3,7 @@ import io.mockk.every import io.mockk.justRun import io.mockk.mockk +import no.nav.familie.ba.sak.TestClockProvider import no.nav.familie.ba.sak.common.MockedDateProvider import no.nav.familie.ba.sak.common.lagBehandling import no.nav.familie.ba.sak.common.tilfeldigPerson @@ -37,10 +38,11 @@ import java.time.LocalDate @TestInstance(TestInstance.Lifecycle.PER_CLASS) class AutomatiskOppdaterValutakursServiceTest { val dagensDato = LocalDate.of(2020, 9, 15) + val clockProvider = TestClockProvider() val valutakursRepository: PeriodeOgBarnSkjemaRepository = mockPeriodeBarnSkjemaRepository() val utenlandskPeriodebeløpRepository: PeriodeOgBarnSkjemaRepository = mockPeriodeBarnSkjemaRepository() - val tilpassValutakurserTilUtenlandskePeriodebeløpService = TilpassValutakurserTilUtenlandskePeriodebeløpService(valutakursRepository = valutakursRepository, utenlandskPeriodebeløpRepository, emptyList()) + val tilpassValutakurserTilUtenlandskePeriodebeløpService = TilpassValutakurserTilUtenlandskePeriodebeløpService(valutakursRepository = valutakursRepository, utenlandskPeriodebeløpRepository, emptyList(), clockProvider) val tilpassDifferanseberegningEtterValutakursService = mockk() val valutakursService = ValutakursService(valutakursRepository, emptyList()) diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/TilpassValutakursTilUtenlandskePeridebel\303\270pTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/TilpassValutakursTilUtenlandskePeridebel\303\270pTest.kt" index 85d220473bb..ce3b3d2104a 100644 --- "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/TilpassValutakursTilUtenlandskePeridebel\303\270pTest.kt" +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/TilpassValutakursTilUtenlandskePeridebel\303\270pTest.kt" @@ -1,12 +1,16 @@ package no.nav.familie.ba.sak.kjerne.eøs.valutakurs +import no.nav.familie.ba.sak.TestClockProvider.Companion.lagClockProviderMedFastTidspunkt import no.nav.familie.ba.sak.common.tilfeldigPerson import no.nav.familie.ba.sak.kjerne.eøs.assertEqualsUnordered import no.nav.familie.ba.sak.kjerne.eøs.endringsabonnement.tilpassValutakurserTilUtenlandskePeriodebeløp import no.nav.familie.ba.sak.kjerne.eøs.util.UtenlandskPeriodebeløpBuilder import no.nav.familie.ba.sak.kjerne.eøs.util.ValutakursBuilder import no.nav.familie.ba.sak.kjerne.tidslinje.util.jan +import no.nav.familie.ba.sak.kjerne.tidslinje.util.nov +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test +import java.time.YearMonth /** * Syntaks: @@ -16,10 +20,12 @@ import org.junit.jupiter.api.Test * '': Skjema har oppgitt kurs og valutakode */ class TilpassValutakursTilUtenlandskePeridebeløpTest { - val jan2020 = jan(2020) - val barn1 = tilfeldigPerson() - val barn2 = tilfeldigPerson() - val barn3 = tilfeldigPerson() + private val clockProvider = lagClockProviderMedFastTidspunkt(YearMonth.of(2021, 1)) + private val jan2020 = jan(2020) + private val nov2020 = nov(2020) + private val barn1 = tilfeldigPerson() + private val barn2 = tilfeldigPerson() + private val barn3 = tilfeldigPerson() @Test fun `test tilpasning av valutakurser mot kompleks endring av utenlandsk valutabeløp`() { @@ -44,7 +50,7 @@ class TilpassValutakursTilUtenlandskePeridebeløpTest { .bygg() val faktiskeValutakurser = - tilpassValutakurserTilUtenlandskePeriodebeløp(gjeldendeValutakurser, utenlandskePeriodebeløp) + tilpassValutakurserTilUtenlandskePeriodebeløp(gjeldendeValutakurser, utenlandskePeriodebeløp, clockProvider) assertEqualsUnordered(forventedeValutakurser, faktiskeValutakurser) } @@ -67,8 +73,31 @@ class TilpassValutakursTilUtenlandskePeridebeløpTest { .bygg() val faktiskeValutakurser = - tilpassValutakurserTilUtenlandskePeriodebeløp(gjeldendeValutakurser, utenlandskePeriodebeløp) + tilpassValutakurserTilUtenlandskePeriodebeløp(gjeldendeValutakurser, utenlandskePeriodebeløp, clockProvider) assertEqualsUnordered(forventedeValutakurser, faktiskeValutakurser) } + + @Test + fun `test at ikke fremtidige valutakurser genereres`() { + val gjeldendeValutakurser = + ValutakursBuilder(nov2020) + .medKurs("12345", "PLN", barn1) + .bygg() + + val utenlandskePeriodebeløp = + UtenlandskPeriodebeløpBuilder(nov2020) + .medBeløp("12345>", "PLN", "PL", barn1) + .bygg() + + val forventedeValutakurser = + ValutakursBuilder(nov2020) + .medKurs("123>", "PLN", barn1) + .bygg() + + val faktiskeValutakurser = + tilpassValutakurserTilUtenlandskePeriodebeløp(gjeldendeValutakurser, utenlandskePeriodebeløp, clockProvider) + + assertThat(faktiskeValutakurser).isEqualTo(forventedeValutakurser) + } } diff --git "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/ValutakursServiceTest.kt" "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/ValutakursServiceTest.kt" index 2dbdb933a28..3e1f3fa5694 100644 --- "a/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/ValutakursServiceTest.kt" +++ "b/src/test/enhetstester/kotlin/no/nav/familie/ba/sak/kjerne/e\303\270s/valutakurs/ValutakursServiceTest.kt" @@ -2,6 +2,7 @@ package no.nav.familie.ba.sak.kjerne.eøs.valutakurs import io.mockk.every import io.mockk.mockk +import no.nav.familie.ba.sak.TestClockProvider import no.nav.familie.ba.sak.common.tilfeldigPerson import no.nav.familie.ba.sak.kjerne.eøs.assertEqualsUnordered import no.nav.familie.ba.sak.kjerne.eøs.endringsabonnement.TilpassValutakurserTilUtenlandskePeriodebeløpService @@ -28,6 +29,7 @@ import java.time.LocalDate import java.time.YearMonth internal class ValutakursServiceTest { + val clockProvider = TestClockProvider() val valutakursRepository: PeriodeOgBarnSkjemaRepository = mockPeriodeBarnSkjemaRepository() val utenlandskPeriodebeløpRepository: UtenlandskPeriodebeløpRepository = mockk() @@ -42,6 +44,7 @@ internal class ValutakursServiceTest { valutakursRepository, utenlandskPeriodebeløpRepository, emptyList(), + clockProvider, ) @BeforeEach 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 c0c17b87f0b..67d247c1d8e 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 @@ -3,6 +3,7 @@ import io.mockk.mockk import io.mockk.spyk import kotlinx.coroutines.CoroutineScope +import no.nav.familie.ba.sak.TestClockProvider.Companion.lagClockProviderMedFastTidspunkt import no.nav.familie.ba.sak.common.MockedDateProvider import no.nav.familie.ba.sak.cucumber.VedtaksperioderOgBegrunnelserStepDefinition import no.nav.familie.ba.sak.cucumber.mock.komponentMocks.mockBehandlingMigreringsinfoRepository @@ -82,6 +83,7 @@ class CucumberMock( ecbService: ECBService = mockEcbService(dataFraCucumber), scope: CoroutineScope? = null, ) { + val clockProvider = lagClockProviderMedFastTidspunkt(dataFraCucumber.dagensDato) val mockedDateProvider = MockedDateProvider(dataFraCucumber.dagensDato) val persongrunnlagService = mockPersongrunnlagService(dataFraCucumber) val fagsakService = mockFagsakService(dataFraCucumber) @@ -264,7 +266,7 @@ class CucumberMock( val valutakursAbonnenter = listOf(tilpassDifferanseberegningEtterValutakursService, tilbakestillBehandlingFraValutakursEndringService) - val tilpassValutakurserTilUtenlandskePeriodebeløpService = TilpassValutakurserTilUtenlandskePeriodebeløpService(valutakursRepository = valutakursRepository, utenlandskPeriodebeløpRepository = utenlandskPeriodebeløpRepository, endringsabonnenter = valutakursAbonnenter) + val tilpassValutakurserTilUtenlandskePeriodebeløpService = TilpassValutakurserTilUtenlandskePeriodebeløpService(valutakursRepository = valutakursRepository, utenlandskPeriodebeløpRepository = utenlandskPeriodebeløpRepository, endringsabonnenter = valutakursAbonnenter, clockProvider = clockProvider) val tilbakestillBehandlingFraUtenlandskPeriodebeløpEndringService = TilbakestillBehandlingFraUtenlandskPeriodebeløpEndringService(tilbakestillBehandlingTilBehandlingsresultatService = tilbakestillBehandlingTilBehandlingsresultatService)