Skip to content

Commit c724119

Browse files
authored
Legger på validering PPN; søknadsperioder-uttak-arbeidstid skal være … (#254)
* Legger på validering PPN; søknadsperioder-uttak-arbeidstid skal være aligned innenfor samme periode * Fjerner valdiering om at arbeidstid alltid skal være oppgitt i samme intervall som søknadsperiode Det som gjenstår, er at hver oppgitte søknadsperiode må ha en tilsvarende oppgitt uttaksperiode (samme som for PSB)
1 parent 6cd4ea2 commit c724119

File tree

2 files changed

+85
-7
lines changed

2 files changed

+85
-7
lines changed

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

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import static no.nav.k9.søknad.TidsserieUtils.tilPeriodeList;
44
import static no.nav.k9.søknad.TidsserieUtils.toLocalDateTimeline;
55

6+
import java.time.DayOfWeek;
7+
import java.time.LocalDate;
68
import java.util.ArrayList;
79
import java.util.List;
810
import java.util.Map;
@@ -18,6 +20,7 @@
1820
import no.nav.k9.søknad.ytelse.Ytelse;
1921
import no.nav.k9.søknad.ytelse.YtelseValidator;
2022
import no.nav.k9.søknad.ytelse.psb.v1.arbeidstid.Arbeidstaker;
23+
import no.nav.k9.søknad.ytelse.psb.v1.arbeidstid.Arbeidstid;
2124

2225
public class PleiepengerLivetsSluttfaseYtelseValidator extends YtelseValidator {
2326
@Override
@@ -37,8 +40,12 @@ public List<Feil> valider(PleipengerLivetsSluttfase søknad) {
3740
feilene.addAll(validerPerioderErLukketOgGyldig(søknad.getUtenlandsopphold().getPerioderSomSkalSlettes(), "utenlandsopphold.perioderSomSkalSlettes"));
3841
validerArbeidstid(søknad);
3942
validerOpptjening(søknad, feilene);
40-
validerTrekkKravPerioder(søknad, feilene);
41-
//TODO valider søknadsperiode(overlapp), uttak
43+
44+
var søknadsperiodeTidslinje = lagTidslinjeOgValider(søknad.getSøknadsperiodeList(), "søknadsperiode.perioder", feilene);
45+
var uttakTidslinje = lagTidslinjeOgValider(new ArrayList<>(søknad.getUttak().getPerioder().keySet()), "uttak.perioder", feilene);
46+
validerAtUttakErKomplettForSøknadsperiode(søknadsperiodeTidslinje, uttakTidslinje, "uttak.perioder", feilene);
47+
48+
validerTrekkKravPerioder(søknad.getTrekkKravPerioder(), søknadsperiodeTidslinje, feilene);
4249
} catch (ValideringsAvbrytendeFeilException valideringsAvbrytendeFeilException) {
4350
feilene.addAll(valideringsAvbrytendeFeilException.getFeilList());
4451
}
@@ -71,14 +78,43 @@ private void validerOpptjening(PleipengerLivetsSluttfase søknad, List<Feil> fei
7178

7279
}
7380

74-
private void validerTrekkKravPerioder(PleipengerLivetsSluttfase søknad, List<Feil> feilene) {
75-
LocalDateTimeline<Boolean> trekkKravPerioderTidslinje = lagTidslinjeOgValider(søknad.getTrekkKravPerioder(), "trekkKravPerioder.perioder", feilene);
76-
var søktePerioder = søknad.getArbeidstid().getArbeidstakerList().stream()
81+
private LocalDateTimeline<Boolean> lagArbeidstidTidslinje(Arbeidstid arbeidstid) {
82+
var arbeidstidTidslinje = arbeidstid.getArbeidstakerList().stream()
7783
.flatMap(it -> it.getArbeidstidInfo().getPerioder().keySet().stream())
7884
.map(it -> new LocalDateSegment<>(it.getFraOgMed(), it.getTilOgMed(), Boolean.TRUE))
7985
.collect(Collectors.toList());
80-
var tidslinjeSøktPeriode = LocalDateTimeline.buildGroupOverlappingSegments(søktePerioder).mapValue(s -> Boolean.TRUE);
81-
feilene.addAll(validerAtIngenPerioderOverlapperMedTrekkKravPerioder(trekkKravPerioderTidslinje, tidslinjeSøktPeriode, "trekkKravPerioder"));
86+
var arbeidstidTidslinjeSammenslått = LocalDateTimeline.buildGroupOverlappingSegments(arbeidstidTidslinje).mapValue(s -> Boolean.TRUE);
87+
return arbeidstidTidslinjeSammenslått;
88+
}
89+
90+
91+
private void validerAtUttakErKomplettForSøknadsperiode(LocalDateTimeline<Boolean> søknadsperioderTidslinje,
92+
LocalDateTimeline<Boolean> uttakTidslinje,
93+
String felt,
94+
List<Feil> feil) {
95+
96+
var søknadsperioderUtenUttak = tilPeriodeList(søknadsperioderTidslinje.disjoint(uttakTidslinje));
97+
feil.addAll( søknadsperioderUtenUttak.stream()
98+
// TODO: Avklare om det er spesiell logikk rundt helg
99+
.filter(this::periodeInneholderDagerSomIkkeErHelg)
100+
.map(p -> toFeil(p, felt, "ikkeKomplettPeriode", "Periodene er ikke komplett, periode som mangler er: "))
101+
.collect(Collectors.toCollection(ArrayList::new)));
102+
}
103+
104+
private boolean periodeInneholderDagerSomIkkeErHelg(Periode periode) {
105+
LocalDate testDag = periode.getFraOgMed();
106+
while (testDag.isBefore(periode.getTilOgMed()) || testDag.isEqual(periode.getTilOgMed())) {
107+
if (!((testDag.getDayOfWeek() == DayOfWeek.SUNDAY) || (testDag.getDayOfWeek() == DayOfWeek.SATURDAY))) {
108+
return true;
109+
}
110+
testDag = testDag.plusDays(1);
111+
}
112+
return false;
113+
}
114+
115+
private void validerTrekkKravPerioder(List<Periode> trekkKravPerioder, LocalDateTimeline<Boolean> søknadsperiodeTidslinje, List<Feil> feilene) {
116+
LocalDateTimeline<Boolean> trekkKravPerioderTidslinje = lagTidslinjeOgValider(trekkKravPerioder, "trekkKravPerioder.perioder", feilene);
117+
feilene.addAll(validerAtIngenPerioderOverlapperMedTrekkKravPerioder(trekkKravPerioderTidslinje, søknadsperiodeTidslinje, "trekkKravPerioder"));
82118
}
83119

84120
private LocalDateTimeline<Boolean> lagTidslinjeMedStøtteForÅpenPeriodeOgValider(Map<Periode, ?> periodeMap, String felt) throws ValideringsAvbrytendeFeilException {
@@ -98,6 +134,7 @@ private LocalDateTimeline<Boolean> lagTidslinjeOgValider(Map<Periode, ?> periode
98134
throw new ValideringsAvbrytendeFeilException(nyFeil);
99135
}
100136
try {
137+
// Kaster feil dersom overlappende perioder
101138
return toLocalDateTimeline(new ArrayList<>(periodeMap.keySet()));
102139
} catch (IllegalArgumentException e) {
103140
throw new ValideringsAvbrytendeFeilException(List.of(lagFeil(felt, "IllegalArgumentException", e.getMessage())));
@@ -111,6 +148,7 @@ private LocalDateTimeline<Boolean> lagTidslinjeOgValider(List<Periode> periodeLi
111148
throw new ValideringsAvbrytendeFeilException(feil);
112149
}
113150
try {
151+
// Kaster feil dersom overlappende perioder
114152
return toLocalDateTimeline(periodeList);
115153
} catch (IllegalArgumentException e) {
116154
feil.add(lagFeil(felt, "IllegalArgumentException", e.getMessage()));

soknad/src/test/java/no/nav/k9/søknad/ytelse/pls/v1/YtelseTest.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import static no.nav.k9.søknad.TestUtils.feilInneholder;
44
import static no.nav.k9.søknad.ytelse.pls.v1.ValiderUtil.verifyHarFeil;
55
import static no.nav.k9.søknad.ytelse.pls.v1.ValiderUtil.verifyIngenFeil;
6+
import static no.nav.k9.søknad.ytelse.psb.YtelseEksempel.lagUttak;
67

78
import java.time.Duration;
89
import java.time.LocalDate;
@@ -112,4 +113,43 @@ public void invertertPeriodeForArbeidstakerPeriode() {
112113
feilInneholder(feil, "ytelse.arbeidstid.arbeidstakerList[0].perioder", "IllegalArgumentException");
113114
}
114115

116+
@Test
117+
public void overlappendePerioderForSøknadsperiodelist() {
118+
var søknadsperiodeEn = new Periode(LocalDate.now(), LocalDate.now());
119+
var søknadsperiodeTo = new Periode(LocalDate.now(), LocalDate.now().plusDays(1));
120+
var ytelse = YtelseEksempel.lagYtelse()
121+
.medSøknadsperiode(søknadsperiodeEn)
122+
.medSøknadsperiode(søknadsperiodeTo);
123+
124+
var feil = verifyHarFeil(ytelse);
125+
feilInneholder(feil, "ytelse.søknadsperiode.perioder", "IllegalArgumentException");
126+
}
127+
128+
@Test
129+
public void overlappendePerioderForUttaksperiodeMap() {
130+
var periodeEn = new Periode(LocalDate.now(), LocalDate.now());
131+
var periodeTo = new Periode(LocalDate.now(), LocalDate.now().plusDays(1));
132+
133+
var ytelse = YtelseEksempel.ytelseForArbeidstaker(periodeEn)
134+
.medUttak(lagUttak(periodeEn, periodeTo));
135+
136+
var feil = verifyHarFeil(ytelse);
137+
feilInneholder(feil, "ytelse.uttak.perioder", "IllegalArgumentException");
138+
}
139+
140+
@Test
141+
public void søknadsperioderUtenUttak() {
142+
var periodeEn = new Periode(LocalDate.now(), LocalDate.now().plusWeeks(1));
143+
var periodeTo = new Periode(LocalDate.now().plusWeeks(2), LocalDate.now().plusWeeks(3));
144+
145+
var ytelse = YtelseEksempel.lagYtelse()
146+
.medSøknadsperiode(periodeEn)
147+
.medSøknadsperiode(periodeTo)
148+
.medArbeidstid(new Arbeidstid().medArbeidstaker(List.of(YtelseEksempel.lagArbeidstaker(periodeEn, periodeTo))))
149+
.medUttak(lagUttak(periodeEn)); // Kun en av periodene her
150+
151+
var feil = verifyHarFeil(ytelse);
152+
feilInneholder(feil, "ytelse.uttak.perioder", "ikkeKomplettPeriode");
153+
}
154+
115155
}

0 commit comments

Comments
 (0)