3
3
import static no .nav .k9 .søknad .TidsserieUtils .tilPeriodeList ;
4
4
import static no .nav .k9 .søknad .TidsserieUtils .toLocalDateTimeline ;
5
5
6
+ import java .time .DayOfWeek ;
7
+ import java .time .LocalDate ;
6
8
import java .util .ArrayList ;
7
9
import java .util .List ;
8
10
import java .util .Map ;
18
20
import no .nav .k9 .søknad .ytelse .Ytelse ;
19
21
import no .nav .k9 .søknad .ytelse .YtelseValidator ;
20
22
import no .nav .k9 .søknad .ytelse .psb .v1 .arbeidstid .Arbeidstaker ;
23
+ import no .nav .k9 .søknad .ytelse .psb .v1 .arbeidstid .Arbeidstid ;
21
24
22
25
public class PleiepengerLivetsSluttfaseYtelseValidator extends YtelseValidator {
23
26
@ Override
@@ -37,8 +40,12 @@ public List<Feil> valider(PleipengerLivetsSluttfase søknad) {
37
40
feilene .addAll (validerPerioderErLukketOgGyldig (søknad .getUtenlandsopphold ().getPerioderSomSkalSlettes (), "utenlandsopphold.perioderSomSkalSlettes" ));
38
41
validerArbeidstid (søknad );
39
42
validerOpptjening (søknad , feilene );
40
- validerTrekkKravPerioder (søknad , feilene );
41
- //TODO valider søknadsperiode(overlapp), uttak
43
+
44
+ var søknadsperiodeTidslinje = lagTidslinjeOgValider (søknad .getSøknadsperiodeList (), "søknadsperiode.perioder" , feilene );
45
+ var uttakTidslinje = lagTidslinjeOgValider (new ArrayList <>(søknad .getUttak ().getPerioder ().keySet ()), "uttak.perioder" , feilene );
46
+ validerAtUttakErKomplettForSøknadsperiode (søknadsperiodeTidslinje , uttakTidslinje , "uttak.perioder" , feilene );
47
+
48
+ validerTrekkKravPerioder (søknad .getTrekkKravPerioder (), søknadsperiodeTidslinje , feilene );
42
49
} catch (ValideringsAvbrytendeFeilException valideringsAvbrytendeFeilException ) {
43
50
feilene .addAll (valideringsAvbrytendeFeilException .getFeilList ());
44
51
}
@@ -71,14 +78,43 @@ private void validerOpptjening(PleipengerLivetsSluttfase søknad, List<Feil> fei
71
78
72
79
}
73
80
74
- private void validerTrekkKravPerioder (PleipengerLivetsSluttfase søknad , List <Feil > feilene ) {
75
- LocalDateTimeline <Boolean > trekkKravPerioderTidslinje = lagTidslinjeOgValider (søknad .getTrekkKravPerioder (), "trekkKravPerioder.perioder" , feilene );
76
- var søktePerioder = søknad .getArbeidstid ().getArbeidstakerList ().stream ()
81
+ private LocalDateTimeline <Boolean > lagArbeidstidTidslinje (Arbeidstid arbeidstid ) {
82
+ var arbeidstidTidslinje = arbeidstid .getArbeidstakerList ().stream ()
77
83
.flatMap (it -> it .getArbeidstidInfo ().getPerioder ().keySet ().stream ())
78
84
.map (it -> new LocalDateSegment <>(it .getFraOgMed (), it .getTilOgMed (), Boolean .TRUE ))
79
85
.collect (Collectors .toList ());
80
- var tidslinjeSøktPeriode = LocalDateTimeline .buildGroupOverlappingSegments (søktePerioder ).mapValue (s -> Boolean .TRUE );
81
- feilene .addAll (validerAtIngenPerioderOverlapperMedTrekkKravPerioder (trekkKravPerioderTidslinje , tidslinjeSøktPeriode , "trekkKravPerioder" ));
86
+ var arbeidstidTidslinjeSammenslått = LocalDateTimeline .buildGroupOverlappingSegments (arbeidstidTidslinje ).mapValue (s -> Boolean .TRUE );
87
+ return arbeidstidTidslinjeSammenslått ;
88
+ }
89
+
90
+
91
+ private void validerAtUttakErKomplettForSøknadsperiode (LocalDateTimeline <Boolean > søknadsperioderTidslinje ,
92
+ LocalDateTimeline <Boolean > uttakTidslinje ,
93
+ String felt ,
94
+ List <Feil > feil ) {
95
+
96
+ var søknadsperioderUtenUttak = tilPeriodeList (søknadsperioderTidslinje .disjoint (uttakTidslinje ));
97
+ feil .addAll ( søknadsperioderUtenUttak .stream ()
98
+ // TODO: Avklare om det er spesiell logikk rundt helg
99
+ .filter (this ::periodeInneholderDagerSomIkkeErHelg )
100
+ .map (p -> toFeil (p , felt , "ikkeKomplettPeriode" , "Periodene er ikke komplett, periode som mangler er: " ))
101
+ .collect (Collectors .toCollection (ArrayList ::new )));
102
+ }
103
+
104
+ private boolean periodeInneholderDagerSomIkkeErHelg (Periode periode ) {
105
+ LocalDate testDag = periode .getFraOgMed ();
106
+ while (testDag .isBefore (periode .getTilOgMed ()) || testDag .isEqual (periode .getTilOgMed ())) {
107
+ if (!((testDag .getDayOfWeek () == DayOfWeek .SUNDAY ) || (testDag .getDayOfWeek () == DayOfWeek .SATURDAY ))) {
108
+ return true ;
109
+ }
110
+ testDag = testDag .plusDays (1 );
111
+ }
112
+ return false ;
113
+ }
114
+
115
+ private void validerTrekkKravPerioder (List <Periode > trekkKravPerioder , LocalDateTimeline <Boolean > søknadsperiodeTidslinje , List <Feil > feilene ) {
116
+ LocalDateTimeline <Boolean > trekkKravPerioderTidslinje = lagTidslinjeOgValider (trekkKravPerioder , "trekkKravPerioder.perioder" , feilene );
117
+ feilene .addAll (validerAtIngenPerioderOverlapperMedTrekkKravPerioder (trekkKravPerioderTidslinje , søknadsperiodeTidslinje , "trekkKravPerioder" ));
82
118
}
83
119
84
120
private LocalDateTimeline <Boolean > lagTidslinjeMedStøtteForÅpenPeriodeOgValider (Map <Periode , ?> periodeMap , String felt ) throws ValideringsAvbrytendeFeilException {
@@ -98,6 +134,7 @@ private LocalDateTimeline<Boolean> lagTidslinjeOgValider(Map<Periode, ?> periode
98
134
throw new ValideringsAvbrytendeFeilException (nyFeil );
99
135
}
100
136
try {
137
+ // Kaster feil dersom overlappende perioder
101
138
return toLocalDateTimeline (new ArrayList <>(periodeMap .keySet ()));
102
139
} catch (IllegalArgumentException e ) {
103
140
throw new ValideringsAvbrytendeFeilException (List .of (lagFeil (felt , "IllegalArgumentException" , e .getMessage ())));
@@ -111,6 +148,7 @@ private LocalDateTimeline<Boolean> lagTidslinjeOgValider(List<Periode> periodeLi
111
148
throw new ValideringsAvbrytendeFeilException (feil );
112
149
}
113
150
try {
151
+ // Kaster feil dersom overlappende perioder
114
152
return toLocalDateTimeline (periodeList );
115
153
} catch (IllegalArgumentException e ) {
116
154
feil .add (lagFeil (felt , "IllegalArgumentException" , e .getMessage ()));
0 commit comments