|
1 | 1 | package no.nav.k9.søknad;
|
2 | 2 |
|
| 3 | +import static no.nav.k9.søknad.TidsserieUtils.toPeriodeList; |
| 4 | + |
3 | 5 | import java.time.DayOfWeek;
|
4 | 6 | import java.time.LocalDate;
|
5 | 7 | import java.util.ArrayList;
|
6 |
| -import java.util.Collections; |
7 | 8 | import java.util.List;
|
8 |
| -import java.util.Map; |
9 | 9 | import java.util.stream.Collectors;
|
10 | 10 |
|
11 |
| -import no.nav.fpsak.tidsserie.LocalDateSegment; |
12 | 11 | import no.nav.fpsak.tidsserie.LocalDateTimeline;
|
13 |
| -import no.nav.fpsak.tidsserie.StandardCombinators; |
14 | 12 | import no.nav.k9.søknad.felles.Feil;
|
15 | 13 | import no.nav.k9.søknad.felles.type.Periode;
|
16 | 14 |
|
17 | 15 | public class TidsserieValidator {
|
18 | 16 |
|
19 |
| - public static PerioderMedFeil finnIkkeKomplettePerioderOgPerioderUtenfor(LocalDateTimeline<Boolean> test, Perioder perioder) { |
20 |
| - return new PerioderMedFeil( |
21 |
| - getPerioderSomIkkeOverlapperMedHovedperiode(test, perioder), |
22 |
| - getPerioderUtenforGyldigperiode(test, perioder)); |
23 |
| - } |
| 17 | + public static List<Feil> finnPerioderUtenforGyldigInterval(LocalDateTimeline<Boolean> testTidsserie, LocalDateTimeline<Boolean> gyldigInterval, String felt) { |
| 18 | + var feil = new ArrayList<Feil>(); |
| 19 | + var perioderUtenfor = getPerioderUtenforGyldigperiode(testTidsserie, gyldigInterval); |
24 | 20 |
|
25 |
| - private static List<Periode> getPerioderUtenforGyldigperiode(LocalDateTimeline<Boolean> test, Perioder perioder) { |
26 |
| - return TidsserieUtils.toPeriodeList(test.disjoint(perioder.gyldigInterval)); |
| 21 | + feil.addAll(leggTilFeil(perioderUtenfor, felt + ".perioder", "ugyldigPeriode", "Perioden er utenfor gyldig interval(" + gyldigInterval.toString() +") : ")); |
| 22 | + return feil; |
27 | 23 | }
|
28 | 24 |
|
29 |
| - private static List<Periode> getPerioderSomIkkeOverlapperMedHovedperiode(LocalDateTimeline<Boolean> test, Perioder perioder) { |
30 |
| - return TidsserieUtils.toPeriodeList(perioder.søknadsperiode.disjoint(test)); |
31 |
| - } |
| 25 | + public static List<Feil> finnIkkeKomplettePerioder(LocalDateTimeline<Boolean> test, LocalDateTimeline<Boolean> intervalHvorTidserieMåVæreKomplett, String felt) { |
| 26 | + var feil = new ArrayList<Feil>(); |
| 27 | + var ikkeKomplettePerioder = getPerioderSomIkkeErKomplett(test, intervalHvorTidserieMåVæreKomplett); |
32 | 28 |
|
33 |
| - public static PerioderMedFeil finnPerioderUtenfor(LocalDateTimeline<Boolean> testTidsserie, Perioder hovedTidsserie) { |
34 |
| - return new PerioderMedFeil( |
35 |
| - Collections.emptyList(), |
36 |
| - getPerioderUtenforGyldigperiode(testTidsserie, hovedTidsserie)); |
| 29 | + feil.addAll(leggTilFeilIkkeTaMedHelg(ikkeKomplettePerioder, felt + ".perioder", "ikkeKomplettPeriode", "Periodene er ikke komplett, periode som mangler er: ")); |
| 30 | + return feil; |
37 | 31 | }
|
38 | 32 |
|
39 |
| - public static boolean periodeInneholderDagerSomIkkeErHelg(Periode periode) { |
40 |
| - LocalDate testDag = periode.getFraOgMed(); |
41 |
| - while (testDag.isBefore(periode.getTilOgMed()) || testDag.isEqual(periode.getTilOgMed())) { |
42 |
| - if (!((testDag.getDayOfWeek() == DayOfWeek.SUNDAY) || (testDag.getDayOfWeek() == DayOfWeek.SATURDAY))) { |
43 |
| - return true; |
44 |
| - } |
45 |
| - testDag = testDag.plusDays(1); |
| 33 | + private static List<Feil> leggTilFeil(List<Periode> perioderMedFeil, String felt, String feilkode, String feilmelding) { |
| 34 | + if (perioderMedFeil.isEmpty()) { |
| 35 | + return List.of(); |
46 | 36 | }
|
47 |
| - return false; |
48 |
| - } |
49 | 37 |
|
50 |
| - public static class TidsserieUtils { |
51 |
| - public static List<Periode> toPeriodeList(LocalDateTimeline<?> t) { |
52 |
| - return t.stream().map(l -> new Periode(l.getFom(), l.getTom())).collect(Collectors.toList()); |
53 |
| - } |
54 |
| - |
55 |
| - public static LocalDateTimeline<Boolean> toLocalDateTimeline(List<Periode> perioder, String felt, List<Feil> feil) throws IllegalArgumentException{ |
56 |
| - perioder.forEach(p -> validerPeriode(p, felt, feil)); |
57 |
| - try { |
58 |
| - return new LocalDateTimeline<Boolean>(perioder |
59 |
| - .stream() |
60 |
| - .map(TidsserieUtils::mapLocalDateSegment) |
61 |
| - .collect(Collectors.toList())) |
62 |
| - .compress(); |
63 |
| - } catch (IllegalArgumentException e) { |
64 |
| - feil.add(new Feil(felt, "IllegalArgumentException", e.getMessage())); |
65 |
| - } |
66 |
| - return new LocalDateTimeline<>(Collections.emptyList()); |
67 |
| - } |
68 |
| - |
69 |
| - private static LocalDateSegment<Boolean> mapLocalDateSegment(Periode periode) { |
70 |
| - return new LocalDateSegment<Boolean>( |
71 |
| - periode.getFraOgMed(), |
72 |
| - periode.getTilOgMed(), |
73 |
| - true); |
74 |
| - } |
75 |
| - |
76 |
| - private static void validerPeriode(Periode periode, String felt, List<Feil> feil) { |
77 |
| - if (periode.getTilOgMed() == null || periode.getFraOgMed() == null) { |
78 |
| - feil.add(new Feil (felt, "NullPointerException", "Null")); |
79 |
| - } |
80 |
| - } |
81 |
| - |
82 |
| - public static LocalDateTimeline<Boolean> toLocalDateTimeline(Map<Periode, ?> periodeMap, String felt, List<Feil> feil) { |
83 |
| - return toLocalDateTimeline(new ArrayList<>(periodeMap.keySet()), felt, feil); |
84 |
| - } |
| 38 | + return perioderMedFeil.stream() |
| 39 | + .map(p -> toFeil(p, felt, feilkode, feilmelding)) |
| 40 | + .collect(Collectors.toList()); |
85 | 41 | }
|
86 | 42 |
|
87 |
| - public static class Perioder { |
88 |
| - private final LocalDateTimeline<Boolean> søknadsperiode; |
89 |
| - private final LocalDateTimeline<Boolean> gyldigInterval; |
90 |
| - |
91 |
| - public Perioder(List<Periode> søknadsperiode, List<Periode> endringsperiode, List<Feil> feil) { |
92 |
| - this.søknadsperiode = TidsserieUtils.toLocalDateTimeline(søknadsperiode, "Søknadsperiode.periode", feil); |
93 |
| - this.gyldigInterval = this.søknadsperiode.union(TidsserieUtils.toLocalDateTimeline(endringsperiode, "Endringsperiode.periode", feil), StandardCombinators::coalesceLeftHandSide); |
94 |
| - } |
95 |
| - |
96 |
| - public LocalDateTimeline<Boolean> getSøknadsperiode() { |
97 |
| - return søknadsperiode; |
| 43 | + private static List<Feil> leggTilFeilIkkeTaMedHelg(List<Periode> perioderMedFeil, String felt, String feilkode, String feilmelding) { |
| 44 | + if (perioderMedFeil.isEmpty()) { |
| 45 | + return List.of(); |
98 | 46 | }
|
99 | 47 |
|
100 |
| - public LocalDateTimeline<Boolean> getPerioderDerEndringerErTillatt() { |
101 |
| - return gyldigInterval; |
102 |
| - } |
| 48 | + return perioderMedFeil.stream() |
| 49 | + .filter(TidsserieValidator::periodeInneholderDagerSomIkkeErHelg) |
| 50 | + .map(p -> toFeil(p, felt, feilkode, feilmelding)) |
| 51 | + .collect(Collectors.toList()); |
103 | 52 | }
|
104 | 53 |
|
105 |
| - public static class PerioderMedFeil { |
106 |
| - private final List<Periode> perioderSomIkkeOverlapperMedHovedperiode; |
107 |
| - private final List<Periode> perioderUtenforGyldigperiode; |
108 |
| - |
109 |
| - public PerioderMedFeil(List<Periode> perioderSomIkkeOverlapperMedHovedperiode, List<Periode> perioderUtenforGyldigperiode) { |
110 |
| - this.perioderSomIkkeOverlapperMedHovedperiode = perioderSomIkkeOverlapperMedHovedperiode; |
111 |
| - this.perioderUtenforGyldigperiode = perioderUtenforGyldigperiode; |
112 |
| - } |
113 |
| - |
114 |
| - public List<Periode> getPerioderSomIkkeOverlapperMedHovedperiode() { |
115 |
| - return perioderSomIkkeOverlapperMedHovedperiode; |
116 |
| - } |
117 |
| - |
118 |
| - public List<Periode> getPerioderUtenforGyldigperiode() { |
119 |
| - return perioderUtenforGyldigperiode; |
120 |
| - } |
| 54 | + private static List<Periode> getPerioderUtenforGyldigperiode(LocalDateTimeline<Boolean> test, LocalDateTimeline<Boolean> gyldigInterval) { |
| 55 | + return toPeriodeList( |
| 56 | + test.disjoint(gyldigInterval)); |
| 57 | + } |
121 | 58 |
|
122 |
| - public void valider(String felt , List<Feil> feil) { |
123 |
| - if (!this.perioderSomIkkeOverlapperMedHovedperiode.isEmpty()) { |
124 |
| - feil.addAll(this.perioderSomIkkeOverlapperMedHovedperiode.stream() |
125 |
| - .filter(TidsserieValidator::periodeInneholderDagerSomIkkeErHelg) |
126 |
| - .map(p -> toFeil(p, felt, "ikkeKomplettPeriode", "Periodene er ikke komplett, periode som mangler er: ")) |
127 |
| - .collect(Collectors.toList())); |
128 |
| - } |
| 59 | + private static List<Periode> getPerioderSomIkkeErKomplett(LocalDateTimeline<Boolean> test, LocalDateTimeline<Boolean> intervalHvorTidserieMåVæreKomplett) { |
| 60 | + return toPeriodeList(intervalHvorTidserieMåVæreKomplett.disjoint(test)); |
| 61 | + } |
129 | 62 |
|
130 |
| - if (!this.perioderUtenforGyldigperiode.isEmpty()) { |
131 |
| - feil.addAll(this.perioderUtenforGyldigperiode.stream() |
132 |
| - .map(p -> toFeil(p, felt, "ugyldigPeriode", "Perioden er utenfor søknadsperioden : ")) |
133 |
| - .collect(Collectors.toList())); |
| 63 | + public static boolean periodeInneholderDagerSomIkkeErHelg(Periode periode) { |
| 64 | + LocalDate testDag = periode.getFraOgMed(); |
| 65 | + while (testDag.isBefore(periode.getTilOgMed()) || testDag.isEqual(periode.getTilOgMed())) { |
| 66 | + if (!((testDag.getDayOfWeek() == DayOfWeek.SUNDAY) || (testDag.getDayOfWeek() == DayOfWeek.SATURDAY))) { |
| 67 | + return true; |
134 | 68 | }
|
| 69 | + testDag = testDag.plusDays(1); |
135 | 70 | }
|
| 71 | + return false; |
| 72 | + } |
136 | 73 |
|
137 |
| - private Feil toFeil(Periode periode, String felt, String feilkode, String feilmelding) { |
138 |
| - return new Feil(felt, feilkode, feilmelding + periode.toString()); |
139 |
| - } |
140 |
| - |
| 74 | + private static Feil toFeil(Periode periode, String felt, String feilkode, String feilmelding) { |
| 75 | + return new Feil(felt, feilkode, feilmelding + periode.toString()); |
141 | 76 | }
|
142 | 77 | }
|
0 commit comments