Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TSFF-1193: Lager inntektrapportering som bekreftelse og utvider med nytt interface for uttalelse #499

Merged
merged 7 commits into from
Mar 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package no.nav.k9.oppgave.bekreftelse;

import java.util.UUID;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonValue;
import jakarta.validation.Valid;
import no.nav.k9.oppgave.bekreftelse.ung.inntekt.InntektBekreftelse;
import no.nav.k9.oppgave.bekreftelse.ung.periodeendring.EndretFomDatoBekreftelse;
import no.nav.k9.oppgave.bekreftelse.ung.periodeendring.EndretTomDatoBekreftelse;
import no.nav.k9.søknad.ytelse.DataBruktTilUtledning;
Expand All @@ -14,12 +17,19 @@
@JsonSubTypes(value = {
@JsonSubTypes.Type(name = Bekreftelse.UNG_ENDRET_FOM_DATO, value = EndretFomDatoBekreftelse.class),
@JsonSubTypes.Type(name = Bekreftelse.UNG_ENDRET_TOM_DATO, value = EndretTomDatoBekreftelse.class),
@JsonSubTypes.Type(name = Bekreftelse.UNG_AVVIK_REGISTERINNTEKT, value = InntektBekreftelse.class),
})
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
public interface Bekreftelse {

String UNG_ENDRET_FOM_DATO = "UNG_ENDRET_FOM_DATO";
String UNG_ENDRET_TOM_DATO = "UNG_ENDRET_TOM_DATO";
String UNG_AVVIK_REGISTERINNTEKT = "UNG_AVVIK_REGISTERINNTEKT";

/**
* Unik id for oppgaven som blir bekreftet
*/
UUID getOppgaveId();

Bekreftelse.Type getType();

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

Bekreftelse medDataBruktTilUtledning(DataBruktTilUtledning dataBruktTilUtledning);

String getUttalelseFraBruker();

boolean harBrukerGodtattEndringen();



enum Type {
UNG_ENDRET_FOM_DATO(Bekreftelse.UNG_ENDRET_FOM_DATO),
UNG_ENDRET_TOM_DATO(Bekreftelse.UNG_ENDRET_TOM_DATO);
UNG_ENDRET_TOM_DATO(Bekreftelse.UNG_ENDRET_TOM_DATO),
UNG_AVVIK_REGISTERINNTEKT(Bekreftelse.UNG_AVVIK_REGISTERINNTEKT);


@JsonValue
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
package no.nav.k9.oppgave.bekreftelse.ung.inntekt;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import jakarta.validation.Valid;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import no.nav.k9.oppgave.bekreftelse.Bekreftelse;
import no.nav.k9.søknad.felles.type.Periode;
import no.nav.k9.søknad.ytelse.DataBruktTilUtledning;

import java.time.LocalDate;
import java.util.*;

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
public class InntektBekreftelse implements Bekreftelse {

@JsonProperty("oppgaveId")
private final UUID oppgaveId;


/**
* Inntekter i periode som arbeidstaker og/eller frilans
*/
@JsonProperty(value = "oppgittePeriodeinntekter")
@Valid
@NotNull
@Size(min = 1)
private final NavigableSet<@NotNull OppgittInntektForPeriode> oppgittePeriodeinntekter;


@JsonProperty("harBrukerGodtattEndringen")
private final boolean harBrukerGodtattEndringen;

@JsonProperty("uttalelseFraBruker")
private final String uttalelseFraBruker;

@JsonProperty("dataBruktTilUtledning")
private DataBruktTilUtledning dataBruktTilUtledning;



@JsonCreator
public InntektBekreftelse(@JsonProperty("oppgaveId") UUID oppgaveId, @JsonProperty(value = "oppgittePeriodeinntekter") Set<OppgittInntektForPeriode> oppgittePeriodeinntekter,
@JsonProperty(value = "harBrukerGodtattEndringen") boolean harBrukerGodtattEndringen,
@JsonProperty(value = "uttalelseFraBruker") String uttalelseFraBruker) {
this.oppgittePeriodeinntekter = (oppgittePeriodeinntekter == null) ? Collections.emptyNavigableSet()
: Collections.unmodifiableNavigableSet(new TreeSet<>(oppgittePeriodeinntekter));
this.uttalelseFraBruker = uttalelseFraBruker;
this.harBrukerGodtattEndringen = harBrukerGodtattEndringen;
this.oppgaveId = oppgaveId;
}

public static Builder builder() {
return new Builder();
}

public NavigableSet<OppgittInntektForPeriode> getOppgittePeriodeinntekter() {
return oppgittePeriodeinntekter;
}

public Periode getMinMaksPeriode() {
final var first = oppgittePeriodeinntekter.first();
final var last = oppgittePeriodeinntekter.last();
return new Periode(first.getPeriode().getFraOgMed(), last.getPeriode().getTilOgMed());
}

@Override
public UUID getOppgaveId() {
return oppgaveId;
}

@Override
public Type getType() {
return Type.UNG_AVVIK_REGISTERINNTEKT;
}

@Override
public DataBruktTilUtledning getDataBruktTilUtledning() {
return dataBruktTilUtledning;
}

@Override
public Bekreftelse medDataBruktTilUtledning(DataBruktTilUtledning dataBruktTilUtledning) {
this.dataBruktTilUtledning = dataBruktTilUtledning;
return this;
}

@Override
public String getUttalelseFraBruker() {
return uttalelseFraBruker;
}

@Override
public boolean harBrukerGodtattEndringen() {
return harBrukerGodtattEndringen;
}

public static final class Builder {
private Set<OppgittInntektForPeriode> oppgittePeriodeinntekter = new LinkedHashSet<>();
private String uttalelseFraBruker;
private boolean harBrukerGodtattEndringen;
private UUID oppgaveId;

private Builder() {
}

public Builder medOppgittePeriodeinntekter(Set<OppgittInntektForPeriode> inntekter) {
if (inntekter != null) {
oppgittePeriodeinntekter.addAll(inntekter);
}
return this;
}

public Builder medUttalelseFraBruker(String uttalelseFraBruker) {
this.uttalelseFraBruker = uttalelseFraBruker;
return this;
}

public Builder medHarBrukerGodtattEndringen(boolean harBrukerGodtattEndringen) {
this.harBrukerGodtattEndringen = harBrukerGodtattEndringen;
return this;
}

public Builder medOppgaveId(UUID oppgaveId) {
this.oppgaveId = oppgaveId;
return this;
}



public InntektBekreftelse build() {
if (oppgittePeriodeinntekter.isEmpty()) {
throw new IllegalStateException("Må oppgi minst en periodeinntekt");
}
return new InntektBekreftelse(oppgaveId, oppgittePeriodeinntekter, harBrukerGodtattEndringen, uttalelseFraBruker);
}
}

@AssertTrue(message = "Perioder for inntekt kan ikke overlappe")
public boolean isHarIngenOverlappendePerioder() {
return harIngenOverlapp(oppgittePeriodeinntekter);
}

private boolean harIngenOverlapp(@Valid @NotNull NavigableSet<@NotNull OppgittInntektForPeriode> set) {
final var iterator = set.iterator();
// Initialiserer til første mulige periode
var prev = new Periode(LocalDate.MIN, LocalDate.MIN);
// Siden settet er av typen NavigableSet (sortert) trenger vi kun å sjekke forrige element i lista
while (iterator.hasNext()) {
final var next = iterator.next();
if (!prev.getTilOgMed().isBefore(next.getPeriode().getFraOgMed())) {
return false;
}
prev = next.getPeriode();
}
return true;
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package no.nav.k9.oppgave.bekreftelse.ung.inntekt;

import com.fasterxml.jackson.annotation.*;
import jakarta.validation.Valid;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.NotNull;
import no.nav.k9.søknad.felles.type.Periode;
import no.nav.k9.søknad.felles.validering.periode.GyldigPeriode;

import java.math.BigDecimal;
import java.util.Objects;

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)
public class OppgittInntektForPeriode implements Comparable<OppgittInntektForPeriode> {

private static final String MIN = "0.00";
private static final String MAX = "10000000.00";

@JsonProperty(value = "periode", required = true)
@Valid
@NotNull
@GyldigPeriode(krevFomDato = true, krevTomDato = true)
private Periode periode;

@JsonProperty(value = "arbeidstakerOgFrilansInntekt", required = false)
@Valid
@DecimalMin(MIN)
@DecimalMax(MAX)
@JsonFormat(shape = JsonFormat.Shape.STRING)
private BigDecimal arbeidstakerOgFrilansInntekt;

@JsonProperty(value = "ytelse", required = false)
@Valid
@DecimalMin(MIN)
@DecimalMax(MAX)
@JsonFormat(shape = JsonFormat.Shape.STRING)
private BigDecimal ytelse;


@JsonCreator
public OppgittInntektForPeriode(@JsonProperty(value = "periode") Periode periode, @JsonProperty(value = "arbeidstakerOgFrilansInntekt") BigDecimal arbeidstakerOgFrilansInntekt,
@JsonProperty(value = "ytelse") BigDecimal ytelse) {
this.arbeidstakerOgFrilansInntekt = arbeidstakerOgFrilansInntekt;
this.ytelse = ytelse;
this.periode = periode;
}

public static Builder builder(Periode periode) {
return new Builder(periode);
}

public Periode getPeriode() {
return periode;
}

public BigDecimal getArbeidstakerOgFrilansInntekt() {
return arbeidstakerOgFrilansInntekt;
}

public BigDecimal getYtelse() {
return ytelse;
}

@Override
public int compareTo(OppgittInntektForPeriode o) {
return this.periode.compareTo(o.periode);
}

@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
OppgittInntektForPeriode that = (OppgittInntektForPeriode) o;
return Objects.equals(periode, that.periode) &&
Objects.equals(arbeidstakerOgFrilansInntekt, that.arbeidstakerOgFrilansInntekt) &&
Objects.equals(ytelse, that.ytelse);
}

@Override
public int hashCode() {
return Objects.hash(periode, arbeidstakerOgFrilansInntekt, ytelse);
}

public static final class Builder {
private BigDecimal arbeidstakerOgFrilansInntekt;
private BigDecimal ytelse;
private Periode periode;

private Builder(Periode periode) {
this.periode = periode;
}

public Builder medArbeidstakerOgFrilansinntekt(BigDecimal inntekt) {
this.arbeidstakerOgFrilansInntekt = inntekt;
return this;
}

public Builder medYtelse(BigDecimal inntekt) {
this.ytelse = inntekt;
return this;
}

public OppgittInntektForPeriode build() {
return new OppgittInntektForPeriode(periode, arbeidstakerOgFrilansInntekt, ytelse);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,4 @@ public interface DatoEndring extends Bekreftelse {

LocalDate getNyDato();

boolean harBrukerGodtattEndringen();

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,22 @@
import no.nav.k9.søknad.ytelse.DataBruktTilUtledning;

import java.time.LocalDate;
import java.util.UUID;

public class EndretFomDatoBekreftelse implements DatoEndring {

@JsonProperty("oppgaveId")
private UUID oppgaveId;

@JsonProperty("nyFomDato")
private LocalDate nyFomDato;

@JsonProperty("harBrukerGodtattEndringen")
private boolean harBrukerGodtattEndringen;

@JsonProperty("uttalelseFraBruker")
private String uttalelseFraBruker;

@JsonProperty("dataBruktTilUtledning")
private DataBruktTilUtledning dataBruktTilUtledning;

Expand Down Expand Up @@ -51,8 +58,28 @@ public LocalDate getNyDato() {
return nyFomDato;
}

@Override
public String getUttalelseFraBruker() {
return uttalelseFraBruker;
}

public Bekreftelse medUttalelseFraBruker(String uttalelseFraBruker) {
this.uttalelseFraBruker = uttalelseFraBruker;
return this;
}

public Bekreftelse medHarBrukerGodtattEndringen(boolean harBrukerGodtattEndringen) {
this.harBrukerGodtattEndringen = harBrukerGodtattEndringen;
return this;
}

@Override
public boolean harBrukerGodtattEndringen() {
return harBrukerGodtattEndringen;
}

@Override
public UUID getOppgaveId() {
return oppgaveId;
}
}
Loading
Loading