From eb7a685063d8cda51a08077ba09567b9592871d7 Mon Sep 17 00:00:00 2001 From: Anders B Nomerstad Date: Mon, 17 Mar 2025 12:24:29 +0100 Subject: [PATCH 01/10] Route + service for opprett meldekortkorrigering (WIP!) --- .../context/MeldekortContext.kt | 8 ++ .../meldekort/domene/MeldekortBehandling.kt | 28 +++++++ .../meldekort/domene/MeldekortBehandlinger.kt | 14 ++-- .../meldekort/domene/MeldeperiodeKjeder.kt | 2 +- .../service/IverksettMeldekortService.kt | 2 +- .../OpprettMeldekortBehandlingService.kt | 5 +- .../OpprettMeldekortKorrigeringService.kt | 66 ++++++++++++++++ .../SendMeldekortTilBeslutningService.kt | 2 +- .../saksbehandling/routes/Routes.kt | 1 + .../routes/meldekort/MeldekortRoutes.kt | 3 + .../OpprettMeldekortBehandlingRoute.kt | 6 -- .../OpprettMeldekortKorrigeringRoute.kt | 77 +++++++++++++++++++ .../routes/meldekort/dto/MeldeperiodeDTO.kt | 2 +- .../saksbehandling/domene/sak/Sak.kt | 21 ++--- 14 files changed, 209 insertions(+), 28 deletions(-) create mode 100644 app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt create mode 100644 app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/context/MeldekortContext.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/context/MeldekortContext.kt index c3a008cd1..b8e771833 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/context/MeldekortContext.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/context/MeldekortContext.kt @@ -12,6 +12,7 @@ import no.nav.tiltakspenger.saksbehandling.meldekort.ports.MeldeperiodeRepo import no.nav.tiltakspenger.saksbehandling.meldekort.service.IverksettMeldekortService import no.nav.tiltakspenger.saksbehandling.meldekort.service.OppgaveMeldekortService import no.nav.tiltakspenger.saksbehandling.meldekort.service.OpprettMeldekortBehandlingService +import no.nav.tiltakspenger.saksbehandling.meldekort.service.OpprettMeldekortKorrigeringService import no.nav.tiltakspenger.saksbehandling.meldekort.service.SendMeldekortTilBeslutningService import no.nav.tiltakspenger.saksbehandling.meldekort.service.SendMeldeperiodeTilBrukerService import no.nav.tiltakspenger.saksbehandling.repository.meldekort.BrukersMeldekortPostgresRepo @@ -86,6 +87,13 @@ open class MeldekortContext( sessionFactory = sessionFactory, ) } + val opprettMeldekortKorrigeringService by lazy { + OpprettMeldekortKorrigeringService( + meldekortBehandlingRepo = meldekortBehandlingRepo, + sakService = sakService, + sessionFactory = sessionFactory, + ) + } private val meldekortApiHttpClient by lazy { MeldekortApiHttpClient( diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt index 4025eff82..112420446 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt @@ -355,3 +355,31 @@ fun Sak.opprettMeldekortBehandling( ), ) } + +fun Sak.opprettMeldekortKorrigering( + saksbehandler: Saksbehandler, + meldekortBehandling: MeldekortBehandling, +): MeldekortBehandling.MeldekortUnderBehandling { + val meldekortId = MeldekortId.random() + val meldeperiode = meldekortBehandling.meldeperiode + + return MeldekortBehandling.MeldekortUnderBehandling( + id = meldekortId, + sakId = this.id, + saksnummer = this.saksnummer, + fnr = this.fnr, + opprettet = nå(), + navkontor = meldekortBehandling.navkontor, + ikkeRettTilTiltakspengerTidspunkt = null, + brukersMeldekort = meldekortBehandling.brukersMeldekort, + meldeperiode = meldeperiode, + saksbehandler = saksbehandler.navIdent, + beregning = MeldeperiodeBeregning.IkkeUtfyltMeldeperiode.fraPeriode( + meldeperiode = meldeperiode, + meldekortId = meldekortId, + sakId = this.id, + maksDagerMedTiltakspengerForPeriode = meldekortBehandling.beregning.maksDagerMedTiltakspengerForPeriode, + tiltakstypePerioder = this.vedtaksliste.tiltakstypeperioder, + ), + ) +} diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlinger.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlinger.kt index 2536e2f90..69bee65bd 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlinger.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlinger.kt @@ -78,20 +78,24 @@ data class MeldekortBehandlinger( } } - fun hentMeldekortBehandlingForMeldekortBehandlingId(meldekortId: MeldekortId): MeldekortBehandling? { + fun hentMeldekortBehandling(meldekortId: MeldekortId): MeldekortBehandling? { return verdi.singleOrNullOrThrow { it.id == meldekortId } } /** Flere behandlinger kan være knyttet til samme versjon av meldeperioden. */ - fun hentMeldekortBehandlingForMeldeperiodeId(id: MeldeperiodeId): List { + fun hentMeldekortBehandlingerForMeldeperiode(id: MeldeperiodeId): List { return this.filter { it.meldeperiode.id == id } } /** Flere behandlinger kan være knyttet til samme versjon av meldeperioden. */ - fun hentMeldekortBehandlingForMeldeperiodeKjedeId(kjedeId: MeldeperiodeKjedeId): List { + fun hentMeldekortBehandlingerForKjede(kjedeId: MeldeperiodeKjedeId): List { return verdi.filter { it.kjedeId == kjedeId } } + fun hentSisteMeldekortBehandlingForKjede(kjedeId: MeldeperiodeKjedeId): MeldekortBehandling? { + return hentMeldekortBehandlingerForKjede(kjedeId).lastOrNull() + } + /** * Løper igjennom alle ikke-avsluttede meldekortbehandlinger (også de som er sendt til beslutter), setter tilstanden til under behandling, oppdaterer meldeperioden og resetter utfyllinga. */ @@ -101,7 +105,7 @@ data class MeldekortBehandlinger( ): Pair> { return verdi.filter { it.erÅpen() } .fold(Pair(this, emptyList())) { acc, meldekortBehandling -> - val meldeperiode = oppdaterteKjeder.hentSisteMeldeperiodeForKjedeId( + val meldeperiode = oppdaterteKjeder.hentSisteMeldeperiodeForKjede( kjedeId = meldekortBehandling.meldeperiode.kjedeId, ) meldekortBehandling.oppdaterMeldeperiode(meldeperiode, tiltakstypePerioder)?.let { @@ -115,7 +119,7 @@ data class MeldekortBehandlinger( val periode: Periode by lazy { Periode(verdi.first().fraOgMed, verdi.last().tilOgMed) } - val behandledeMeldekort: List by lazy { verdi.filterIsInstance() } + private val behandledeMeldekort: List by lazy { verdi.filterIsInstance() } val godkjenteMeldekort: List by lazy { behandledeMeldekort.filter { it.status == MeldekortBehandlingStatus.GODKJENT } } diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldeperiodeKjeder.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldeperiodeKjeder.kt index 8ac4adc12..b42a40c62 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldeperiodeKjeder.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldeperiodeKjeder.kt @@ -49,7 +49,7 @@ data class MeldeperiodeKjeder( return meldeperiodeKjeder.asSequence().flatten().find { it.id == id } } - fun hentSisteMeldeperiodeForKjedeId(kjedeId: MeldeperiodeKjedeId): Meldeperiode { + fun hentSisteMeldeperiodeForKjede(kjedeId: MeldeperiodeKjedeId): Meldeperiode { return meldeperiodeKjeder.single { it.kjedeId == kjedeId }.last() } diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/IverksettMeldekortService.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/IverksettMeldekortService.kt index 65d416246..456ad07ab 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/IverksettMeldekortService.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/IverksettMeldekortService.kt @@ -50,7 +50,7 @@ class IverksettMeldekortService( val sak = sakService.hentForSakId(sakId, kommando.beslutter, kommando.correlationId) .getOrElse { return KanIkkeIverksetteMeldekort.KunneIkkeHenteSak(it).left() } - val meldekortBehandling: MeldekortBehandling = sak.hentMeldekortBehandlingForMeldekortBehandlingId(meldekortId) + val meldekortBehandling: MeldekortBehandling = sak.hentMeldekortBehandling(meldekortId) ?: throw IllegalArgumentException("Fant ikke meldekort med id $meldekortId i sak $sakId") meldekortBehandling as MeldekortBehandling.MeldekortBehandlet require(meldekortBehandling.beslutter == null && meldekortBehandling.status == MeldekortBehandlingStatus.KLAR_TIL_BESLUTNING) { diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortBehandlingService.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortBehandlingService.kt index 08fb766b4..afb72f654 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortBehandlingService.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortBehandlingService.kt @@ -38,13 +38,13 @@ class OpprettMeldekortBehandlingService( logger.error { "Kunne ikke hente sak med id $sakId" } return KanIkkeOppretteMeldekortBehandling.IkkeTilgangTilSak.left() }.also { - if (it.hentMeldekortBehandlingForMeldeperiodeKjedeId(kjedeId).isNotEmpty()) { + if (it.hentMeldekortBehandlingerForKjede(kjedeId).isNotEmpty()) { logger.error { "Det finnes allerede en behandling av $kjedeId: ${it.id}" } return KanIkkeOppretteMeldekortBehandling.BehandlingFinnes.left() } } - val meldeperiode: Meldeperiode = sak.hentMeldeperiodeForKjedeId(kjedeId = kjedeId) + val meldeperiode: Meldeperiode = sak.hentSisteMeldeperiodeForKjede(kjedeId = kjedeId) val navkontor = Either.catch { navkontorService.hentOppfolgingsenhet(sak.fnr) @@ -78,6 +78,5 @@ class OpprettMeldekortBehandlingService( sealed interface KanIkkeOppretteMeldekortBehandling { data object IkkeTilgangTilSak : KanIkkeOppretteMeldekortBehandling data object BehandlingFinnes : KanIkkeOppretteMeldekortBehandling - data object IngenMeldeperiode : KanIkkeOppretteMeldekortBehandling data object HenteNavkontorFeilet : KanIkkeOppretteMeldekortBehandling } diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt new file mode 100644 index 000000000..be59b7cf0 --- /dev/null +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt @@ -0,0 +1,66 @@ +package no.nav.tiltakspenger.saksbehandling.meldekort.service + +import arrow.core.Either +import arrow.core.getOrElse +import arrow.core.left +import arrow.core.right +import mu.KotlinLogging +import no.nav.tiltakspenger.libs.common.CorrelationId +import no.nav.tiltakspenger.libs.common.MeldekortId +import no.nav.tiltakspenger.libs.common.SakId +import no.nav.tiltakspenger.libs.common.Saksbehandler +import no.nav.tiltakspenger.libs.persistering.domene.SessionFactory +import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandling +import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlingStatus +import no.nav.tiltakspenger.saksbehandling.meldekort.domene.opprettMeldekortKorrigering +import no.nav.tiltakspenger.saksbehandling.meldekort.ports.MeldekortBehandlingRepo +import no.nav.tiltakspenger.saksbehandling.saksbehandling.service.sak.SakService + +class OpprettMeldekortKorrigeringService( + val sakService: SakService, + val meldekortBehandlingRepo: MeldekortBehandlingRepo, + val sessionFactory: SessionFactory, +) { + private val logger = KotlinLogging.logger {} + + suspend fun opprettKorrigering( + meldekortId: MeldekortId, + sakId: SakId, + saksbehandler: Saksbehandler, + correlationId: CorrelationId, + ): Either { + val sak = sakService.hentForSakId(sakId, saksbehandler, correlationId).getOrElse { + logger.error { "Kunne ikke hente sak med id $sakId" } + return KanIkkeOppretteMeldekortKorrigering.IkkeTilgangTilSak.left() + } + + val meldekortBehandling = sak.hentMeldekortBehandling(meldekortId) ?: run { + logger.error { "Fant ikke meldekortbehandlingen $meldekortId på sak $sakId" } + return KanIkkeOppretteMeldekortKorrigering.BehandlingenFinnesIkke.left() + } + + if (meldekortBehandling.status != MeldekortBehandlingStatus.GODKJENT) { + logger.error { "Behandlingen for meldekortet $meldekortId må være godkjent for å opprette korrigering" } + return KanIkkeOppretteMeldekortKorrigering.BehandlingenIkkeGodkjent.left() + } + + val meldekortKorrigering = sak.opprettMeldekortKorrigering( + saksbehandler = saksbehandler, + meldekortBehandling = meldekortBehandling, + ) + +// sessionFactory.withTransactionContext { tx -> +// meldekortBehandlingRepo.lagre(meldekortKorrigering, tx) +// } + + logger.info { "Opprettet korrigering av meldekort ${meldekortBehandling.id} på kjede ${meldekortBehandling.kjedeId} for sak $sakId" } + + return meldekortKorrigering.right() + } +} + +sealed interface KanIkkeOppretteMeldekortKorrigering { + data object IkkeTilgangTilSak : KanIkkeOppretteMeldekortKorrigering + data object BehandlingenFinnesIkke : KanIkkeOppretteMeldekortKorrigering + data object BehandlingenIkkeGodkjent : KanIkkeOppretteMeldekortKorrigering +} diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/SendMeldekortTilBeslutningService.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/SendMeldekortTilBeslutningService.kt index 5fef1e403..1fa84bfa9 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/SendMeldekortTilBeslutningService.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/SendMeldekortTilBeslutningService.kt @@ -45,7 +45,7 @@ class SendMeldekortTilBeslutningService( val sak = sakService.hentForSakId(kommando.sakId, kommando.saksbehandler, kommando.correlationId) .getOrElse { return KanIkkeSendeMeldekortTilBeslutning.KunneIkkeHenteSak(it).left() } - val meldekortbehandling = sak.hentMeldekortBehandlingForMeldekortBehandlingId(kommando.meldekortId)!! + val meldekortbehandling = sak.hentMeldekortBehandling(kommando.meldekortId)!! val meldeperiode = meldekortbehandling.meldeperiode if (!sak.erSisteVersjonAvMeldeperiode(meldeperiode)) { throw IllegalStateException("Kan ikke iverksette meldekortbehandling hvor meldeperioden (${meldeperiode.versjon}) ikke er siste versjon av meldeperioden i saken. sakId: ${sak.id}, meldekortId: ${meldekortbehandling.id}") diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/Routes.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/Routes.kt index 2b869af76..33ef41b3d 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/Routes.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/Routes.kt @@ -54,6 +54,7 @@ fun Route.routes( iverksettMeldekortService = applicationContext.meldekortContext.iverksettMeldekortService, sendMeldekortTilBeslutterService = applicationContext.meldekortContext.sendMeldekortTilBeslutterService, opprettMeldekortBehandlingService = applicationContext.meldekortContext.opprettMeldekortBehandlingService, + opprettMeldekortKorrigeringService = applicationContext.meldekortContext.opprettMeldekortKorrigeringService, auditService = applicationContext.personContext.auditService, sakService = applicationContext.sakContext.sakService, tokenService = applicationContext.tokenService, diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/MeldekortRoutes.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/MeldekortRoutes.kt index 639e62bb9..b00887901 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/MeldekortRoutes.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/MeldekortRoutes.kt @@ -6,12 +6,14 @@ import no.nav.tiltakspenger.saksbehandling.auditlog.AuditService import no.nav.tiltakspenger.saksbehandling.meldekort.service.IverksettMeldekortService import no.nav.tiltakspenger.saksbehandling.meldekort.service.MottaBrukerutfyltMeldekortService import no.nav.tiltakspenger.saksbehandling.meldekort.service.OpprettMeldekortBehandlingService +import no.nav.tiltakspenger.saksbehandling.meldekort.service.OpprettMeldekortKorrigeringService import no.nav.tiltakspenger.saksbehandling.meldekort.service.SendMeldekortTilBeslutningService import no.nav.tiltakspenger.saksbehandling.routes.meldekort.frameldekortapi.mottaMeldekortRoutes import no.nav.tiltakspenger.saksbehandling.saksbehandling.service.sak.SakService fun Route.meldekortRoutes( opprettMeldekortBehandlingService: OpprettMeldekortBehandlingService, + opprettMeldekortKorrigeringService: OpprettMeldekortKorrigeringService, iverksettMeldekortService: IverksettMeldekortService, sendMeldekortTilBeslutterService: SendMeldekortTilBeslutningService, auditService: AuditService, @@ -23,5 +25,6 @@ fun Route.meldekortRoutes( iverksettMeldekortRoute(iverksettMeldekortService, auditService, tokenService) sendMeldekortTilBeslutterRoute(sendMeldekortTilBeslutterService, auditService, tokenService) opprettMeldekortBehandlingRoute(opprettMeldekortBehandlingService, auditService, tokenService) + opprettMeldekortKorrigeringRoute(opprettMeldekortKorrigeringService, auditService, tokenService) mottaMeldekortRoutes(mottaBrukerutfyltMeldekortService) } diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortBehandlingRoute.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortBehandlingRoute.kt index 9a6d265d1..f6c52b877 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortBehandlingRoute.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortBehandlingRoute.kt @@ -7,7 +7,6 @@ import io.ktor.server.routing.post import mu.KotlinLogging import no.nav.tiltakspenger.libs.auth.core.TokenService import no.nav.tiltakspenger.libs.auth.ktor.withSaksbehandler -import no.nav.tiltakspenger.libs.ktor.common.respond400BadRequest import no.nav.tiltakspenger.libs.ktor.common.respond403Forbidden import no.nav.tiltakspenger.libs.ktor.common.respond409Conflict import no.nav.tiltakspenger.libs.ktor.common.respond500InternalServerError @@ -54,11 +53,6 @@ fun Route.opprettMeldekortBehandlingRoute( kode = "", ) - is KanIkkeOppretteMeldekortBehandling.IngenMeldeperiode -> call.respond400BadRequest( - melding = "Fant ikke meldeperioden med id $kjedeId på sak $sakId", - kode = "", - ) - is KanIkkeOppretteMeldekortBehandling.HenteNavkontorFeilet -> call.respond500InternalServerError( melding = "Kunne ikke hente Nav-kontor for brukeren", kode = "", diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt new file mode 100644 index 000000000..610bff019 --- /dev/null +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt @@ -0,0 +1,77 @@ +package no.nav.tiltakspenger.saksbehandling.routes.meldekort + +import io.ktor.http.HttpStatusCode +import io.ktor.server.response.respond +import io.ktor.server.routing.Route +import io.ktor.server.routing.post +import mu.KotlinLogging +import no.nav.tiltakspenger.libs.auth.core.TokenService +import no.nav.tiltakspenger.libs.auth.ktor.withSaksbehandler +import no.nav.tiltakspenger.libs.ktor.common.respond400BadRequest +import no.nav.tiltakspenger.libs.ktor.common.respond403Forbidden +import no.nav.tiltakspenger.saksbehandling.auditlog.AuditLogEvent +import no.nav.tiltakspenger.saksbehandling.auditlog.AuditService +import no.nav.tiltakspenger.saksbehandling.meldekort.service.KanIkkeOppretteMeldekortKorrigering +import no.nav.tiltakspenger.saksbehandling.meldekort.service.OpprettMeldekortKorrigeringService +import no.nav.tiltakspenger.saksbehandling.routes.correlationId +import no.nav.tiltakspenger.saksbehandling.routes.meldekort.dto.toDTO +import no.nav.tiltakspenger.saksbehandling.routes.withMeldekortId +import no.nav.tiltakspenger.saksbehandling.routes.withSakId + +private const val PATH = "sak/{sakId}/meldeperiode/{meldekortId}/opprettKorrigering" + +fun Route.opprettMeldekortKorrigeringRoute( + opprettMeldekortKorrigeringService: OpprettMeldekortKorrigeringService, + auditService: AuditService, + tokenService: TokenService, +) { + val logger = KotlinLogging.logger { } + + post(PATH) { + logger.debug { "Mottatt post-request på $PATH - oppretter korrigering av meldekort-behandling" } + call.withSaksbehandler(tokenService = tokenService, svarMed403HvisIngenScopes = false) { saksbehandler -> + call.withSakId { sakId -> + call.withMeldekortId { meldekortId -> + val correlationId = call.correlationId() + + opprettMeldekortKorrigeringService.opprettKorrigering( + meldekortId = meldekortId, + sakId = sakId, + saksbehandler = saksbehandler, + correlationId = correlationId, + ).fold( + { + when (it) { + is KanIkkeOppretteMeldekortKorrigering.IkkeTilgangTilSak -> call.respond403Forbidden( + melding = "Du har ikke tilgang til sak $sakId", + kode = "", + ) + + is KanIkkeOppretteMeldekortKorrigering.BehandlingenFinnesIkke -> call.respond400BadRequest( + melding = "Fant ikke meldekortbehandlingen $meldekortId på sak $sakId", + kode = "", + ) + + is KanIkkeOppretteMeldekortKorrigering.BehandlingenIkkeGodkjent -> call.respond400BadRequest( + melding = "Meldekortbehandlingen $meldekortId på sak $sakId er ikke godkjent", + kode = "", + ) + } + }, + { + auditService.logMedSakId( + sakId = sakId, + navIdent = saksbehandler.navIdent, + action = AuditLogEvent.Action.CREATE, + contextMessage = "Oppretter korrigering av meldekort", + correlationId = correlationId, + ) + + call.respond(HttpStatusCode.OK, it.toDTO()) + }, + ) + } + } + } + } +} diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldeperiodeDTO.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldeperiodeDTO.kt index 929a35bed..9b7695a88 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldeperiodeDTO.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldeperiodeDTO.kt @@ -32,7 +32,7 @@ fun Sak.toMeldeperiodeDTO(meldeperiode: Meldeperiode): MeldeperiodeDTO { antallDager = meldeperiode.antallDagerForPeriode, girRett = meldeperiode.girRett, meldekortBehandling = this.meldekortBehandlinger - .hentMeldekortBehandlingForMeldeperiodeKjedeId(meldeperiode.kjedeId).lastOrNull()?.toDTO(), + .hentMeldekortBehandlingerForKjede(meldeperiode.kjedeId).lastOrNull()?.toDTO(), brukersMeldekort = this.brukersMeldekort .find { it.kjedeId == meldeperiode.kjedeId } ?.toDTO(), diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/saksbehandling/domene/sak/Sak.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/saksbehandling/domene/sak/Sak.kt index 17f87b826..c1af08cff 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/saksbehandling/domene/sak/Sak.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/saksbehandling/domene/sak/Sak.kt @@ -71,27 +71,28 @@ data class Sak( return vedtaksliste.antallBarnForDag(dag) } - fun hentMeldekortBehandlingForMeldekortBehandlingId(meldekortId: MeldekortId): MeldekortBehandling? { - return meldekortBehandlinger.hentMeldekortBehandlingForMeldekortBehandlingId(meldekortId) + fun hentMeldekortBehandling(meldekortId: MeldekortId): MeldekortBehandling? { + return meldekortBehandlinger.hentMeldekortBehandling(meldekortId) } /** Flere behandlinger kan være knyttet til samme versjon av meldeperioden. */ @Suppress("unused") - fun hentMeldekortBehandlingForMeldeperiodeId(meldeperiodeId: MeldeperiodeId): List { - return meldekortBehandlinger.hentMeldekortBehandlingForMeldeperiodeId(meldeperiodeId) - } + fun hentMeldekortBehandlingerForMeldeperiode(meldeperiodeId: MeldeperiodeId) = + meldekortBehandlinger.hentMeldekortBehandlingerForMeldeperiode(meldeperiodeId) /** Flere behandlinger kan være knyttet til samme versjon av meldeperioden. */ - fun hentMeldekortBehandlingForMeldeperiodeKjedeId(id: MeldeperiodeKjedeId): List { - return meldekortBehandlinger.hentMeldekortBehandlingForMeldeperiodeKjedeId(id) - } + fun hentMeldekortBehandlingerForKjede(id: MeldeperiodeKjedeId) = + meldekortBehandlinger.hentMeldekortBehandlingerForKjede(id) + + fun hentSisteMeldekortBehandlingForKjede(id: MeldeperiodeKjedeId) = + meldekortBehandlinger.hentSisteMeldekortBehandlingForKjede(id) fun hentMeldeperiode(id: MeldeperiodeId): Meldeperiode? { return meldeperiodeKjeder.hentMeldeperiode(id) } - fun hentMeldeperiodeForKjedeId(kjedeId: MeldeperiodeKjedeId): Meldeperiode { - return meldeperiodeKjeder.hentSisteMeldeperiodeForKjedeId(kjedeId) + fun hentSisteMeldeperiodeForKjede(kjedeId: MeldeperiodeKjedeId): Meldeperiode { + return meldeperiodeKjeder.hentSisteMeldeperiodeForKjede(kjedeId) } fun hentMeldekortUnderBehandling(): MeldekortBehandling? = meldekortBehandlinger.meldekortUnderBehandling From 34dde563d6764efbc6d5ef36a36d56d58a31c5b9 Mon Sep 17 00:00:00 2001 From: Anders B Nomerstad Date: Mon, 17 Mar 2025 18:42:29 +0100 Subject: [PATCH 02/10] =?UTF-8?q?Meldekortbehandling=20type=20(f=C3=B8rste?= =?UTF-8?q?=20behandling=20eller=20korrigering)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meldekort/domene/MeldekortBehandling.kt | 23 +++++++++++---- .../domene/MeldekortBehandlingType.kt | 12 ++++++++ .../meldekort/domene/MeldekortBehandlinger.kt | 2 +- .../OpprettMeldekortKorrigeringService.kt | 28 +++++++++---------- .../MeldekortBehandlingPostgresRepo.kt | 11 ++++++-- .../OpprettMeldekortKorrigeringRoute.kt | 16 +++++------ .../V51__meldekort_behandling_type.sql | 1 + .../objectmothers/MeldekortMother.kt | 8 ++++++ 8 files changed, 70 insertions(+), 31 deletions(-) create mode 100644 app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlingType.kt create mode 100644 app/src/main/resources/db/migration/V51__meldekort_behandling_type.sql diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt index 112420446..69951c6b7 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt @@ -32,6 +32,7 @@ sealed interface MeldekortBehandling { val opprettet: LocalDateTime val beregning: MeldeperiodeBeregning val meldeperiode: Meldeperiode + val type: MeldekortBehandlingType /** Vil kunne være null dersom vi ikke har mottatt et meldekort via vår digitale flate. Bør på sikt kunne være en liste? */ val brukersMeldekort: BrukersMeldekort? @@ -125,6 +126,7 @@ sealed interface MeldekortBehandling { override val ikkeRettTilTiltakspengerTidspunkt: LocalDateTime?, override val brukersMeldekort: BrukersMeldekort?, override val meldeperiode: Meldeperiode, + override val type: MeldekortBehandlingType, ) : MeldekortBehandling { init { @@ -204,6 +206,7 @@ sealed interface MeldekortBehandling { ikkeRettTilTiltakspengerTidspunkt = ikkeRettTilTiltakspengerTidspunkt, brukersMeldekort = brukersMeldekort, meldeperiode = meldeperiode, + type = type, ) } @@ -229,6 +232,7 @@ sealed interface MeldekortBehandling { override val brukersMeldekort: BrukersMeldekort?, override val meldeperiode: Meldeperiode, override val saksbehandler: String, + override val type: MeldekortBehandlingType, ) : MeldekortBehandling { override val iverksattTidspunkt = null override val sendtTilBeslutning = null @@ -273,6 +277,7 @@ sealed interface MeldekortBehandling { ikkeRettTilTiltakspengerTidspunkt = null, brukersMeldekort = brukersMeldekort, meldeperiode = meldeperiode, + type = type, ).right() } @@ -346,6 +351,7 @@ fun Sak.opprettMeldekortBehandling( brukersMeldekort = brukersMeldekort, meldeperiode = meldeperiode, saksbehandler = saksbehandler.navIdent, + type = MeldekortBehandlingType.FØRSTE_BEHANDLING, beregning = MeldeperiodeBeregning.IkkeUtfyltMeldeperiode.fraPeriode( meldeperiode = meldeperiode, meldekortId = meldekortId, @@ -358,10 +364,10 @@ fun Sak.opprettMeldekortBehandling( fun Sak.opprettMeldekortKorrigering( saksbehandler: Saksbehandler, - meldekortBehandling: MeldekortBehandling, + forrigeBehandling: MeldekortBehandling, ): MeldekortBehandling.MeldekortUnderBehandling { val meldekortId = MeldekortId.random() - val meldeperiode = meldekortBehandling.meldeperiode + val meldeperiode = hentSisteMeldeperiodeForKjede(forrigeBehandling.kjedeId) return MeldekortBehandling.MeldekortUnderBehandling( id = meldekortId, @@ -369,16 +375,21 @@ fun Sak.opprettMeldekortKorrigering( saksnummer = this.saksnummer, fnr = this.fnr, opprettet = nå(), - navkontor = meldekortBehandling.navkontor, - ikkeRettTilTiltakspengerTidspunkt = null, - brukersMeldekort = meldekortBehandling.brukersMeldekort, + // TODO: bør navkontor hentes på nytt? Kan den være endret innenfor samme periode? + navkontor = forrigeBehandling.navkontor, + ikkeRettTilTiltakspengerTidspunkt = forrigeBehandling.ikkeRettTilTiltakspengerTidspunkt, + // TODO: må kunne sette et annet bruker-meldekort når vi skal støtte korrigering fra bruker + brukersMeldekort = forrigeBehandling.brukersMeldekort, meldeperiode = meldeperiode, saksbehandler = saksbehandler.navIdent, + type = MeldekortBehandlingType.KORRIGERING, + // TODO: forhåndsutfylle denne fra forrige meldekortbehandling? beregning = MeldeperiodeBeregning.IkkeUtfyltMeldeperiode.fraPeriode( meldeperiode = meldeperiode, meldekortId = meldekortId, sakId = this.id, - maksDagerMedTiltakspengerForPeriode = meldekortBehandling.beregning.maksDagerMedTiltakspengerForPeriode, + // TODO: dette er kanskje også en variabel som saksbehandler kan korrigere? (På sikt?) + maksDagerMedTiltakspengerForPeriode = forrigeBehandling.beregning.maksDagerMedTiltakspengerForPeriode, tiltakstypePerioder = this.vedtaksliste.tiltakstypeperioder, ), ) diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlingType.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlingType.kt new file mode 100644 index 000000000..51a8b7f4e --- /dev/null +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlingType.kt @@ -0,0 +1,12 @@ +package no.nav.tiltakspenger.saksbehandling.meldekort.domene + +enum class MeldekortBehandlingType { + FØRSTE_BEHANDLING, + KORRIGERING, +} + +fun String.tilMeldekortBehandlingType(): MeldekortBehandlingType = when (this) { + "FØRSTE_BEHANDLING" -> MeldekortBehandlingType.FØRSTE_BEHANDLING + "KORRIGERING" -> MeldekortBehandlingType.KORRIGERING + else -> throw IllegalArgumentException("Ukjent meldekortbehanding type: $this") +} diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlinger.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlinger.kt index 69bee65bd..f9a320781 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlinger.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlinger.kt @@ -93,7 +93,7 @@ data class MeldekortBehandlinger( } fun hentSisteMeldekortBehandlingForKjede(kjedeId: MeldeperiodeKjedeId): MeldekortBehandling? { - return hentMeldekortBehandlingerForKjede(kjedeId).lastOrNull() + return hentMeldekortBehandlingerForKjede(kjedeId).maxByOrNull { it.opprettet } } /** diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt index be59b7cf0..7b9b9c107 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt @@ -6,7 +6,7 @@ import arrow.core.left import arrow.core.right import mu.KotlinLogging import no.nav.tiltakspenger.libs.common.CorrelationId -import no.nav.tiltakspenger.libs.common.MeldekortId +import no.nav.tiltakspenger.libs.common.MeldeperiodeKjedeId import no.nav.tiltakspenger.libs.common.SakId import no.nav.tiltakspenger.libs.common.Saksbehandler import no.nav.tiltakspenger.libs.persistering.domene.SessionFactory @@ -24,7 +24,7 @@ class OpprettMeldekortKorrigeringService( private val logger = KotlinLogging.logger {} suspend fun opprettKorrigering( - meldekortId: MeldekortId, + kjedeId: MeldeperiodeKjedeId, sakId: SakId, saksbehandler: Saksbehandler, correlationId: CorrelationId, @@ -34,26 +34,26 @@ class OpprettMeldekortKorrigeringService( return KanIkkeOppretteMeldekortKorrigering.IkkeTilgangTilSak.left() } - val meldekortBehandling = sak.hentMeldekortBehandling(meldekortId) ?: run { - logger.error { "Fant ikke meldekortbehandlingen $meldekortId på sak $sakId" } - return KanIkkeOppretteMeldekortKorrigering.BehandlingenFinnesIkke.left() + val meldekortBehandling = sak.hentSisteMeldekortBehandlingForKjede(kjedeId) ?: run { + logger.error { "Fant ingen meldekortbehandlinger (kjede $kjedeId på sak $sakId)" } + return KanIkkeOppretteMeldekortKorrigering.IngenBehandlinger.left() } if (meldekortBehandling.status != MeldekortBehandlingStatus.GODKJENT) { - logger.error { "Behandlingen for meldekortet $meldekortId må være godkjent for å opprette korrigering" } - return KanIkkeOppretteMeldekortKorrigering.BehandlingenIkkeGodkjent.left() + logger.error { "Siste behandling i kjeden må være godkjent for å opprette en ny korrigering (kjede $kjedeId på sak $sakId)" } + return KanIkkeOppretteMeldekortKorrigering.SisteBehandlingIkkeGodkjent.left() } val meldekortKorrigering = sak.opprettMeldekortKorrigering( saksbehandler = saksbehandler, - meldekortBehandling = meldekortBehandling, + forrigeBehandling = meldekortBehandling, ) -// sessionFactory.withTransactionContext { tx -> -// meldekortBehandlingRepo.lagre(meldekortKorrigering, tx) -// } + sessionFactory.withTransactionContext { tx -> + meldekortBehandlingRepo.lagre(meldekortKorrigering, tx) + } - logger.info { "Opprettet korrigering av meldekort ${meldekortBehandling.id} på kjede ${meldekortBehandling.kjedeId} for sak $sakId" } + logger.info { "Opprettet korrigering av meldekort ${meldekortKorrigering.id} for kjede ${meldekortBehandling.kjedeId} på sak $sakId" } return meldekortKorrigering.right() } @@ -61,6 +61,6 @@ class OpprettMeldekortKorrigeringService( sealed interface KanIkkeOppretteMeldekortKorrigering { data object IkkeTilgangTilSak : KanIkkeOppretteMeldekortKorrigering - data object BehandlingenFinnesIkke : KanIkkeOppretteMeldekortKorrigering - data object BehandlingenIkkeGodkjent : KanIkkeOppretteMeldekortKorrigering + data object IngenBehandlinger : KanIkkeOppretteMeldekortKorrigering + data object SisteBehandlingIkkeGodkjent : KanIkkeOppretteMeldekortKorrigering } diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingPostgresRepo.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingPostgresRepo.kt index 29d1e8cbc..c7de2ca2b 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingPostgresRepo.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingPostgresRepo.kt @@ -17,6 +17,7 @@ import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandling. import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandling.MeldekortUnderBehandling import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlingStatus import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlinger +import no.nav.tiltakspenger.saksbehandling.meldekort.domene.tilMeldekortBehandlingType import no.nav.tiltakspenger.saksbehandling.meldekort.domene.tilMeldekortperioder import no.nav.tiltakspenger.saksbehandling.meldekort.ports.MeldekortBehandlingRepo import no.nav.tiltakspenger.saksbehandling.saksbehandling.domene.behandling.Behandling @@ -48,7 +49,8 @@ class MeldekortBehandlingPostgresRepo( navkontor, iverksatt_tidspunkt, sendt_til_beslutning, - navkontor_navn + navkontor_navn, + type ) values ( :id, :meldeperiode_kjede_id, @@ -64,7 +66,8 @@ class MeldekortBehandlingPostgresRepo( :navkontor, :iverksatt_tidspunkt, :sendt_til_beslutning, - :navkontor_navn + :navkontor_navn, + :type ) """, "id" to meldekortBehandling.id.toString(), @@ -82,6 +85,7 @@ class MeldekortBehandlingPostgresRepo( "iverksatt_tidspunkt" to meldekortBehandling.iverksattTidspunkt, "sendt_til_beslutning" to meldekortBehandling.sendtTilBeslutning, "navkontor_navn" to meldekortBehandling.navkontor.kontornavn, + "type" to meldekortBehandling.type.toString(), ).asUpdate, ) } @@ -183,6 +187,7 @@ class MeldekortBehandlingPostgresRepo( val fnr = Fnr.fromString(row.string("fnr")) val maksDagerMedTiltakspengerForPeriode = Behandling.MAKS_DAGER_MED_TILTAKSPENGER_FOR_PERIODE val opprettet = row.localDateTime("opprettet") + val type = row.string("type").tilMeldekortBehandlingType() val meldeperiodeId = MeldeperiodeId.fromString(row.string("meldeperiode_id")) val meldeperiode = MeldeperiodePostgresRepo.hentForMeldeperiodeId(meldeperiodeId, session) @@ -222,6 +227,7 @@ class MeldekortBehandlingPostgresRepo( ikkeRettTilTiltakspengerTidspunkt = row.localDateTimeOrNull("ikke_rett_til_tiltakspenger_tidspunkt"), brukersMeldekort = brukersMeldekort, meldeperiode = meldeperiode, + type = type, ) } // TODO jah: Her blander vi sammen behandlingsstatus og om man har rett/ikke-rett. Det er mulig at man har startet en meldekortbehandling også endres statusen til IKKE_RETT_TIL_TILTAKSPENGER. Da vil behandlingen sånn som koden er nå implisitt avsluttes. Det kan hende vi bør endre dette når vi skiller grunnlag, innsending og behandling. @@ -243,6 +249,7 @@ class MeldekortBehandlingPostgresRepo( brukersMeldekort = brukersMeldekort, meldeperiode = meldeperiode, saksbehandler = saksbehandler, + type = type, ) } } diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt index 610bff019..19afd4eed 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt @@ -15,10 +15,10 @@ import no.nav.tiltakspenger.saksbehandling.meldekort.service.KanIkkeOppretteMeld import no.nav.tiltakspenger.saksbehandling.meldekort.service.OpprettMeldekortKorrigeringService import no.nav.tiltakspenger.saksbehandling.routes.correlationId import no.nav.tiltakspenger.saksbehandling.routes.meldekort.dto.toDTO -import no.nav.tiltakspenger.saksbehandling.routes.withMeldekortId +import no.nav.tiltakspenger.saksbehandling.routes.withMeldeperiodeKjedeId import no.nav.tiltakspenger.saksbehandling.routes.withSakId -private const val PATH = "sak/{sakId}/meldeperiode/{meldekortId}/opprettKorrigering" +private const val PATH = "sak/{sakId}/meldeperiode/{meldeperiodeKjedeId}/opprettKorrigering" fun Route.opprettMeldekortKorrigeringRoute( opprettMeldekortKorrigeringService: OpprettMeldekortKorrigeringService, @@ -31,11 +31,11 @@ fun Route.opprettMeldekortKorrigeringRoute( logger.debug { "Mottatt post-request på $PATH - oppretter korrigering av meldekort-behandling" } call.withSaksbehandler(tokenService = tokenService, svarMed403HvisIngenScopes = false) { saksbehandler -> call.withSakId { sakId -> - call.withMeldekortId { meldekortId -> + call.withMeldeperiodeKjedeId { kjedeId -> val correlationId = call.correlationId() opprettMeldekortKorrigeringService.opprettKorrigering( - meldekortId = meldekortId, + kjedeId = kjedeId, sakId = sakId, saksbehandler = saksbehandler, correlationId = correlationId, @@ -47,13 +47,13 @@ fun Route.opprettMeldekortKorrigeringRoute( kode = "", ) - is KanIkkeOppretteMeldekortKorrigering.BehandlingenFinnesIkke -> call.respond400BadRequest( - melding = "Fant ikke meldekortbehandlingen $meldekortId på sak $sakId", + is KanIkkeOppretteMeldekortKorrigering.IngenBehandlinger -> call.respond400BadRequest( + melding = "Fant ingen meldekortbehandlinger på kjede $kjedeId for sak $sakId", kode = "", ) - is KanIkkeOppretteMeldekortKorrigering.BehandlingenIkkeGodkjent -> call.respond400BadRequest( - melding = "Meldekortbehandlingen $meldekortId på sak $sakId er ikke godkjent", + is KanIkkeOppretteMeldekortKorrigering.SisteBehandlingIkkeGodkjent -> call.respond400BadRequest( + melding = "Siste meldekortbehandling på kjede $kjedeId for sak $sakId er ikke godkjent", kode = "", ) } diff --git a/app/src/main/resources/db/migration/V51__meldekort_behandling_type.sql b/app/src/main/resources/db/migration/V51__meldekort_behandling_type.sql new file mode 100644 index 000000000..ff99af273 --- /dev/null +++ b/app/src/main/resources/db/migration/V51__meldekort_behandling_type.sql @@ -0,0 +1 @@ +ALTER TABLE meldekortbehandling ADD COLUMN IF NOT EXISTS type VARCHAR NOT NULL DEFAULT 'FØRSTE_BEHANDLING' \ No newline at end of file diff --git a/app/src/test/kotlin/no/nav/tiltakspenger/saksbehandling/objectmothers/MeldekortMother.kt b/app/src/test/kotlin/no/nav/tiltakspenger/saksbehandling/objectmothers/MeldekortMother.kt index 1f442746b..e15694a33 100644 --- a/app/src/test/kotlin/no/nav/tiltakspenger/saksbehandling/objectmothers/MeldekortMother.kt +++ b/app/src/test/kotlin/no/nav/tiltakspenger/saksbehandling/objectmothers/MeldekortMother.kt @@ -27,6 +27,7 @@ import no.nav.tiltakspenger.saksbehandling.meldekort.domene.InnmeldtStatus import no.nav.tiltakspenger.saksbehandling.meldekort.domene.LagreBrukersMeldekortKommando import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandling import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlingStatus +import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlingType import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlinger import no.nav.tiltakspenger.saksbehandling.meldekort.domene.Meldeperiode import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldeperiodeBeregning @@ -60,6 +61,7 @@ interface MeldekortMother { status: MeldekortBehandlingStatus = MeldekortBehandlingStatus.GODKJENT, navkontor: Navkontor = ObjectMother.navkontor(), opprettet: LocalDateTime = nå(), + type: MeldekortBehandlingType = MeldekortBehandlingType.FØRSTE_BEHANDLING, ): MeldekortBehandling.MeldekortUnderBehandling { val meldeperiode = meldeperiode( periode = periode, @@ -82,6 +84,7 @@ interface MeldekortMother { meldeperiode = meldeperiode, brukersMeldekort = null, saksbehandler = saksbehandler, + type = type, ) } @@ -118,6 +121,8 @@ interface MeldekortMother { navkontor: Navkontor = ObjectMother.navkontor(), antallDagerForMeldeperiode: Int = 14, sendtTilBeslutning: LocalDateTime = nå(), + erFørsteBehandlingForPerioden: Boolean = true, + type: MeldekortBehandlingType = MeldekortBehandlingType.FØRSTE_BEHANDLING, ): MeldekortBehandling.MeldekortBehandlet { return MeldekortBehandling.MeldekortBehandlet( id = id, @@ -135,6 +140,7 @@ interface MeldekortMother { ikkeRettTilTiltakspengerTidspunkt = null, meldeperiode = meldeperiode, brukersMeldekort = null, + type = type, ) } @@ -337,6 +343,7 @@ interface MeldekortMother { meldeperiode = meldeperiode, brukersMeldekort = null, saksbehandler = kommando.saksbehandler.navIdent, + type = MeldekortBehandlingType.FØRSTE_BEHANDLING, ), ), ) @@ -387,6 +394,7 @@ interface MeldekortMother { meldeperiode = meldeperiode, brukersMeldekort = null, saksbehandler = kommando.saksbehandler.navIdent, + type = MeldekortBehandlingType.FØRSTE_BEHANDLING, ), ).sendTilBeslutter(kommando, barnetilleggsPerioder, tiltakstypePerioder).getOrFail().first } From f30117b44560ea369311af75535ae3c1791f211c Mon Sep 17 00:00:00 2001 From: Anders B Nomerstad Date: Tue, 18 Mar 2025 09:06:54 +0100 Subject: [PATCH 03/10] =?UTF-8?q?Sjekker=20at=20forrige=20meldekortbehandl?= =?UTF-8?q?ing=20tilh=C3=B8rer=20samme=20sak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../meldekort/domene/MeldekortBehandling.kt | 6 +++++- .../service/OpprettMeldekortKorrigeringService.kt | 10 +++++----- .../meldekort/OpprettMeldekortKorrigeringRoute.kt | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt index 69951c6b7..3be928f97 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt @@ -366,6 +366,10 @@ fun Sak.opprettMeldekortKorrigering( saksbehandler: Saksbehandler, forrigeBehandling: MeldekortBehandling, ): MeldekortBehandling.MeldekortUnderBehandling { + require(this.meldekortBehandlinger.contains(forrigeBehandling)) { + "Forrige behandling ${forrigeBehandling.id} tilhører ikke denne saken" + } + val meldekortId = MeldekortId.random() val meldeperiode = hentSisteMeldeperiodeForKjede(forrigeBehandling.kjedeId) @@ -375,7 +379,7 @@ fun Sak.opprettMeldekortKorrigering( saksnummer = this.saksnummer, fnr = this.fnr, opprettet = nå(), - // TODO: bør navkontor hentes på nytt? Kan den være endret innenfor samme periode? + // TODO: bør navkontor hentes på nytt? Kan den være endret innenfor samme meldeperiode? navkontor = forrigeBehandling.navkontor, ikkeRettTilTiltakspengerTidspunkt = forrigeBehandling.ikkeRettTilTiltakspengerTidspunkt, // TODO: må kunne sette et annet bruker-meldekort når vi skal støtte korrigering fra bruker diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt index 7b9b9c107..918565340 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt @@ -34,26 +34,26 @@ class OpprettMeldekortKorrigeringService( return KanIkkeOppretteMeldekortKorrigering.IkkeTilgangTilSak.left() } - val meldekortBehandling = sak.hentSisteMeldekortBehandlingForKjede(kjedeId) ?: run { + val sisteMeldekortBehandling = sak.hentSisteMeldekortBehandlingForKjede(kjedeId) ?: run { logger.error { "Fant ingen meldekortbehandlinger (kjede $kjedeId på sak $sakId)" } return KanIkkeOppretteMeldekortKorrigering.IngenBehandlinger.left() } - if (meldekortBehandling.status != MeldekortBehandlingStatus.GODKJENT) { - logger.error { "Siste behandling i kjeden må være godkjent for å opprette en ny korrigering (kjede $kjedeId på sak $sakId)" } + if (sisteMeldekortBehandling.status != MeldekortBehandlingStatus.GODKJENT) { + logger.error { "Siste behandling i kjeden må være godkjent for å opprette en korrigering (kjede $kjedeId på sak $sakId)" } return KanIkkeOppretteMeldekortKorrigering.SisteBehandlingIkkeGodkjent.left() } val meldekortKorrigering = sak.opprettMeldekortKorrigering( saksbehandler = saksbehandler, - forrigeBehandling = meldekortBehandling, + forrigeBehandling = sisteMeldekortBehandling, ) sessionFactory.withTransactionContext { tx -> meldekortBehandlingRepo.lagre(meldekortKorrigering, tx) } - logger.info { "Opprettet korrigering av meldekort ${meldekortKorrigering.id} for kjede ${meldekortBehandling.kjedeId} på sak $sakId" } + logger.info { "Opprettet korrigering av meldekort ${meldekortKorrigering.id} for kjede ${sisteMeldekortBehandling.kjedeId} på sak $sakId" } return meldekortKorrigering.right() } diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt index 19afd4eed..0d28c71b6 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt @@ -28,7 +28,7 @@ fun Route.opprettMeldekortKorrigeringRoute( val logger = KotlinLogging.logger { } post(PATH) { - logger.debug { "Mottatt post-request på $PATH - oppretter korrigering av meldekort-behandling" } + logger.debug { "Mottatt post-request på $PATH - oppretter korrigering av meldekort" } call.withSaksbehandler(tokenService = tokenService, svarMed403HvisIngenScopes = false) { saksbehandler -> call.withSakId { sakId -> call.withMeldeperiodeKjedeId { kjedeId -> @@ -48,7 +48,7 @@ fun Route.opprettMeldekortKorrigeringRoute( ) is KanIkkeOppretteMeldekortKorrigering.IngenBehandlinger -> call.respond400BadRequest( - melding = "Fant ingen meldekortbehandlinger på kjede $kjedeId for sak $sakId", + melding = "Fant ingen tidligere meldekortbehandling på kjede $kjedeId for sak $sakId", kode = "", ) From dd20dd6fd05bb772d3b383c66788ac7c2c227253 Mon Sep 17 00:00:00 2001 From: Anders B Nomerstad Date: Tue, 18 Mar 2025 09:37:18 +0100 Subject: [PATCH 04/10] Forbereder iverksett korrigering --- .../service/IverksettMeldekortService.kt | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/IverksettMeldekortService.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/IverksettMeldekortService.kt index 456ad07ab..923b9001c 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/IverksettMeldekortService.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/IverksettMeldekortService.kt @@ -15,10 +15,11 @@ import no.nav.tiltakspenger.saksbehandling.meldekort.domene.IverksettMeldekortKo import no.nav.tiltakspenger.saksbehandling.meldekort.domene.KanIkkeIverksetteMeldekort import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandling import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlingStatus -import no.nav.tiltakspenger.saksbehandling.meldekort.domene.Meldeperiode +import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlingType import no.nav.tiltakspenger.saksbehandling.meldekort.domene.opprettNesteMeldeperiode import no.nav.tiltakspenger.saksbehandling.meldekort.ports.MeldekortBehandlingRepo import no.nav.tiltakspenger.saksbehandling.meldekort.ports.MeldeperiodeRepo +import no.nav.tiltakspenger.saksbehandling.saksbehandling.domene.sak.Sak import no.nav.tiltakspenger.saksbehandling.saksbehandling.ports.StatistikkStønadRepo import no.nav.tiltakspenger.saksbehandling.saksbehandling.service.person.PersonService import no.nav.tiltakspenger.saksbehandling.saksbehandling.service.sak.SakService @@ -61,34 +62,45 @@ class IverksettMeldekortService( throw IllegalStateException("Kan ikke iverksette meldekortbehandling hvor meldeperioden (${meldeperiode.versjon}) ikke er siste versjon av meldeperioden i saken. sakId: $sakId, meldekortId: $meldekortId") } - val nesteMeldeperiode: Meldeperiode? = sak.opprettNesteMeldeperiode()?.let { - if (meldekortBehandling.periode.tilOgMed.plusDays(1) != it.periode.fraOgMed) { - log.info { "Neste meldeperiode (${it.periode}) er ikke sammenhengende med det vedtatte meldekortet sin meldeperiode (${meldekortBehandling.periode}). Oppretter ikke ny meldeperiode. behandlingId: ${meldekortBehandling.id}, sakId: ${meldekortBehandling.sakId}, saksnummer: ${meldekortBehandling.saksnummer}" } + return meldekortBehandling.iverksettMeldekort(kommando.beslutter).onRight { + when (it.type) { + MeldekortBehandlingType.FØRSTE_BEHANDLING -> persisterFørsteBehandling(it, sak) + MeldekortBehandlingType.KORRIGERING -> persisterKorrigering(it, sak) + } + } + } + + private fun persisterFørsteBehandling(meldekort: MeldekortBehandling.MeldekortBehandlet, sak: Sak) { + val eksisterendeUtbetalingsvedtak = sak.utbetalinger + val utbetalingsvedtak = meldekort.opprettUtbetalingsvedtak( + saksnummer = sak.saksnummer, + fnr = sak.fnr, + eksisterendeUtbetalingsvedtak.lastOrNull()?.id, + ) + val utbetalingsstatistikk = utbetalingsvedtak.tilStatistikk() + + val nesteMeldeperiode = sak.opprettNesteMeldeperiode()?.let { + if (meldekort.periode.tilOgMed.plusDays(1) != it.periode.fraOgMed) { + log.info { "Neste meldeperiode (${it.periode}) er ikke sammenhengende med det vedtatte meldekortet sin meldeperiode (${meldekort.periode}). Oppretter ikke ny meldeperiode. behandlingId: ${meldekort.id}, sakId: ${meldekort.sakId}" } null } else { it } } - return meldekortBehandling.iverksettMeldekort(kommando.beslutter).onRight { iverksattMeldekort -> - val eksisterendeUtbetalingsvedtak = sak.utbetalinger - val utbetalingsvedtak = iverksattMeldekort.opprettUtbetalingsvedtak( - saksnummer = sak.saksnummer, - fnr = sak.fnr, - eksisterendeUtbetalingsvedtak.lastOrNull()?.id, - ) - val utbetalingsstatistikk = utbetalingsvedtak.tilStatistikk() - - sessionFactory.withTransactionContext { tx -> - meldekortBehandlingRepo.oppdater(iverksattMeldekort, tx) - // TODO John og Anders: På et tidspunkt bør vi kanskje flytte generering av meldeperioder ut i en jobb? - nesteMeldeperiode?.also { meldeperiodeRepo.lagre(it, tx) } - utbetalingsvedtakRepo.lagre(utbetalingsvedtak, tx) - statistikkStønadRepo.lagre(utbetalingsstatistikk, tx) - } + sessionFactory.withTransactionContext { tx -> + meldekortBehandlingRepo.oppdater(meldekort, tx) + // TODO John og Anders: På et tidspunkt bør vi kanskje flytte generering av meldeperioder ut i en jobb? + nesteMeldeperiode?.also { meldeperiodeRepo.lagre(it, tx) } + utbetalingsvedtakRepo.lagre(utbetalingsvedtak, tx) + statistikkStønadRepo.lagre(utbetalingsstatistikk, tx) } } + private fun persisterKorrigering(meldekort: MeldekortBehandling.MeldekortBehandlet, sak: Sak) { + TODO("Har ikke implementert iverksetting av korrigering ennå!") + } + private suspend fun kastHvisIkkeTilgangTilPerson( saksbehandler: Saksbehandler, meldekortId: MeldekortId, From e765f3014b4e3413b0ec6c782efe81841a3f0b29 Mon Sep 17 00:00:00 2001 From: Anders B Nomerstad Date: Tue, 18 Mar 2025 10:25:30 +0100 Subject: [PATCH 05/10] DTO og Db enums for meldekortbehandling type --- .../domene/MeldekortBehandlingType.kt | 6 ------ .../MeldekortBehandlingPostgresRepo.kt | 3 +-- .../meldekort/MeldekortBehandlingTypeDb.kt | 18 ++++++++++++++++++ .../meldekort/dto/MeldekortBehandlingDTO.kt | 2 ++ .../dto/MeldekortBehandlingTypeDTO.kt | 13 +++++++++++++ 5 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingTypeDb.kt create mode 100644 app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldekortBehandlingTypeDTO.kt diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlingType.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlingType.kt index 51a8b7f4e..dbedcd69e 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlingType.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandlingType.kt @@ -4,9 +4,3 @@ enum class MeldekortBehandlingType { FØRSTE_BEHANDLING, KORRIGERING, } - -fun String.tilMeldekortBehandlingType(): MeldekortBehandlingType = when (this) { - "FØRSTE_BEHANDLING" -> MeldekortBehandlingType.FØRSTE_BEHANDLING - "KORRIGERING" -> MeldekortBehandlingType.KORRIGERING - else -> throw IllegalArgumentException("Ukjent meldekortbehanding type: $this") -} diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingPostgresRepo.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingPostgresRepo.kt index c7de2ca2b..7a21cfaa8 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingPostgresRepo.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingPostgresRepo.kt @@ -17,7 +17,6 @@ import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandling. import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandling.MeldekortUnderBehandling import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlingStatus import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlinger -import no.nav.tiltakspenger.saksbehandling.meldekort.domene.tilMeldekortBehandlingType import no.nav.tiltakspenger.saksbehandling.meldekort.domene.tilMeldekortperioder import no.nav.tiltakspenger.saksbehandling.meldekort.ports.MeldekortBehandlingRepo import no.nav.tiltakspenger.saksbehandling.saksbehandling.domene.behandling.Behandling @@ -85,7 +84,7 @@ class MeldekortBehandlingPostgresRepo( "iverksatt_tidspunkt" to meldekortBehandling.iverksattTidspunkt, "sendt_til_beslutning" to meldekortBehandling.sendtTilBeslutning, "navkontor_navn" to meldekortBehandling.navkontor.kontornavn, - "type" to meldekortBehandling.type.toString(), + "type" to meldekortBehandling.type.tilDb(), ).asUpdate, ) } diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingTypeDb.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingTypeDb.kt new file mode 100644 index 000000000..a95614c7c --- /dev/null +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/repository/meldekort/MeldekortBehandlingTypeDb.kt @@ -0,0 +1,18 @@ +package no.nav.tiltakspenger.saksbehandling.repository.meldekort + +import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlingType + +private enum class MeldekortBehandlingTypeDb { + FØRSTE_BEHANDLING, + KORRIGERING, +} + +fun String.tilMeldekortBehandlingType(): MeldekortBehandlingType = when (MeldekortBehandlingTypeDb.valueOf(this)) { + MeldekortBehandlingTypeDb.FØRSTE_BEHANDLING -> MeldekortBehandlingType.FØRSTE_BEHANDLING + MeldekortBehandlingTypeDb.KORRIGERING -> MeldekortBehandlingType.KORRIGERING +} + +fun MeldekortBehandlingType.tilDb() = when (this) { + MeldekortBehandlingType.FØRSTE_BEHANDLING -> MeldekortBehandlingTypeDb.FØRSTE_BEHANDLING + MeldekortBehandlingType.KORRIGERING -> MeldekortBehandlingTypeDb.KORRIGERING +}.toString() diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldekortBehandlingDTO.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldekortBehandlingDTO.kt index e26a0ce91..ba6fb8f18 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldekortBehandlingDTO.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldekortBehandlingDTO.kt @@ -15,6 +15,7 @@ data class MeldekortBehandlingDTO( val navkontorNavn: String?, val dager: List, val brukersMeldekortId: String?, + val type: MeldekortBehandlingTypeDTO, ) fun MeldekortBehandlinger.toDTO(): List { @@ -36,5 +37,6 @@ fun MeldekortBehandling.toDTO(): MeldekortBehandlingDTO { navkontorNavn = navkontor.kontornavn, dager = beregning.toDTO(), brukersMeldekortId = brukersMeldekort?.id.toString(), + type = type.tilDTO(), ) } diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldekortBehandlingTypeDTO.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldekortBehandlingTypeDTO.kt new file mode 100644 index 000000000..aebe91184 --- /dev/null +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/dto/MeldekortBehandlingTypeDTO.kt @@ -0,0 +1,13 @@ +package no.nav.tiltakspenger.saksbehandling.routes.meldekort.dto + +import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlingType + +enum class MeldekortBehandlingTypeDTO { + FØRSTE_BEHANDLING, + KORRIGERING, +} + +fun MeldekortBehandlingType.tilDTO(): MeldekortBehandlingTypeDTO = when (this) { + MeldekortBehandlingType.FØRSTE_BEHANDLING -> MeldekortBehandlingTypeDTO.FØRSTE_BEHANDLING + MeldekortBehandlingType.KORRIGERING -> MeldekortBehandlingTypeDTO.KORRIGERING +} From a09b51825e414cf6c2bc2b0f5abbb0451ed0ec6b Mon Sep 17 00:00:00 2001 From: Anders B Nomerstad Date: Tue, 18 Mar 2025 10:47:11 +0100 Subject: [PATCH 06/10] =?UTF-8?q?Henter=20navkontor=20p=C3=A5=20nytt=20ved?= =?UTF-8?q?=20opprett=20korrigering.=20Refactor=20til=20=C3=A5=20alltid=20?= =?UTF-8?q?opprette=20korrigering=20basert=20p=C3=A5=20siste=20meldekortbe?= =?UTF-8?q?handling=20i=20kjeden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../context/MeldekortContext.kt | 1 + .../meldekort/domene/MeldekortBehandling.kt | 15 ++++++---- .../OpprettMeldekortKorrigeringService.kt | 28 ++++++++++--------- .../OpprettMeldekortKorrigeringRoute.kt | 12 ++------ 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/context/MeldekortContext.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/context/MeldekortContext.kt index b8e771833..fd010f5bf 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/context/MeldekortContext.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/context/MeldekortContext.kt @@ -90,6 +90,7 @@ open class MeldekortContext( val opprettMeldekortKorrigeringService by lazy { OpprettMeldekortKorrigeringService( meldekortBehandlingRepo = meldekortBehandlingRepo, + navkontorService = navkontorService, sakService = sakService, sessionFactory = sessionFactory, ) diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt index 3be928f97..0716038c3 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt @@ -364,10 +364,16 @@ fun Sak.opprettMeldekortBehandling( fun Sak.opprettMeldekortKorrigering( saksbehandler: Saksbehandler, - forrigeBehandling: MeldekortBehandling, + kjedeId: MeldeperiodeKjedeId, + navkontor: Navkontor, ): MeldekortBehandling.MeldekortUnderBehandling { - require(this.meldekortBehandlinger.contains(forrigeBehandling)) { - "Forrige behandling ${forrigeBehandling.id} tilhører ikke denne saken" + val forrigeBehandling = hentSisteMeldekortBehandlingForKjede(kjedeId) + + requireNotNull(forrigeBehandling) { + "Må ha en tidligere meldekortbehandling for å opprette korrigering (kjede $kjedeId på sak ${this.id})" + } + require(forrigeBehandling.status == GODKJENT) { + "Siste meldekortbehandling i kjeden må være godkjent for å opprette en korrigering (kjede $kjedeId på sak ${this.id})" } val meldekortId = MeldekortId.random() @@ -379,8 +385,7 @@ fun Sak.opprettMeldekortKorrigering( saksnummer = this.saksnummer, fnr = this.fnr, opprettet = nå(), - // TODO: bør navkontor hentes på nytt? Kan den være endret innenfor samme meldeperiode? - navkontor = forrigeBehandling.navkontor, + navkontor = navkontor, ikkeRettTilTiltakspengerTidspunkt = forrigeBehandling.ikkeRettTilTiltakspengerTidspunkt, // TODO: må kunne sette et annet bruker-meldekort når vi skal støtte korrigering fra bruker brukersMeldekort = forrigeBehandling.brukersMeldekort, diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt index 918565340..6556e6b3e 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt @@ -10,15 +10,17 @@ import no.nav.tiltakspenger.libs.common.MeldeperiodeKjedeId import no.nav.tiltakspenger.libs.common.SakId import no.nav.tiltakspenger.libs.common.Saksbehandler import no.nav.tiltakspenger.libs.persistering.domene.SessionFactory +import no.nav.tiltakspenger.saksbehandling.felles.sikkerlogg import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandling -import no.nav.tiltakspenger.saksbehandling.meldekort.domene.MeldekortBehandlingStatus import no.nav.tiltakspenger.saksbehandling.meldekort.domene.opprettMeldekortKorrigering import no.nav.tiltakspenger.saksbehandling.meldekort.ports.MeldekortBehandlingRepo import no.nav.tiltakspenger.saksbehandling.saksbehandling.service.sak.SakService +import no.nav.tiltakspenger.saksbehandling.utbetaling.service.NavkontorService class OpprettMeldekortKorrigeringService( val sakService: SakService, val meldekortBehandlingRepo: MeldekortBehandlingRepo, + val navkontorService: NavkontorService, val sessionFactory: SessionFactory, ) { private val logger = KotlinLogging.logger {} @@ -34,26 +36,27 @@ class OpprettMeldekortKorrigeringService( return KanIkkeOppretteMeldekortKorrigering.IkkeTilgangTilSak.left() } - val sisteMeldekortBehandling = sak.hentSisteMeldekortBehandlingForKjede(kjedeId) ?: run { - logger.error { "Fant ingen meldekortbehandlinger (kjede $kjedeId på sak $sakId)" } - return KanIkkeOppretteMeldekortKorrigering.IngenBehandlinger.left() - } - - if (sisteMeldekortBehandling.status != MeldekortBehandlingStatus.GODKJENT) { - logger.error { "Siste behandling i kjeden må være godkjent for å opprette en korrigering (kjede $kjedeId på sak $sakId)" } - return KanIkkeOppretteMeldekortKorrigering.SisteBehandlingIkkeGodkjent.left() + val navkontor = Either.catch { + navkontorService.hentOppfolgingsenhet(sak.fnr) + }.getOrElse { + with("Kunne ikke hente navkontor for sak $sakId") { + logger.error { this } + sikkerlogg.error(it) { "$this - fnr ${sak.fnr.verdi}" } + } + return KanIkkeOppretteMeldekortKorrigering.HenteNavkontorFeilet.left() } val meldekortKorrigering = sak.opprettMeldekortKorrigering( saksbehandler = saksbehandler, - forrigeBehandling = sisteMeldekortBehandling, + navkontor = navkontor, + kjedeId = kjedeId, ) sessionFactory.withTransactionContext { tx -> meldekortBehandlingRepo.lagre(meldekortKorrigering, tx) } - logger.info { "Opprettet korrigering av meldekort ${meldekortKorrigering.id} for kjede ${sisteMeldekortBehandling.kjedeId} på sak $sakId" } + logger.info { "Opprettet korrigering av meldekort: ${meldekortKorrigering.id} for kjede $kjedeId på sak $sakId" } return meldekortKorrigering.right() } @@ -61,6 +64,5 @@ class OpprettMeldekortKorrigeringService( sealed interface KanIkkeOppretteMeldekortKorrigering { data object IkkeTilgangTilSak : KanIkkeOppretteMeldekortKorrigering - data object IngenBehandlinger : KanIkkeOppretteMeldekortKorrigering - data object SisteBehandlingIkkeGodkjent : KanIkkeOppretteMeldekortKorrigering + data object HenteNavkontorFeilet : KanIkkeOppretteMeldekortKorrigering } diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt index 0d28c71b6..93249a5c2 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt @@ -7,8 +7,8 @@ import io.ktor.server.routing.post import mu.KotlinLogging import no.nav.tiltakspenger.libs.auth.core.TokenService import no.nav.tiltakspenger.libs.auth.ktor.withSaksbehandler -import no.nav.tiltakspenger.libs.ktor.common.respond400BadRequest import no.nav.tiltakspenger.libs.ktor.common.respond403Forbidden +import no.nav.tiltakspenger.libs.ktor.common.respond500InternalServerError import no.nav.tiltakspenger.saksbehandling.auditlog.AuditLogEvent import no.nav.tiltakspenger.saksbehandling.auditlog.AuditService import no.nav.tiltakspenger.saksbehandling.meldekort.service.KanIkkeOppretteMeldekortKorrigering @@ -46,14 +46,8 @@ fun Route.opprettMeldekortKorrigeringRoute( melding = "Du har ikke tilgang til sak $sakId", kode = "", ) - - is KanIkkeOppretteMeldekortKorrigering.IngenBehandlinger -> call.respond400BadRequest( - melding = "Fant ingen tidligere meldekortbehandling på kjede $kjedeId for sak $sakId", - kode = "", - ) - - is KanIkkeOppretteMeldekortKorrigering.SisteBehandlingIkkeGodkjent -> call.respond400BadRequest( - melding = "Siste meldekortbehandling på kjede $kjedeId for sak $sakId er ikke godkjent", + is KanIkkeOppretteMeldekortKorrigering.HenteNavkontorFeilet -> call.respond500InternalServerError( + melding = "Kunne ikke hente Nav-kontor for brukeren", kode = "", ) } From e646f759f4562bff419c2696cf0e506f613092e4 Mon Sep 17 00:00:00 2001 From: Anders B Nomerstad Date: Tue, 18 Mar 2025 11:54:01 +0100 Subject: [PATCH 07/10] ikkeRettTilTiltakspengerTidspunkt null som initial value for korrigering --- .../saksbehandling/meldekort/domene/MeldekortBehandling.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt index 0716038c3..0264ac5ae 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt @@ -386,7 +386,7 @@ fun Sak.opprettMeldekortKorrigering( fnr = this.fnr, opprettet = nå(), navkontor = navkontor, - ikkeRettTilTiltakspengerTidspunkt = forrigeBehandling.ikkeRettTilTiltakspengerTidspunkt, + ikkeRettTilTiltakspengerTidspunkt = null, // TODO: må kunne sette et annet bruker-meldekort når vi skal støtte korrigering fra bruker brukersMeldekort = forrigeBehandling.brukersMeldekort, meldeperiode = meldeperiode, From 87912aa8006e812c5e4d0e0bbde12e64ea4c56b7 Mon Sep 17 00:00:00 2001 From: Anders B Nomerstad Date: Tue, 18 Mar 2025 12:15:29 +0100 Subject: [PATCH 08/10] Henter brukersmeldekort fra saken. Setter maks dager fra meldeperioden --- .../meldekort/domene/MeldekortBehandling.kt | 9 ++++----- .../routes/meldekort/OpprettMeldekortKorrigeringRoute.kt | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt index 0264ac5ae..90cb1af18 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt @@ -378,6 +378,7 @@ fun Sak.opprettMeldekortKorrigering( val meldekortId = MeldekortId.random() val meldeperiode = hentSisteMeldeperiodeForKjede(forrigeBehandling.kjedeId) + val brukersMeldekort = this.brukersMeldekort.find { it.kjedeId == kjedeId } return MeldekortBehandling.MeldekortUnderBehandling( id = meldekortId, @@ -387,18 +388,16 @@ fun Sak.opprettMeldekortKorrigering( opprettet = nå(), navkontor = navkontor, ikkeRettTilTiltakspengerTidspunkt = null, - // TODO: må kunne sette et annet bruker-meldekort når vi skal støtte korrigering fra bruker - brukersMeldekort = forrigeBehandling.brukersMeldekort, + brukersMeldekort = brukersMeldekort, meldeperiode = meldeperiode, saksbehandler = saksbehandler.navIdent, type = MeldekortBehandlingType.KORRIGERING, - // TODO: forhåndsutfylle denne fra forrige meldekortbehandling? + // TODO: forhåndsutfylle denne fra forrige meldekortbehandling beregning = MeldeperiodeBeregning.IkkeUtfyltMeldeperiode.fraPeriode( meldeperiode = meldeperiode, meldekortId = meldekortId, sakId = this.id, - // TODO: dette er kanskje også en variabel som saksbehandler kan korrigere? (På sikt?) - maksDagerMedTiltakspengerForPeriode = forrigeBehandling.beregning.maksDagerMedTiltakspengerForPeriode, + maksDagerMedTiltakspengerForPeriode = meldeperiode.antallDagerForPeriode, tiltakstypePerioder = this.vedtaksliste.tiltakstypeperioder, ), ) diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt index 93249a5c2..87dd1affa 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt @@ -18,7 +18,7 @@ import no.nav.tiltakspenger.saksbehandling.routes.meldekort.dto.toDTO import no.nav.tiltakspenger.saksbehandling.routes.withMeldeperiodeKjedeId import no.nav.tiltakspenger.saksbehandling.routes.withSakId -private const val PATH = "sak/{sakId}/meldeperiode/{meldeperiodeKjedeId}/opprettKorrigering" +private const val PATH = "sak/{sakId}/meldeperiode/{kjedeId}/opprettKorrigering" fun Route.opprettMeldekortKorrigeringRoute( opprettMeldekortKorrigeringService: OpprettMeldekortKorrigeringService, From f6b261dd9ba9816ba60c0c00f5cf506ba3b28915 Mon Sep 17 00:00:00 2001 From: Anders B Nomerstad Date: Tue, 18 Mar 2025 13:15:43 +0100 Subject: [PATCH 09/10] =?UTF-8?q?H=C3=A5ndterer=20feil=20state=20for=20kor?= =?UTF-8?q?rigering=20p=C3=A5=20meldeperiodekjede?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/OpprettMeldekortKorrigeringService.kt | 15 ++++++++++----- .../meldekort/OpprettMeldekortKorrigeringRoute.kt | 7 +++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt index 6556e6b3e..30688e100 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/service/OpprettMeldekortKorrigeringService.kt @@ -46,11 +46,15 @@ class OpprettMeldekortKorrigeringService( return KanIkkeOppretteMeldekortKorrigering.HenteNavkontorFeilet.left() } - val meldekortKorrigering = sak.opprettMeldekortKorrigering( - saksbehandler = saksbehandler, - navkontor = navkontor, - kjedeId = kjedeId, - ) + val meldekortKorrigering = Either.catch { + sak.opprettMeldekortKorrigering( + saksbehandler = saksbehandler, + navkontor = navkontor, + kjedeId = kjedeId, + ) + }.getOrElse { + return KanIkkeOppretteMeldekortKorrigering.KanIkkeKorrigerePåKjede.left() + } sessionFactory.withTransactionContext { tx -> meldekortBehandlingRepo.lagre(meldekortKorrigering, tx) @@ -65,4 +69,5 @@ class OpprettMeldekortKorrigeringService( sealed interface KanIkkeOppretteMeldekortKorrigering { data object IkkeTilgangTilSak : KanIkkeOppretteMeldekortKorrigering data object HenteNavkontorFeilet : KanIkkeOppretteMeldekortKorrigering + data object KanIkkeKorrigerePåKjede : KanIkkeOppretteMeldekortKorrigering } diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt index 87dd1affa..54bdcef36 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/routes/meldekort/OpprettMeldekortKorrigeringRoute.kt @@ -7,6 +7,7 @@ import io.ktor.server.routing.post import mu.KotlinLogging import no.nav.tiltakspenger.libs.auth.core.TokenService import no.nav.tiltakspenger.libs.auth.ktor.withSaksbehandler +import no.nav.tiltakspenger.libs.ktor.common.respond400BadRequest import no.nav.tiltakspenger.libs.ktor.common.respond403Forbidden import no.nav.tiltakspenger.libs.ktor.common.respond500InternalServerError import no.nav.tiltakspenger.saksbehandling.auditlog.AuditLogEvent @@ -46,10 +47,16 @@ fun Route.opprettMeldekortKorrigeringRoute( melding = "Du har ikke tilgang til sak $sakId", kode = "", ) + is KanIkkeOppretteMeldekortKorrigering.HenteNavkontorFeilet -> call.respond500InternalServerError( melding = "Kunne ikke hente Nav-kontor for brukeren", kode = "", ) + + is KanIkkeOppretteMeldekortKorrigering.KanIkkeKorrigerePåKjede -> call.respond400BadRequest( + melding = "Meldeperiodekjeden er ikke i en tilstand som tillater ny korrigering", + kode = "", + ) } }, { From b9b39e46c6d236874885681deff67ad4b64e635e Mon Sep 17 00:00:00 2001 From: Anders B Nomerstad Date: Tue, 18 Mar 2025 13:39:56 +0100 Subject: [PATCH 10/10] =?UTF-8?q?Ikke=20g=C3=A5=20via=20forrige=20behandli?= =?UTF-8?q?ng=20for=20=C3=A5=20finne=20kjedeid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../saksbehandling/meldekort/domene/MeldekortBehandling.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt index 90cb1af18..72d97ae43 100644 --- a/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt +++ b/app/src/main/kotlin/no/nav/tiltakspenger/saksbehandling/meldekort/domene/MeldekortBehandling.kt @@ -377,7 +377,7 @@ fun Sak.opprettMeldekortKorrigering( } val meldekortId = MeldekortId.random() - val meldeperiode = hentSisteMeldeperiodeForKjede(forrigeBehandling.kjedeId) + val meldeperiode = hentSisteMeldeperiodeForKjede(kjedeId) val brukersMeldekort = this.brukersMeldekort.find { it.kjedeId == kjedeId } return MeldekortBehandling.MeldekortUnderBehandling(