diff --git a/spesialist-selve/src/main/kotlin/no/nav/helse/db/TransactionalUtbetalingDao.kt b/spesialist-selve/src/main/kotlin/no/nav/helse/db/TransactionalUtbetalingDao.kt index 2983877f0..c5beb61b5 100644 --- a/spesialist-selve/src/main/kotlin/no/nav/helse/db/TransactionalUtbetalingDao.kt +++ b/spesialist-selve/src/main/kotlin/no/nav/helse/db/TransactionalUtbetalingDao.kt @@ -28,7 +28,15 @@ class TransactionalUtbetalingDao(private val session: Session) : UtbetalingRepos ) } - override fun finnUtbetalingIdRef(utbetalingId: UUID): Long = throw UnsupportedOperationException() + override fun finnUtbetalingIdRef(utbetalingId: UUID): Long? { + @Language("PostgreSQL") + val statement = "SELECT id FROM utbetaling_id WHERE utbetaling_id = ? LIMIT 1;" + return session.run( + queryOf(statement, utbetalingId).map { row -> + row.long("id") + }.asSingle, + ) + } override fun hentUtbetaling(utbetalingId: UUID): Utbetaling = checkNotNull(utbetalingFor(utbetalingId)) { "Finner ikke utbetaling, utbetalingId=$utbetalingId" } @@ -55,13 +63,44 @@ class TransactionalUtbetalingDao(private val session: Session) : UtbetalingRepos opprettet: LocalDateTime, json: String, ) { - throw UnsupportedOperationException() + @Language("PostgreSQL") + val statement = """ + INSERT INTO utbetaling ( utbetaling_id_ref, status, opprettet, data ) + VALUES (:utbetalingIdRef, CAST(:status as utbetaling_status), :opprettet, CAST(:json as json)) ON CONFLICT (status, opprettet, utbetaling_id_ref) DO NOTHING; + """ + session.run( + queryOf( + statement, + mapOf( + "utbetalingIdRef" to utbetalingIdRef, + "status" to status.toString(), + "opprettet" to opprettet, + "json" to json, + ), + ).asExecute, + ) } override fun nyttOppdrag( fagsystemId: String, mottaker: String, - ): Long = throw UnsupportedOperationException() + ): Long? { + @Language("PostgreSQL") + val statement = """ + INSERT INTO oppdrag (fagsystem_id, mottaker) + VALUES (:fagsystemId, :mottaker) + ON CONFLICT DO NOTHING + """ + return session.run( + queryOf( + statement, + mapOf( + "fagsystemId" to fagsystemId, + "mottaker" to mottaker, + ), + ).asUpdateAndReturnGeneratedKey, + ) + } override fun opprettUtbetalingId( utbetalingId: UUID, @@ -73,7 +112,43 @@ class TransactionalUtbetalingDao(private val session: Session) : UtbetalingRepos personFagsystemIdRef: Long, arbeidsgiverbeløp: Int, personbeløp: Int, - ): Long = throw UnsupportedOperationException() + ): Long { + @Language("PostgreSQL") + val statement = """ + INSERT INTO utbetaling_id ( + utbetaling_id, person_ref, arbeidsgiver_ref, type, opprettet, arbeidsgiver_fagsystem_id_ref, person_fagsystem_id_ref, arbeidsgiverbeløp, personbeløp + ) VALUES ( + :utbetalingId, + (SELECT id FROM person WHERE fodselsnummer = :fodselsnummer), + (SELECT id FROM arbeidsgiver WHERE orgnummer = :orgnummer), + CAST(:type as utbetaling_type), + :opprettet, + :arbeidsgiverFagsystemIdRef, + :personFagsystemIdRef, + :arbeidsgiverbelop, + :personbelop + ) + ON CONFLICT (utbetaling_id) DO NOTHING RETURNING id + """ + return requireNotNull( + session.run( + queryOf( + statement, + mapOf( + "utbetalingId" to utbetalingId, + "fodselsnummer" to fødselsnummer.toLong(), + "orgnummer" to orgnummer.toLong(), + "type" to type.toString(), + "opprettet" to opprettet, + "arbeidsgiverFagsystemIdRef" to arbeidsgiverFagsystemIdRef, + "personFagsystemIdRef" to personFagsystemIdRef, + "arbeidsgiverbelop" to arbeidsgiverbeløp, + "personbelop" to personbeløp, + ), + ).asUpdateAndReturnGeneratedKey, + ), + ) { "Kunne ikke opprette utbetaling" } + } override fun opprettKobling( vedtaksperiodeId: UUID, 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 94abeb955..43dec4352 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 @@ -7,7 +7,6 @@ import no.nav.helse.db.CommandContextRepository import no.nav.helse.db.InntektskilderDao import no.nav.helse.db.NotatDao import no.nav.helse.db.OppgaveRepository -import no.nav.helse.db.OpptegnelseDao import no.nav.helse.db.Periodehistorikk import no.nav.helse.db.ReservasjonDao import no.nav.helse.db.TildelingDao @@ -114,7 +113,6 @@ internal class Kommandofabrikk( private val automatisering: Automatisering, private val arbeidsforholdDao: ArbeidsforholdDao = ArbeidsforholdDao(dataSource), private val utbetalingDao: UtbetalingDao = UtbetalingDao(dataSource), - private val opptegnelseDao: OpptegnelseDao = OpptegnelseDao(dataSource), private val generasjonService: GenerasjonService = GenerasjonService(dataSource), private val vergemålDao: VergemålDao = VergemålDao(dataSource), ) { @@ -315,7 +313,10 @@ internal class Kommandofabrikk( overstyringRepository = TransactionalOverstyringDao(transactionalSession), ) - internal fun utbetalingEndret(hendelse: UtbetalingEndret): UtbetalingEndretCommand = + internal fun utbetalingEndret( + hendelse: UtbetalingEndret, + session: TransactionalSession, + ): UtbetalingEndretCommand = UtbetalingEndretCommand( fødselsnummer = hendelse.fødselsnummer(), organisasjonsnummer = hendelse.organisasjonsnummer, @@ -327,13 +328,19 @@ internal class Kommandofabrikk( personOppdrag = hendelse.personOppdrag, arbeidsgiverbeløp = hendelse.arbeidsgiverbeløp, personbeløp = hendelse.personbeløp, - utbetalingRepository = utbetalingDao, - opptegnelseRepository = opptegnelseDao, - reservasjonRepository = reservasjonDao, - oppgaveRepository = oppgaveDao, - tildelingRepository = tildelingDao, - oppgaveService = oppgaveService, - totrinnsvurderingMediator = totrinnsvurderingMediator, + utbetalingRepository = TransactionalUtbetalingDao(session), + opptegnelseRepository = TransactionalOpptegnelseDao(session), + reservasjonRepository = TransactionalReservasjonDao(session), + oppgaveRepository = TransactionalOppgaveDao(session), + tildelingRepository = TransactionalTildelingDao(session), + oppgaveService = transaksjonellOppgaveService(session), + totrinnsvurderingMediator = + TotrinnsvurderingMediator( + TransactionalTotrinnsvurderingDao(session), + TransactionalOppgaveDao(session), + TransactionalPeriodehistorikkDao(session), + TransactionalNotatDao(session), + ), json = hendelse.toJson(), ) diff --git a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/utbetaling/UtbetalingDao.kt b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/utbetaling/UtbetalingDao.kt index 8bb80be7b..dab09438d 100644 --- a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/utbetaling/UtbetalingDao.kt +++ b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/utbetaling/UtbetalingDao.kt @@ -25,14 +25,8 @@ class UtbetalingDao(private val dataSource: DataSource) : HelseDao(dataSource), } override fun finnUtbetalingIdRef(utbetalingId: UUID): Long? { - @Language("PostgreSQL") - val statement = "SELECT id FROM utbetaling_id WHERE utbetaling_id = ? LIMIT 1;" - return sessionOf(dataSource).use { - it.run( - queryOf(statement, utbetalingId).map { row -> - row.long("id") - }.asSingle, - ) + sessionOf(dataSource).use { session -> + return TransactionalUtbetalingDao(session).finnUtbetalingIdRef(utbetalingId) } } @@ -42,23 +36,8 @@ class UtbetalingDao(private val dataSource: DataSource) : HelseDao(dataSource), opprettet: LocalDateTime, json: String, ) { - @Language("PostgreSQL") - val statement = """ - INSERT INTO utbetaling ( utbetaling_id_ref, status, opprettet, data ) - VALUES (:utbetalingIdRef, CAST(:status as utbetaling_status), :opprettet, CAST(:json as json)) ON CONFLICT (status, opprettet, utbetaling_id_ref) DO NOTHING; - """ - sessionOf(dataSource).use { - it.run( - queryOf( - statement, - mapOf( - "utbetalingIdRef" to utbetalingIdRef, - "status" to status.toString(), - "opprettet" to opprettet, - "json" to json, - ), - ).asExecute, - ) + sessionOf(dataSource).use { session -> + TransactionalUtbetalingDao(session).nyUtbetalingStatus(utbetalingIdRef, status, opprettet, json) } } @@ -90,42 +69,10 @@ class UtbetalingDao(private val dataSource: DataSource) : HelseDao(dataSource), arbeidsgiverbeløp: Int, personbeløp: Int, ): Long { - @Language("PostgreSQL") - val statement = """ - INSERT INTO utbetaling_id ( - utbetaling_id, person_ref, arbeidsgiver_ref, type, opprettet, arbeidsgiver_fagsystem_id_ref, person_fagsystem_id_ref, arbeidsgiverbeløp, personbeløp - ) VALUES ( - :utbetalingId, - (SELECT id FROM person WHERE fodselsnummer = :fodselsnummer), - (SELECT id FROM arbeidsgiver WHERE orgnummer = :orgnummer), - CAST(:type as utbetaling_type), - :opprettet, - :arbeidsgiverFagsystemIdRef, - :personFagsystemIdRef, - :arbeidsgiverbelop, - :personbelop - ) - ON CONFLICT (utbetaling_id) DO NOTHING RETURNING id - """ - return sessionOf(dataSource, returnGeneratedKey = true).use { - requireNotNull( - it.run( - queryOf( - statement, - mapOf( - "utbetalingId" to utbetalingId, - "fodselsnummer" to fødselsnummer.toLong(), - "orgnummer" to orgnummer.toLong(), - "type" to type.toString(), - "opprettet" to opprettet, - "arbeidsgiverFagsystemIdRef" to arbeidsgiverFagsystemIdRef, - "personFagsystemIdRef" to personFagsystemIdRef, - "arbeidsgiverbelop" to arbeidsgiverbeløp, - "personbelop" to personbeløp, - ), - ).asUpdateAndReturnGeneratedKey, - ), - ) { "Kunne ikke opprette utbetaling" } + sessionOf(dataSource, returnGeneratedKey = true).use { session -> + return TransactionalUtbetalingDao( + session, + ).opprettUtbetalingId(utbetalingId, fødselsnummer, orgnummer, type, opprettet, arbeidsgiverFagsystemIdRef, personFagsystemIdRef, arbeidsgiverbeløp, personbeløp) } } @@ -133,22 +80,8 @@ class UtbetalingDao(private val dataSource: DataSource) : HelseDao(dataSource), fagsystemId: String, mottaker: String, ): Long? { - @Language("PostgreSQL") - val statement = """ - INSERT INTO oppdrag (fagsystem_id, mottaker) - VALUES (:fagsystemId, :mottaker) - ON CONFLICT DO NOTHING - """ - return sessionOf(dataSource, returnGeneratedKey = true).use { - it.run( - queryOf( - statement, - mapOf( - "fagsystemId" to fagsystemId, - "mottaker" to mottaker, - ), - ).asUpdateAndReturnGeneratedKey, - ) + sessionOf(dataSource, returnGeneratedKey = true).use { session -> + return TransactionalUtbetalingDao(session).nyttOppdrag(fagsystemId, mottaker) } } diff --git a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/utbetaling/UtbetalingEndret.kt b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/utbetaling/UtbetalingEndret.kt index 8d946fe9c..9fb593704 100644 --- a/spesialist-selve/src/main/kotlin/no/nav/helse/modell/utbetaling/UtbetalingEndret.kt +++ b/spesialist-selve/src/main/kotlin/no/nav/helse/modell/utbetaling/UtbetalingEndret.kt @@ -1,6 +1,7 @@ package no.nav.helse.modell.utbetaling import com.fasterxml.jackson.databind.JsonNode +import kotliquery.TransactionalSession import no.nav.helse.db.OppgaveRepository import no.nav.helse.db.OpptegnelseRepository import no.nav.helse.db.ReservasjonRepository @@ -65,12 +66,22 @@ internal class UtbetalingEndret private constructor( json = jsonNode.toString(), ) - override fun behandle( + override fun skalKjøresTransaksjonelt(): Boolean = true + + override fun transaksjonellBehandle( person: Person, kommandostarter: Kommandostarter, + transactionalSession: TransactionalSession, ) { if (gjeldendeStatus == Utbetalingsstatus.FORKASTET) person.utbetalingForkastet(utbetalingId) - this.kommandostarter { utbetalingEndret(this@UtbetalingEndret) } + this.kommandostarter { utbetalingEndret(this@UtbetalingEndret, transactionalSession) } + } + + override fun behandle( + person: Person, + kommandostarter: Kommandostarter, + ) { + throw UnsupportedOperationException() } override fun fødselsnummer(): String = fødselsnummer