|
2 | 2 |
|
3 | 3 | import java.time.Duration;
|
4 | 4 | import java.util.ArrayList;
|
5 |
| -import java.util.LinkedHashMap; |
| 5 | +import java.util.HashMap; |
| 6 | +import java.util.HashSet; |
6 | 7 | import java.util.List;
|
7 | 8 | import java.util.Map;
|
8 | 9 | import java.util.Objects;
|
9 | 10 | import java.util.Optional;
|
| 11 | +import java.util.Set; |
10 | 12 |
|
| 13 | +import no.nav.fpsak.tidsserie.LocalDateSegment; |
| 14 | +import no.nav.fpsak.tidsserie.LocalDateTimeline; |
11 | 15 | import no.nav.k9.søknad.PeriodeValidator;
|
12 | 16 | import no.nav.k9.søknad.felles.Feil;
|
13 | 17 | import no.nav.k9.søknad.felles.Versjon;
|
@@ -205,27 +209,84 @@ private List<Feil> validerBosteder(OmsorgspengerUtbetaling ytelse) {
|
205 | 209 | feil.addAll(validerKorrigerIMIkkeFulltFravær(index, fraværPeriode));
|
206 | 210 | index++;
|
207 | 211 | }
|
208 |
| - feil.addAll(validerIkkeLikeEllerOverlappendePerioder(fraværsperioderKorrigeringIm, "fraværsperioderKorrigeringIm.perioder")); |
| 212 | + feil.addAll(validerIkkeLikeEllerOverlappendePerioder(fraværsperioderKorrigeringIm)); |
209 | 213 | return feil;
|
210 | 214 | }
|
211 | 215 |
|
212 |
| - private List<Feil> validerIkkeLikeEllerOverlappendePerioder(List<FraværPeriode> fraværPerioder, String feltnavn) { |
| 216 | + private List<Feil> validerIkkeLikeEllerOverlappendePerioder(List<FraværPeriode> fraværPerioder) { |
213 | 217 | List<Feil> feil = new ArrayList<>();
|
214 |
| - Map<Periode, Organisasjonsnummer> perioder = new LinkedHashMap<>(); |
| 218 | + Set<Periode> perioder = new HashSet<>(); |
215 | 219 | 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")); |
218 | 222 | } else {
|
219 |
| - perioder.put(fraværPeriode.getPeriode(), fraværPeriode.getArbeidsgiverOrgNr()); |
| 223 | + perioder.add(fraværPeriode.getPeriode()); |
220 | 224 | }
|
221 | 225 | }
|
222 | 226 | 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)); |
225 | 228 | }
|
226 | 229 | return feil;
|
227 | 230 | }
|
228 | 231 |
|
| 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 | + |
229 | 290 | private List<Feil> validerKorrigerIMIkkeFulltFravær(int index, FraværPeriode fraværPeriode) {
|
230 | 291 | if (Versjon.of("1.0.0").equals(versjon)) {
|
231 | 292 | return validerKorrigerIMIkkeFulltFraværV1_0_0(index, fraværPeriode);
|
@@ -298,7 +359,7 @@ private List<Feil> validerIkkeLikeEllerOverlappendePerioder(List<FraværPeriode>
|
298 | 359 | index++;
|
299 | 360 | }
|
300 | 361 | if (!Versjon.of("1.0.0").equals(versjon)) {
|
301 |
| - feil.addAll(validerIkkeLikeEllerOverlappendePerioder(fraværsperioder, "fraværsperioder")); |
| 362 | + feil.addAll(validerOverlappendePerioderPrAktivitet(fraværsperioder)); |
302 | 363 | }
|
303 | 364 | return feil;
|
304 | 365 | }
|
|
0 commit comments