Skip to content

Commit

Permalink
Merge branch 'master' into dev-status-i-sak-med-ag-info
Browse files Browse the repository at this point in the history
# Conflicts:
#	build.gradle.kts
#	src/main/kotlin/no/nav/sifinnsynapi/sak/SakService.kt
  • Loading branch information
ramrock93 committed Feb 16, 2024
2 parents 1cc5a08 + c834f89 commit a41ad53
Show file tree
Hide file tree
Showing 4 changed files with 229 additions and 1 deletion.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ val springCloudVersion = "4.1.1"
val springdocVersion = "2.3.0"
val logstashLogbackEncoderVersion = "7.4"
val tokenSupportVersion = "3.2.0"
val k9FormatVersion = "9.2.11"
val k9FormatVersion = "9.2.12"
val retryVersion = "2.0.5"
val zalandoVersion = "0.27.0"
val postgresqlVersion = "42.7.1"
Expand Down
61 changes: 61 additions & 0 deletions src/main/kotlin/no/nav/sifinnsynapi/sak/SakService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import no.nav.sifinnsynapi.oppslag.BarnOppslagDTO
import no.nav.sifinnsynapi.oppslag.OppslagsService
import no.nav.sifinnsynapi.sak.behandling.BehandlingDAO
import no.nav.sifinnsynapi.sak.behandling.BehandlingService
import no.nav.sifinnsynapi.sak.behandling.SaksbehandlingstidUtleder
import no.nav.sifinnsynapi.soknad.SøknadService
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
Expand Down Expand Up @@ -86,6 +87,66 @@ class SakService(
}
}

private fun List<Behandling>.utledSaksbehandlingsfristFraÅpenBehandling(): LocalDate? {
val åpenBehandling = firstOrNull { it.status != BehandlingStatus.AVSLUTTET }
return åpenBehandling?.let { SaksbehandlingstidUtleder.utled(it) }?.toLocalDate()
}

private fun MutableList<Behandling>.behandlingerMedTilhørendeSøknader(søkersDokmentoversikt: List<DokumentDTO>): List<BehandlingDTO> =
map { behandling ->

val søknaderISak: List<SøknaderISakDTO> = behandling.søknader
.medTilhørendeDokumenter(søkersDokmentoversikt)
.filterNot { (søknad, _) -> søknad.hentOgMapTilK9FormatSøknad() == null } // Filtrer bort søknader som ikke finnes
.map { (søknad, dokumenter) ->
val k9FormatSøknad =
søknad.hentOgMapTilK9FormatSøknad()!! // verifisert at søknad finnes ovenfor

val søknadId = k9FormatSøknad.søknadId.id
val søknadsType = utledSøknadsType(k9FormatSøknad, søknadId)

SøknaderISakDTO(
søknadId = UUID.fromString(søknadId),
søknadstype = søknadsType,
k9FormatSøknad = k9FormatSøknad,
dokumenter = dokumenter
)
}

BehandlingDTO(
status = behandling.status,
opprettetTidspunkt = behandling.opprettetTidspunkt,
avsluttetTidspunkt = behandling.avsluttetTidspunkt,
søknader = søknaderISak,
aksjonspunkter = behandling.aksjonspunkter.somAksjonspunktDTO()
)
}

