Skip to content

Commit 94d874c

Browse files
authored
Legg til historikk-felt i AlderspensjonVedtakDTO og oppdater relatert… (#3956)
1 parent c075a0e commit 94d874c

File tree

4 files changed

+102
-41
lines changed

4 files changed

+102
-41
lines changed

apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/domain/AlderspensjonVedtakDTO.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package no.nav.dolly.bestilling.pensjonforvalter.domain;
22

33
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
45
import lombok.Data;
56
import lombok.EqualsAndHashCode;
67
import lombok.NoArgsConstructor;
78
import lombok.ToString;
89
import lombok.experimental.SuperBuilder;
910

1011
import java.time.LocalDate;
12+
import java.util.ArrayList;
13+
import java.util.List;
1114

1215
@Data
1316
@SuperBuilder
@@ -21,4 +24,7 @@ public class AlderspensjonVedtakDTO extends AlderspensjonVedtakRequest {
2124

2225
private LocalDate datoForrigeGraderteUttak;
2326
private Integer nyUttaksgrad;
27+
28+
@Builder.Default
29+
private List<AlderspensjonVedtakDTO> historikk = new ArrayList<>();
2430
}

apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/service/PensjonPersondataService.java

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import reactor.core.publisher.Flux;
2424
import reactor.core.publisher.Mono;
2525

26+
import java.time.LocalDate;
2627
import java.util.List;
2728
import java.util.Set;
2829

@@ -114,7 +115,7 @@ private Flux<PensjonforvalterResponse> revurderingVedNySivilstand(String ident,
114115
}
115116

116117
return Flux.fromIterable(miljoer)
117-
.flatMap(miljoe -> pensjonforvalterHelper.hentSisteVedtakAP(ident, miljoe)
118+
.flatMap(miljoe -> pensjonforvalterHelper.hentForrigeVedtakAP(ident, miljoe, getSivilstandDato(bestilling))
118119
.flatMap(vedtak -> {
119120
var context = new MappingContext.Factory().getContext();
120121
context.setProperty(NAV_ENHET, navEnhetId);
@@ -129,35 +130,53 @@ private Flux<PensjonforvalterResponse> revurderingVedNySivilstand(String ident,
129130
.flatMapMany(tuple -> {
130131
if (isRevurderingValid(tuple.getT1(), tuple.getT2())) {
131132
return pensjonforvalterConsumer.lagreRevurderingVedtak(tuple.getT1())
132-
.flatMap(response ->
133+
.flatMap(response -> isNoMatch(tuple.getT2(), tuple.getT1()) ?
133134
pensjonforvalterHelper.saveTransaksjonId(ident, miljoe,
134135
bestilling.getId(), SystemTyper.PEN_AP_REVURDERING, tuple.getT1())
135-
.thenReturn(response));
136+
.thenReturn(response) :
137+
Mono.just(response));
136138
} else {
137139

138140
return miscRevurderingResponse(tuple.getT1(), tuple.getT2(), miljoe, isUpdateEndre);
139141
}
140142
}));
141143
}
142144

143-
private static boolean isRevurderingValid(RevurderingVedtakRequest request, AlderspensjonVedtakDTO response) {
145+
private static LocalDate getSivilstandDato(RsDollyBestilling bestilling) {
146+
147+
var sivilstand = bestilling.getPdldata().getPerson().getSivilstand().getFirst();
148+
if (nonNull(sivilstand.getSivilstandsdato())) {
149+
return sivilstand.getSivilstandsdato().toLocalDate();
150+
} else if (nonNull(sivilstand.getBekreftelsesdato())) {
151+
return sivilstand.getBekreftelsesdato().toLocalDate();
152+
} else {
153+
return null;
154+
}
155+
}
144156

145-
var eksisterendeFom = nonNull(response.getFom()) ? response.getFom() : response.getIverksettelsesdato();
157+
private static boolean isNoMatch(AlderspensjonVedtakDTO response, RevurderingVedtakRequest request) {
146158

147-
return nonNull(request.getFom()) && request.getFom().isAfter(eksisterendeFom);
159+
return !response.getFom().equals(request.getFom()) &&
160+
response.getHistorikk().stream()
161+
.noneMatch(historikk ->
162+
historikk.getFom().equals(request.getFom()));
163+
}
164+
165+
private static boolean isRevurderingValid(RevurderingVedtakRequest request, AlderspensjonVedtakDTO response) {
166+
167+
return nonNull(response.getFom()) && nonNull(request.getFom()) &&
168+
request.getFom().isAfter(response.getFom());
148169
}
149170

150171
private static Mono<PensjonforvalterResponse> miscRevurderingResponse(RevurderingVedtakRequest request,
151172
AlderspensjonVedtakDTO response, String miljoe,
152173
boolean isUpdateEndre) {
153174

154-
var eksisterendeFom = nonNull(response.getFom()) ? response.getFom() : response.getIverksettelsesdato();
155-
156175
String message;
157176
if (isUpdateEndre && isNull(request.getFom())) {
158177
message = "Automatisk revurderingsvedtak ikke mulig når dato for sivilstandsendring mangler.";
159178

160-
} else if (isUpdateEndre && request.getFom().isBefore(eksisterendeFom)) {
179+
} else if (isUpdateEndre && request.getFom().isBefore(response.getFom())) {
161180
message = "Automatisk revurderingsvedtak ikke mulig når dato for sivilstandsendring er før dato på forrige vedtak.";
162181

163182
} else {
@@ -172,7 +191,7 @@ private static Mono<PensjonforvalterResponse> miscRevurderingResponse(Revurderin
172191
.build())
173192
.message(message)
174193
.build())
175-
.miljo(miljoe)
194+
.miljo(miljoe)
176195
.build()))
177196
.build());
178197
}

apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/service/PensjonVedtakService.java

Lines changed: 46 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import java.util.List;
2929
import java.util.Set;
3030

31+
import static java.util.Objects.isNull;
32+
import static java.util.Objects.nonNull;
3133
import static no.nav.dolly.bestilling.pensjonforvalter.utils.PensjonforvalterUtils.IDENT;
3234
import static no.nav.dolly.bestilling.pensjonforvalter.utils.PensjonforvalterUtils.MILJOER;
3335
import static no.nav.dolly.bestilling.pensjonforvalter.utils.PensjonforvalterUtils.NAV_ENHET;
@@ -36,8 +38,6 @@
3638
import static no.nav.dolly.bestilling.pensjonforvalter.utils.PensjonforvalterUtils.PEN_UFORETRYGD;
3739
import static no.nav.dolly.bestilling.pensjonforvalter.utils.PensjonforvalterUtils.getStatus;
3840
import static no.nav.dolly.bestilling.pensjonforvalter.utils.PensjonforvalterUtils.hasVedtak;
39-
import static no.nav.dolly.domain.resultset.SystemTyper.PEN_AP;
40-
import static no.nav.dolly.domain.resultset.SystemTyper.PEN_UT;
4141
import static org.apache.commons.lang3.BooleanUtils.isTrue;
4242

4343
@Slf4j
@@ -119,8 +119,9 @@ private Flux<PensjonforvalterResponse> lagreAlderspensjon(PensjonData pensjonDat
119119
Flux.fromIterable(response.getStatus())
120120
.filter(status -> status.getResponse().isResponse2xx())
121121
.flatMap(status ->
122-
pensjonforvalterHelper.saveAPTransaksjonId(ident, status.getMiljo(), bestillingId,
123-
PEN_AP, pensjonRequest))
122+
pensjonforvalterHelper.saveAPTransaksjonId(ident,
123+
status.getMiljo(), bestillingId,
124+
pensjonRequest))
124125
.then(Mono.just(response)));
125126

126127
} else {
@@ -151,8 +152,9 @@ private Flux<PensjonforvalterResponse> lagreUforetrygd(PensjonData pensjondata,
151152
.flatMap(response -> Flux.fromIterable(response.getStatus())
152153
.filter(status -> status.getResponse().isResponse2xx())
153154
.flatMap(status ->
154-
pensjonforvalterHelper.saveAPTransaksjonId(ident, status.getMiljo(), bestillingId,
155-
PEN_UT, request))
155+
pensjonforvalterHelper.saveUTTransaksjonId(ident,
156+
status.getMiljo(), bestillingId,
157+
request))
156158
.then(Mono.just(response))));
157159

