Skip to content

Commit 8848633

Browse files
authored
Merge pull request #1586 from navikt/SlettLogikkFargekategori
Slett logikk fargekategori
2 parents 222e07e + 5dc43c6 commit 8848633

File tree

10 files changed

+141
-170
lines changed

10 files changed

+141
-170
lines changed

src/main/java/no/nav/pto/veilarbportefolje/arbeidsliste/v2/ArbeidsListeV2Controller.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package no.nav.pto.veilarbportefolje.arbeidsliste.v2;
22

33
import io.vavr.control.Validation;
4-
import jakarta.ws.rs.DefaultValue;
5-
import jakarta.ws.rs.QueryParam;
64
import lombok.extern.slf4j.Slf4j;
75
import no.nav.common.types.identer.Fnr;
86
import no.nav.pto.veilarbportefolje.arbeidsliste.*;
@@ -120,6 +118,8 @@ public Arbeidsliste deleteArbeidsliste(
120118
@RequestBody ArbeidslisteForBrukerRequest arbeidslisteForBrukerRequest,
121119
@RequestParam(value = "slettFargekategori", required = false, defaultValue = "true") Boolean slettFargekategori
122120
) {
121+
NavKontor enhet = brukerService.hentNavKontor(arbeidslisteForBrukerRequest.fnr()).orElse(null);
122+
123123
validerOppfolgingOgBruker(arbeidslisteForBrukerRequest.fnr().get());
124124
validerErVeilederForBruker(arbeidslisteForBrukerRequest.fnr().get());
125125
Fnr gyldigFnr = Fnr.ofValidFnr(arbeidslisteForBrukerRequest.fnr().get());
@@ -129,9 +129,7 @@ public Arbeidsliste deleteArbeidsliste(
129129
arbeidslisteService.slettArbeidsliste(gyldigFnr, slettFargekategori);
130130
} catch (SlettArbeidslisteException e) {
131131
VeilederId veilederId = AuthUtils.getInnloggetVeilederIdent();
132-
NavKontor enhet = brukerService.hentNavKontor(gyldigFnr).orElse(null);
133132
secureLog.warn("Kunne ikke slette arbeidsliste for fnr: {}, av veileder: {}, på enhet: {}", gyldigFnr.get(), veilederId.toString(), enhet);
134-
135133
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Kunne ikke slette. Fant ikke arbeidsliste for bruker");
136134
}
137135

src/main/java/no/nav/pto/veilarbportefolje/fargekategori/FargekategoriController.java

+30-31
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fasterxml.jackson.annotation.JsonProperty;
55
import io.vavr.control.Validation;
66
import lombok.RequiredArgsConstructor;
7+
import no.nav.common.types.identer.EnhetId;
78
import no.nav.common.types.identer.Fnr;
89
import no.nav.pto.veilarbportefolje.auth.AuthService;
910
import no.nav.pto.veilarbportefolje.auth.AuthUtils;
@@ -15,7 +16,11 @@
1516
import org.springframework.web.bind.annotation.*;
1617
import org.springframework.web.server.ResponseStatusException;
1718

18-
import java.util.*;
19+
import java.util.Collections;
20+
import java.util.List;
21+
import java.util.Optional;
22+
import java.util.Set;
23+
import java.util.stream.Collectors;
1924
import java.util.stream.Stream;
2025

2126
import static no.nav.pto.veilarbportefolje.util.SecureLog.secureLog;
@@ -33,14 +38,8 @@ public class FargekategoriController {
3338
public ResponseEntity<FargekategoriEntity> hentFargekategoriForBruker(@RequestBody HentFargekategoriRequest request) {
3439
validerRequest(request.fnr);
3540

36-
Optional<NavKontor> brukerEnhet = brukerServiceV2.hentNavKontor(request.fnr);
37-
if (brukerEnhet.isEmpty()) {
38-
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Bruker med oppgitt fnr er ikke under oppfølging");
39-
}
40-
4141
authService.innloggetVeilederHarTilgangTilOppfolging();
4242
authService.innloggetVeilederHarTilgangTilBruker(request.fnr.get());
43-
authService.innloggetVeilederHarTilgangTilEnhet(brukerEnhet.get().toString());
4443

4544
try {
4645
Optional<FargekategoriEntity> kanskjeFargekategori = fargekategoriService.hentFargekategoriForBruker(request);
@@ -59,27 +58,23 @@ public ResponseEntity<FargekategoriResponse> oppdaterFargekategoriForBruker(@Req
5958
VeilederId innloggetVeileder = AuthUtils.getInnloggetVeilederIdent();
6059
validerRequest(request.fnr);
6160

62-
Optional<NavKontor> brukerEnhet = brukerServiceV2.hentNavKontor(request.fnr);
63-
64-
if (brukerEnhet.isEmpty()) {
65-
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Bruker med oppgitt fnr er ikke under oppfølging");
66-
}
61+
NavKontor navKontorForBruker = brukerServiceV2.hentNavKontor(request.fnr).orElseThrow(() -> new ResponseStatusException(HttpStatus.FORBIDDEN, "Bruker er ikke tilordnet enhet"));
6762

6863
authService.innloggetVeilederHarTilgangTilOppfolging();
6964
authService.innloggetVeilederHarTilgangTilBruker(request.fnr.get());
70-
authService.innloggetVeilederHarTilgangTilEnhet(brukerEnhet.get().toString());
65+
authService.innloggetVeilederHarTilgangTilEnhet(navKontorForBruker.getValue());
7166
Validation<String, Fnr> erVeilederForBrukerValidation = fargekategoriService.erVeilederForBruker(request.fnr.get());
7267

7368
if (erVeilederForBrukerValidation.isInvalid()) {
7469
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Bruker er ikke tilordnet veileder");
7570
}
7671

7772
try {
78-
Optional<FargekategoriEntity> fargekategoriEntity = fargekategoriService.oppdaterFargekategoriForBruker(request, innloggetVeileder);
73+
Optional<FargekategoriEntity> fargekategoriEntity = fargekategoriService.oppdaterFargekategoriForBruker(request, innloggetVeileder, EnhetId.of(navKontorForBruker.getValue()));
7974

8075
return fargekategoriEntity
8176
.map(fargekategori -> ResponseEntity.ok(new FargekategoriResponse(fargekategori.fnr(), fargekategori.fargekategoriVerdi())))
82-
.orElseGet(() -> ResponseEntity.ok(new FargekategoriResponse(request.fnr(), FargekategoriVerdi.INGEN_KATEGORI)));
77+
.orElseGet(() -> ResponseEntity.ok(new FargekategoriResponse(request.fnr(), FargekategoriVerdi.INGEN_KATEGORI)));
8378
} catch (Exception e) {
8479
String melding = String.format("Klarte ikke å opprette/oppdatere fargekategori med verdi %s for fnr %s", request.fargekategoriVerdi.name(), request.fnr.get());
8580
secureLog.error(melding, e);
@@ -100,14 +95,27 @@ public ResponseEntity<BatchUpsertResponse> batchoppdaterFargekategoriForBruker(@
10095

10196
BatchUpsertResponse responseEtterAutoriseringssjekk = sjekkVeilederautorisering(responseEtterValidering.data, request.fargekategoriVerdi);
10297
List<Fnr> feilFraValideringOgAutorisering = Stream.concat(responseEtterValidering.errors.stream(), responseEtterAutoriseringssjekk.errors.stream()).toList();
103-
BatchUpsertResponse resultatFraValideringOgAutorisering = new BatchUpsertResponse(responseEtterAutoriseringssjekk.data, feilFraValideringOgAutorisering, request.fargekategoriVerdi);
98+
BatchUpsertResponse resultatFraValideringOgAutorisering = new BatchUpsertResponse(responseEtterAutoriseringssjekk.data, feilFraValideringOgAutorisering, request.fargekategoriVerdi);
10499

105-
if(responseEtterAutoriseringssjekk.data.isEmpty()) {
100+
if (responseEtterAutoriseringssjekk.data.isEmpty()) {
106101
return ResponseEntity.status(403).body(resultatFraValideringOgAutorisering);
107102
}
108103

104+
Set<NavKontor> brukerEnheter = request.fnr.stream()
105+
.map(brukerServiceV2::hentNavKontor)
106+
.filter(Optional::isPresent)
107+
.map(Optional::get)
108+
.collect(Collectors.toSet());
109+
110+
if (brukerEnheter.size() != 1) {
111+
throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Kan ikke oppdatere fargekategori i flere enheter samtidig.");
112+
}
113+
114+
EnhetId enhetId = EnhetId.of(brukerEnheter.iterator().next().getValue());
115+
authService.innloggetVeilederHarTilgangTilEnhet(enhetId.get());
116+
109117
try {
110-
fargekategoriService.batchoppdaterFargekategoriForBruker(request.fargekategoriVerdi, responseEtterAutoriseringssjekk.data, innloggetVeileder);
118+
fargekategoriService.batchoppdaterFargekategoriForBruker(request.fargekategoriVerdi, responseEtterAutoriseringssjekk.data, innloggetVeileder, enhetId);
111119

112120
return ResponseEntity.ok(resultatFraValideringOgAutorisering);
113121

@@ -144,19 +152,9 @@ private BatchUpsertResponse sjekkVeilederautorisering(List<Fnr> fodselsnumre, Fa
144152

145153
fodselsnumre.forEach(fnr -> {
146154
try {
147-
Optional<NavKontor> brukerEnhet = brukerServiceV2.hentNavKontor(fnr);
148155

149156
/* Vi sjekkar om bruker er under oppfølging i autorisering i staden for i validering
150157
* for å unngå at feilmeldinga avslører om eit fnr er i systemet. (400 bad request vs 403 forbidden) */
151-
boolean brukerErIkkeUnderOppfølging = brukerEnhet.isEmpty();
152-
if (brukerErIkkeUnderOppfølging) {
153-
throw new ResponseStatusException(
154-
HttpStatus.NOT_FOUND,
155-
"Bruker med oppgitt fnr er ikke under oppfølging"
156-
);
157-
}
158-
159-
authService.innloggetVeilederHarTilgangTilEnhet(brukerEnhet.get().getValue());
160158

161159
authService.innloggetVeilederHarTilgangTilBruker(fnr.get());
162160

@@ -195,11 +193,12 @@ public record OppdaterFargekategoriRequest(
195193
}
196194

197195
public record BatchoppdaterFargekategoriRequest(
198-
@JsonProperty(required = true) List<Fnr> fnr,
199-
@JsonProperty(required = true) FargekategoriVerdi fargekategoriVerdi
196+
@JsonProperty(required = true) List<Fnr> fnr,
197+
@JsonProperty(required = true) FargekategoriVerdi fargekategoriVerdi
200198
) {
201199
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
202-
public BatchoppdaterFargekategoriRequest {}
200+
public BatchoppdaterFargekategoriRequest {
201+
}
203202
}
204203

205204
public record BatchUpsertResponse(List<Fnr> data, List<Fnr> errors, FargekategoriVerdi fargekategoriVerdi) {

src/main/java/no/nav/pto/veilarbportefolje/fargekategori/FargekategoriRepository.java

+22-14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package no.nav.pto.veilarbportefolje.fargekategori;
22

33
import lombok.RequiredArgsConstructor;
4+
import no.nav.common.types.identer.EnhetId;
45
import no.nav.common.types.identer.Fnr;
56
import no.nav.pto.veilarbportefolje.domene.value.VeilederId;
67
import no.nav.pto.veilarbportefolje.fargekategori.FargekategoriController.OppdaterFargekategoriRequest;
@@ -38,14 +39,14 @@ public Optional<FargekategoriEntity> hentFargekategoriForBruker(Fnr fnr) {
3839
}
3940

4041
@Transactional
41-
public FargekategoriEntity upsertFargekateori(OppdaterFargekategoriRequest request, VeilederId sistEndretAv) {
42+
public FargekategoriEntity upsertFargekateori(OppdaterFargekategoriRequest request, VeilederId sistEndretAv, EnhetId enhetId) {
4243
Timestamp sistEndret = toTimestamp(ZonedDateTime.now());
4344

4445
String upsertSql = """
45-
INSERT INTO fargekategori(id, fnr, verdi, sist_endret, sist_endret_av_veilederident)
46-
VALUES (?, ?, ?, ?, ?)
46+
INSERT INTO fargekategori(id, fnr, verdi, sist_endret, sist_endret_av_veilederident, enhet_id)
47+
VALUES (?, ?, ?, ?, ?, ?)
4748
ON CONFLICT (fnr) DO UPDATE
48-
SET verdi=?, sist_endret=?, sist_endret_av_veilederident=?
49+
SET verdi=excluded.verdi, sist_endret=excluded.sist_endret, sist_endret_av_veilederident=excluded.sist_endret_av_veilederident, enhet_id=excluded.enhet_id
4950
""";
5051

5152
jdbcTemplate.update(upsertSql,
@@ -54,9 +55,7 @@ ON CONFLICT (fnr) DO UPDATE
5455
request.fargekategoriVerdi().name(),
5556
sistEndret,
5657
sistEndretAv.getValue(),
57-
request.fargekategoriVerdi().name(),
58-
sistEndret,
59-
sistEndretAv.getValue());
58+
enhetId.get());
6059

6160
return jdbcTemplate.queryForObject(
6261
"SELECT * FROM fargekategori WHERE fnr=?",
@@ -87,12 +86,12 @@ public int getBatchSize() {
8786
});
8887
}
8988

90-
public void batchupsertFargekategori(FargekategoriVerdi fargekategoriVerdi, List<Fnr> fnr, VeilederId sisteEndretAv) {
89+
public void batchupsertFargekategori(FargekategoriVerdi fargekategoriVerdi, List<Fnr> fnr, VeilederId sisteEndretAv, EnhetId enhetId) {
9190
String upsertSql = """
92-
INSERT INTO fargekategori(id, fnr, verdi, sist_endret, sist_endret_av_veilederident)
93-
VALUES (?, ?, ?, ?, ?)
91+
INSERT INTO fargekategori(id, fnr, verdi, sist_endret, sist_endret_av_veilederident, enhet_id)
92+
VALUES (?, ?, ?, ?, ?, ?)
9493
ON CONFLICT (fnr) DO UPDATE
95-
SET verdi=?, sist_endret=?, sist_endret_av_veilederident=?
94+
SET verdi=excluded.verdi, sist_endret=excluded.sist_endret, sist_endret_av_veilederident=excluded.sist_endret_av_veilederident
9695
""";
9796

9897
jdbcTemplate.batchUpdate(upsertSql, new BatchPreparedStatementSetter() {
@@ -103,9 +102,7 @@ public void setValues(PreparedStatement ps, int i) throws SQLException {
103102
ps.setString(3, fargekategoriVerdi.name());
104103
ps.setTimestamp(4, toTimestamp(ZonedDateTime.now()));
105104
ps.setString(5, sisteEndretAv.getValue());
106-
ps.setString(6, fargekategoriVerdi.name());
107-
ps.setTimestamp(7, toTimestamp(ZonedDateTime.now()));
108-
ps.setString(8, sisteEndretAv.getValue());
105+
ps.setString(6, enhetId.get());
109106
}
110107

111108
@Override
@@ -114,4 +111,15 @@ public int getBatchSize() {
114111
}
115112
});
116113
}
114+
115+
public Optional<String> hentNavkontorPaFargekategori(Fnr fnr) {
116+
String hentSql = "SELECT enhet_id FROM fargekategori WHERE fnr=?";
117+
118+
return Optional.ofNullable(queryForObjectOrNull(() ->
119+
jdbcTemplate.queryForObject(
120+
hentSql,
121+
(resultSet, rowNumber) -> resultSet.getString("enhet_id"),
122+
fnr.get())
123+
));
124+
}
117125
}

src/main/java/no/nav/pto/veilarbportefolje/fargekategori/FargekategoriService.java

+32-4
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
import io.vavr.control.Validation;
55
import lombok.RequiredArgsConstructor;
66
import no.nav.common.types.identer.AktorId;
7+
import no.nav.common.types.identer.EnhetId;
78
import no.nav.common.types.identer.Fnr;
89
import no.nav.pto.veilarbportefolje.auth.AuthUtils;
910
import no.nav.pto.veilarbportefolje.domene.AktorClient;
11+
import no.nav.pto.veilarbportefolje.domene.value.NavKontor;
1012
import no.nav.pto.veilarbportefolje.domene.value.VeilederId;
1113
import no.nav.pto.veilarbportefolje.fargekategori.FargekategoriController.OppdaterFargekategoriRequest;
1214
import no.nav.pto.veilarbportefolje.opensearch.OpensearchIndexerV2;
@@ -37,30 +39,30 @@ public Optional<FargekategoriEntity> hentFargekategoriForBruker(FargekategoriCon
3739
return fargekategoriRepository.hentFargekategoriForBruker(request.fnr());
3840
}
3941

40-
public Optional<FargekategoriEntity> oppdaterFargekategoriForBruker(OppdaterFargekategoriRequest request, VeilederId sistEndretAv) {
42+
public Optional<FargekategoriEntity> oppdaterFargekategoriForBruker(OppdaterFargekategoriRequest request, VeilederId sistEndretAv, EnhetId enhetId) {
4143
if (request.fargekategoriVerdi() == FargekategoriVerdi.INGEN_KATEGORI) {
4244
fargekategoriRepository.deleteFargekategori(request.fnr());
4345

4446
slettIOpensearch(request.fnr());
4547

4648
return Optional.empty();
4749
} else {
48-
FargekategoriEntity oppdatertKategori = fargekategoriRepository.upsertFargekateori(request, sistEndretAv);
50+
FargekategoriEntity oppdatertKategori = fargekategoriRepository.upsertFargekateori(request, sistEndretAv, enhetId);
4951

5052
oppdaterIOpensearch(request.fnr(), request.fargekategoriVerdi());
5153

5254
return Optional.of(oppdatertKategori);
5355
}
5456
}
5557

56-
public void batchoppdaterFargekategoriForBruker(FargekategoriVerdi fargekategoriVerdi, List<Fnr> fnr, VeilederId innloggetVeileder) {
58+
public void batchoppdaterFargekategoriForBruker(FargekategoriVerdi fargekategoriVerdi, List<Fnr> fnr, VeilederId innloggetVeileder, EnhetId enhetId) {
5759
if (fargekategoriVerdi == FargekategoriVerdi.INGEN_KATEGORI) {
5860
fargekategoriRepository.batchdeleteFargekategori(fnr);
5961

6062
fnr.forEach(this::slettIOpensearch);
6163

6264
} else {
63-
fargekategoriRepository.batchupsertFargekategori(fargekategoriVerdi, fnr, innloggetVeileder);
65+
fargekategoriRepository.batchupsertFargekategori(fargekategoriVerdi, fnr, innloggetVeileder, enhetId);
6466

6567
fnr.forEach(f -> oppdaterIOpensearch(f, fargekategoriVerdi));
6668
}
@@ -120,6 +122,32 @@ public Boolean erVeilederForBruker(AktorId aktoerId, VeilederId veilederId) {
120122
.orElse(false);
121123
}
122124

125+
public boolean brukerHarFargekategoriPaForrigeNavkontor(AktorId aktoerId) {
126+
Fnr fnr = pdlIdentRepository.hentFnrForAktivBruker(aktoerId);
127+
Optional<String> navkontorPaFargekategori = fargekategoriRepository.hentNavkontorPaFargekategori(fnr);
128+
129+
if (navkontorPaFargekategori.isEmpty()) {
130+
secureLog.info("Bruker {} har ikke NAV-kontor på fargekategori", aktoerId.toString());
131+
return false;
132+
}
133+
134+
final Optional<String> navKontorForBruker = brukerServiceV2.hentNavKontor(aktoerId).map(NavKontor::getValue);
135+
if (navKontorForBruker.isEmpty()) {
136+
secureLog.error("Kunne ikke hente NAV-kontor for bruker {}", aktoerId.toString());
137+
return false;
138+
}
139+
140+
boolean navkontorForBrukerUlikNavkontorPaFargekategori = !navKontorForBruker.orElseThrow().equals(navkontorPaFargekategori.orElseThrow());
141+
142+
if (navkontorForBrukerUlikNavkontorPaFargekategori) {
143+
secureLog.info("Bruker {} er på kontor {} mens fargekategori er lagret på et annet kontor {}", aktoerId.toString(), navKontorForBruker.get(), navkontorPaFargekategori.get());
144+
} else {
145+
secureLog.info("Bruker {} er på kontor {} og fargekategori er lagret på samme kontor {}", aktoerId.toString(), navKontorForBruker.get(), navkontorPaFargekategori.get());
146+
}
147+
148+
return navkontorForBrukerUlikNavkontorPaFargekategori;
149+
}
150+
123151
private Try<AktorId> hentAktorId(Fnr fnr) {
124152
return Try.of(() -> aktorClient.hentAktorId(fnr));
125153
}

src/main/java/no/nav/pto/veilarbportefolje/huskelapp/HuskelappService.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import no.nav.pto.veilarbportefolje.persononinfo.PdlIdentRepository;
1616
import no.nav.pto.veilarbportefolje.service.BrukerServiceV2;
1717
import org.springframework.stereotype.Service;
18+
import org.springframework.transaction.annotation.Transactional;
1819

1920
import java.time.LocalDate;
2021
import java.util.List;
@@ -33,9 +34,10 @@ public class HuskelappService {
3334
private final PdlIdentRepository pdlIdentRepository;
3435

3536

37+
@Transactional
3638
public UUID opprettHuskelapp(HuskelappOpprettRequest huskelappOpprettRequest, VeilederId veilederId) {
3739
try {
38-
40+
huskelappRepository.deaktivereAlleHuskelappRaderPaaBruker(huskelappOpprettRequest.brukerFnr());
3941
UUID huskelappId = huskelappRepository.opprettHuskelapp(huskelappOpprettRequest, veilederId);
4042

4143
AktorId aktorId = hentAktorId(huskelappOpprettRequest.brukerFnr()).orElseThrow(RuntimeException::new);

src/main/java/no/nav/pto/veilarbportefolje/oppfolging/VeilederTilordnetService.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import no.nav.common.types.identer.AktorId;
66
import no.nav.common.types.identer.Fnr;
77
import no.nav.pto.veilarbportefolje.arbeidsliste.ArbeidslisteService;
8-
import no.nav.pto.veilarbportefolje.domene.AktorClient;
98
import no.nav.pto.veilarbportefolje.domene.value.VeilederId;
9+
import no.nav.pto.veilarbportefolje.fargekategori.FargekategoriService;
1010
import no.nav.pto.veilarbportefolje.huskelapp.HuskelappService;
1111
import no.nav.pto.veilarbportefolje.kafka.KafkaCommonConsumerService;
1212
import no.nav.pto.veilarbportefolje.opensearch.OpensearchIndexerV2;
@@ -26,8 +26,8 @@ public class VeilederTilordnetService extends KafkaCommonConsumerService<Veilede
2626
private final OppfolgingRepositoryV2 oppfolgingRepositoryV2;
2727
private final ArbeidslisteService arbeidslisteService;
2828
private final HuskelappService huskelappService;
29+
private final FargekategoriService fargekategoriService;
2930
private final OpensearchIndexerV2 opensearchIndexerV2;
30-
private final AktorClient aktorClient;
3131
private final PdlIdentRepository pdlIdentRepository;
3232

3333

@@ -56,6 +56,11 @@ public void tilordneVeileder(AktorId aktoerId, VeilederId veilederId) {
5656
if (brukerHarByttetNavkontorHuskelapp) {
5757
huskelappService.deaktivereAlleHuskelapperPaaBruker(aktoerId, maybeFnr);
5858
}
59+
60+
final boolean brukerHarByttetNavkontorFargekategori = fargekategoriService.brukerHarFargekategoriPaForrigeNavkontor(aktoerId);
61+
if (brukerHarByttetNavkontorFargekategori) {
62+
fargekategoriService.slettFargekategoriPaaBruker(aktoerId, maybeFnr);
63+
}
5964
}
6065

6166
private void kastErrorHvisBrukerSkalVaereUnderOppfolging(AktorId aktorId, VeilederId veilederId) {

0 commit comments

Comments
 (0)