diff --git a/.nais/nais-dev.yaml b/.nais/nais-dev.yaml index cf558f9b1..ab1c4612e 100644 --- a/.nais/nais-dev.yaml +++ b/.nais/nais-dev.yaml @@ -115,8 +115,6 @@ spec: value: amt.nav-bruker-personalia-v1 - name: NAV_ANSATT_PERSONALIA_TOPIC value: amt.nav-ansatt-personalia-v1 - - name: DELTAKER_ENDRET_TOPIC - value: amt.deltaker-endring-v1 gcp: sqlInstances: diff --git a/.nais/nais-prod.yaml b/.nais/nais-prod.yaml index bdde77259..62af5d6c4 100644 --- a/.nais/nais-prod.yaml +++ b/.nais/nais-prod.yaml @@ -115,8 +115,6 @@ spec: value: amt.nav-bruker-personalia-v1 - name: NAV_ANSATT_PERSONALIA_TOPIC value: amt.nav-ansatt-personalia-v1 - - name: DELTAKER_ENDRET_TOPIC - value: amt.deltaker-endring-v1 gcp: sqlInstances: diff --git a/application/src/main/resources/application.properties b/application/src/main/resources/application.properties index d9675f09c..cad3be898 100644 --- a/application/src/main/resources/application.properties +++ b/application/src/main/resources/application.properties @@ -23,7 +23,6 @@ app.env.amtDeltakerTopic=${DELTAKER_TOPIC_V2:#{null}} app.env.amtEndringsmeldingTopic=${ENDRINGSMELDIG_TOPIC:#{null}} app.env.amtNavBrukerPersonaliaTopic=${NAV_BRUKER_PERSONALIA_TOPIC:#{null}} app.env.amtNavAnsattPersonaliaTopic=${NAV_ANSATT_PERSONALIA_TOPIC:#{null}} -app.env.amtDeltakerEndringTopic=${DELTAKER_ENDRET_TOPIC:#{null}} app.env.unleashUrl=${UNLEASH_SERVER_API_URL}/api app.env.unleashApiToken=${UNLEASH_SERVER_API_TOKEN} diff --git a/common/auth/src/test/kotlin/no/nav/amt/tiltak/common/auth/AuditLoggerServiceImplTest.kt b/common/auth/src/test/kotlin/no/nav/amt/tiltak/common/auth/AuditLoggerServiceImplTest.kt index a30d9688c..cb7a4db67 100644 --- a/common/auth/src/test/kotlin/no/nav/amt/tiltak/common/auth/AuditLoggerServiceImplTest.kt +++ b/common/auth/src/test/kotlin/no/nav/amt/tiltak/common/auth/AuditLoggerServiceImplTest.kt @@ -70,7 +70,11 @@ class AuditLoggerServiceImplTest { endretDato = LocalDateTime.now(), adressebeskyttelse = null, innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) val messageSlot = slot() diff --git a/core/pom.xml b/core/pom.xml index 804e0addd..5c90e9433 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -12,6 +12,10 @@ core + + com.fasterxml.jackson.module + jackson-module-kotlin + org.junit.jupiter junit-jupiter-engine diff --git a/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/Deltaker.kt b/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/Deltaker.kt index 8dd3df161..8e9b33deb 100644 --- a/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/Deltaker.kt +++ b/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/Deltaker.kt @@ -26,7 +26,11 @@ data class Deltaker( val endretDato: LocalDateTime, val adressebeskyttelse: Adressebeskyttelse?, val innhold: DeltakelsesInnhold?, - val kilde: Kilde + val kilde: Kilde, + val forsteVedtakFattet: LocalDate?, + val historikk: List?, + val sistEndretAv: UUID?, + val sistEndretAvEnhet: UUID?, ) { fun harAdressebeskyttelse(): Boolean { return adressebeskyttelse != null diff --git a/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/DeltakerEndring.kt b/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/DeltakerEndring.kt new file mode 100644 index 000000000..79dfb9082 --- /dev/null +++ b/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/DeltakerEndring.kt @@ -0,0 +1,83 @@ +package no.nav.amt.tiltak.core.domain.tiltak + +import com.fasterxml.jackson.annotation.JsonSubTypes +import com.fasterxml.jackson.annotation.JsonTypeInfo +import java.time.LocalDate +import java.time.LocalDateTime +import java.util.UUID + +data class DeltakerEndring( + val id: UUID, + val deltakerId: UUID, + val endring: Endring, + val endretAv: UUID, + val endretAvEnhet: UUID, + val endret: LocalDateTime, +) { + data class Aarsak( + val type: Type, + val beskrivelse: String? = null, + ) { + init { + if (beskrivelse != null && type != Type.ANNET) { + error("Aarsak $type skal ikke ha beskrivelse") + } + } + + enum class Type { + SYK, FATT_JOBB, TRENGER_ANNEN_STOTTE, UTDANNING, IKKE_MOTT, ANNET + } + } + + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") + @JsonSubTypes( + JsonSubTypes.Type(value = Endring.EndreStartdato::class, name = "EndreStartdato"), + JsonSubTypes.Type(value = Endring.EndreSluttdato::class, name = "EndreSluttdato"), + JsonSubTypes.Type(value = Endring.EndreDeltakelsesmengde::class, name = "EndreDeltakelsesmengde"), + JsonSubTypes.Type(value = Endring.EndreBakgrunnsinformasjon::class, name = "EndreBakgrunnsinformasjon"), + JsonSubTypes.Type(value = Endring.EndreInnhold::class, name = "EndreInnhold"), + JsonSubTypes.Type(value = Endring.IkkeAktuell::class, name = "IkkeAktuell"), + JsonSubTypes.Type(value = Endring.ForlengDeltakelse::class, name = "ForlengDeltakelse"), + JsonSubTypes.Type(value = Endring.AvsluttDeltakelse::class, name = "AvsluttDeltakelse"), + JsonSubTypes.Type(value = Endring.EndreSluttarsak::class, name = "EndreSluttarsak"), + ) + sealed class Endring { + data class EndreBakgrunnsinformasjon( + val bakgrunnsinformasjon: String?, + ) : Endring() + + data class EndreInnhold( + val innhold: List, + ) : Endring() + + data class EndreDeltakelsesmengde( + val deltakelsesprosent: Float?, + val dagerPerUke: Float?, + ) : Endring() + + data class EndreStartdato( + val startdato: LocalDate?, + ) : Endring() + + data class EndreSluttdato( + val sluttdato: LocalDate, + ) : Endring() + + data class ForlengDeltakelse( + val sluttdato: LocalDate, + ) : Endring() + + data class IkkeAktuell( + val aarsak: Aarsak?, + ) : Endring() + + data class AvsluttDeltakelse( + val aarsak: Aarsak, + val sluttdato: LocalDate, + ) : Endring() + + data class EndreSluttarsak( + val aarsak: Aarsak, + ) : Endring() + } +} diff --git a/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/DeltakerHistorikk.kt b/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/DeltakerHistorikk.kt new file mode 100644 index 000000000..6f98af036 --- /dev/null +++ b/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/DeltakerHistorikk.kt @@ -0,0 +1,14 @@ +package no.nav.amt.tiltak.core.domain.tiltak + +import com.fasterxml.jackson.annotation.JsonSubTypes +import com.fasterxml.jackson.annotation.JsonTypeInfo + +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") +@JsonSubTypes( + JsonSubTypes.Type(value = DeltakerHistorikk.Endring::class, name = "Endring"), + JsonSubTypes.Type(value = DeltakerHistorikk.Vedtak::class, name = "Vedtak"), +) +sealed class DeltakerHistorikk { + data class Endring(val endring: DeltakerEndring) : DeltakerHistorikk() + data class Vedtak(val vedtak: no.nav.amt.tiltak.core.domain.tiltak.Vedtak) : DeltakerHistorikk() +} diff --git a/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/DeltakerUpsert.kt b/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/DeltakerUpsert.kt index 10fc512b2..9d9b4710e 100644 --- a/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/DeltakerUpsert.kt +++ b/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/DeltakerUpsert.kt @@ -16,7 +16,11 @@ data class DeltakerUpsert( val prosentStilling: Float? = null, val innsokBegrunnelse: String?, val innhold: DeltakelsesInnhold?, - val kilde: Kilde + val kilde: Kilde, + val forsteVedtakFattet: LocalDate?, + val historikk: List?, + val sistEndretAv: UUID?, + val sistEndretAvEnhet: UUID?, ) { fun compareTo(deltaker: Deltaker): Boolean { // Her kan man ikke enkelt sammenlikne hele objektet fordi sammenlikning av localdatetime må rundes av pga ms presisjon @@ -25,6 +29,8 @@ data class DeltakerUpsert( && registrertDato.truncatedTo(ChronoUnit.MILLIS) == deltaker.registrertDato.truncatedTo(ChronoUnit.MILLIS) && dagerPerUke == deltaker.dagerPerUke && prosentStilling == deltaker.prosentStilling && innsokBegrunnelse == deltaker.innsokBegrunnelse && innhold == deltaker.innhold && kilde == deltaker.kilde + && forsteVedtakFattet == deltaker.forsteVedtakFattet && sistEndretAv == deltaker.sistEndretAv + && sistEndretAvEnhet == deltaker.sistEndretAvEnhet return statusEquals && deltakerEquals } diff --git a/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/Vedtak.kt b/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/Vedtak.kt new file mode 100644 index 000000000..82c72f3d5 --- /dev/null +++ b/core/src/main/kotlin/no/nav/amt/tiltak/core/domain/tiltak/Vedtak.kt @@ -0,0 +1,31 @@ +package no.nav.amt.tiltak.core.domain.tiltak + +import java.time.LocalDate +import java.time.LocalDateTime +import java.util.UUID + +data class Vedtak( + val id: UUID, + val deltakerId: UUID, + val fattet: LocalDateTime?, + val gyldigTil: LocalDateTime?, + val deltakerVedVedtak: DeltakerVedVedtak, + val fattetAvNav: Boolean, + val opprettet: LocalDateTime, + val opprettetAv: UUID, + val opprettetAvEnhet: UUID, + val sistEndret: LocalDateTime, + val sistEndretAv: UUID, + val sistEndretAvEnhet: UUID, +) + +data class DeltakerVedVedtak( + val id: UUID, + val startdato: LocalDate?, + val sluttdato: LocalDate?, + val dagerPerUke: Float?, + val deltakelsesprosent: Float?, + val bakgrunnsinformasjon: String?, + val innhold: List, + val status: DeltakerStatus, +) diff --git a/core/src/main/kotlin/no/nav/amt/tiltak/core/port/DeltakerService.kt b/core/src/main/kotlin/no/nav/amt/tiltak/core/port/DeltakerService.kt index 3cc1336f7..312f0cac3 100644 --- a/core/src/main/kotlin/no/nav/amt/tiltak/core/port/DeltakerService.kt +++ b/core/src/main/kotlin/no/nav/amt/tiltak/core/port/DeltakerService.kt @@ -3,6 +3,7 @@ package no.nav.amt.tiltak.core.port import no.nav.amt.tiltak.core.domain.tiltak.Deltaker import no.nav.amt.tiltak.core.domain.tiltak.DeltakerStatusInsert import no.nav.amt.tiltak.core.domain.tiltak.DeltakerUpsert +import no.nav.amt.tiltak.core.domain.tiltak.Kilde import no.nav.amt.tiltak.core.domain.tiltak.Vurdering import no.nav.amt.tiltak.core.domain.tiltak.Vurderingstype import java.time.LocalDateTime @@ -22,7 +23,7 @@ interface DeltakerService { fun progressStatuser() - fun slettDeltaker(deltakerId: UUID) + fun slettDeltaker(deltakerId: UUID, kilde: Kilde) fun hentDeltakereMedPersonIdent(personIdent: String): List diff --git a/data-publisher/src/main/kotlin/no/nav/amt/tiltak/data_publisher/model/DeltakerPublishDto.kt b/data-publisher/src/main/kotlin/no/nav/amt/tiltak/data_publisher/model/DeltakerPublishDto.kt index 6e0187ade..6ab1920a2 100644 --- a/data-publisher/src/main/kotlin/no/nav/amt/tiltak/data_publisher/model/DeltakerPublishDto.kt +++ b/data-publisher/src/main/kotlin/no/nav/amt/tiltak/data_publisher/model/DeltakerPublishDto.kt @@ -2,6 +2,7 @@ package no.nav.amt.tiltak.data_publisher.model import no.nav.amt.tiltak.core.domain.tiltak.Adresse import no.nav.amt.tiltak.core.domain.tiltak.Adressebeskyttelse +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerHistorikk import no.nav.amt.tiltak.core.domain.tiltak.DeltakerStatus import no.nav.amt.tiltak.core.domain.tiltak.Kilde import no.nav.amt.tiltak.core.domain.tiltak.Vurdering @@ -26,7 +27,11 @@ data class DeltakerPublishDto( val navVeileder: DeltakerNavVeilederDto?, val deltarPaKurs: Boolean, val vurderingerFraArrangor: List?, - val kilde: Kilde? + val kilde: Kilde?, + val forsteVedtakFattet: LocalDate?, + val historikk: List?, + val sistEndretAv: UUID?, + val sistEndretAvEnhet: UUID?, ) { fun digest() = DigestUtils.md5DigestAsHex(JsonUtils.toJson(this).toByteArray()) } @@ -47,6 +52,7 @@ data class Navn( ) data class DeltakerStatusDto( + val id: UUID?, val type: DeltakerStatus.Type, val aarsak: DeltakerStatus.Aarsak?, val gyldigFra: LocalDateTime, diff --git a/data-publisher/src/main/kotlin/no/nav/amt/tiltak/data_publisher/publish/DeltakerPublishQuery.kt b/data-publisher/src/main/kotlin/no/nav/amt/tiltak/data_publisher/publish/DeltakerPublishQuery.kt index 8fb478d64..fc237a443 100644 --- a/data-publisher/src/main/kotlin/no/nav/amt/tiltak/data_publisher/publish/DeltakerPublishQuery.kt +++ b/data-publisher/src/main/kotlin/no/nav/amt/tiltak/data_publisher/publish/DeltakerPublishQuery.kt @@ -13,6 +13,7 @@ import no.nav.amt.tiltak.common.db_utils.getUUID import no.nav.amt.tiltak.common.json.JsonUtils import no.nav.amt.tiltak.core.domain.tiltak.Adresse import no.nav.amt.tiltak.core.domain.tiltak.Adressebeskyttelse +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerHistorikk import no.nav.amt.tiltak.core.domain.tiltak.DeltakerStatus import no.nav.amt.tiltak.core.domain.tiltak.Kilde import no.nav.amt.tiltak.core.domain.tiltak.Vurdering @@ -33,7 +34,6 @@ import java.util.UUID class DeltakerPublishQuery( private val template: NamedParameterJdbcTemplate ) { - fun get(id: UUID): Result { val deltaker = getDeltaker(id) ?: return Result.PublishTombstone() @@ -41,6 +41,8 @@ class DeltakerPublishQuery( val vurderinger = getVurderinger(id) + if (deltaker.kilde == Kilde.KOMET && vurderinger.isEmpty()) return Result.DontPublish() + return DeltakerPublishDto( deltaker.id, deltakerlisteId = deltaker.deltakerlisteId, @@ -75,6 +77,7 @@ class DeltakerPublishQuery( ) }, status = DeltakerStatusDto( + id = deltaker.statusId, type = DeltakerStatus.Type.valueOf(deltaker.status), aarsak = deltaker.statusAarsak?.let { DeltakerStatus.Aarsak.valueOf(it) }, gyldigFra = deltaker.statusGyldigFra!!, @@ -82,7 +85,11 @@ class DeltakerPublishQuery( ), deltarPaKurs = deltaker.deltarPaKurs, vurderingerFraArrangor = vurderinger, - kilde = deltaker.kilde + kilde = deltaker.kilde, + forsteVedtakFattet = deltaker.forsteVedtakFattet, + historikk = deltaker.historikk, + sistEndretAv = deltaker.sistEndretAv, + sistEndretAvEnhet = deltaker.sistEndretAvEnhet ).let { Result.OK(it) } } @@ -106,11 +113,16 @@ class DeltakerPublishQuery( deltaker.registrert_dato, deltaker.innsok_begrunnelse, deltaker.kilde, + deltaker.forste_vedtak_fattet, + deltaker.historikk, + deltaker.sist_endret_av, + deltaker.sist_endret_av_enhet, nav_enhet.navn as nav_enhet_navn, nav_ansatt.id as nav_ansatt_id, nav_ansatt.navn as nav_ansatt_navn, nav_ansatt.epost as nav_ansatt_epost, nav_ansatt.telefonnummer as nav_ansatt_telefonnummer, + status.id as status_id, status.status as status, status.aarsak as status_aarsak, status.gyldig_fra as status_gyldig_fra, @@ -121,7 +133,7 @@ class DeltakerPublishQuery( left join bruker on deltaker.bruker_id = bruker.id left join nav_enhet on bruker.nav_enhet_id = nav_enhet.id left join nav_ansatt on bruker.ansvarlig_veileder_id = nav_ansatt.id - left join (select deltaker_id, status, aarsak, gyldig_fra, created_at + left join (select id, deltaker_id, status, aarsak, gyldig_fra, created_at from deltaker_status where aktiv is true) status on status.deltaker_id = deltaker.id where deltaker.id = :deltakerId @@ -183,12 +195,17 @@ class DeltakerPublishQuery( val navAnsattNavn: String?, val navAnsattEpost: String?, val navAnsattTelefonnummer: String?, + val statusId: UUID?, val status: String?, val statusAarsak: String?, val statusGyldigFra: LocalDateTime?, val statusCreatedAt: LocalDateTime?, val deltarPaKurs: Boolean, - val kilde: Kilde + val kilde: Kilde, + val forsteVedtakFattet: LocalDate?, + val historikk: List?, + val sistEndretAv: UUID?, + val sistEndretAvEnhet: UUID?, ) { companion object { val rowMapper = RowMapper { rs, _ -> @@ -215,12 +232,19 @@ class DeltakerPublishQuery( navAnsattNavn = rs.getNullableString("nav_ansatt_navn"), navAnsattEpost = rs.getNullableString("nav_ansatt_epost"), navAnsattTelefonnummer = rs.getNullableString("nav_ansatt_telefonnummer"), + statusId = rs.getNullableUUID("status_id"), status = rs.getString("status"), statusAarsak = rs.getNullableString("status_aarsak"), statusGyldigFra = rs.getNullableLocalDateTime("status_gyldig_fra"), statusCreatedAt = rs.getNullableLocalDateTime("status_opprettet_dato"), deltarPaKurs = rs.getBoolean("er_kurs"), - kilde = Kilde.valueOf(rs.getString("kilde")) + kilde = Kilde.valueOf(rs.getString("kilde")), + forsteVedtakFattet = rs.getNullableLocalDate("forste_vedtak_fattet"), + historikk = rs.getString("historikk")?.let { h -> + JsonUtils.fromJsonString>(h).map { JsonUtils.fromJsonString(it) } + }, + sistEndretAv = rs.getNullableUUID("sist_endret_av"), + sistEndretAvEnhet = rs.getNullableUUID("sist_endret_av_enhet") ) } } diff --git a/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/DataPublisherServiceTest.kt b/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/DataPublisherServiceTest.kt index d93b64245..852ab2943 100644 --- a/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/DataPublisherServiceTest.kt +++ b/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/DataPublisherServiceTest.kt @@ -94,6 +94,5 @@ private fun createTopicProperties(): KafkaTopicProperties = KafkaTopicProperties amtDeltakerTopic = "", amtArrangorAnsattTopic = "", amtNavBrukerPersonaliaTopic = "", - amtNavAnsattPersonaliaTopic = "", - amtDeltakerEndringTopic = "" + amtNavAnsattPersonaliaTopic = "" ) diff --git a/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/DatabaseTestDataHandler.kt b/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/DatabaseTestDataHandler.kt index fe9446316..42bf7a3fe 100644 --- a/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/DatabaseTestDataHandler.kt +++ b/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/DatabaseTestDataHandler.kt @@ -53,8 +53,9 @@ class DatabaseTestDataHandler(template: NamedParameterJdbcTemplate) { brukerId: UUID = createBruker().id, gjennomforingId: UUID = createDeltakerliste().id, registrertDato: LocalDateTime = LocalDateTime.now(), - endretDato: LocalDateTime = LocalDateTime.now() - ): DeltakerInput = deltakerInput(brukerId, gjennomforingId, registrertDato, endretDato) + endretDato: LocalDateTime = LocalDateTime.now(), + kilde: Kilde = Kilde.ARENA + ): DeltakerInput = deltakerInput(brukerId, gjennomforingId, registrertDato, endretDato, kilde) .also { testDataRepository.insertDeltaker(it) } .also { testDataRepository.insertDeltakerStatus(createDeltakerStatus(it.id)) } @@ -191,7 +192,8 @@ class DatabaseTestDataHandler(template: NamedParameterJdbcTemplate) { brukerId: UUID, gjennomforingId: UUID, registrertDato: LocalDateTime, - endretDato: LocalDateTime + endretDato: LocalDateTime, + kilde: Kilde = Kilde.ARENA ): DeltakerInput = DeltakerInput( id = UUID.randomUUID(), brukerId = brukerId, @@ -213,7 +215,11 @@ class DatabaseTestDataHandler(template: NamedParameterJdbcTemplate) { ) ), ), - kilde = Kilde.ARENA + kilde = kilde, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) private fun navAnsattInput(): NavAnsattInput = NavAnsattInput( diff --git a/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/publish/DeltakerPublishQueryTest.kt b/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/publish/DeltakerPublishQueryTest.kt index 9353c91b2..96110ab07 100644 --- a/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/publish/DeltakerPublishQueryTest.kt +++ b/data-publisher/src/test/kotlin/no/nav/amt/tiltak/data_publisher/publish/DeltakerPublishQueryTest.kt @@ -3,6 +3,7 @@ package no.nav.amt.tiltak.data_publisher.publish import io.kotest.assertions.fail import io.kotest.core.spec.style.FunSpec import io.kotest.matchers.shouldBe +import no.nav.amt.tiltak.core.domain.tiltak.Kilde import no.nav.amt.tiltak.data_publisher.DatabaseTestDataHandler import no.nav.amt.tiltak.test.database.DbTestDataUtils import no.nav.amt.tiltak.test.database.SingletonPostgresContainer @@ -31,4 +32,13 @@ class DeltakerPublishQueryTest : FunSpec({ else -> fail("Should be ok, was $data") } } + + test("get - deltaker fra komet, uten vurdering, skal ikke publisere") { + val input = db.createDeltaker(kilde = Kilde.KOMET) + + when (val data = query.get(input.id)) { + is DeltakerPublishQuery.Result.DontPublish -> {} + else -> fail("Should be ok, was $data") + } + } }) diff --git a/db-migrations/src/main/resources/db/migration/V57__deltaker_add_columns.sql b/db-migrations/src/main/resources/db/migration/V57__deltaker_add_columns.sql new file mode 100644 index 000000000..41c50ade0 --- /dev/null +++ b/db-migrations/src/main/resources/db/migration/V57__deltaker_add_columns.sql @@ -0,0 +1,5 @@ +ALTER TABLE deltaker + ADD COLUMN forste_vedtak_fattet date, + ADD COLUMN historikk jsonb, + ADD COLUMN sist_endret_av uuid, + ADD COLUMN sist_endret_av_enhet uuid; \ No newline at end of file diff --git a/kafka/arena-acl-ingestor/src/main/kotlin/no/nav/amt/tiltak/ingestors/arena_acl_ingestor/processor/DeltakerProcessor.kt b/kafka/arena-acl-ingestor/src/main/kotlin/no/nav/amt/tiltak/ingestors/arena_acl_ingestor/processor/DeltakerProcessor.kt index b9a8a8a67..461a63504 100644 --- a/kafka/arena-acl-ingestor/src/main/kotlin/no/nav/amt/tiltak/ingestors/arena_acl_ingestor/processor/DeltakerProcessor.kt +++ b/kafka/arena-acl-ingestor/src/main/kotlin/no/nav/amt/tiltak/ingestors/arena_acl_ingestor/processor/DeltakerProcessor.kt @@ -66,7 +66,11 @@ class DeltakerProcessor( gjennomforingId = gjennomforingId, innsokBegrunnelse = deltakerDto.innsokBegrunnelse, innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) transactionTemplate.executeWithoutResult { @@ -148,7 +152,7 @@ class DeltakerProcessor( log.info("Motatt delete-melding, sletter deltaker med id=$deltakerId") - deltakerService.slettDeltaker(deltakerId) + deltakerService.slettDeltaker(deltakerId, Kilde.ARENA) } } diff --git a/kafka/deltaker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/deltaker_ingestor/DeltakerDto.kt b/kafka/deltaker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/deltaker_ingestor/DeltakerDto.kt index 693745ed6..f4676c543 100644 --- a/kafka/deltaker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/deltaker_ingestor/DeltakerDto.kt +++ b/kafka/deltaker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/deltaker_ingestor/DeltakerDto.kt @@ -1,38 +1,70 @@ package no.nav.amt.tiltak.kafka.deltaker_ingestor +import no.nav.amt.tiltak.core.domain.tiltak.Adresse +import no.nav.amt.tiltak.core.domain.tiltak.Adressebeskyttelse import no.nav.amt.tiltak.core.domain.tiltak.DeltakelsesInnhold +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerHistorikk import no.nav.amt.tiltak.core.domain.tiltak.DeltakerStatus -import no.nav.amt.tiltak.core.domain.tiltak.Innhold +import no.nav.amt.tiltak.core.domain.tiltak.Kilde import java.time.LocalDate import java.time.LocalDateTime import java.util.UUID data class DeltakerDto( val id: UUID, - val personId: UUID, - val personident: String, val deltakerlisteId: UUID, - val startdato: LocalDate?, - val sluttdato: LocalDate?, + val personalia: DeltakerPersonaliaDto, + val status: DeltakerStatusDto, val dagerPerUke: Float?, - val deltakelsesprosent: Float?, - val bakgrunnsinformasjon: String?, + val prosentStilling: Double?, + val oppstartsdato: LocalDate?, + val sluttdato: LocalDate?, + val innsoktDato: LocalDate, + val forsteVedtakFattet: LocalDate?, + val bestillingTekst: String?, + val navKontor: String?, + val navVeileder: DeltakerNavVeilederDto?, + val deltarPaKurs: Boolean, + val kilde: Kilde?, val innhold: DeltakelsesInnhold?, - val status: DeltakerStatusDto, - val sistEndret: LocalDateTime, - val opprettet: LocalDateTime, + val historikk: List?, + val sistEndretAv: UUID?, + val sistEndretAvEnhet: UUID?, + val sistEndret: LocalDateTime?, ) -data class DeltakerStatusDto( - val id: UUID, - val type: DeltakerStatus.Type, - val aarsak: AarsakDto?, - val gyldigFra: LocalDateTime, - val gyldigTil: LocalDateTime?, - val opprettet: LocalDateTime, +data class DeltakerPersonaliaDto( + val personId: UUID?, + val personident: String, + val navn: Navn, + val kontaktinformasjon: DeltakerKontaktinformasjonDto, + val skjermet: Boolean, + val adresse: Adresse?, + val adressebeskyttelse: Adressebeskyttelse?, ) { - data class AarsakDto( - val type: DeltakerStatus.Aarsak, - val beskrivelse: String?, + data class Navn( + val fornavn: String, + val mellomnavn: String?, + val etternavn: String, + ) + + data class DeltakerKontaktinformasjonDto( + val telefonnummer: String?, + val epost: String?, ) } + +data class DeltakerNavVeilederDto( + val id: UUID, + val navn: String, + val epost: String?, + val telefonnummer: String?, +) + +data class DeltakerStatusDto( + val id: UUID?, + val type: DeltakerStatus.Type, + val aarsak: DeltakerStatus.Aarsak?, + val gyldigFra: LocalDateTime, + val opprettetDato: LocalDateTime, +) diff --git a/kafka/deltaker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/deltaker_ingestor/DeltakerIngestorImpl.kt b/kafka/deltaker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/deltaker_ingestor/DeltakerIngestorImpl.kt index d41902e4b..7e67b118c 100644 --- a/kafka/deltaker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/deltaker_ingestor/DeltakerIngestorImpl.kt +++ b/kafka/deltaker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/deltaker_ingestor/DeltakerIngestorImpl.kt @@ -38,11 +38,17 @@ class DeltakerIngestorImpl( if (unleashClient.isEnabled("amt.enable-komet-deltakere")) { val deltakerId = UUID.fromString(key) if (value == null) { - deltakerService.slettDeltaker(deltakerId) - log.info("Slettet deltaker fra ny løsning med id $deltakerId") + val deltaker = deltakerService.hentDeltaker(deltakerId) + if (deltaker?.kilde == Kilde.KOMET) { + deltakerService.slettDeltaker(deltakerId, Kilde.KOMET) + log.info("Slettet deltaker fra ny løsning med id $deltakerId") + } } else { - upsert(fromJsonString(value)) - log.info("Håndterte deltaker fra ny løsning med id $deltakerId") + val deltakerDto: DeltakerDto = fromJsonString(value) + if (deltakerDto.kilde == Kilde.KOMET) { + upsert(deltakerDto) + log.info("Håndterte deltaker fra ny løsning med id $deltakerId") + } } } } @@ -61,29 +67,33 @@ class DeltakerIngestorImpl( } val status = DeltakerStatusInsert( - id = deltakerDto.status.id, + id = deltakerDto.status.id ?: UUID.randomUUID(), deltakerId = deltakerDto.id, type = deltakerDto.status.type, - aarsak = deltakerDto.status.aarsak?.type, + aarsak = deltakerDto.status.aarsak, gyldigFra = deltakerDto.status.gyldigFra, ) val deltakerUpsert = DeltakerUpsert( id = deltakerDto.id, statusInsert = status, - startDato = deltakerDto.startdato, + startDato = deltakerDto.oppstartsdato, sluttDato = deltakerDto.sluttdato, dagerPerUke = deltakerDto.dagerPerUke, - prosentStilling = deltakerDto.deltakelsesprosent, - registrertDato = deltakerDto.opprettet, + prosentStilling = deltakerDto.prosentStilling?.toFloat(), + registrertDato = deltakerDto.innsoktDato.atStartOfDay(), gjennomforingId = gjennomforingId, - innsokBegrunnelse = deltakerDto.bakgrunnsinformasjon, + innsokBegrunnelse = deltakerDto.bestillingTekst, innhold = deltakerDto.innhold, - kilde = Kilde.KOMET + kilde = Kilde.KOMET, + forsteVedtakFattet = deltakerDto.forsteVedtakFattet, + historikk = deltakerDto.historikk, + sistEndretAv = deltakerDto.sistEndretAv, + sistEndretAvEnhet = deltakerDto.sistEndretAvEnhet ) transactionTemplate.executeWithoutResult { - deltakerService.upsertDeltaker(deltakerDto.personident, deltakerUpsert) + deltakerService.upsertDeltaker(deltakerDto.personalia.personident, deltakerUpsert) } log.info("Fullført upsert av deltaker id=${deltakerUpsert.id} deltakerlisteId=${gjennomforingId} fra ny løsning") } diff --git a/kafka/kafka-config/src/main/kotlin/no/nav/amt/tiltak/kafka/config/KafkaConfiguration.kt b/kafka/kafka-config/src/main/kotlin/no/nav/amt/tiltak/kafka/config/KafkaConfiguration.kt index e3d4d7024..917834732 100644 --- a/kafka/kafka-config/src/main/kotlin/no/nav/amt/tiltak/kafka/config/KafkaConfiguration.kt +++ b/kafka/kafka-config/src/main/kotlin/no/nav/amt/tiltak/kafka/config/KafkaConfiguration.kt @@ -1,7 +1,13 @@ package no.nav.amt.tiltak.kafka.config import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider -import no.nav.amt.tiltak.core.kafka.* +import no.nav.amt.tiltak.core.kafka.AmtArrangorIngestor +import no.nav.amt.tiltak.core.kafka.AnsattIngestor +import no.nav.amt.tiltak.core.kafka.ArenaAclIngestor +import no.nav.amt.tiltak.core.kafka.DeltakerIngestor +import no.nav.amt.tiltak.core.kafka.GjennomforingIngestor +import no.nav.amt.tiltak.core.kafka.NavAnsattIngestor +import no.nav.amt.tiltak.core.kafka.NavBrukerIngestor import no.nav.common.kafka.consumer.KafkaConsumerClient import no.nav.common.kafka.consumer.feilhandtering.KafkaConsumerRecordProcessor import no.nav.common.kafka.consumer.feilhandtering.util.KafkaConsumerRecordProcessorBuilder @@ -115,7 +121,7 @@ open class KafkaConfiguration( .withLogging() .withStoreOnFailure(consumerRepository) .withConsumerConfig( - kafkaTopicProperties.amtDeltakerEndringTopic, + kafkaTopicProperties.amtDeltakerTopic, stringDeserializer(), stringDeserializer(), Consumer> { deltakerIngestor.ingest(it.key(), it.value()) } diff --git a/kafka/kafka-config/src/main/kotlin/no/nav/amt/tiltak/kafka/config/KafkaTopicProperties.kt b/kafka/kafka-config/src/main/kotlin/no/nav/amt/tiltak/kafka/config/KafkaTopicProperties.kt index 198d15fcd..42051a22e 100644 --- a/kafka/kafka-config/src/main/kotlin/no/nav/amt/tiltak/kafka/config/KafkaTopicProperties.kt +++ b/kafka/kafka-config/src/main/kotlin/no/nav/amt/tiltak/kafka/config/KafkaTopicProperties.kt @@ -9,7 +9,6 @@ data class KafkaTopicProperties( val deltakerTopic: String, val amtNavBrukerPersonaliaTopic: String, val amtNavAnsattPersonaliaTopic: String, - val amtDeltakerEndringTopic: String, //Internal publish topics val amtArrangorTopic: String, diff --git a/kafka/nav-bruker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/nav_bruker_ingestor/NavBrukerIngestorImpl.kt b/kafka/nav-bruker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/nav_bruker_ingestor/NavBrukerIngestorImpl.kt index 4f9a72f78..3390cba4e 100644 --- a/kafka/nav-bruker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/nav_bruker_ingestor/NavBrukerIngestorImpl.kt +++ b/kafka/nav-bruker-ingestor/src/main/kotlin/no/nav/amt/tiltak/kafka/nav_bruker_ingestor/NavBrukerIngestorImpl.kt @@ -57,7 +57,7 @@ class NavBrukerIngestorImpl( log.info("Mottok tombstone for nav-bruker $personId - sletter bruker og deltakere") val deltakere = deltakerService.hentDeltakereMedPersonId(personId) - deltakere.forEach { deltakerService.slettDeltaker(it.id) } + deltakere.forEach { deltakerService.slettDeltaker(it.id, it.kilde) } brukerService.slettBruker(personId) } diff --git a/test-integration/src/main/kotlin/no/nav/amt/tiltak/test/integration/utils/KafkaMessageSender.kt b/test-integration/src/main/kotlin/no/nav/amt/tiltak/test/integration/utils/KafkaMessageSender.kt index 534e89a08..1b43354ff 100644 --- a/test-integration/src/main/kotlin/no/nav/amt/tiltak/test/integration/utils/KafkaMessageSender.kt +++ b/test-integration/src/main/kotlin/no/nav/amt/tiltak/test/integration/utils/KafkaMessageSender.kt @@ -5,7 +5,7 @@ import no.nav.common.kafka.producer.KafkaProducerClientImpl import org.apache.kafka.clients.producer.ProducerRecord import org.springframework.beans.factory.annotation.Value import org.springframework.stereotype.Component -import java.util.* +import java.util.UUID @Component class KafkaMessageSender( @@ -24,8 +24,8 @@ class KafkaMessageSender( private val navBrukerTopic: String, @Value("\${app.env.amtNavAnsattPersonaliaTopic}") private val navAnsattTopic: String, - @Value("\${app.env.amtDeltakerEndringTopic}") - private val amtDeltakerEndringTopic: String, + @Value("\${app.env.amtDeltakerTopic}") + private val amtDeltakerTopic: String, ) { private val kafkaProducer = KafkaProducerClientImpl(properties.producer()) @@ -57,7 +57,7 @@ class KafkaMessageSender( kafkaProducer.send(ProducerRecord(navAnsattTopic, key.toString().toByteArray(), jsonString?.toByteArray())) } - fun sendTilDeltakerEndringTopic(key: UUID, jsonString: String?) { - kafkaProducer.send(ProducerRecord(amtDeltakerEndringTopic, key.toString().toByteArray(), jsonString?.toByteArray())) + fun sendTilDeltakerV2Topic(key: UUID, jsonString: String?) { + kafkaProducer.send(ProducerRecord(amtDeltakerTopic, key.toString().toByteArray(), jsonString?.toByteArray())) } } diff --git a/test-integration/src/main/resources/application-integration.properties b/test-integration/src/main/resources/application-integration.properties index 2224629b8..42c0fd96a 100644 --- a/test-integration/src/main/resources/application-integration.properties +++ b/test-integration/src/main/resources/application-integration.properties @@ -16,7 +16,6 @@ app.env.amtDeltakerTopic=amt-deltaker-topic app.env.amtEndringsmeldingTopic=amt-endringsmelding-topic app.env.amtNavBrukerPersonaliaTopic=amt-nav-bruker-personalia-topic app.env.amtNavAnsattPersonaliaTopic=amt-nav-ansatt-personalia-topic -app.env.amtDeltakerEndringTopic=amt-deltaker-endring-topic ad_gruppe_tilgang_til_egne_ansatte=egen_ansatt_tilgang_id ad_gruppe_tiltak_ansvarlig=tiltak_ansvarlig_tilgang_id diff --git a/test-integration/src/test/kotlin/no/nav/amt/tiltak/test/integration/kafka/DeltakerIngestorTest.kt b/test-integration/src/test/kotlin/no/nav/amt/tiltak/test/integration/kafka/DeltakerIngestorTest.kt index 1e8663655..f8816869b 100644 --- a/test-integration/src/test/kotlin/no/nav/amt/tiltak/test/integration/kafka/DeltakerIngestorTest.kt +++ b/test-integration/src/test/kotlin/no/nav/amt/tiltak/test/integration/kafka/DeltakerIngestorTest.kt @@ -2,14 +2,17 @@ package no.nav.amt.tiltak.test.integration.kafka import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldNotBe -import no.nav.amt.tiltak.common.json.JsonUtils +import no.nav.amt.tiltak.common.json.JsonUtils.toJsonString import no.nav.amt.tiltak.core.domain.tiltak.DeltakelsesInnhold import no.nav.amt.tiltak.core.domain.tiltak.Deltaker +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerEndring +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerHistorikk import no.nav.amt.tiltak.core.domain.tiltak.DeltakerStatus import no.nav.amt.tiltak.core.domain.tiltak.Innhold import no.nav.amt.tiltak.core.domain.tiltak.Kilde import no.nav.amt.tiltak.core.port.DeltakerService import no.nav.amt.tiltak.kafka.deltaker_ingestor.DeltakerDto +import no.nav.amt.tiltak.kafka.deltaker_ingestor.DeltakerPersonaliaDto import no.nav.amt.tiltak.kafka.deltaker_ingestor.DeltakerStatusDto import no.nav.amt.tiltak.test.database.DbTestDataUtils import no.nav.amt.tiltak.test.database.DbUtils.shouldBeCloseTo @@ -37,9 +40,9 @@ class DeltakerIngestorTest : IntegrationTestBase() { @Test fun `ingest - ny deltaker - oppretter deltaker`() { val deltakerDto = mockDeltakerDto(TestData.GJENNOMFORING_1.id) - val value = JsonUtils.toJsonString(deltakerDto) + val value = toJsonString(deltakerDto) - kafkaMessageSender.sendTilDeltakerEndringTopic(deltakerDto.id, value) + kafkaMessageSender.sendTilDeltakerV2Topic(deltakerDto.id, value) AsyncUtils.eventually { val lagretDeltaker = deltakerService.hentDeltaker(deltakerDto.id) @@ -53,9 +56,9 @@ class DeltakerIngestorTest : IntegrationTestBase() { val deltakerlisteId = UUID.randomUUID() mockMulighetsrommetApiServer.gjennomforingArenaData(deltakerlisteId, null) val deltakerDto = mockDeltakerDto(deltakerlisteId) - val value = JsonUtils.toJsonString(deltakerDto) + val value = toJsonString(deltakerDto) - kafkaMessageSender.sendTilDeltakerEndringTopic(deltakerDto.id, value) + kafkaMessageSender.sendTilDeltakerV2Topic(deltakerDto.id, value) AsyncUtils.eventually { val lagretDeltaker = deltakerService.hentDeltaker(deltakerDto.id) @@ -65,58 +68,94 @@ class DeltakerIngestorTest : IntegrationTestBase() { @Test fun `ingest - tombstone - sletter deltaker`() { - kafkaMessageSender.sendTilDeltakerEndringTopic(TestData.DELTAKER_4.id, null) + val deltakerId = UUID.randomUUID() + testDataRepository.insertDeltaker(TestData.DELTAKER_2.copy(id = deltakerId, kilde = Kilde.KOMET)) + testDataRepository.insertDeltakerStatus(TestData.DELTAKER_2_STATUS_1.copy(id = UUID.randomUUID(), deltakerId = deltakerId)) + kafkaMessageSender.sendTilDeltakerV2Topic(deltakerId, null) AsyncUtils.eventually { - val lagretDeltaker = deltakerService.hentDeltaker(TestData.DELTAKER_4.id) + val lagretDeltaker = deltakerService.hentDeltaker(deltakerId) lagretDeltaker shouldBe null } } - private fun mockDeltakerDto(deltakerlisteId: UUID): DeltakerDto = - DeltakerDto( - id = UUID.randomUUID(), - personId = UUID.randomUUID(), - personident = "12345678910", + private fun mockDeltakerDto(deltakerlisteId: UUID): DeltakerDto { + val deltakerId = UUID.randomUUID() + return DeltakerDto( + id = deltakerId, deltakerlisteId = deltakerlisteId, - startdato = LocalDate.now().plusDays(1), - sluttdato = LocalDate.now().plusWeeks(5), - dagerPerUke = null, - deltakelsesprosent = 100F, - bakgrunnsinformasjon = "Dette tiltket vil være nyttig", - innhold = DeltakelsesInnhold( - "Ledetekst", - listOf(Innhold( - tekst = "Visningstekst", - innholdskode = "type", - beskrivelse = null - )) + personalia = DeltakerPersonaliaDto( + personId = UUID.randomUUID(), + personident = "12345678910", + navn = DeltakerPersonaliaDto.Navn("Fornavn", null, "Etternavn"), + kontaktinformasjon = DeltakerPersonaliaDto.DeltakerKontaktinformasjonDto("90909090", "epost@nav.no"), + skjermet = false, + adresse = null, + adressebeskyttelse = null ), status = DeltakerStatusDto( id = UUID.randomUUID(), type = DeltakerStatus.Type.VENTER_PA_OPPSTART, aarsak = null, gyldigFra = LocalDateTime.now(), - gyldigTil = null, - opprettet = LocalDateTime.now(), + opprettetDato = LocalDateTime.now() ), - sistEndret = LocalDateTime.now(), - opprettet = LocalDateTime.now(), + dagerPerUke = null, + prosentStilling = 100.0, + oppstartsdato = LocalDate.now().plusDays(1), + sluttdato = LocalDate.now().plusWeeks(5), + innsoktDato = LocalDate.now().minusDays(2), + forsteVedtakFattet = LocalDate.now().minusDays(1), + bestillingTekst = "Dette tiltaket vil være nyttig", + navKontor = "0101", + navVeileder = null, + deltarPaKurs = false, + kilde = Kilde.KOMET, + innhold = DeltakelsesInnhold( + "Ledetekst", + listOf( + Innhold( + tekst = "Visningstekst", + innholdskode = "type", + beskrivelse = null + ) + ) + ), + historikk = listOf( + DeltakerHistorikk.Endring( + DeltakerEndring( + id = UUID.randomUUID(), + deltakerId = deltakerId, + endring = DeltakerEndring.Endring.EndreBakgrunnsinformasjon("Bakgrunn"), + endretAv = UUID.randomUUID(), + endretAvEnhet = UUID.randomUUID(), + endret = LocalDateTime.now().minusDays(1) + ) + ) + ), + sistEndretAv = UUID.randomUUID(), + sistEndretAvEnhet = UUID.randomUUID(), + sistEndret = LocalDateTime.now() ) + } private fun sammenlign(faktisk: Deltaker, forventet: DeltakerDto) { faktisk.id shouldBe forventet.id - faktisk.personIdent shouldBe forventet.personident + faktisk.personIdent shouldBe forventet.personalia.personident faktisk.gjennomforingId shouldBe forventet.deltakerlisteId - faktisk.startDato shouldBe forventet.startdato + faktisk.startDato shouldBe forventet.oppstartsdato faktisk.sluttDato shouldBe forventet.sluttdato faktisk.dagerPerUke shouldBe forventet.dagerPerUke - faktisk.prosentStilling shouldBe forventet.deltakelsesprosent - faktisk.innsokBegrunnelse shouldBe forventet.bakgrunnsinformasjon + faktisk.prosentStilling shouldBe forventet.prosentStilling + faktisk.innsokBegrunnelse shouldBe forventet.bestillingTekst faktisk.endretDato shouldBeCloseTo LocalDateTime.now() - faktisk.registrertDato shouldBeEqualTo forventet.opprettet + faktisk.registrertDato shouldBeCloseTo forventet.innsoktDato.atStartOfDay() + faktisk.forsteVedtakFattet shouldBe forventet.forsteVedtakFattet faktisk.innhold shouldBe forventet.innhold faktisk.kilde shouldBe Kilde.KOMET + (faktisk.historikk!!.first() as DeltakerHistorikk.Endring).endring.deltakerId shouldBe forventet.id + faktisk.sistEndretAv shouldBe forventet.sistEndretAv + faktisk.sistEndretAvEnhet shouldBe forventet.sistEndretAvEnhet sammenlignStatus(faktisk.status, forventet.status) } diff --git a/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/TestData.kt b/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/TestData.kt index bc80d06a4..570e6aeee 100644 --- a/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/TestData.kt +++ b/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/TestData.kt @@ -51,7 +51,11 @@ object TestData { beskrivelse = null )) ), - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) fun createStatusInput(deltaker: DeltakerInput) = DeltakerStatusInput( @@ -308,7 +312,11 @@ object TestData { innsokBegrunnelse = "begrunnelse deltaker 1", endretDato = LocalDateTime.of(2022, 2, 13, 12, 12), innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) @@ -367,7 +375,11 @@ object TestData { ) ), ), - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) val DELTAKER_2_STATUS_1 = DeltakerStatusInput( @@ -423,7 +435,11 @@ object TestData { registrertDato = LocalDateTime.of(2022, 2, 10, 12, 12), innsokBegrunnelse = "begrunnelse deltaker 4", innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) val DELTAKER_4_STATUS_1 = DeltakerStatusInput( diff --git a/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/TestDataRepository.kt b/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/TestDataRepository.kt index d3eaa8158..b5a2a2e60 100644 --- a/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/TestDataRepository.kt +++ b/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/TestDataRepository.kt @@ -113,11 +113,11 @@ class TestDataRepository( val sql = """ INSERT INTO deltaker ( id, bruker_id, gjennomforing_id, start_dato, - slutt_dato, dager_per_uke, prosent_stilling, registrert_dato, innsok_begrunnelse, modified_at + slutt_dato, dager_per_uke, prosent_stilling, registrert_dato, innsok_begrunnelse, modified_at, kilde ) VALUES ( :id, :bruker_id, :gjennomforing_id, :start_dato, - :slutt_dato, :dager_per_uke, :prosent_stilling, :registrert_dato, :innsok_begrunnelse, :modified_at + :slutt_dato, :dager_per_uke, :prosent_stilling, :registrert_dato, :innsok_begrunnelse, :modified_at, :kilde ); """.trimIndent() @@ -133,8 +133,8 @@ class TestDataRepository( "registrert_dato" to cmd.registrertDato, "innsok_begrunnelse" to cmd.innsokBegrunnelse, "modified_at" to cmd.endretDato, - - ) + "kilde" to cmd.kilde.name + ) ) } diff --git a/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/inputs/DeltakerInput.kt b/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/inputs/DeltakerInput.kt index c7970b6c2..1b33e28c7 100644 --- a/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/inputs/DeltakerInput.kt +++ b/test/database/src/main/kotlin/no/nav/amt/tiltak/test/database/data/inputs/DeltakerInput.kt @@ -2,6 +2,7 @@ package no.nav.amt.tiltak.test.database.data.inputs import no.nav.amt.tiltak.core.domain.tiltak.DeltakelsesInnhold import no.nav.amt.tiltak.core.domain.tiltak.Deltaker +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerHistorikk import no.nav.amt.tiltak.core.domain.tiltak.DeltakerStatus import no.nav.amt.tiltak.core.domain.tiltak.Kilde import java.time.LocalDate @@ -23,7 +24,11 @@ data class DeltakerInput( val createdAt: ZonedDateTime = ZonedDateTime.of(2022, 2, 13, 0, 0, 0, 0, ZoneId.systemDefault()), val endretDato: LocalDateTime = LocalDateTime.now(), val innhold: DeltakelsesInnhold?, - val kilde: Kilde + val kilde: Kilde, + val forsteVedtakFattet: LocalDate?, + val historikk: List?, + val sistEndretAv: UUID?, + val sistEndretAvEnhet: UUID? ) { fun toDeltaker(brukerInput: BrukerInput, statusInput: DeltakerStatusInput) = Deltaker( id = id, @@ -54,6 +59,10 @@ data class DeltakerInput( endretDato = endretDato, adressebeskyttelse = brukerInput.adressebeskyttelse, innhold = innhold, - kilde = kilde + kilde = kilde, + forsteVedtakFattet = forsteVedtakFattet, + historikk = historikk, + sistEndretAv = sistEndretAv, + sistEndretAvEnhet = sistEndretAvEnhet ) } diff --git a/tilgangskontroll-tiltaksarrangor/src/test/kotlin/no/nav/amt/tiltak/tilgangskontroll_tiltaksarrangor/tilgang/ArrangorAnsattTilgangServiceImplTest.kt b/tilgangskontroll-tiltaksarrangor/src/test/kotlin/no/nav/amt/tiltak/tilgangskontroll_tiltaksarrangor/tilgang/ArrangorAnsattTilgangServiceImplTest.kt index 068f212d6..9ab35cb96 100644 --- a/tilgangskontroll-tiltaksarrangor/src/test/kotlin/no/nav/amt/tiltak/tilgangskontroll_tiltaksarrangor/tilgang/ArrangorAnsattTilgangServiceImplTest.kt +++ b/tilgangskontroll-tiltaksarrangor/src/test/kotlin/no/nav/amt/tiltak/tilgangskontroll_tiltaksarrangor/tilgang/ArrangorAnsattTilgangServiceImplTest.kt @@ -116,7 +116,11 @@ class ArrangorAnsattTilgangServiceImplTest { endretDato = LocalDateTime.now(), adressebeskyttelse = null, innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) @BeforeEach diff --git a/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/dbo/DeltakerDbo.kt b/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/dbo/DeltakerDbo.kt index 9a9437693..7ad9a2ec7 100644 --- a/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/dbo/DeltakerDbo.kt +++ b/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/dbo/DeltakerDbo.kt @@ -3,6 +3,7 @@ package no.nav.amt.tiltak.deltaker.dbo import no.nav.amt.tiltak.core.domain.tiltak.Adressebeskyttelse import no.nav.amt.tiltak.core.domain.tiltak.DeltakelsesInnhold import no.nav.amt.tiltak.core.domain.tiltak.Deltaker +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerHistorikk import no.nav.amt.tiltak.core.domain.tiltak.DeltakerStatus import no.nav.amt.tiltak.core.domain.tiltak.Kilde import no.nav.amt.tiltak.nav_enhet.NavEnhetDbo @@ -32,7 +33,11 @@ data class DeltakerDbo( val innsokBegrunnelse: String?, val adressebeskyttelse: Adressebeskyttelse?, val innhold: DeltakelsesInnhold?, - val kilde: Kilde + val kilde: Kilde, + val forsteVedtakFattet: LocalDate?, + val historikk: List?, + val sistEndretAv: UUID?, + val sistEndretAvEnhet: UUID? ) { fun toDeltaker(status: DeltakerStatus): Deltaker { @@ -58,7 +63,11 @@ data class DeltakerDbo( endretDato = modifiedAt, adressebeskyttelse = adressebeskyttelse, innhold = innhold, - kilde = kilde + kilde = kilde, + forsteVedtakFattet = forsteVedtakFattet, + historikk = historikk, + sistEndretAv = sistEndretAv, + sistEndretAvEnhet = sistEndretAvEnhet ) } diff --git a/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/dbo/DeltakerUpsertDbo.kt b/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/dbo/DeltakerUpsertDbo.kt index 23a6cea0e..4ae4b7736 100644 --- a/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/dbo/DeltakerUpsertDbo.kt +++ b/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/dbo/DeltakerUpsertDbo.kt @@ -1,6 +1,7 @@ package no.nav.amt.tiltak.deltaker.dbo import no.nav.amt.tiltak.core.domain.tiltak.DeltakelsesInnhold +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerHistorikk import no.nav.amt.tiltak.core.domain.tiltak.Kilde import java.time.LocalDate import java.time.LocalDateTime @@ -17,5 +18,9 @@ data class DeltakerUpsertDbo( val prosentStilling: Float? = null, val innsokBegrunnelse: String? = null, val innhold: DeltakelsesInnhold?, - val kilde: Kilde + val kilde: Kilde, + val forsteVedtakFattet: LocalDate?, + val historikk: List?, + val sistEndretAv: UUID?, + val sistEndretAvEnhet: UUID? ) diff --git a/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/repositories/DeltakerRepository.kt b/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/repositories/DeltakerRepository.kt index 5b7630775..197939498 100644 --- a/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/repositories/DeltakerRepository.kt +++ b/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/repositories/DeltakerRepository.kt @@ -9,6 +9,7 @@ import no.nav.amt.tiltak.common.json.JsonUtils.fromJsonString import no.nav.amt.tiltak.core.domain.tiltak.AVSLUTTENDE_STATUSER import no.nav.amt.tiltak.core.domain.tiltak.Adressebeskyttelse import no.nav.amt.tiltak.core.domain.tiltak.DeltakelsesInnhold +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerHistorikk import no.nav.amt.tiltak.core.domain.tiltak.DeltakerStatus import no.nav.amt.tiltak.core.domain.tiltak.Gjennomforing import no.nav.amt.tiltak.core.domain.tiltak.Kilde @@ -56,14 +57,19 @@ open class DeltakerRepository( innsokBegrunnelse = rs.getNullableString("innsok_begrunnelse"), adressebeskyttelse = rs.getString("adressebeskyttelse")?.let { Adressebeskyttelse.valueOf(it) }, innhold = rs.getString("innhold")?.let { fromJsonString(it) }, - kilde = Kilde.valueOf(rs.getString("kilde")) + kilde = Kilde.valueOf(rs.getString("kilde")), + forsteVedtakFattet = rs.getDate("forste_vedtak_fattet")?.toLocalDate(), + historikk = rs.getString("historikk")?.let { h -> fromJsonString>(h).map { fromJsonString(it) } }, + sistEndretAv = rs.getNullableUUID("sist_endret_av"), + sistEndretAvEnhet = rs.getNullableUUID("sist_endret_av_enhet") ) } fun upsert(deltaker: DeltakerUpsertDbo) { val sql = """ INSERT INTO deltaker(id, bruker_id, gjennomforing_id, start_dato, slutt_dato, - dager_per_uke, prosent_stilling, registrert_dato, innsok_begrunnelse, innhold, kilde) + dager_per_uke, prosent_stilling, registrert_dato, innsok_begrunnelse, innhold, kilde, + forste_vedtak_fattet, historikk, sist_endret_av, sist_endret_av_enhet) VALUES (:id, :brukerId, :gjennomforingId, @@ -74,7 +80,11 @@ open class DeltakerRepository( :registrertDato, :innsokBegrunnelse, :innhold, - :kilde) + :kilde, + :forste_vedtak_fattet, + :historikk, + :sist_endret_av, + :sist_endret_av_enhet) ON CONFLICT (id) DO UPDATE SET start_dato = :startdato, @@ -84,6 +94,10 @@ open class DeltakerRepository( innsok_begrunnelse = :innsokBegrunnelse, innhold = :innhold, kilde = :kilde, + forste_vedtak_fattet = :forste_vedtak_fattet, + historikk = :historikk, + sist_endret_av = :sist_endret_av, + sist_endret_av_enhet = :sist_endret_av_enhet, modified_at = CURRENT_TIMESTAMP """.trimIndent() @@ -99,7 +113,11 @@ open class DeltakerRepository( "registrertDato" to deltaker.registrertDato, "innsokBegrunnelse" to deltaker.innsokBegrunnelse, "innhold" to deltaker.innhold?.toPGObject(), - "kilde" to deltaker.kilde.name + "kilde" to deltaker.kilde.name, + "forste_vedtak_fattet" to deltaker.forsteVedtakFattet, + "historikk" to deltaker.historikk?.toPGObject(), + "sist_endret_av" to deltaker.sistEndretAv, + "sist_endret_av_enhet" to deltaker.sistEndretAvEnhet ) ) @@ -248,6 +266,7 @@ open class DeltakerRepository( inner join bruker on bruker.id = deltaker.bruker_id LEFT JOIN nav_enhet ne ON ne.id = bruker.nav_enhet_id WHERE deltaker_status.aktiv = TRUE + AND deltaker.kilde != 'KOMET' AND deltaker_status.status IN (:gjennomforende_statuser) AND deltaker.slutt_dato < CURRENT_DATE """.trimIndent() @@ -271,6 +290,7 @@ open class DeltakerRepository( inner join gjennomforing on deltaker.gjennomforing_id = gjennomforing.id LEFT JOIN nav_enhet ne ON ne.id = bruker.nav_enhet_id WHERE deltaker_status.aktiv = TRUE + AND deltaker.kilde != 'KOMET' AND deltaker_status.status not in (:avsluttende_statuser) AND gjennomforing.status = :gjennomforing_status """.trimIndent() @@ -291,6 +311,7 @@ open class DeltakerRepository( inner join bruker on bruker.id = deltaker.bruker_id LEFT JOIN nav_enhet ne ON ne.id = bruker.nav_enhet_id WHERE deltaker_status.aktiv = TRUE + AND deltaker.kilde != 'KOMET' AND deltaker_status.status = '${DeltakerStatus.Type.VENTER_PA_OPPSTART.name}' AND deltaker.start_dato <= CURRENT_DATE AND (deltaker.slutt_dato IS NULL OR deltaker.slutt_dato >= CURRENT_DATE) @@ -339,4 +360,11 @@ open class DeltakerRepository( it.type = "json" it.value = JsonUtils.objectMapper.writeValueAsString(this) } + + private fun List.toPGObject() = toPGObject(this.map { JsonUtils.toJsonString(it) }) + + private fun toPGObject(any: Any) = PGobject().also { + it.type = "json" + it.value = JsonUtils.objectMapper.writeValueAsString(any) + } } diff --git a/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/service/DeltakerServiceImpl.kt b/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/service/DeltakerServiceImpl.kt index 63b150fbd..b56538976 100644 --- a/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/service/DeltakerServiceImpl.kt +++ b/tiltak/src/main/kotlin/no/nav/amt/tiltak/deltaker/service/DeltakerServiceImpl.kt @@ -5,6 +5,7 @@ import no.nav.amt.tiltak.core.domain.tiltak.DeltakerStatus import no.nav.amt.tiltak.core.domain.tiltak.DeltakerStatusInsert import no.nav.amt.tiltak.core.domain.tiltak.DeltakerUpsert import no.nav.amt.tiltak.core.domain.tiltak.Gjennomforing +import no.nav.amt.tiltak.core.domain.tiltak.Kilde import no.nav.amt.tiltak.core.domain.tiltak.Vurdering import no.nav.amt.tiltak.core.domain.tiltak.Vurderingstype import no.nav.amt.tiltak.core.domain.tiltak.harIkkeStartet @@ -112,11 +113,11 @@ open class DeltakerServiceImpl( override fun slettDeltakerePaaGjennomforing(gjennomforingId: UUID) { hentDeltakerePaaGjennomforing(gjennomforingId).forEach { - slettDeltaker(it.id) + slettDeltaker(it.id, it.kilde) } } - override fun slettDeltaker(deltakerId: UUID) { + override fun slettDeltaker(deltakerId: UUID, kilde: Kilde) { transactionTemplate.execute { endringsmeldingService.slett(deltakerId) deltakerStatusRepository.slett(deltakerId) @@ -126,7 +127,9 @@ open class DeltakerServiceImpl( } log.info("Deltaker med id=$deltakerId er slettet") - publisherService.publish(deltakerId, DataPublishType.DELTAKER) + if (kilde != Kilde.KOMET) { + publisherService.publish(deltakerId, DataPublishType.DELTAKER) + } } override fun erSkjermet(deltakerId: UUID): Boolean { @@ -173,7 +176,7 @@ open class DeltakerServiceImpl( gjennomforingId: UUID, oppdatertGjennomforingErKurs: Boolean ) { - val deltakere = hentDeltakerePaaGjennomforing(gjennomforingId) + val deltakere = hentDeltakerePaaGjennomforing(gjennomforingId).filter { it.kilde != Kilde.KOMET } if (deltakere.isNotEmpty()) { if (oppdatertGjennomforingErKurs) { konverterDeltakerstatuseFraLopendeInntakTilKurs(deltakere, gjennomforingId) @@ -408,7 +411,11 @@ open class DeltakerServiceImpl( prosentStilling = this.prosentStilling, innsokBegrunnelse = this.innsokBegrunnelse, innhold = this.innhold, - kilde = this.kilde + kilde = this.kilde, + forsteVedtakFattet = this.forsteVedtakFattet, + historikk = this.historikk, + sistEndretAv = this.sistEndretAv, + sistEndretAvEnhet = this.sistEndretAvEnhet ) } diff --git a/tiltak/src/test/kotlin/no/nav/amt/tiltak/deltaker/repositories/DeltakerRepositoryTest.kt b/tiltak/src/test/kotlin/no/nav/amt/tiltak/deltaker/repositories/DeltakerRepositoryTest.kt index a66e05a0f..587a49b60 100644 --- a/tiltak/src/test/kotlin/no/nav/amt/tiltak/deltaker/repositories/DeltakerRepositoryTest.kt +++ b/tiltak/src/test/kotlin/no/nav/amt/tiltak/deltaker/repositories/DeltakerRepositoryTest.kt @@ -7,9 +7,13 @@ import io.kotest.matchers.collections.shouldHaveSize import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldNotBe import no.nav.amt.tiltak.core.domain.tiltak.DeltakelsesInnhold +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerEndring +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerHistorikk import no.nav.amt.tiltak.core.domain.tiltak.DeltakerStatus +import no.nav.amt.tiltak.core.domain.tiltak.DeltakerVedVedtak import no.nav.amt.tiltak.core.domain.tiltak.Innhold import no.nav.amt.tiltak.core.domain.tiltak.Kilde +import no.nav.amt.tiltak.core.domain.tiltak.Vedtak import no.nav.amt.tiltak.deltaker.dbo.DeltakerStatusInsertDbo import no.nav.amt.tiltak.deltaker.dbo.DeltakerUpsertDbo import no.nav.amt.tiltak.test.database.DbTestDataUtils @@ -68,7 +72,27 @@ internal class DeltakerRepositoryTest : FunSpec({ beskrivelse = null )) ) + val endretAv = UUID.randomUUID() + val endretAvEnhet = UUID.randomUUID() + val vedtak = Vedtak( + id = UUID.randomUUID(), + deltakerId = id, + fattet = null, + gyldigTil = null, + deltakerVedVedtak = DeltakerVedVedtak( + id, null, null, null, null, null, emptyList(), + DeltakerStatus(UUID.randomUUID(), DeltakerStatus.Type.VENTER_PA_OPPSTART, null, LocalDateTime.now(), LocalDateTime.now(), true) + ), + fattetAvNav = false, + opprettet = LocalDateTime.now(), + opprettetAv = UUID.randomUUID(), + opprettetAvEnhet = UUID.randomUUID(), + sistEndret = LocalDateTime.now(), + sistEndretAv = UUID.randomUUID(), + sistEndretAvEnhet = UUID.randomUUID() + ) + val historikk = listOf(DeltakerHistorikk.Vedtak(vedtak)) repository.upsert( DeltakerUpsertDbo( id, @@ -81,7 +105,11 @@ internal class DeltakerRepositoryTest : FunSpec({ registrertDato = registrertDato, innsokBegrunnelse = begrunnelse, innhold = innhold, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = registrertDato.toLocalDate(), + historikk = historikk, + sistEndretAv = endretAv, + sistEndretAvEnhet = endretAvEnhet ) ) val dbo = repository.get(id) @@ -100,6 +128,10 @@ internal class DeltakerRepositoryTest : FunSpec({ dbo.innsokBegrunnelse shouldBe begrunnelse dbo.innhold shouldBe innhold dbo.kilde shouldBe Kilde.ARENA + dbo.forsteVedtakFattet shouldBe registrertDato.toLocalDate() + (dbo.historikk?.first() as DeltakerHistorikk.Vedtak).vedtak shouldBe vedtak + dbo.sistEndretAv shouldBe endretAv + dbo.sistEndretAvEnhet shouldBe endretAvEnhet } test("upsert - should update Deltaker and return the updated Deltaker") { @@ -115,6 +147,18 @@ internal class DeltakerRepositoryTest : FunSpec({ )) ) + val endretAv = UUID.randomUUID() + val endretAvEnhet = UUID.randomUUID() + val endring = DeltakerEndring( + id = UUID.randomUUID(), + deltakerId = DELTAKER_1.id, + endring = DeltakerEndring.Endring.EndreBakgrunnsinformasjon("Bakgrunn"), + endretAv = endretAv, + endretAvEnhet = endretAvEnhet, + endret = LocalDateTime.now().minusDays(1) + ) + val historikk = listOf(DeltakerHistorikk.Endring(endring)) + repository.upsert(DeltakerUpsertDbo( id = DELTAKER_1.id, brukerId = DELTAKER_1.brukerId, @@ -124,7 +168,11 @@ internal class DeltakerRepositoryTest : FunSpec({ registrertDato = LocalDateTime.now(), innsokBegrunnelse = nyBegrunnelse, innhold = innhold, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = DELTAKER_1.registrertDato.toLocalDate(), + historikk = historikk, + sistEndretAv = endretAv, + sistEndretAvEnhet = endretAvEnhet )) val updatedDeltaker = repository.get(DELTAKER_1.id) @@ -135,6 +183,10 @@ internal class DeltakerRepositoryTest : FunSpec({ updatedDeltaker.innsokBegrunnelse shouldBe nyBegrunnelse updatedDeltaker.innhold shouldBe innhold updatedDeltaker.kilde shouldBe Kilde.ARENA + updatedDeltaker.forsteVedtakFattet shouldBe DELTAKER_1.registrertDato.toLocalDate() + (updatedDeltaker.historikk?.first() as DeltakerHistorikk.Endring).endring shouldBe endring + updatedDeltaker.sistEndretAv shouldBe endretAv + updatedDeltaker.sistEndretAvEnhet shouldBe endretAvEnhet } test("get - deltaker finnes - returnerer deltaker") { @@ -148,7 +200,11 @@ internal class DeltakerRepositoryTest : FunSpec({ prosentStilling = 20.0f, registrertDato = now, innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) repository.upsert(insertDbo) @@ -178,7 +234,11 @@ internal class DeltakerRepositoryTest : FunSpec({ prosentStilling = 20.0f, registrertDato = now, innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) repository.upsert(insertDbo) @@ -215,7 +275,11 @@ internal class DeltakerRepositoryTest : FunSpec({ prosentStilling = prosentStilling, registrertDato = registrertDato, innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) repository.upsert(insertDbo) @@ -249,7 +313,11 @@ internal class DeltakerRepositoryTest : FunSpec({ prosentStilling = 20.0f, registrertDato = now.minusDays(10), innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) repository.upsert(deltakerInsertDbo) val deltaker = repository.get(deltakerInsertDbo.id) @@ -279,7 +347,11 @@ internal class DeltakerRepositoryTest : FunSpec({ prosentStilling = 20.0f, registrertDato = LocalDateTime.now().minusDays(10), innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) val statusInsertDbo = DeltakerStatusInsertDbo( id = UUID.randomUUID(), @@ -309,7 +381,11 @@ internal class DeltakerRepositoryTest : FunSpec({ prosentStilling = 20.0f, registrertDato = LocalDateTime.now().minusDays(10), innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) repository.upsert(deltakerInsertDbo) val deltaker = repository.get(deltakerInsertDbo.id) @@ -341,7 +417,11 @@ internal class DeltakerRepositoryTest : FunSpec({ prosentStilling = 20.0f, registrertDato = now.minusDays(10), innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) val statusInsertDbo = DeltakerStatusInsertDbo( id = UUID.randomUUID(), @@ -378,7 +458,11 @@ internal class DeltakerRepositoryTest : FunSpec({ prosentStilling = 20.0f, registrertDato = LocalDateTime.now().minusDays(10), innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) val statusInsertDbo = DeltakerStatusInsertDbo( id = UUID.randomUUID(), @@ -407,7 +491,11 @@ internal class DeltakerRepositoryTest : FunSpec({ prosentStilling = 20.0f, registrertDato = LocalDateTime.now().minusDays(10), innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) repository.upsert(deltakerInsertDbo) diff --git a/tiltak/src/test/kotlin/no/nav/amt/tiltak/deltaker/service/DeltakerServiceImplTest.kt b/tiltak/src/test/kotlin/no/nav/amt/tiltak/deltaker/service/DeltakerServiceImplTest.kt index 86ea85391..ac5e7d731 100644 --- a/tiltak/src/test/kotlin/no/nav/amt/tiltak/deltaker/service/DeltakerServiceImplTest.kt +++ b/tiltak/src/test/kotlin/no/nav/amt/tiltak/deltaker/service/DeltakerServiceImplTest.kt @@ -409,12 +409,20 @@ class DeltakerServiceImplTest { @Test fun `slettDeltaker - skal publisere sletting på kafka`() { - deltakerServiceImpl.slettDeltaker(deltakerId) + deltakerServiceImpl.slettDeltaker(deltakerId, Kilde.ARENA) verify(exactly = 1) { kafkaProducerService.publiserSlettDeltaker(deltakerId) } verify(exactly = 1) { publisherService.publish(deltakerId, DataPublishType.DELTAKER) } } + @Test + fun `slettDeltaker - skal ikke publisere sletting på v2-topic hvis kilde er KOMET`() { + deltakerServiceImpl.slettDeltaker(deltakerId, Kilde.KOMET) + + verify(exactly = 1) { kafkaProducerService.publiserSlettDeltaker(deltakerId) } + verify(exactly = 0) { publisherService.publish(deltakerId, DataPublishType.DELTAKER) } + } + @Test fun `slettDeltaker - skal slette deltaker og status`() { @@ -429,7 +437,7 @@ class DeltakerServiceImplTest { deltakerServiceImpl.insertStatus(statusInsertDbo) deltakerStatusRepository.getStatusForDeltaker(deltakerId) shouldNotBe null - deltakerServiceImpl.slettDeltaker(deltakerId) + deltakerServiceImpl.slettDeltaker(deltakerId, Kilde.ARENA) deltakerRepository.get(deltakerId) shouldBe null deltakerStatusRepository.getStatusForDeltaker(deltakerId) shouldBe null @@ -461,7 +469,7 @@ class DeltakerServiceImplTest { deltakerStatusRepository.getStatusForDeltaker(deltakerId) shouldNotBe null - deltakerServiceImpl.slettDeltaker(deltakerId) + deltakerServiceImpl.slettDeltaker(deltakerId, Kilde.ARENA) deltakerRepository.get(deltakerId) shouldBe null @@ -700,7 +708,11 @@ class DeltakerServiceImplTest { gjennomforingId = GJENNOMFORING_1.id, innsokBegrunnelse = null, innhold = null, - kilde = Kilde.ARENA + kilde = Kilde.ARENA, + forsteVedtakFattet = null, + historikk = null, + sistEndretAv = null, + sistEndretAvEnhet = null ) }