Skip to content

Commit d604732

Browse files
committed
Mer konsistent validering av lukkede perioder
1 parent f7c4d05 commit d604732

14 files changed

+130
-94
lines changed

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

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

77
import javax.validation.Valid;
8-
import javax.validation.constraints.AssertFalse;
98
import javax.validation.constraints.NotNull;
109
import javax.validation.constraints.Size;
1110

@@ -16,13 +15,15 @@
1615

1716
import no.nav.k9.søknad.felles.type.Organisasjonsnummer;
1817
import no.nav.k9.søknad.felles.type.Periode;
18+
import no.nav.k9.søknad.felles.type.validering.GyldigPeriode;
1919

2020
@JsonIgnoreProperties(ignoreUnknown = true)
2121
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
2222
public class FraværPeriode implements Comparable<FraværPeriode> {
2323

2424
@Valid
2525
@NotNull
26+
@GyldigPeriode(krevFomDato = true, krevTomDato = true)
2627
@JsonProperty("periode")
2728
private Periode periode;
2829

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

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-
9081
public FraværPeriode medPeriode(Periode periode) {
9182
this.periode = periode;
9283
return this;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package no.nav.k9.søknad.felles.type.validering;
2+
3+
4+
import java.lang.annotation.Documented;
5+
import java.lang.annotation.ElementType;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
import javax.validation.Constraint;
11+
import javax.validation.Payload;
12+
13+
@Documented
14+
@Constraint(validatedBy = {GyldigPeriodeValidator.class})
15+
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
16+
@Retention(RetentionPolicy.RUNTIME)
17+
public @interface GyldigPeriode {
18+
19+
String message() default "Ugyldig periode";
20+
21+
boolean krevFomDato() default false;
22+
boolean krevTomDato() default false;
23+
24+
Class<?>[] groups() default {};
25+
26+
Class<? extends Payload>[] payload() default {};
27+
28+
String[] value() default {};
29+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package no.nav.k9.søknad.felles.type.validering;
2+
3+
import javax.validation.ConstraintValidator;
4+
import javax.validation.ConstraintValidatorContext;
5+
6+
import no.nav.k9.søknad.felles.type.Periode;
7+
8+
public class GyldigPeriodeValidator implements ConstraintValidator<GyldigPeriode, Periode> {
9+
10+
private boolean krevFom;
11+
private boolean krevTom;
12+
13+
@Override
14+
public void initialize(GyldigPeriode konfig) {
15+
krevFom = konfig.krevFomDato();
16+
krevTom = konfig.krevTomDato();
17+
}
18+
19+
@Override
20+
public boolean isValid(Periode periode, ConstraintValidatorContext constraintContext) {
21+
if (periode == null) {
22+
return true; //hvis påkrevd, bruk @NotNull
23+
}
24+
boolean ok = true;
25+
if (krevFom && periode.getFraOgMed() == null) {
26+
constraintContext.disableDefaultConstraintViolation();
27+
constraintContext.buildConstraintViolationWithTemplate("[påkrevd] Fra og med (FOM) må være satt.")
28+
.addConstraintViolation();
29+
ok = false;
30+
}
31+
if (krevTom && periode.getTilOgMed() == null) {
32+
constraintContext.disableDefaultConstraintViolation();
33+
constraintContext.buildConstraintViolationWithTemplate("[påkrevd] Til og med (TOM) må være satt.")
34+
.addConstraintViolation();
35+
ok = false;
36+
}
37+
if (periode.isTilOgMedFørFraOgMed()) {
38+
//valideres direkte på Periode vha @Valid
39+
//unngår å ta med her, for å unngå duplikater
40+
}
41+
return ok;
42+
}
43+
44+
}

soknad/src/main/java/no/nav/k9/søknad/felles/type/validering/GyldigePerioderMapValidator.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,25 @@ public void initialize(GyldigePerioderMap konfig) {
2323
public boolean isValid(Map<Periode, ?> value, ConstraintValidatorContext constraintContext) {
2424
int i = 0;
2525
boolean ok = true;
26-
if (value == null){
26+
if (value == null) {
2727
return true; //hvis påkrevd, bruk @NotNull
2828
}
2929
for (Periode periode : value.keySet()) {
3030
if (krevFom && periode.getFraOgMed() == null) {
3131
constraintContext.disableDefaultConstraintViolation();
32-
constraintContext.buildConstraintViolationWithTemplate("[ugyldigPeriode] Fra og med (FOM) må være satt.")
32+
constraintContext.buildConstraintViolationWithTemplate("[påkrevd] Fra og med (FOM) må være satt.")
3333
.addContainerElementNode("['" + periode + "']", Periode.class, i)
3434
.addConstraintViolation();
3535
ok = false;
36-
} else if (krevTom && periode.getTilOgMed() == null) {
36+
}
37+
if (krevTom && periode.getTilOgMed() == null) {
3738
constraintContext.disableDefaultConstraintViolation();
38-
constraintContext.buildConstraintViolationWithTemplate("[ugyldigPeriode] Til og med (TOM) må være satt.")
39+
constraintContext.buildConstraintViolationWithTemplate("[påkrevd] Til og med (TOM) må være satt.")
3940
.addContainerElementNode("['" + periode + "']", Periode.class, i)
4041
.addConstraintViolation();
4142
ok = false;
42-
} else if (periode.isTilOgMedFørFraOgMed()) {
43+
}
44+
if (periode.isTilOgMedFørFraOgMed()) {
4345
constraintContext.disableDefaultConstraintViolation();
4446
constraintContext.buildConstraintViolationWithTemplate("[ugyldigPeriode] Fra og med (FOM) må være før eller lik til og med (TOM).")
4547
.addContainerElementNode("['" + periode + "']", Periode.class, i)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package no.nav.k9.søknad.felles.type.validering;
2+
3+
4+
import java.lang.annotation.Documented;
5+
import java.lang.annotation.ElementType;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
import javax.validation.Payload;
11+
import javax.validation.Valid;
12+
13+
@Documented
14+
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
15+
@Retention(RetentionPolicy.RUNTIME)
16+
17+
@Valid
18+
@GyldigPeriode(krevFomDato = true, krevTomDato = true)
19+
public @interface LukketPeriode {
20+
21+
String message() default "Ugyldig periode";
22+
23+
Class<?>[] groups() default {};
24+
25+
Class<? extends Payload>[] payload() default {};
26+
}

soknad/src/main/java/no/nav/k9/søknad/ytelse/pls/v1/PleiepengerLivetsSluttfaseYtelseValidator.java

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,6 @@ private void validerTrekkKravPerioder(LocalDateTimeline<Boolean> trekkKravPeriod
168168
}
169169

170170
private LocalDateTimeline<Boolean> lagTidslinjeOgValider(Map<Periode, ?> periodeMap, String felt, List<Feil> feil) throws ValideringsAvbrytendeFeilException {
171-
var nyFeil = validerPerioderErLukket(periodeMap, felt);
172-
if (!nyFeil.isEmpty()) {
173-
feil.addAll(nyFeil);
174-
throw new ValideringsAvbrytendeFeilException(feil);
175-
}
176171
try {
177172
return toLocalDateTimeline(new ArrayList<>(periodeMap.keySet()));
178173
} catch (IllegalArgumentException e) {
@@ -201,11 +196,6 @@ private LocalDateTimeline<Boolean> lagTidslinjeOgValider(Map<Periode, ?> periode
201196
}
202197

203198
private LocalDateTimeline<Boolean> lagTidslinjeOgValider(List<Periode> periodeList, String felt, List<Feil> feil) throws ValideringsAvbrytendeFeilException {
204-
var nyFeil = validerPerioderErLukket(periodeList, felt);
205-
if (!nyFeil.isEmpty()) {
206-
feil.addAll(nyFeil);
207-
throw new ValideringsAvbrytendeFeilException(feil);
208-
}
209199
try {
210200
// Kaster feil dersom overlappende perioder
211201
return toLocalDateTimeline(periodeList);
@@ -215,18 +205,6 @@ private LocalDateTimeline<Boolean> lagTidslinjeOgValider(List<Periode> periodeLi
215205
}
216206
}
217207

218-
private List<Feil> validerPerioderErLukket(List<Periode> periodeList, String felt) {
219-
var feil = new ArrayList<Feil>();
220-
for (int i = 0; i < periodeList.size(); i++) {
221-
var periode = periodeList.get(i);
222-
if (periode != null) {
223-
validerPerioderErLukket(periode, felt + "[" + i + "]", feil);
224-
}
225-
}
226-
return feil;
227-
}
228-
229-
230208
private List<Feil> validerPerioderErLukket(Map<Periode, ?> perioder, String felt) {
231209
var feil = new ArrayList<Feil>();
232210
perioder.keySet().forEach(p -> {

soknad/src/main/java/no/nav/k9/søknad/ytelse/pls/v1/PleipengerLivetsSluttfase.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import no.nav.k9.søknad.felles.personopplysninger.Utenlandsopphold;
2323
import no.nav.k9.søknad.felles.type.Periode;
2424
import no.nav.k9.søknad.felles.type.Person;
25+
import no.nav.k9.søknad.felles.type.validering.LukketPeriode;
2526
import no.nav.k9.søknad.ytelse.Ytelse;
2627
import no.nav.k9.søknad.ytelse.YtelseValidator;
2728
import no.nav.k9.søknad.ytelse.psb.v1.LovbestemtFerie;
@@ -42,12 +43,12 @@ public class PleipengerLivetsSluttfase implements Ytelse {
4243
@NotNull
4344
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
4445
@JsonProperty(value = "søknadsperiode", required = true)
45-
private List<@NotNull @Valid Periode> søknadsperiode = new ArrayList<>();
46+
private List<@NotNull @LukketPeriode Periode> søknadsperiode = new ArrayList<>();
4647

4748
@Valid
4849
@JsonProperty(value = "trekkKravPerioder", required = true)
4950
@NotNull
50-
private List<@NotNull @Valid Periode> trekkKravPerioder = new ArrayList<>();
51+
private List<@NotNull @LukketPeriode Periode> trekkKravPerioder = new ArrayList<>();
5152

5253
@Valid
5354
@JsonProperty(value = "opptjeningAktivitet")

soknad/src/main/java/no/nav/k9/søknad/ytelse/psb/v1/PerioderMedEndringUtil.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,10 @@ public static List<PerioderMedEndring> getArbeidstidPerioder(Arbeidstid arbeidst
4747
}
4848
}
4949
if (arbeidstid.getFrilanserArbeidstidInfo().isPresent()) {
50-
listen.add(new PerioderMedEndring().medPerioder("arbeidstid.frilanser",
51-
arbeidstid.getFrilanserArbeidstidInfo().get().getPerioder()));
50+
listen.add(new PerioderMedEndring().medPerioder("arbeidstid.frilanser", arbeidstid.getFrilanserArbeidstidInfo().get().getPerioder()));
5251
}
5352
if (arbeidstid.getSelvstendigNæringsdrivendeArbeidstidInfo().isPresent()) {
54-
listen.add(new PerioderMedEndring().medPerioder("arbeidstid.selvstendigNæringsdrivende",
55-
arbeidstid.getSelvstendigNæringsdrivendeArbeidstidInfo().get().getPerioder()));
53+
listen.add(new PerioderMedEndring().medPerioder("arbeidstid.selvstendigNæringsdrivende", arbeidstid.getSelvstendigNæringsdrivendeArbeidstidInfo().get().getPerioder()));
5654
}
5755
return listen;
5856
}

soknad/src/main/java/no/nav/k9/søknad/ytelse/psb/v1/PleiepengerSyktBarn.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import no.nav.k9.søknad.felles.personopplysninger.Utenlandsopphold;
2525
import no.nav.k9.søknad.felles.type.Periode;
2626
import no.nav.k9.søknad.felles.type.Person;
27+
import no.nav.k9.søknad.felles.type.validering.LukketPeriode;
2728
import no.nav.k9.søknad.ytelse.Ytelse;
2829
import no.nav.k9.søknad.ytelse.YtelseValidator;
2930
import no.nav.k9.søknad.ytelse.psb.v1.arbeidstid.Arbeidstid;
@@ -43,18 +44,18 @@ public class PleiepengerSyktBarn implements Ytelse {
4344
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
4445
@JsonProperty(value = "søknadsperiode", required = true)
4546
@NotNull
46-
private List<@NotNull @Valid Periode> søknadsperiode = new ArrayList<>();
47+
private List<@NotNull @LukketPeriode Periode> søknadsperiode = new ArrayList<>();
4748

4849
@Deprecated
4950
@Valid
5051
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
5152
@JsonProperty(value = "endringsperiode", required = true)
52-
private List<@NotNull @Valid Periode> endringsperiode = new ArrayList<>();
53+
private List<@NotNull @LukketPeriode Periode> endringsperiode = new ArrayList<>();
5354

5455
@Valid
5556
@JsonProperty(value = "trekkKravPerioder", required = true)
5657
@NotNull
57-
private List<@NotNull @Valid Periode> trekkKravPerioder = new ArrayList<>();
58+
private List<@NotNull @LukketPeriode Periode> trekkKravPerioder = new ArrayList<>();
5859

5960
@Valid
6061
@JsonProperty(value = "opptjeningAktivitet")

soknad/src/main/java/no/nav/k9/søknad/ytelse/psb/v1/PleiepengerSyktBarnYtelseValidator.java

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,6 @@ private Feil lagFeil(String felt, String feilkode, String feilmelding) {
172172
}
173173

174174
private LocalDateTimeline<Boolean> lagTidslinjeOgValider(List<Periode> periodeList, String felt, List<Feil> feil) throws ValideringsAvbrytendeFeilException {
175-
var nyFeil = validerPerioderErLukketOgGyldig(periodeList, felt);
176-
if (!nyFeil.isEmpty()) {
177-
feil.addAll(nyFeil);
178-
throw new ValideringsAvbrytendeFeilException(feil);
179-
}
180175
try {
181176
return toLocalDateTimeline(periodeList);
182177
} catch (IllegalArgumentException e) {
@@ -186,11 +181,6 @@ private LocalDateTimeline<Boolean> lagTidslinjeOgValider(List<Periode> periodeLi
186181
}
187182

188183
private LocalDateTimeline<Boolean> lagTidslinjeOgValider(Map<Periode, ?> periodeMap, String felt, List<Feil> feil) throws ValideringsAvbrytendeFeilException {
189-
var nyFeil = validerPerioderErLukketOgGyldig(periodeMap, felt);
190-
if (!nyFeil.isEmpty()) {
191-
feil.addAll(nyFeil);
192-
throw new ValideringsAvbrytendeFeilException(feil);
193-
}
194184
try {
195185
return toLocalDateTimeline(new ArrayList<>(periodeMap.keySet()));
196186
} catch (IllegalArgumentException e) {
@@ -199,32 +189,6 @@ private LocalDateTimeline<Boolean> lagTidslinjeOgValider(Map<Periode, ?> periode
199189
}
200190
}
201191

202-
private List<Feil> validerPerioderErLukketOgGyldig(Map<Periode, ?> perioder, String felt) {
203-
var feil = new ArrayList<Feil>();
204-
perioder.keySet().forEach(p -> validerPerioderErLukket(p, felt + "['" + p + "']", feil));
205-
return feil;
206-
}
207-
208-
private List<Feil> validerPerioderErLukketOgGyldig(List<Periode> periodeList, String felt) {
209-
var feil = new ArrayList<Feil>();
210-
for (int i = 0; i < periodeList.size(); i++) {
211-
var periode = periodeList.get(i);
212-
if (periode != null) {
213-
validerPerioderErLukket(periode, felt + "[" + i + "]", feil);
214-
}
215-
}
216-
return feil;
217-
}
218-
219-
private void validerPerioderErLukket(Periode periode, String felt, List<Feil> feil) {
220-
if (periode.getTilOgMed() == null) {
221-
feil.add(lagFeil(felt, "påkrevd", "Til og med (TOM) må være satt."));
222-
}
223-
if (periode.getFraOgMed() == null) {
224-
feil.add(lagFeil(felt, "påkrevd", "Fra og med (FOM) må være satt."));
225-
}
226-
}
227-
228192
static class ValideringsAvbrytendeFeilException extends RuntimeException {
229193

230194
private final List<Feil> feilList;

0 commit comments

Comments
 (0)