Skip to content

Commit 67e982c

Browse files
authored
feat(TFP-5818): Sperr grunnlaget for endringer etter at den tilhørende behandlingen er avsluttet (#2615)
1 parent 20001a0 commit 67e982c

File tree

24 files changed

+524
-171
lines changed

24 files changed

+524
-171
lines changed

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/domene/iay/InntektArbeidYtelseRepository.java

+61-91
Large diffs are not rendered by default.

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/iay/InntektArbeidYtelseTjeneste.java

+1-24
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,6 @@ public InntektArbeidYtelseGrunnlag hentAggregat(GrunnlagReferanse referanse) {
6666
return repository.hentInntektArbeidYtelseForReferanse(referanse).orElseThrow();
6767
}
6868

69-
/**
70-
* @param referanse (ekstern referanse for kobling (eks. behandlingUuid)).
71-
* @return henter koblingen grunnlagsreferansen er koblet til.
72-
*/
73-
public Long hentKoblingIdFor(GrunnlagReferanse referanse) {
74-
return repository.hentKoblingIdFor(referanse);
75-
}
76-
7769
/**
7870
* @param koblingReferanse
7971
* @return henter optional aggregat
@@ -97,13 +89,6 @@ public Set<Inntektsmelding> hentAlleInntektsmeldingerFor(AktørId aktørId, Saks
9789
return repository.hentAlleInntektsmeldingerFor(aktørId, saksnummer, ytelseType);
9890
}
9991

100-
public Map<Inntektsmelding, ArbeidsforholdInformasjon> hentAlleInntektsmeldingerForEksternRef(AktørId aktørId,
101-
Saksnummer saksnummer,
102-
KoblingReferanse ref,
103-
YtelseType ytelseType) {
104-
return repository.hentArbeidsforholdInfoInntektsmeldingerMapFor(aktørId, saksnummer, ref, ytelseType);
105-
}
106-
10792
public Map<Inntektsmelding, ArbeidsforholdInformasjon> hentArbeidsforholdinfoInntektsmeldingerMapFor(AktørId aktørId,
10893
Saksnummer saksnummer,
10994
YtelseType ytelseType) {
@@ -131,13 +116,6 @@ public List<InntektArbeidYtelseGrunnlag> hentGrunnlagEtterspurtFor(AktørId akt
131116
return grunnlagEtterspurt.collect(Collectors.toList());
132117
}
133118

134-
/**
135-
* @param grunnlagReferanse
136-
* @return henter optional aggregat
137-
*/
138-
public Optional<InntektArbeidYtelseGrunnlag> hentGrunnlagFor(GrunnlagReferanse grunnlagReferanse) {
139-
return repository.hentInntektArbeidYtelseForReferanse(grunnlagReferanse);
140-
}
141119

142120
/**
143121
* Opprett builder for saksbehandlers overstyringer.
@@ -160,8 +138,7 @@ public ArbeidsforholdInformasjon hentArbeidsforholdInformasjonForKobling(Kobling
160138
}
161139

162140
public Optional<OppgittOpptjening> hentOppgittOpptjeningFor(UUID oppgittOpptjeningEksternReferanse) {
163-
var oppgittOpptjening = repository.hentOppgittOpptjeningFor(oppgittOpptjeningEksternReferanse);
164-
return oppgittOpptjening;
141+
return repository.hentOppgittOpptjeningFor(oppgittOpptjeningEksternReferanse);
165142
}
166143

167144
public Optional<InntektArbeidYtelseAggregat> hentIAYAggregatFor(KoblingReferanse koblingReferanse, UUID eksternReferanse) {

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/iay/tjeneste/ArbeidsforholdRestTjeneste.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,7 @@ public Response finnEllerOpprettArbeidsforholdReferanse(@NotNull @TilpassetAbacA
132132

133133
var dto = dtoTjeneste.mapArbeidsforhold(request.getArbeidsgiver(), abakusReferanse, arbeidsforholdRef.getReferanse());
134134
koblingLås.ifPresent(lås -> koblingTjeneste.oppdaterLåsVersjon(lås));
135-
final Response response = Response.ok(dto).build();
136-
return response;
135+
return Response.ok(dto).build();
137136
}
138137

139138
private Arbeidsgiver tilArbeidsgiver(@Valid @NotNull ArbeidsforholdReferanse request) {

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/iay/tjeneste/GrunnlagRestTjeneste.java

+11-20
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@
5555
import no.nav.abakus.iaygrunnlag.kodeverk.YtelseType;
5656
import no.nav.abakus.iaygrunnlag.request.Dataset;
5757
import no.nav.abakus.iaygrunnlag.request.InntektArbeidYtelseGrunnlagRequest;
58-
import no.nav.abakus.iaygrunnlag.request.InntektsmeldingerMottattRequest;
5958
import no.nav.abakus.iaygrunnlag.request.KopierGrunnlagRequest;
6059
import no.nav.abakus.iaygrunnlag.v1.InntektArbeidYtelseAggregatOverstyrtDto;
6160
import no.nav.abakus.iaygrunnlag.v1.InntektArbeidYtelseGrunnlagDto;
@@ -311,19 +310,8 @@ public Response hentSnapshotIayGrunnlag(@NotNull @Valid InntektArbeidYtelseGrunn
311310
@Operation(description = "Kopier grunnlag", tags = "iay-grunnlag")
312311
@BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.FAGSAK)
313312
@SuppressWarnings("findsecbugs:JAXRS_ENDPOINT")
314-
public Response kopierOgLagreGrunnlag(@NotNull @Valid KopierGrunnlagRequestAbac request) {
315-
var ref = new KoblingReferanse(request.getNyReferanse());
316-
var koblingLås = Optional.ofNullable(koblingTjeneste.taSkrivesLås(ref)); // alltid ta lås før skrive operasjoner
317-
318-
setupLogMdcFraKoblingReferanse(ref);
319-
320-
var kobling = oppdaterKobling(request);
321-
322-
iayTjeneste.kopierGrunnlagFraEksisterendeBehandling(kobling.getYtelseType(), kobling.getAktørId(), new Saksnummer(request.getSaksnummer()),
323-
new KoblingReferanse(request.getGammelReferanse()), new KoblingReferanse(request.getNyReferanse()), request.getDataset(), false);
324-
325-
koblingLås.ifPresent(lås -> koblingTjeneste.oppdaterLåsVersjon(lås));
326-
313+
public Response kopierOgLagreGrunnlagUtenInntektsmeldinger(@NotNull @Valid KopierGrunnlagRequestAbac request) {
314+
kopierOgLagreGrunnlag(request, false);
327315
return Response.ok().build();
328316
}
329317

@@ -335,19 +323,22 @@ public Response kopierOgLagreGrunnlag(@NotNull @Valid KopierGrunnlagRequestAbac
335323
@BeskyttetRessurs(actionType = ActionType.CREATE, resourceType = ResourceType.FAGSAK)
336324
@SuppressWarnings("findsecbugs:JAXRS_ENDPOINT")
337325
public Response kopierOgLagreGrunnlagBeholdIM(@NotNull @Valid KopierGrunnlagRequestAbac request) {
338-
var ref = new KoblingReferanse(request.getNyReferanse());
339-
var koblingLås = Optional.ofNullable(koblingTjeneste.taSkrivesLås(ref)); // alltid ta lås før skrive operasjoner
326+
kopierOgLagreGrunnlag(request, true);
327+
return Response.ok().build();
328+
}
340329

341-
setupLogMdcFraKoblingReferanse(ref);
330+
private void kopierOgLagreGrunnlag(KopierGrunnlagRequestAbac request, boolean beholdInntektsmeldinger) {
331+
var koblingReferanse = new KoblingReferanse(request.getNyReferanse());
332+
var koblingLås = Optional.ofNullable(koblingTjeneste.taSkrivesLås(koblingReferanse));
333+
334+
setupLogMdcFraKoblingReferanse(koblingReferanse);
342335

343336
var kobling = oppdaterKobling(request);
344337

345338
iayTjeneste.kopierGrunnlagFraEksisterendeBehandling(kobling.getYtelseType(), kobling.getAktørId(), new Saksnummer(request.getSaksnummer()),
346-
new KoblingReferanse(request.getGammelReferanse()), new KoblingReferanse(request.getNyReferanse()), request.getDataset(), true);
339+
new KoblingReferanse(request.getGammelReferanse()), new KoblingReferanse(request.getNyReferanse()), request.getDataset(), beholdInntektsmeldinger);
347340

348341
koblingLås.ifPresent(lås -> koblingTjeneste.oppdaterLåsVersjon(lås));
349-
350-
return Response.ok().build();
351342
}
352343

353344
private Date getSistOppdatert(LocalDateTime... tidspunkt) {

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/iay/tjeneste/OppgittOpptjeningRestTjeneste.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ public Response lagreOppgittOpptjening(@NotNull @TilpassetAbacAttributt(supplier
6767
"v1/motta skal ikke ha journalpostId eller innsendingstidspunkt. Skal du egentlig bruke /v2/motta ?").build();
6868
}
6969

70-
Response response;
71-
7270
var koblingReferanse = new KoblingReferanse(mottattRequest.getKoblingReferanse());
7371
var koblingLås = Optional.ofNullable(koblingTjeneste.taSkrivesLås(koblingReferanse));
7472
var aktørId = new AktørId(mottattRequest.getAktør().getIdent());
@@ -81,6 +79,7 @@ public Response lagreOppgittOpptjening(@NotNull @TilpassetAbacAttributt(supplier
8179
koblingTjeneste.lagre(kobling);
8280
koblingLås.ifPresent(lås -> koblingTjeneste.oppdaterLåsVersjon(lås));
8381

82+
Response response;
8483
if (grunnlagReferanse != null) {
8584
response = Response.ok(new UuidDto(grunnlagReferanse.getReferanse())).build();
8685
} else {
@@ -96,7 +95,6 @@ public Response lagreOppgittOpptjening(@NotNull @TilpassetAbacAttributt(supplier
9695
@BeskyttetRessurs(actionType = ActionType.UPDATE, resourceType = ResourceType.FAGSAK)
9796
@SuppressWarnings({"findsecbugs:JAXRS_ENDPOINT", "resource"})
9897
public Response lagreOverstyrtOppgittOpptjening(@NotNull @TilpassetAbacAttributt(supplierClass = AbacDataSupplier.class) @Valid OppgittOpptjeningMottattRequest mottattRequest) {
99-
Response response;
10098
LoggUtil.setupLogMdc(mottattRequest.getYtelseType(), mottattRequest.getSaksnummer(), mottattRequest.getKoblingReferanse());
10199
var koblingReferanse = new KoblingReferanse(mottattRequest.getKoblingReferanse());
102100
var koblingLås = Optional.ofNullable(koblingTjeneste.taSkrivesLås(koblingReferanse));
@@ -110,6 +108,7 @@ public Response lagreOverstyrtOppgittOpptjening(@NotNull @TilpassetAbacAttributt
110108
koblingTjeneste.lagre(kobling);
111109
koblingLås.ifPresent(lås -> koblingTjeneste.oppdaterLåsVersjon(lås));
112110

111+
Response response;
113112
if (grunnlagReferanse != null) {
114113
response = Response.ok(new UuidDto(grunnlagReferanse.getReferanse())).build();
115114
} else {
@@ -125,7 +124,6 @@ public Response lagreOverstyrtOppgittOpptjening(@NotNull @TilpassetAbacAttributt
125124
@BeskyttetRessurs(actionType = ActionType.UPDATE, resourceType = ResourceType.FAGSAK)
126125
@SuppressWarnings({"findsecbugs:JAXRS_ENDPOINT", "resource"})
127126
public Response lagreOppgittOpptjeningOgNullstillOverstyring(@NotNull @TilpassetAbacAttributt(supplierClass = AbacDataSupplier.class) @Valid OppgittOpptjeningMottattRequest mottattRequest) {
128-
Response response;
129127
LoggUtil.setupLogMdc(mottattRequest.getYtelseType(), mottattRequest.getSaksnummer(), mottattRequest.getKoblingReferanse());
130128
var koblingReferanse = new KoblingReferanse(mottattRequest.getKoblingReferanse());
131129
var koblingLås = Optional.ofNullable(koblingTjeneste.taSkrivesLås(koblingReferanse));
@@ -139,6 +137,7 @@ public Response lagreOppgittOpptjeningOgNullstillOverstyring(@NotNull @Tilpasset
139137
koblingTjeneste.lagre(kobling);
140138
koblingLås.ifPresent(lås -> koblingTjeneste.oppdaterLåsVersjon(lås));
141139

140+
Response response;
142141
if (grunnlagReferanse != null) {
143142
response = Response.ok(new UuidDto(grunnlagReferanse.getReferanse())).build();
144143
} else {

domenetjenester/iay/src/main/java/no/nav/foreldrepenger/abakus/registerdata/tjeneste/RegisterdataRestTjeneste.java

-1
Original file line numberDiff line numberDiff line change
@@ -118,5 +118,4 @@ private void leggTil(AbacDataAttributter abac, PersonIdent person) {
118118
}
119119

120120
}
121-
122121
}

domenetjenester/kobling/pom.xml

+9-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,15 @@
3131
<groupId>no.nav.foreldrepenger.felles</groupId>
3232
<artifactId>felles-util</artifactId>
3333
</dependency>
34-
<dependency>
34+
<dependency>
35+
<artifactId>hibernate-core</artifactId>
36+
<groupId>org.hibernate.orm</groupId>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.hibernate.orm</groupId>
40+
<artifactId>hibernate-micrometer</artifactId>
41+
</dependency>
42+
<dependency>
3543
<groupId>no.nav.foreldrepenger.abakus</groupId>
3644
<artifactId>felles</artifactId>
3745
</dependency>

domenetjenester/kobling/src/main/java/no/nav/foreldrepenger/abakus/kobling/Kobling.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public class Kobling extends BaseEntitet implements IndexKey {
7878
* Inaktive koblinger skal ikke kunne endres. Det betyr oftest at koblingsreferansen er avsluttet i fagsystemet også.
7979
*/
8080
@Column(name = "aktiv", nullable = false)
81-
private Boolean aktiv = true;
81+
private boolean aktiv = true;
8282

8383
@Version
8484
@Column(name = "versjon", nullable = false)
@@ -164,4 +164,8 @@ public String toString() {
164164
public boolean erAktiv() {
165165
return aktiv;
166166
}
167+
168+
public void setAktiv(boolean aktiv) {
169+
this.aktiv = aktiv;
170+
}
167171
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package no.nav.foreldrepenger.abakus.kobling;
2+
3+
import java.net.HttpURLConnection;
4+
import java.util.UUID;
5+
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
9+
import com.fasterxml.jackson.annotation.JsonAutoDetect;
10+
import com.fasterxml.jackson.annotation.JsonCreator;
11+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
12+
import com.fasterxml.jackson.annotation.JsonInclude;
13+
import com.fasterxml.jackson.annotation.JsonProperty;
14+
15+
import jakarta.enterprise.context.RequestScoped;
16+
import jakarta.inject.Inject;
17+
import jakarta.transaction.Transactional;
18+
import jakarta.validation.Valid;
19+
import jakarta.validation.constraints.NotNull;
20+
import jakarta.ws.rs.Consumes;
21+
import jakarta.ws.rs.POST;
22+
import jakarta.ws.rs.Path;
23+
import jakarta.ws.rs.Produces;
24+
import jakarta.ws.rs.core.MediaType;
25+
import jakarta.ws.rs.core.Response;
26+
import no.nav.abakus.iaygrunnlag.AktørIdPersonident;
27+
import no.nav.abakus.iaygrunnlag.FnrPersonident;
28+
import no.nav.abakus.iaygrunnlag.PersonIdent;
29+
import no.nav.abakus.iaygrunnlag.kodeverk.YtelseType;
30+
import no.nav.abakus.iaygrunnlag.request.AvsluttGrunnlagRequest;
31+
import no.nav.foreldrepenger.abakus.felles.LoggUtil;
32+
import no.nav.vedtak.sikkerhet.abac.AbacDataAttributter;
33+
import no.nav.vedtak.sikkerhet.abac.AbacDto;
34+
import no.nav.vedtak.sikkerhet.abac.BeskyttetRessurs;
35+
import no.nav.vedtak.sikkerhet.abac.StandardAbacAttributtType;
36+
import no.nav.vedtak.sikkerhet.abac.beskyttet.ActionType;
37+
import no.nav.vedtak.sikkerhet.abac.beskyttet.ResourceType;
38+
39+
@RequestScoped
40+
@Transactional
41+
@Path("/kobling")
42+
public class KoblingRestTjeneste {
43+
44+
private static final Logger LOG = LoggerFactory.getLogger(KoblingRestTjeneste.class);
45+
46+
private KoblingTjeneste koblingTjeneste;
47+
48+
KoblingRestTjeneste() {
49+
// CDI proxy
50+
}
51+
52+
@Inject
53+
public KoblingRestTjeneste(KoblingTjeneste koblingTjeneste) {
54+
this.koblingTjeneste = koblingTjeneste;
55+
}
56+
57+
@POST
58+
@Path("/avslutt")
59+
@Consumes(MediaType.APPLICATION_JSON)
60+
@Produces(MediaType.APPLICATION_JSON)
61+
@BeskyttetRessurs(actionType = ActionType.UPDATE, resourceType = ResourceType.FAGSAK)
62+
public Response deaktiverKobling(@Valid AvsluttGrunnlagRequestAbacDto dto) {
63+
LoggUtil.setupLogMdc(dto.getYtelseType(), dto.getSaksnummer());
64+
if (!YtelseType.abakusYtelser().contains(dto.getYtelseType())) {
65+
return Response.status(HttpURLConnection.HTTP_BAD_REQUEST).build();
66+
}
67+
var koblingReferanse = new KoblingReferanse(dto.getReferanse());
68+
var koblingLås = koblingTjeneste.taSkrivesLås(koblingReferanse);
69+
var kobling = koblingTjeneste.hentFor(koblingReferanse)
70+
.orElseThrow(() -> new IllegalStateException("Kobling som skal deaktiveres finnes ikke."));
71+
72+
if (dto.getSaksnummer().equals(kobling.getSaksnummer().getVerdi())) {
73+
LOG.warn("Prøver å avslutte kobling på feil saksnummer {}", dto.getSaksnummer());
74+
throw new IllegalStateException("Prøver å avslutte kobling på feil saksnummer");
75+
}
76+
77+
if (dto.getYtelseType().equals(kobling.getYtelseType())) {
78+
LOG.warn("Prøver å avslutte kobling på feil ytelsetype {}", dto.getYtelseType());
79+
throw new IllegalStateException("Prøver å avslutte kobling på feil ytelsetype");
80+
}
81+
82+
if (dto.getAktør().getIdent().equals(kobling.getAktørId().getId())) {
83+
LOG.warn("Prøver å avslutte kobling på feil aktør {}", dto.getAktør().getIdent());
84+
throw new IllegalStateException("Prøver å avslutte kobling på feil aktør");
85+
}
86+
87+
koblingTjeneste.deaktiver(koblingReferanse);
88+
koblingTjeneste.oppdaterLåsVersjon(koblingLås);
89+
90+
return Response.ok().build();
91+
}
92+
93+
/**
94+
* Json bean med Abac.
95+
*/
96+
@JsonIgnoreProperties(ignoreUnknown = true)
97+
@JsonInclude(value = JsonInclude.Include.NON_ABSENT, content = JsonInclude.Include.NON_EMPTY)
98+
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
99+
public static class AvsluttGrunnlagRequestAbacDto extends AvsluttGrunnlagRequest implements AbacDto {
100+
101+
@JsonCreator
102+
public AvsluttGrunnlagRequestAbacDto(@JsonProperty(value = "saksnummer", required = true) @Valid @NotNull String saksnummer,
103+
@JsonProperty(value = "referanse", required = true) @Valid @NotNull UUID referanse,
104+
@JsonProperty(value = "ytelseType", required = true) @NotNull YtelseType ytelseType,
105+
@JsonProperty(value = "aktør", required = true) @NotNull @Valid PersonIdent aktør) {
106+
super(saksnummer, referanse, ytelseType, aktør);
107+
}
108+
109+
@Override
110+
public AbacDataAttributter abacAttributter() {
111+
return lagAbacAttributter(getAktør());
112+
}
113+
}
114+
115+
private static AbacDataAttributter lagAbacAttributter(PersonIdent person) {
116+
var abacDataAttributter = AbacDataAttributter.opprett();
117+
String ident = person.getIdent();
118+
String identType = person.getIdentType();
119+
if (FnrPersonident.IDENT_TYPE.equals(identType)) {
120+
return abacDataAttributter.leggTil(StandardAbacAttributtType.FNR, ident);
121+
} else if (AktørIdPersonident.IDENT_TYPE.equals(identType)) {
122+
return abacDataAttributter.leggTil(StandardAbacAttributtType.AKTØR_ID, ident);
123+
}
124+
throw new java.lang.IllegalStateException("Ukjent identtype" + identType);
125+
}
126+
}

domenetjenester/kobling/src/main/java/no/nav/foreldrepenger/abakus/kobling/KoblingTjeneste.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ public KoblingTjeneste(KoblingRepository repository, LåsRepository låsReposito
2929
public Kobling finnEllerOpprett(YtelseType ytelseType, KoblingReferanse referanse, AktørId aktørId, Saksnummer saksnummer) {
3030
Kobling kobling = repository.hentForKoblingReferanse(referanse, true)
3131
.orElseGet(() -> new Kobling(ytelseType, saksnummer, referanse, aktørId));
32-
repository.lagre(kobling);
32+
// Lagre kun hvis ny
33+
if (kobling.getId() == null) {
34+
repository.lagre(kobling);
35+
}
3336
return kobling;
3437
}
3538

@@ -49,6 +52,12 @@ public Kobling hent(Long koblingId) {
4952
return repository.hentForKoblingId(koblingId);
5053
}
5154

55+
public void deaktiver(KoblingReferanse referanse) {
56+
var kobling = repository.hentForKoblingReferanse(referanse, true).orElseThrow();
57+
kobling.setAktiv(false);
58+
repository.lagre(kobling);
59+
}
60+
5261
public KoblingLås taSkrivesLås(KoblingReferanse referanse) {
5362
return repository.hentForKoblingReferanse(referanse, true).map(Kobling::getId).map(KoblingLås::new).orElse(null);
5463
}

0 commit comments

Comments
 (0)