Skip to content

Commit e7e8bb4

Browse files
espenjvqtips
andauthored
TSFF-1193: Lager inntektrapportering som bekreftelse og utvider med nytt interface for uttalelse (#499)
* TSFF-1193: Lager inntektrapportering som bekreftelse og utvider med nytt interface for uttalelse * TSFF-1193: Fjerner klasse som ikke er i bruk --------- Co-authored-by: Qadeer Khan <[email protected]>
1 parent 1b8e194 commit e7e8bb4

File tree

12 files changed

+382
-10
lines changed

12 files changed

+382
-10
lines changed

oppgave-ungdomsytelse/src/main/java/no/nav/k9/oppgave/bekreftelse/Bekreftelse.java

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package no.nav.k9.oppgave.bekreftelse;
22

3+
import java.util.UUID;
4+
35
import com.fasterxml.jackson.annotation.JsonAutoDetect;
46
import com.fasterxml.jackson.annotation.JsonSubTypes;
57
import com.fasterxml.jackson.annotation.JsonTypeInfo;
68
import com.fasterxml.jackson.annotation.JsonValue;
79
import jakarta.validation.Valid;
10+
import no.nav.k9.oppgave.bekreftelse.ung.inntekt.InntektBekreftelse;
811
import no.nav.k9.oppgave.bekreftelse.ung.periodeendring.EndretFomDatoBekreftelse;
912
import no.nav.k9.oppgave.bekreftelse.ung.periodeendring.EndretTomDatoBekreftelse;
1013
import no.nav.k9.søknad.ytelse.DataBruktTilUtledning;
@@ -14,12 +17,19 @@
1417
@JsonSubTypes(value = {
1518
@JsonSubTypes.Type(name = Bekreftelse.UNG_ENDRET_FOM_DATO, value = EndretFomDatoBekreftelse.class),
1619
@JsonSubTypes.Type(name = Bekreftelse.UNG_ENDRET_TOM_DATO, value = EndretTomDatoBekreftelse.class),
20+
@JsonSubTypes.Type(name = Bekreftelse.UNG_AVVIK_REGISTERINNTEKT, value = InntektBekreftelse.class),
1721
})
1822
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
1923
public interface Bekreftelse {
2024

2125
String UNG_ENDRET_FOM_DATO = "UNG_ENDRET_FOM_DATO";
2226
String UNG_ENDRET_TOM_DATO = "UNG_ENDRET_TOM_DATO";
27+
String UNG_AVVIK_REGISTERINNTEKT = "UNG_AVVIK_REGISTERINNTEKT";
28+
29+
/**
30+
* Unik id for oppgaven som blir bekreftet
31+
*/
32+
UUID getOppgaveId();
2333

2434
Bekreftelse.Type getType();
2535

@@ -30,9 +40,16 @@ public interface Bekreftelse {
3040

3141
Bekreftelse medDataBruktTilUtledning(DataBruktTilUtledning dataBruktTilUtledning);
3242

43+
String getUttalelseFraBruker();
44+
45+
boolean harBrukerGodtattEndringen();
46+
47+
48+
3349
enum Type {
3450
UNG_ENDRET_FOM_DATO(Bekreftelse.UNG_ENDRET_FOM_DATO),
35-
UNG_ENDRET_TOM_DATO(Bekreftelse.UNG_ENDRET_TOM_DATO);
51+
UNG_ENDRET_TOM_DATO(Bekreftelse.UNG_ENDRET_TOM_DATO),
52+
UNG_AVVIK_REGISTERINNTEKT(Bekreftelse.UNG_AVVIK_REGISTERINNTEKT);
3653

3754

3855
@JsonValue
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
package no.nav.k9.oppgave.bekreftelse.ung.inntekt;
2+
3+
import com.fasterxml.jackson.annotation.JsonAutoDetect;
4+
import com.fasterxml.jackson.annotation.JsonCreator;
5+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
6+
import com.fasterxml.jackson.annotation.JsonProperty;
7+
import jakarta.validation.Valid;
8+
import jakarta.validation.constraints.AssertTrue;
9+
import jakarta.validation.constraints.NotNull;
10+
import jakarta.validation.constraints.Size;
11+
import no.nav.k9.oppgave.bekreftelse.Bekreftelse;
12+
import no.nav.k9.søknad.felles.type.Periode;
13+
import no.nav.k9.søknad.ytelse.DataBruktTilUtledning;
14+
15+
import java.time.LocalDate;
16+
import java.util.*;
17+
18+
@JsonIgnoreProperties(ignoreUnknown = true)
19+
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
20+
public class InntektBekreftelse implements Bekreftelse {
21+
22+
@JsonProperty("oppgaveId")
23+
private final UUID oppgaveId;
24+
25+
26+
/**
27+
* Inntekter i periode som arbeidstaker og/eller frilans
28+
*/
29+
@JsonProperty(value = "oppgittePeriodeinntekter")
30+
@Valid
31+
@NotNull
32+
@Size(min = 1)
33+
private final NavigableSet<@NotNull OppgittInntektForPeriode> oppgittePeriodeinntekter;
34+
35+
36+
@JsonProperty("harBrukerGodtattEndringen")
37+
private final boolean harBrukerGodtattEndringen;
38+
39+
@JsonProperty("uttalelseFraBruker")
40+
private final String uttalelseFraBruker;
41+
42+
@JsonProperty("dataBruktTilUtledning")
43+
private DataBruktTilUtledning dataBruktTilUtledning;
44+
45+
46+
47+
@JsonCreator
48+
public InntektBekreftelse(@JsonProperty("oppgaveId") UUID oppgaveId, @JsonProperty(value = "oppgittePeriodeinntekter") Set<OppgittInntektForPeriode> oppgittePeriodeinntekter,
49+
@JsonProperty(value = "harBrukerGodtattEndringen") boolean harBrukerGodtattEndringen,
50+
@JsonProperty(value = "uttalelseFraBruker") String uttalelseFraBruker) {
51+
this.oppgittePeriodeinntekter = (oppgittePeriodeinntekter == null) ? Collections.emptyNavigableSet()
52+
: Collections.unmodifiableNavigableSet(new TreeSet<>(oppgittePeriodeinntekter));
53+
this.uttalelseFraBruker = uttalelseFraBruker;
54+
this.harBrukerGodtattEndringen = harBrukerGodtattEndringen;
55+
this.oppgaveId = oppgaveId;
56+
}
57+
58+
public static Builder builder() {
59+
return new Builder();
60+
}
61+
62+
public NavigableSet<OppgittInntektForPeriode> getOppgittePeriodeinntekter() {
63+
return oppgittePeriodeinntekter;
64+
}
65+
66+
public Periode getMinMaksPeriode() {
67+
final var first = oppgittePeriodeinntekter.first();
68+
final var last = oppgittePeriodeinntekter.last();
69+
return new Periode(first.getPeriode().getFraOgMed(), last.getPeriode().getTilOgMed());
70+
}
71+
72+
@Override
73+
public UUID getOppgaveId() {
74+
return oppgaveId;
75+
}
76+
77+
@Override
78+
public Type getType() {
79+
return Type.UNG_AVVIK_REGISTERINNTEKT;
80+
}
81+
82+
@Override
83+
public DataBruktTilUtledning getDataBruktTilUtledning() {
84+
return dataBruktTilUtledning;
85+
}
86+
87+
@Override
88+
public Bekreftelse medDataBruktTilUtledning(DataBruktTilUtledning dataBruktTilUtledning) {
89+
this.dataBruktTilUtledning = dataBruktTilUtledning;
90+
return this;
91+
}
92+
93+
@Override
94+
public String getUttalelseFraBruker() {
95+
return uttalelseFraBruker;
96+
}
97+
98+
@Override
99+
public boolean harBrukerGodtattEndringen() {
100+
return harBrukerGodtattEndringen;
101+
}
102+
103+
public static final class Builder {
104+
private Set<OppgittInntektForPeriode> oppgittePeriodeinntekter = new LinkedHashSet<>();
105+
private String uttalelseFraBruker;
106+
private boolean harBrukerGodtattEndringen;
107+
private UUID oppgaveId;
108+
109+
private Builder() {
110+
}
111+
112+
public Builder medOppgittePeriodeinntekter(Set<OppgittInntektForPeriode> inntekter) {
113+
if (inntekter != null) {
114+
oppgittePeriodeinntekter.addAll(inntekter);
115+
}
116+
return this;
117+
}
118+
119+
public Builder medUttalelseFraBruker(String uttalelseFraBruker) {
120+
this.uttalelseFraBruker = uttalelseFraBruker;
121+
return this;
122+
}
123+
124+
public Builder medHarBrukerGodtattEndringen(boolean harBrukerGodtattEndringen) {
125+
this.harBrukerGodtattEndringen = harBrukerGodtattEndringen;
126+
return this;
127+
}
128+
129+
public Builder medOppgaveId(UUID oppgaveId) {
130+
this.oppgaveId = oppgaveId;
131+
return this;
132+
}
133+
134+
135+
136+
public InntektBekreftelse build() {
137+
if (oppgittePeriodeinntekter.isEmpty()) {
138+
throw new IllegalStateException("Må oppgi minst en periodeinntekt");
139+
}
140+
return new InntektBekreftelse(oppgaveId, oppgittePeriodeinntekter, harBrukerGodtattEndringen, uttalelseFraBruker);
141+
}
142+
}
143+
144+
@AssertTrue(message = "Perioder for inntekt kan ikke overlappe")
145+
public boolean isHarIngenOverlappendePerioder() {
146+
return harIngenOverlapp(oppgittePeriodeinntekter);
147+
}
148+
149+
private boolean harIngenOverlapp(@Valid @NotNull NavigableSet<@NotNull OppgittInntektForPeriode> set) {
150+
final var iterator = set.iterator();
151+
// Initialiserer til første mulige periode
152+
var prev = new Periode(LocalDate.MIN, LocalDate.MIN);
153+
// Siden settet er av typen NavigableSet (sortert) trenger vi kun å sjekke forrige element i lista
154+
while (iterator.hasNext()) {
155+
final var next = iterator.next();
156+
if (!prev.getTilOgMed().isBefore(next.getPeriode().getFraOgMed())) {
157+
return false;
158+
}
159+
prev = next.getPeriode();
160+
}
161+
return true;
162+
}
163+
164+
165+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package no.nav.k9.oppgave.bekreftelse.ung.inntekt;
2+
3+
import com.fasterxml.jackson.annotation.*;
4+
import jakarta.validation.Valid;
5+
import jakarta.validation.constraints.DecimalMax;
6+
import jakarta.validation.constraints.DecimalMin;
7+
import jakarta.validation.constraints.NotNull;
8+
import no.nav.k9.søknad.felles.type.Periode;
9+
import no.nav.k9.søknad.felles.validering.periode.GyldigPeriode;
10+
11+
import java.math.BigDecimal;
12+
import java.util.Objects;
13+
14+
@JsonIgnoreProperties(ignoreUnknown = true)
15+
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
16+
public class OppgittInntektForPeriode implements Comparable<OppgittInntektForPeriode> {
17+
18+
private static final String MIN = "0.00";
19+
private static final String MAX = "10000000.00";
20+
21+
@JsonProperty(value = "periode", required = true)
22+
@Valid
23+
@NotNull
24+
@GyldigPeriode(krevFomDato = true, krevTomDato = true)
25+
private Periode periode;
26+
27+
@JsonProperty(value = "arbeidstakerOgFrilansInntekt", required = false)
28+
@Valid
29+
@DecimalMin(MIN)
30+
@DecimalMax(MAX)
31+
@JsonFormat(shape = JsonFormat.Shape.STRING)
32+
private BigDecimal arbeidstakerOgFrilansInntekt;
33+
34+
@JsonProperty(value = "ytelse", required = false)
35+
@Valid
36+
@DecimalMin(MIN)
37+
@DecimalMax(MAX)
38+
@JsonFormat(shape = JsonFormat.Shape.STRING)
39+
private BigDecimal ytelse;
40+
41+
42+
@JsonCreator
43+
public OppgittInntektForPeriode(@JsonProperty(value = "periode") Periode periode, @JsonProperty(value = "arbeidstakerOgFrilansInntekt") BigDecimal arbeidstakerOgFrilansInntekt,
44+
@JsonProperty(value = "ytelse") BigDecimal ytelse) {
45+
this.arbeidstakerOgFrilansInntekt = arbeidstakerOgFrilansInntekt;
46+
this.ytelse = ytelse;
47+
this.periode = periode;
48+
}
49+
50+
public static Builder builder(Periode periode) {
51+
return new Builder(periode);
52+
}
53+
54+
public Periode getPeriode() {
55+
return periode;
56+
}
57+
58+
public BigDecimal getArbeidstakerOgFrilansInntekt() {
59+
return arbeidstakerOgFrilansInntekt;
60+
}
61+
62+
public BigDecimal getYtelse() {
63+
return ytelse;
64+
}
65+
66+
@Override
67+
public int compareTo(OppgittInntektForPeriode o) {
68+
return this.periode.compareTo(o.periode);
69+
}
70+
71+
@Override
72+
public boolean equals(Object o) {
73+
if (o == null || getClass() != o.getClass()) return false;
74+
OppgittInntektForPeriode that = (OppgittInntektForPeriode) o;
75+
return Objects.equals(periode, that.periode) &&
76+
Objects.equals(arbeidstakerOgFrilansInntekt, that.arbeidstakerOgFrilansInntekt) &&
77+
Objects.equals(ytelse, that.ytelse);
78+
}
79+
80+
@Override
81+
public int hashCode() {
82+
return Objects.hash(periode, arbeidstakerOgFrilansInntekt, ytelse);
83+
}
84+
85+
public static final class Builder {
86+
private BigDecimal arbeidstakerOgFrilansInntekt;
87+
private BigDecimal ytelse;
88+
private Periode periode;
89+
90+
private Builder(Periode periode) {
91+
this.periode = periode;
92+
}
93+
94+
public Builder medArbeidstakerOgFrilansinntekt(BigDecimal inntekt) {
95+
this.arbeidstakerOgFrilansInntekt = inntekt;
96+
return this;
97+
}
98+
99+
public Builder medYtelse(BigDecimal inntekt) {
100+
this.ytelse = inntekt;
101+
return this;
102+
}
103+
104+
public OppgittInntektForPeriode build() {
105+
return new OppgittInntektForPeriode(periode, arbeidstakerOgFrilansInntekt, ytelse);
106+
}
107+
}
108+
109+
}

oppgave-ungdomsytelse/src/main/java/no/nav/k9/oppgave/bekreftelse/ung/periodeendring/DatoEndring.java

-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,4 @@ public interface DatoEndring extends Bekreftelse {
88

99
LocalDate getNyDato();
1010

11-
boolean harBrukerGodtattEndringen();
12-
1311
}

oppgave-ungdomsytelse/src/main/java/no/nav/k9/oppgave/bekreftelse/ung/periodeendring/EndretFomDatoBekreftelse.java

+27
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,22 @@
66
import no.nav.k9.søknad.ytelse.DataBruktTilUtledning;
77

88
import java.time.LocalDate;
9+
import java.util.UUID;
910

1011
public class EndretFomDatoBekreftelse implements DatoEndring {
1112

13+
@JsonProperty("oppgaveId")
14+
private UUID oppgaveId;
15+
1216
@JsonProperty("nyFomDato")
1317
private LocalDate nyFomDato;
1418

1519
@JsonProperty("harBrukerGodtattEndringen")
1620
private boolean harBrukerGodtattEndringen;
1721

22+
@JsonProperty("uttalelseFraBruker")
23+
private String uttalelseFraBruker;
24+
1825
@JsonProperty("dataBruktTilUtledning")
1926
private DataBruktTilUtledning dataBruktTilUtledning;
2027

@@ -51,8 +58,28 @@ public LocalDate getNyDato() {
5158
return nyFomDato;
5259
}
5360

61+
@Override
62+
public String getUttalelseFraBruker() {
63+
return uttalelseFraBruker;
64+
}
65+
66+
public Bekreftelse medUttalelseFraBruker(String uttalelseFraBruker) {
67+
this.uttalelseFraBruker = uttalelseFraBruker;
68+
return this;
69+
}
70+
71+
public Bekreftelse medHarBrukerGodtattEndringen(boolean harBrukerGodtattEndringen) {
72+
this.harBrukerGodtattEndringen = harBrukerGodtattEndringen;
73+
return this;
74+
}
75+
5476
@Override
5577
public boolean harBrukerGodtattEndringen() {
5678
return harBrukerGodtattEndringen;
5779
}
80+
81+
@Override
82+
public UUID getOppgaveId() {
83+
return oppgaveId;
84+
}
5885
}

0 commit comments

Comments
 (0)