Skip to content

Commit

Permalink
Merge pull request #88 from navikt/deltakelser_ved_aktivitetsplan_launch
Browse files Browse the repository at this point in the history
deltakelser_ved_aktivitetsplan_launch
  • Loading branch information
tu55eladd authored Nov 27, 2023
2 parents 880f758 + 671465d commit 9e9e9ca
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,16 @@ open class DeltakerProcessor(
if (message.operationType == Operation.DELETED) {
throw IgnoredException("Skal ignorere deltakelse med operation type DELETE")
}

var opprettetFoerMenAktivEtterLansering = false
if (deltakelse.regDato.isBefore(AKTIVITETSPLAN_LANSERINGSDATO)) {
throw IgnoredException("Deltakeren registrert=${deltakelse.regDato} opprettet før aktivitetsplan skal ikke håndteres")
// Hvis deltakelsen er opprettet før aktivitetsplan lanseringsdato,
// _men_ datoTil er etter aktivitetsplan lanseringsdato,
// _og_ bruker hadde en aktiv oppfølgingsperiode ved aktivitetsplan lanseringsdato
// så skal vi opprette aktivitetskort
if (deltakelse.datoTil?.isAfter(AKTIVITETSPLAN_LANSERINGSDATO.toLocalDate()) == true) {
opprettetFoerMenAktivEtterLansering = true
} else throw IgnoredException("Deltakeren registrert=${deltakelse.regDato} opprettet før aktivitetsplan skal ikke håndteres")
}
val ingestStatus: IngestStatus? = runCatching {
arenaDataRepository.get(
Expand Down Expand Up @@ -83,9 +91,11 @@ open class DeltakerProcessor(
/*
Hvis oppfølgingsperiode ikke finnes,
hopper vi ut her, enten med retry eller ignored, siden handleOppfolgingsperiodeNull kaster exception alltid.
Dette er viktig for å ikke opprette ny aktivitetsid før vi faktisk lagrer et aktivitetskort.
*/
val periodeMatch = getOppfolgingsPeriodeOrThrow(deltakelse, personIdent)
val periodeMatch =
if (opprettetFoerMenAktivEtterLansering) {
getOppfolgingsperiodeForPersonVedLansering(personIdent)
} else getOppfolgingsPeriodeOrThrow(deltakelse, personIdent)
val endring = utledEndringsType(periodeMatch, deltakelse.tiltakdeltakelseId, arenaDeltaker.DELTAKERSTATUSKODE, tiltak.administrasjonskode)
when (endring) {
is EndringsType.NyttAktivitetskortByttPeriode -> {
Expand Down Expand Up @@ -165,6 +175,14 @@ open class DeltakerProcessor(
}
}

private fun getOppfolgingsperiodeForPersonVedLansering(personIdent: String): FinnOppfolgingResult.FunnetPeriodeResult {
val oppfolgingsperiodeVedAktivitetsplanLansering = oppfolgingsperiodeService.finnOppfolgingsperiode(personIdent, AKTIVITETSPLAN_LANSERINGSDATO)
return when (oppfolgingsperiodeVedAktivitetsplanLansering) {
is FinnOppfolgingResult.FunnetPeriodeResult -> oppfolgingsperiodeVedAktivitetsplanLansering
is FinnOppfolgingResult.IngenPeriodeResult -> throw IgnoredException("Deltakelse aktiv ved aktivitetsplan lansering, men bruker ikke under oppfølging på det tidspunktet.")
}
}

private fun utledEndringsType(
periodeMatch: FinnOppfolgingResult.FunnetPeriodeResult,
deltakelseId: DeltakelseId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import no.nav.arena_tiltak_aktivitet_acl.integration.commands.gjennomforing.NyGj
import no.nav.arena_tiltak_aktivitet_acl.integration.commands.tiltak.NyttTiltakCommand
import no.nav.arena_tiltak_aktivitet_acl.mocks.OppfolgingClientMock
import no.nav.arena_tiltak_aktivitet_acl.mocks.OrdsClientMock
import no.nav.arena_tiltak_aktivitet_acl.processors.DeltakerProcessor
import no.nav.arena_tiltak_aktivitet_acl.processors.DeltakerProcessor.Companion.AKTIVITETSPLAN_LANSERINGSDATO
import no.nav.arena_tiltak_aktivitet_acl.processors.converters.ArenaDeltakerConverter.AMO
import no.nav.arena_tiltak_aktivitet_acl.processors.converters.ArenaDeltakerConverter.ENKELAMO
import no.nav.arena_tiltak_aktivitet_acl.processors.converters.ArenaDeltakerConverter.GRUPPEAMO
Expand All @@ -45,10 +45,7 @@ import org.mockito.kotlin.doThrow
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.mock.mockito.SpyBean
import org.springframework.http.HttpStatus
import java.time.Duration
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZonedDateTime
import java.time.*
import java.time.temporal.ChronoUnit
import java.util.*
import kotlin.random.Random
Expand Down Expand Up @@ -383,19 +380,78 @@ class DeltakerIntegrationTests : IntegrationTestBase() {
}

@Test
fun `ignore deltaker before aktivitetsplan launch`() {
fun `ignore deltaker before aktivitetsplan launch if tilDato before aktivitetsplan launch`() {
val (gjennomforingId, deltakerId) = setup()
val deltakerInput = DeltakerInput(
tiltakDeltakelseId = deltakerId,
tiltakgjennomforingId = gjennomforingId,
innsokBegrunnelse = "innsøkbegrunnelse",
endretAv = Ident(ident = "SIG123"),
registrertDato = DeltakerProcessor.AKTIVITETSPLAN_LANSERINGSDATO.minusDays(1)
datoTil = AKTIVITETSPLAN_LANSERINGSDATO.toLocalDate().minusDays(1),
registrertDato = AKTIVITETSPLAN_LANSERINGSDATO.minusDays(2)
)
val deltakerCommand = NyDeltakerCommand(deltakerInput)
val result = deltakerExecutor.execute(deltakerCommand)

result.arenaData { it.ingestStatus shouldBe IngestStatus.IGNORED }
result.arenaData {
it.ingestStatus shouldBe IngestStatus.IGNORED
it.note shouldBe "Deltakeren registrert=${deltakerInput.registrertDato} opprettet før aktivitetsplan skal ikke håndteres"
}
}

@Test
fun `ignore deltaker before aktivitetsplan launch if tilDato after aktivitetplan launch, but no oppfolgingsperiode`() {
val (gjennomforingId, deltakerId) = setup()
val deltakerInput = DeltakerInput(
tiltakDeltakelseId = deltakerId,
tiltakgjennomforingId = gjennomforingId,
innsokBegrunnelse = "innsøkbegrunnelse",
endretAv = Ident(ident = "SIG123"),
datoTil = AKTIVITETSPLAN_LANSERINGSDATO.plusMonths(1).toLocalDate(),
registrertDato = AKTIVITETSPLAN_LANSERINGSDATO.minusDays(1)
)
val deltakerCommand = NyDeltakerCommand(deltakerInput)
val result = deltakerExecutor.execute(deltakerCommand)

result.arenaData {
it.ingestStatus shouldBe IngestStatus.IGNORED
it.note shouldBe "Deltakelse aktiv ved aktivitetsplan lansering, men bruker ikke under oppfølging på det tidspunktet."
}
}

@Test
fun `dont ignore deltaker before aktivitetsplan launch if tildato after aktivitetsplan launch and oppfolgingsperiode was active`() {
val (gjennomforingId, deltakerId) = setup()

val foerstePeriode = Oppfolgingsperiode(
uuid = UUID.randomUUID(),
startDato = ZonedDateTime.of(AKTIVITETSPLAN_LANSERINGSDATO.minusDays(1), ZoneId.systemDefault()),
sluttDato = null
)

val deltakerInput = DeltakerInput(
personId = 345L,
tiltakDeltakelseId = deltakerId,
tiltakgjennomforingId = gjennomforingId,
innsokBegrunnelse = "innsøkbegrunnelse",
endretAv = Ident(ident = "SIG123"),
registrertDato = AKTIVITETSPLAN_LANSERINGSDATO.minusYears(1),
endretTidspunkt = AKTIVITETSPLAN_LANSERINGSDATO.minusYears(1),
datoTil = LocalDate.now().plusYears(25)
)

val fnr = "12345678901"
OrdsClientMock.fnrHandlers[deltakerInput.personId!!] = { fnr }
OppfolgingClientMock.oppfolgingsperioder[fnr] = listOf(foerstePeriode)



val deltakerCommand = NyDeltakerCommand(deltakerInput)
val result = deltakerExecutor.execute(deltakerCommand)

result.expectHandled {
data -> data.headers.oppfolgingsperiode shouldBe foerstePeriode.uuid
}
}

@Test
Expand Down

0 comments on commit 9e9e9ca

Please sign in to comment.