158160
} else {
@@ -169,7 +171,8 @@ private Flux<PensjonforvalterResponse> lagreNyVurdering(PensjonData pensjondata,
169171
}
170172

171173
return Flux.fromIterable(miljoer)
172-
.flatMap(miljoe -> pensjonforvalterHelper.hentSisteVedtakAP(ident, miljoe)
174+
.flatMap(miljoe -> pensjonforvalterHelper.hentForrigeVedtakAP(ident, miljoe,
175+
pensjondata.getAlderspensjonNyUtaksgrad().getFom())
173176
.flatMap(vedtak -> {
174177
var context = new MappingContext.Factory().getContext();
175178
context.setProperty(ALDERSPENSJON_VEDTAK, vedtak);
@@ -178,37 +181,55 @@ private Flux<PensjonforvalterResponse> lagreNyVurdering(PensjonData pensjondata,
178181
AlderspensjonNyUtaksgradRequest.class, context))
179182
.zipWith(Mono.just(vedtak));
180183
})
181-
.flatMapMany(tuple ->
182-
isValid(tuple.getT1(), tuple.getT2()) ?
183-
pensjonforvalterConsumer.lagreAPNyUttaksgrad(tuple.getT1())
184-
.zipWith(Mono.just(tuple.getT1()))
185-
.flatMap(tuple2 -> Flux.fromIterable(tuple2.getT1().getStatus())
186-
.filter(status -> status.getResponse().isResponse2xx())
187-
.flatMap(status ->
184+
.flatMapMany(tuple -> {
185+
if (isValid(tuple.getT1(), tuple.getT2())) {
186+
return pensjonforvalterConsumer.lagreAPNyUttaksgrad(tuple.getT1())
187+
.flatMap(response -> Flux.fromIterable(response.getStatus())
188+
.filter(status -> status.getResponse().isResponse2xx())
189+
.flatMap(status ->
190+
isNoMatch(tuple.getT2(), tuple.getT1()) ?
188191
pensjonforvalterHelper.saveTransaksjonId(ident, status.getMiljo(), bestilling.getId(),
189-
SystemTyper.PEN_AP_NY_UTTAKSGRAD, tuple2.getT2())
190-
.thenReturn(tuple2.getT1()))) :
191-
miscRevurderingResponse(tuple.getT1(), tuple.getT2(), miljoe, isUpdateEndre)));
192+
SystemTyper.PEN_AP_NY_UTTAKSGRAD, tuple.getT1())
193+
.thenReturn(response) :
194+
Mono.just(response)));
195+
} else {
196+
return miscRevurderingResponse(tuple.getT1(), tuple.getT2(), miljoe, isUpdateEndre);
197+
}
198+
}));
199+
}
200+
201+
private static boolean isNoMatch(AlderspensjonVedtakDTO response, AlderspensjonNyUtaksgradRequest request) {
202+
203+
return !(response.getFom().equals(request.getFom()) &&
204+
response.getUttaksgrad().equals(request.getNyUttaksgrad())) &&
205+
response.getHistorikk().stream()
206+
.noneMatch(historikk ->
207+
historikk.getFom().equals(request.getFom()) &&
208+
historikk.getUttaksgrad().equals(request.getNyUttaksgrad()));
192209
}
193210

