Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Statistikk for revurdering #220

Merged
merged 3 commits into from
Feb 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ sealed class Revurdering : Visitable<RevurderingVisitor> {
val fnr
get() = this.tilRevurdering.fnr

val saksnummer
get() = this.tilRevurdering.saksnummer

open fun beregn(fradrag: List<Fradrag>): Either<KunneIkkeBeregneRevurdering, BeregnetRevurdering> {
val beregningsgrunnlag = Beregningsgrunnlag.create(
beregningsperiode = periode,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ object ServiceBuilder {
microsoftGraphApiClient = clients.microsoftGraphApiClient,
brevService = brevService,
clock = clock,
)
).apply { addObserver(statistikkService) }
val opprettVedtakssnapshotService = OpprettVedtakssnapshotService(databaseRepos.vedtakssnapshot)
val ferdigstillIverksettingService = FerdigstillIverksettingServiceImpl(
søknadsbehandlingRepo = databaseRepos.søknadsbehandling,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import no.nav.su.se.bakover.service.brev.BrevService
import no.nav.su.se.bakover.service.oppgave.OppgaveService
import no.nav.su.se.bakover.service.person.PersonService
import no.nav.su.se.bakover.service.sak.SakService
import no.nav.su.se.bakover.service.statistikk.Event
import no.nav.su.se.bakover.service.statistikk.EventObserver
import no.nav.su.se.bakover.service.utbetaling.KunneIkkeUtbetale
import no.nav.su.se.bakover.service.utbetaling.UtbetalingService
import java.time.Clock
Expand All @@ -44,6 +46,12 @@ internal class RevurderingServiceImpl(
private val brevService: BrevService,
private val clock: Clock,
) : RevurderingService {
private val observers: MutableList<EventObserver> = mutableListOf()
fun addObserver(observer: EventObserver) {
observers.add(observer)
}

fun getObservers(): List<EventObserver> = observers.toList()

override fun opprettRevurdering(
sakId: UUID,
Expand Down Expand Up @@ -97,6 +105,13 @@ internal class RevurderingServiceImpl(
saksbehandler = saksbehandler
)
revurderingRepo.lagre(revurdering)
observers.forEach { observer ->
observer.handle(
Event.Statistikk.RevurderingStatistikk.RevurderingOpprettet(
revurdering
)
)
}
revurdering
}
}
Expand Down Expand Up @@ -188,10 +203,18 @@ internal class RevurderingServiceImpl(
revurdering.tilAttestering(oppgaveId, saksbehandler)
}
null -> return KunneIkkeRevurdere.FantIkkeRevurdering.left()
else -> return KunneIkkeRevurdere.UgyldigTilstand(revurdering::class, RevurderingTilAttestering::class).left()
else -> return KunneIkkeRevurdere.UgyldigTilstand(revurdering::class, RevurderingTilAttestering::class)
.left()
}

revurderingRepo.lagre(tilAttestering)
observers.forEach { observer ->
observer.handle(
Event.Statistikk.RevurderingStatistikk.RevurderingTilAttestering(
tilAttestering
)
)
}

return tilAttestering.right()
}
Expand Down Expand Up @@ -255,6 +278,11 @@ internal class RevurderingServiceImpl(
}.left()
}
revurderingRepo.lagre(iverksattRevurdering)
observers.forEach { observer ->
observer.handle(
Event.Statistikk.RevurderingStatistikk.RevurderingIverksatt(iverksattRevurdering)
)
}
return iverksattRevurdering.right()
}
null -> KunneIkkeIverksetteRevurdering.FantIkkeRevurdering.left()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package no.nav.su.se.bakover.service.statistikk

import no.nav.su.se.bakover.common.Tidspunkt
import no.nav.su.se.bakover.common.startOfDay
import no.nav.su.se.bakover.common.zoneIdOslo
import no.nav.su.se.bakover.domain.beregning.Beregning
import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering
import no.nav.su.se.bakover.domain.revurdering.OpprettetRevurdering
import no.nav.su.se.bakover.domain.revurdering.Revurdering
import no.nav.su.se.bakover.domain.revurdering.RevurderingTilAttestering
import java.time.Clock

