Skip to content

Commit 5af526e

Browse files
authored
Legger til OmsorgspengerFraværskorrigeringInntektsmelding (#204)
* Legger til OmsorgspengerFraværskorrigeringInntektsmelding * Legger til validering for periode > 7 dager * Legger til validering for nullede perioder, fjerner validering for periode > 7 dager * Legger til validering for delvis fravær > 7.5 timer * Legger til arbeidsforholdId i FraværPeriode Nødvendig for å kunne korrigere inntektsmeldinger
1 parent df8e6f3 commit 5af526e

File tree

5 files changed

+309
-3
lines changed

5 files changed

+309
-3
lines changed

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,26 @@ public class FraværPeriode implements Comparable<FraværPeriode> {
4444
@Valid
4545
private Organisasjonsnummer arbeidsgiverOrgNr;
4646

47+
@JsonProperty(value = "arbeidsforholdId")
48+
@Valid
49+
private String arbeidsforholdId;
50+
4751
@JsonCreator
4852
public FraværPeriode(
4953
@JsonProperty("periode") @Valid Periode periode,
5054
@JsonProperty("duration") Duration duration,
5155
@JsonProperty("årsak") FraværÅrsak årsak,
5256
@JsonProperty("søknadÅrsak") SøknadÅrsak søknadÅrsak,
5357
@JsonProperty("aktivitetFravær") List<AktivitetFravær> aktivitetFravær,
54-
@JsonProperty("organisasjonsnummer") Organisasjonsnummer arbeidsgiverOrgNr) {
58+
@JsonProperty("organisasjonsnummer") Organisasjonsnummer arbeidsgiverOrgNr,
59+
@JsonProperty("arbeidsforholdId") String arbeidsforholdId) {
5560
this.periode = periode;
5661
this.duration = duration;
5762
this.årsak = årsak;
5863
this.søknadÅrsak = søknadÅrsak;
5964
this.aktivitetFravær = aktivitetFravær.stream().sorted().collect(Collectors.toList()); //sorterer for å få enklere equals og hashcode
6065
this.arbeidsgiverOrgNr = arbeidsgiverOrgNr;
66+
this.arbeidsforholdId = arbeidsforholdId;
6167
}
6268

6369
public Periode getPeriode() {
@@ -84,6 +90,10 @@ public Organisasjonsnummer getArbeidsgiverOrgNr() {
8490
return arbeidsgiverOrgNr;
8591
}
8692

93+
public String getArbeidsforholdId() {
94+
return arbeidsforholdId;
95+
}
96+
8797
@Override
8898
public boolean equals(Object o) {
8999
if (this == o) return true;
@@ -93,12 +103,13 @@ public boolean equals(Object o) {
93103
Objects.equals(duration, that.duration) &&
94104
Objects.equals(årsak, that.årsak) &&
95105
Objects.equals(aktivitetFravær, that.aktivitetFravær) &&
96-
Objects.equals(arbeidsgiverOrgNr, that.arbeidsgiverOrgNr);
106+
Objects.equals(arbeidsgiverOrgNr, that.arbeidsgiverOrgNr) &&
107+
Objects.equals(aktivitetFravær, that.arbeidsforholdId);
97108
}
98109

99110
@Override
100111
public int hashCode() {
101-
return Objects.hash(periode, duration, årsak, aktivitetFravær, arbeidsgiverOrgNr);
112+
return Objects.hash(periode, duration, årsak, aktivitetFravær, arbeidsgiverOrgNr, arbeidsforholdId);
102113
}
103114

104115
@Override
@@ -115,6 +126,7 @@ public String toString() {
115126
", søknadÅrsak=" + søknadÅrsak +
116127
", fraværFraAktivitet=" + aktivitetFravær +
117128
(arbeidsgiverOrgNr != null ? ", arbeidsgiverOrgNr=MASKERT" : "") +
129+
(arbeidsforholdId != null ? ", arbeidsforholdId=MASKERT" : "") +
118130
'}';
119131
}
120132

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package no.nav.k9.søknad.ytelse.omsorgspenger.fraværskorrigering.v1;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
6+
7+
import javax.validation.Valid;
8+
import javax.validation.constraints.NotNull;
9+
import javax.validation.constraints.Size;
10+
11+
import com.fasterxml.jackson.annotation.JsonAutoDetect;
12+
import com.fasterxml.jackson.annotation.JsonCreator;
13+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
14+
import com.fasterxml.jackson.annotation.JsonProperty;
15+
import com.fasterxml.jackson.annotation.JsonTypeName;
16+
17+
import no.nav.k9.søknad.felles.fravær.FraværPeriode;
18+
import no.nav.k9.søknad.felles.type.Periode;
19+
import no.nav.k9.søknad.felles.type.Person;
20+
import no.nav.k9.søknad.ytelse.Ytelse;
21+
import no.nav.k9.søknad.ytelse.YtelseValidator;
22+
23+
@JsonIgnoreProperties(ignoreUnknown = true)
24+
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
25+
@JsonTypeName(Ytelse.OMSORGSPENGER_UTBETALING)
26+
public class OmsorgspengerFraværskorrigeringInntektsmelding implements Ytelse {
27+
28+
29+
@Valid
30+
@NotNull
31+
@Size(min = 1, message = "Minst 1 fraværsperiode må oppgis")
32+
@JsonProperty(value = "fraværsperioder", required = true)
33+
private List<FraværPeriode> fraværsperioder;
34+
35+
public OmsorgspengerFraværskorrigeringInntektsmelding() {
36+
//
37+
}
38+
39+
@JsonCreator
40+
public OmsorgspengerFraværskorrigeringInntektsmelding(@JsonProperty(value = "fraværsperioder", required = true) @Valid @NotNull @Size(min = 1) List<FraværPeriode> fraværsperioder) {
41+
this.fraværsperioder = fraværsperioder;
42+
}
43+
44+
public List<FraværPeriode> getFraværsperioder() {
45+
return fraværsperioder == null ? null : Collections.unmodifiableList(fraværsperioder);
46+
}
47+
48+
49+
/**
50+
* har ikke egen søknadsperiode for omsorgspenger, men angir på bakggrunn av angitte fraværsperioder.
51+
*/
52+
@Override
53+
public Periode getSøknadsperiode() {
54+
var fom = fraværsperioder.stream().min(FraværPeriode::compareTo).orElseThrow().getPeriode().getFraOgMed();
55+
var tom = fraværsperioder.stream().max(FraværPeriode::compareTo).orElseThrow().getPeriode().getTilOgMed();
56+
return new Periode(fom, tom);
57+
}
58+
59+
@Override
60+
public Type getType() {
61+
return Type.OMSORGSPENGER_UTBETALING;
62+
}
63+
64+
@Override
65+
public List<Person> getBerørtePersoner() {
66+
return null;
67+
}
68+
69+
@Override
70+
public Person getPleietrengende() {
71+
return null;
72+
}
73+
74+
@Override
75+
public Person getAnnenPart() {
76+
return null;
77+
}
78+
79+
public OmsorgspengerFraværskorrigeringInntektsmelding medFraværsperioder(List<FraværPeriode> fraværsperioder) {
80+
if (this.fraværsperioder == null)
81+
this.fraværsperioder = new ArrayList<>();
82+
this.fraværsperioder.addAll(fraværsperioder);
83+
return this;
84+
}
85+
86+
@Override
87+
public YtelseValidator getValidator() {
88+
return new OmsorgspengerFraværskorrigeringInntektsmeldingValidator();
89+
}
90+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package no.nav.k9.søknad.ytelse.omsorgspenger.fraværskorrigering.v1;
2+
3+
import java.time.Duration;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
import java.util.Objects;
7+
import java.util.stream.Collectors;
8+
9+
import no.nav.k9.søknad.PeriodeValidator;
10+
import no.nav.k9.søknad.felles.Feil;
11+
import no.nav.k9.søknad.felles.fravær.AktivitetFravær;
12+
import no.nav.k9.søknad.felles.fravær.FraværPeriode;
13+
import no.nav.k9.søknad.felles.type.Organisasjonsnummer;
14+
import no.nav.k9.søknad.ytelse.Ytelse;
15+
import no.nav.k9.søknad.ytelse.YtelseValidator;
16+
17+
public class OmsorgspengerFraværskorrigeringInntektsmeldingValidator extends YtelseValidator {
18+
private final PeriodeValidator periodeValidator;
19+
20+
public OmsorgspengerFraværskorrigeringInntektsmeldingValidator() {
21+
this.periodeValidator = new PeriodeValidator();
22+
}
23+
24+
@Override
25+
public List<Feil> valider(Ytelse ytelse) {
26+
var fraværskorrigering = (OmsorgspengerFraværskorrigeringInntektsmelding) ytelse;
27+
28+
List<Feil> feil = new ArrayList<>();
29+
feil.addAll(validerPeriodeOverlapp(fraværskorrigering));
30+
feil.addAll(validerFraværsperioder(fraværskorrigering));
31+
return feil;
32+
}
33+
34+
private List<Feil> validerPeriodeOverlapp(OmsorgspengerFraværskorrigeringInntektsmelding dokument) {
35+
var perioder = dokument.getFraværsperioder().stream().collect(Collectors.toMap(e -> e.getPeriode(), e -> e.getArbeidsgiverOrgNr()));
36+
return periodeValidator.validerIkkeTillattOverlapp(perioder, "fraværsperioder.perioder");
37+
}
38+
39+
private List<Feil> validerFraværsperioder(OmsorgspengerFraværskorrigeringInntektsmelding ytelse) {
40+
var fraværsperioder = ytelse.getFraværsperioder();
41+
var index = 0;
42+
Organisasjonsnummer uniktOrgnr = null;
43+
String unikArbeidsforholdId = null;
44+
List<Feil> feil = new ArrayList<>();
45+
46+
for (FraværPeriode fraværPeriode : fraværsperioder) {
47+
if (index == 0) {
48+
// Initier verdier for arbeidsforhold som skal være konsistente for alle fraværsperioder
49+
uniktOrgnr = fraværPeriode.getArbeidsgiverOrgNr();
50+
unikArbeidsforholdId = fraværPeriode.getArbeidsforholdId();
51+
}
52+
if (fraværPeriode.getArbeidsgiverOrgNr() == null) {
53+
feil.add(new Feil("fraværsperioder[" + index + "]", "ikkeSpesifisertOrgNr", "Må oppgi orgnr for aktivitet"));
54+
} else if (!Objects.equals(fraværPeriode.getArbeidsgiverOrgNr(), uniktOrgnr)) {
55+
feil.add(new Feil("fraværsperioder[" + index + "]", "ikkeUniktOrgNr", "Alle aktiviteter må ha samme orgnr"));
56+
}
57+
if (!Objects.equals(fraværPeriode.getArbeidsforholdId(), unikArbeidsforholdId)) {
58+
feil.add(new Feil("fraværsperioder[" + index + "]", "ikkeUnikArbeidsforholdId", "Alle aktiviteter må ha samme orgnr"));
59+
}
60+
61+
var aktiviteterFravær = fraværPeriode.getAktivitetFravær();
62+
if (aktiviteterFravær.size() != 1) {
63+
feil.add(new Feil("fraværsperioder[" + index + "]", "ikkeEntydigAktivitet", "Kan kun oppgi én aktivitet"));
64+
} else if (aktiviteterFravær.iterator().next() != AktivitetFravær.ARBEIDSTAKER) {
65+
feil.add(new Feil("fraværsperioder[" + index + "]", "ikkeGyldigAktivitet", "Aktivitet må være av type Arbeidstaker"));
66+
}
67+
68+
if (Duration.ZERO.equals(fraværPeriode.getDuration()) && !fraværPeriode.getPeriode().getFraOgMed().equals(fraværPeriode.getPeriode().getTilOgMed())) {
69+
feil.add(new Feil("fraværsperioder[" + index + "]", "nullingPeriodeOversteget", "Nulling av periode kan ikke ha lenger varighet enn én dag"));
70+
}
71+
72+
if (fraværPeriode.getDuration() != null && fraværPeriode.getDuration().compareTo(Duration.parse("PT7H30M")) == 1) {
73+
feil.add(new Feil("fraværsperioder[" + index + "]", "varighetOversteget", "Delvis fravær kan ikke overstige 7 timer og 30 min"));
74+
}
75+
76+
index++;
77+
}
78+
return feil;
79+
}
80+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package no.nav.k9.søknad.ytelse.omsorgspenger.fraværskorrigering.v1;
2+
3+
import static no.nav.k9.søknad.ytelse.psb.TestUtils.feilInneholder;
4+
import static org.assertj.core.api.Assertions.assertThat;
5+
6+
import java.time.Duration;
7+
import java.time.LocalDate;
8+
import java.util.List;
9+
10+
import org.junit.jupiter.api.Test;
11+
12+
import no.nav.k9.søknad.felles.fravær.AktivitetFravær;
13+
import no.nav.k9.søknad.felles.fravær.FraværPeriode;
14+
import no.nav.k9.søknad.felles.fravær.FraværÅrsak;
15+
import no.nav.k9.søknad.felles.type.Organisasjonsnummer;
16+
import no.nav.k9.søknad.felles.type.Periode;
17+
18+
class OmsorgspengerFraværskorrigeringInntektsmeldingTest {
19+
20+
private OmsorgspengerFraværskorrigeringInntektsmeldingValidator validatorSøknad = new OmsorgspengerFraværskorrigeringInntektsmeldingValidator();
21+
22+
private Organisasjonsnummer orgnr1 = Organisasjonsnummer.of("999999999");
23+
private Organisasjonsnummer orgnr2 = Organisasjonsnummer.of("816338352");
24+
private String arbforholdId1 = "123";
25+
26+
@Test
27+
public void skal_returnere_ingen_feil_for_komplett_søknad() {
28+
var fulltFraværPeriode = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
29+
var delvisFraværPeriode = new Periode(LocalDate.parse("2021-09-03"), LocalDate.parse("2021-09-04"));
30+
var ytelse = new OmsorgspengerFraværskorrigeringInntektsmelding(List.of(
31+
lagFraværsperiode(orgnr1, arbforholdId1, fulltFraværPeriode, null),
32+
lagFraværsperiode(orgnr1, arbforholdId1, delvisFraværPeriode, Duration.ofHours(4)))
33+
);
34+
35+
var feil = validatorSøknad.valider(ytelse);;
36+
37+
assertThat(feil).isEmpty();
38+
}
39+
40+
@Test
41+
public void skal_returnere_feil_for_nulling_som_overstiger_enkeltdag() {
42+
var fraværPeriode = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
43+
var ytelse = new OmsorgspengerFraværskorrigeringInntektsmelding(List.of(
44+
lagFraværsperiode(orgnr1, arbforholdId1, fraværPeriode, Duration.ofHours(0))
45+
));
46+
47+
var feil = validatorSøknad.valider(ytelse);;
48+
49+
assertThat(feil).hasSize(1);
50+
feilInneholder(feil, "fraværsperioder[0]", "nullingPeriodeOversteget");
51+
}
52+
53+
@Test
54+
public void skal_returnere_feil_for_delvis_fravær_som_overstiger_7h_30m() {
55+
var fraværPeriode = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-01"));
56+
var ytelse = new OmsorgspengerFraværskorrigeringInntektsmelding(List.of(
57+
lagFraværsperiode(orgnr1, arbforholdId1, fraværPeriode, Duration.parse("PT7H31M"))
58+
));
59+
60+
var feil = validatorSøknad.valider(ytelse);;
61+
62+
assertThat(feil).hasSize(1);
63+
feilInneholder(feil, "fraværsperioder[0]", "varighetOversteget");
64+
}
65+
66+
@Test
67+
public void skal_returnere_feil_for_overlappende_perioder() {
68+
var fraværPeriode1 = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
69+
var fraværPeriode2 = new Periode(LocalDate.parse("2021-09-02"), LocalDate.parse("2021-09-03"));
70+
var ytelse = new OmsorgspengerFraværskorrigeringInntektsmelding(List.of(
71+
lagFraværsperiode(orgnr1, arbforholdId1, fraværPeriode1, null),
72+
lagFraværsperiode(orgnr1, arbforholdId1, fraværPeriode2, null)
73+
));
74+
75+
var feil = validatorSøknad.valider(ytelse);;
76+
77+
assertThat(feil).hasSize(2);
78+
feilInneholder(feil, "fraværsperioder.perioder[2021-09-01/2021-09-02]", "overlappendePerioder");
79+
}
80+
81+
@Test
82+
public void skal_returnere_feil_for_flere_orgnr() {
83+
var fraværPeriode1 = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
84+
var fraværPeriode2 = new Periode(LocalDate.parse("2021-09-03"), LocalDate.parse("2021-09-04"));
85+
var ytelse = new OmsorgspengerFraværskorrigeringInntektsmelding(List.of(
86+
lagFraværsperiode(orgnr1, arbforholdId1, fraværPeriode1, null),
87+
lagFraværsperiode(orgnr2, arbforholdId1, fraværPeriode2, null)
88+
));
89+
90+
var feil = validatorSøknad.valider(ytelse);;
91+
92+
assertThat(feil).hasSize(1);
93+
feilInneholder(feil, "fraværsperioder[1]", "ikkeUniktOrgNr");
94+
}
95+
96+
@Test
97+
public void skal_returnere_feil_for_flere_arbeidsforhold_id() {
98+
var fraværPeriode1 = new Periode(LocalDate.parse("2021-09-01"), LocalDate.parse("2021-09-02"));
99+
var fraværPeriode2 = new Periode(LocalDate.parse("2021-09-03"), LocalDate.parse("2021-09-04"));
100+
var ytelse = new OmsorgspengerFraværskorrigeringInntektsmelding(List.of(
101+
lagFraværsperiode(orgnr1, arbforholdId1, fraværPeriode1, null),
102+
lagFraværsperiode(orgnr1, null, fraværPeriode2, null)
103+
));
104+
105+
var feil = validatorSøknad.valider(ytelse);;
106+
107+
assertThat(feil).hasSize(1);
108+
feilInneholder(feil, "fraværsperioder[1]", "ikkeUnikArbeidsforholdId");
109+
}
110+
111+
private FraværPeriode lagFraværsperiode(Organisasjonsnummer organisasjonsnummer, String arbeidsforholdId, Periode søknadsperiode, Duration duration) {
112+
return new FraværPeriode(
113+
søknadsperiode,
114+
duration,
115+
FraværÅrsak.ORDINÆRT_FRAVÆR,
116+
null,
117+
List.of(AktivitetFravær.ARBEIDSTAKER),
118+
organisasjonsnummer,
119+
arbeidsforholdId
120+
);
121+
}
122+
123+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ private static String jsonFromFile(String filename) {
113113
FraværÅrsak.ORDINÆRT_FRAVÆR,
114114
null,
115115
List.of(AktivitetFravær.SELVSTENDIG_VIRKSOMHET),
116+
null,
116117
null
117118
)
118119
),

0 commit comments

Comments
 (0)