Skip to content

Commit

Permalink
Filtrer bort valutakurser med fremtidig fom eller tom (#4888)
Browse files Browse the repository at this point in the history
### 💰 Hva skal gjøres, og hvorfor?

Favro: NAV-22931

Som en følge av en tidligere bug, der saksbehandler kunne legge inn
kompetanse frem i tid, er det flere behandlinger som har fått
valutakurser frem i tid som saksbehandler ikke har tilgang til å endre.

Fikser problemet ved å:
- Filtrere bort valutakurser som har fom senere enn inneværende måned
- Sette `tom = null` i valutakurser som har tom lik eller senere
inneværende måned

### ✅ Checklist
_Har du husket alle punktene i listen?_
- [ ] Jeg har testet mine endringer i henhold til akseptansekriteriene
🕵️
- [ ] Jeg har config- eller sql-endringer. I så fall, husk manuell
deploy til miljø for å verifisere endringene.
- [x] Jeg har skrevet tester. Hvis du ikke har skrevet tester, beskriv
hvorfor under 👇

### 💬 Ønsker du en muntlig gjennomgang?
- [ ] Ja
- [x] Nei
  • Loading branch information
MagnusTonnessen authored Nov 13, 2024
1 parent 74881e6 commit 37cbe2d
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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<Valutakurs>,
private val utenlandskPeriodebeløpRepository: FinnPeriodeOgBarnSkjemaRepository<UtenlandskPeriodebeløp>,
endringsabonnenter: Collection<PeriodeOgBarnSkjemaEndringAbonnent<Valutakurs>>,
private val clockProvider: ClockProvider,
) : PeriodeOgBarnSkjemaEndringAbonnent<UtenlandskPeriodebeløp> {
val skjemaService =
PeriodeOgBarnSkjemaService(
Expand Down Expand Up @@ -51,6 +55,7 @@ class TilpassValutakurserTilUtenlandskePeriodebeløpService(
tilpassValutakurserTilUtenlandskePeriodebeløp(
forrigeValutakurser,
gjeldendeUtenlandskePeriodebeløp,
clockProvider,
).medBehandlingId(behandlingId)

skjemaService.lagreDifferanseOgVarsleAbonnenter(behandlingId, forrigeValutakurser, oppdaterteValutakurser)
Expand All @@ -60,12 +65,14 @@ class TilpassValutakurserTilUtenlandskePeriodebeløpService(
internal fun tilpassValutakurserTilUtenlandskePeriodebeløp(
forrigeValutakurser: Collection<Valutakurs>,
gjeldendeUtenlandskePeriodebeløp: Collection<UtenlandskPeriodebeløp>,
clockProvider: ClockProvider,
): Collection<Valutakurs> {
val barnasUtenlandskePeriodebeløpTidslinjer =
gjeldendeUtenlandskePeriodebeløp
.tilSeparateTidslinjerForBarna()

return forrigeValutakurser
val korrigerteValutakurser = korrigerValutakurserMedFremdtidigTom(forrigeValutakurser, clockProvider)
return korrigerteValutakurser
.tilSeparateTidslinjerForBarna()
.outerJoin(barnasUtenlandskePeriodebeløpTidslinjer) { valutakurs, utenlandskPeriodebeløp ->
when {
Expand All @@ -76,3 +83,17 @@ internal fun tilpassValutakurserTilUtenlandskePeriodebeløp(
}
}.tilSkjemaer()
}

private fun korrigerValutakurserMedFremdtidigTom(
gjeldendeValutakurser: Iterable<Valutakurs>,
clockProvider: ClockProvider,
): Iterable<Valutakurs> =
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
}
}
Original file line number Diff line number Diff line change
@@ -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())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<Valutakurs> = mockPeriodeBarnSkjemaRepository()
val utenlandskPeriodebeløpRepository: PeriodeOgBarnSkjemaRepository<UtenlandskPeriodebeløp> = 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<TilpassDifferanseberegningEtterValutakursService>()

val valutakursService = ValutakursService(valutakursRepository, emptyList())
Expand Down
Original file line number Diff line number Diff line change
@@ -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:
Expand All @@ -16,10 +20,12 @@ import org.junit.jupiter.api.Test
* '<siffer>': 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`() {
Expand All @@ -44,7 +50,7 @@ class TilpassValutakursTilUtenlandskePeridebeløpTest {
.bygg()

val faktiskeValutakurser =
tilpassValutakurserTilUtenlandskePeriodebeløp(gjeldendeValutakurser, utenlandskePeriodebeløp)
tilpassValutakurserTilUtenlandskePeriodebeløp(gjeldendeValutakurser, utenlandskePeriodebeløp, clockProvider)

assertEqualsUnordered(forventedeValutakurser, faktiskeValutakurser)
}
Expand All @@ -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)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -28,6 +29,7 @@ import java.time.LocalDate
import java.time.YearMonth

internal class ValutakursServiceTest {
val clockProvider = TestClockProvider()
val valutakursRepository: PeriodeOgBarnSkjemaRepository<Valutakurs> = mockPeriodeBarnSkjemaRepository()
val utenlandskPeriodebeløpRepository: UtenlandskPeriodebeløpRepository = mockk()

Expand All @@ -42,6 +44,7 @@ internal class ValutakursServiceTest {
valutakursRepository,
utenlandskPeriodebeløpRepository,
emptyList(),
clockProvider,
)

@BeforeEach
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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)

Expand Down

0 comments on commit 37cbe2d

Please sign in to comment.