Skip to content

Commit 8e5fcd6

Browse files
authored
first draft - Opplæringspenger (#266)
* first draft - Opplæringspenger
1 parent 7c5dd36 commit 8e5fcd6

File tree

6 files changed

+729
-3
lines changed

6 files changed

+729
-3
lines changed

soknad/src/main/java/no/nav/k9/søknad/ytelse/Ytelse.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import no.nav.k9.søknad.ytelse.omsorgspenger.utvidetrett.v1.OmsorgspengerKroniskSyktBarn;
1616
import no.nav.k9.søknad.ytelse.omsorgspenger.utvidetrett.v1.OmsorgspengerMidlertidigAlene;
1717
import no.nav.k9.søknad.ytelse.omsorgspenger.v1.OmsorgspengerUtbetaling;
18+
import no.nav.k9.søknad.ytelse.olp.v1.Opplæringspenger;
1819
import no.nav.k9.søknad.ytelse.pls.v1.PleipengerLivetsSluttfase;
1920
import no.nav.k9.søknad.ytelse.psb.v1.PleiepengerSyktBarn;
2021

@@ -26,6 +27,7 @@
2627
@JsonSubTypes.Type(name = Ytelse.OMSORGSPENGER_UTVIDETRETT_MIDLERTIDIG_ALENE, value = OmsorgspengerMidlertidigAlene.class),
2728
@JsonSubTypes.Type(name = Ytelse.OMSORGSPENGER_UTVIDETRETT_ALENE_OMSORG, value = OmsorgspengerAleneOmsorg.class),
2829
@JsonSubTypes.Type(name = Ytelse.PLEIEPENGER_SYKT_BARN, value = PleiepengerSyktBarn.class),
30+
@JsonSubTypes.Type(name = Ytelse.OPPLÆRINGSPENGER, value = Opplæringspenger.class),
2931
@JsonSubTypes.Type(name = Ytelse.PLEIEPENGER_LIVETS_SLUTTFASE, value = PleipengerLivetsSluttfase.class),
3032
})
3133
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
@@ -35,6 +37,7 @@ public interface Ytelse {
3537
String OMSORGSPENGER_UTVIDETRETT_KRONISK_SYKT = "OMP_UTV_KS";
3638
String OMSORGSPENGER_UTVIDETRETT_MIDLERTIDIG_ALENE = "OMP_UTV_MA";
3739
String OMSORGSPENGER_UTVIDETRETT_ALENE_OMSORG = "OMP_UTV_AO";
40+
String OPPLÆRINGSPENGER = "OPPLÆRINGSPENGER";
3841
String PLEIEPENGER_SYKT_BARN = "PLEIEPENGER_SYKT_BARN";
3942
String PLEIEPENGER_LIVETS_SLUTTFASE = "PLEIEPENGER_LIVETS_SLUTTFASE";
4043

@@ -46,16 +49,17 @@ public interface Ytelse {
4649
* @return andre berørte, kjente identifiserte personer (enn søker) - f.eks. barn, ektefelle, verge etc. som er involveres i denne saken.
4750
*/
4851
List<Person> getBerørtePersoner();
49-
52+
5053
/** Pleietrengende person omtalt i søknaden (eks. barn/nærstående) når denne er subjektet bruker søker på bakgrunn av. */
5154
Person getPleietrengende();
5255

5356
/** Annen part omtalt i søknaden (eks. ektefelle/samboer) når denne er subjektet bruker søker på bakgrunn av.*/
5457
Person getAnnenPart();
55-
58+
5659
enum Type {
5760
OMSORGSPENGER_UTBETALING(Ytelse.OMSORGSPENGER_UTBETALING),
5861
PLEIEPENGER_SYKT_BARN(Ytelse.PLEIEPENGER_SYKT_BARN),
62+
OPPLÆRINGSPENGER(Ytelse.OPPLÆRINGSPENGER),
5963
PLEIEPENGER_LIVETS_SLUTTFASE(Ytelse.PLEIEPENGER_LIVETS_SLUTTFASE),
6064
OMSORGSPENGER_UTVIDETRETT_KRONISK_SYKT_BARN(Ytelse.OMSORGSPENGER_UTVIDETRETT_KRONISK_SYKT),
6165
OMSORGSPENGER_UTVIDETRETT_MIDLERTIDIG_ALENE(Ytelse.OMSORGSPENGER_UTVIDETRETT_MIDLERTIDIG_ALENE),
@@ -76,4 +80,4 @@ public String kode() {
7680

7781
Periode getSøknadsperiode();
7882

79-
}
83+
}
Lines changed: 262 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,262 @@
1+
package no.nav.k9.søknad.ytelse.olp.v1;
2+
3+
import java.time.LocalDate;
4+
import java.util.ArrayList;
5+
import java.util.Collections;
6+
import java.util.List;
7+
import java.util.Objects;
8+
import java.util.Optional;
9+
10+
import javax.validation.Valid;
11+
import javax.validation.constraints.NotNull;
12+
13+
import com.fasterxml.jackson.annotation.JsonAutoDetect;
14+
import com.fasterxml.jackson.annotation.JsonFormat;
15+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
16+
import com.fasterxml.jackson.annotation.JsonProperty;
17+
import com.fasterxml.jackson.annotation.JsonTypeName;
18+
19+
import no.nav.k9.søknad.felles.opptjening.OpptjeningAktivitet;
20+
import no.nav.k9.søknad.felles.personopplysninger.Barn;
21+
import no.nav.k9.søknad.felles.personopplysninger.Bosteder;
22+
import no.nav.k9.søknad.felles.personopplysninger.Utenlandsopphold;
23+
import no.nav.k9.søknad.felles.type.Periode;
24+
import no.nav.k9.søknad.felles.type.Person;
25+
import no.nav.k9.søknad.ytelse.Ytelse;
26+
import no.nav.k9.søknad.ytelse.YtelseValidator;
27+
import no.nav.k9.søknad.ytelse.olp.v1.kurs.Kurs;
28+
import no.nav.k9.søknad.ytelse.psb.v1.DataBruktTilUtledning;
29+
import no.nav.k9.søknad.ytelse.psb.v1.LovbestemtFerie;
30+
import no.nav.k9.søknad.ytelse.psb.v1.Omsorg;
31+
import no.nav.k9.søknad.ytelse.psb.v1.Uttak;
32+
import no.nav.k9.søknad.ytelse.psb.v1.arbeidstid.Arbeidstid;
33+
34+
@JsonIgnoreProperties(ignoreUnknown = true)
35+
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
36+
@JsonTypeName(Ytelse.OPPLÆRINGSPENGER)
37+
public class Opplæringspenger implements Ytelse {
38+
39+
@Valid
40+
@NotNull
41+
@JsonProperty(value = "barn", required = true)
42+
private Barn barn;
43+
44+
@Valid
45+
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
46+
@JsonProperty(value = "søknadsperiode", required = true)
47+
@NotNull
48+
private List<Periode> søknadsperiode = new ArrayList<>();
49+
50+
@Valid
51+
@JsonProperty(value = "trekkKravPerioder", required = true)
52+
@NotNull
53+
private List<Periode> trekkKravPerioder = new ArrayList<>();
54+
55+
@Valid
56+
@JsonProperty(value = "opptjeningAktivitet", required = true)
57+
@NotNull
58+
private OpptjeningAktivitet opptjeningAktivitet = new OpptjeningAktivitet();
59+
60+
@Valid
61+
@JsonProperty(value = "dataBruktTilUtledning")
62+
private DataBruktTilUtledning dataBruktTilUtledning;
63+
64+
@Valid
65+
@JsonProperty(value = "bosteder", required = true)
66+
private Bosteder bosteder = new Bosteder();
67+
68+
@Valid
69+
@JsonProperty(value = "utenlandsopphold", required = true)
70+
private Utenlandsopphold utenlandsopphold = new Utenlandsopphold();
71+
72+
@Valid
73+
@JsonProperty(value = "lovbestemtFerie", required = true)
74+
private LovbestemtFerie lovbestemtFerie = new LovbestemtFerie();
75+
76+
@Valid
77+
@JsonProperty(value = "arbeidstid", required = true)
78+
private Arbeidstid arbeidstid = new Arbeidstid();
79+
80+
@Valid
81+
@JsonProperty(value = "uttak", required = true)
82+
private Uttak uttak = new Uttak();
83+
84+
@Valid
85+
@JsonProperty(value = "omsorg", required = true)
86+
private Omsorg omsorg = new Omsorg();
87+
88+
@Valid
89+
@NotNull
90+
@JsonProperty(value = "kurs", required = true)
91+
private Kurs kurs = new Kurs();
92+
93+
public Opplæringspenger() {
94+
}
95+
96+
public Barn getBarn() {
97+
return barn;
98+
}
99+
100+
public Opplæringspenger medBarn(Barn barn) {
101+
this.barn = Objects.requireNonNull(barn, "barn");
102+
return this;
103+
}
104+
105+
@Override
106+
public Person getPleietrengende() {
107+
return barn;
108+
}
109+
110+
@Override
111+
public Person getAnnenPart() {
112+
// ikke relevant for opplæringspenger
113+
return null;
114+
}
115+
116+
@Override
117+
public Periode getSøknadsperiode() {
118+
final List<Periode> perioder = new ArrayList<>(søknadsperiode);
119+
perioder.addAll(getEndringsperiode());
120+
121+
final var fom = perioder
122+
.stream()
123+
.map(Periode::getFraOgMed)
124+
.min(LocalDate::compareTo)
125+
.orElseThrow();
126+
final var tom = perioder
127+
.stream()
128+
.map(Periode::getTilOgMed)
129+
.max(LocalDate::compareTo)
130+
.orElseThrow();
131+
return new Periode(fom, tom);
132+
}
133+
134+
public List<Periode> getSøknadsperiodeList() {
135+
return søknadsperiode == null ? null : Collections.unmodifiableList(søknadsperiode);
136+
}
137+
138+
public Opplæringspenger medSøknadsperiode(List<Periode> søknadsperiodeList) {
139+
this.søknadsperiode.addAll(Objects.requireNonNull(søknadsperiodeList, "søknadsperiodeList"));
140+
return this;
141+
}
142+
143+
public Opplæringspenger medSøknadsperiode(Periode søknadsperiode) {
144+
this.søknadsperiode.add(Objects.requireNonNull(søknadsperiode, "søknadsperiode"));
145+
return this;
146+
}
147+
148+
public List<Periode> getEndringsperiode() {
149+
return PerioderMedEndringUtil.getEndringsperiode(this);
150+
}
151+
152+
153+
public Opplæringspenger addAllTrekkKravPerioder(List<Periode> trekkKravPerioder) {
154+
this.trekkKravPerioder.addAll(Objects.requireNonNull(trekkKravPerioder, "trekkKravPerioder"));
155+
return this;
156+
}
157+
158+
public Opplæringspenger addTrekkKravPeriode(Periode trekkKravPeriode) {
159+
this.trekkKravPerioder.add(Objects.requireNonNull(trekkKravPeriode, "trekkKravPeriode"));
160+
return this;
161+
}
162+
163+
public List<Periode> getTrekkKravPerioder() {
164+
return Collections.unmodifiableList(trekkKravPerioder);
165+
}
166+
167+
public OpptjeningAktivitet getOpptjeningAktivitet() {
168+
return opptjeningAktivitet;
169+
}
170+
171+
public Opplæringspenger medOpptjeningAktivitet(OpptjeningAktivitet arbeidAktivitet) {
172+
this.opptjeningAktivitet = Objects.requireNonNull(arbeidAktivitet, "arbeidAktivitet");
173+
return this;
174+
}
175+
176+
public Optional<DataBruktTilUtledning> getSøknadInfo() {
177+
return Optional.ofNullable(dataBruktTilUtledning);
178+
}
179+
180+
public Opplæringspenger medSøknadInfo(DataBruktTilUtledning dataBruktTilUtledning) {
181+
this.dataBruktTilUtledning = Objects.requireNonNull(dataBruktTilUtledning, "dataBruktTilUtledning");
182+
return this;
183+
}
184+
185+
public Bosteder getBosteder() {
186+
return bosteder;
187+
}
188+
189+
public Opplæringspenger medBosteder(Bosteder bosteder) {
190+
this.bosteder = Objects.requireNonNull(bosteder, "bosteder");
191+
return this;
192+
}
193+
194+
public Utenlandsopphold getUtenlandsopphold() {
195+
return utenlandsopphold;
196+
}
197+
198+
public Opplæringspenger medUtenlandsopphold(Utenlandsopphold utenlandsopphold) {
199+
this.utenlandsopphold = Objects.requireNonNull(utenlandsopphold, "utenlandsopphold");
200+
return this;
201+
}
202+
203+
public LovbestemtFerie getLovbestemtFerie() {
204+
return lovbestemtFerie;
205+
}
206+
207+
public Opplæringspenger medLovbestemtFerie(LovbestemtFerie lovbestemtFerie) {
208+
this.lovbestemtFerie = Objects.requireNonNull(lovbestemtFerie, "lovbestemtFerie");
209+
return this;
210+
}
211+
212+
public Arbeidstid getArbeidstid() {
213+
return arbeidstid;
214+
}
215+
216+
public Opplæringspenger medArbeidstid(Arbeidstid arbeidstid) {
217+
this.arbeidstid = Objects.requireNonNull(arbeidstid, "arbeidstid");
218+
return this;
219+
}
220+
221+
public Uttak getUttak() {
222+
return uttak;
223+
}
224+
225+
public Opplæringspenger medUttak(Uttak uttak) {
226+
this.uttak = Objects.requireNonNull(uttak, "uttak");
227+
return this;
228+
}
229+
230+
public Omsorg getOmsorg() {
231+
return this.omsorg;
232+
}
233+
234+
public Opplæringspenger medOmsorg(Omsorg omsorg) {
235+
this.omsorg = Objects.requireNonNull(omsorg, "omsorg");
236+
return this;
237+
}
238+
239+
public Kurs getKurs() {
240+
return kurs;
241+
}
242+
243+
public Opplæringspenger medKurs(Kurs kurs) {
244+
this.kurs = Objects.requireNonNull(kurs, "kurs");
245+
return this;
246+
}
247+
248+
@Override
249+
public Type getType() {
250+
return Type.OPPLÆRINGSPENGER;
251+
}
252+
253+
@Override
254+
public List<Person> getBerørtePersoner() {
255+
return List.of(barn); // kjenner ikke de andre søkerne her, kun pleietrengende som er identifisert
256+
}
257+
258+
@Override
259+
public YtelseValidator getValidator() {
260+
return new OpplæringspengerYtelseValidator();
261+
}
262+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package no.nav.k9.søknad.ytelse.olp.v1;
2+
3+
import java.util.List;
4+
import java.util.stream.Collectors;
5+
6+
import javax.validation.Validation;
7+
import javax.validation.ValidatorFactory;
8+
9+
import no.nav.k9.søknad.Søknad;
10+
import no.nav.k9.søknad.SøknadValidator;
11+
import no.nav.k9.søknad.ValideringsFeil;
12+
import no.nav.k9.søknad.felles.Feil;
13+
import no.nav.k9.søknad.felles.Versjon;
14+
import no.nav.k9.søknad.felles.personopplysninger.Søker;
15+
import no.nav.k9.søknad.felles.type.Periode;
16+
import no.nav.k9.søknad.felles.type.Person;
17+
import no.nav.k9.søknad.ytelse.psb.v1.PleiepengerSyktBarn;
18+
19+
public class OpplæringspengerSøknadValidator extends SøknadValidator<Søknad> {
20+
21+
22+
private static final ValidatorFactory VALIDATOR_FACTORY = Validation.buildDefaultValidatorFactory();
23+
24+
public OpplæringspengerSøknadValidator() {
25+
}
26+
27+
private static void validerVersjon(Versjon versjon, List<Feil> feil) {
28+
if (versjon != null && !versjon.erGyldig()) {
29+
feil.add(new Feil("versjon", "ugyldigVersjon", "Versjonen er på ugyldig format."));
30+
}
31+
}
32+
33+
private static void validerBarnIkkeErSøker(Søker søker, List<Person> barnList, List<Feil> feil) {
34+
if (søker == null || barnList == null || barnList.isEmpty()) {
35+
return;
36+
}
37+
if (barnList.stream().anyMatch(person -> person.getPersonIdent() != null && person.getPersonIdent().equals(søker.getPersonIdent()))) {
38+
feil.add(new Feil("søker", "søkerSammeSomBarn", "Søker kan ikke være barn."));
39+
}
40+
}
41+
42+
@Override
43+
public List<Feil> valider(Søknad søknad) {
44+
return valider(søknad, List.of());
45+
}
46+
47+
public List<Feil> valider(Søknad søknad, List<Periode> gyldigeEndringsperioder) {
48+
var validate = VALIDATOR_FACTORY.getValidator().validate(søknad);
49+
50+
List<Feil> feil = validate.stream()
51+
.map(Feil::toFeil)
52+
.collect(Collectors.toList());
53+
54+
PleiepengerSyktBarn ytelse = (PleiepengerSyktBarn) søknad.getYtelse();
55+
validerInneholderBegrunnelseForInnsending(søknad, ytelse, feil);
56+
57+
validerVersjon(søknad.getVersjon(), feil);
58+
validerBarnIkkeErSøker(søknad.getSøker(), søknad.getBerørtePersoner(), feil);
59+
feil.addAll(new OpplæringspengerYtelseValidator().validerMedGyldigEndringsperodeHvisDenFinnes(søknad.getYtelse(), gyldigeEndringsperioder));
60+
61+
return feil;
62+
}
63+
64+
private void validerInneholderBegrunnelseForInnsending(Søknad søknad, PleiepengerSyktBarn psb, List<Feil> feil) {
65+
if ((psb).getTrekkKravPerioder() != null &&
66+
!(psb).getTrekkKravPerioder().isEmpty()) {
67+
if (søknad.getBegrunnelseForInnsending().getTekst() == null ||
68+
søknad.getBegrunnelseForInnsending().getTekst().isEmpty()) {
69+
feil.add(new Feil("begrunnelseForInnsending", "påkrevd", "Søknad inneholder trekk krav perioder uten begrunnelse for innsending."));
70+
}
71+
}
72+
}
73+
74+
public void forsikreValidert(Søknad søknad, List<Periode> gyldigeEndringsperioder) {
75+
List<Feil> feil = valider(søknad, gyldigeEndringsperioder);
76+
if (!feil.isEmpty()) {
77+
throw new ValideringsFeil(feil);
78+
}
79+
}
80+
81+
}

0 commit comments

Comments
 (0)