194211
private static boolean isValid(AlderspensjonNyUtaksgradRequest request, AlderspensjonVedtakDTO response) {
195212

196-
return request.getFom().isAfter(response.getFom()) &&
213+
return nonNull(response.getFom()) &&
214+
request.getFom().isAfter(response.getFom()) &&
197215
(request.getNyUttaksgrad().equals(0) || request.getNyUttaksgrad().equals(100) ||
198216
Period.between(response.getDatoForrigeGraderteUttak(), request.getFom()).getYears() >= 1);
199217
}
200218

201219
private static Mono<PensjonforvalterResponse> miscRevurderingResponse(AlderspensjonNyUtaksgradRequest request,
202-
AlderspensjonVedtakDTO response, String miljoe,
220+
AlderspensjonVedtakDTO response, String miljoe,
203221
boolean isUpdateEndre) {
204222

205223
String message;
206-
if (isUpdateEndre && request.getFom().isBefore(response.getFom())) {
207-
message = "Automatisk vedtak av ny uttaksgrad ikke mulig for dato tidligere enn dato på forrige vedtak.";
224+
if (isNull(response.getFom())) {
225+
message = "Uttaksgrad kan ikke endres da vedtak for alderspensjon mangler.";
226+
227+
}else if (isUpdateEndre && request.getFom().isBefore(response.getFom())) {
228+
message = "Automatisk vedtak av ny uttaksgrad ikke mulig for dato tidligere enn dato på forrige vedtak.";
208229

209-
} else if (isUpdateEndre && !request.getNyUttaksgrad().equals(0) && !request.getNyUttaksgrad().equals(100) &&
210-
Period.between(response.getDatoForrigeGraderteUttak(), request.getFom()).getYears() < 1) {
211-
message = "Automatisk vedtak med gradert uttak ikke mulig oftere enn hver 12 måned.";
230+
} else if (isUpdateEndre && !request.getNyUttaksgrad().equals(0) && !request.getNyUttaksgrad().equals(100) &&
231+
Period.between(response.getDatoForrigeGraderteUttak(), request.getFom()).getYears() < 1) {
232+
message = "Automatisk vedtak med gradert uttak ikke mulig oftere enn hver 12 måned.";
212233

213234
} else {
214235
return Mono.empty();
@@ -222,7 +243,7 @@ private static Mono<PensjonforvalterResponse> miscRevurderingResponse(Alderspens
222243
.build())
223244
.message(message)
224245
.build())
225-
.miljo(miljoe)
246+
.miljo(miljoe)
226247
.build()))
227248
.build());
228249
}

