diff --git a/spesialist-selve/src/main/kotlin/no/nav/helse/db/TransactionalMeldingDao.kt b/spesialist-selve/src/main/kotlin/no/nav/helse/db/TransactionalMeldingDao.kt deleted file mode 100644 index d26128677..000000000 --- a/spesialist-selve/src/main/kotlin/no/nav/helse/db/TransactionalMeldingDao.kt +++ /dev/null @@ -1,277 +0,0 @@ -package no.nav.helse.db - -import kotliquery.Session -import kotliquery.queryOf -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.ADRESSEBESKYTTELSE_ENDRET -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.AVSLUTTET_MED_VEDTAK -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.AVSLUTTET_UTEN_VEDTAK -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.BEHANDLING_OPPRETTET -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.ENDRET_EGEN_ANSATT_STATUS -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.GODKJENNING -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.GODKJENT_TILBAKEDATERT_SYKMELDING -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.GOSYS_OPPGAVE_ENDRET -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.KLARGJØR_TILGANGSRELATERTE_DATA -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.NYE_VARSLER -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.OPPDATER_PERSONSNAPSHOT -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.OVERSTYRING_IGANGSATT -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.SAKSBEHANDLERLØSNING -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.SØKNAD_SENDT -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.UTBETALING_ENDRET -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.VEDTAKSPERIODE_FORKASTET -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.VEDTAKSPERIODE_NY_UTBETALING -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.VEDTAKSPERIODE_REBEREGNET -import no.nav.helse.db.TransactionalMeldingDao.Meldingtype.VEDTAK_FATTET -import no.nav.helse.mediator.meldinger.AdressebeskyttelseEndret -import no.nav.helse.mediator.meldinger.Personmelding -import no.nav.helse.mediator.meldinger.Vedtaksperiodemelding -import no.nav.helse.mediator.meldinger.hendelser.AvsluttetMedVedtakMessage -import no.nav.helse.mediator.meldinger.hendelser.AvsluttetUtenVedtakMessage -import no.nav.helse.modell.MeldingDao.BerørtPeriode -import no.nav.helse.modell.MeldingDao.OverstyringIgangsattKorrigertSøknad -import no.nav.helse.modell.gosysoppgaver.GosysOppgaveEndret -import no.nav.helse.modell.kommando.TilbakedateringBehandlet -import no.nav.helse.modell.overstyring.OverstyringIgangsatt -import no.nav.helse.modell.person.EndretEgenAnsattStatus -import no.nav.helse.modell.person.KlargjørTilgangsrelaterteData -import no.nav.helse.modell.person.OppdaterPersondata -import no.nav.helse.modell.person.SøknadSendt -import no.nav.helse.modell.utbetaling.UtbetalingEndret -import no.nav.helse.modell.vedtaksperiode.BehandlingOpprettet -import no.nav.helse.modell.vedtaksperiode.Godkjenningsbehov -import no.nav.helse.modell.vedtaksperiode.NyeVarsler -import no.nav.helse.modell.vedtaksperiode.VedtaksperiodeForkastet -import no.nav.helse.modell.vedtaksperiode.VedtaksperiodeNyUtbetaling -import no.nav.helse.modell.vedtaksperiode.VedtaksperiodeReberegnet -import no.nav.helse.modell.vedtaksperiode.vedtak.Saksbehandlerløsning -import no.nav.helse.modell.vedtaksperiode.vedtak.VedtakFattet -import no.nav.helse.objectMapper -import no.nav.helse.rapids_rivers.asLocalDate -import org.intellij.lang.annotations.Language -import java.util.UUID - -internal class TransactionalMeldingDao(private val session: Session) : MeldingRepository { - override fun finn(id: UUID): Personmelding? { - @Language("PostgreSQL") - val statement = """SELECT type,data FROM hendelse WHERE id = ?""" - return session.run( - queryOf(statement, id).map { row -> - fraMeldingtype(enumValueOf(row.string("type")), row.string("data")) - }.asSingle, - ) - } - - override fun finnGodkjenningsbehov(meldingId: UUID): Godkjenningsbehov { - val melding = - finn(meldingId) - ?: throw IllegalArgumentException("Forventer å finne godkjenningsbehov for meldingId=$meldingId") - check(melding is Godkjenningsbehov) { "Forventer at melding funnet med meldingId=$meldingId er et godkjenningsbehov" } - return melding - } - - override fun lagre(melding: Personmelding) { - session.run { - lagre(melding) - if (melding is Vedtaksperiodemelding) { - opprettKobling(melding.vedtaksperiodeId(), melding.id) - } - } - } - - override fun sisteOverstyringIgangsattOmKorrigertSøknad( - fødselsnummer: String, - vedtaksperiodeId: UUID, - ): OverstyringIgangsattKorrigertSøknad? { - @Language("PostgreSQL") - val statement = """ - SELECT h.data - FROM hendelse h, json_array_elements(h.data -> 'berørtePerioder') AS bp - WHERE fodselsnummer = :fodselsnummer - AND h.type='OVERSTYRING_IGANGSATT' - AND bp ->> 'vedtaksperiodeId' = :vedtaksperiodeId - ORDER BY h.data ->> '@opprettet' DESC - LIMIT 1 - """ - return session.run( - queryOf( - statement, - mapOf("fodselsnummer" to fødselsnummer.toLong(), "vedtaksperiodeId" to vedtaksperiodeId.toString()), - ).map { row -> - row.stringOrNull("data")?.let { - val data = objectMapper.readTree(it) - if (data["årsak"].asText() != "KORRIGERT_SØKNAD") return@let null - - OverstyringIgangsattKorrigertSøknad( - periodeForEndringFom = data["periodeForEndringFom"].asLocalDate(), - meldingId = data["@id"].asText(), - berørtePerioder = - data["berørtePerioder"].map { berørtPeriode -> - BerørtPeriode( - vedtaksperiodeId = UUID.fromString(berørtPeriode["vedtaksperiodeId"].asText()), - periodeFom = berørtPeriode["periodeFom"].asLocalDate(), - orgnummer = berørtPeriode["orgnummer"].asText(), - ) - }, - ) - } - }.asSingle, - ) - } - - override fun opprettAutomatiseringKorrigertSøknad( - vedtaksperiodeId: UUID, - meldingId: UUID, - ) { - @Language("PostgreSQL") - val statement = - """ - INSERT INTO automatisering_korrigert_soknad (vedtaksperiode_id, hendelse_ref) - VALUES (:vedtaksperiodeId, :hendelseId) - """.trimIndent() - session.run( - queryOf( - statement, - mapOf("vedtaksperiodeId" to vedtaksperiodeId, "hendelseId" to meldingId), - ).asExecute, - ) - } - - override fun finnAntallAutomatisertKorrigertSøknad(vedtaksperiodeId: UUID): Int { - @Language("PostgreSQL") - val statement = """ - SELECT count(1) AS antall - FROM automatisering_korrigert_soknad aks - WHERE vedtaksperiode_id = :vedtaksperiodeId - """ - return requireNotNull( - session.run( - queryOf(statement, mapOf("vedtaksperiodeId" to vedtaksperiodeId)).map { - it.int("antall") - }.asSingle, - ), - ) - } - - override fun erAutomatisertKorrigertSøknadHåndtert(meldingId: UUID): Boolean { - @Language("PostgreSQL") - val statement = - """ - SELECT count(1) AS antall - FROM automatisering_korrigert_soknad aks - WHERE hendelse_ref = :hendelseId - """.trimIndent() - return requireNotNull( - session.run( - queryOf(statement, mapOf("hendelseId" to meldingId)).map { - it.int("antall") > 0 - }.asSingle, - ), - ) - } - - private fun Session.opprettKobling( - vedtaksperiodeId: UUID, - meldingId: UUID, - ) { - @Language("PostgreSQL") - val koblingStatement = "INSERT INTO vedtaksperiode_hendelse(vedtaksperiode_id, hendelse_ref) VALUES(?,?)" - run( - queryOf( - koblingStatement, - vedtaksperiodeId, - meldingId, - ).asUpdate, - ) - } - - private fun Session.lagre(melding: Personmelding) { - @Language("PostgreSQL") - val query = """ - INSERT INTO hendelse(id, fodselsnummer, data, type) - VALUES(?, ?, CAST(? as json), ?) - ON CONFLICT DO NOTHING - """ - run( - queryOf( - query, - melding.id, - melding.fødselsnummer().toLong(), - melding.toJson(), - tilMeldingtype(melding).name, - ).asUpdate, - ) - } - - private fun fraMeldingtype( - meldingtype: Meldingtype, - json: String, - ): Personmelding { - val jsonNode = objectMapper.readTree(json) - return when (meldingtype) { - ADRESSEBESKYTTELSE_ENDRET -> AdressebeskyttelseEndret(jsonNode) - GODKJENNING -> Godkjenningsbehov(jsonNode) - OPPDATER_PERSONSNAPSHOT -> OppdaterPersondata(jsonNode) - GOSYS_OPPGAVE_ENDRET -> GosysOppgaveEndret(jsonNode) - VEDTAKSPERIODE_FORKASTET -> VedtaksperiodeForkastet(jsonNode) - GODKJENT_TILBAKEDATERT_SYKMELDING -> TilbakedateringBehandlet(jsonNode) - OVERSTYRING_IGANGSATT -> OverstyringIgangsatt(jsonNode) - SAKSBEHANDLERLØSNING -> Saksbehandlerløsning(jsonNode) - UTBETALING_ENDRET -> UtbetalingEndret(jsonNode) - VEDTAKSPERIODE_REBEREGNET -> VedtaksperiodeReberegnet(jsonNode) - ENDRET_EGEN_ANSATT_STATUS -> EndretEgenAnsattStatus(jsonNode) - VEDTAK_FATTET -> VedtakFattet(jsonNode) - NYE_VARSLER -> NyeVarsler(jsonNode) - SØKNAD_SENDT -> SøknadSendt(jsonNode) - VEDTAKSPERIODE_NY_UTBETALING -> VedtaksperiodeNyUtbetaling(jsonNode) - BEHANDLING_OPPRETTET -> BehandlingOpprettet(jsonNode) - AVSLUTTET_UTEN_VEDTAK -> AvsluttetUtenVedtakMessage(jsonNode) - KLARGJØR_TILGANGSRELATERTE_DATA -> KlargjørTilgangsrelaterteData(jsonNode) - else -> throw IllegalArgumentException("ukjent meldingtype: $meldingtype") - } - } - - private fun tilMeldingtype(melding: Personmelding) = - when (melding) { - is AdressebeskyttelseEndret -> ADRESSEBESKYTTELSE_ENDRET - is VedtaksperiodeForkastet -> VEDTAKSPERIODE_FORKASTET - is Godkjenningsbehov -> GODKJENNING - is OverstyringIgangsatt -> OVERSTYRING_IGANGSATT - is Saksbehandlerløsning -> SAKSBEHANDLERLØSNING - is OppdaterPersondata -> OPPDATER_PERSONSNAPSHOT - is UtbetalingEndret -> UTBETALING_ENDRET - is VedtaksperiodeReberegnet -> VEDTAKSPERIODE_REBEREGNET - is GosysOppgaveEndret -> GOSYS_OPPGAVE_ENDRET - is EndretEgenAnsattStatus -> ENDRET_EGEN_ANSATT_STATUS - is VedtakFattet -> VEDTAK_FATTET - is NyeVarsler -> NYE_VARSLER - is SøknadSendt -> SØKNAD_SENDT - is VedtaksperiodeNyUtbetaling -> VEDTAKSPERIODE_NY_UTBETALING - is TilbakedateringBehandlet -> GODKJENT_TILBAKEDATERT_SYKMELDING - is BehandlingOpprettet -> BEHANDLING_OPPRETTET - is AvsluttetUtenVedtakMessage -> AVSLUTTET_UTEN_VEDTAK - is AvsluttetMedVedtakMessage -> AVSLUTTET_MED_VEDTAK - is KlargjørTilgangsrelaterteData -> KLARGJØR_TILGANGSRELATERTE_DATA - else -> throw IllegalArgumentException("ukjent meldingtype: ${melding::class.simpleName}") - } - - private enum class Meldingtype { - ADRESSEBESKYTTELSE_ENDRET, - VEDTAKSPERIODE_FORKASTET, - GODKJENNING, - SAKSBEHANDLERLØSNING, - OPPDATER_PERSONSNAPSHOT, - UTBETALING_ENDRET, - VEDTAKSPERIODE_REBEREGNET, - BEHANDLING_OPPRETTET, - OVERSTYRING_IGANGSATT, - GOSYS_OPPGAVE_ENDRET, - ENDRET_EGEN_ANSATT_STATUS, - VEDTAK_FATTET, - NYE_VARSLER, - SØKNAD_SENDT, - VEDTAKSPERIODE_NY_UTBETALING, - GODKJENT_TILBAKEDATERT_SYKMELDING, - AVSLUTTET_UTEN_VEDTAK, - AVSLUTTET_MED_VEDTAK, - KLARGJØR_TILGANGSRELATERTE_DATA, - } -} diff --git a/spesialist-selve/src/main/kotlin/no/nav/helse/mediator/Kommandofabrikk.kt b/spesialist-selve/src/main/kotlin/no/nav/helse/mediator/Kommandofabrikk.kt index 9a2e283ff..62db933e6 100644 --- a/spesialist-selve/src/main/kotlin/no/nav/helse/mediator/Kommandofabrikk.kt +++ b/spesialist-selve/src/main/kotlin/no/nav/helse/mediator/Kommandofabrikk.kt @@ -12,7 +12,6 @@ import no.nav.helse.db.PgOppgaveDao import no.nav.helse.db.PgTotrinnsvurderingDao import no.nav.helse.db.ReservasjonDao import no.nav.helse.db.TildelingDao -import no.nav.helse.db.TransactionalMeldingDao import no.nav.helse.db.TransactionalPeriodehistorikkDao import no.nav.helse.db.TransactionalUtbetalingDao import no.nav.helse.db.TransactionalVedtakDao @@ -113,7 +112,7 @@ internal class Kommandofabrikk( val harTildeltOppgave = TildelingDao(transactionalSession).tildelingForOppgave(oppgaveDataForAutomatisering.oppgaveId) != null val godkjenningsbehovData = - TransactionalMeldingDao(transactionalSession) + MeldingDao(transactionalSession) .finnGodkjenningsbehov(oppgaveDataForAutomatisering.hendelseId).data() return GosysOppgaveEndretCommand( @@ -137,7 +136,7 @@ internal class Kommandofabrikk( transactionalSession: TransactionalSession, ): TilbakedateringGodkjentCommand { val godkjenningsbehovData = - TransactionalMeldingDao(transactionalSession).finnGodkjenningsbehov(oppgaveDataForAutomatisering.hendelseId).data() + MeldingDao(transactionalSession).finnGodkjenningsbehov(oppgaveDataForAutomatisering.hendelseId).data() val sykefraværstilfelle = person.sykefraværstilfelle(godkjenningsbehovData.vedtaksperiodeId) val utbetaling = TransactionalUtbetalingDao(transactionalSession).hentUtbetaling(godkjenningsbehovData.utbetalingId) diff --git a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/MeldingDao.kt b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/MeldingDao.kt index 40f7699b1..8d3eab1ee 100644 --- a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/MeldingDao.kt +++ b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/MeldingDao.kt @@ -1,48 +1,147 @@ package no.nav.helse.modell -import kotliquery.sessionOf +import kotliquery.Session +import no.nav.helse.HelseDao.Companion.asSQL +import no.nav.helse.db.MedDataSource +import no.nav.helse.db.MedSession import no.nav.helse.db.MeldingRepository -import no.nav.helse.db.TransactionalMeldingDao +import no.nav.helse.db.QueryRunner +import no.nav.helse.mediator.meldinger.AdressebeskyttelseEndret import no.nav.helse.mediator.meldinger.Personmelding +import no.nav.helse.mediator.meldinger.Vedtaksperiodemelding +import no.nav.helse.mediator.meldinger.hendelser.AvsluttetMedVedtakMessage +import no.nav.helse.mediator.meldinger.hendelser.AvsluttetUtenVedtakMessage +import no.nav.helse.modell.MeldingDao.Meldingtype.ADRESSEBESKYTTELSE_ENDRET +import no.nav.helse.modell.MeldingDao.Meldingtype.AVSLUTTET_MED_VEDTAK +import no.nav.helse.modell.MeldingDao.Meldingtype.AVSLUTTET_UTEN_VEDTAK +import no.nav.helse.modell.MeldingDao.Meldingtype.BEHANDLING_OPPRETTET +import no.nav.helse.modell.MeldingDao.Meldingtype.ENDRET_EGEN_ANSATT_STATUS +import no.nav.helse.modell.MeldingDao.Meldingtype.GODKJENNING +import no.nav.helse.modell.MeldingDao.Meldingtype.GODKJENT_TILBAKEDATERT_SYKMELDING +import no.nav.helse.modell.MeldingDao.Meldingtype.GOSYS_OPPGAVE_ENDRET +import no.nav.helse.modell.MeldingDao.Meldingtype.KLARGJØR_TILGANGSRELATERTE_DATA +import no.nav.helse.modell.MeldingDao.Meldingtype.NYE_VARSLER +import no.nav.helse.modell.MeldingDao.Meldingtype.OPPDATER_PERSONSNAPSHOT +import no.nav.helse.modell.MeldingDao.Meldingtype.OVERSTYRING_IGANGSATT +import no.nav.helse.modell.MeldingDao.Meldingtype.SAKSBEHANDLERLØSNING +import no.nav.helse.modell.MeldingDao.Meldingtype.SØKNAD_SENDT +import no.nav.helse.modell.MeldingDao.Meldingtype.UTBETALING_ENDRET +import no.nav.helse.modell.MeldingDao.Meldingtype.VEDTAKSPERIODE_FORKASTET +import no.nav.helse.modell.MeldingDao.Meldingtype.VEDTAKSPERIODE_NY_UTBETALING +import no.nav.helse.modell.MeldingDao.Meldingtype.VEDTAKSPERIODE_REBEREGNET +import no.nav.helse.modell.MeldingDao.Meldingtype.VEDTAK_FATTET +import no.nav.helse.modell.gosysoppgaver.GosysOppgaveEndret +import no.nav.helse.modell.kommando.TilbakedateringBehandlet +import no.nav.helse.modell.overstyring.OverstyringIgangsatt +import no.nav.helse.modell.person.EndretEgenAnsattStatus +import no.nav.helse.modell.person.KlargjørTilgangsrelaterteData +import no.nav.helse.modell.person.OppdaterPersondata +import no.nav.helse.modell.person.SøknadSendt +import no.nav.helse.modell.utbetaling.UtbetalingEndret +import no.nav.helse.modell.vedtaksperiode.BehandlingOpprettet import no.nav.helse.modell.vedtaksperiode.Godkjenningsbehov +import no.nav.helse.modell.vedtaksperiode.NyeVarsler +import no.nav.helse.modell.vedtaksperiode.VedtaksperiodeForkastet +import no.nav.helse.modell.vedtaksperiode.VedtaksperiodeNyUtbetaling +import no.nav.helse.modell.vedtaksperiode.VedtaksperiodeReberegnet +import no.nav.helse.modell.vedtaksperiode.vedtak.Saksbehandlerløsning +import no.nav.helse.modell.vedtaksperiode.vedtak.VedtakFattet +import no.nav.helse.objectMapper +import no.nav.helse.rapids_rivers.asLocalDate import java.time.LocalDate import java.util.UUID import javax.sql.DataSource -internal class MeldingDao(private val dataSource: DataSource) : MeldingRepository { +internal class MeldingDao(queryRunner: QueryRunner) : MeldingRepository, QueryRunner by queryRunner { + constructor(session: Session) : this(MedSession(session)) + constructor(dataSource: DataSource) : this(MedDataSource(dataSource)) + override fun lagre(melding: Personmelding) { - sessionOf(dataSource).use { session -> - TransactionalMeldingDao(session).lagre(melding) + asSQL( + """ + INSERT INTO hendelse(id, fodselsnummer, data, type) + VALUES(:id, :fodselsnummer, CAST(:data as json), :type) + ON CONFLICT DO NOTHING + """, + "id" to melding.id, + "fodselsnummer" to melding.fødselsnummer().toLong(), + "data" to melding.toJson(), + "type" to tilMeldingtype(melding).name, + ).update() + if (melding is Vedtaksperiodemelding) { + opprettKobling(melding.vedtaksperiodeId(), melding.id) } } override fun finnAntallAutomatisertKorrigertSøknad(vedtaksperiodeId: UUID): Int = - sessionOf(dataSource).use { session -> - TransactionalMeldingDao(session).finnAntallAutomatisertKorrigertSøknad(vedtaksperiodeId) - } + asSQL( + """ + SELECT count(1) AS antall + FROM automatisering_korrigert_soknad aks + WHERE vedtaksperiode_id = :vedtaksperiodeId + """, + "vedtaksperiodeId" to vedtaksperiodeId, + ).single { it.int("antall") } override fun erAutomatisertKorrigertSøknadHåndtert(meldingId: UUID): Boolean = - sessionOf(dataSource).use { session -> - TransactionalMeldingDao(session).erAutomatisertKorrigertSøknadHåndtert(meldingId) - } + asSQL( + """ + SELECT count(1) AS antall + FROM automatisering_korrigert_soknad aks + WHERE hendelse_ref = :hendelseId + """, + "hendelseId" to meldingId, + ).single { it.int("antall") > 0 } override fun opprettAutomatiseringKorrigertSøknad( vedtaksperiodeId: UUID, meldingId: UUID, ) { - sessionOf(dataSource).use { session -> - TransactionalMeldingDao(session).opprettAutomatiseringKorrigertSøknad(vedtaksperiodeId, meldingId) - } + asSQL( + """ + INSERT INTO automatisering_korrigert_soknad (vedtaksperiode_id, hendelse_ref) + VALUES (:vedtaksperiodeId, :hendelseId) + """.trimIndent(), + "vedtaksperiodeId" to vedtaksperiodeId, + "hendelseId" to meldingId, + ).update() } override fun sisteOverstyringIgangsattOmKorrigertSøknad( fødselsnummer: String, vedtaksperiodeId: UUID, - ): OverstyringIgangsattKorrigertSøknad? { - return sessionOf(dataSource).use { session -> - TransactionalMeldingDao(session).sisteOverstyringIgangsattOmKorrigertSøknad(fødselsnummer, vedtaksperiodeId) + ): OverstyringIgangsattKorrigertSøknad? = + asSQL( + """ + SELECT h.data + FROM hendelse h, json_array_elements(h.data -> 'berørtePerioder') AS bp + WHERE fodselsnummer = :fodselsnummer + AND h.type='OVERSTYRING_IGANGSATT' + AND bp ->> 'vedtaksperiodeId' = :vedtaksperiodeId + ORDER BY h.data ->> '@opprettet' DESC + LIMIT 1 + """, + "fodselsnummer" to fødselsnummer.toLong(), + "vedtaksperiodeId" to vedtaksperiodeId.toString(), + ).singleOrNull { row -> + row.stringOrNull("data")?.let { + val data = objectMapper.readTree(it) + if (data["årsak"].asText() != "KORRIGERT_SØKNAD") return@let null + + OverstyringIgangsattKorrigertSøknad( + periodeForEndringFom = data["periodeForEndringFom"].asLocalDate(), + meldingId = data["@id"].asText(), + berørtePerioder = + data["berørtePerioder"].map { berørtPeriode -> + BerørtPeriode( + vedtaksperiodeId = UUID.fromString(berørtPeriode["vedtaksperiodeId"].asText()), + periodeFom = berørtPeriode["periodeFom"].asLocalDate(), + orgnummer = berørtPeriode["orgnummer"].asText(), + ) + }, + ) + } } - } internal data class OverstyringIgangsattKorrigertSøknad( val periodeForEndringFom: LocalDate, @@ -57,14 +156,101 @@ internal class MeldingDao(private val dataSource: DataSource) : MeldingRepositor ) override fun finnGodkjenningsbehov(meldingId: UUID): Godkjenningsbehov { - return sessionOf(dataSource).use { session -> - TransactionalMeldingDao(session).finnGodkjenningsbehov(meldingId) + val melding = + finn(meldingId) + ?: throw IllegalArgumentException("Forventer å finne godkjenningsbehov for meldingId=$meldingId") + check(melding is Godkjenningsbehov) { "Forventer at melding funnet med meldingId=$meldingId er et godkjenningsbehov" } + return melding + } + + override fun finn(id: UUID): Personmelding? = + asSQL( + """SELECT type,data FROM hendelse WHERE id = :id """, + "id" to id, + ).singleOrNull { fraMeldingtype(enumValueOf(it.string("type")), it.string("data")) } + + private fun opprettKobling( + vedtaksperiodeId: UUID, + meldingId: UUID, + ) { + asSQL( + """ INSERT INTO vedtaksperiode_hendelse(vedtaksperiode_id, hendelse_ref) VALUES(:vedtaksperiodeId, :meldingId)""", + "vedtaksperiodeId" to vedtaksperiodeId, + "meldingId" to meldingId, + ).update() + } + + private fun fraMeldingtype( + meldingtype: Meldingtype, + json: String, + ): Personmelding { + val jsonNode = objectMapper.readTree(json) + return when (meldingtype) { + ADRESSEBESKYTTELSE_ENDRET -> AdressebeskyttelseEndret(jsonNode) + GODKJENNING -> Godkjenningsbehov(jsonNode) + OPPDATER_PERSONSNAPSHOT -> OppdaterPersondata(jsonNode) + GOSYS_OPPGAVE_ENDRET -> GosysOppgaveEndret(jsonNode) + VEDTAKSPERIODE_FORKASTET -> VedtaksperiodeForkastet(jsonNode) + GODKJENT_TILBAKEDATERT_SYKMELDING -> TilbakedateringBehandlet(jsonNode) + OVERSTYRING_IGANGSATT -> OverstyringIgangsatt(jsonNode) + SAKSBEHANDLERLØSNING -> Saksbehandlerløsning(jsonNode) + UTBETALING_ENDRET -> UtbetalingEndret(jsonNode) + VEDTAKSPERIODE_REBEREGNET -> VedtaksperiodeReberegnet(jsonNode) + ENDRET_EGEN_ANSATT_STATUS -> EndretEgenAnsattStatus(jsonNode) + VEDTAK_FATTET -> VedtakFattet(jsonNode) + NYE_VARSLER -> NyeVarsler(jsonNode) + SØKNAD_SENDT -> SøknadSendt(jsonNode) + VEDTAKSPERIODE_NY_UTBETALING -> VedtaksperiodeNyUtbetaling(jsonNode) + BEHANDLING_OPPRETTET -> BehandlingOpprettet(jsonNode) + AVSLUTTET_UTEN_VEDTAK -> AvsluttetUtenVedtakMessage(jsonNode) + KLARGJØR_TILGANGSRELATERTE_DATA -> KlargjørTilgangsrelaterteData(jsonNode) + else -> throw IllegalArgumentException("ukjent meldingtype: $meldingtype") } } - override fun finn(id: UUID): Personmelding? { - return sessionOf(dataSource).use { session -> - TransactionalMeldingDao(session).finn(id) + private fun tilMeldingtype(melding: Personmelding) = + when (melding) { + is AdressebeskyttelseEndret -> ADRESSEBESKYTTELSE_ENDRET + is VedtaksperiodeForkastet -> VEDTAKSPERIODE_FORKASTET + is Godkjenningsbehov -> GODKJENNING + is OverstyringIgangsatt -> OVERSTYRING_IGANGSATT + is Saksbehandlerløsning -> SAKSBEHANDLERLØSNING + is OppdaterPersondata -> OPPDATER_PERSONSNAPSHOT + is UtbetalingEndret -> UTBETALING_ENDRET + is VedtaksperiodeReberegnet -> VEDTAKSPERIODE_REBEREGNET + is GosysOppgaveEndret -> GOSYS_OPPGAVE_ENDRET + is EndretEgenAnsattStatus -> ENDRET_EGEN_ANSATT_STATUS + is VedtakFattet -> VEDTAK_FATTET + is NyeVarsler -> NYE_VARSLER + is SøknadSendt -> SØKNAD_SENDT + is VedtaksperiodeNyUtbetaling -> VEDTAKSPERIODE_NY_UTBETALING + is TilbakedateringBehandlet -> GODKJENT_TILBAKEDATERT_SYKMELDING + is BehandlingOpprettet -> BEHANDLING_OPPRETTET + is AvsluttetUtenVedtakMessage -> AVSLUTTET_UTEN_VEDTAK + is AvsluttetMedVedtakMessage -> AVSLUTTET_MED_VEDTAK + is KlargjørTilgangsrelaterteData -> KLARGJØR_TILGANGSRELATERTE_DATA + else -> throw IllegalArgumentException("ukjent meldingtype: ${melding::class.simpleName}") } + + private enum class Meldingtype { + ADRESSEBESKYTTELSE_ENDRET, + VEDTAKSPERIODE_FORKASTET, + GODKJENNING, + SAKSBEHANDLERLØSNING, + OPPDATER_PERSONSNAPSHOT, + UTBETALING_ENDRET, + VEDTAKSPERIODE_REBEREGNET, + BEHANDLING_OPPRETTET, + OVERSTYRING_IGANGSATT, + GOSYS_OPPGAVE_ENDRET, + ENDRET_EGEN_ANSATT_STATUS, + VEDTAK_FATTET, + NYE_VARSLER, + SØKNAD_SENDT, + VEDTAKSPERIODE_NY_UTBETALING, + GODKJENT_TILBAKEDATERT_SYKMELDING, + AVSLUTTET_UTEN_VEDTAK, + AVSLUTTET_MED_VEDTAK, + KLARGJØR_TILGANGSRELATERTE_DATA, } } diff --git a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/Automatisering.kt b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/Automatisering.kt index 8da7d718d..1b07b06a6 100644 --- a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/Automatisering.kt +++ b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/automatisering/Automatisering.kt @@ -10,7 +10,6 @@ import no.nav.helse.db.MeldingRepository import no.nav.helse.db.OverstyringRepository import no.nav.helse.db.PersonRepository import no.nav.helse.db.RisikovurderingRepository -import no.nav.helse.db.TransactionalMeldingDao import no.nav.helse.db.TransactionalVedtakDao import no.nav.helse.db.TransactionalVergemålDao import no.nav.helse.db.TransactionalÅpneGosysOppgaverDao @@ -18,6 +17,7 @@ import no.nav.helse.db.VedtakRepository import no.nav.helse.db.VergemålRepository import no.nav.helse.db.ÅpneGosysOppgaverRepository import no.nav.helse.mediator.Subsumsjonsmelder +import no.nav.helse.modell.MeldingDao import no.nav.helse.modell.MeldingDao.OverstyringIgangsattKorrigertSøknad import no.nav.helse.modell.Toggle import no.nav.helse.modell.egenansatt.EgenAnsattDao @@ -74,7 +74,7 @@ internal class Automatisering( vedtakRepository = TransactionalVedtakDao(transactionalSession), overstyringRepository = OverstyringDao(transactionalSession), stikkprøver = stikkprøver, - meldingRepository = TransactionalMeldingDao(transactionalSession), + meldingRepository = MeldingDao(transactionalSession), generasjonDao = PgGenerasjonDao(transactionalSession), egenAnsattRepository = EgenAnsattDao(transactionalSession), ) diff --git a/spesialist-selve/src/test/kotlin/no/nav/helse/modell/automatisering/AutomatiseringTest.kt b/spesialist-selve/src/test/kotlin/no/nav/helse/modell/automatisering/AutomatiseringTest.kt index 995aafcab..6afffcf89 100644 --- a/spesialist-selve/src/test/kotlin/no/nav/helse/modell/automatisering/AutomatiseringTest.kt +++ b/spesialist-selve/src/test/kotlin/no/nav/helse/modell/automatisering/AutomatiseringTest.kt @@ -22,9 +22,9 @@ import no.nav.helse.modell.sykefraværstilfelle.Sykefraværstilfelle import no.nav.helse.modell.utbetaling.Utbetaling import no.nav.helse.modell.utbetaling.Utbetalingtype import no.nav.helse.modell.vedtaksperiode.Generasjon -import no.nav.helse.modell.vedtaksperiode.PgGenerasjonDao import no.nav.helse.modell.vedtaksperiode.Inntektskilde import no.nav.helse.modell.vedtaksperiode.Periodetype +import no.nav.helse.modell.vedtaksperiode.PgGenerasjonDao import no.nav.helse.modell.vergemal.VergemålDao import no.nav.helse.spesialist.api.person.Adressebeskyttelse import no.nav.helse.spesialist.test.lagFødselsnummer