Skip to content

Commit 6d10a53

Browse files
authored
Fix OMP søknadsvalidator - tillater samtidige perioder for ulike aktiviteter (#306)
1 parent d570be7 commit 6d10a53

File tree

3 files changed

+108
-22
lines changed

3 files changed

+108
-22
lines changed

soknad/src/main/java/no/nav/k9/søknad/ytelse/omsorgspenger/v1/OmsorgspengerUtbetalingValidator.java

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22

33
import java.time.Duration;
44
import java.util.ArrayList;
5-
import java.util.LinkedHashMap;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
67
import java.util.List;
78
import java.util.Map;
89
import java.util.Objects;
910
import java.util.Optional;
11+
import java.util.Set;
1012

13+
import no.nav.fpsak.tidsserie.LocalDateSegment;
14+
import no.nav.fpsak.tidsserie.LocalDateTimeline;
1115
import no.nav.k9.søknad.PeriodeValidator;
1216
import no.nav.k9.søknad.felles.Feil;
1317
import no.nav.k9.søknad.felles.Versjon;
@@ -205,27 +209,84 @@ private List<Feil> validerBosteder(OmsorgspengerUtbetaling ytelse) {
205209
feil.addAll(validerKorrigerIMIkkeFulltFravær(index, fraværPeriode));
206210
index++;
207211
}
208-
feil.addAll(validerIkkeLikeEllerOverlappendePerioder(fraværsperioderKorrigeringIm, "fraværsperioderKorrigeringIm.perioder"));
212+
feil.addAll(validerIkkeLikeEllerOverlappendePerioder(fraværsperioderKorrigeringIm));
209213
return feil;
210214
}
211215