apps/dolly-backend/src/main/java/no/nav/dolly/bestilling/pensjonforvalter/utils/PensjonforvalterHelper.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
import org.springframework.stereotype.Service;
1616
import reactor.core.publisher.Mono;
1717

18+
import java.time.LocalDate;
1819
import java.time.LocalDateTime;
1920
import java.util.Comparator;
2021
import java.util.Set;
2122
import java.util.concurrent.atomic.AtomicReference;
2223
import java.util.stream.Collectors;
2324

25+
import static java.util.Objects.isNull;
2426
import static java.util.Objects.nonNull;
2527
import static no.nav.dolly.bestilling.pensjonforvalter.utils.PensjonforvalterUtils.basicAlderspensjonRequestDTO;
2628
import static no.nav.dolly.errorhandling.ErrorStatusDecoder.encodeStatus;
@@ -36,18 +38,28 @@ public class PensjonforvalterHelper {
3638
private final TransaksjonMappingService transaksjonMappingService;
3739

3840
@SuppressWarnings("java:S3740")
39-
public Mono<TransaksjonMapping> saveAPTransaksjonId(String ident, String miljoe, Long bestillingId,
40-
SystemTyper type, PensjonTransaksjonId vedtak) {
41+
public Mono<TransaksjonMapping> saveUTTransaksjonId(String ident, String miljoe,
42+
Long bestillingId,
43+
PensjonTransaksjonId vedtak) {
4144

42-
log.info("Lagrer transaksjon for {} i {} ", ident, miljoe);
45+
return transaksjonMappingService.delete(ident, miljoe, SystemTyper.PEN_UT.name())
46+
.then(saveTransaksjonId(ident, miljoe, bestillingId, SystemTyper.PEN_UT, vedtak));
47+
}
4348

44-
return transaksjonMappingService.delete(ident, miljoe, type.name())
45-
.then(saveTransaksjonId(ident, miljoe, bestillingId, type, vedtak));
49+
public Mono<TransaksjonMapping> saveAPTransaksjonId(String ident, String miljoe,
50+
Long bestillingId,
51+
PensjonTransaksjonId vedtak) {
52+
53+
return transaksjonMappingService.delete(ident, miljoe, SystemTyper.PEN_AP.name())
54+
.then(transaksjonMappingService.delete(ident, miljoe, SystemTyper.PEN_AP_REVURDERING.name()))
55+
.then(transaksjonMappingService.delete(ident, miljoe, SystemTyper.PEN_AP_NY_UTTAKSGRAD.name()))
56+
.then(saveTransaksjonId(ident, miljoe, bestillingId, SystemTyper.PEN_AP, vedtak));
4657
}
4758

4859
public Mono<TransaksjonMapping> saveTransaksjonId(String ident, String miljoe, Long bestillingId,
4960
SystemTyper type, PensjonTransaksjonId vedtak) {
5061

62+
log.info("Lagrer transaksjon for {} i {} ", ident, miljoe);
5163
return transaksjonMappingService.save(
5264
TransaksjonMapping.builder()
5365
.ident(ident)
@@ -98,7 +110,7 @@ public String getError(PensjonforvalterResponse.ResponseEnvironment entry) {
98110
}
99111
}
100112

101-
public Mono<AlderspensjonVedtakDTO> hentSisteVedtakAP(String ident, String miljoe) {
113+
public Mono<AlderspensjonVedtakDTO> hentForrigeVedtakAP(String ident, String miljoe, LocalDate fomDato) {
102114

103115
return transaksjonMappingService.getTransaksjonMapping(ident, miljoe)
104116
.filter(transaksjonMapping -> transaksjonMapping.getSystem().contains("AP"))
@@ -114,6 +126,8 @@ public Mono<AlderspensjonVedtakDTO> hentSisteVedtakAP(String ident, String miljo
114126
return basicAlderspensjonRequestDTO(ident, Set.of(miljoe));
115127
}
116128
})
129+
.filter(vedtak -> isNull(vedtak.getFom()) || isNull(fomDato) ||
130+
vedtak.getFom().isBefore(fomDato))
117131
.collectList()
118132
.map(vedtaker -> {
119133
if (vedtaker.isEmpty()) {
@@ -127,6 +141,7 @@ public Mono<AlderspensjonVedtakDTO> hentSisteVedtakAP(String ident, String miljo
127141
.forEach(vedtak -> datoGradertUttak.set(vedtak.getFom()));
128142

129143
vedtaker.getLast().setDatoForrigeGraderteUttak(datoGradertUttak.get());
144+
vedtaker.getLast().setHistorikk(vedtaker.subList(0, vedtaker.size() - 1));
130145
return vedtaker.getLast();
131146
});
132147
}

0 commit comments

Comments
 (0)