private fun utledSøknadsType(
k9FormatSøknad: Søknad,
knadId: String,
): Søknadstype = when (val ks = k9FormatSøknad.kildesystem.getOrNull()) {
null -> {
logger.info("Fant ingen kildesystem for søknad med søknadId $søknadId.")
val legacySøknad = kotlin.runCatching { legacyInnsynApiService.hentLegacySøknad(søknadId) }.getOrNull()
if (legacySøknad == null) {
logger.warn("Fant ingen legacy søknad for søknad med søknadId $søknadId og kunne ikke utlede søknadstype. Returnerer ukjent.")
Søknadstype.UKJENT
} else when (legacySøknad.søknadstype) {
LegacySøknadstype.PP_SYKT_BARN -> Søknadstype.SØKNAD
LegacySøknadstype.PP_ETTERSENDELSE -> Søknadstype.ETTERSENDELSE
LegacySøknadstype.PP_LIVETS_SLUTTFASE_ETTERSENDELSE -> Søknadstype.ETTERSENDELSE
LegacySøknadstype.OMS_ETTERSENDELSE -> Søknadstype.ETTERSENDELSE
LegacySøknadstype.PP_SYKT_BARN_ENDRINGSMELDING -> Søknadstype.ENDRINGSMELDING
}
}

Kildesystem.ENDRINGSDIALOG -> Søknadstype.ENDRINGSMELDING
Kildesystem.SØKNADSDIALOG -> Søknadstype.SØKNAD
Kildesystem.PUNSJ -> Søknadstype.SØKNAD // TODO: Blir dette riktig?
Kildesystem.UTLEDET -> Søknadstype.SØKNAD // // TODO: Blir dette riktig?

else -> throw error("Ukjent kildesystem $ks")
private fun List<Behandling>.utledSaksbehandlingsfristFraÅpenBehandling(): LocalDate? {
val åpenBehandling = firstOrNull { it.status != BehandlingStatus.AVSLUTTET }
return åpenBehandling?.utledSaksbehandlingsfrist(null)?.getOrNull()?.toLocalDate()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package no.nav.sifinnsynapi.sak.behandling

import no.nav.k9.innsyn.sak.Behandling
import no.nav.k9.konstant.Konstant
import no.nav.k9.søknad.felles.Kildesystem
import org.slf4j.LoggerFactory
import java.time.Period
import java.time.ZonedDateTime

object SaksbehandlingstidUtleder {
private val log = LoggerFactory.getLogger(SaksbehandlingstidUtleder::class.java)

fun utled(behandling: Behandling, overstyrSaksbehandlingstid: Period? = null): ZonedDateTime? {
if (behandling.avsluttetTidspunkt != null) {
log.info("beregner ikke frist for avsluttet behandling")
return null
}

val kildesystemer = behandling.søknader.map { it.kildesystem }
if (kildesystemer.isEmpty() || !kildesystemer.all { it === Kildesystem.SØKNADSDIALOG || it === Kildesystem.ENDRINGSDIALOG }) {
log.info("beregner ikke frist for behandlinger som har dokumenter med kildesystemer={}",kildesystemer)
return null
}

val tidligsteMottattDato = behandling.søknader.minByOrNull { it.mottattTidspunkt }?.mottattTidspunkt

val saksbehandlingstid = overstyrSaksbehandlingstid ?:
if (behandling.erUtenlands) {
log.info("Beregner frist for utland")
Konstant.UTLAND_FORVENTET_SAKSBEHANDLINGSTID
} else {
log.info("Beregner frist for vanlig sak")
Konstant.FORVENTET_SAKSBEHANDLINGSTID
}

return tidligsteMottattDato?.plus(saksbehandlingstid)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package no.nav.sifinnsynapi.sak.behandling

import no.nav.k9.innsyn.sak.*
import no.nav.k9.kodeverk.behandling.FagsakYtelseType
import no.nav.k9.sak.typer.AktørId
import no.nav.k9.sak.typer.Saksnummer
import no.nav.k9.søknad.felles.Kildesystem
import org.junit.Test
import org.springframework.cloud.contract.verifier.assertion.SpringCloudContractAssertions.assertThat
import java.time.LocalDate
import java.time.Period
import java.time.ZoneId
import java.time.ZonedDateTime
import java.util.*
import java.util.stream.Collectors

class SaksbehandlingstidUtlederTest {


@Test
fun `skal regne ut saksbehandlingsfrist`() {
val tidligsteMottattTidspunkt = LocalDate.of(2024, 1, 5).atStartOfDay(ZoneId.systemDefault())
val behandling = lagBehandling(
false,
tidligsteMottattTidspunkt.plusDays(10),
tidligsteMottattTidspunkt,
tidligsteMottattTidspunkt.plusMonths(20)
)
val saksbehandlingsfrist = SaksbehandlingstidUtleder.utled(behandling,(null))

assertThat(saksbehandlingsfrist).isEqualTo(tidligsteMottattTidspunkt.plusWeeks(6))
}

@Test
fun `skal overstyre og regne ut saksbehandlingsfrist`() {
val tidligsteMottattTidspunkt = LocalDate.of(2024, 1, 5).atStartOfDay(ZoneId.systemDefault())
val behandling = lagBehandling(false, tidligsteMottattTidspunkt.plusDays(10), tidligsteMottattTidspunkt, tidligsteMottattTidspunkt.plusMonths(20))
val saksbehandlingsfrist = SaksbehandlingstidUtleder.utled(behandling, Period.ofDays(5))
assertThat(saksbehandlingsfrist).isEqualTo(tidligsteMottattTidspunkt.plusDays(5))
}

@Test
fun `skal regne ut saksbehandlingsfrist utland`() {
val tidligsteMottattTidspunkt = LocalDate.of(2024, 1, 5).atStartOfDay(ZoneId.systemDefault())
val behandling = lagBehandling(true, tidligsteMottattTidspunkt.plusDays(10), tidligsteMottattTidspunkt, tidligsteMottattTidspunkt.plusMonths(20))
val saksbehandlingsfrist = SaksbehandlingstidUtleder.utled(behandling)
assertThat(saksbehandlingsfrist).isEqualTo(tidligsteMottattTidspunkt.plusMonths(6))
}

@Test
fun `skal ikke regne ut saksbehandlingsfrist hvis inneholder punsj`() {
val tidligsteMottattTidspunkt = LocalDate.of(2024, 1, 5).atStartOfDay(ZoneId.systemDefault())
val behandling = lagBehandling(false, setOf(
lagSøknad(tidligsteMottattTidspunkt.plusDays(10), Kildesystem.SØKNADSDIALOG),
lagSøknad(tidligsteMottattTidspunkt, Kildesystem.SØKNADSDIALOG),
lagSøknad(tidligsteMottattTidspunkt.plusMonths(20), Kildesystem.PUNSJ)
))
val saksbehandlingsfrist = SaksbehandlingstidUtleder.utled(behandling)
assertThat(saksbehandlingsfrist).isNull()
}

@Test
fun `skal ikke regne ut saksbehandlingsfrist hvis mangler kildesystem`() {
val tidligsteMottattTidspunkt = LocalDate.of(2024, 1, 5).atStartOfDay(ZoneId.systemDefault())
val behandling = lagBehandling(false, setOf(
lagSøknad(tidligsteMottattTidspunkt.plusDays(10), Kildesystem.SØKNADSDIALOG),
lagSøknad(tidligsteMottattTidspunkt, Kildesystem.SØKNADSDIALOG),
lagSøknad(tidligsteMottattTidspunkt.plusMonths(20))
))
val saksbehandlingsfrist = SaksbehandlingstidUtleder.utled(behandling)
assertThat(saksbehandlingsfrist).isNull()
}

@Test
fun `skal ikke regne ut saksbehandlingsfrist hvis ingen søknad`() {
val behandling = lagBehandling(false, emptySet())
val saksbehandlingsfrist = SaksbehandlingstidUtleder.utled(behandling)
assertThat(saksbehandlingsfrist).isNull()
}

private fun lagBehandling(erUtenlands: Boolean, vararg søknadtidspunkter: ZonedDateTime): Behandling {
val collect = Arrays.stream(søknadtidspunkter)
.map { it: ZonedDateTime ->
lagSøknad(
it,
Kildesystem.SØKNADSDIALOG
)
}
.collect(Collectors.toSet())
return lagBehandling(erUtenlands, collect)
}

private fun lagSøknad(it: ZonedDateTime, kilde: Kildesystem? = null): SøknadInfo {
return SøknadInfo(SøknadStatus.MOTTATT, UUID.randomUUID().toString(), it, kilde)
}

private fun lagBehandling(erUtenlands: Boolean, søknader: Set<SøknadInfo>): Behandling {
val aksjonspunkter = java.util.Set.of(
Aksjonspunkt(Aksjonspunkt.Venteårsak.MEDISINSK_DOKUMENTASJON, ZonedDateTime.now())
)

val saksnummer = "ABC123"
val søkerAktørId = "11111111111"
val pleietrengendeAktørId = "22222222222"

val saksinnhold = Fagsak(
Saksnummer(saksnummer),
AktørId(søkerAktørId),
AktørId(pleietrengendeAktørId),
FagsakYtelseType.PLEIEPENGER_SYKT_BARN
)

val behandling = Behandling(
UUID.randomUUID(),
ZonedDateTime.now(),
null,
BehandlingResultat.INNVILGET,
BehandlingStatus.OPPRETTET,
søknader,
aksjonspunkter,
erUtenlands,
saksinnhold

)

return behandling
}

}

0 comments on commit a41ad53

Please sign in to comment.