8
8
import java .util .ArrayList ;
9
9
import java .util .List ;
10
10
import java .util .Map ;
11
+ import java .util .Objects ;
11
12
import java .util .stream .Collectors ;
12
13
13
- import no .nav .fpsak .tidsserie .LocalDateSegment ;
14
14
import no .nav .fpsak .tidsserie .LocalDateTimeline ;
15
+ import no .nav .fpsak .tidsserie .StandardCombinators ;
16
+ import no .nav .k9 .søknad .ValideringsFeil ;
15
17
import no .nav .k9 .søknad .felles .Feil ;
16
18
import no .nav .k9 .søknad .felles .opptjening .AnnenAktivitet ;
17
19
import no .nav .k9 .søknad .felles .opptjening .Frilanser ;
18
20
import no .nav .k9 .søknad .felles .opptjening .SelvstendigNæringsdrivende ;
19
21
import no .nav .k9 .søknad .felles .type .Periode ;
20
22
import no .nav .k9 .søknad .ytelse .Ytelse ;
21
23
import no .nav .k9 .søknad .ytelse .YtelseValidator ;
24
+ import no .nav .k9 .søknad .ytelse .psb .v1 .PerioderMedEndring ;
22
25
import no .nav .k9 .søknad .ytelse .psb .v1 .arbeidstid .Arbeidstaker ;
23
- import no .nav .k9 .søknad .ytelse .psb .v1 .arbeidstid .Arbeidstid ;
24
26
25
27
public class PleiepengerLivetsSluttfaseYtelseValidator extends YtelseValidator {
26
28
@ Override
27
29
public List <Feil > valider (Ytelse søknad ) {
28
- return valider ((PleipengerLivetsSluttfase ) søknad );
30
+ return valider ((PleipengerLivetsSluttfase ) søknad , List . of () );
29
31
}
30
32
31
- public List <Feil > valider (PleipengerLivetsSluttfase søknad ) {
33
+ public List <Feil > valider (PleipengerLivetsSluttfase søknad , List <Periode > gyldigeEndringsperioder ) {
34
+ return validerMedGyldigEndringsperodeHvisDenFinnes (søknad , gyldigeEndringsperioder );
35
+ }
36
+
37
+ List <Feil > validerMedGyldigEndringsperodeHvisDenFinnes (PleipengerLivetsSluttfase søknad , List <Periode > gyldigeEndringsperioder ) {
32
38
List <Feil > feilene = new ArrayList <>();
33
39
try {
34
- if (søknad .getSøknadsperiode () == null ) {
35
- feilene .add (lagFeil ("søknadsperiode" , "påkrevd" , "det finnes ingen søknadsperiode" ));
36
- }
40
+ validerLovligEndring (søknad , gyldigeEndringsperioder );
41
+
37
42
feilene .addAll (validerPerioderErLukketOgGyldig (søknad .getBosteder ().getPerioder (), "bosteder.perioder" ));
38
43
feilene .addAll (validerPerioderErLukketOgGyldig (søknad .getBosteder ().getPerioderSomSkalSlettes (), "bosteder.perioderSomSkalSlettes" ));
39
44
feilene .addAll (validerPerioderErLukketOgGyldig (søknad .getUtenlandsopphold ().getPerioder (), "utenlandsopphold.perioder" ));
@@ -45,13 +50,41 @@ public List<Feil> valider(PleipengerLivetsSluttfase søknad) {
45
50
var uttakTidslinje = lagTidslinjeOgValider (new ArrayList <>(søknad .getUttak ().getPerioder ().keySet ()), "uttak.perioder" , feilene );
46
51
validerAtUttakErKomplettForSøknadsperiode (søknadsperiodeTidslinje , uttakTidslinje , "uttak.perioder" , feilene );
47
52
48
- validerTrekkKravPerioder (søknad .getTrekkKravPerioder (), søknadsperiodeTidslinje , feilene );
53
+ var trekkKravPerioderTidslinje = lagTidslinjeOgValider (søknad .getTrekkKravPerioder (), "trekkKravPerioder.perioder" , feilene );
54
+ validerTrekkKravPerioder (trekkKravPerioderTidslinje , søknadsperiodeTidslinje , feilene );
55
+
56
+ var gyldigEndringsperiodeTidslinje = lagTidslinjeOgValider (gyldigeEndringsperioder , "gyldigeEndringsperioder.perioder" , feilene );
57
+ var intervalForEndringTidslinje = søknadsperiodeTidslinje .union (gyldigEndringsperiodeTidslinje , StandardCombinators ::coalesceLeftHandSide );
58
+ for (PerioderMedEndring ytelsePeriode : PleiepengerLivetsSluttfasePerioderMedEndringUtil .getAllePerioderSomMåVæreInnenforSøknadsperiode (søknad )) {
59
+ var ytelsePeriodeTidslinje = lagTidslinjeOgValider (ytelsePeriode .getPeriodeMap (), ytelsePeriode .getFelt () + ".perioder" , feilene );
60
+ feilene .addAll (validerAtYtelsePerioderErInnenforIntervalForEndring (intervalForEndringTidslinje , ytelsePeriodeTidslinje , ytelsePeriode .getFelt () + ".perioder" ));
61
+ feilene .addAll (validerAtIngenPerioderOverlapperMedTrekkKravPerioder (trekkKravPerioderTidslinje , ytelsePeriodeTidslinje , ytelsePeriode .getFelt () + ".perioder" ));
62
+ }
63
+
49
64
} catch (ValideringsAvbrytendeFeilException valideringsAvbrytendeFeilException ) {
50
65
feilene .addAll (valideringsAvbrytendeFeilException .getFeilList ());
51
66
}
52
67
return feilene ;
53
68
}
54
69
70
+ // Brukes av Punsj for å sende inn endringer på allerede mottatte søknadsperioder. Komplett datasett kreves ikke for disse perioden
71
+ @ Override
72
+ public void forsikreValidert (Ytelse ytelse , List <Periode > gyldigeEndringsperioder ) {
73
+ Objects .requireNonNull (gyldigeEndringsperioder , "gyldigeEndringsperioder" );
74
+
75
+ var feilene = valider ((PleipengerLivetsSluttfase ) ytelse , gyldigeEndringsperioder );
76
+ if (!feilene .isEmpty ()) {
77
+ throw new ValideringsFeil (feilene );
78
+ }
79
+ }
80
+
81
+ private void validerLovligEndring (PleipengerLivetsSluttfase ytelse , List <Periode > gyldigeEndringsperioder ) {
82
+ if (ytelse .getSøknadsperiodeList ().isEmpty () && gyldigeEndringsperioder .isEmpty ()) {
83
+ throw new ValideringsAvbrytendeFeilException (List .of (
84
+ lagFeil ("søknadsperiode" , "missingArgument" , "Mangler søknadsperiode eller gyldigeEndringsperioder." )));
85
+ }
86
+ }
87
+
55
88
private void validerArbeidstid (PleipengerLivetsSluttfase søknad ) throws ValideringsAvbrytendeFeilException {
56
89
List <Arbeidstaker > arbeidstakerList = søknad .getArbeidstid ().getArbeidstakerList ();
57
90
for (int i = 0 ; i < arbeidstakerList .size (); i ++) {
@@ -75,16 +108,6 @@ private void validerOpptjening(PleipengerLivetsSluttfase søknad, List<Feil> fei
75
108
if (fl != null ) {
76
109
validerPerioderIkkeErInvertert (new Periode (fl .getStartdato (), fl .getSluttdato ()), "opptjeningAktivitet.frilanser.startdato/sluttdato" , feilene );
77
110
}
78
-
79
- }
80
-
81
- private LocalDateTimeline <Boolean > lagArbeidstidTidslinje (Arbeidstid arbeidstid ) {
82
- var arbeidstidTidslinje = arbeidstid .getArbeidstakerList ().stream ()
83
- .flatMap (it -> it .getArbeidstidInfo ().getPerioder ().keySet ().stream ())
84
- .map (it -> new LocalDateSegment <>(it .getFraOgMed (), it .getTilOgMed (), Boolean .TRUE ))
85
- .collect (Collectors .toList ());
86
- var arbeidstidTidslinjeSammenslått = LocalDateTimeline .buildGroupOverlappingSegments (arbeidstidTidslinje ).mapValue (s -> Boolean .TRUE );
87
- return arbeidstidTidslinjeSammenslått ;
88
111
}
89
112
90
113
@@ -94,8 +117,7 @@ private LocalDateTimeline<Boolean> lagArbeidstidTidslinje(Arbeidstid arbeidstid)
94
117
List <Feil > feil ) {
95
118
96
119
var søknadsperioderUtenUttak = tilPeriodeList (søknadsperioderTidslinje .disjoint (uttakTidslinje ));
97
- feil .addAll ( søknadsperioderUtenUttak .stream ()
98
- // TODO: Avklare om det er spesiell logikk rundt helg
120
+ feil .addAll (søknadsperioderUtenUttak .stream ()
99
121
.filter (this ::periodeInneholderDagerSomIkkeErHelg )
100
122
.map (p -> toFeil (p , felt , "ikkeKomplettPeriode" , "Periodene er ikke komplett, periode som mangler er: " ))
101
123
.collect (Collectors .toCollection (ArrayList ::new )));
@@ -112,15 +134,39 @@ private boolean periodeInneholderDagerSomIkkeErHelg(Periode periode) {
112
134
return false ;
113
135
}
114
136
115
- private void validerTrekkKravPerioder (List <Periode > trekkKravPerioder , LocalDateTimeline <Boolean > søknadsperiodeTidslinje , List <Feil > feilene ) {
116
- LocalDateTimeline <Boolean > trekkKravPerioderTidslinje = lagTidslinjeOgValider (trekkKravPerioder , "trekkKravPerioder.perioder" , feilene );
137
+ private List <Feil > validerAtYtelsePerioderErInnenforIntervalForEndring (LocalDateTimeline <Boolean > intervalForEndringTidslinje ,
138
+ LocalDateTimeline <Boolean > ytelsePeriodeLinje ,
139
+ String felt ) {
140
+ return tilPeriodeList (
141
+ ytelsePeriodeLinje .disjoint (intervalForEndringTidslinje )).stream ()
142
+ .filter (this ::periodeInneholderDagerSomIkkeErHelg )
143
+ .map (p -> toFeil (p , felt , "ugyldigPeriode" ,
144
+ "Perioden er utenfor gyldig interval. Gyldig interval: (" + intervalForEndringTidslinje .getLocalDateIntervals () + "), Ugyldig periode: " ))
145
+ .collect (Collectors .toCollection (ArrayList ::new ));
146
+ }
147
+
148
+ private void validerTrekkKravPerioder (LocalDateTimeline <Boolean > trekkKravPerioderTidslinje , LocalDateTimeline <Boolean > søknadsperiodeTidslinje , List <Feil > feilene ) {
117
149
feilene .addAll (validerAtIngenPerioderOverlapperMedTrekkKravPerioder (trekkKravPerioderTidslinje , søknadsperiodeTidslinje , "trekkKravPerioder" ));
118
150
}
119
151
120
152
private LocalDateTimeline <Boolean > lagTidslinjeMedStøtteForÅpenPeriodeOgValider (Map <Periode , ?> periodeMap , String felt ) throws ValideringsAvbrytendeFeilException {
121
153
return lagTidslinjeOgValider (periodeMap , felt , true );
122
154
}
123
155
156
+ private LocalDateTimeline <Boolean > lagTidslinjeOgValider (Map <Periode , ? > periodeMap , String felt , List <Feil > feil ) throws ValideringsAvbrytendeFeilException {
157
+ var nyFeil = validerPerioderErLukketOgGyldig (periodeMap , felt );
158
+ if (!nyFeil .isEmpty ()) {
159
+ feil .addAll (nyFeil );
160
+ throw new ValideringsAvbrytendeFeilException (feil );
161
+ }
162
+ try {
163
+ return toLocalDateTimeline (new ArrayList <>(periodeMap .keySet ()));
164
+ } catch (IllegalArgumentException e ) {
165
+ feil .add (lagFeil (felt , "IllegalArgumentException" , e .getMessage ()));
166
+ throw new ValideringsAvbrytendeFeilException (feil );
167
+ }
168
+ }
169
+
124
170
private LocalDateTimeline <Boolean > lagTidslinjeOgValider (Map <Periode , ?> periodeMap , String felt ) throws ValideringsAvbrytendeFeilException {
125
171
return lagTidslinjeOgValider (periodeMap , felt , false );
126
172
}
0 commit comments