212-
private List<Feil> validerIkkeLikeEllerOverlappendePerioder(List<FraværPeriode> fraværPerioder, String feltnavn) {
216+
private List<Feil> validerIkkeLikeEllerOverlappendePerioder(List<FraværPeriode> fraværPerioder) {
213217
List<Feil> feil = new ArrayList<>();
214-
Map<Periode, Organisasjonsnummer> perioder = new LinkedHashMap<>();
218+
Set<Periode> perioder = new HashSet<>();
215219
for (FraværPeriode fraværPeriode : fraværPerioder) {
216-
if (perioder.containsKey(fraværPeriode.getPeriode())) {
217-
feil.add(new Feil(feltnavn + "[" + fraværPeriode.getPeriode().getIso8601() + "]", "likePerioder", "To identiske perioder oppgitt"));
220+
if (perioder.contains(fraværPeriode.getPeriode())) {
221+
feil.add(new Feil("fraværsperioderKorrigeringIm.perioder[" + fraværPeriode.getPeriode().getIso8601() + "]", "likePerioder", "To identiske perioder oppgitt"));
218222
} else {
219-
perioder.put(fraværPeriode.getPeriode(), fraværPeriode.getArbeidsgiverOrgNr());
223+
perioder.add(fraværPeriode.getPeriode());
220224
}
221225
}
222226
if (feil.stream().noneMatch(it -> it.getFeilkode().equals("likePerioder"))) {
223-
// Valider perioder på tvers
224-
feil.addAll(periodeValidator.validerIkkeTillattOverlapp(perioder, feltnavn));
227+
feil.addAll(validerOverlappendePerioderKorrigerIm(fraværPerioder));
225228
}
226229
return feil;
227230
}
228231

232+
private List<Feil> validerOverlappendePerioderPrAktivitet(List<FraværPeriode> fraværPerioder) {
233+
List<Feil> feil = new ArrayList<>();
234+
Map<Aktivitet, List<LocalDateSegment<Integer>>> perioderPrAktivitet = new HashMap<>();
235+
Map<Aktivitet, Set<Periode>> unikePerioderPrAktivitet = new HashMap<>();
236+
int index = 0;
237+
for (FraværPeriode fraværPeriode : fraværPerioder) {
238+
for (AktivitetFravær aktivitetType : fraværPeriode.getAktivitetFravær()) {
239+
Aktivitet aktivitet = new Aktivitet(aktivitetType, fraværPeriode.getArbeidsgiverOrgNr());
240+
Set<Periode> unikePerioder = unikePerioderPrAktivitet.computeIfAbsent(aktivitet, k -> new HashSet<>());
241+
if (unikePerioder.contains(fraværPeriode.getPeriode())) {
242+
feil.add(new Feil("fraværsperioder[" + fraværPeriode.getPeriode().getIso8601() + "]", "likePerioder", "To identiske perioder oppgitt for aktivitettype " + (aktivitetType != null ? aktivitetType.getÅrsak() : null)));
243+
} else {
244+
unikePerioder.add(fraværPeriode.getPeriode());
245+
perioderPrAktivitet
246+
.computeIfAbsent(aktivitet, k -> new ArrayList<>())
247+
.add(new LocalDateSegment<>(fraværPeriode.getPeriode().getFraOgMed(), fraværPeriode.getPeriode().getTilOgMed(), index));
248+
}
249+
}
250+
index++;
251+
}
252+
for (var entry : perioderPrAktivitet.entrySet()) {
253+
LocalDateTimeline<List<Integer>> overlappendeFraværsperioder = LocalDateTimeline.buildGroupOverlappingSegments(entry.getValue())
254+
.filterValue(v -> v.size() > 1);
255+
256+
overlappendeFraværsperioder.stream()
257+
.forEach(overlapp -> feil.add(new Feil(
258+
"fraværsperioder" + overlapp.getValue(),
259+
"overlappendePerioder",
260+
"Overlappende periode " + new Periode(overlapp.getFom(), overlapp.getTom()).getIso8601() + " for aktivitetstype: " + (entry.getKey().aktivitetType != null ? entry.getKey().aktivitetType.getÅrsak() : null)
261+
)));
262+
}
263+
return feil;
264+
}
265+
266+
private List<Feil> validerOverlappendePerioderKorrigerIm(List<FraværPeriode> fraværPerioder) {
267+
List<Feil> feil = new ArrayList<>();
268+
List<LocalDateSegment<Integer>> perioder = new ArrayList<>();
269+
int index = 0;
270+
for (FraværPeriode fraværPeriode : fraværPerioder) {
271+
perioder.add(new LocalDateSegment<>(fraværPeriode.getPeriode().getFraOgMed(), fraværPeriode.getPeriode().getTilOgMed(), index));
272+
index++;
273+
}
274+
275+
LocalDateTimeline<List<Integer>> overlappendePerioder = LocalDateTimeline.buildGroupOverlappingSegments(perioder)
276+
.filterValue(v -> v.size() > 1);
277+
278+
overlappendePerioder.stream()
279+
.forEach(overlapp -> feil.add(new Feil(
280+
"fraværsperioderKorrigeringIm.perioder" + overlapp.getValue(),
281+
"overlappendePerioder",
282+
"Overlappende periode " + new Periode(overlapp.getFom(), overlapp.getTom()).getIso8601()
283+
)));
284+
return feil;
285+
}
286+
287+
private record Aktivitet(AktivitetFravær aktivitetType, Organisasjonsnummer arbeidsgiverOrgNr) {
288+
}
289+
229290
private List<Feil> validerKorrigerIMIkkeFulltFravær(int index, FraværPeriode fraværPeriode) {
230291
if (Versjon.of("1.0.0").equals(versjon)) {
231292
return validerKorrigerIMIkkeFulltFraværV1_0_0(index, fraværPeriode);
@@ -298,7 +359,7 @@ private List<Feil> validerIkkeLikeEllerOverlappendePerioder(List<FraværPeriode>
298359
index++;
299360
}
300361
if (!Versjon.of("1.0.0").equals(versjon)) {
301-
feil.addAll(validerIkkeLikeEllerOverlappendePerioder(fraværsperioder, "fraværsperioder"));
362+
feil.addAll(validerOverlappendePerioderPrAktivitet(fraværsperioder));
302363
}
303364
return feil;
304365
}

soknad/src/test/java/no/nav/k9/søknad/ytelse/omsorgspenger/v1/OmsorgspengerUtbetalingValidatorTest.java

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ void skal_returnere_feil_for_nulling_som_overstiger_enkeltdag() {
100100
}
101101

102102
@Test
103-
void skal_returnere_feil_for_overlappende_perioder() {
103+
void skal_returnere_feil_for_overlappende_perioder_ved_korrigering_IM() {
104104
var fraværPeriode1 = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
105105
var fraværPeriode2 = new Periode(LocalDate.parse("2021-09-02"), LocalDate.parse("2021-09-03"));
106106

@@ -111,8 +111,22 @@ void skal_returnere_feil_for_overlappende_perioder() {
111111
var feil = validatorSøknad.valider(ytelse);
112112

113113

114-
assertThat(feil).hasSize(2);
115-
feilInneholder(feil, "fraværsperioderKorrigeringIm.perioder[2021-09-01/2021-09-02]", "overlappendePerioder");
114+
assertThat(feil).hasSize(1);
115+
feilInneholder(feil, "fraværsperioderKorrigeringIm.perioder[0, 1]", "overlappendePerioder");
116+
}
117+
118+
@Test
119+
void skal_være_lov_å_ha_fravær_fra_flere_arbeidsgivere_samtidig() {
120+
var fraværPeriode1 = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
121+
var fraværPeriode2 = new Periode(LocalDate.parse("2021-09-02"), LocalDate.parse("2021-09-03"));
122+
123+
OmsorgspengerUtbetaling ytelse = byggOmsorgspengerUtbetalingSøknadBruker(
124+
lagSøknadsperiode(orgnr1, fraværPeriode1, null),
125+
lagSøknadsperiode(orgnr2, fraværPeriode2, null));
126+
127+
var feil = validatorSøknad.valider(ytelse);
128+
129+
assertThat(feil).isEmpty();
116130
}
117131

118132
@Test
@@ -131,6 +145,22 @@ void skal_returnere_feil_for_identiske_perioder() {
131145
feilInneholder(feil, "fraværsperioderKorrigeringIm.perioder[2021-09-01/2021-09-02]", "likePerioder");
132146
}
133147

148+
@Test
149+
void skal_returnere_feil_for_identiske_perioder_søknad() {
150+
151+
var fraværPeriode1 = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
152+
var fraværPeriode2 = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
153+
154+
OmsorgspengerUtbetaling ytelse = byggOmsorgspengerUtbetalingSøknadBruker(
155+
lagSøknadsperiode(orgnr1, fraværPeriode1, null),
156+
lagSøknadsperiode(orgnr1, fraværPeriode2, null));
157+
158+
var feil = validatorSøknad.valider(ytelse);
159+
160+
assertThat(feil).hasSize(1);
161+
feilInneholder(feil, "fraværsperioder[2021-09-01/2021-09-02]", "likePerioder");
162+
}
163+
134164
@Test
135165
void skal_returnere_feil_for_flere_orgnr() {
136166
var fraværPeriode1 = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
@@ -194,9 +224,8 @@ void skal_ikke_tillate_overlappende_periode() {
194224

195225
var feil = validatorSøknad.valider(ytelse);
196226

197-
assertThat(feil).hasSize(2);
198-
feilInneholder(feil, "fraværsperioder[2021-09-01/2021-09-02]", "overlappendePerioder");
199-
feilInneholder(feil, "fraværsperioder[2021-09-02/2021-09-03]", "overlappendePerioder");
227+
assertThat(feil).hasSize(1);
228+
feilInneholder(feil, "fraværsperioder[0, 1]", "overlappendePerioder");
200229
}
201230

202231
@Test

soknad/src/test/java/no/nav/k9/søknad/ytelse/omsorgspenger/v1/OmsorgspengerUtbetalingValidatorV1_0_0Test.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,12 @@
1111
import java.util.Arrays;
1212
import java.util.List;
1313

14-
import org.junit.jupiter.api.Disabled;
1514
import org.junit.jupiter.api.Test;
1615

1716
import no.nav.k9.søknad.Søknad;
1817
import no.nav.k9.søknad.felles.Versjon;
1918
import no.nav.k9.søknad.felles.fravær.AktivitetFravær;
20-
import no.nav.k9.søknad.felles.fravær.DelvisFravær;
2119
import no.nav.k9.søknad.felles.fravær.FraværPeriode;
22-
import no.nav.k9.søknad.felles.fravær.FraværÅrsak;
23-
import no.nav.k9.søknad.felles.fravær.SøknadÅrsak;
2420
import no.nav.k9.søknad.felles.opptjening.OpptjeningAktivitet;
2521
import no.nav.k9.søknad.felles.type.Organisasjonsnummer;
2622
import no.nav.k9.søknad.felles.type.Periode;
@@ -121,8 +117,8 @@ void skal_returnere_feil_for_overlappende_perioder() {
121117
var feil = validatorSøknad.valider(ytelse);
122118

123119

124-
assertThat(feil).hasSize(2);
125-
feilInneholder(feil, "fraværsperioderKorrigeringIm.perioder[2021-09-01/2021-09-02]", "overlappendePerioder");
120+
assertThat(feil).hasSize(1);
121+
feilInneholder(feil, "fraværsperioderKorrigeringIm.perioder[0, 1]", "overlappendePerioder");
126122
}
127123

128124
@Test

0 commit comments

Comments
 (0)