Skip to content

Commit ad33631

Browse files
endrert på at endringssøknad blir kalkulert fra format, tilpasset val… (#184)
endrert på at endringssøknad blir kalkulert fra format, tilpasset validering
1 parent fdf7d9d commit ad33631

15 files changed

+502
-335
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package no.nav.k9.søknad;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collections;
5+
import java.util.List;
6+
import java.util.Map;
7+
import java.util.stream.Collectors;
8+
9+
import no.nav.fpsak.tidsserie.LocalDateSegment;
10+
import no.nav.fpsak.tidsserie.LocalDateTimeline;
11+
import no.nav.k9.søknad.felles.Feil;
12+
import no.nav.k9.søknad.felles.type.Periode;
13+
14+
public class TidsserieUtils {
15+
public static List<Periode> toPeriodeList(LocalDateTimeline<?> t) {
16+
return t.stream().map(l -> new Periode(l.getFom(), l.getTom())).collect(Collectors.toList());
17+
}
18+
19+
public static LocalDateTimeline<Boolean> toLocalDateTimeline(Map<Periode, ?> periodeMap, String felt, List<Feil> feil) {
20+
return toLocalDateTimeline(new ArrayList<>(periodeMap.keySet()), felt, feil);
21+
}
22+
23+
public static LocalDateTimeline<Boolean> toLocalDateTimeline(List<Periode> perioder, String felt, List<Feil> feil) {
24+
try {
25+
return toLocalDateTimeline(perioder);
26+
} catch (IllegalArgumentException e) {
27+
feil.add(new Feil(felt, "IllegalArgumentException", e.getMessage()));
28+
}
29+
return new LocalDateTimeline<>(Collections.emptyList());
30+
}
31+
32+
public static LocalDateTimeline<Boolean> toLocalDateTimeline(List<Periode> perioder) throws IllegalArgumentException{
33+
return new LocalDateTimeline<Boolean>(perioder
34+
.stream()
35+
.map(no.nav.k9.søknad.TidsserieUtils::mapLocalDateSegment)
36+
.collect(Collectors.toList()))
37+
.compress();
38+
}
39+
40+
private static LocalDateSegment<Boolean> mapLocalDateSegment(Periode periode) {
41+
return new LocalDateSegment<Boolean>(
42+
periode.getFraOgMed(),
43+
periode.getTilOgMed(),
44+
true);
45+
}
46+
47+
}
Lines changed: 42 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,142 +1,77 @@
11
package no.nav.k9.søknad;
22

3+
import static no.nav.k9.søknad.TidsserieUtils.toPeriodeList;
4+
35
import java.time.DayOfWeek;
46
import java.time.LocalDate;
57
import java.util.ArrayList;
6-
import java.util.Collections;
78
import java.util.List;
8-
import java.util.Map;
99
import java.util.stream.Collectors;
1010

11-
import no.nav.fpsak.tidsserie.LocalDateSegment;
1211
import no.nav.fpsak.tidsserie.LocalDateTimeline;
13-
import no.nav.fpsak.tidsserie.StandardCombinators;
1412
import no.nav.k9.søknad.felles.Feil;
1513
import no.nav.k9.søknad.felles.type.Periode;
1614

1715
public class TidsserieValidator {
1816

19-
public static PerioderMedFeil finnIkkeKomplettePerioderOgPerioderUtenfor(LocalDateTimeline<Boolean> test, Perioder perioder) {
20-
return new PerioderMedFeil(
21-
getPerioderSomIkkeOverlapperMedHovedperiode(test, perioder),
22-
getPerioderUtenforGyldigperiode(test, perioder));
23-
}
17+
public static List<Feil> finnPerioderUtenforGyldigInterval(LocalDateTimeline<Boolean> testTidsserie, LocalDateTimeline<Boolean> gyldigInterval, String felt) {
18+
var feil = new ArrayList<Feil>();
19+
var perioderUtenfor = getPerioderUtenforGyldigperiode(testTidsserie, gyldigInterval);
2420

25-
private static List<Periode> getPerioderUtenforGyldigperiode(LocalDateTimeline<Boolean> test, Perioder perioder) {
26-
return TidsserieUtils.toPeriodeList(test.disjoint(perioder.gyldigInterval));
21+
feil.addAll(leggTilFeil(perioderUtenfor, felt + ".perioder", "ugyldigPeriode", "Perioden er utenfor gyldig interval(" + gyldigInterval.toString() +") : "));
22+
return feil;
2723
}
2824

29-
private static List<Periode> getPerioderSomIkkeOverlapperMedHovedperiode(LocalDateTimeline<Boolean> test, Perioder perioder) {
30-
return TidsserieUtils.toPeriodeList(perioder.søknadsperiode.disjoint(test));
31-
}
25+
public static List<Feil> finnIkkeKomplettePerioder(LocalDateTimeline<Boolean> test, LocalDateTimeline<Boolean> intervalHvorTidserieMåVæreKomplett, String felt) {
26+
var feil = new ArrayList<Feil>();
27+
var ikkeKomplettePerioder = getPerioderSomIkkeErKomplett(test, intervalHvorTidserieMåVæreKomplett);
3228

33-
public static PerioderMedFeil finnPerioderUtenfor(LocalDateTimeline<Boolean> testTidsserie, Perioder hovedTidsserie) {
34-
return new PerioderMedFeil(
35-
Collections.emptyList(),
36-
getPerioderUtenforGyldigperiode(testTidsserie, hovedTidsserie));
29+
feil.addAll(leggTilFeilIkkeTaMedHelg(ikkeKomplettePerioder, felt + ".perioder", "ikkeKomplettPeriode", "Periodene er ikke komplett, periode som mangler er: "));
30+
return feil;
3731
}
3832

39-
public static boolean periodeInneholderDagerSomIkkeErHelg(Periode periode) {
40-
LocalDate testDag = periode.getFraOgMed();
41-
while (testDag.isBefore(periode.getTilOgMed()) || testDag.isEqual(periode.getTilOgMed())) {
42-
if (!((testDag.getDayOfWeek() == DayOfWeek.SUNDAY) || (testDag.getDayOfWeek() == DayOfWeek.SATURDAY))) {
43-
return true;
44-
}
45-
testDag = testDag.plusDays(1);
33+
private static List<Feil> leggTilFeil(List<Periode> perioderMedFeil, String felt, String feilkode, String feilmelding) {
34+
if (perioderMedFeil.isEmpty()) {
35+
return List.of();
4636
}
47-
return false;
48-
}
4937

50-
public static class TidsserieUtils {
51-
public static List<Periode> toPeriodeList(LocalDateTimeline<?> t) {
52-
return t.stream().map(l -> new Periode(l.getFom(), l.getTom())).collect(Collectors.toList());
53-
}
54-
55-
public static LocalDateTimeline<Boolean> toLocalDateTimeline(List<Periode> perioder, String felt, List<Feil> feil) throws IllegalArgumentException{
56-
perioder.forEach(p -> validerPeriode(p, felt, feil));
57-
try {
58-
return new LocalDateTimeline<Boolean>(perioder
59-
.stream()
60-
.map(TidsserieUtils::mapLocalDateSegment)
61-
.collect(Collectors.toList()))
62-
.compress();
63-
} catch (IllegalArgumentException e) {
64-
feil.add(new Feil(felt, "IllegalArgumentException", e.getMessage()));
65-
}
66-
return new LocalDateTimeline<>(Collections.emptyList());
67-
}
68-
69-
private static LocalDateSegment<Boolean> mapLocalDateSegment(Periode periode) {
70-
return new LocalDateSegment<Boolean>(
71-
periode.getFraOgMed(),
72-
periode.getTilOgMed(),
73-
true);
74-
}
75-
76-
private static void validerPeriode(Periode periode, String felt, List<Feil> feil) {
77-
if (periode.getTilOgMed() == null || periode.getFraOgMed() == null) {
78-
feil.add(new Feil (felt, "NullPointerException", "Null"));
79-
}
80-
}
81-
82-
public static LocalDateTimeline<Boolean> toLocalDateTimeline(Map<Periode, ?> periodeMap, String felt, List<Feil> feil) {
83-
return toLocalDateTimeline(new ArrayList<>(periodeMap.keySet()), felt, feil);
84-
}
38+
return perioderMedFeil.stream()
39+
.map(p -> toFeil(p, felt, feilkode, feilmelding))
40+
.collect(Collectors.toList());
8541
}
8642

87-
public static class Perioder {
88-
private final LocalDateTimeline<Boolean> søknadsperiode;
89-
private final LocalDateTimeline<Boolean> gyldigInterval;
90-
91-
public Perioder(List<Periode> søknadsperiode, List<Periode> endringsperiode, List<Feil> feil) {
92-
this.søknadsperiode = TidsserieUtils.toLocalDateTimeline(søknadsperiode, "Søknadsperiode.periode", feil);
93-
this.gyldigInterval = this.søknadsperiode.union(TidsserieUtils.toLocalDateTimeline(endringsperiode, "Endringsperiode.periode", feil), StandardCombinators::coalesceLeftHandSide);
94-
}
95-
96-
public LocalDateTimeline<Boolean> getSøknadsperiode() {
97-
return søknadsperiode;
43+
private static List<Feil> leggTilFeilIkkeTaMedHelg(List<Periode> perioderMedFeil, String felt, String feilkode, String feilmelding) {
44+
if (perioderMedFeil.isEmpty()) {
45+
return List.of();
9846
}
9947

100-
public LocalDateTimeline<Boolean> getPerioderDerEndringerErTillatt() {
101-
return gyldigInterval;
102-
}
48+
return perioderMedFeil.stream()
49+
.filter(TidsserieValidator::periodeInneholderDagerSomIkkeErHelg)
50+
.map(p -> toFeil(p, felt, feilkode, feilmelding))
51+
.collect(Collectors.toList());
10352
}
10453

105-
public static class PerioderMedFeil {
106-
private final List<Periode> perioderSomIkkeOverlapperMedHovedperiode;
107-
private final List<Periode> perioderUtenforGyldigperiode;
108-
109-
public PerioderMedFeil(List<Periode> perioderSomIkkeOverlapperMedHovedperiode, List<Periode> perioderUtenforGyldigperiode) {
110-
this.perioderSomIkkeOverlapperMedHovedperiode = perioderSomIkkeOverlapperMedHovedperiode;
111-
this.perioderUtenforGyldigperiode = perioderUtenforGyldigperiode;
112-
}
113-
114-
public List<Periode> getPerioderSomIkkeOverlapperMedHovedperiode() {
115-
return perioderSomIkkeOverlapperMedHovedperiode;
116-
}
117-
118-
public List<Periode> getPerioderUtenforGyldigperiode() {
119-
return perioderUtenforGyldigperiode;
120-
}
54+
private static List<Periode> getPerioderUtenforGyldigperiode(LocalDateTimeline<Boolean> test, LocalDateTimeline<Boolean> gyldigInterval) {
55+
return toPeriodeList(
56+
test.disjoint(gyldigInterval));
57+
}
12158

122-
public void valider(String felt , List<Feil> feil) {
123-
if (!this.perioderSomIkkeOverlapperMedHovedperiode.isEmpty()) {
124-
feil.addAll(this.perioderSomIkkeOverlapperMedHovedperiode.stream()
125-
.filter(TidsserieValidator::periodeInneholderDagerSomIkkeErHelg)
126-
.map(p -> toFeil(p, felt, "ikkeKomplettPeriode", "Periodene er ikke komplett, periode som mangler er: "))
127-
.collect(Collectors.toList()));
128-
}
59+
private static List<Periode> getPerioderSomIkkeErKomplett(LocalDateTimeline<Boolean> test, LocalDateTimeline<Boolean> intervalHvorTidserieMåVæreKomplett) {
60+
return toPeriodeList(intervalHvorTidserieMåVæreKomplett.disjoint(test));
61+
}
12962

130-
if (!this.perioderUtenforGyldigperiode.isEmpty()) {
131-
feil.addAll(this.perioderUtenforGyldigperiode.stream()
132-
.map(p -> toFeil(p, felt, "ugyldigPeriode", "Perioden er utenfor søknadsperioden : "))
133-
.collect(Collectors.toList()));
63+
public static boolean periodeInneholderDagerSomIkkeErHelg(Periode periode) {
64+
LocalDate testDag = periode.getFraOgMed();
65+
while (testDag.isBefore(periode.getTilOgMed()) || testDag.isEqual(periode.getTilOgMed())) {
66+
if (!((testDag.getDayOfWeek() == DayOfWeek.SUNDAY) || (testDag.getDayOfWeek() == DayOfWeek.SATURDAY))) {
67+
return true;
13468
}
69+
testDag = testDag.plusDays(1);
13570
}
71+
return false;
72+
}
13673

137-
private Feil toFeil(Periode periode, String felt, String feilkode, String feilmelding) {
138-
return new Feil(felt, feilkode, feilmelding + periode.toString());
139-
}
140-
74+
private static Feil toFeil(Periode periode, String felt, String feilkode, String feilmelding) {
75+
return new Feil(felt, feilkode, feilmelding + periode.toString());
14176
}
14277
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ public Beredskap leggeTilPeriode(Periode periode, BeredskapPeriodeInfo beredskap
5454
return this;
5555
}
5656

57+
public Beredskap leggeTilPeriode(Map<Periode, BeredskapPeriodeInfo> perioder) {
58+
this.perioder.putAll(perioder);
59+
return this;
60+
}
61+
5762
@JsonIgnoreProperties(ignoreUnknown = true)
5863
public static final class BeredskapPeriodeInfo {
5964

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package no.nav.k9.søknad.ytelse.psb.v1;
2+
3+
import static no.nav.k9.søknad.TidsserieUtils.toLocalDateTimeline;
4+
5+
import java.util.ArrayList;
6+
import java.util.Collections;
7+
import java.util.List;
8+
import java.util.Map;
9+
10+
import no.nav.fpsak.tidsserie.LocalDateTimeline;
11+
import no.nav.fpsak.tidsserie.StandardCombinators;
12+
import no.nav.k9.søknad.TidsserieUtils;
13+
import no.nav.k9.søknad.felles.type.Periode;
14+
import no.nav.k9.søknad.ytelse.psb.v1.arbeidstid.Arbeidstid;
15+
16+
public class EndringsperiodeKalkulator {
17+
18+
19+
public static List<Periode> getEndringsperiode(PleiepengerSyktBarn psb) {
20+
var alleYtelsePerioderTidsserie =
21+
ytelsePerioderTilTidsserie(getYtelsePerioder(psb));
22+
var søknadsperiode = toLocalDateTimeline(psb.getSøknadsperiodeList());
23+
var endringsperiodeTidsserie = alleYtelsePerioderTidsserie.disjoint(søknadsperiode);
24+
return TidsserieUtils.toPeriodeList(endringsperiodeTidsserie);
25+
}
26+
27+
public static List<YtelsePerioder> getYtelsePerioder(PleiepengerSyktBarn psb) {
28+
var listen = new ArrayList<YtelsePerioder>();
29+
listen.add(new YtelsePerioder().medPerioder("utenlandsopphold", psb.getUtenlandsopphold().getPerioder()));
30+
listen.add(new YtelsePerioder().medPerioder("bosteder", psb.getBosteder().getPerioder()));
31+
listen.add(new YtelsePerioder().medPerioder("beredskap", psb.getBeredskap().getPerioder()));
32+
listen.add(new YtelsePerioder().medPerioder("nattevåk", psb.getNattevåk().getPerioder()));
33+
listen.add(new YtelsePerioder().medPerioder("tilsynsordning", psb.getTilsynsordning().getPerioder()));
34+
listen.add(new YtelsePerioder().medPerioder("lovbestemtFerie", psb.getLovbestemtFerie().getPerioder()));
35+
listen.add(new YtelsePerioder().medPerioder("uttak", psb.getUttak().getPerioder()));
36+
listen.addAll(getArbeidstidPerioder(psb.getArbeidstid()));
37+
return listen;
38+
}
39+
40+
public static List<YtelsePerioder> getArbeidstidPerioder(Arbeidstid arbeidstid) {
41+
var listen = new ArrayList<YtelsePerioder>();
42+
if (arbeidstid == null) {
43+
return listen;
44+
}
45+
if (arbeidstid.getArbeidstakerList() != null && !arbeidstid.getArbeidstakerList().isEmpty()) {
46+
int i = 0;
47+
for (var at: arbeidstid.getArbeidstakerList()) {
48+
listen.add(new YtelsePerioder().medPerioder("arbeidstid.arbeidstaker[" + i + "]" , at.getArbeidstidInfo().getPerioder()));
49+
i++;
50+
}
51+
}
52+
if (arbeidstid.getFrilanserArbeidstidInfo().isPresent()) {
53+
listen.add(new YtelsePerioder().medPerioder("arbeidstid.frilanser",
54+
arbeidstid.getFrilanserArbeidstidInfo().get().getPerioder()));
55+
}
56+
if (arbeidstid.getSelvstendigNæringsdrivendeArbeidstidInfo().isPresent()) {
57+
listen.add(new YtelsePerioder().medPerioder("arbeidstid.selvstendigNæringsdrivende",
58+
arbeidstid.getSelvstendigNæringsdrivendeArbeidstidInfo().get().getPerioder()));
59+
}
60+
return listen;
61+
}
62+
63+
public static LocalDateTimeline<Boolean> ytelsePerioderTilTidsserie(List<YtelsePerioder> listen) {
64+
var temp = new LocalDateTimeline<Boolean>(Collections.emptyList());
65+
for (YtelsePerioder yp: listen) {
66+
temp = temp.union(
67+
toLocalDateTimeline(yp.getPeriodeList()),
68+
StandardCombinators::coalesceLeftHandSide);
69+
}
70+
return temp;
71+
}
72+
73+
public static class YtelsePerioder {
74+
private String felt;
75+
private List<Periode> periodeList;
76+
77+
public YtelsePerioder() {
78+
79+
}
80+
81+
public String getFelt() {
82+
return felt;
83+
}
84+
85+
public List<Periode> getPeriodeList() {
86+
return periodeList;
87+
}
88+
89+
YtelsePerioder medPerioder(String felt, List<Periode> periodeList) {
90+
this.felt = felt;
91+
this.periodeList = periodeList;
92+
return this;
93+
}
94+
95+
YtelsePerioder medPerioder(String felt, Map<Periode, ?> periodeMap) {
96+
this.felt = felt;
97+
this.periodeList = new ArrayList<>(periodeMap.keySet());
98+
return this;
99+
}
100+
}
101+
}

soknad/src/main/java/no/nav/k9/søknad/ytelse/psb/v1/Nattevåk.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ public class Nattevåk {
4444
return this;
4545
}
4646

47+
public Nattevåk leggeTilPeriode(Map<Periode, NattevåkPeriodeInfo> perioder) {
48+
this.perioder.putAll(perioder);
49+
return this;
50+
}
51+
4752
public Map<Periode, NattevåkPeriodeInfo> getPerioderSomSkalSlettes() {
4853
return Collections.unmodifiableMap(perioderSomSkalSlettes);
4954
}

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

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class PleiepengerSyktBarn implements Ytelse {
4646
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
4747
@JsonProperty(value = "endringsperiode", required = true)
4848
private List<@Valid Periode> endringsperiode = new ArrayList<>();
49-
49+
5050
@Valid
5151
@JsonProperty(value = "trekkKravPerioder", required = true)
5252
private List<@Valid Periode> trekkKravPerioder = new ArrayList<>();
@@ -156,30 +156,7 @@ public Person getAnnenPart() {
156156
}
157157

158158
public List<Periode> getEndringsperiode() {
159-
return (endringsperiode == null) ? null : Collections.unmodifiableList(endringsperiode);
160-
}
161-
162-
public PleiepengerSyktBarn medEndringsperiode(List<Periode> endringsperiodeList) {
163-
if (this.endringsperiode == null)
164-
this.endringsperiode = new ArrayList<>();
165-
this.endringsperiode.addAll(endringsperiodeList);
166-
return this;
167-
}
168-
169-
public PleiepengerSyktBarn medEndringsperiode(Periode endringsperiode) {
170-
if (this.endringsperiode == null)
171-
this.endringsperiode = new ArrayList<>();
172-
this.endringsperiode.add(endringsperiode);
173-
return this;
174-
}
175-
176-
public List<Periode> getTrekkKravPerioder() {
177-
return Collections.unmodifiableList(trekkKravPerioder);
178-
}
179-
180-
public PleiepengerSyktBarn medTrekkKravPerioder(List<Periode> trekkKravPerioder) {
181-
this.trekkKravPerioder = new ArrayList<>(trekkKravPerioder);
182-
return this;
159+
return EndringsperiodeKalkulator.getEndringsperiode(this);
183160
}
184161

185162
public OpptjeningAktivitet getOpptjeningAktivitet() {

0 commit comments

Comments
 (0)