internal class RevurderingStatistikkMapper(private val clock: Clock) {
// Behandling er en avgjørelse i en Sak, knyttet til en konkret behandlingstype (eks. søknad, revurdering, endring, klage)."
fun map(revurdering: Revurdering): Statistikk.Behandling {
Statistikk.Behandling(
behandlingType = Statistikk.BehandlingType.REVURDERING,
behandlingTypeBeskrivelse = Statistikk.BehandlingType.REVURDERING.beskrivelse,
funksjonellTid = FunksjonellTidMapper.map(revurdering),
tekniskTid = Tidspunkt.now(clock),
registrertDato = revurdering.opprettet.toLocalDate(zoneIdOslo),
mottattDato = revurdering.opprettet.toLocalDate(zoneIdOslo),
behandlingId = revurdering.id,
sakId = revurdering.sakId,
saksnummer = revurdering.saksnummer.nummer,
behandlingStatus = revurdering::class.simpleName!!,
behandlingStatusBeskrivelse = BehandlingStatusBeskrivelseMapper.map(revurdering),
versjon = clock.millis(),
saksbehandler = revurdering.saksbehandler.navIdent,
relatertBehandlingId = revurdering.tilRevurdering.id
).apply {
return when (revurdering) {
is OpprettetRevurdering -> this
is RevurderingTilAttestering -> this
is IverksattRevurdering -> {
copy(
resultat = "Innvilget",
resultatBegrunnelse = "Endring i søkers inntekt", // TODO ai: Må støtte flere grunner for revurdering senare
beslutter = revurdering.attestant.navIdent
)
}
else -> throw ManglendeStatistikkMappingException(this, revurdering::class.java)
}
}
}

internal object FunksjonellTidMapper {
fun map(revurdering: Revurdering) = when (revurdering) {
is OpprettetRevurdering -> revurdering.opprettet
is RevurderingTilAttestering -> revurdering.beregning.startOfFirstDay()
is IverksattRevurdering -> revurdering.beregning.startOfFirstDay()
else -> throw ManglendeStatistikkMappingException(this, revurdering::class.java)
}

private fun Beregning.startOfFirstDay() = getPeriode().getFraOgMed().startOfDay(zoneIdOslo)
}

internal object BehandlingStatusBeskrivelseMapper {
fun map(revurdering: Revurdering): String =
when (revurdering) {
is OpprettetRevurdering -> "Ny revurdering opprettet"
is RevurderingTilAttestering -> "Revurdering sendt til attestering"
is IverksattRevurdering -> "Revurdering iverksatt"
else -> throw ManglendeStatistikkMappingException(this, revurdering::class.java)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.databind.annotation.JsonSerialize
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer
import no.nav.su.se.bakover.common.Tidspunkt
import no.nav.su.se.bakover.domain.søknadsbehandling.BehandlingsStatus
import java.time.LocalDate
import java.util.UUID

Expand Down Expand Up @@ -39,9 +38,9 @@ sealed class Statistikk {
val sakId: UUID,
@JsonSerialize(using = ToStringSerializer::class)
val saksnummer: Long,
val behandlingType: String = "SOKNAD",
val behandlingTypeBeskrivelse: String? = "Søknad for SU Uføre",
val behandlingStatus: BehandlingsStatus,
val behandlingType: BehandlingType,
val behandlingTypeBeskrivelse: String?,
val behandlingStatus: String,
val behandlingStatusBeskrivelse: String? = null,
val utenlandstilsnitt: String = "NASJONAL",
val utenlandstilsnittBeskrivelse: String? = null,
Expand All @@ -68,4 +67,8 @@ sealed class Statistikk {
) : Statistikk()

data class Aktør(val aktorId: Int, val rolle: String, val rolleBeskrivelse: String)
enum class BehandlingType(val beskrivelse: String) {
SOKNAD("Søknad for SU Uføre"),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SØKNAD går fint =)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hehe vi hade "SOKNAD" innan som String som behandlingstypen, så jag bara behåller det likt 🙈

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fordelen med enum er at du kan skille mellom enumen sitt navn og verdien. typ SØKNAD("SOKNAD"). Da kan man refaktorere den uten at en brekker ting utover.

REVURDERING("Revurdering av søknad for SU Uføre")
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package no.nav.su.se.bakover.service.statistikk

import no.nav.su.se.bakover.domain.Sak
import no.nav.su.se.bakover.domain.revurdering.IverksattRevurdering
import no.nav.su.se.bakover.domain.revurdering.OpprettetRevurdering
import no.nav.su.se.bakover.domain.revurdering.Revurdering
import no.nav.su.se.bakover.domain.revurdering.RevurderingTilAttestering
import no.nav.su.se.bakover.domain.søknadsbehandling.Søknadsbehandling

interface StatistikkService {
Expand Down Expand Up @@ -30,5 +34,18 @@ sealed class Event {
data class SøknadsbehandlingIverksatt(override val søknadsbehandling: Søknadsbehandling.Iverksatt) :
SøknadsbehandlingStatistikk()
}

sealed class RevurderingStatistikk : Statistikk() {
abstract val revurdering: Revurdering

data class RevurderingOpprettet(override val revurdering: OpprettetRevurdering) :
RevurderingStatistikk()

data class RevurderingTilAttestering(override val revurdering: no.nav.su.se.bakover.domain.revurdering.RevurderingTilAttestering) :
RevurderingStatistikk()

data class RevurderingIverksatt(override val revurdering: IverksattRevurdering) :
RevurderingStatistikk()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ internal class StatistikkServiceImpl(
is Event.Statistikk.SøknadsbehandlingStatistikk -> {
publiser(SøknadsbehandlingStatistikkMapper(clock).map(event.søknadsbehandling))
}
is Event.Statistikk.RevurderingStatistikk -> {
publiser(RevurderingStatistikkMapper(clock).map(event.revurdering))
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,16 @@ internal class SøknadsbehandlingStatistikkMapper(
private val clock: Clock
) {
fun map(søknadsbehandling: Søknadsbehandling): Statistikk.Behandling = Statistikk.Behandling(
behandlingType = Statistikk.BehandlingType.SOKNAD,
behandlingTypeBeskrivelse = Statistikk.BehandlingType.SOKNAD.beskrivelse,
funksjonellTid = FunksjonellTidMapper.map(søknadsbehandling),
tekniskTid = Tidspunkt.now(clock),
registrertDato = RegistrertDatoMapper.map(søknadsbehandling),
mottattDato = søknadsbehandling.opprettet.toLocalDate(zoneIdOslo),
behandlingId = søknadsbehandling.id,
sakId = søknadsbehandling.sakId,
saksnummer = søknadsbehandling.saksnummer.nummer,
behandlingStatus = BehandlingStatusOgBehandlingStatusBeskrivelseMapper.map(søknadsbehandling.status).status,
behandlingStatus = BehandlingStatusOgBehandlingStatusBeskrivelseMapper.map(søknadsbehandling.status).status.toString(),
behandlingStatusBeskrivelse = BehandlingStatusOgBehandlingStatusBeskrivelseMapper.map(søknadsbehandling.status).beskrivelse,
versjon = clock.millis()
).apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.nhaarman.mockitokotlin2.mock
import io.kotest.matchers.collections.shouldContain
import no.nav.su.se.bakover.client.Clients
import no.nav.su.se.bakover.database.DatabaseRepos
import no.nav.su.se.bakover.service.revurdering.RevurderingServiceImpl
import no.nav.su.se.bakover.service.sak.SakServiceImpl
import no.nav.su.se.bakover.service.søknadsbehandling.FerdigstillIverksettingServiceImpl
import no.nav.su.se.bakover.service.søknadsbehandling.SøknadsbehandlingServiceImpl
Expand Down Expand Up @@ -49,6 +50,7 @@ internal class ServiceBuilderTest {
).let {
(it.sak as SakServiceImpl).observers shouldContain it.statistikk
(it.søknadsbehandling as SøknadsbehandlingServiceImpl).getObservers() shouldContain it.statistikk
(it.revurdering as RevurderingServiceImpl).getObservers() shouldContain it.statistikk
(it.ferdigstillIverksettingService as FerdigstillIverksettingServiceImpl).getObservers() shouldContain it.statistikk
}
}
Expand Down
Loading