Skip to content

Commit

Permalink
first draft - Opplæringspenger (#266)
Browse files Browse the repository at this point in the history
* first draft - Opplæringspenger
  • Loading branch information
ekun authored Aug 10, 2022
1 parent 7c5dd36 commit 8e5fcd6
Show file tree
Hide file tree
Showing 6 changed files with 729 additions and 3 deletions.
10 changes: 7 additions & 3 deletions soknad/src/main/java/no/nav/k9/søknad/ytelse/Ytelse.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import no.nav.k9.søknad.ytelse.omsorgspenger.utvidetrett.v1.OmsorgspengerKroniskSyktBarn;
import no.nav.k9.søknad.ytelse.omsorgspenger.utvidetrett.v1.OmsorgspengerMidlertidigAlene;
import no.nav.k9.søknad.ytelse.omsorgspenger.v1.OmsorgspengerUtbetaling;
import no.nav.k9.søknad.ytelse.olp.v1.Opplæringspenger;
import no.nav.k9.søknad.ytelse.pls.v1.PleipengerLivetsSluttfase;
import no.nav.k9.søknad.ytelse.psb.v1.PleiepengerSyktBarn;

Expand All @@ -26,6 +27,7 @@
@JsonSubTypes.Type(name = Ytelse.OMSORGSPENGER_UTVIDETRETT_MIDLERTIDIG_ALENE, value = OmsorgspengerMidlertidigAlene.class),
@JsonSubTypes.Type(name = Ytelse.OMSORGSPENGER_UTVIDETRETT_ALENE_OMSORG, value = OmsorgspengerAleneOmsorg.class),
@JsonSubTypes.Type(name = Ytelse.PLEIEPENGER_SYKT_BARN, value = PleiepengerSyktBarn.class),
@JsonSubTypes.Type(name = Ytelse.OPPLÆRINGSPENGER, value = Opplæringspenger.class),
@JsonSubTypes.Type(name = Ytelse.PLEIEPENGER_LIVETS_SLUTTFASE, value = PleipengerLivetsSluttfase.class),
})
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
Expand All @@ -35,6 +37,7 @@ public interface Ytelse {
String OMSORGSPENGER_UTVIDETRETT_KRONISK_SYKT = "OMP_UTV_KS";
String OMSORGSPENGER_UTVIDETRETT_MIDLERTIDIG_ALENE = "OMP_UTV_MA";
String OMSORGSPENGER_UTVIDETRETT_ALENE_OMSORG = "OMP_UTV_AO";
String OPPLÆRINGSPENGER = "OPPLÆRINGSPENGER";
String PLEIEPENGER_SYKT_BARN = "PLEIEPENGER_SYKT_BARN";
String PLEIEPENGER_LIVETS_SLUTTFASE = "PLEIEPENGER_LIVETS_SLUTTFASE";

Expand All @@ -46,16 +49,17 @@ public interface Ytelse {
* @return andre berørte, kjente identifiserte personer (enn søker) - f.eks. barn, ektefelle, verge etc. som er involveres i denne saken.
*/
List<Person> getBerørtePersoner();

/** Pleietrengende person omtalt i søknaden (eks. barn/nærstående) når denne er subjektet bruker søker på bakgrunn av. */
Person getPleietrengende();

/** Annen part omtalt i søknaden (eks. ektefelle/samboer) når denne er subjektet bruker søker på bakgrunn av.*/
Person getAnnenPart();

enum Type {
OMSORGSPENGER_UTBETALING(Ytelse.OMSORGSPENGER_UTBETALING),
PLEIEPENGER_SYKT_BARN(Ytelse.PLEIEPENGER_SYKT_BARN),
OPPLÆRINGSPENGER(Ytelse.OPPLÆRINGSPENGER),
PLEIEPENGER_LIVETS_SLUTTFASE(Ytelse.PLEIEPENGER_LIVETS_SLUTTFASE),
OMSORGSPENGER_UTVIDETRETT_KRONISK_SYKT_BARN(Ytelse.OMSORGSPENGER_UTVIDETRETT_KRONISK_SYKT),
OMSORGSPENGER_UTVIDETRETT_MIDLERTIDIG_ALENE(Ytelse.OMSORGSPENGER_UTVIDETRETT_MIDLERTIDIG_ALENE),
Expand All @@ -76,4 +80,4 @@ public String kode() {

Periode getSøknadsperiode();

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,262 @@
package no.nav.k9.søknad.ytelse.olp.v1;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeName;

import no.nav.k9.søknad.felles.opptjening.OpptjeningAktivitet;
import no.nav.k9.søknad.felles.personopplysninger.Barn;
import no.nav.k9.søknad.felles.personopplysninger.Bosteder;
import no.nav.k9.søknad.felles.personopplysninger.Utenlandsopphold;
import no.nav.k9.søknad.felles.type.Periode;
import no.nav.k9.søknad.felles.type.Person;
import no.nav.k9.søknad.ytelse.Ytelse;
import no.nav.k9.søknad.ytelse.YtelseValidator;
import no.nav.k9.søknad.ytelse.olp.v1.kurs.Kurs;
import no.nav.k9.søknad.ytelse.psb.v1.DataBruktTilUtledning;
import no.nav.k9.søknad.ytelse.psb.v1.LovbestemtFerie;
import no.nav.k9.søknad.ytelse.psb.v1.Omsorg;
import no.nav.k9.søknad.ytelse.psb.v1.Uttak;
import no.nav.k9.søknad.ytelse.psb.v1.arbeidstid.Arbeidstid;

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
@JsonTypeName(Ytelse.OPPLÆRINGSPENGER)
public class Opplæringspenger implements Ytelse {

@Valid
@NotNull
@JsonProperty(value = "barn", required = true)
private Barn barn;

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

@Valid
@JsonProperty(value = "trekkKravPerioder", required = true)
@NotNull
private List<Periode> trekkKravPerioder = new ArrayList<>();

@Valid
@JsonProperty(value = "opptjeningAktivitet", required = true)
@NotNull
private OpptjeningAktivitet opptjeningAktivitet = new OpptjeningAktivitet();

@Valid
@JsonProperty(value = "dataBruktTilUtledning")
private DataBruktTilUtledning dataBruktTilUtledning;

@Valid
@JsonProperty(value = "bosteder", required = true)
private Bosteder bosteder = new Bosteder();

@Valid
@JsonProperty(value = "utenlandsopphold", required = true)
private Utenlandsopphold utenlandsopphold = new Utenlandsopphold();

@Valid
@JsonProperty(value = "lovbestemtFerie", required = true)
private LovbestemtFerie lovbestemtFerie = new LovbestemtFerie();

@Valid
@JsonProperty(value = "arbeidstid", required = true)
private Arbeidstid arbeidstid = new Arbeidstid();

@Valid
@JsonProperty(value = "uttak", required = true)
private Uttak uttak = new Uttak();

@Valid
@JsonProperty(value = "omsorg", required = true)
private Omsorg omsorg = new Omsorg();

@Valid
@NotNull
@JsonProperty(value = "kurs", required = true)
private Kurs kurs = new Kurs();

public Opplæringspenger() {
}

public Barn getBarn() {
return barn;
}

public Opplæringspenger medBarn(Barn barn) {
this.barn = Objects.requireNonNull(barn, "barn");
return this;
}

@Override
public Person getPleietrengende() {
return barn;
}

@Override
public Person getAnnenPart() {
// ikke relevant for opplæringspenger
return null;
}

@Override
public Periode getSøknadsperiode() {
final List<Periode> perioder = new ArrayList<>(søknadsperiode);
perioder.addAll(getEndringsperiode());

final var fom = perioder
.stream()
.map(Periode::getFraOgMed)
.min(LocalDate::compareTo)
.orElseThrow();
final var tom = perioder
.stream()
.map(Periode::getTilOgMed)
.max(LocalDate::compareTo)
.orElseThrow();
return new Periode(fom, tom);
}

public List<Periode> getSøknadsperiodeList() {
return søknadsperiode == null ? null : Collections.unmodifiableList(søknadsperiode);
}

public Opplæringspenger medSøknadsperiode(List<Periode> søknadsperiodeList) {
this.søknadsperiode.addAll(Objects.requireNonNull(søknadsperiodeList, "søknadsperiodeList"));
return this;
}

public Opplæringspenger medSøknadsperiode(Periode søknadsperiode) {
this.søknadsperiode.add(Objects.requireNonNull(søknadsperiode, "søknadsperiode"));
return this;
}

public List<Periode> getEndringsperiode() {
return PerioderMedEndringUtil.getEndringsperiode(this);
}


public Opplæringspenger addAllTrekkKravPerioder(List<Periode> trekkKravPerioder) {
this.trekkKravPerioder.addAll(Objects.requireNonNull(trekkKravPerioder, "trekkKravPerioder"));
return this;
}

public Opplæringspenger addTrekkKravPeriode(Periode trekkKravPeriode) {
this.trekkKravPerioder.add(Objects.requireNonNull(trekkKravPeriode, "trekkKravPeriode"));
return this;
}

public List<Periode> getTrekkKravPerioder() {
return Collections.unmodifiableList(trekkKravPerioder);
}

public OpptjeningAktivitet getOpptjeningAktivitet() {
return opptjeningAktivitet;
}

public Opplæringspenger medOpptjeningAktivitet(OpptjeningAktivitet arbeidAktivitet) {
this.opptjeningAktivitet = Objects.requireNonNull(arbeidAktivitet, "arbeidAktivitet");
return this;
}

public Optional<DataBruktTilUtledning> getSøknadInfo() {
return Optional.ofNullable(dataBruktTilUtledning);
}

public Opplæringspenger medSøknadInfo(DataBruktTilUtledning dataBruktTilUtledning) {
this.dataBruktTilUtledning = Objects.requireNonNull(dataBruktTilUtledning, "dataBruktTilUtledning");
return this;
}

public Bosteder getBosteder() {
return bosteder;
}

public Opplæringspenger medBosteder(Bosteder bosteder) {
this.bosteder = Objects.requireNonNull(bosteder, "bosteder");
return this;
}

public Utenlandsopphold getUtenlandsopphold() {
return utenlandsopphold;
}

public Opplæringspenger medUtenlandsopphold(Utenlandsopphold utenlandsopphold) {
this.utenlandsopphold = Objects.requireNonNull(utenlandsopphold, "utenlandsopphold");
return this;
}

public LovbestemtFerie getLovbestemtFerie() {
return lovbestemtFerie;
}

public Opplæringspenger medLovbestemtFerie(LovbestemtFerie lovbestemtFerie) {
this.lovbestemtFerie = Objects.requireNonNull(lovbestemtFerie, "lovbestemtFerie");
return this;
}

public Arbeidstid getArbeidstid() {
return arbeidstid;
}

public Opplæringspenger medArbeidstid(Arbeidstid arbeidstid) {
this.arbeidstid = Objects.requireNonNull(arbeidstid, "arbeidstid");
return this;
}

public Uttak getUttak() {
return uttak;
}

public Opplæringspenger medUttak(Uttak uttak) {
this.uttak = Objects.requireNonNull(uttak, "uttak");
return this;
}

public Omsorg getOmsorg() {
return this.omsorg;
}

public Opplæringspenger medOmsorg(Omsorg omsorg) {
this.omsorg = Objects.requireNonNull(omsorg, "omsorg");
return this;
}

public Kurs getKurs() {
return kurs;
}

public Opplæringspenger medKurs(Kurs kurs) {
this.kurs = Objects.requireNonNull(kurs, "kurs");
return this;
}

@Override
public Type getType() {
return Type.OPPLÆRINGSPENGER;
}

@Override
public List<Person> getBerørtePersoner() {
return List.of(barn); // kjenner ikke de andre søkerne her, kun pleietrengende som er identifisert
}

@Override
public YtelseValidator getValidator() {
return new OpplæringspengerYtelseValidator();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package no.nav.k9.søknad.ytelse.olp.v1;

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

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

import no.nav.k9.søknad.Søknad;
import no.nav.k9.søknad.SøknadValidator;
import no.nav.k9.søknad.ValideringsFeil;
import no.nav.k9.søknad.felles.Feil;
import no.nav.k9.søknad.felles.Versjon;
import no.nav.k9.søknad.felles.personopplysninger.Søker;
import no.nav.k9.søknad.felles.type.Periode;
import no.nav.k9.søknad.felles.type.Person;
import no.nav.k9.søknad.ytelse.psb.v1.PleiepengerSyktBarn;

public class OpplæringspengerSøknadValidator extends SøknadValidator<Søknad> {


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

public OpplæringspengerSøknadValidator() {
}

private static void validerVersjon(Versjon versjon, List<Feil> feil) {
if (versjon != null && !versjon.erGyldig()) {
feil.add(new Feil("versjon", "ugyldigVersjon", "Versjonen er på ugyldig format."));
}
}

private static void validerBarnIkkeErSøker(Søker søker, List<Person> barnList, List<Feil> feil) {
if (søker == null || barnList == null || barnList.isEmpty()) {
return;
}
if (barnList.stream().anyMatch(person -> person.getPersonIdent() != null && person.getPersonIdent().equals(søker.getPersonIdent()))) {
feil.add(new Feil("søker", "søkerSammeSomBarn", "Søker kan ikke være barn."));
}
}

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

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

List<Feil> feil = validate.stream()
.map(Feil::toFeil)
.collect(Collectors.toList());

PleiepengerSyktBarn ytelse = (PleiepengerSyktBarn) søknad.getYtelse();
validerInneholderBegrunnelseForInnsending(søknad, ytelse, feil);

validerVersjon(søknad.getVersjon(), feil);
validerBarnIkkeErSøker(søknad.getSøker(), søknad.getBerørtePersoner(), feil);
feil.addAll(new OpplæringspengerYtelseValidator().validerMedGyldigEndringsperodeHvisDenFinnes(søknad.getYtelse(), gyldigeEndringsperioder));

return feil;
}

private void validerInneholderBegrunnelseForInnsending(Søknad søknad, PleiepengerSyktBarn psb, List<Feil> feil) {
if ((psb).getTrekkKravPerioder() != null &&
!(psb).getTrekkKravPerioder().isEmpty()) {
if (søknad.getBegrunnelseForInnsending().getTekst() == null ||
søknad.getBegrunnelseForInnsending().getTekst().isEmpty()) {
feil.add(new Feil("begrunnelseForInnsending", "påkrevd", "Søknad inneholder trekk krav perioder uten begrunnelse for innsending."));
}
}
}

public void forsikreValidert(Søknad søknad, List<Periode> gyldigeEndringsperioder) {
List<Feil> feil = valider(søknad, gyldigeEndringsperioder);
if (!feil.isEmpty()) {
throw new ValideringsFeil(feil);
}
}

}
Loading

0 comments on commit 8e5fcd6

Please sign in to comment.