diff --git a/domene/src/main/java/no/nav/foreldrepenger/los/avdelingsleder/AvdelingslederSaksbehandlerTjeneste.java b/domene/src/main/java/no/nav/foreldrepenger/los/avdelingsleder/AvdelingslederSaksbehandlerTjeneste.java index ec58717b7..af72d7e56 100644 --- a/domene/src/main/java/no/nav/foreldrepenger/los/avdelingsleder/AvdelingslederSaksbehandlerTjeneste.java +++ b/domene/src/main/java/no/nav/foreldrepenger/los/avdelingsleder/AvdelingslederSaksbehandlerTjeneste.java @@ -72,12 +72,12 @@ public List hentAvdelingensSaksbehandlereOgGrupper(String a return organisasjonRepository.hentSaksbehandlerGrupper(avdelingEnhet); } - public void leggSaksbehandlerTilGruppe(String saksbehandlerId, int gruppeId, String avdelingEnhet) { + public void leggSaksbehandlerTilGruppe(String saksbehandlerId, long gruppeId, String avdelingEnhet) { organisasjonRepository.leggSaksbehandlerTilGruppe(saksbehandlerId, gruppeId, avdelingEnhet); } - public void fjernSaksbehandlerFraGruppe(String saksbehandlerId, int gruppeId) { - organisasjonRepository.fjernSaksbehandlerFraGruppe(saksbehandlerId, gruppeId); + public void fjernSaksbehandlerFraGruppe(String saksbehandlerId, long gruppeId, String avdelingEnhet) { + organisasjonRepository.fjernSaksbehandlerFraGruppe(saksbehandlerId, gruppeId, avdelingEnhet); } public SaksbehandlerGruppe opprettSaksbehandlerGruppe(String avdelingEnhet) { diff --git a/domene/src/main/java/no/nav/foreldrepenger/los/organisasjon/OrganisasjonRepository.java b/domene/src/main/java/no/nav/foreldrepenger/los/organisasjon/OrganisasjonRepository.java index bb5853fe2..886d4de35 100644 --- a/domene/src/main/java/no/nav/foreldrepenger/los/organisasjon/OrganisasjonRepository.java +++ b/domene/src/main/java/no/nav/foreldrepenger/los/organisasjon/OrganisasjonRepository.java @@ -11,7 +11,7 @@ import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import no.nav.foreldrepenger.los.felles.BaseEntitet; -import no.nav.vedtak.exception.FunksjonellException; +import no.nav.vedtak.felles.jpa.TomtResultatException; @ApplicationScoped @@ -68,28 +68,21 @@ public List hentSaksbehandlerGrupper(String avdelingEnhet) .getResultList(); } - public void leggSaksbehandlerTilGruppe(String saksbehandlerId, int gruppeId, String avdelingEnhet) { + public void leggSaksbehandlerTilGruppe(String saksbehandlerId, long gruppeId, String avdelingEnhet) { var gruppe = entityManager.find(SaksbehandlerGruppe.class, gruppeId); - if (gruppe == null || !gruppe.getAvdeling().getAvdelingEnhet().equals(avdelingEnhet)) { - throw new FunksjonellException("FP-164687", String.format("Fant ikke gruppe %s for avdeling %s", gruppeId, avdelingEnhet), - "Kontroller logisk sammenheng mellom gruppe og enhet"); - } + sjekkGruppeEnhetTilknytning(gruppeId, avdelingEnhet, gruppe); var saksbehandler = hentSaksbehandlerHvisEksisterer(saksbehandlerId).filter(sb -> sb.getAvdelinger().contains(gruppe.getAvdeling())); saksbehandler.ifPresentOrElse(sb -> { gruppe.getSaksbehandlere().add(sb); entityManager.persist(gruppe); }, () -> { - throw new FunksjonellException("FP-164687", - String.format("Fant ikke saksbehandler %s tilknyttet avdeling %s", saksbehandlerId, avdelingEnhet), - "Kontroller logisk sammenheng mellom saksbehandler, gruppe og enhet"); + throw fantIkkeSaksbehandlerException(saksbehandlerId, avdelingEnhet); }); } - public void fjernSaksbehandlerFraGruppe(String saksbehandlerIdent, int gruppeId) { + public void fjernSaksbehandlerFraGruppe(String saksbehandlerIdent, long gruppeId, String avdelingEnhet) { var gruppe = entityManager.find(SaksbehandlerGruppe.class, gruppeId); - if (gruppe == null) { - throw new IllegalArgumentException("Fant ikke gruppe"); - } + sjekkGruppeEnhetTilknytning(gruppeId, avdelingEnhet, gruppe); gruppe.getSaksbehandlere().removeIf(s -> s.getSaksbehandlerIdent().equals(saksbehandlerIdent)); entityManager.persist(gruppe); } @@ -103,14 +96,28 @@ public void updateSaksbehandlerGruppeNavn(long gruppeId, String gruppeNavn) { public void slettSaksbehandlerGruppe(long gruppeId, String avdelingEnhet) { var gruppe = entityManager.find(SaksbehandlerGruppe.class, gruppeId); - if (gruppe == null || !gruppe.getAvdeling().getAvdelingEnhet().equals(avdelingEnhet)) { - throw new FunksjonellException("FP-164687", String.format("Fant ikke gruppe %s for avdeling %s", gruppeId, avdelingEnhet), - "Kontroller logisk sammenheng mellom gruppe og enhet"); - } + sjekkGruppeEnhetTilknytning(gruppeId, avdelingEnhet, gruppe); gruppe.getSaksbehandlere().clear(); entityManager.persist(gruppe); entityManager.createQuery("DELETE FROM saksbehandlerGruppe g WHERE g.id = :gruppeId") .setParameter("gruppeId", gruppeId) .executeUpdate(); } + + private static void sjekkGruppeEnhetTilknytning(long gruppeId, String avdelingEnhet, SaksbehandlerGruppe gruppe) { + if (gruppe == null || !gruppe.getAvdeling().getAvdelingEnhet().equals(avdelingEnhet)) { + throw fantIkkeGruppeException(gruppeId, avdelingEnhet); + } + } + + private static TomtResultatException fantIkkeGruppeException(long gruppeId, String avdelingEnhet) { + return new TomtResultatException("FP-164688", String.format("Fant ikke gruppe %s for avdeling %s", gruppeId, avdelingEnhet)); + } + + private static TomtResultatException fantIkkeSaksbehandlerException(String saksbehandlerIdent, String avdelingEnhet) { + return new TomtResultatException("FP-164689", + String.format("Fant ikke saksbehandler %s tilknyttet avdeling %s", saksbehandlerIdent, avdelingEnhet)); + } + + } diff --git a/web/src/main/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/dto/SaksbehandlerOgGruppeDto.java b/web/src/main/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/dto/SaksbehandlerOgGruppeDto.java index 9106d73e5..b7719184e 100644 --- a/web/src/main/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/dto/SaksbehandlerOgGruppeDto.java +++ b/web/src/main/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/dto/SaksbehandlerOgGruppeDto.java @@ -11,7 +11,7 @@ public record SaksbehandlerOgGruppeDto(@NotNull @Valid SaksbehandlerBrukerIdentDto brukerIdent, @NotNull @Valid AvdelingEnhetDto avdelingEnhet, - @Min(1) @Max(Integer.MAX_VALUE) int gruppeId) implements AbacDto { + @Min(1) @Max(Integer.MAX_VALUE) long gruppeId) implements AbacDto { @Override public AbacDataAttributter abacAttributter() { diff --git a/web/src/main/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjeneste.java b/web/src/main/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjeneste.java index 0f6678eeb..49886f691 100644 --- a/web/src/main/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjeneste.java +++ b/web/src/main/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjeneste.java @@ -59,9 +59,34 @@ public List hentAvdelingensSaksbehandlere(@NotNul .toList(); } + @POST + @Path("/søk") + @Operation(description = "Søk etter saksbehandler", tags = "AvdelingslederSaksbehandlere") + @BeskyttetRessurs(actionType = ActionType.READ, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET) + public SaksbehandlerMedAvdelingerDto søkAvdelingensSaksbehandlere(@NotNull @Parameter(description = "Brukeridentifikasjon") @Valid SaksbehandlerBrukerIdentDto brukerIdent) { + return saksbehandlerDtoTjeneste.lagSaksbehandlerMedAvdelingerDto(brukerIdent.getVerdi()).orElse(null); + } + + @POST + @Operation(description = "Legg til ny saksbehandler", tags = "AvdelingslederSaksbehandlere") + @BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET) + public void leggTilNySaksbehandler(@NotNull @Parameter(description = "Brukeridentifikasjon og avdelingsid") @Valid SaksbehandlerOgAvdelingDto saksbehandlerOgAvdeling) { + avdelingslederSaksbehandlerTjeneste.leggSaksbehandlerTilAvdeling(saksbehandlerOgAvdeling.getBrukerIdent().getVerdi(), + saksbehandlerOgAvdeling.getAvdelingEnhet().getAvdelingEnhet()); + } + + @POST + @Path("/slett") + @Operation(description = "Fjern saksbehandler", tags = "AvdelingslederSaksbehandlere") + @BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET) + public void slettSaksbehandler(@NotNull @Parameter(description = "Brukeridentifikasjon og avdelingsid") @Valid SaksbehandlerOgAvdelingDto saksbehandlerOgAvdeling) { + avdelingslederSaksbehandlerTjeneste.fjernSaksbehandlerFraAvdeling(saksbehandlerOgAvdeling.getBrukerIdent().getVerdi(), + saksbehandlerOgAvdeling.getAvdelingEnhet().getAvdelingEnhet()); + } + @GET @Path("/grupper") - @Operation(description = "Avdelingsliste saksbehandlere og grupper") + @Operation(description = "Avdelingsliste saksbehandlere og grupper", tags = "AvdelingslederSaksbehandlergrupper") @BeskyttetRessurs(actionType = ActionType.READ, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET, sporingslogg = false) public SaksbehandlereOgSaksbehandlerGrupper hentSaksbehandlerGrupper(@NotNull @QueryParam("avdelingEnhet") @Valid AvdelingEnhetDto avdelingEnhetDto) { var avdelingensSaksbehandlere = avdelingslederSaksbehandlerTjeneste.hentAvdelingensSaksbehandlere(avdelingEnhetDto.getAvdelingEnhet()) @@ -76,18 +101,16 @@ public SaksbehandlereOgSaksbehandlerGrupper hentSaksbehandlerGrupper(@NotNull @Q @POST @Path("/grupper/opprett-gruppe") - @Operation(description = "Oppretter gruppe") + @Operation(description = "Oppretter gruppe", tags = "AvdelingslederSaksbehandlergrupper") @BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET) public SaksbehandlerGruppeDto opprettSaksbehandlerGruppe(@Valid AvdelingEnhetDto dto) { var sbg = avdelingslederSaksbehandlerTjeneste.opprettSaksbehandlerGruppe(dto.getAvdelingEnhet()); - var sb = sbg.getSaksbehandlere().stream() - .map(saksbehandlerDtoTjeneste::lagKjentOgUkjentSaksbehandlerMedAvdelingerDto).toList(); - return new SaksbehandlerGruppeDto(sbg.getId(), sbg.getGruppeNavn(), sb); + return new SaksbehandlerGruppeDto(sbg.getId(), sbg.getGruppeNavn(), List.of()); } @POST @Path("/grupper/endre-gruppe") - @Operation(description = "Gir nytt navn til gruppe") + @Operation(description = "Gir nytt navn til gruppe", tags = "AvdelingslederSaksbehandlergrupper") @BeskyttetRessurs(actionType = ActionType.UPDATE, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET) public void endreSaksbehandlerGruppe(@Valid SaksbehandlerGruppeNavneEndringDto dto) { avdelingslederSaksbehandlerTjeneste.endreSaksbehandlerGruppeNavn(dto.gruppeId(), dto.gruppeNavn()); @@ -95,7 +118,7 @@ public void endreSaksbehandlerGruppe(@Valid SaksbehandlerGruppeNavneEndringDto d @POST @Path("/grupper/legg-til-saksbehandler") - @Operation(description = " legger saksbehandler til gruppe") + @Operation(description = "Legger saksbehandler til gruppe", tags = "AvdelingslederSaksbehandlergrupper") @BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET) public void leggSaksbehandlerTilGruppe(@Valid SaksbehandlerOgGruppeDto dto) { avdelingslederSaksbehandlerTjeneste.leggSaksbehandlerTilGruppe(dto.brukerIdent().getVerdi(), dto.gruppeId(), dto.avdelingEnhet().getAvdelingEnhet()); @@ -103,42 +126,17 @@ public void leggSaksbehandlerTilGruppe(@Valid SaksbehandlerOgGruppeDto dto) { @POST @Path("/grupper/fjern-saksbehandler") - @Operation(description = " fjerner saksbehandler fra gruppe") + @Operation(description = "Fjerner saksbehandler fra gruppe", tags = "AvdelingslederSaksbehandlergrupper") @BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET) public void fjernSaksbehandlerFraGruppe(@Valid SaksbehandlerOgGruppeDto dto) { - avdelingslederSaksbehandlerTjeneste.fjernSaksbehandlerFraGruppe(dto.brukerIdent().getVerdi(), dto.gruppeId()); + avdelingslederSaksbehandlerTjeneste.fjernSaksbehandlerFraGruppe(dto.brukerIdent().getVerdi(), dto.gruppeId(), dto.avdelingEnhet().getAvdelingEnhet()); } @POST @Path("/grupper/slett-saksbehandlergruppe") - @Operation(description = "sletter saksbehandlergruppe") + @Operation(description = "Sletter saksbehandlergruppe", tags = "AvdelingslederSaksbehandlergrupper") @BeskyttetRessurs(actionType = ActionType.DELETE, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET) public void slettSaksbehandlerGruppe(@Valid SaksbehandlerGruppeSletteRequestDto dto) { avdelingslederSaksbehandlerTjeneste.slettSaksbehandlerGruppe(dto.gruppeId(), dto.avdelingEnhet().getAvdelingEnhet()); } - - @POST - @Path("/søk") - @Operation(description = "Søk etter saksbehandler", tags = "AvdelingslederSaksbehandlere") - @BeskyttetRessurs(actionType = ActionType.READ, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET) - public SaksbehandlerMedAvdelingerDto søkAvdelingensSaksbehandlere(@NotNull @Parameter(description = "Brukeridentifikasjon") @Valid SaksbehandlerBrukerIdentDto brukerIdent) { - return saksbehandlerDtoTjeneste.lagSaksbehandlerMedAvdelingerDto(brukerIdent.getVerdi()).orElse(null); - } - - @POST - @Operation(description = "Legg til ny saksbehandler", tags = "AvdelingslederSaksbehandlere") - @BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET) - public void leggTilNySaksbehandler(@NotNull @Parameter(description = "Brukeridentifikasjon og avdelingsid") @Valid SaksbehandlerOgAvdelingDto saksbehandlerOgAvdeling) { - avdelingslederSaksbehandlerTjeneste.leggSaksbehandlerTilAvdeling(saksbehandlerOgAvdeling.getBrukerIdent().getVerdi(), - saksbehandlerOgAvdeling.getAvdelingEnhet().getAvdelingEnhet()); - } - - @POST - @Path("/slett") - @Operation(description = "Fjern saksbehandler", tags = "AvdelingslederSaksbehandlere") - @BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.OPPGAVESTYRING_AVDELINGENHET) - public void slettSaksbehandler(@NotNull @Parameter(description = "Brukeridentifikasjon og avdelingsid") @Valid SaksbehandlerOgAvdelingDto saksbehandlerOgAvdeling) { - avdelingslederSaksbehandlerTjeneste.fjernSaksbehandlerFraAvdeling(saksbehandlerOgAvdeling.getBrukerIdent().getVerdi(), - saksbehandlerOgAvdeling.getAvdelingEnhet().getAvdelingEnhet()); - } } diff --git a/web/src/test/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java b/web/src/test/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java index f516b76fd..c277eec58 100644 --- a/web/src/test/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java +++ b/web/src/test/java/no/nav/foreldrepenger/los/web/app/tjenester/avdelingsleder/saksbehandler/AvdelingslederSaksbehandlerRestTjenesteTest.java @@ -15,14 +15,21 @@ import no.nav.foreldrepenger.los.web.app.tjenester.felles.dto.SaksbehandlerMedAvdelingerDto; +import no.nav.vedtak.exception.FunksjonellException; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import java.util.Objects; + import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.fail; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.when; @@ -64,7 +71,7 @@ void kan_slette_gruppe() { var gruppe = restTjeneste.opprettSaksbehandlerGruppe(avdelingDto); restTjeneste.slettSaksbehandlerGruppe(new SaksbehandlerGruppeSletteRequestDto((int) gruppe.gruppeId(), avdelingDto)); var etterSletting = restTjeneste.hentSaksbehandlerGrupper(avdelingDto); - assertThat(etterSletting.saksbehandlerGrupper()).hasSize(0); + assertThat(etterSletting.saksbehandlerGrupper()).isEmpty(); } @Test @@ -93,7 +100,7 @@ void kan_fjerne_saksbehandlere_fra_gruppe() { restTjeneste.fjernSaksbehandlerFraGruppe(new SaksbehandlerOgGruppeDto(brukerIdentDto, avdelingDto, (int) gruppe.gruppeId())); var etterSletting = restTjeneste.hentSaksbehandlerGrupper(avdelingDto); - assertThat(etterSletting.saksbehandlerGrupper().get(0).saksbehandlere()).hasSize(0); + assertThat(etterSletting.saksbehandlerGrupper().get(0).saksbehandlere()).isEmpty(); } @Test @@ -107,11 +114,50 @@ void kan_gi_grupper_nytt_navn() { assertThat(oppdatertGruppe.gruppeNavn()).isEqualTo("Nytt navn"); } + @Test + void skal_gi_feilmelding_når_gruppe_ikke_finnes() { + var dto = new SaksbehandlerGruppeSletteRequestDto(1, avdelingDto); + assertThatThrownBy(() -> restTjeneste.slettSaksbehandlerGruppe(dto)).isInstanceOf(FunksjonellException.class) + .extracting(Throwable::getMessage) + .matches(s -> s.contains("Fant ikke gruppe " + dto.gruppeId() + " for avdeling " + avdelingDto.getAvdelingEnhet())); + } + + @Test + void skal_håndtere_at_saksbehandler_ikke_er_tilknyttet_gruppe() { + var gruppe = restTjeneste.opprettSaksbehandlerGruppe(avdelingDto); + var dto = new SaksbehandlerOgGruppeDto(brukerIdentDto, avdelingDto, gruppe.gruppeId()); + assertThatNoException().isThrownBy(() -> restTjeneste.fjernSaksbehandlerFraGruppe(dto)); + } + + @Test + void skal_kunne_fjerne_saksbehandler_fra_individuelle_grupper() { + setupMockForMappingAvSaksbehandlerDto(); + var førsteGruppe = restTjeneste.opprettSaksbehandlerGruppe(avdelingDto); + restTjeneste.leggTilNySaksbehandler(new SaksbehandlerOgAvdelingDto(brukerIdentDto, avdelingDto)); + restTjeneste.leggSaksbehandlerTilGruppe(new SaksbehandlerOgGruppeDto(brukerIdentDto, avdelingDto, (int) førsteGruppe.gruppeId())); + var andreGruppe = restTjeneste.opprettSaksbehandlerGruppe(avdelingDto); + var saksbehandlerOgGruppeDto = new SaksbehandlerOgGruppeDto(brukerIdentDto, avdelingDto, (int) andreGruppe.gruppeId()); + restTjeneste.leggSaksbehandlerTilGruppe(saksbehandlerOgGruppeDto); + restTjeneste.fjernSaksbehandlerFraGruppe(saksbehandlerOgGruppeDto); + + var hentetGrupper = restTjeneste.hentSaksbehandlerGrupper(avdelingDto); + var hentetGrupperListe = hentetGrupper.saksbehandlerGrupper(); + assertThat(hentetGrupperListe).hasSize(2); + for (var res : hentetGrupperListe) { + if (Objects.equals(res.gruppeId(), førsteGruppe.gruppeId())) { + assertThat(res.saksbehandlere()).hasSize(1); + } else if (Objects.equals(res.gruppeId(), andreGruppe.gruppeId())) { + assertThat(res.saksbehandlere()).isEmpty(); + } + else { + fail("Ukjent gruppe"); + } + } + } + private void setupMockForMappingAvSaksbehandlerDto() { when(saksbehandlerDtoTjeneste.lagKjentOgUkjentSaksbehandlerMedAvdelingerDto(argThat(sb -> sb.getSaksbehandlerIdent().equals("Z999999")))) .thenReturn(new SaksbehandlerMedAvdelingerDto(saksbehandlerDto, singletonList(avdelingDto.getAvdelingEnhet()))); } - - }