Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/ey 4673 pins tidslinje #6528

Merged
merged 22 commits into from
Jan 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
f4ad6a4
Legger til nye felter til tidslinje for aktivitetsplikt
jorgesti Oct 30, 2024
5d711fb
Legge til tilsvarende felter for statistikk
jorgesti Oct 30, 2024
4960702
legge til pins for tidslinje
jorgesti Oct 31, 2024
516d43e
legge til pins for tidslinje
jorgesti Oct 31, 2024
c1517e1
Merge branch 'main' into feature/EY-4673_pins_tidslinje
jorgesti Nov 11, 2024
af2f21e
legge til pins for tidslinje
jorgesti Oct 31, 2024
707c5d4
Merge branch 'main' into feature/EY-4673_pins_tidslinje
jorgesti Nov 12, 2024
65c6247
Merge branch 'main' into feature/EY-4673_pins_tidslinje
jorgesti Nov 18, 2024
0f26149
Legge til pins for aktivitetsplikt tidslinje
jorgesti Nov 27, 2024
69002e8
Merge branch 'main' into feature/EY-4673_pins_tidslinje
jorgesti Dec 2, 2024
120ce44
Fikser redigering
oyvindsh Dec 2, 2024
04b7edf
Fikser datatyper for datovelger
oyvindsh Dec 2, 2024
ecfef8d
Lagt til nytt skjema aktivitetsplikt_hendelse og lagt til dao-tester
jorgesti Dec 2, 2024
5521ee9
Merge branch 'main' into feature/EY-4673_pins_tidslinje
jorgesti Dec 2, 2024
24a40ff
Lagt til manglende sakId parameter
jorgesti Dec 2, 2024
1241ec0
Samling av henting av aktiviteter og hendelser
jorgesti Jan 10, 2025
1b1a449
merge av main
jorgesti Jan 10, 2025
c38d2d1
Merge branch 'main' into ny-merge-main
jorgesti Jan 16, 2025
22a3ad2
oppdatert db script
jorgesti Jan 16, 2025
352e341
Forbedringer i frontend ihht kommentarer fra Emil
jorgesti Jan 21, 2025
ada6683
Merge branch 'main' into feature/EY-4673_pins_tidslinje
jorgesti Jan 21, 2025
a4db3a0
Oppdatert nr for migrering
jorgesti Jan 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class AktivitetspliktDao(
}
}

