Skip to content

Commit

Permalink
NAV-24196: Tillatter å sette Vikafossen hvis det er eneste tilgang sa…
Browse files Browse the repository at this point in the history
…ksbehandler har
  • Loading branch information
thoalm committed Feb 11, 2025
1 parent 38a27b5 commit d688532
Show file tree
Hide file tree
Showing 5 changed files with 396 additions and 25 deletions.
12 changes: 12 additions & 0 deletions src/main/kotlin/no/nav/familie/ba/sak/common/CollectionUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,15 @@ inline fun <T> Collection<T>.zeroSingleOrThrow(exception: Collection<T>.() -> Ex
} else {
throw exception()
}

fun <T> Collection<T>.containsExactly(vararg elements: T): Boolean {
if (this.size != elements.size) {
return false
}
this.forEachIndexed { index, element ->
if (element != elements[index]) {
return false
}
}
return true
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ enum class FeatureToggle(
// NAV-23733
BRUK_OVERSTYRING_AV_FOM_SISTE_ANDEL_UTVIDET("familie-ba-sak.bruk-overstyring-av-fom-siste-andel-utvidet"),

// NAV-24196
TILLATT_OPPRETT_AV_BEHANDLING_PAA_VIKAFOSSEN("familie-ba-sak.tillatt_opprett_av_behandling_paa_vikafossen"),

// satsendring
// Oppretter satsendring-tasker for de som ikke har fått ny task
SATSENDRING_ENABLET("familie-ba-sak.satsendring-enablet"),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package no.nav.familie.ba.sak.kjerne.arbeidsfordeling

import no.nav.familie.ba.sak.common.Feil
import no.nav.familie.ba.sak.common.containsExactly
import no.nav.familie.ba.sak.config.FeatureToggle
import no.nav.familie.ba.sak.config.featureToggle.UnleashNextMedContextService
import no.nav.familie.ba.sak.integrasjoner.familieintegrasjoner.IntegrasjonClient
import no.nav.familie.ba.sak.integrasjoner.familieintegrasjoner.domene.Arbeidsfordelingsenhet
import no.nav.familie.ba.sak.sikkerhet.SikkerhetContext.SYSTEM_FORKORTELSE
Expand All @@ -10,16 +13,30 @@ import org.springframework.stereotype.Service
@Service
class TilpassArbeidsfordelingService(
private val integrasjonClient: IntegrasjonClient,
private val unleashService: UnleashNextMedContextService,
) {
fun tilpassArbeidsfordelingsenhetTilSaksbehandler(
arbeidsfordelingsenhet: Arbeidsfordelingsenhet,
navIdent: NavIdent?,
): Arbeidsfordelingsenhet =
when (arbeidsfordelingsenhet.enhetId) {
BarnetrygdEnhet.MIDLERTIDIG_ENHET.enhetsnummer -> håndterMidlertidigEnhet4863(navIdent)
): Arbeidsfordelingsenhet {
val toggled = unleashService.isEnabled(FeatureToggle.TILLATT_OPPRETT_AV_BEHANDLING_PAA_VIKAFOSSEN)
return when (arbeidsfordelingsenhet.enhetId) {
BarnetrygdEnhet.MIDLERTIDIG_ENHET.enhetsnummer ->
if (toggled) {
håndterMidlertidigEnhet4863(navIdent)
} else {
håndterMidlertidigEnhet4863Gammel(navIdent)
}

BarnetrygdEnhet.VIKAFOSSEN.enhetsnummer -> håndterVikafossenEnhet2103(navIdent)
else -> håndterAndreEnheter(navIdent, arbeidsfordelingsenhet)
else ->
if (toggled) {
håndterAndreEnheter(navIdent, arbeidsfordelingsenhet)
} else {
håndterAndreEnheterGammel(navIdent, arbeidsfordelingsenhet)
}
}
}

fun bestemTilordnetRessursPåOppgave(
arbeidsfordelingsenhet: Arbeidsfordelingsenhet,
Expand All @@ -45,7 +62,7 @@ class TilpassArbeidsfordelingService(
.any { it.enhetsnummer == enhetId }
} ?: false

private fun håndterMidlertidigEnhet4863(
private fun håndterMidlertidigEnhet4863Gammel(
navIdent: NavIdent?,
): Arbeidsfordelingsenhet {
if (navIdent == null) {
Expand All @@ -69,6 +86,36 @@ class TilpassArbeidsfordelingService(
)
}

private fun håndterMidlertidigEnhet4863(
navIdent: NavIdent?,
): Arbeidsfordelingsenhet {
if (navIdent == null) {
throw Feil("Kan ikke håndtere ${BarnetrygdEnhet.MIDLERTIDIG_ENHET} om man mangler NAV-ident")
}
if (navIdent.erSystemIdent()) {
throw MidlertidigEnhetIAutomatiskBehandlingFeil("Kan ikke håndtere ${BarnetrygdEnhet.MIDLERTIDIG_ENHET} i automatiske behandlinger")
}
val enheterNavIdentHarTilgangTil = integrasjonClient.hentBehandlendeEnheterSomNavIdentHarTilgangTil(navIdent = navIdent)
if (enheterNavIdentHarTilgangTil.isEmpty()) {
throw Feil("NAV-ident $navIdent har ikke tilgang til noen enheter")
}
val navIdentHarKunTilgangTilVikafossen = enheterNavIdentHarTilgangTil.map { it.enhetsnummer }.containsExactly(BarnetrygdEnhet.VIKAFOSSEN.enhetsnummer)
if (navIdentHarKunTilgangTilVikafossen) {
// Skal kun være lovt til å sette Vikafossen når det er eneste valgmulighet
return Arbeidsfordelingsenhet(
BarnetrygdEnhet.VIKAFOSSEN.enhetsnummer,
BarnetrygdEnhet.VIKAFOSSEN.enhetsnavn,
)
}
val enheterNavIdentHarTilgangTilForutenVikafossen = enheterNavIdentHarTilgangTil.filter { it.enhetsnummer != BarnetrygdEnhet.VIKAFOSSEN.enhetsnummer }
// Velger bare det første enhetsnummeret i tilfeller hvor man har flere, avklart med fag
val nyBehandlendeEnhet = enheterNavIdentHarTilgangTilForutenVikafossen.first()
return Arbeidsfordelingsenhet(
nyBehandlendeEnhet.enhetsnummer,
nyBehandlendeEnhet.enhetsnavn,
)
}

private fun håndterVikafossenEnhet2103(
navIdent: NavIdent?,
): Arbeidsfordelingsenhet {
Expand All @@ -81,7 +128,7 @@ class TilpassArbeidsfordelingService(
)
}

private fun håndterAndreEnheter(
private fun håndterAndreEnheterGammel(
navIdent: NavIdent?,
arbeidsfordelingsenhet: Arbeidsfordelingsenhet,
): Arbeidsfordelingsenhet {
Expand Down Expand Up @@ -117,5 +164,44 @@ class TilpassArbeidsfordelingService(
)
}

private fun håndterAndreEnheter(
navIdent: NavIdent?,
arbeidsfordelingsenhet: Arbeidsfordelingsenhet,
): Arbeidsfordelingsenhet {
if (navIdent == null || navIdent.erSystemIdent()) {
// navIdent er null ved automatisk journalføring
return Arbeidsfordelingsenhet(
arbeidsfordelingsenhet.enhetId,
arbeidsfordelingsenhet.enhetNavn,
)
}
val enheterNavIdentHarTilgangTil = integrasjonClient.hentBehandlendeEnheterSomNavIdentHarTilgangTil(navIdent = navIdent)
if (enheterNavIdentHarTilgangTil.isEmpty()) {
throw Feil("NAV-ident $navIdent har ikke tilgang til noen enheter")
}
val navIdentHarKunTilgangTilVikafossen = enheterNavIdentHarTilgangTil.map { it.enhetsnummer }.containsExactly(BarnetrygdEnhet.VIKAFOSSEN.enhetsnummer)
if (navIdentHarKunTilgangTilVikafossen) {
// Skal kun være lovt til å sette Vikafossen når det er eneste valgmulighet
return Arbeidsfordelingsenhet(
BarnetrygdEnhet.VIKAFOSSEN.enhetsnummer,
BarnetrygdEnhet.VIKAFOSSEN.enhetsnavn,
)
}
val enheterNavIdentHarTilgangTilForutenVikafossen = enheterNavIdentHarTilgangTil.filter { it.enhetsnummer != BarnetrygdEnhet.VIKAFOSSEN.enhetsnummer }
val harTilgangTilBehandledeEnhet = enheterNavIdentHarTilgangTilForutenVikafossen.any { it.enhetsnummer == arbeidsfordelingsenhet.enhetId }
if (!harTilgangTilBehandledeEnhet) {
// Velger bare det første enhetsnummeret i tilfeller hvor man har flere, avklart med fag
val nyBehandlendeEnhet = enheterNavIdentHarTilgangTilForutenVikafossen.first()
return Arbeidsfordelingsenhet(
nyBehandlendeEnhet.enhetsnummer,
nyBehandlendeEnhet.enhetsnavn,
)
}
return Arbeidsfordelingsenhet(
arbeidsfordelingsenhet.enhetId,
arbeidsfordelingsenhet.enhetNavn,
)
}

private fun NavIdent.erSystemIdent(): Boolean = this.ident == SYSTEM_FORKORTELSE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
package no.nav.familie.ba.sak.common

import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test

class CollectionUtilsKtTest {
@Nested
inner class ContainsExactlyTest {
@Test
fun `skal returnere false om en tom liste ikke inneholder det ene ønskede elemente`() {
// Arrange
val collection = emptyList<String>()

// Act
val containsOnly = collection.containsExactly("A")

// Assert
assertThat(containsOnly).isFalse()
}

@Test
fun `skal returnere true om en liste kun inneholder det ene ønskede elemente`() {
// Arrange
val collection = listOf("A")

// Act
val containsOnly = collection.containsExactly("A")

// Assert
assertThat(containsOnly).isTrue()
}

@Test
fun `skal returnere true om en liste kun inneholder de ønskede ulike elemente`() {
// Arrange
val collection = listOf("A", "B")

// Act
val containsOnly = collection.containsExactly("A", "B")

// Assert
assertThat(containsOnly).isTrue()
}

@Test
fun `skal returnere true om en liste kun inneholder de ønskede like elemente`() {
// Arrange
val collection = listOf("A", "A")

// Act
val containsOnly = collection.containsExactly("A", "A")

// Assert
assertThat(containsOnly).isTrue()
}

@Test
fun `skal returnere false om en liste kun inneholder de ønskede ulike elemente i forskjellig rekkefølge`() {
// Arrange
val collection = listOf("A", "B")

// Act
val containsOnly = collection.containsExactly("B", "A")

// Assert
assertThat(containsOnly).isFalse()
}

@Test
fun `skal returnere false om en liste med ett element ikke inneholder det ønskede elementet`() {
// Arrange
val collection = listOf("A")

// Act
val containsOnly = collection.containsExactly("B")

// Assert
assertThat(containsOnly).isFalse()
}

@Test
fun `skal returnere false om en liste med ett element ikke inneholder de ønskede ulike elementene`() {
// Arrange
val collection = listOf("A")

// Act
val containsOnly = collection.containsExactly("A", "B")

// Assert
assertThat(containsOnly).isFalse()
}

@Test
fun `skal returnere false om en liste med ett element ikke inneholder de ønskede like elementene`() {
// Arrange
val collection = listOf("A")

// Act
val containsOnly = collection.containsExactly("A", "A")

// Assert
assertThat(containsOnly).isFalse()
}

@Test
fun `skal returnere false om et tomt set ikke inneholder det ene ønskede elemente`() {
// Arrange
val collection = emptySet<String>()

// Act
val containsOnly = collection.containsExactly("A")

// Assert
assertThat(containsOnly).isFalse()
}

@Test
fun `skal returnere true om et set kun inneholder det ene ønskede elemente`() {
// Arrange
val collection = setOf("A")

// Act
val containsOnly = collection.containsExactly("A")

// Assert
assertThat(containsOnly).isTrue()
}

@Test
fun `skal returnere true om et set kun inneholder de ønskede ulike elemente`() {
// Arrange
val collection = setOf("A", "B")

// Act
val containsOnly = collection.containsExactly("A", "B")

// Assert
assertThat(containsOnly).isTrue()
}

@Test
fun `skal returnere false om et set kun inneholder de ønskede like elemente da et set kun inneholder unike elementer`() {
// Arrange
val collection = setOf("A", "A")

// Act
val containsOnly = collection.containsExactly("A", "A")

// Assert
assertThat(containsOnly).isFalse()
}

@Test
fun `skal returnere false om et set kun inneholder de ønskede ulike elemente i forskjellig rekkefølge`() {
// Arrange
val collection = setOf("A", "B")

// Act
val containsOnly = collection.containsExactly("B", "A")

// Assert
assertThat(containsOnly).isFalse()
}

@Test
fun `skal returnere false om et set med ett element ikke inneholder det ønskede elementet`() {
// Arrange
val collection = setOf("A")

// Act
val containsOnly = collection.containsExactly("B")

// Assert
assertThat(containsOnly).isFalse()
}

@Test
fun `skal returnere false om et set med ett element ikke inneholder de ønskede ulike elementene`() {
// Arrange
val collection = setOf("A")

// Act
val containsOnly = collection.containsExactly("A", "B")

// Assert
assertThat(containsOnly).isFalse()
}

@Test
fun `skal returnere false om et set med ett element ikke inneholder de ønskede like elementene`() {
// Arrange
val collection = setOf("A")

// Act
val containsOnly = collection.containsExactly("A", "A")

// Assert
assertThat(containsOnly).isFalse()
}
}
}
Loading

0 comments on commit d688532

Please sign in to comment.