Skip to content

Commit

Permalink
Merge pull request #1372 from navikt/resend-statistikk-iverksett-søkn…
Browse files Browse the repository at this point in the history
…adsbehandling

Legg til endepunkt for å resende søknadsbehandlingsvedtak
  • Loading branch information
hestad authored May 9, 2023
2 parents 020ff05 + 05a45b8 commit abd3e3e
Show file tree
Hide file tree
Showing 20 changed files with 253 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,18 @@ internal class SakPostgresRepo(
}
}
}
override fun hentSakForVedtak(vedtakId: UUID): Sak? {
return dbMetrics.timeQuery("hentSakForVedtak") {
sessionFactory.withSessionContext { sessionContext ->
sessionContext.withSession { session ->
"select s.* from sak s join vedtak v on v.sakid = s.id where v.id =:vedtakId".hent(
mapOf("vedtakId" to vedtakId),
session,
) { it.toSak(sessionContext) }
}
}
}
}

/***
* @param personidenter Inneholder alle identer til brukeren, f.eks fnr og aktørid.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import no.nav.su.se.bakover.domain.vedtak.VedtakSomKanRevurderes
import no.nav.su.se.bakover.domain.vedtak.VedtakStansAvYtelse
import no.nav.su.se.bakover.domain.vedtak.Vedtaksammendrag
import no.nav.su.se.bakover.domain.vedtak.Vedtakstype
import java.time.LocalDate
import java.util.UUID

internal enum class VedtakType {
Expand Down Expand Up @@ -310,6 +311,27 @@ internal class VedtakPostgresRepo(
}
}

override fun hentSøknadsbehandlingsvedtakFraOgMed(
fraOgMed: LocalDate,
): List<UUID> {
return sessionFactory.withSession { session ->
"""
select
v.id
from
vedtak v
where
v.vedtaktype IN ('SØKNAD','AVSLAG')
and v.opprettet >= :fraOgMed::date
order by
v.opprettet
""".trimIndent()
.hentListe(mapOf("fraOgMed" to fraOgMed.toString()), session) {
it.uuid("id")
}
}
}

private fun Row.toVedtak(session: Session): Vedtak {
val id = uuid("id")
val opprettet = tidspunkt("opprettet")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package no.nav.su.se.bakover.database.vedtak

import io.kotest.matchers.shouldBe
import no.nav.su.se.bakover.common.desember
import no.nav.su.se.bakover.common.februar
import no.nav.su.se.bakover.common.januar
import no.nav.su.se.bakover.common.mars
import no.nav.su.se.bakover.common.periode.Periode
import no.nav.su.se.bakover.common.periode.februar
import no.nav.su.se.bakover.common.periode.januar
import no.nav.su.se.bakover.common.persistence.hent
import no.nav.su.se.bakover.domain.søknadsbehandling.stønadsperiode.Stønadsperiode
import no.nav.su.se.bakover.domain.vedtak.VedtakIverksattSøknadsbehandling
import no.nav.su.se.bakover.domain.vedtak.Vedtaksammendrag
import no.nav.su.se.bakover.domain.vedtak.Vedtakstype
import no.nav.su.se.bakover.test.fixedClock
Expand All @@ -17,6 +20,7 @@ import no.nav.su.se.bakover.test.persistence.TestDataHelper
import no.nav.su.se.bakover.test.persistence.withMigratedDb
import no.nav.su.se.bakover.test.persistence.withSession
import no.nav.su.se.bakover.test.plus
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
import java.time.temporal.ChronoUnit

Expand Down Expand Up @@ -173,4 +177,65 @@ internal class VedtakPostgresRepoTest {
}
}
}

@Nested
inner class hentSøknadsbehandlingsvedtakFraOgMed {

@Test
fun `fraOgMed før`() {
withMigratedDb { dataSource ->
val testDataHelper = TestDataHelper(dataSource)
val vedtak = testDataHelper.persisterSøknadsbehandlingIverksatt()
val vedtakRepo = testDataHelper.vedtakRepo as VedtakPostgresRepo
testDataHelper.dataSource.withSession {
vedtakRepo.hentSøknadsbehandlingsvedtakFraOgMed(31.desember(2020)) shouldBe listOf(vedtak.third.id)
}
}
}

@Test
fun `fraOgMed på`() {
withMigratedDb { dataSource ->
val testDataHelper = TestDataHelper(dataSource)
val vedtak = testDataHelper.persisterSøknadsbehandlingIverksatt()
val vedtakRepo = testDataHelper.vedtakRepo as VedtakPostgresRepo
testDataHelper.dataSource.withSession {
vedtakRepo.hentSøknadsbehandlingsvedtakFraOgMed(1.januar(2021)) shouldBe listOf(vedtak.third.id)
}
}
}

@Test
fun `fraOgMed etter`() {
withMigratedDb { dataSource ->
val testDataHelper = TestDataHelper(dataSource)
testDataHelper.persisterSøknadsbehandlingIverksatt()
val vedtakRepo = testDataHelper.vedtakRepo as VedtakPostgresRepo
testDataHelper.dataSource.withSession {
vedtakRepo.hentSøknadsbehandlingsvedtakFraOgMed(2.januar(2021)) shouldBe emptyList()
}
}
}

@Test
fun `ignorerer vedtak som ikke er søknadsbehandling`() {
withMigratedDb { dataSource ->
val testDataHelper = TestDataHelper(dataSource)
val første = testDataHelper.persisterRevurderingIverksattInnvilget().let {
it.first.vedtakListe.first() as VedtakIverksattSøknadsbehandling
}
val andre = testDataHelper.persisterIverksattStansOgVedtak().let {
it.first.vedtakListe.first() as VedtakIverksattSøknadsbehandling
}

val vedtakRepo = testDataHelper.vedtakRepo as VedtakPostgresRepo
testDataHelper.dataSource.withSession {
vedtakRepo.hentSøknadsbehandlingsvedtakFraOgMed(1.januar(2021)) shouldBe listOf(
første.id,
andre.id,
)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ data class Sak(
*
* ##NB
* */
fun hentGjeldendeBeregningForEndringIYtelsePåDato(
fun hentGjeldendeBeregningForEndringIYtelseForMåned(
ned: Måned,
clock: Clock,
): Beregning? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ interface SakRepo {

fun hentSakforSøknadsbehandling(søknadsbehandlingId: UUID): Sak
fun hentSakForSøknad(søknadId: UUID): Sak?
fun hentSakForVedtak(vedtakId: UUID): Sak?
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import java.time.Clock
* [GjeldendeVedtaksdata] tar ikke hensyn til avslagsvedtak per tidspunkt, siden de ikke påvirker selve ytelsen.
* Så hvis vi på et tidspunkt skal kunne revurdere/omgjøre disse vedtakene, så kan man ikke blindt arve [VedtakSomKanRevurderes].
*/
sealed interface Avslagsvedtak : Stønadsvedtak, Visitable<VedtakVisitor>, ErAvslag {
sealed interface Avslagsvedtak : VedtakIverksattSøknadsbehandling, Visitable<VedtakVisitor>, ErAvslag {
override val periode: Periode
override val behandling: IverksattSøknadsbehandling.Avslag

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ data class VedtakInnvilgetSøknadsbehandling private constructor(
override val simulering: Simulering,
override val utbetalingId: UUID30,
override val dokumenttilstand: Dokumenttilstand,
) : VedtakEndringIYtelse {
) : VedtakEndringIYtelse, VedtakIverksattSøknadsbehandling {

init {
behandling.grunnlagsdataOgVilkårsvurderinger.krevAlleVilkårInnvilget()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package no.nav.su.se.bakover.domain.vedtak

import no.nav.su.se.bakover.domain.søknadsbehandling.IverksattSøknadsbehandling

/**
* Grupperer avslag og innvilgelser.
*/
sealed interface VedtakIverksattSøknadsbehandling : Stønadsvedtak {
override val behandling: IverksattSøknadsbehandling
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import no.nav.su.se.bakover.common.UUID30
import no.nav.su.se.bakover.common.application.journal.JournalpostId
import no.nav.su.se.bakover.common.periode.Måned
import no.nav.su.se.bakover.common.persistence.TransactionContext
import java.time.LocalDate
import java.util.UUID

interface VedtakRepo {
Expand All @@ -16,4 +17,7 @@ interface VedtakRepo {
fun lagreITransaksjon(vedtak: Vedtak, tx: TransactionContext)
fun hentForUtbetaling(utbetalingId: UUID30): VedtakSomKanRevurderes?
fun hentJournalpostId(vedtakId: UUID): JournalpostId?
fun hentSøknadsbehandlingsvedtakFraOgMed(
fraOgMed: LocalDate,
): List<UUID>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package no.nav.su.se.bakover.service.statistikk

import java.time.LocalDate

interface ResendStatistikkhendelserService {

fun resendIverksattSøknadsbehandling(fraOgMedDato: LocalDate)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package no.nav.su.se.bakover.service.statistikk

import arrow.core.Either
import arrow.core.getOrElse
import no.nav.su.se.bakover.domain.sak.SakRepo
import no.nav.su.se.bakover.domain.statistikk.StatistikkEvent
import no.nav.su.se.bakover.domain.statistikk.StatistikkEventObserver
import no.nav.su.se.bakover.domain.vedtak.Avslagsvedtak
import no.nav.su.se.bakover.domain.vedtak.VedtakInnvilgetSøknadsbehandling
import no.nav.su.se.bakover.domain.vedtak.VedtakIverksattSøknadsbehandling
import no.nav.su.se.bakover.domain.vedtak.VedtakRepo
import org.slf4j.LoggerFactory
import java.time.LocalDate

/**
* Har som ansvar og resende hendelser som ikke har blitt sendt til statistikk.
*/
class ResendStatistikkhendelserServiceImpl(
private val vedtakRepo: VedtakRepo,
private val sakRepo: SakRepo,
private val statistikkEventObserver: StatistikkEventObserver,
) : ResendStatistikkhendelserService {

private val log = LoggerFactory.getLogger(this::class.java)

override fun resendIverksattSøknadsbehandling(
fraOgMedDato: LocalDate,
) {
log.info("Resend statistikk: Starter resend av statistikk for søknadsbehandlingvedtak fra og med $fraOgMedDato.")
vedtakRepo.hentSøknadsbehandlingsvedtakFraOgMed(fraOgMedDato).also {
log.info("Resend statistikk: Fant ${it.size} søknadsbehandlingvedtak fra og med $fraOgMedDato som skal resendes.")
}.forEachIndexed { index, vedtakId ->

log.info("Resend statistikk: for søknadsbehandlingvedtak $vedtakId")
sakRepo.hentSakForVedtak(vedtakId).let { sak ->
val vedtak = Either.catch {
sak!!.vedtakListe.single { it.id == vedtakId } as VedtakIverksattSøknadsbehandling
}.getOrElse {
log.error(
"Resend statistikk: Fant ikke sak for vedtak ($vedtakId) eller var ikke av type VedtakIverksattSøknadsbehandling. FraOgMedDato: $fraOgMedDato",
it,
)
if (index == 0) {
log.error("Resend statistikk: Siden vi feilet på første element, avbryter vi. FraOgMedDato: $fraOgMedDato, vedtakId:$vedtakId")
return
}
return@forEachIndexed
}
when (vedtak) {
is VedtakInnvilgetSøknadsbehandling -> {
statistikkEventObserver.handle(StatistikkEvent.Behandling.Søknad.Iverksatt.Innvilget(vedtak))
statistikkEventObserver.handle(StatistikkEvent.Stønadsvedtak(vedtak) { sak!! })
log.info("Resend statistikk: Sendte statistikk for VedtakInnvilgetSøknadsbehandling $vedtakId. FraOgMedDato: $fraOgMedDato.")
}

is Avslagsvedtak -> {
statistikkEventObserver.handle(StatistikkEvent.Behandling.Søknad.Iverksatt.Avslag(vedtak))
log.info("Resend statistikk: Sendte statistikk for Avslagsvedtak $vedtakId. FraOgMedDato: $fraOgMedDato")
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ private fun mapBeregning(
val beregningForMåned = vedtak.periode.måneder()
.toList()
.flatMap {
val beregning = hentSak().hentGjeldendeBeregningForEndringIYtelsePåDato(it, clock)!!
val beregning = hentSak().hentGjeldendeBeregningForEndringIYtelseForMåned(it, clock)!!
mapBeregning(vedtak, beregning)
}
val gjeldendeBeregningForMåned = beregningForMåned.associateBy { it.måned }
Expand Down
5 changes: 4 additions & 1 deletion web/src/main/kotlin/no/nav/su/se/bakover/web/Routes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,10 @@ internal fun Application.setupKtorRoutes(
applicationConfig,
)
avstemmingRoutes(accessProtectedServices.avstemming, clock)
driftRoutes(accessProtectedServices.søknad)
driftRoutes(
søknadService = accessProtectedServices.søknad,
resendStatistikkhendelserService = accessProtectedServices.resendStatistikkhendelserService,
)
revurderingRoutes(
revurderingService = accessProtectedServices.revurdering,
sakService = accessProtectedServices.sak,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import no.nav.su.se.bakover.common.Brukerrolle
import no.nav.su.se.bakover.common.infrastructure.web.Resultat
import no.nav.su.se.bakover.common.infrastructure.web.svar
import no.nav.su.se.bakover.common.serialize
import no.nav.su.se.bakover.service.statistikk.ResendStatistikkhendelserService
import no.nav.su.se.bakover.service.søknad.SøknadService
import no.nav.su.se.bakover.web.features.authorize
import no.nav.su.se.bakover.web.routes.drift.FixSøknaderResponseJson.Companion.toJson
Expand All @@ -17,6 +18,7 @@ internal const val DRIFT_PATH = "/drift"

internal fun Route.driftRoutes(
knadService: SøknadService,
resendStatistikkhendelserService: ResendStatistikkhendelserService,
) {
patch("$DRIFT_PATH/søknader/fix") {
authorize(Brukerrolle.Drift) {
Expand All @@ -31,4 +33,6 @@ internal fun Route.driftRoutes(
call.svar(Resultat.json(HttpStatusCode.OK, """{ "Status" : "OK"}"""))
}
}

resendStatistikkRoute(resendStatistikkhendelserService)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package no.nav.su.se.bakover.web.routes.drift

import io.ktor.http.HttpStatusCode
import io.ktor.server.application.call
import io.ktor.server.routing.Route
import io.ktor.server.routing.post
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import no.nav.su.se.bakover.common.Brukerrolle
import no.nav.su.se.bakover.common.infrastructure.web.Resultat
import no.nav.su.se.bakover.common.infrastructure.web.svar
import no.nav.su.se.bakover.common.infrastructure.web.withBody
import no.nav.su.se.bakover.service.statistikk.ResendStatistikkhendelserService
import no.nav.su.se.bakover.web.features.authorize
import java.time.LocalDate

internal fun Route.resendStatistikkRoute(
resendStatistikkhendelserService: ResendStatistikkhendelserService,
) {
data class Body(
val fraOgMed: String,
)

post("/drift/resend-statistikk/vedtak/søknadsbehandling") {
authorize(Brukerrolle.Drift) {
call.withBody<Body> { body ->
CoroutineScope(Dispatchers.IO).launch {
resendStatistikkhendelserService.resendIverksattSøknadsbehandling(LocalDate.parse(body.fraOgMed))
}

call.svar(Resultat.json(HttpStatusCode.Accepted, """{"status": "Accepted"}"""))
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ import no.nav.su.se.bakover.service.nøkkeltall.NøkkeltallService
import no.nav.su.se.bakover.service.skatt.HentSamletSkattegrunnlagForBehandlingResponse
import no.nav.su.se.bakover.service.skatt.KunneIkkeHenteSkattemelding
import no.nav.su.se.bakover.service.skatt.SkatteService
import no.nav.su.se.bakover.service.statistikk.ResendStatistikkhendelserService
import no.nav.su.se.bakover.service.søknad.AvslåSøknadManglendeDokumentasjonService
import no.nav.su.se.bakover.service.søknad.FantIkkeSøknad
import no.nav.su.se.bakover.service.søknad.KunneIkkeLageSøknadPdf
Expand Down Expand Up @@ -1139,6 +1140,12 @@ open class AccessCheckProxy(
override val utløptFristForKontrollsamtaleService: UtløptFristForKontrollsamtaleService
get() = kastKanKunKallesFraAnnenService()
},
resendStatistikkhendelserService = object : ResendStatistikkhendelserService {
override fun resendIverksattSøknadsbehandling(fraOgMedDato: LocalDate) {
// Driftsendepunkt, ingen direkteoppslag på person og ingen returdata
services.resendStatistikkhendelserService.resendIverksattSøknadsbehandling(fraOgMedDato)
}
},
)
}

Expand Down
Loading

0 comments on commit abd3e3e

Please sign in to comment.