From 4ad9732ab454ff32be1934c4e219900136898cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Oliver=20S=C3=B8berg?= <82504565+sebassonav@users.noreply.github.com> Date: Tue, 3 Dec 2024 12:49:35 +0100 Subject: [PATCH] EY-4815 Arbeidstabell med tester (#6542) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * EY-4815 Arbeidstabell med tester * Ta med jobbtype fra definert enum som kan utvides på samme måte som i tidshendelser * Logg jobbtype ved opprett * bump sql * Bump igjen --- .../behandling/jobs/brevjobber/Arbeidsjobb.kt | 39 +++++++++++ .../jobs/brevjobber/ArbeidstabellDao.kt | 68 +++++++++++++++++++ .../behandling/jobs/brevjobber/Jobbtyper.kt | 15 ++++ .../migration/V197__create_arbeidstabell.sql | 12 ++++ .../jobs/brevjobber/ArbeidstabellDaoTest.kt | 58 ++++++++++++++++ 5 files changed, 192 insertions(+) create mode 100644 apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/Arbeidsjobb.kt create mode 100644 apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/ArbeidstabellDao.kt create mode 100644 apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/Jobbtyper.kt create mode 100644 apps/etterlatte-behandling/src/main/resources/db/migration/V197__create_arbeidstabell.sql create mode 100644 apps/etterlatte-behandling/src/test/kotlin/behandling/jobs/brevjobber/ArbeidstabellDaoTest.kt diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/Arbeidsjobb.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/Arbeidsjobb.kt new file mode 100644 index 00000000000..09151a1a89c --- /dev/null +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/Arbeidsjobb.kt @@ -0,0 +1,39 @@ +package no.nav.etterlatte.behandling.jobs.brevjobber + +import no.nav.etterlatte.libs.common.sak.SakId +import no.nav.etterlatte.libs.common.tidspunkt.Tidspunkt +import java.util.UUID + +data class Arbeidsjobb( + val id: UUID, + val sakId: SakId, + val type: JobbType, + val status: ArbeidStatus, + val resultat: String? = null, + val merknad: String? = null, + val opprettet: Tidspunkt, + val sistEndret: Tidspunkt, +) + +fun lagNyArbeidsJobb( + sakId: SakId, + type: JobbType, + merknad: String?, +): Arbeidsjobb = + Arbeidsjobb( + id = UUID.randomUUID(), + sakId = sakId, + type = type, + status = ArbeidStatus.NY, + merknad = merknad, + opprettet = Tidspunkt.now(), + sistEndret = Tidspunkt.now(), + ) + +enum class ArbeidStatus { + NY, + PAAGAAENDE, + STANSET, + FERDIG, + FEILET, +} diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/ArbeidstabellDao.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/ArbeidstabellDao.kt new file mode 100644 index 00000000000..a8766d418fd --- /dev/null +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/ArbeidstabellDao.kt @@ -0,0 +1,68 @@ +package no.nav.etterlatte.behandling.jobs.brevjobber + +import no.nav.etterlatte.common.ConnectionAutoclosing +import no.nav.etterlatte.libs.common.sak.SakId +import no.nav.etterlatte.libs.common.tidspunkt.getTidspunkt +import no.nav.etterlatte.libs.common.tidspunkt.setTidspunkt +import no.nav.etterlatte.libs.database.toList +import org.slf4j.LoggerFactory +import java.sql.ResultSet +import java.util.UUID + +class ArbeidstabellDao( + private val connectionAutoclosing: ConnectionAutoclosing, +) { + private val logger = LoggerFactory.getLogger(this::class.java) + + fun opprettJobb(jobb: Arbeidsjobb) { + connectionAutoclosing.hentConnection { + with(it) { + val statement = + prepareStatement( + """ + INSERT INTO arbeidstabell(id, sak_id, status, merknad, resultat, opprettet, endret, jobbtype) + VALUES(?::UUID, ?, ?, ?, ?, ?, ?, ?) + """.trimIndent(), + ) + statement.setObject(1, jobb.id) + statement.setLong(2, jobb.sakId.sakId) + statement.setString(3, jobb.status.name) + statement.setObject(4, jobb.merknad) + statement.setObject(5, jobb.resultat) + statement.setTidspunkt(6, jobb.opprettet) + statement.setTidspunkt(7, jobb.sistEndret) + statement.setString(8, jobb.type.name) + statement.executeUpdate() + logger.info("Opprettet en jobb av type ${jobb.type.name} for sak ${jobb.sakId} med status ${jobb.status}") + } + } + } + + fun hentKlareJobber(): List = + connectionAutoclosing.hentConnection { + with(it) { + val statement = + prepareStatement( + """ + SELECT * from arbeidstabell where status = ? + """.trimIndent(), + ) + statement.setString(1, ArbeidStatus.NY.name) + statement.executeQuery().toList { + asJobb() + } + } + } + + private fun ResultSet.asJobb() = + Arbeidsjobb( + id = getObject("id") as UUID, + sakId = SakId(getLong("sak_id")), + type = JobbType.valueOf(getString("jobbtype")), + status = ArbeidStatus.valueOf(getString("status")), + resultat = getString("resultat"), + merknad = getString("merknad"), + opprettet = getTidspunkt("opprettet"), + sistEndret = getTidspunkt("endret"), + ) +} diff --git a/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/Jobbtyper.kt b/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/Jobbtyper.kt new file mode 100644 index 00000000000..743418c62f2 --- /dev/null +++ b/apps/etterlatte-behandling/src/main/kotlin/behandling/jobs/brevjobber/Jobbtyper.kt @@ -0,0 +1,15 @@ +package no.nav.etterlatte.behandling.jobs.brevjobber + +import no.nav.etterlatte.libs.common.behandling.SakType + +enum class JobbType( + val beskrivelse: String, + val kategori: JobbKategori, + val sakType: SakType?, +) { + TREKKPLIKT_2025("Trekkplikt 2025, du taper penger på dette", JobbKategori.TREKKPLIKT, SakType.OMSTILLINGSSTOENAD), +} + +enum class JobbKategori { + TREKKPLIKT, +} diff --git a/apps/etterlatte-behandling/src/main/resources/db/migration/V197__create_arbeidstabell.sql b/apps/etterlatte-behandling/src/main/resources/db/migration/V197__create_arbeidstabell.sql new file mode 100644 index 00000000000..09e23ff8b39 --- /dev/null +++ b/apps/etterlatte-behandling/src/main/resources/db/migration/V197__create_arbeidstabell.sql @@ -0,0 +1,12 @@ +create table arbeidstabell ( + id UUID PRIMARY KEY, + sak_id BIGINT NOT NULL + CONSTRAINT behandling_sak_id_fk + REFERENCES sak (id), + status TEXT, + jobbtype TEXT, + merknad TEXT, + resultat JSONB, + opprettet TIMESTAMP WITH TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC') NOT NULL, + endret TIMESTAMP WITH TIME ZONE DEFAULT (now() AT TIME ZONE 'UTC') NOT NULL +) \ No newline at end of file diff --git a/apps/etterlatte-behandling/src/test/kotlin/behandling/jobs/brevjobber/ArbeidstabellDaoTest.kt b/apps/etterlatte-behandling/src/test/kotlin/behandling/jobs/brevjobber/ArbeidstabellDaoTest.kt new file mode 100644 index 00000000000..dd29d89fe50 --- /dev/null +++ b/apps/etterlatte-behandling/src/test/kotlin/behandling/jobs/brevjobber/ArbeidstabellDaoTest.kt @@ -0,0 +1,58 @@ +package no.nav.etterlatte.behandling.jobs.brevjobber + +import io.kotest.matchers.shouldBe +import io.mockk.mockk +import no.nav.etterlatte.ConnectionAutoclosingTest +import no.nav.etterlatte.DatabaseExtension +import no.nav.etterlatte.common.Enheter +import no.nav.etterlatte.libs.common.behandling.SakType +import no.nav.etterlatte.sak.SakSkrivDao +import no.nav.etterlatte.sak.SakendringerDao +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeAll +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.TestInstance +import org.junit.jupiter.api.extension.ExtendWith +import javax.sql.DataSource + +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@ExtendWith(DatabaseExtension::class) +internal class ArbeidstabellDaoTest( + val dataSource: DataSource, +) { + private lateinit var arbeidstabellDao: ArbeidstabellDao + private lateinit var sakRepo: SakSkrivDao + + @BeforeAll + fun beforeAll() { + arbeidstabellDao = ArbeidstabellDao(ConnectionAutoclosingTest(dataSource = dataSource)) + sakRepo = SakSkrivDao(SakendringerDao(ConnectionAutoclosingTest(dataSource)) { mockk() }) + } + + @AfterEach + fun afterEach() { + dataSource.connection.use { + it.prepareStatement("TRUNCATE arbeidstabell CASCADE;").execute() + } + } + + @Test + fun `Kan opprette jobber og hente jobber`() { + val sak = sakRepo.opprettSak("123", SakType.BARNEPENSJON, Enheter.defaultEnhet.enhetNr) + val sakId = sak.id + + val testjobb = lagNyArbeidsJobb(sakId, merknad = "testmerknad", type = JobbType.TREKKPLIKT_2025) + arbeidstabellDao.opprettJobb(testjobb) + + val nyeJobber = arbeidstabellDao.hentKlareJobber() + + nyeJobber.size shouldBe 1 + nyeJobber.first() shouldBe testjobb + + val enSakMedFlerejobber = lagNyArbeidsJobb(sakId, merknad = "jobbtoforsak", type = JobbType.TREKKPLIKT_2025) + arbeidstabellDao.opprettJobb(enSakMedFlerejobber) + + val sakMedToJobber = arbeidstabellDao.hentKlareJobber() + sakMedToJobber.size shouldBe 2 + } +}