fun hentAktiviteterForBehandling(behandlingId: UUID): List<AktivitetspliktAktivitet> =
fun hentAktiviteterForBehandling(behandlingId: UUID): List<AktivitetspliktAktivitetPeriode> =
connectionAutoclosing.hentConnection {
with(it) {
val stmt =
Expand All @@ -95,7 +95,7 @@ class AktivitetspliktDao(
}
}

fun hentAktiviteterForSak(sakId: SakId): List<AktivitetspliktAktivitet> =
fun hentAktiviteterForSak(sakId: SakId): List<AktivitetspliktAktivitetPeriode> =
connectionAutoclosing.hentConnection {
with(it) {
val stmt =
Expand Down Expand Up @@ -287,8 +287,106 @@ class AktivitetspliktDao(
}
}

fun hentHendelserForBehandling(behandlingId: UUID): List<AktivitetspliktAktivitetHendelse> =
connectionAutoclosing.hentConnection {
with(it) {
val stmt =
prepareStatement(
"""
SELECT id, sak_id, behandling_id, dato, opprettet, endret, beskrivelse
FROM aktivitetsplikt_hendelse
WHERE behandling_id = ?
""".trimMargin(),
)
stmt.setObject(1, behandlingId)

stmt.executeQuery().toList { toHendelse() }
}
}

fun hentHendelserForSak(sakId: SakId): List<AktivitetspliktAktivitetHendelse> =
connectionAutoclosing.hentConnection {
with(it) {
val stmt =
prepareStatement(
"""
SELECT id, sak_id, behandling_id, dato, opprettet, endret, beskrivelse
FROM aktivitetsplikt_hendelse
WHERE sak_id = ?
""".trimMargin(),
)
stmt.setSakId(1, sakId)

stmt.executeQuery().toList { toHendelse() }
}
}

fun upsertHendelse(
behandlingId: UUID?,
hendelse: LagreAktivitetspliktHendelse,
kilde: Grunnlagsopplysning.Kilde,
) = connectionAutoclosing.hentConnection {
with(it) {
val stmt =
prepareStatement(
"""
INSERT INTO aktivitetsplikt_hendelse(id, sak_id, behandling_id, dato, opprettet, endret, beskrivelse)
VALUES (?, ?, ?, ?, ?, ?, ?)
ON CONFLICT (id) DO UPDATE SET
dato = excluded.dato,
endret = excluded.endret,
beskrivelse = excluded.beskrivelse
""".trimMargin(),
)
stmt.setObject(1, hendelse.id ?: UUID.randomUUID())
stmt.setSakId(2, hendelse.sakId)
stmt.setObject(3, behandlingId)
stmt.setDate(4, Date.valueOf(hendelse.dato))
stmt.setString(5, kilde.toJson())
stmt.setString(6, kilde.toJson())
stmt.setString(7, hendelse.beskrivelse)

stmt.executeUpdate()
}
}

fun slettHendelse(hendelseId: UUID) =
connectionAutoclosing.hentConnection {
with(it) {
val stmt =
prepareStatement(
"""
DELETE FROM aktivitetsplikt_hendelse
WHERE id = ?
""".trimMargin(),
)
stmt.setObject(1, hendelseId)

stmt.executeUpdate()
}
}

fun kopierHendelser(
forrigeBehandlingId: UUID,
nyBehandlingId: UUID,
) = connectionAutoclosing.hentConnection {
with(it) {
val stmt =
prepareStatement(
"""
INSERT INTO aktivitetsplikt_hendelse (id, sak_id, behandling_id, dato, opprettet, endret, beskrivelse)
(SELECT gen_random_uuid(), sak_id, ?, dato, opprettet, endret, beskrivelse FROM aktivitetsplikt_hendelse WHERE behandling_id = ?)
""".trimMargin(),
)
stmt.setObject(1, nyBehandlingId)
stmt.setObject(2, forrigeBehandlingId)

stmt.executeUpdate()
}
}

private fun ResultSet.toAktivitet() =
AktivitetspliktAktivitet(
AktivitetspliktAktivitetPeriode(
id = getUUID("id"),
sakId = SakId(getLong("sak_id")),
type = AktivitetspliktAktivitetType.valueOf(getString("aktivitet_type")),
Expand All @@ -298,9 +396,35 @@ class AktivitetspliktDao(
endret = objectMapper.readValue(getString("endret")),
beskrivelse = getString("beskrivelse"),
)

private fun ResultSet.toHendelse() =
AktivitetspliktAktivitetHendelse(
id = getUUID("id"),
sakId = SakId(getLong("sak_id")),
behandlingId = getString("behandling_id")?.let { UUID.fromString(it) },
dato = getDate("dato").toLocalDate(),
opprettet = objectMapper.readValue(getString("opprettet")),
endret = objectMapper.readValue(getString("endret")),
beskrivelse = getString("beskrivelse"),
)
}

data class AktivitetspliktAktivitet(
val hendelser: List<AktivitetspliktAktivitetHendelse>,
val perioder: List<AktivitetspliktAktivitetPeriode>,
)

data class AktivitetspliktAktivitetHendelse(
val id: UUID,
val sakId: SakId,
val behandlingId: UUID?,
val dato: LocalDate,
val opprettet: Grunnlagsopplysning.Kilde,
val endret: Grunnlagsopplysning.Kilde?,
val beskrivelse: String,
)

data class AktivitetspliktAktivitetPeriode(
val id: UUID,
val sakId: SakId,
val type: AktivitetspliktAktivitetType,
Expand Down Expand Up @@ -336,6 +460,13 @@ data class LagreAktivitetspliktAktivitet(
val beskrivelse: String,
)

data class LagreAktivitetspliktHendelse(
val id: UUID? = null,
val sakId: SakId,
val dato: LocalDate,
val beskrivelse: String,
)

enum class AktivitetspliktAktivitetType {
ARBEIDSTAKER,
SELVSTENDIG_NAERINGSDRIVENDE,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,21 @@ import org.slf4j.LoggerFactory
import java.util.UUID

const val AKTIVITET_ID_CALL_PARAMETER = "id"
const val HENDELSE_ID_CALL_PARAMETER = "hendelseId"
inline val PipelineContext<*, ApplicationCall>.aktivitetId: UUID
get() =
call.parameters[AKTIVITET_ID_CALL_PARAMETER]?.let { UUID.fromString(it) } ?: throw UgyldigForespoerselException(
"MANGLER_AKTIVITET_ID",
"Aktivitet id er ikke i path params",
)

inline val PipelineContext<*, ApplicationCall>.hendelseId: UUID
get() =
call.parameters[HENDELSE_ID_CALL_PARAMETER]?.let { UUID.fromString(it) } ?: throw UgyldigForespoerselException(
"MANGLER_HENDELSE_ID",
"Hendelse id er ikke i path params",
)

const val AKTIVITETSGRAD_ID_CALL_PARAMETER = "aktivitetsgradId"
inline val PipelineContext<*, ApplicationCall>.aktivitetsgradId: UUID
get() =
Expand Down Expand Up @@ -172,6 +180,67 @@ internal fun Route.aktivitetspliktRoutes(
}
}

route("/aktivitet-og-hendelser") {
get {
val behandlingId =
call.parameters[BEHANDLINGID_CALL_PARAMETER]?.let {
UUID.fromString(it)
}
logger.info("Henter aktiviteter og hendelser for sak=$sakId")
call.respond(inTransaction { aktivitetspliktService.hentAktiviteterHendelser(sakId = sakId, behandlingId = behandlingId) })
}
}

route("hendelse") {
get {
kunSaksbehandler {
val behandlingId =
call.parameters[BEHANDLINGID_CALL_PARAMETER]?.let {
UUID.fromString(it)
}
logger.info("Henter hendelser for sak $sakId")
val dto =
inTransaction {
runBlocking {
aktivitetspliktService.hentHendelser(
sakId = sakId,
behandlingId = behandlingId,
)
}
}
call.respond(dto)
}
}
post {
kunSkrivetilgang {
logger.info("Oppretter eller oppdaterer hendelser for sakId=$sakId")
val hendelse = call.receive<LagreAktivitetspliktHendelse>()
val hendelser =
inTransaction {
aktivitetspliktService.upsertHendelse(hendelse, brukerTokenInfo, sakId = sakId)
aktivitetspliktService.hentHendelser(sakId = sakId)
}
call.respond(hendelser)
}
}

route("/{$AKTIVITET_ID_CALL_PARAMETER}") {
delete {
kunSkrivetilgang {
logger.info("Sletter hendelse $hendelseId for sakId $sakId")

val hendelser =
inTransaction {
aktivitetspliktService.slettHendelse(hendelseId, brukerTokenInfo, sakId = sakId)
aktivitetspliktService.hentHendelser(sakId = sakId)
}

call.respond(hendelser)
}
}
}
}

route("statistikk/{$BEHANDLINGID_CALL_PARAMETER}") {
get {
kunSystembruker {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import no.nav.etterlatte.libs.common.behandling.Persongalleri
import no.nav.etterlatte.libs.common.behandling.Prosesstype
import no.nav.etterlatte.libs.common.behandling.Revurderingaarsak
import no.nav.etterlatte.libs.common.behandling.tilVirkningstidspunkt
import no.nav.etterlatte.libs.common.feilhaandtering.GenerellIkkeFunnetException
import no.nav.etterlatte.libs.common.feilhaandtering.IkkeFunnetException
import no.nav.etterlatte.libs.common.feilhaandtering.InternfeilException
import no.nav.etterlatte.libs.common.feilhaandtering.UgyldigForespoerselException
Expand Down Expand Up @@ -177,10 +178,28 @@ class AktivitetspliktService(
return varigUnntak != null
}

fun hentAktiviteterHendelser(
behandlingId: UUID? = null,
sakId: SakId? = null,
): AktivitetspliktAktivitet =
(
if (behandlingId != null) {
val perioder = aktivitetspliktDao.hentAktiviteterForBehandling(behandlingId)
val hendelser = aktivitetspliktDao.hentHendelserForBehandling(behandlingId)
AktivitetspliktAktivitet(hendelser, perioder)
} else if (sakId != null) {
val perioder = aktivitetspliktDao.hentAktiviteterForSak(sakId)
val hendelser = aktivitetspliktDao.hentHendelserForSak(sakId)
AktivitetspliktAktivitet(hendelser, perioder)
} else {
throw ManglerSakEllerBehandlingIdException()
}
)

fun hentAktiviteter(
behandlingId: UUID? = null,
sakId: SakId? = null,
): List<AktivitetspliktAktivitet> =
): List<AktivitetspliktAktivitetPeriode> =
(
if (behandlingId != null) {
aktivitetspliktDao.hentAktiviteterForBehandling(behandlingId)
Expand Down Expand Up @@ -245,6 +264,73 @@ class AktivitetspliktService(
}
}

fun hentHendelser(
behandlingId: UUID? = null,
sakId: SakId? = null,
): List<AktivitetspliktAktivitetHendelse> =
(
if (behandlingId != null) {
aktivitetspliktDao.hentHendelserForBehandling(behandlingId)
} else if (sakId != null) {
aktivitetspliktDao.hentHendelserForSak(sakId)
} else {
throw ManglerSakEllerBehandlingIdException()
}
)

fun upsertHendelse(
hendelse: LagreAktivitetspliktHendelse,
brukerTokenInfo: BrukerTokenInfo,
behandlingId: UUID? = null,
sakId: SakId? = null,
) {
val kilde = Grunnlagsopplysning.Saksbehandler.create(brukerTokenInfo.ident())

if (behandlingId != null) {
val behandling =
requireNotNull(behandlingService.hentBehandling(behandlingId)) { "Fant ikke behandling $behandlingId" }
if (!behandling.status.kanEndres()) {
throw BehandlingKanIkkeEndres()
}
if (hendelse.sakId != behandling.sak.id) {
throw SakidTilhoererIkkeBehandlingException()
}
aktivitetspliktDao.upsertHendelse(behandlingId, hendelse, kilde)

runBlocking { sendDtoTilStatistikk(hendelse.sakId, brukerTokenInfo, behandlingId) }
} else if (sakId != null) {
if (hendelse.sakId != sakId) {
throw SakidTilhoererIkkeBehandlingException()
}
aktivitetspliktDao.upsertHendelse(null, hendelse, kilde)
} else {
throw ManglerSakEllerBehandlingIdException()
}
}

fun slettHendelse(
hendelseId: UUID,
brukerTokenInfo: BrukerTokenInfo,
sakId: SakId,
) {
val hendelseForSak =
aktivitetspliktDao.hentHendelserForSak(sakId).firstOrNull { it.id == hendelseId } ?: throw GenerellIkkeFunnetException()

if (hendelseForSak.behandlingId != null) {
val behandling =
requireNotNull(
behandlingService.hentBehandling(hendelseForSak.behandlingId),
) { "Fant ikke behandling ${hendelseForSak.behandlingId}" }
if (!behandling.status.kanEndres()) {
throw BehandlingKanIkkeEndres()
}
aktivitetspliktDao.slettHendelse(hendelseId)
runBlocking { sendDtoTilStatistikk(behandling.sak.id, brukerTokenInfo, hendelseForSak.behandlingId) }
} else {
aktivitetspliktDao.slettHendelse(hendelseId)
}
}

fun upsertAktivitetsgradForOppgave(
aktivitetsgrad: LagreAktivitetspliktAktivitetsgrad,
oppgaveId: UUID,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CREATE TABLE aktivitetsplikt_hendelse
(
id UUID UNIQUE,
sak_id BIGINT NOT NULL,
behandling_id UUID,
dato DATE,
opprettet TEXT,
endret TEXT,
beskrivelse TEXT,
CONSTRAINT fk_sak_id FOREIGN KEY (sak_id) REFERENCES sak (id)
);
Loading
Loading