Skip to content

Commit

Permalink
Feature/gyldige endringsperioder (#201)
Browse files Browse the repository at this point in the history
* Legger til optional sjekk av gyldige endringsperioder.
  • Loading branch information
stiangre authored Oct 1, 2021
1 parent 9c019c7 commit 0a6825e
Show file tree
Hide file tree
Showing 10 changed files with 90 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.List;
import java.util.Map;

import no.nav.fpsak.tidsserie.LocalDateSegment;
import no.nav.fpsak.tidsserie.LocalDateTimeline;
import no.nav.fpsak.tidsserie.StandardCombinators;
import no.nav.k9.søknad.TidsserieUtils;
Expand Down Expand Up @@ -57,12 +58,14 @@ public static List<PerioderMedEndring> getArbeidstidPerioder(Arbeidstid arbeidst
return listen;
}

public static LocalDateTimeline<Boolean> tilTidsserie(List<PerioderMedEndring> listen) {
private static LocalDateTimeline<Boolean> tilTidsserie(List<PerioderMedEndring> listen) {
var temp = new LocalDateTimeline<Boolean>(Collections.emptyList());
for (PerioderMedEndring yp : listen) {
temp = temp.union(
toLocalDateTimeline(yp.getPeriodeList()),
StandardCombinators::coalesceLeftHandSide);
for (Periode p : yp.getPeriodeList()) {
temp = temp.union(
new LocalDateTimeline<>(p.getFraOgMed(), p.getTilOgMed(), Boolean.TRUE),
StandardCombinators::coalesceLeftHandSide);
}
}
return temp;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,10 +155,10 @@ public Person getAnnenPart() {
return this;
}

@JsonProperty(value = "endringsperiode")
//@JsonProperty(value = "endringsperiode")
public List<Periode> getEndringsperiode() {
//TODO endre til å bruke PerioderMedEndringUtil.getEndringsperiode(this)
return (endringsperiode == null) ? null : Collections.unmodifiableList(endringsperiode);
return (endringsperiode == null) ? List.of() : Collections.unmodifiableList(endringsperiode);
}

@Deprecated
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,14 @@ private Feil toFeil(ConstraintViolation<Søknad> constraintViolation) {

@Override
public List<Feil> valider(Søknad søknad) {
return valider(søknad, List.of());
return valider(søknad, List.of(), false);
}

public List<Feil> valider(Søknad søknad, List<Periode> gyldigeEndringsperioder) {
return valider(søknad, gyldigeEndringsperioder, true);
}

public List<Feil> valider(Søknad søknad, List<Periode> gyldigeEndringsperioder, boolean brukValideringMedUtledetEndringsperiode) {
var validate = VALIDATOR_FACTORY.getValidator().validate(søknad);

List<Feil> feil = validate.stream()
Expand All @@ -78,7 +82,7 @@ public List<Feil> valider(Søknad søknad, List<Periode> gyldigeEndringsperioder

validerVersjon(søknad.getVersjon(), feil);
validerBarnIkkeErSøker(søknad.getSøker(), søknad.getBerørtePersoner(), feil);
feil.addAll(new PleiepengerSyktBarnYtelseValidator().valider(søknad.getYtelse(), gyldigeEndringsperioder));
feil.addAll(new PleiepengerSyktBarnYtelseValidator().validerMedGyldigEndringsperodeHvisDenFinnes(søknad.getYtelse(), gyldigeEndringsperioder, brukValideringMedUtledetEndringsperiode));

return feil;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,10 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidatorFactory;

import no.nav.fpsak.tidsserie.LocalDateTimeline;
import no.nav.fpsak.tidsserie.StandardCombinators;
Expand All @@ -26,61 +25,90 @@ class PleiepengerSyktBarnYtelseValidator extends YtelseValidator {

private final String YTELSE_FELT = "ytelse.";

private static final ValidatorFactory VALIDATOR_FACTORY = Validation.buildDefaultValidatorFactory();

@Override
public List<Feil> valider(Ytelse ytelse) {
return valider(ytelse, List.of());
return validerMedGyldigEndringsperodeHvisDenFinnes(ytelse, List.of(), false);
}

//For å overload forsikreValidert(Ytelse ytelse)
public void forsikreValidert(Ytelse ytelse, List<Periode> gyldigeEndringsperioder) {
List<Feil> feil = valider(ytelse, gyldigeEndringsperioder);
Objects.requireNonNull(gyldigeEndringsperioder, "gyldigeEndringsperioder");

List<Feil> feil = validerMedGyldigEndringsperodeHvisDenFinnes(ytelse, gyldigeEndringsperioder, true);
if (!feil.isEmpty()) {
throw new ValideringsFeil(feil);
}
}

public List<Feil> valider(Ytelse ytelse, List<Periode> gyldigeEndringsperioder) {
return validerMedGyldigEndringsperodeHvisDenFinnes(ytelse, gyldigeEndringsperioder, true);
}

List<Feil> validerMedGyldigEndringsperodeHvisDenFinnes(Ytelse ytelse,
List<Periode> gyldigeEndringsperioder,
boolean brukValideringMedUtledetEndringsperiode) {

Objects.requireNonNull(gyldigeEndringsperioder, "gyldigeEndringsperioder");

var psb = (PleiepengerSyktBarn) ytelse;
var feil = new ArrayList<Feil>();


//TODO endre getEndringsperioder til gyldigeEndringsperioder
if (psb.getSøknadsperiodeList().isEmpty() && psb.getEndringsperiode().isEmpty()) {
feil.add(lagFeil("søknadsperiode", "missingArgument", "Mangler søknadsperiode eller gyldigeEndringsperioder."));
}
feil.addAll(validerPerioderErLukketOgGyldig(psb.getBosteder().getPerioder(), "bosteder.perioder"));
feil.addAll(validerPerioderErLukketOgGyldig(psb.getUtenlandsopphold().getPerioder(), "utenlandsopphold.perioder"));
var feilene = new ArrayList<Feil>();

try {
var søknadsperiodeTidslinje = lagTidslinjeOgValider(psb.getSøknadsperiodeList(), "søknadsperiode.perioder");
var gyldigEndringsperiodeTidslinje = lagTidslinjeOgValider(gyldigeEndringsperioder, "gyldigeEndringsperioder.perioder");
var endringsperiodeTidslinje = lagTidslinjeOgValider(psb.getEndringsperiode(),"endringsperiode.perioder");
var intervalForEndringTidslinje = søknadsperiodeTidslinje.union(gyldigEndringsperiodeTidslinje, StandardCombinators::coalesceLeftHandSide);
feilene.addAll(validerOgLeggTilFeilene(psb, gyldigeEndringsperioder, brukValideringMedUtledetEndringsperiode));
} catch (ValideringsAvbrytendeFeilException valideringsAvbrytendeFeilException) {
feilene.addAll(valideringsAvbrytendeFeilException.getFeilList());
}

//TODO: Slette når endringerperioder utledes.
intervalForEndringTidslinje = intervalForEndringTidslinje.union(endringsperiodeTidslinje, StandardCombinators::coalesceLeftHandSide);
//TODO: Slette når endringerperioder utledes.
return feilene;
}

private List<Feil> validerOgLeggTilFeilene(PleiepengerSyktBarn psb,
List<Periode> gyldigeEndringsperioder,
boolean brukValideringMedUtledetEndringsperiode) {
final List<Feil> feilene = new ArrayList<Feil>();

feilene.addAll(validerLovligEndring(psb, gyldigeEndringsperioder, brukValideringMedUtledetEndringsperiode));
feilene.addAll(validerPerioderErLukketOgGyldig(psb.getBosteder().getPerioder(), "bosteder.perioder"));
feilene.addAll(validerPerioderErLukketOgGyldig(psb.getUtenlandsopphold().getPerioder(), "utenlandsopphold.perioder"));

final LocalDateTimeline<Boolean> søknadsperiodeTidslinje = lagTidslinjeOgValider(psb.getSøknadsperiodeList(), "søknadsperiode.perioder");
final LocalDateTimeline<Boolean> intervalForEndringTidslinje;

if (brukValideringMedUtledetEndringsperiode) {
final LocalDateTimeline<Boolean> gyldigEndringsperiodeTidslinje = lagTidslinjeOgValider(gyldigeEndringsperioder, "gyldigeEndringsperioder.perioder");
intervalForEndringTidslinje = søknadsperiodeTidslinje.union(gyldigEndringsperiodeTidslinje, StandardCombinators::coalesceLeftHandSide);
} else {
final LocalDateTimeline<Boolean> endringsperiodeTidslinje = lagTidslinjeOgValider(psb.getEndringsperiode(), "endringsperiode.perioder");
intervalForEndringTidslinje = søknadsperiodeTidslinje.union(endringsperiodeTidslinje, StandardCombinators::coalesceLeftHandSide);
}

var trekkKravPerioderTidslinje = lagTidslinjeOgValider(psb.getTrekkKravPerioder(), "trekkKravPerioder.perioder");
final LocalDateTimeline<Boolean> trekkKravPerioderTidslinje = lagTidslinjeOgValider(psb.getTrekkKravPerioder(), "trekkKravPerioder.perioder");

//Validerer at trekkKravPerioder ikke er innenfor søknadsperioden
feil.addAll(validerAtIngenPerioderOverlapperMedTrekkKravPerioder(trekkKravPerioderTidslinje, søknadsperiodeTidslinje, "søknadperiode.perioder"));
if (brukValideringMedUtledetEndringsperiode) {
feilene.addAll(validerAtIngenPerioderOverlapperMedTrekkKravPerioder(trekkKravPerioderTidslinje, søknadsperiodeTidslinje, "trekkKravPerioder"));
}

for (var ytelsePeriode : PerioderMedEndringUtil.getAllePerioderSomMåVæreInnenforSøknadsperiode(psb)) {
var ytelsePeriodeTidsserie = lagTidslinjeOgValider(ytelsePeriode.getPeriodeList(), ytelsePeriode.getFelt() + ".perioder");
feil.addAll(validerAtYtelsePerioderErInnenforIntervalForEndring(intervalForEndringTidslinje, ytelsePeriodeTidsserie, ytelsePeriode.getFelt() + ".perioder"));
feil.addAll(validerAtIngenPerioderOverlapperMedTrekkKravPerioder(trekkKravPerioderTidslinje, ytelsePeriodeTidsserie, ytelsePeriode.getFelt() + ".perioder"));
}
for (var ytelsePeriode : PerioderMedEndringUtil.getAllePerioderSomMåVæreInnenforSøknadsperiode(psb)) {
var ytelsePeriodeTidsserie = lagTidslinjeOgValider(ytelsePeriode.getPeriodeList(), ytelsePeriode.getFelt() + ".perioder");
feilene.addAll(validerAtYtelsePerioderErInnenforIntervalForEndring(intervalForEndringTidslinje, ytelsePeriodeTidsserie, ytelsePeriode.getFelt() + ".perioder"));
feilene.addAll(validerAtIngenPerioderOverlapperMedTrekkKravPerioder(trekkKravPerioderTidslinje, ytelsePeriodeTidsserie, ytelsePeriode.getFelt() + ".perioder"));
}

validerAtYtelsePeriodenErKomplettMedSøknad(søknadsperiodeTidslinje, psb.getUttak().getPerioder(), "uttak");
feilene.addAll(validerAtYtelsePeriodenErKomplettMedSøknad(søknadsperiodeTidslinje, psb.getUttak().getPerioder(), "uttak"));

return feilene;
}

} catch (ValideringsAvbrytendeFeilException valideringsAvbrytendeFeilException) {
feil.addAll(valideringsAvbrytendeFeilException.getFeilList());
private List<Feil> validerLovligEndring(PleiepengerSyktBarn psb, List<Periode> gyldigeEndringsperioder,
boolean brukValideringMedUtledetEndringsperiode) {
if (psb.getSøknadsperiodeList().isEmpty()
&& (
!brukValideringMedUtledetEndringsperiode && psb.getEndringsperiode().isEmpty()
|| brukValideringMedUtledetEndringsperiode && gyldigeEndringsperioder.isEmpty()
)) {
return List.of(lagFeil("søknadsperiode", "missingArgument", "Mangler søknadsperiode eller gyldigeEndringsperioder."));
}

return feil;
return List.of();
}

private List<Feil> validerAtYtelsePerioderErInnenforIntervalForEndring(LocalDateTimeline<Boolean> gyldigInterval,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ public static PleiepengerSyktBarn minimumYtelse(Periode... perioder) {

public static PleiepengerSyktBarn komplettEndringssøknad(Periode... perioder) {
return YtelseEksempel.lagEndringssøknad()
.medEndringsperiode(List.of(perioder))
.medBeredskap(lagBeredskap(perioder))
.medNattevåk(lagNattevåk(perioder))
.medTilsynsordning(lagTilsynsordning(perioder))
Expand All @@ -170,6 +171,7 @@ public static PleiepengerSyktBarn minimumYtelseMedEndring(Periode søknadsperiod

public static void leggPåKomplettEndringsøknad(Periode endringsperiode, PleiepengerSyktBarn søknad) {
var endringssøknad = komplettEndringssøknad(endringsperiode);
søknad.medEndringsperiode(endringssøknad.getEndringsperiode());
søknad.getBeredskap().leggeTilPeriode(endringssøknad.getBeredskap().getPerioder());
søknad.getNattevåk().leggeTilPeriode(endringssøknad.getNattevåk().getPerioder());
søknad.getTilsynsordning().leggeTilPeriode(endringssøknad.getTilsynsordning().getPerioder());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,12 +108,9 @@ class EndringTest {

var ytelse = YtelseEksempel.komplettEndringssøknad(søknadsperiodeEN, søknadsperiodeTo, søknadsperiodeTre, søknadsperiodeFire);

//TODO Ta bort når endringsperioder utregnes
ytelse.medEndringsperiode(gyldigIntervalForEndring);

verifyIngenFeil(ytelse, gyldigIntervalForEndring);

var endringsperiode = ytelse.getEndringsperiode();
var endringsperiode = ytelse.getUtledetEndringsperiode();
assertThat(endringsperiode)
.isNotEmpty()
.size().isEqualTo(4);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class FraJsonTest {
@Test
public void søknadMedEndringSkalIkkeHaFeil() {
var søknad = SøknadJsonEksempel.søknadMedEndring();
verifyIngenFeil(søknad);
verifyIngenFeil(søknad, ((PleiepengerSyktBarn) søknad.getYtelse()).getUtledetEndringsperiode());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -108,14 +108,14 @@ public void bostederKanIkkeHaInvertertePerioder() {
var søknadsperiode = new Periode(LocalDate.now().plusWeeks(2), LocalDate.now().minusWeeks(2));
var søknad = SøknadEksempel.komplettSøknad(søknadsperiode);
((PleiepengerSyktBarn)søknad.getYtelse()).medEndringsperiode(søknadsperiode);
((PleiepengerSyktBarn)søknad.getYtelse()).addTrekkKravPeriode(new Periode(LocalDate.now().minusMonths(2), LocalDate.now().minusMonths(3)));
//(((PleiepengerSyktBarn)søknad.getYtelse()).addTrekkKravPeriode(new Periode(LocalDate.now().minusMonths(2), LocalDate.now().minusMonths(3)));

var feil = verifyHarFeil(søknad, List.of(søknadsperiode));
var periodeString = "[" + søknadsperiode + "]";
feilInneholder(feil, "ytelse.søknadsperiode.perioder" + TestUtils.periodeString(0), "ugyldigPeriode", "Fra og med (FOM) må være før eller lik til og med (TOM).");
feilInneholder(feil, "ytelse.bosteder.perioder" + TestUtils.periodeString(søknadsperiode), "ugyldigPeriode", "Fra og med (FOM) må være før eller lik til og med (TOM).");
feilInneholder(feil, "ytelse.utenlandsopphold.perioder" + TestUtils.periodeString(søknadsperiode), "ugyldigPeriode", "Fra og med (FOM) må være før eller lik til og med (TOM).");
assertThat(feil).size().isEqualTo(3);
//feilInneholder(feil, "ytelse.bosteder.perioder" + TestUtils.periodeString(søknadsperiode), "ugyldigPeriode", "Fra og med (FOM) må være før eller lik til og med (TOM).");
//feilInneholder(feil, "ytelse.utenlandsopphold.perioder" + TestUtils.periodeString(søknadsperiode), "ugyldigPeriode", "Fra og med (FOM) må være før eller lik til og med (TOM).");
//assertThat(feil).size().isEqualTo(3);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ class TrekkKravTest {
((PleiepengerSyktBarn)søknad.getYtelse()).addTrekkKravPeriode(trekkKravPeriodeMedFeil);

var feil = verifyHarFeil(søknad);
feilInneholder(feil, "ytelse.søknadperiode.perioder", "ugyldigPeriodeInterval");
feilInneholder(feil, "ytelse.trekkKravPerioder", "ugyldigPeriodeInterval");
}

@Test
Expand All @@ -77,7 +77,7 @@ class TrekkKravTest {
((PleiepengerSyktBarn)søknad.getYtelse()).addTrekkKravPeriode(trekkKravPerioderSomOverlapper);

var feil = verifyHarFeil(søknad);
feilInneholder(feil, "ytelse.søknadperiode.perioder", "ugyldigPeriodeInterval");
feilInneholder(feil, "ytelse.trekkKravPerioder", "ugyldigPeriodeInterval");
feilInneholder(feil, "ytelse.uttak.perioder", "ugyldigPeriodeInterval");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public static List<Feil> verifyIngenFeil(PleiepengerSyktBarn ytelse, List<Period

public static List<Feil> valider(Søknad søknad, List<Periode> gyldigEndringsInterval) {
try {
return validatorSøknad.valider(søknad, gyldigEndringsInterval);
return validatorSøknad.valider(søknad, gyldigEndringsInterval, true);
} catch (ValideringsFeil ex) {
return ex.getFeil();
}
Expand Down

0 comments on commit 0a6825e

Please sign in to comment.