Skip to content

Commit

Permalink
Definerer søknadstype og validerer tom. dato på søknadsperiode. (#475)
Browse files Browse the repository at this point in the history
* Definerer søknadstype og validerer tom. dato på søknadsperiode.

Krever at tilOgMed dato er satt på søknadsperiode om søknadstype er RAPPORTERING_SØKNAD.
Ellers kan tilOgMed dato være null.

* Setter tidenes ende for deltakelsesøknad uten tom dato.
  • Loading branch information
ramrock93 authored Nov 27, 2024
1 parent e3d46ee commit 71eac63
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 15 deletions.
9 changes: 9 additions & 0 deletions soknad/src/main/java/no/nav/k9/søknad/TidUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package no.nav.k9.søknad;

import java.time.LocalDate;
import java.time.Month;

public final class TidUtils {

public static LocalDate TIDENES_ENDE = LocalDate.of(9999, Month.DECEMBER, 31);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package no.nav.k9.søknad.ytelse.ung.v1;

public enum UngSøknadstype {
DELTAKELSE_SØKNAD,
RAPPORTERING_SØKNAD
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotNull;
import no.nav.k9.søknad.TidUtils;
import no.nav.k9.søknad.felles.Feil;
import no.nav.k9.søknad.felles.Versjon;
import no.nav.k9.søknad.felles.type.Periode;
Expand All @@ -18,17 +19,18 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

public class Ungdomsytelse implements Ytelse {

private UngSøknadstype søknadType = UngSøknadstype.DELTAKELSE_SØKNAD;

@Valid
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
@JsonProperty(value = "søknadsperiode", required = true)
@NotNull
private List<@NotNull @GyldigPeriode(krevFomDato = true, krevTomDato = true) Periode> søknadsperiode = new ArrayList<>();
private List<@NotNull @GyldigPeriode(krevFomDato = true) Periode> søknadsperiode = new ArrayList<>();

@JsonProperty(value = "inntekt")
@DecimalMin("0.00")
Expand Down Expand Up @@ -84,6 +86,11 @@ public Person getAnnenPart() {
.map(Periode::getFraOgMed)
.min(LocalDate::compareTo)
.orElseThrow();

if (søknadType == UngSøknadstype.DELTAKELSE_SØKNAD) {
return new Periode(fom, TidUtils.TIDENES_ENDE); // Deltakelse har ingen sluttdato
}

final var tom = perioder
.stream()
.map(Periode::getTilOgMed)
Expand All @@ -94,7 +101,12 @@ public Person getAnnenPart() {
}

public List<Periode> getSøknadsperiodeList() {
return søknadsperiode == null ? null : Collections.unmodifiableList(søknadsperiode);
return søknadsperiode == null ? null : søknadsperiode.stream().map(p -> {
if (p.getTilOgMed() == null) {
return new Periode(p.getFraOgMed(), TidUtils.TIDENES_ENDE);
}
return p;
}).toList();
}

public BigDecimal getInntekt() {
Expand All @@ -116,4 +128,12 @@ public Ungdomsytelse medInntekt(BigDecimal inntekt) {
return this;
}

public UngSøknadstype getSøknadType() {
return søknadType;
}

public Ungdomsytelse medSøknadType(UngSøknadstype søknadType) {
this.søknadType = Objects.requireNonNull(søknadType, "søknadType");
return this;
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package no.nav.k9.søknad.ytelse.ung.v1;

import java.util.List;
import java.util.stream.Collectors;

import jakarta.validation.Validation;
import jakarta.validation.ValidatorFactory;
import no.nav.k9.søknad.Søknad;
Expand All @@ -11,13 +8,28 @@
import no.nav.k9.søknad.felles.type.Periode;
import no.nav.k9.søknad.felles.validering.AvbrytendeValideringsfeil;

import java.util.List;
import java.util.stream.Collectors;

public class UngdomsytelseSøknadValidator extends SøknadValidator<Søknad> {

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

@Override
public List<Feil> valider(Søknad søknad) {
return validerSøknadsfelter(søknad);
List<Feil> feil = validerSøknadsfelter(søknad);
validerYtelse(søknad, feil);
return feil;
}

private List<Feil> validerYtelse(Søknad søknad, List<Feil> feil) {
Ungdomsytelse ytelse = søknad.getYtelse();

if (ytelse.getSøknadType() == UngSøknadstype.RAPPORTERING_SØKNAD && ytelse.getSøknadsperiode().getTilOgMed() == null) {
feil.add(new Feil("søknadsperiode.tilOgMed", PÅKREVD, "Rapporteringssøknad må ha en sluttdato"));
}

return feil;
}

public List<Feil> valider(Søknad søknad, List<Periode> gyldigeEndringsperioder) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package no.nav.k9.søknad.ytelse.ung;

import no.nav.k9.søknad.felles.type.Periode;
import no.nav.k9.søknad.ytelse.ung.v1.UngSøknadstype;
import no.nav.k9.søknad.ytelse.ung.v1.Ungdomsytelse;

import java.math.BigDecimal;

public class YtelseEksempel {

public static Ungdomsytelse komplettYtelseMedSøknadsperiode(Periode søknadsperiode, BigDecimal inntekt) {
public static Ungdomsytelse komplettYtelseMedSøknadsperiode(Periode søknadsperiode, BigDecimal inntekt, UngSøknadstype søknadstype) {

return new Ungdomsytelse()
.medSøknadsperiode(søknadsperiode)
.medInntekt(inntekt);
.medInntekt(inntekt)
.medSøknadType(søknadstype);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import no.nav.k9.søknad.felles.type.Periode;
import no.nav.k9.søknad.ytelse.ung.SøknadEksempel;
import no.nav.k9.søknad.ytelse.ung.YtelseEksempel;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.math.BigDecimal;
Expand All @@ -12,23 +11,30 @@
class ValideringTest {

@Test
void verifiserHentingAvSøknadsperiodeUtenTomDatoFeiler() {
void verifiserHentingAvSøknadsperiodeUtenTomDatoIkkeFeiler() {
var søknadsperiode = new Periode(LocalDate.now(), null);
var ytelse = YtelseEksempel.komplettYtelseMedSøknadsperiode(søknadsperiode, BigDecimal.valueOf(1000));
ValiderUtil.verifyHarFeil(SøknadEksempel.søknad(ytelse));
var ytelse = YtelseEksempel.komplettYtelseMedSøknadsperiode(søknadsperiode, BigDecimal.valueOf(1000), UngSøknadstype.DELTAKELSE_SØKNAD);
ValiderUtil.verifyIngenFeil(SøknadEksempel.søknad(ytelse));
}

@Test
void verifiserInntektUnderNullFeiler() {
var søknadsperiode = new Periode(LocalDate.now(), LocalDate.now());
var ytelse = YtelseEksempel.komplettYtelseMedSøknadsperiode(søknadsperiode, BigDecimal.valueOf(-1000));
var ytelse = YtelseEksempel.komplettYtelseMedSøknadsperiode(søknadsperiode, BigDecimal.valueOf(-1000), UngSøknadstype.DELTAKELSE_SØKNAD);
ValiderUtil.verifyHarFeil(SøknadEksempel.søknad(ytelse));
}

@Test
void verifiserInntektOverGrenseFeiler() {
var søknadsperiode = new Periode(LocalDate.now(), LocalDate.now());
var ytelse = YtelseEksempel.komplettYtelseMedSøknadsperiode(søknadsperiode, BigDecimal.valueOf(1000001.00));
var ytelse = YtelseEksempel.komplettYtelseMedSøknadsperiode(søknadsperiode, BigDecimal.valueOf(1000001.00), UngSøknadstype.DELTAKELSE_SØKNAD);
ValiderUtil.verifyHarFeil(SøknadEksempel.søknad(ytelse));
}

@Test
void verifiserSøknadPeriodeUtenTilOgMedForRapporteringssøknadFeiler() {
var søknadsperiode = new Periode(LocalDate.now(), null);
var ytelse = YtelseEksempel.komplettYtelseMedSøknadsperiode(søknadsperiode, BigDecimal.valueOf(1000), UngSøknadstype.RAPPORTERING_SØKNAD);
ValiderUtil.verifyHarFeil(SøknadEksempel.søknad(ytelse));
}
}

0 comments on commit 71eac63

Please sign in to comment.