Skip to content

Commit

Permalink
Kun lag automatiske valutakurser etter praksisendring (#4602)
Browse files Browse the repository at this point in the history
### 💰 Hva skal gjøres, og hvorfor?

[Favro](https://favro.com/organization/98c34fb974ce445eac854de0/1844bbac3b6605eacc8f5543?card=NAV-21290)

For å ikke overskrive gjennomførte årlige kontroller tilbake i tid, og
ikke gå på tvers med rutiner som NFP har innført skal vi kun lage
automatiske valutakurser tilbake til januar 2023.
  • Loading branch information
halvorbmundal authored Jun 4, 2024
1 parent 98d55a6 commit ece850c
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import java.time.YearMonth

val DATO_FOR_PRAKSISENDRING_AUTOMATISK_VALUTAJUSTERING = YearMonth.of(2023, 1)

@Service
class AutomatiskOppdaterValutakursService(
private val valutakursService: ValutakursService,
Expand Down Expand Up @@ -75,7 +77,6 @@ class AutomatiskOppdaterValutakursService(
endringstidspunkt = vedtaksperiodeService.finnEndringstidspunktForBehandling(behandlingId.id).toYearMonth(),
)

@Transactional
private fun oppdaterValutakurserEtterEndringstidspunkt(
behandling: Behandling,
utenlandskePeriodebeløp: Collection<UtenlandskPeriodebeløp>,
Expand All @@ -96,20 +97,20 @@ class AutomatiskOppdaterValutakursService(
utenlandskePeriodebeløp
.filtrerErUtfylt()
.flatMap { utenlandskPeriodebeløp ->
utenlandskPeriodebeløp.tilAutomatiskOppdaterteValutakurserEtter(maxOf(månedEtterSisteManuellePostering, endringstidspunkt))
utenlandskPeriodebeløp.tilAutomatiskOppdaterteValutakurserEtter(maxOf(endringstidspunkt, månedEtterSisteManuellePostering, DATO_FOR_PRAKSISENDRING_AUTOMATISK_VALUTAJUSTERING))
}

valutakursService.oppdaterValutakurser(BehandlingId(behandling.id), automatiskGenererteValutakurser)
}

private fun UtfyltUtenlandskPeriodebeløp.tilAutomatiskOppdaterteValutakurserEtter(
endringstidspunkt: YearMonth,
nedForTidligsteTillatteAutomatiskeValutakurs: YearMonth,
): List<Valutakurs> {
val start = maxOf(endringstidspunkt, fom)
val start = maxOf(månedForTidligsteTillatteAutomatiskeValutakurs, fom)
val denneMåneden = localDateProvider.now().toYearMonth()
val slutt = tom ?: denneMåneden

if (endringstidspunkt.isAfter(slutt)) return emptyList()
if (månedForTidligsteTillatteAutomatiskeValutakurs.isAfter(slutt)) return emptyList()

return start.rangeTo(slutt).map { måned ->
val sisteVirkedagForrigeMåned = måned.minusMonths(1).tilSisteVirkedag()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import no.nav.familie.ba.sak.kjerne.grunnlag.personopplysninger.PersonType
import no.nav.familie.ba.sak.kjerne.simulering.SimuleringService
import no.nav.familie.ba.sak.kjerne.tidslinje.tidspunkt.tilLocalDate
import no.nav.familie.ba.sak.kjerne.tidslinje.util.jan
import no.nav.familie.ba.sak.kjerne.tidslinje.util.sep
import no.nav.familie.ba.sak.kjerne.vedtak.vedtaksperiode.VedtaksperiodeService
import no.nav.familie.kontrakter.felles.simulering.FagOmrådeKode
import org.assertj.core.api.Assertions.assertThat
Expand Down Expand Up @@ -85,27 +86,27 @@ class AutomatiskOppdaterValutakursServiceTest {

@Test
fun `oppdaterValutakurserEtterEndringstidspunkt skal automatisk hente valutakurser hver måned etter endringstidspunktet`() {
UtenlandskPeriodebeløpBuilder(jan(2020), behandlingId)
UtenlandskPeriodebeløpBuilder(jan(2023), behandlingId)
.medBeløp("777777777", "EUR", "N", barn1, barn2, barn3)
.lagreTil(utenlandskPeriodebeløpRepository)

ValutakursBuilder(jan(2020), behandlingId)
ValutakursBuilder(jan(2023), behandlingId)
.medKurs("111111111", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.MANUELL)
.lagreTil(valutakursRepository)

every { vedtaksperiodeService.finnEndringstidspunktForBehandling(behandlingId.id) } returns LocalDate.of(2020, 5, 15)
every { vedtaksperiodeService.finnEndringstidspunktForBehandling(behandlingId.id) } returns LocalDate.of(2023, 5, 15)

automatiskOppdaterValutakursService.oppdaterValutakurserEtterEndringstidspunkt(behandlingId)

val forventetUberørteValutakurser =
ValutakursBuilder(jan(2020), behandlingId)
ValutakursBuilder(jan(2023), behandlingId)
.medKurs("1111", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.MANUELL)
.bygg()

val forventetOppdaterteValutakurser =
ValutakursBuilder(jan(2020), behandlingId)
ValutakursBuilder(jan(2023), behandlingId)
.medKurs(" 45678", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.AUTOMATISK)
.bygg()
Expand All @@ -124,36 +125,36 @@ class AutomatiskOppdaterValutakursServiceTest {
every { behandlingHentOgPersisterService.hent(any()) } answers { lagBehandling(id = firstArg()) }
every { behandlingHentOgPersisterService.hentForrigeBehandlingSomErVedtatt(any()) } answers { lagBehandling(id = forrigeBehandlingId.id) }

UtenlandskPeriodebeløpBuilder(jan(2020), forrigeBehandlingId)
UtenlandskPeriodebeløpBuilder(jan(2023), forrigeBehandlingId)
.medBeløp("77777777", "EUR", "N", barn1, barn2, barn3)
.lagreTil(utenlandskPeriodebeløpRepository)

UtenlandskPeriodebeløpBuilder(jan(2020), behandlingId)
UtenlandskPeriodebeløpBuilder(jan(2023), behandlingId)
.medBeløp("77778888", "EUR", "N", barn1, barn2, barn3)
.lagreTil(utenlandskPeriodebeløpRepository)

ValutakursBuilder(jan(2020), forrigeBehandlingId)
ValutakursBuilder(jan(2023), forrigeBehandlingId)
.medKurs("11111111", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.MANUELL)
.lagreTil(valutakursRepository)

ValutakursBuilder(jan(2020), behandlingId)
ValutakursBuilder(jan(2023), behandlingId)
.medKurs("01234567", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.AUTOMATISK)
.lagreTil(valutakursRepository)

every { vedtaksperiodeService.finnEndringstidspunktForBehandlingUtenValutakursendringer(behandlingId.id) } returns LocalDate.of(2020, 5, 15)
every { vedtaksperiodeService.finnEndringstidspunktForBehandlingUtenValutakursendringer(behandlingId.id) } returns LocalDate.of(2023, 5, 15)

automatiskOppdaterValutakursService.resettValutakurserOgLagValutakurserEtterEndringstidspunkt(behandlingId)

val forventetUberørteValutakurser =
ValutakursBuilder(jan(2020), behandlingId)
ValutakursBuilder(jan(2023), behandlingId)
.medKurs("1111", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.MANUELL)
.bygg()

val forventetOppdaterteValutakurser =
ValutakursBuilder(jan(2020), behandlingId)
ValutakursBuilder(jan(2023), behandlingId)
.medKurs(" 4567", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.AUTOMATISK)
.bygg()
Expand All @@ -167,43 +168,86 @@ class AutomatiskOppdaterValutakursServiceTest {
.isEqualTo(forventetUberørteValutakurser + forventetOppdaterteValutakurser)
}

@Test
fun `oppdaterValutakurserEtterEndringstidspunkt skal ikke oppdatere valutakurser før praksisendringsdatoen januar 2023`() {
every { behandlingHentOgPersisterService.hent(any()) } answers { lagBehandling(id = firstArg()) }
every { behandlingHentOgPersisterService.hentForrigeBehandlingSomErVedtatt(any()) } answers { lagBehandling(id = forrigeBehandlingId.id) }
every { ecbService.hentValutakurs(any(), any()) } answers {
val dato = secondArg<LocalDate>()
(dato.month.value % 10).toBigDecimal()
}

UtenlandskPeriodebeløpBuilder(sep(2022), behandlingId)
.medBeløp("77778888", "EUR", "N", barn1, barn2, barn3)
.lagreTil(utenlandskPeriodebeløpRepository)

ValutakursBuilder(sep(2022), behandlingId)
.medKurs("11111111", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.MANUELL)
.lagreTil(valutakursRepository)

every { vedtaksperiodeService.finnEndringstidspunktForBehandling(behandlingId.id) } returns LocalDate.of(2022, 5, 15)

automatiskOppdaterValutakursService.oppdaterValutakurserEtterEndringstidspunkt(behandlingId)

val forventetUberørteValutakurser =
ValutakursBuilder(sep(2022), behandlingId)
.medKurs("1111", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.MANUELL)
.bygg()

val forventetOppdaterteValutakurser =
ValutakursBuilder(sep(2022), behandlingId)
.medKurs(" 2123", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.AUTOMATISK)
.bygg()

assertThat(valutakursService.hentValutakurser(behandlingId))
.usingRecursiveComparison()
.ignoringFields("id")
.ignoringFields("valutakursdato")
.ignoringFields("endretTidspunkt")
.ignoringFields("opprettetTidspunkt")
.isEqualTo(forventetUberørteValutakurser + forventetOppdaterteValutakurser)
}

@Test
fun `oppdaterValutakurserEtterEndringstidspunkt skal skal kun lage automatiske valutakurser etter siste manuelle postering`() {
every { vedtaksperiodeService.finnEndringstidspunktForBehandling(behandlingId.id) } returns LocalDate.of(2020, 2, 15)
val tomDatoSisteManuellePostering = LocalDate.of(2020, 4, 30)
every { vedtaksperiodeService.finnEndringstidspunktForBehandling(behandlingId.id) } returns LocalDate.of(2023, 2, 15)
val tomDatoSisteManuellePostering = LocalDate.of(2023, 4, 30)
every { simuleringService.oppdaterSimuleringPåBehandlingVedBehov(any()) } returns
listOf(
mockØkonomiSimuleringMottaker(
økonomiSimuleringPostering =
listOf(
mockØkonomiSimuleringPostering(
fagOmrådeKode = FagOmrådeKode.BARNETRYGD_INFOTRYGD_MANUELT,
fom = LocalDate.of(2019, 3, 1),
fom = LocalDate.of(2023, 4, 1),
tom = tomDatoSisteManuellePostering,
),
),
),
)

UtenlandskPeriodebeløpBuilder(jan(2020), behandlingId)
UtenlandskPeriodebeløpBuilder(jan(2023), behandlingId)
.medBeløp("777777777", "EUR", "N", barn1, barn2, barn3)
.lagreTil(utenlandskPeriodebeløpRepository)

ValutakursBuilder(jan(2020), behandlingId)
ValutakursBuilder(jan(2023), behandlingId)
.medKurs("111111111", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.MANUELL)
.lagreTil(valutakursRepository)

automatiskOppdaterValutakursService.oppdaterValutakurserEtterEndringstidspunkt(behandlingId)

val forventetUberørteValutakurser =
ValutakursBuilder(jan(2020), behandlingId)
ValutakursBuilder(jan(2023), behandlingId)
.medKurs("1111", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.MANUELL)
.bygg()

val forventetOppdaterteValutakurser =
ValutakursBuilder(jan(2020), behandlingId)
ValutakursBuilder(jan(2023), behandlingId)
.medKurs(" 45678", "EUR", barn1, barn2, barn3)
.medVurderingsform(Vurderingsform.AUTOMATISK)
.bygg()
Expand Down

0 comments on commit ece850c

Please sign in to comment.