Skip to content

Commit 0d56428

Browse files
authored
Fix: OMP Validering av periode som ikke er satt ordentlig (#312)
* Fix: Unngår NPE i validering når periode ikke er satt ordentlig * Fix: validerer at periode er satt ordentlig i OMP fraværsperioe * bruker også søknadvalidator isdf ytelsevalidator i test for OMP * Fix: Validering tom før fom
1 parent 0c65218 commit 0d56428

File tree

4 files changed

+161
-50
lines changed

4 files changed

+161
-50
lines changed

soknad/src/main/java/no/nav/k9/søknad/felles/fravær/FraværPeriode.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.util.Objects;
66

77
import javax.validation.Valid;
8+
import javax.validation.constraints.AssertFalse;
89
import javax.validation.constraints.NotNull;
910
import javax.validation.constraints.Size;
1011

@@ -76,6 +77,21 @@ public class FraværPeriode implements Comparable<FraværPeriode> {
7677
this.arbeidsforholdId = arbeidsforholdId;
7778
}
7879

80+
@AssertFalse(message = "Mangler fra-og-med-dato for perioden")
81+
boolean isPeriodeManglerFom(){
82+
return periode != null && periode.getFraOgMed() == null;
83+
}
84+
85+
@AssertFalse(message = "Mangler til-og-med-dato for perioden")
86+
boolean isPeriodeManglerTom(){
87+
return periode != null && periode.getTilOgMed() == null;
88+
}
89+
90+
@AssertFalse(message = "Til-og-med-dato er før fra-og-med-dato for perioden")
91+
boolean isPeriodeTomFørFom(){
92+
return periode != null && periode.getTilOgMed() != null && periode.getFraOgMed() != null && periode.getTilOgMed().isBefore(periode.getFraOgMed());
93+
}
94+
7995
public FraværPeriode medPeriode(Periode periode) {
8096
this.periode = periode;
8197
return this;

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,20 @@ public List<Feil> valider(Ytelse ytelse) {
5757
}
5858

5959
private List<Feil> validerPeriodeInnenforEttÅr(OmsorgspengerUtbetaling ytelse) {
60-
List<Feil> feil = new ArrayList<>();
60+
if (ytelse.getFraværsperioder().stream().anyMatch(OmsorgspengerUtbetalingValidator::erPeriodeUgyldig)) {
61+
//avbryter her for å unngå NPE i koden under når periode ikke er satt, eller ikke er satt ordentlig
62+
//nødvendig siden validatoren brukes mens søknaden bygges i k9-punsj, og søknad vil således være ukomplett underveis
63+
//periode valideres andre steder uansett
64+
return List.of();
65+
}
6166
var søknadsperiode = ytelse.getSøknadsperiode();
6267
var yearMin = søknadsperiode.getFraOgMed().getYear();
6368
var yearMax = søknadsperiode.getTilOgMed().getYear();
6469

6570
if (yearMin != yearMax) {
66-
feil.add(new Feil("fraværsperioder", "perioderOverFlereÅr", "Perioder kan ikke overstige ett år"));
71+
return List.of(new Feil("fraværsperioder", "perioderOverFlereÅr", "Perioder kan ikke overstige ett år"));
6772
}
68-
return feil;
73+
return List.of();
6974
}
7075

7176
private List<Feil> validerAktivitet(OmsorgspengerUtbetaling ytelse) {
@@ -235,6 +240,12 @@ private List<Feil> validerOverlappendePerioderPrAktivitet(List<FraværPeriode> f
235240
Map<Aktivitet, Set<Periode>> unikePerioderPrAktivitet = new HashMap<>();
236241
int index = 0;
237242
for (FraværPeriode fraværPeriode : fraværPerioder) {
243+
if (erPeriodeUgyldig(fraværPeriode)){
244+
//avbryter her for å unngå NPE i koden under når periode ikke er satt, eller ikke er satt ordentlig
245+
//nødvendig siden validatoren brukes mens søknaden bygges i k9-punsj, og søknad vil således være ukomplett underveis
246+
//periode valideres andre steder uansett
247+
continue;
248+
}
238249
for (AktivitetFravær aktivitetType : fraværPeriode.getAktivitetFravær()) {
239250
Aktivitet aktivitet = new Aktivitet(aktivitetType, fraværPeriode.getArbeidsgiverOrgNr());
240251
Set<Periode> unikePerioder = unikePerioderPrAktivitet.computeIfAbsent(aktivitet, k -> new HashSet<>());
@@ -263,6 +274,12 @@ private List<Feil> validerOverlappendePerioderPrAktivitet(List<FraværPeriode> f
263274
return feil;
264275
}
265276

277+
private static boolean erPeriodeUgyldig(FraværPeriode fraværPeriode){
278+
Periode periode = fraværPeriode.getPeriode();
279+
return periode == null || periode.getFraOgMed() == null || periode.getTilOgMed() == null || periode.getTilOgMed().isBefore(periode.getFraOgMed());
280+
}
281+
282+
266283
private List<Feil> validerOverlappendePerioderKorrigerIm(List<FraværPeriode> fraværPerioder) {
267284
List<Feil> feil = new ArrayList<>();
268285
List<LocalDateSegment<Integer>> perioder = new ArrayList<>();

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

Lines changed: 88 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,31 @@
88
import java.nio.file.Path;
99
import java.time.Duration;
1010
import java.time.LocalDate;
11+
import java.time.ZonedDateTime;
1112
import java.util.Arrays;
1213
import java.util.List;
1314

1415
import org.junit.jupiter.api.Test;
1516

1617
import no.nav.k9.søknad.Søknad;
18+
import no.nav.k9.søknad.SøknadValidator;
19+
import no.nav.k9.søknad.felles.Feil;
1720
import no.nav.k9.søknad.felles.Versjon;
1821
import no.nav.k9.søknad.felles.fravær.AktivitetFravær;
1922
import no.nav.k9.søknad.felles.fravær.DelvisFravær;
2023
import no.nav.k9.søknad.felles.fravær.FraværPeriode;
2124
import no.nav.k9.søknad.felles.fravær.FraværÅrsak;
2225
import no.nav.k9.søknad.felles.fravær.SøknadÅrsak;
2326
import no.nav.k9.søknad.felles.opptjening.OpptjeningAktivitet;
27+
import no.nav.k9.søknad.felles.personopplysninger.Søker;
28+
import no.nav.k9.søknad.felles.type.NorskIdentitetsnummer;
2429
import no.nav.k9.søknad.felles.type.Organisasjonsnummer;
2530
import no.nav.k9.søknad.felles.type.Periode;
31+
import no.nav.k9.søknad.felles.type.Språk;
32+
import no.nav.k9.søknad.felles.type.SøknadId;
2633

2734
class OmsorgspengerUtbetalingValidatorTest {
28-
29-
private OmsorgspengerUtbetalingValidator validatorSøknad = new OmsorgspengerUtbetalingValidator(Versjon.of("1.1.0"));
35+
private SøknadValidator<Søknad> søknadValidator = new OmsorgspengerUtbetalingSøknadValidator();
3036

3137
private Organisasjonsnummer orgnr1 = Organisasjonsnummer.of("999999999");
3238
private Organisasjonsnummer orgnr2 = Organisasjonsnummer.of("816338352");
@@ -35,14 +41,14 @@ class OmsorgspengerUtbetalingValidatorTest {
3541
@Test
3642
void skal_returnere_ingen_feil_for_minimum_json_søknad() {
3743
var søknad = TestUtils.minimumJsonSøknad();
38-
var feil = new OmsorgspengerUtbetalingSøknadValidator().valider(søknad);
44+
var feil = søknadValidator.valider(søknad);
3945
assertThat(feil).isEmpty();
4046
}
4147

4248
@Test
4349
void skal_returnere_ingen_feil_for_komplett_json_søknad() {
4450
var søknad = TestUtils.komplettJsonSøknad();
45-
var feil = new OmsorgspengerUtbetalingSøknadValidator().valider(søknad);
51+
var feil = søknadValidator.valider(søknad);
4652
assertThat(feil).isEmpty();
4753
}
4854

@@ -55,7 +61,7 @@ class OmsorgspengerUtbetalingValidatorTest {
5561
lagFraværskorrigeringIm(orgnr1, arbforholdId1, fulltFraværPeriode, null),
5662
lagFraværskorrigeringImGammelVariant(orgnr1, arbforholdId1, delvisFraværPeriode, Duration.ofHours(4)));
5763

58-
var feil = validatorSøknad.valider(ytelse);
64+
List<Feil> feil = lagSøknadOgValider(ytelse);
5965

6066
assertThat(feil).isEmpty();
6167
}
@@ -67,7 +73,7 @@ class OmsorgspengerUtbetalingValidatorTest {
6773
OmsorgspengerUtbetaling ytelse = byggOmsorgspengerUtbetalingMedFraværskorrigeringIm(
6874
lagFraværskorrigeringIm(orgnr1, arbforholdId1, fraværPeriode, null));
6975

70-
var feil = validatorSøknad.valider(ytelse);
76+
List<Feil> feil = lagSøknadOgValider(ytelse);
7177

7278
assertThat(feil).hasSize(1);
7379
feilInneholder(feil, "fraværsperioder", "perioderOverFlereÅr");
@@ -80,7 +86,7 @@ void skal_returnere_feil_for_nulling_som_overstiger_enkeltdag() {
8086
OmsorgspengerUtbetaling ytelse = byggOmsorgspengerUtbetalingMedFraværskorrigeringIm(
8187
lagFraværskorrigeringImGammelVariant(orgnr1, arbforholdId1, fraværPeriode, Duration.ofHours(0)));
8288

83-
var feil = validatorSøknad.valider(ytelse);
89+
List<Feil> feil = lagSøknadOgValider(ytelse);
8490

8591
assertThat(feil).hasSize(1);
8692
feilInneholder(feil, "fraværsperioderKorrigeringIm[0]", "nullingPeriodeOversteget");
@@ -93,7 +99,7 @@ void skal_returnere_feil_for_nulling_som_overstiger_enkeltdag() {
9399
OmsorgspengerUtbetaling ytelse = byggOmsorgspengerUtbetalingMedFraværskorrigeringIm(
94100
lagFraværskorrigeringImGammelVariant(orgnr1, arbforholdId1, fraværPeriode, Duration.parse("PT7H31M")));
95101

96-
var feil = validatorSøknad.valider(ytelse);
102+
List<Feil> feil = lagSøknadOgValider(ytelse);
97103

98104
assertThat(feil).hasSize(1);
99105
feilInneholder(feil, "fraværsperioderKorrigeringIm[0]", "varighetOversteget");
@@ -108,13 +114,39 @@ void skal_returnere_feil_for_overlappende_perioder_ved_korrigering_IM() {
108114
lagFraværskorrigeringIm(orgnr1, arbforholdId1, fraværPeriode1, null),
109115
lagFraværskorrigeringIm(orgnr1, arbforholdId1, fraværPeriode2, null));
110116

111-
var feil = validatorSøknad.valider(ytelse);
117+
List<Feil> feil = lagSøknadOgValider(ytelse);
112118

113119

114120
assertThat(feil).hasSize(1);
115121
feilInneholder(feil, "fraværsperioderKorrigeringIm.perioder[0, 1]", "overlappendePerioder");
116122
}
117123

124+
@Test
125+
void skal_gi_fornuftig_feilmelding_når_periode_ikke_er_satt() {
126+
Periode periode = null;
127+
Periode periode1 = new Periode(null, null);
128+
Periode periode2 = new Periode(null, LocalDate.now());
129+
Periode periode3 = new Periode(LocalDate.now(), null);
130+
Periode periode4 = new Periode(LocalDate.now(), LocalDate.now().minusDays(1));
131+
OmsorgspengerUtbetaling ytelse = byggOmsorgspengerUtbetalingSøknadBruker(
132+
lagSøknadsperiode(orgnr1, periode, null),
133+
lagSøknadsperiode(orgnr1, periode1, null),
134+
lagSøknadsperiode(orgnr1, periode2, null),
135+
lagSøknadsperiode(orgnr1, periode3, null),
136+
lagSøknadsperiode(orgnr1, periode4, null)
137+
);
138+
139+
List<Feil> feil = lagSøknadOgValider(ytelse);
140+
141+
assertThat(feil).hasSize(6);
142+
feilInneholder(feil, "ytelse.fraværsperioder['0'].periode", "nullFeil");
143+
feilInneholder(feil, "ytelse.fraværsperioder['1'].periodeManglerFom", "påkrevd");
144+
feilInneholder(feil, "ytelse.fraværsperioder['1'].periodeManglerTom", "påkrevd");
145+
feilInneholder(feil, "ytelse.fraværsperioder['2'].periodeManglerFom", "påkrevd");
146+
feilInneholder(feil, "ytelse.fraværsperioder['3'].periodeManglerTom", "påkrevd");
147+
feilInneholder(feil, "ytelse.fraværsperioder['4'].periodeTomFørFom", "påkrevd");
148+
}
149+
118150
@Test
119151
void skal_være_lov_å_ha_fravær_fra_flere_arbeidsgivere_samtidig() {
120152
var fraværPeriode1 = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
@@ -124,7 +156,7 @@ void skal_returnere_feil_for_overlappende_perioder_ved_korrigering_IM() {
124156
lagSøknadsperiode(orgnr1, fraværPeriode1, null),
125157
lagSøknadsperiode(orgnr2, fraværPeriode2, null));
126158

127-
var feil = validatorSøknad.valider(ytelse);
159+
List<Feil> feil = lagSøknadOgValider(ytelse);
128160

129161
assertThat(feil).isEmpty();
130162
}
@@ -138,7 +170,7 @@ void skal_returnere_feil_for_identiske_perioder() {
138170
lagFraværskorrigeringIm(orgnr1, arbforholdId1, fraværPeriode1, null),
139171
lagFraværskorrigeringIm(orgnr1, arbforholdId1, fraværPeriode2, null));
140172

141-
var feil = validatorSøknad.valider(ytelse);
173+
List<Feil> feil = lagSøknadOgValider(ytelse);
142174

143175

144176
assertThat(feil).hasSize(1);
@@ -152,10 +184,10 @@ void skal_returnere_feil_for_identiske_perioder() {
152184
var fraværPeriode2 = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
153185

154186
OmsorgspengerUtbetaling ytelse = byggOmsorgspengerUtbetalingSøknadBruker(
155-
lagSøknadsperiode(orgnr1, fraværPeriode1, null),
156-
lagSøknadsperiode(orgnr1, fraværPeriode2, null));
187+
lagSøknadsperiode(orgnr1, fraværPeriode1, null),
188+
lagSøknadsperiode(orgnr1, fraværPeriode2, null));
157189

158-
var feil = validatorSøknad.valider(ytelse);
190+
List<Feil> feil = lagSøknadOgValider(ytelse);
159191

160192
assertThat(feil).hasSize(1);
161193
feilInneholder(feil, "fraværsperioder[2021-09-01/2021-09-02]", "likePerioder");
@@ -169,7 +201,7 @@ void skal_returnere_feil_for_flere_orgnr() {
169201
lagFraværskorrigeringIm(orgnr1, arbforholdId1, fraværPeriode1, null),
170202
lagFraværskorrigeringIm(orgnr2, arbforholdId1, fraværPeriode2, null));
171203

172-
var feil = validatorSøknad.valider(ytelse);
204+
List<Feil> feil = lagSøknadOgValider(ytelse);
173205

174206
assertThat(feil).hasSize(1);
175207
feilInneholder(feil, "fraværsperioderKorrigeringIm[1]", "ikkeUniktOrgNr");
@@ -183,7 +215,7 @@ void skal_returnere_feil_for_flere_arbeidsforhold_id() {
183215
lagFraværskorrigeringIm(orgnr1, arbforholdId1, fraværPeriode1, null),
184216
lagFraværskorrigeringIm(orgnr1, null, fraværPeriode2, null));
185217

186-
var feil = validatorSøknad.valider(ytelse);
218+
List<Feil> feil = lagSøknadOgValider(ytelse);
187219

188220
assertThat(feil).hasSize(1);
189221
feilInneholder(feil, "fraværsperioderKorrigeringIm[1]", "ikkeUnikArbeidsforholdId");
@@ -195,10 +227,12 @@ void skal_returnere_feil_for_flere_arbeidsforhold_id() {
195227
OmsorgspengerUtbetaling ytelse = byggOmsorgspengerUtbetalingSøknadBruker(
196228
lagSøknadsperiode(orgnr1, periode, new DelvisFravær(null, Duration.ofHours(2))));
197229

198-
var feil = validatorSøknad.valider(ytelse);
230+
List<Feil> feil = lagSøknadOgValider(ytelse);
199231

200-
assertThat(feil).hasSize(1);
232+
assertThat(feil).hasSize(2);
233+
//TODO bør holde med en feil - begge feilmeldinger rapporterer samme feil
201234
feilInneholder(feil, "fraværsperioder[0].delvisFravær.normalarbeidstid", "manglerNormalarbeidstidForDelvisFravær");
235+
feilInneholder(feil, "ytelse.fraværsperioder['0'].delvisFravær.normalarbeidstid", "nullFeil");
202236
}
203237

204238
@Test
@@ -207,10 +241,12 @@ void skal_returnere_feil_for_flere_arbeidsforhold_id() {
207241
OmsorgspengerUtbetaling ytelse = byggOmsorgspengerUtbetalingSøknadBruker(
208242
lagSøknadsperiode(orgnr1, periode, new DelvisFravær(Duration.ofHours(2), null)));
209243

210-
var feil = validatorSøknad.valider(ytelse);
244+
List<Feil> feil = lagSøknadOgValider(ytelse);
211245

212-
assertThat(feil).hasSize(1);
246+
assertThat(feil).hasSize(2);
247+
//TODO bør holde med en feil - begge feilmeldinger rapporterer samme feil
213248
feilInneholder(feil, "fraværsperioder[0].delvisFravær.fravær", "manglerFraværForDelvisFravær");
249+
feilInneholder(feil, "ytelse.fraværsperioder['0'].delvisFravær.fravær", "nullFeil");
214250
}
215251

216252
@Test
@@ -222,7 +258,7 @@ void skal_ikke_tillate_overlappende_periode() {
222258
lagSøknadsperiode(orgnr1, periode2, null)
223259
);
224260

225-
var feil = validatorSøknad.valider(ytelse);
261+
List<Feil> feil = lagSøknadOgValider(ytelse);
226262

227263
assertThat(feil).hasSize(1);
228264
feilInneholder(feil, "fraværsperioder[0, 1]", "overlappendePerioder");
@@ -231,29 +267,29 @@ void skal_ikke_tillate_overlappende_periode() {
231267
@Test
232268
void skal_ikke_tillate_at_duration_ikke_tilsvarer_som_delvisFravær() {
233269
var periode = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
234-
FraværPeriode fraværPeriode = new FraværPeriode(
235-
periode,
236-
Duration.ofHours(2),
237-
new DelvisFravær(Duration.ofHours(4), Duration.ofHours(2)), //50% fravær fra 4 times-jobb skal oppgis som 4 timer i duration ( 50% av 7.5 timer, og rundet oppover til nærmeste halvtime)
238-
FraværÅrsak.ORDINÆRT_FRAVÆR,
239-
SøknadÅrsak.NYOPPSTARTET_HOS_ARBEIDSGIVER,
240-
List.of(AktivitetFravær.ARBEIDSTAKER),
241-
Organisasjonsnummer.of("999999999"),
242-
null
243-
);
244-
245-
OmsorgspengerUtbetaling ytelse = byggOmsorgspengerUtbetalingSøknadBruker(
246-
fraværPeriode
270+
FraværPeriode fraværPeriode = new FraværPeriode(
271+
periode,
272+
Duration.ofHours(2),
273+
new DelvisFravær(Duration.ofHours(4), Duration.ofHours(2)), //50% fravær fra 4 times-jobb skal oppgis som 4 timer i duration ( 50% av 7.5 timer, og rundet oppover til nærmeste halvtime)
274+
FraværÅrsak.ORDINÆRT_FRAVÆR,
275+
SøknadÅrsak.NYOPPSTARTET_HOS_ARBEIDSGIVER,
276+
List.of(AktivitetFravær.ARBEIDSTAKER),
277+
Organisasjonsnummer.of("999999999"),
278+
null
247279
);
248280

281+
OmsorgspengerUtbetaling ytelse = byggOmsorgspengerUtbetalingSøknadBruker(
282+
fraværPeriode
283+
);
249284

250285

251-
var feil = validatorSøknad.valider(ytelse);
286+
List<Feil> feil = lagSøknadOgValider(ytelse);
252287

253288
assertThat(feil).hasSize(1);
254289
feilInneholder(feil, "fraværsperioder[0]", "avvikDurationOgDelvisFravær");
255290
}
256291

292+
257293
// Søknad med fraværskorrigering av IM
258294
private OmsorgspengerUtbetaling byggOmsorgspengerUtbetalingMedFraværskorrigeringIm(FraværPeriode... fraværPerioder) {
259295
return new OmsorgspengerUtbetaling(
@@ -326,5 +362,22 @@ private static String jsonFromFile(String filename) {
326362
static Søknad komplettJsonSøknad() {
327363
return Søknad.SerDes.deserialize(jsonFromFile("komplett-søknad-omp-utbetaling-snf.json"));
328364
}
365+
366+
367+
}
368+
369+
private List<Feil> lagSøknadOgValider(OmsorgspengerUtbetaling ytelse) {
370+
Søknad søknad = lagSøknad(ytelse);
371+
return søknadValidator.valider(søknad);
372+
}
373+
374+
private Søknad lagSøknad(OmsorgspengerUtbetaling ytelse) {
375+
return new Søknad(
376+
new SøknadId("foo"),
377+
new Versjon("1.1.0"),
378+
ZonedDateTime.now(),
379+
new Søker(NorskIdentitetsnummer.of("11111111111")),
380+
Språk.NORSK_BOKMÅL,
381+
ytelse);
329382
}
330383
}

0 commit comments

Comments
 (0)