Skip to content

Commit

Permalink
Task og forvalterendepunkt for å oppdatere valutakurs for en behandli…
Browse files Browse the repository at this point in the history
…ng fra et gitt tidspunkt (#4879)

### 💰 Hva skal gjøres, og hvorfor?

Som en følge av en tidligere bug, der saksbehandler kunne legge inn
kompetanse frem i tid, er det en behandling som har fått feil
valutakurser som saksbehandler ikke får fikset.

Oppretter endepunkt for å trigge automatisk oppdatering av valutakurser
fra et gitt tidspunkt, slik at SB kan gå videre i behandlingen

### ✅ 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 11, 2024
1 parent 70a8b66 commit 29ec8e3
Show file tree
Hide file tree
Showing 5 changed files with 194 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import no.nav.familie.ba.sak.task.GrensesnittavstemMotOppdrag
import no.nav.familie.ba.sak.task.HentAlleIdenterTilPsysTask
import no.nav.familie.ba.sak.task.MaskineltUnderkjennVedtakTask
import no.nav.familie.ba.sak.task.OppdaterLøpendeFlagg
import no.nav.familie.ba.sak.task.OppdaterValutakursTask
import no.nav.familie.ba.sak.task.OpprettTaskService
import no.nav.familie.ba.sak.task.PatchFomPåVilkårTilFødselsdato
import no.nav.familie.ba.sak.task.PatchMergetIdentDto
Expand Down Expand Up @@ -426,6 +427,21 @@ class ForvalterController(
return ResponseEntity.ok(fagsak)
}

@PutMapping("/oppdater-valutakurs/{behandlingId}/{endringstidspunkt}")
@Operation(summary = "Oppdaterer valutakurs for en behandling i behandlingsresultatsteget fra et gitt tidspunkt")
fun oppdaterValutakurs(
@PathVariable behandlingId: Long,
@PathVariable endringstidspunkt: YearMonth,
): ResponseEntity<Ressurs<String>> {
tilgangService.verifiserHarTilgangTilHandling(
minimumBehandlerRolle = BehandlerRolle.FORVALTER,
handling = "Oppdaterer valutakurs for en behandling i behandlingsresultatsteget fra et gitt tidspunkt",
)

val task = taskService.save(OppdaterValutakursTask.opprettTask(behandlingId, endringstidspunkt))
return ResponseEntity.ok(Ressurs.success("Oppdaterer valutakurser fra $endringstidspunkt i behandling $behandlingId i task ${task.id}"))
}

@PostMapping("/start-valutajustering-scheduler")
@Operation(summary = "Start valutajustering for alle sekundærlandsaker i gjeldende måned")
fun lagMånedligValutajusteringTask(): ResponseEntity<Ressurs<String>> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,12 +86,13 @@ class AutomatiskOppdaterValutakursService(
fun oppdaterValutakurserEtterEndringstidspunkt(
behandlingId: BehandlingId,
utenlandskePeriodebeløp: Collection<UtenlandskPeriodebeløp>? = null,
endringstidspunkt: YearMonth? = null,
) {
val behandling = behandlingHentOgPersisterService.hent(behandlingId.id)
oppdaterValutakurserEtterEndringstidspunkt(
behandling = behandling,
utenlandskePeriodebeløp = utenlandskePeriodebeløp ?: utenlandskPeriodebeløpRepository.finnFraBehandlingId(behandlingId.id),
endringstidspunkt = finnEndringstidspunktForOppdateringAvValutakurs(behandling),
endringstidspunkt = endringstidspunkt ?: finnEndringstidspunktForOppdateringAvValutakurs(behandling),
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package no.nav.familie.ba.sak.task

import com.fasterxml.jackson.module.kotlin.readValue
import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService
import no.nav.familie.ba.sak.kjerne.behandling.domene.BehandlingStatus
import no.nav.familie.ba.sak.kjerne.eøs.felles.BehandlingId
import no.nav.familie.ba.sak.kjerne.eøs.valutakurs.AutomatiskOppdaterValutakursService
import no.nav.familie.ba.sak.kjerne.steg.StegType
import no.nav.familie.kontrakter.felles.objectMapper
import no.nav.familie.prosessering.AsyncTaskStep
import no.nav.familie.prosessering.TaskStepBeskrivelse
import no.nav.familie.prosessering.domene.Task
import org.springframework.stereotype.Service
import java.time.YearMonth

@Service
@TaskStepBeskrivelse(
taskStepType = OppdaterValutakursTask.TASK_STEP_TYPE,
beskrivelse = "Oppdater valutakurs i behandling etter endringstidspunkt.",
maxAntallFeil = 3,
)
class OppdaterValutakursTask(
private val automatiskOppdaterValutakursService: AutomatiskOppdaterValutakursService,
private val behandlingHentOgPersisterService: BehandlingHentOgPersisterService,
) : AsyncTaskStep {
override fun doTask(task: Task) {
val dto: OppdaterValutakursTaskDTO = objectMapper.readValue(task.payload)

val behandling = behandlingHentOgPersisterService.hent(dto.behandlingId)
require(behandling.steg == StegType.BEHANDLINGSRESULTAT && behandling.aktiv && behandling.status == BehandlingStatus.UTREDES) {
"Behandling ${dto.behandlingId} er ikke i behandlingresultatsteg."
}

automatiskOppdaterValutakursService.oppdaterValutakurserEtterEndringstidspunkt(
behandlingId = BehandlingId(dto.behandlingId),
endringstidspunkt = dto.endringstidspunkt,
)
}

companion object {
fun opprettTask(
behandlingId: Long,
endringstidspunkt: YearMonth,
): Task =
Task(
type = TASK_STEP_TYPE,
payload = objectMapper.writeValueAsString(OppdaterValutakursTaskDTO(behandlingId, endringstidspunkt)),
)

const val TASK_STEP_TYPE = "oppdaterValutakurs"
}

private data class OppdaterValutakursTaskDTO(
val behandlingId: Long,
val endringstidspunkt: YearMonth = YearMonth.now(),
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package no.nav.familie.ba.sak.internal

import io.mockk.every
import io.mockk.justRun
import io.mockk.mockk
import io.mockk.slot
import no.nav.familie.ba.sak.common.lagBehandling
import no.nav.familie.ba.sak.sikkerhet.TilgangService
import no.nav.familie.prosessering.domene.Task
import no.nav.familie.prosessering.internal.TaskService
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import java.time.YearMonth

class ForvalterControllerTest {
val tilgangService: TilgangService = mockk()
val taskService: TaskService = mockk()
val forvalterController =
ForvalterController(
oppgaveRepository = mockk(),
integrasjonClient = mockk(),
restartAvSmåbarnstilleggService = mockk(),
forvalterService = mockk(),
ecbService = mockk(),
testVerktøyService = mockk(),
tilgangService = tilgangService,
økonomiService = mockk(),
opprettTaskService = mockk(),
taskService = taskService,
satskjøringRepository = mockk(),
autovedtakMånedligValutajusteringService = mockk(),
månedligValutajusteringScheduler = mockk(),
fagsakService = mockk(),
unleashNextMedContextService = mockk(),
taskRepository = mockk(),
behandlingHentOgPersisterService = mockk(),
stønadsstatistikkService = mockk(),
persongrunnlagService = mockk(),
hentAlleIdenterTilPsysTask = mockk(),
)

@BeforeEach
fun setUp() {
justRun { tilgangService.verifiserHarTilgangTilHandling(any(), any()) }
}

@Test
fun oppdaterValutakurs() {
val behandling = lagBehandling()
val endringstidspunkt = YearMonth.of(2024, 1)
val task = slot<Task>()

every { taskService.save(capture(task)) } returns Task(type = "", payload = "")

forvalterController.oppdaterValutakurs(behandlingId = behandling.id, endringstidspunkt = endringstidspunkt)

assertThat(task.captured.type).isEqualTo("oppdaterValutakurs")
assertThat(task.captured.payload).isEqualTo("{\"behandlingId\":${behandling.id},\"endringstidspunkt\":\"$endringstidspunkt\"}")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package no.nav.familie.ba.sak.task

import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.runs
import io.mockk.verify
import no.nav.familie.ba.sak.common.lagBehandling
import no.nav.familie.ba.sak.kjerne.behandling.BehandlingHentOgPersisterService
import no.nav.familie.ba.sak.kjerne.eøs.felles.BehandlingId
import no.nav.familie.ba.sak.kjerne.eøs.valutakurs.AutomatiskOppdaterValutakursService
import no.nav.familie.ba.sak.kjerne.steg.StegType
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import java.time.YearMonth

class OppdaterValutakursTaskTest {
private val behandlingHentOgPersisterService: BehandlingHentOgPersisterService = mockk()
private val automatiskOppdaterValutakursService: AutomatiskOppdaterValutakursService = mockk()
private val oppdaterValutakursTask =
OppdaterValutakursTask(
automatiskOppdaterValutakursService = automatiskOppdaterValutakursService,
behandlingHentOgPersisterService = behandlingHentOgPersisterService,
)

@Test
fun `skal kaste feil hvis behandling ikke er i behandlingsresultatsteg`() {
val behandling = lagBehandling()
val endringstidspunkt = YearMonth.of(2024, 1)

every { behandlingHentOgPersisterService.hent(any()) } returns behandling

assertThrows<IllegalArgumentException> {
oppdaterValutakursTask.doTask(OppdaterValutakursTask.opprettTask(behandling.id, endringstidspunkt))
}
}

@Test
fun `skal oppdatere valutakurs fra gitt dato`() {
val behandling =
lagBehandling(
førsteSteg = StegType.BEHANDLINGSRESULTAT,
)
val endringstidspunkt = YearMonth.of(2024, 1)

every { behandlingHentOgPersisterService.hent(any()) } returns behandling
every { automatiskOppdaterValutakursService.oppdaterValutakurserEtterEndringstidspunkt(any<BehandlingId>(), any(), any()) } just runs

oppdaterValutakursTask.doTask(OppdaterValutakursTask.opprettTask(behandling.id, endringstidspunkt))

verify(exactly = 1) {
automatiskOppdaterValutakursService.oppdaterValutakurserEtterEndringstidspunkt(
behandlingId = BehandlingId(behandling.id),
endringstidspunkt = endringstidspunkt,
)
}
}
}

0 comments on commit 29ec8e3

Please sign in to comment.