Skip to content

Commit 3254a7e

Browse files
authored
OMP støtte for å opplyse normalarbeidstid i søknad om utbetaling (#296)
1 parent da34c2f commit 3254a7e

20 files changed

+816
-56
lines changed

soknad/src/main/java/no/nav/k9/søknad/Validator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public void forsikreValidert(Søknad dok) {
4747

4848
private void validerYtelse(Søknad dok, List<Feil> feil) {
4949
var ytelse = dok.getYtelse();
50-
var validator = ytelse.getValidator();
50+
var validator = ytelse.getValidator(dok.getVersjon());
5151

5252
var ytelseFeil = validator.valider(ytelse);
5353
feil.addAll(ytelseFeil);
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package no.nav.k9.søknad.felles.fravær;
2+
3+
import java.math.BigDecimal;
4+
import java.math.RoundingMode;
5+
import java.time.Duration;
6+
import java.util.Objects;
7+
8+
import javax.validation.constraints.NotNull;
9+
10+
import org.hibernate.validator.constraints.time.DurationMax;
11+
import org.hibernate.validator.constraints.time.DurationMin;
12+
13+
import com.fasterxml.jackson.annotation.JsonAutoDetect;
14+
import com.fasterxml.jackson.annotation.JsonCreator;
15+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
16+
import com.fasterxml.jackson.annotation.JsonProperty;
17+
18+
@JsonIgnoreProperties(ignoreUnknown = true)
19+
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
20+
public class DelvisFravær {
21+
22+
@JsonProperty("normalarbeidstid")
23+
@DurationMin(hours = 0, minutes = 1, message = "[ugyldigVerdi] Må være større enn 0.")
24+
@DurationMax(hours = 24, message = "[ugyldigVerdi] Må være lavere eller lik 24 timer.")
25+
@NotNull
26+
private final Duration normalarbeidstid;
27+
28+
@JsonProperty("fravær")
29+
@DurationMin(hours = 0, message = "[ugyldigVerdi] Må være større enn 0.")
30+
@DurationMax(hours = 24, message = "[ugyldigVerdi] Må være lavere eller lik 24 timer.")
31+
@NotNull
32+
private final Duration fravær;
33+
34+
@JsonCreator
35+
public DelvisFravær(@JsonProperty("normalarbeidstid") Duration normalarbeidstid,
36+
@JsonProperty("fravær") Duration fravær) {
37+
this.normalarbeidstid = normalarbeidstid;
38+
this.fravær = fravær;
39+
}
40+
41+
public Duration getNormalarbeidstid() {
42+
return normalarbeidstid;
43+
}
44+
45+
public Duration getFravær() {
46+
return fravær;
47+
}
48+
49+
@Override
50+
public boolean equals(Object o) {
51+
if (this == o) return true;
52+
if (o == null || getClass() != o.getClass()) return false;
53+
DelvisFravær that = (DelvisFravær) o;
54+
return normalarbeidstid.equals(that.normalarbeidstid) && fravær.equals(that.fravær);
55+
}
56+
57+
@Override
58+
public int hashCode() {
59+
return Objects.hash(normalarbeidstid, fravær);
60+
}
61+
62+
@Override
63+
public String toString() {
64+
return "DelvisFravær{" +
65+
"normalarbeidstid=" + normalarbeidstid +
66+
", fravær=" + fravær +
67+
'}';
68+
}
69+
70+
public Duration normalisertTilStandarddag() {
71+
Duration standardDag = Duration.ofHours(7).plusMinutes(30);
72+
73+
// normalisert (antall sekunder) = varighetStandarddag * oppgittFravær / oppgittNormalarbeidstid.
74+
// normalisert (antall halvtimer) = varighetStandarddag * oppgittFravær / oppgittNormalarbeidstid / 1800. siden det er 1800 sekund i en halvtime
75+
// normalisert (antall halvtimer) = varighetStandarddag * oppgittFravær / (oppgittNormalarbeidstid * 1800) for å ha kun en avrunding (ved divisjon)
76+
77+
long normalisertAntallHalvtimer = BigDecimal.valueOf(standardDag.getSeconds() * getFravær().getSeconds())
78+
.divide(BigDecimal.valueOf(getNormalarbeidstid().getSeconds() * 1800), 0, RoundingMode.UP).longValue();
79+
long timer = normalisertAntallHalvtimer / 2;
80+
int minutter = normalisertAntallHalvtimer % 2 == 1 ? 30 : 0;
81+
return Duration.ofHours(timer).plusMinutes(minutter);
82+
}
83+
}

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

Lines changed: 89 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,27 @@ public class FraværPeriode implements Comparable<FraværPeriode> {
2424
@Valid
2525
@NotNull
2626
@JsonProperty("periode")
27-
private final Periode periode;
27+
private Periode periode;
28+
2829
@JsonProperty("duration")
29-
private final Duration duration;
30+
private Duration duration; //OBS sattes tidligere direkte ved delvis fravær, men utledes nå fra verdier i feltet delvisFravær. Indikerer hvor mye fravær det er, etter at det er omregnet til 7.5 times normalarbeidsdag.
31+
32+
@Valid
33+
@JsonProperty("delvisFravær")
34+
private DelvisFravær delvisFravær; //denne brukes hvis det er mindre enn 100% fravær fra arbeid i aktuell periode
3035

3136
@Valid
3237
@JsonProperty(value = "årsak", required = true)
33-
private final FraværÅrsak årsak;
38+
private FraværÅrsak årsak;
3439

3540
@Valid
3641
@JsonProperty(value = "søknadÅrsak")
3742
private SøknadÅrsak søknadÅrsak;
3843

39-
//TODO konverter fra liste til enkeltelement
4044
@Valid
41-
@Size(min = 1, max = 1)
45+
@Size(min = 1, max = 2)
4246
@JsonProperty(value = "aktivitetFravær", required = true)
43-
private final List<AktivitetFravær> aktivitetFravær;
47+
private List<AktivitetFravær> aktivitetFravær;
4448

4549
@JsonProperty(value = "arbeidsgiverOrgNr")
4650
@Valid
@@ -50,24 +54,95 @@ public class FraværPeriode implements Comparable<FraværPeriode> {
5054
@Valid
5155
private String arbeidsforholdId;
5256

57+
public FraværPeriode() {
58+
}
59+
5360
@JsonCreator
5461
public FraværPeriode(
5562
@JsonProperty("periode") @Valid Periode periode,
5663
@JsonProperty("duration") Duration duration,
64+
@JsonProperty("delvisFravær") DelvisFravær delvisFravær,
5765
@JsonProperty("årsak") FraværÅrsak årsak,
5866
@JsonProperty("søknadÅrsak") SøknadÅrsak søknadÅrsak,
5967
@JsonProperty("aktivitetFravær") List<AktivitetFravær> aktivitetFravær,
6068
@JsonProperty("organisasjonsnummer") Organisasjonsnummer arbeidsgiverOrgNr,
6169
@JsonProperty("arbeidsforholdId") String arbeidsforholdId) {
6270
this.periode = periode;
6371
this.duration = duration;
72+
this.delvisFravær = delvisFravær;
6473
this.årsak = årsak;
6574
this.søknadÅrsak = søknadÅrsak;
6675
this.aktivitetFravær = aktivitetFravær.stream().sorted().collect(Collectors.toList()); //sorterer for å få enklere equals og hashcode
6776
this.arbeidsgiverOrgNr = arbeidsgiverOrgNr;
6877
this.arbeidsforholdId = arbeidsforholdId;
6978
}
7079

80+
public FraværPeriode medPeriode(Periode periode) {
81+
this.periode = periode;
82+
return this;
83+
}
84+
85+
public FraværPeriode medSøknadsårsak(SøknadÅrsak søknadÅrsak) {
86+
this.søknadÅrsak = søknadÅrsak;
87+
return this;
88+
}
89+
90+
public FraværPeriode medFraværÅrsak(FraværÅrsak fraværÅrsak) {
91+
this.årsak = fraværÅrsak;
92+
return this;
93+
}
94+
95+
public FraværPeriode medNulling(){
96+
this.delvisFravær = null;
97+
this.duration = Duration.ZERO;
98+
return this;
99+
}
100+
101+
public FraværPeriode medDelvisFravær(DelvisFravær delvisFravær) {
102+
this.delvisFravær = delvisFravær;
103+
oppdaterDuration();
104+
return this;
105+
}
106+
107+
public FraværPeriode medNormalarbeidstid(Duration normalarbeidstid) {
108+
DelvisFravær delvisFravær = new DelvisFravær(normalarbeidstid, this.delvisFravær != null ? this.delvisFravær.getFravær() : null);
109+
this.delvisFravær = delvisFravær.getNormalarbeidstid() == null && delvisFravær.getFravær() == null
110+
? null
111+
: delvisFravær;
112+
oppdaterDuration();
113+
return this;
114+
}
115+
116+
private void oppdaterDuration() {
117+
this.duration = delvisFravær == null || delvisFravær.getFravær() == null || delvisFravær.getNormalarbeidstid() == null || delvisFravær.getNormalarbeidstid().isZero()
118+
? null
119+
: delvisFravær.normalisertTilStandarddag();
120+
}
121+
122+
public FraværPeriode medFravær(Duration fravær) {
123+
DelvisFravær delvisFravær = new DelvisFravær(this.delvisFravær != null ? this.delvisFravær.getNormalarbeidstid() : null, fravær);
124+
this.delvisFravær = delvisFravær.getNormalarbeidstid() == null && delvisFravær.getFravær() == null
125+
? null
126+
: delvisFravær;
127+
oppdaterDuration();
128+
return this;
129+
}
130+
131+
public FraværPeriode medAktivitetFravær(AktivitetFravær aktivitetFravær) {
132+
this.aktivitetFravær = List.of(aktivitetFravær);
133+
return this;
134+
}
135+
136+
public FraværPeriode medArbeidsgiverOrgNr(Organisasjonsnummer arbeidsgiverOrgNr) {
137+
this.arbeidsgiverOrgNr = arbeidsgiverOrgNr;
138+
return this;
139+
}
140+
141+
public FraværPeriode medArbeidsforholdId(String arbeidsforholdId) {
142+
this.arbeidsforholdId = arbeidsforholdId;
143+
return this;
144+
}
145+
71146
public Periode getPeriode() {
72147
return periode;
73148
}
@@ -76,6 +151,10 @@ public Duration getDuration() {
76151
return duration;
77152
}
78153

154+
public DelvisFravær getDelvisFravær() {
155+
return delvisFravær;
156+
}
157+
79158
public FraværÅrsak getÅrsak() {
80159
return årsak;
81160
}
@@ -103,6 +182,7 @@ public boolean equals(Object o) {
103182
FraværPeriode that = (FraværPeriode) o;
104183
return periode.equals(that.periode) &&
105184
Objects.equals(duration, that.duration) &&
185+
Objects.equals(delvisFravær, that.delvisFravær) &&
106186
Objects.equals(årsak, that.årsak) &&
107187
Objects.equals(aktivitetFravær, that.aktivitetFravær) &&
108188
Objects.equals(søknadÅrsak, that.søknadÅrsak) &&
@@ -112,7 +192,7 @@ public boolean equals(Object o) {
112192

113193
@Override
114194
public int hashCode() {
115-
return Objects.hash(periode, duration, årsak, aktivitetFravær, søknadÅrsak, arbeidsgiverOrgNr, arbeidsforholdId);
195+
return Objects.hash(periode, duration, delvisFravær, årsak, aktivitetFravær, søknadÅrsak, arbeidsgiverOrgNr, arbeidsforholdId);
116196
}
117197

118198
@Override
@@ -124,7 +204,8 @@ public int compareTo(FraværPeriode b) {
124204
public String toString() {
125205
return "FraværPeriode{" +
126206
"periode=" + periode +
127-
", duration=" + duration +
207+
(duration != null ? ", duration=" + duration : "") +
208+
(delvisFravær != null ? ", delvisFravær=" + delvisFravær : "") +
128209
", årsak=" + årsak +
129210
", søknadÅrsak=" + søknadÅrsak +
130211
", fraværFraAktivitet=" + aktivitetFravær +

soknad/src/main/java/no/nav/k9/søknad/ytelse/Ytelse.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.fasterxml.jackson.annotation.JsonTypeInfo;
1010
import com.fasterxml.jackson.annotation.JsonValue;
1111

12+
import no.nav.k9.søknad.felles.Versjon;
1213
import no.nav.k9.søknad.felles.type.Periode;
1314
import no.nav.k9.søknad.felles.type.Person;
1415
import no.nav.k9.søknad.ytelse.omsorgspenger.utvidetrett.v1.OmsorgspengerAleneOmsorg;
@@ -43,7 +44,12 @@ public interface Ytelse {
4344

4445
Ytelse.Type getType();
4546

46-
YtelseValidator getValidator();
47+
@Deprecated //bruk getValidator(Versjon versjon) istedet
48+
default YtelseValidator getValidator() {
49+
return getValidator(null);
50+
}
51+
52+
YtelseValidator getValidator(Versjon versjon);
4753

4854
/**
4955
* @return andre berørte, kjente identifiserte personer (enn søker) - f.eks. barn, ektefelle, verge etc. som er involveres i denne saken.

soknad/src/main/java/no/nav/k9/søknad/ytelse/olp/v1/Opplæringspenger.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.fasterxml.jackson.annotation.JsonProperty;
1717
import com.fasterxml.jackson.annotation.JsonTypeName;
1818

19+
import no.nav.k9.søknad.felles.Versjon;
1920
import no.nav.k9.søknad.felles.opptjening.OpptjeningAktivitet;
2021
import no.nav.k9.søknad.felles.personopplysninger.Barn;
2122
import no.nav.k9.søknad.felles.personopplysninger.Bosteder;
@@ -256,7 +257,7 @@ public Type getType() {
256257
}
257258

258259
@Override
259-
public YtelseValidator getValidator() {
260+
public YtelseValidator getValidator(Versjon versjon) {
260261
return new OpplæringspengerYtelseValidator();
261262
}
262263
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.fasterxml.jackson.annotation.JsonProperty;
1313

1414
import no.nav.k9.søknad.felles.Feil;
15+
import no.nav.k9.søknad.felles.Versjon;
1516
import no.nav.k9.søknad.felles.personopplysninger.Barn;
1617
import no.nav.k9.søknad.felles.type.Periode;
1718
import no.nav.k9.søknad.felles.type.Person;
@@ -50,7 +51,7 @@ public Type getType() {
5051
}
5152

5253
@Override
53-
public YtelseValidator getValidator() {
54+
public YtelseValidator getValidator(Versjon versjon) {
5455
return new MinValidator();
5556
}
5657

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

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

66
import javax.validation.Valid;
7+
import javax.validation.constraints.Min;
78
import javax.validation.constraints.NotNull;
89

910
import com.fasterxml.jackson.annotation.JsonAutoDetect;
@@ -12,6 +13,7 @@
1213
import com.fasterxml.jackson.annotation.JsonProperty;
1314

1415
import no.nav.k9.søknad.felles.Feil;
16+
import no.nav.k9.søknad.felles.Versjon;
1517
import no.nav.k9.søknad.felles.personopplysninger.Barn;
1618
import no.nav.k9.søknad.felles.type.Person;
1719
import no.nav.k9.søknad.felles.type.Periode;
@@ -62,6 +64,11 @@ public YtelseValidator getValidator() {
6264
return new MinValidator();
6365
}
6466

67+
@Override
68+
public YtelseValidator getValidator(Versjon versjon) {
69+
return new MinValidator();
70+
}
71+
6572
@Override
6673
public List<Person> getBerørtePersoner() {
6774
return List.of(barn);

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.fasterxml.jackson.annotation.JsonProperty;
2020

2121
import no.nav.k9.søknad.felles.Feil;
22+
import no.nav.k9.søknad.felles.Versjon;
2223
import no.nav.k9.søknad.felles.personopplysninger.Barn;
2324
import no.nav.k9.søknad.felles.type.Periode;
2425
import no.nav.k9.søknad.felles.type.Person;
@@ -79,7 +80,7 @@ public Type getType() {
7980
}
8081

8182
@Override
82-
public YtelseValidator getValidator() {
83+
public YtelseValidator getValidator(Versjon versjon) {
8384
return new MinValidator();
8485
}
8586

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.fasterxml.jackson.annotation.JsonProperty;
1414
import com.fasterxml.jackson.annotation.JsonTypeName;
1515

16+
import no.nav.k9.søknad.felles.Versjon;
1617
import no.nav.k9.søknad.felles.fravær.FraværPeriode;
1718
import no.nav.k9.søknad.felles.opptjening.OpptjeningAktivitet;
1819
import no.nav.k9.søknad.felles.personopplysninger.Barn;
@@ -134,8 +135,8 @@ public Type getType() {
134135
}
135136

136137
@Override
137-
public YtelseValidator getValidator() {
138-
return new OmsorgspengerUtbetalingValidator();
138+
public YtelseValidator getValidator(Versjon versjon) {
139+
return new OmsorgspengerUtbetalingValidator(versjon);
139140
}
140141

141142
public OmsorgspengerUtbetaling medFosterbarn(List<Barn> barn) {

0 commit comments

Comments
 (0)