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 (#5072)

### 💰 Hva skal gjøres, og hvorfor?
Favro:
https://favro.com/organization/98c34fb974ce445eac854de0/1844bbac3b6605eacc8f5543?card=NAV-24196

Når saksbehandler kun har tilgang til enheten Vikafossen skal det være
lovt å opprette behandlinger på Vikafossen enheten. Saksbehandler med
Vikafossen tilgang har ofte (alltid?) kun tilgang til Vikafossen.

Har omdøpt de gamle metodene med en "Gammel" suffix. De nye metodene her
omtrent lik, men endringer relatert til det som er nevnt over.

Har lagt de nye endringene bak en toggle. 

### 🔎️ Er det noe spesielt du ønsker tilbakemelding om?
Nei

### ✅ Checklist
_Har du husket alle punktene i listen?_
- [ ] Jeg har testet mine endringer i henhold til akseptansekriteriene
🕵️
- [ ] Jeg har config- eller sql-endringer. I så fall, husk manuell
deploy til miljø for å verifisere endringene.
- [x] Jeg har skrevet tester. Hvis du ikke har skrevet tester, beskriv
hvorfor under 👇

_Jeg har ikke skrevet tester fordi:_

### 💬 Ønsker du en muntlig gjennomgang?
- [ ] Ja
- [x] Nei
  • Loading branch information
thoalm authored Feb 12, 2025
1 parent 46a03c8 commit 15b90b0
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
TILLAT_OPPRETT_AV_BEHANDLING_PÅ_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 tillatOpprettAvBehandlingPåVikafossen = unleashService.isEnabled(FeatureToggle.TILLAT_OPPRETT_AV_BEHANDLING_PÅ_VIKAFOSSEN, false)
return when (arbeidsfordelingsenhet.enhetId) {
BarnetrygdEnhet.MIDLERTIDIG_ENHET.enhetsnummer ->
if (tillatOpprettAvBehandlingPåVikafossen) {
håndterMidlertidigEnhet4863(navIdent)
} else {
håndterMidlertidigEnhet4863Gammel(navIdent)
}

BarnetrygdEnhet.VIKAFOSSEN.enhetsnummer -> håndterVikafossenEnhet2103(navIdent)
else -> håndterAndreEnheter(navIdent, arbeidsfordelingsenhet)
else ->
if (tillatOpprettAvBehandlingPåVikafossen) {
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 15b90b0

Please sign in to comment.