From 1de8ad95600c45e8782cbaa9bdc625a09aba78e4 Mon Sep 17 00:00:00 2001 From: Fredrik Ingebrigtsen Date: Wed, 30 Oct 2024 09:49:54 +0100 Subject: [PATCH] Endre sortering av tiltakshistorikk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Finner første definerte dato av slutt, start, registrert, og endret og breuker denne til sammenligning. --- .../src/apps/modia/views/Landingsside.tsx | 1 + .../fixtures/mockDeltakelserHistoriske.ts | 28 ++++++++++ .../api/domain/dto/Deltakelse.kt | 9 ++++ .../api/services/TiltakshistorikkService.kt | 24 ++++++--- .../src/main/resources/web/openapi.yaml | 9 ++++ .../services/TiltakshistorikkServiceTest.kt | 54 +++++++++++++++---- 6 files changed, 108 insertions(+), 17 deletions(-) diff --git a/frontend/mulighetsrommet-veileder-flate/src/apps/modia/views/Landingsside.tsx b/frontend/mulighetsrommet-veileder-flate/src/apps/modia/views/Landingsside.tsx index b33c2f4f27..ed7664c374 100644 --- a/frontend/mulighetsrommet-veileder-flate/src/apps/modia/views/Landingsside.tsx +++ b/frontend/mulighetsrommet-veileder-flate/src/apps/modia/views/Landingsside.tsx @@ -231,6 +231,7 @@ function DeltakelserHistoriske() { const dato = deltakelse.periode.sluttDato ?? deltakelse.periode.startDato ?? + deltakelse.registrertTidspunkt ?? deltakelse.innsoktDato ?? deltakelse.sistEndretDato; diff --git a/frontend/mulighetsrommet-veileder-flate/src/mock/fixtures/mockDeltakelserHistoriske.ts b/frontend/mulighetsrommet-veileder-flate/src/mock/fixtures/mockDeltakelserHistoriske.ts index 01904d211c..b63b7e7474 100644 --- a/frontend/mulighetsrommet-veileder-flate/src/mock/fixtures/mockDeltakelserHistoriske.ts +++ b/frontend/mulighetsrommet-veileder-flate/src/mock/fixtures/mockDeltakelserHistoriske.ts @@ -97,6 +97,21 @@ export const deltakelserHistoriske: Deltakelse[] = [ eierskap: DeltakelseEierskap.TEAM_KOMET, periode: {}, }, + { + tittel: "Gammel Avklaring med Sluttdato", + tiltakstypeNavn: "Avklaring", + id: window.crypto.randomUUID(), + gjennomforingId: tiltakAvklaring.id, + status: { + type: GruppetiltakDeltakerStatus.FULLFORT, + visningstekst: "Fullført", + }, + innsoktDato: "2017-02-03", + eierskap: DeltakelseEierskap.TEAM_KOMET, + periode: { + sluttDato: '2018-01-01', + }, + }, { tittel: "Gammel Avklaring med Anne", tiltakstypeNavn: "Avklaring", @@ -110,4 +125,17 @@ export const deltakelserHistoriske: Deltakelse[] = [ eierskap: DeltakelseEierskap.TEAM_KOMET, periode: {}, }, + { + tittel: "Gammel Avklaring med kun registrert dato", + tiltakstypeNavn: "Avklaring", + id: window.crypto.randomUUID(), + gjennomforingId: tiltakAvklaring.id, + status: { + type: GruppetiltakDeltakerStatus.FULLFORT, + visningstekst: "Fullført", + }, + registrertTidspunkt: '2016-01-01', + eierskap: DeltakelseEierskap.TEAM_KOMET, + periode: {}, + }, ]; diff --git a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/domain/dto/Deltakelse.kt b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/domain/dto/Deltakelse.kt index aa733c8d5b..f64d491ae2 100644 --- a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/domain/dto/Deltakelse.kt +++ b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/domain/dto/Deltakelse.kt @@ -5,8 +5,10 @@ import no.nav.mulighetsrommet.domain.dto.ArbeidsgiverAvtaleStatus import no.nav.mulighetsrommet.domain.dto.ArenaDeltakerStatus import no.nav.mulighetsrommet.domain.dto.DeltakerStatus import no.nav.mulighetsrommet.domain.serializers.LocalDateSerializer +import no.nav.mulighetsrommet.domain.serializers.LocalDateTimeSerializer import no.nav.mulighetsrommet.domain.serializers.UUIDSerializer import java.time.LocalDate +import java.time.LocalDateTime import java.util.* @Serializable @@ -17,6 +19,7 @@ sealed class Deltakelse { abstract val tiltakstypeNavn: String abstract val innsoktDato: LocalDate? abstract val sistEndretDato: LocalDate? + abstract val registrertTidspunkt: LocalDateTime? abstract val periode: Periode @Serializable @@ -45,6 +48,8 @@ sealed class Deltakelse { override val innsoktDato: LocalDate?, @Serializable(with = LocalDateSerializer::class) override val sistEndretDato: LocalDate?, + @Serializable(with = LocalDateTimeSerializer::class) + override val registrertTidspunkt: LocalDateTime, override val periode: Periode, val status: Status, ) : Deltakelse() { @@ -66,6 +71,8 @@ sealed class Deltakelse { override val innsoktDato: LocalDate?, @Serializable(with = LocalDateSerializer::class) override val sistEndretDato: LocalDate?, + @Serializable(with = LocalDateTimeSerializer::class) + override val registrertTidspunkt: LocalDateTime?, override val periode: Periode, val status: Status, @Serializable(with = UUIDSerializer::class) @@ -90,6 +97,8 @@ sealed class Deltakelse { override val innsoktDato: LocalDate?, @Serializable(with = LocalDateSerializer::class) override val sistEndretDato: LocalDate?, + @Serializable(with = LocalDateTimeSerializer::class) + override val registrertTidspunkt: LocalDateTime, override val periode: Periode, val status: Status, ) : Deltakelse() { diff --git a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/services/TiltakshistorikkService.kt b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/services/TiltakshistorikkService.kt index d13cdaef5a..70b39bf09b 100644 --- a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/services/TiltakshistorikkService.kt +++ b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/services/TiltakshistorikkService.kt @@ -17,6 +17,7 @@ import no.nav.mulighetsrommet.domain.dto.* import no.nav.mulighetsrommet.tokenprovider.AccessType import org.slf4j.Logger import org.slf4j.LoggerFactory +import java.time.LocalDate class TiltakshistorikkService( private val pdlClient: PdlClient, @@ -103,6 +104,7 @@ class TiltakshistorikkService( tiltakstypeNavn = tiltakstype.navn, innsoktDato = null, sistEndretDato = null, + registrertTidspunkt = registrertTidspunkt, eierskap = Deltakelse.Eierskap.ARENA, ) } @@ -131,6 +133,7 @@ class TiltakshistorikkService( tiltakstypeNavn = tiltakstype.await().navn, innsoktDato = null, sistEndretDato = null, + registrertTidspunkt = registrertTidspunkt, /** * Eierskapet er satt til ARENA selv om deltakelsene kommer fra Komet. * Det er først når deltakelsen også er tilgjengelig fra [AmtDeltakerClient.hentDeltakelser] @@ -166,6 +169,7 @@ class TiltakshistorikkService( tiltakstypeNavn = tiltakstype.navn, innsoktDato = null, sistEndretDato = null, + registrertTidspunkt = registrertTidspunkt, eierskap = Deltakelse.Eierskap.TEAM_TILTAK, ) } @@ -255,6 +259,7 @@ fun DeltakelseFraKomet.toDeltakelse(): Deltakelse { ), innsoktDato = innsoktDato, sistEndretDato = sistEndretDato, + registrertTidspunkt = null, ) } @@ -283,13 +288,20 @@ data class Deltakelser( * Sorterer deltakelser basert på nyeste startdato først */ private val deltakelseComparator: Comparator = Comparator { a, b -> - val startDatoA = a.periode.startDato - val startDatoB = b.periode.startDato + val dato: (Deltakelse) -> LocalDate? = { d -> + d.periode.sluttDato + ?: d.periode.startDato + ?: d.registrertTidspunkt?.toLocalDate() + ?: d.sistEndretDato + } + + val datoA = dato(a) + val datoB = dato(b) when { - startDatoA === startDatoB -> 0 - startDatoA == null -> -1 - startDatoB == null -> 1 - else -> startDatoB.compareTo(startDatoA) + datoA === datoB -> 0 + datoA == null -> -1 + datoB == null -> 1 + else -> datoB.compareTo(datoA) } } diff --git a/mulighetsrommet-api/src/main/resources/web/openapi.yaml b/mulighetsrommet-api/src/main/resources/web/openapi.yaml index 25508b3604..52052624c0 100644 --- a/mulighetsrommet-api/src/main/resources/web/openapi.yaml +++ b/mulighetsrommet-api/src/main/resources/web/openapi.yaml @@ -3019,6 +3019,9 @@ components: type: string sistEndretDato: type: string + registrertTidspunkt: + format: date-time + type: string periode: $ref: "#/components/schemas/DeltakelsePeriode" status: @@ -3077,6 +3080,9 @@ components: type: string sistEndretDato: type: string + registrertTidspunkt: + format: date-time + type: string periode: $ref: "#/components/schemas/DeltakelsePeriode" status: @@ -3137,6 +3143,9 @@ components: type: string sistEndretDato: type: string + registrertTidspunkt: + format: date-time + type: string periode: $ref: "#/components/schemas/DeltakelsePeriode" status: diff --git a/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/services/TiltakshistorikkServiceTest.kt b/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/services/TiltakshistorikkServiceTest.kt index 602ce58a2d..34ca0fd111 100644 --- a/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/services/TiltakshistorikkServiceTest.kt +++ b/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/services/TiltakshistorikkServiceTest.kt @@ -47,6 +47,7 @@ class TiltakshistorikkServiceTest : FunSpec({ startDato = LocalDate.of(2018, 12, 3), sluttDato = LocalDate.of(2019, 12, 3), arrangor = Arrangor(ArrangorFixtures.underenhet1.organisasjonsnummer), + registrertTidspunkt = LocalDateTime.of(2018, 12, 3, 0, 0), ) val tiltakshistorikkAvklaring = Tiltakshistorikk.ArenaDeltakelse( @@ -58,6 +59,7 @@ class TiltakshistorikkServiceTest : FunSpec({ arenaTiltakskode = TiltakstypeFixtures.Avklaring.arenaKode, beskrivelse = "Avklaring", arrangor = Arrangor(Organisasjonsnummer("123456789")), + registrertTidspunkt = LocalDateTime.of(2018, 12, 3, 0, 0), ) val tiltakshistorikkArbeidstrening = Tiltakshistorikk.ArbeidsgiverAvtale( @@ -68,6 +70,7 @@ class TiltakshistorikkServiceTest : FunSpec({ tiltakstype = Tiltakshistorikk.ArbeidsgiverAvtale.Tiltakstype.ARBEIDSTRENING, status = ArbeidsgiverAvtaleStatus.GJENNOMFORES, arbeidsgiver = Tiltakshistorikk.Arbeidsgiver(ArrangorFixtures.underenhet2.organisasjonsnummer), + registrertTidspunkt = LocalDateTime.of(2020, 1, 1, 0, 0), ) val deltakelseOppfolgingFraKomet = DeltakelseFraKomet( @@ -108,6 +111,7 @@ class TiltakshistorikkServiceTest : FunSpec({ ), sistEndretDato = LocalDate.of(2018, 12, 5), innsoktDato = LocalDate.of(2018, 12, 3), + registrertTidspunkt = null, ) val deltakelseAvklaring = Deltakelse.DeltakelseArena( id = tiltakshistorikkAvklaring.id, @@ -124,6 +128,7 @@ class TiltakshistorikkServiceTest : FunSpec({ ), sistEndretDato = null, innsoktDato = null, + registrertTidspunkt = LocalDateTime.of(2018, 12, 3, 0, 0), ) val deltakelseArbeidstrening = Deltakelse.DeltakelseArbeidsgiverAvtale( id = tiltakshistorikkArbeidstrening.avtaleId, @@ -140,6 +145,7 @@ class TiltakshistorikkServiceTest : FunSpec({ ), sistEndretDato = null, innsoktDato = null, + registrertTidspunkt = LocalDateTime.of(2020, 1, 1, 0, 0), ) val pdlClient: PdlClient = mockk() @@ -260,21 +266,25 @@ class TiltakshistorikkServiceTest : FunSpec({ ) } - test("sorterer deltakelser basert nyeste startdato") { + test("sorteres etter sistEndret når periode er null") { coEvery { tiltakshistorikkClient.historikk(any()) } returns TiltakshistorikkResponse( - historikk = listOf(tiltakshistorikkAvklaring, tiltakshistorikkOppfolging), + historikk = listOf( + tiltakshistorikkOppfolging.copy(sluttDato = LocalDate.of(2023, 1, 2)), + tiltakshistorikkAvklaring.copy(sluttDato = LocalDate.of(2023, 1, 1)), + ), meldinger = setOf(), ) - val deltakelseOppfolgingUtenStartdato = deltakelseOppfolgingFraKomet.copy( + val deltakelseOppfolgingUtenPeriode = deltakelseOppfolgingFraKomet.copy( deltakerId = UUID.randomUUID(), status = DeltakelseFraKomet.Status(type = DeltakerStatus.Type.KLADD, visningstekst = "Kladd"), periode = null, + sistEndretDato = LocalDate.of(2024, 2, 2), ) coEvery { amtDeltakerClient.hentDeltakelser(any(), any()) } returns Either.Right( DeltakelserResponse( - aktive = listOf(deltakelseOppfolgingFraKomet, deltakelseOppfolgingUtenStartdato), + aktive = listOf(deltakelseOppfolgingUtenPeriode), historikk = emptyList(), ), ) @@ -286,14 +296,36 @@ class TiltakshistorikkServiceTest : FunSpec({ AccessType.OBO("token"), ) - historikk shouldBe Deltakelser( - meldinger = setOf(), - aktive = listOf( - deltakelseOppfolgingUtenStartdato.toDeltakelse(), - deltakelseOppfolging, - deltakelseAvklaring, + historikk.aktive.map { it.id } shouldBe listOf( + deltakelseOppfolgingUtenPeriode.deltakerId, + deltakelseOppfolging.id, + deltakelseAvklaring.id, + ) + } + + test("sorteres etter startdato når sluttdato er null") { + coEvery { tiltakshistorikkClient.historikk(any()) } returns TiltakshistorikkResponse( + historikk = listOf( + tiltakshistorikkArbeidstrening.copy(startDato = LocalDate.of(2023, 1, 3), sluttDato = null), + tiltakshistorikkOppfolging.copy(sluttDato = LocalDate.of(2023, 1, 2)), + tiltakshistorikkAvklaring.copy(startDato = LocalDate.of(2023, 1, 1), sluttDato = null), ), - historiske = emptyList(), + meldinger = setOf(), + ) + coEvery { amtDeltakerClient.hentDeltakelser(any(), any()) } returns Either.Right( + DeltakelserResponse(aktive = emptyList(), historikk = emptyList()), + ) + + val historikkService = createTiltakshistorikkService() + val historikk = historikkService.hentHistorikk( + NorskIdent("12345678910"), + AccessType.OBO("token"), + ) + + historikk.aktive.map { it.id } shouldBe listOf( + deltakelseArbeidstrening.id, + deltakelseOppfolging.id, + deltakelseAvklaring.id, ) } })