Skip to content

Commit

Permalink
Looper over alle andeler i fastsette-regel. Ikkje kun dei med utbetal…
Browse files Browse the repository at this point in the history
…ingsgrad > 0. Dette for å kunne utbetale refusjon til tilkomne andeler (#431)
  • Loading branch information
espenjv authored Sep 12, 2023
1 parent 36e6cf9 commit 64b21ed
Show file tree
Hide file tree
Showing 29 changed files with 166 additions and 177 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ class FastsettAvkortetLikBruttoBG extends LeafSpecification<BeregningsgrunnlagPe
@Override
public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {

for (BeregningsgrunnlagPrStatus beregningsgrunnlagPrStatus : grunnlag.getBeregningsgrunnlagPrStatusSomSkalBrukes()) {
for (BeregningsgrunnlagPrStatus beregningsgrunnlagPrStatus : grunnlag.getBeregningsgrunnlagPrStatus()) {
if (AktivitetStatus.erArbeidstaker(beregningsgrunnlagPrStatus.getAktivitetStatus())) {
for (BeregningsgrunnlagPrArbeidsforhold af : beregningsgrunnlagPrStatus.getArbeidsforholdSomSkalBrukes()) {
for (BeregningsgrunnlagPrArbeidsforhold af : beregningsgrunnlagPrStatus.getArbeidsforhold()) {
BigDecimal bruttoInkludertNaturalytelsePrÅr = af.getAktivitetsgradertBruttoInkludertNaturalytelsePrÅr()
.orElseThrow(() -> new IllegalStateException("Brutto er ikke satt for arbeidsforhold " + af.toString()));
BeregningsgrunnlagPrArbeidsforhold.builder(af)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
}

// Kva skjer her?
for (BeregningsgrunnlagPrArbeidsforhold arbeidsforhold : bgps.getArbeidsforholdSomSkalBrukes()) {
for (BeregningsgrunnlagPrArbeidsforhold arbeidsforhold : bgps.getArbeidsforhold()) {
BigDecimal arbeidsgiversAndel = arbeidsforhold.getMaksimalRefusjonPrÅr();

BeregningsgrunnlagPrArbeidsforhold.builder(arbeidsforhold)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,85 +18,83 @@

@RuleDocumentation(AvkortBGAndelerSomIkkeGjelderArbeidsforholdAndelsmessig.ID)
public class AvkortBGAndelerSomIkkeGjelderArbeidsforholdAndelsmessig extends LeafSpecification<BeregningsgrunnlagPeriode> {
static final String ID = "FP_BR 29.8.4";
static final String BESKRIVELSE = "Avkort alle beregningsgrunnlagsandeler som ikke gjelder arbeidsforhold andelsmessig.";
static final String ID = "FP_BR 29.8.4";
static final String BESKRIVELSE = "Avkort alle beregningsgrunnlagsandeler som ikke gjelder arbeidsforhold andelsmessig.";

AvkortBGAndelerSomIkkeGjelderArbeidsforholdAndelsmessig() {
super(ID, BESKRIVELSE);
}
AvkortBGAndelerSomIkkeGjelderArbeidsforholdAndelsmessig() {
super(ID, BESKRIVELSE);
}

@Override
public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
Map<String, Object> resultater = new HashMap<>();
BeregningsgrunnlagPrStatus atfl = grunnlag.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL);
BigDecimal sumBeregningsgrunnlagArbeidsforhold = atfl == null ? BigDecimal.ZERO : atfl.getArbeidsforholdSomSkalBrukesIkkeFrilans()
.stream()
.map(BeregningsgrunnlagPrArbeidsforhold::getAktivitetsgradertBruttoInkludertNaturalytelsePrÅr)
.filter(Optional::isPresent)
.map(Optional::get)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal grenseverdi = grunnlag.getGrenseverdi();
resultater.put("grenseverdi", grenseverdi);
BigDecimal bGUtenArbeidsforholdTilFordeling = grenseverdi.subtract(sumBeregningsgrunnlagArbeidsforhold);
@Override
public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
Map<String, Object> resultater = new HashMap<>();
BeregningsgrunnlagPrStatus atfl = grunnlag.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL);
BigDecimal sumBeregningsgrunnlagArbeidsforhold = atfl == null ? BigDecimal.ZERO : atfl.getArbeidsforholdIkkeFrilans()
.stream()
.map(BeregningsgrunnlagPrArbeidsforhold::getAvkortetPrÅr)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal grenseverdi = grunnlag.getGrenseverdi();
resultater.put("grenseverdi", grenseverdi);
BigDecimal bGUtenArbeidsforholdTilFordeling = grenseverdi.subtract(sumBeregningsgrunnlagArbeidsforhold);

// inntekt knyttet til frilans må fordeles først
if (atfl != null) {
Optional<BeregningsgrunnlagPrArbeidsforhold> frilansArbeidsforholdOpt = atfl.getFrilansArbeidsforholdSomSkalBrukes();
if (frilansArbeidsforholdOpt.isPresent()) {
BeregningsgrunnlagPrArbeidsforhold af = frilansArbeidsforholdOpt.get();
BigDecimal bruttoBeregningsgrunnlagForAndelen = af.getAktivitetsgradertBruttoInkludertNaturalytelsePrÅr()
.orElseThrow(() -> new IllegalStateException("Brutto er ikke satt for arbeidsforhold " + af.toString()));
BigDecimal avkortetBrukersAndel;
if (bruttoBeregningsgrunnlagForAndelen.compareTo(bGUtenArbeidsforholdTilFordeling) >= 0) {
avkortetBrukersAndel = bGUtenArbeidsforholdTilFordeling;
lagResultaterFrilanser(af, avkortetBrukersAndel, resultater);
grunnlag.getBeregningsgrunnlagPrStatusSomSkalBrukes().stream()
.filter(bgps -> !bgps.erArbeidstakerEllerFrilanser())
.forEach(bgp -> lagResultaterUtenArbeidsforhold(bgp, BigDecimal.ZERO, resultater));
return beregnet(resultater);
} else {
avkortetBrukersAndel = bruttoBeregningsgrunnlagForAndelen;
bGUtenArbeidsforholdTilFordeling = bGUtenArbeidsforholdTilFordeling.subtract(avkortetBrukersAndel);
lagResultaterFrilanser(af, avkortetBrukersAndel, resultater);
}
}
}
// inntekt knyttet til frilans må fordeles først
if (atfl != null) {
Optional<BeregningsgrunnlagPrArbeidsforhold> frilansArbeidsforholdOpt = atfl.getFrilansArbeidsforhold();
if (frilansArbeidsforholdOpt.isPresent()) {
BeregningsgrunnlagPrArbeidsforhold af = frilansArbeidsforholdOpt.get();
BigDecimal bruttoBeregningsgrunnlagForAndelen = af.getAktivitetsgradertBruttoInkludertNaturalytelsePrÅr()
.orElseThrow(() -> new IllegalStateException("Brutto er ikke satt for arbeidsforhold " + af.toString()));
BigDecimal avkortetBrukersAndel;
if (bruttoBeregningsgrunnlagForAndelen.compareTo(bGUtenArbeidsforholdTilFordeling) >= 0) {
avkortetBrukersAndel = bGUtenArbeidsforholdTilFordeling;
lagResultaterFrilanser(af, avkortetBrukersAndel, resultater);
grunnlag.getBeregningsgrunnlagPrStatus().stream()
.filter(bgps -> !bgps.erArbeidstakerEllerFrilanser())
.forEach(bgp -> lagResultaterUtenArbeidsforhold(bgp, BigDecimal.ZERO, resultater));
return beregnet(resultater);
} else {
avkortetBrukersAndel = bruttoBeregningsgrunnlagForAndelen;
bGUtenArbeidsforholdTilFordeling = bGUtenArbeidsforholdTilFordeling.subtract(avkortetBrukersAndel);
lagResultaterFrilanser(af, avkortetBrukersAndel, resultater);
}
}
}

// sortere etter avkorting prioritet for beregningsgrunnlag uten arbeidsforhold
List<BeregningsgrunnlagPrStatus> bgpsSorted = finnAlleBGUtenArbeidsForholdSorterte(grunnlag);
Iterator<BeregningsgrunnlagPrStatus> bgpsIter = bgpsSorted.iterator();
while (bgpsIter.hasNext()) {
BeregningsgrunnlagPrStatus bgps = bgpsIter.next();
BigDecimal bruttoBeregningsgrunnlagForAndelen = bgps.getAktivitetsgradertBruttoInkludertNaturalytelsePrÅr();
BigDecimal avkortetBrukersAndel;
if (bruttoBeregningsgrunnlagForAndelen.compareTo(bGUtenArbeidsforholdTilFordeling) >= 0) {
avkortetBrukersAndel = bGUtenArbeidsforholdTilFordeling;
lagResultaterUtenArbeidsforhold(bgps, avkortetBrukersAndel, resultater);
bgpsIter.forEachRemaining(bgp -> lagResultaterUtenArbeidsforhold(bgp, BigDecimal.ZERO, resultater));
return beregnet(resultater);
} else {
avkortetBrukersAndel = bruttoBeregningsgrunnlagForAndelen;
bGUtenArbeidsforholdTilFordeling = bGUtenArbeidsforholdTilFordeling.subtract(avkortetBrukersAndel);
lagResultaterUtenArbeidsforhold(bgps, avkortetBrukersAndel, resultater);
}
}
return beregnet(resultater);
}
// sortere etter avkorting prioritet for beregningsgrunnlag uten arbeidsforhold
List<BeregningsgrunnlagPrStatus> bgpsSorted = finnAlleBGUtenArbeidsForholdSorterte(grunnlag);
Iterator<BeregningsgrunnlagPrStatus> bgpsIter = bgpsSorted.iterator();
while (bgpsIter.hasNext()) {
BeregningsgrunnlagPrStatus bgps = bgpsIter.next();
BigDecimal bruttoBeregningsgrunnlagForAndelen = bgps.getAktivitetsgradertBruttoInkludertNaturalytelsePrÅr();
BigDecimal avkortetBrukersAndel;
if (bruttoBeregningsgrunnlagForAndelen.compareTo(bGUtenArbeidsforholdTilFordeling) >= 0) {
avkortetBrukersAndel = bGUtenArbeidsforholdTilFordeling;
lagResultaterUtenArbeidsforhold(bgps, avkortetBrukersAndel, resultater);
bgpsIter.forEachRemaining(bgp -> lagResultaterUtenArbeidsforhold(bgp, BigDecimal.ZERO, resultater));
return beregnet(resultater);
} else {
avkortetBrukersAndel = bruttoBeregningsgrunnlagForAndelen;
bGUtenArbeidsforholdTilFordeling = bGUtenArbeidsforholdTilFordeling.subtract(avkortetBrukersAndel);
lagResultaterUtenArbeidsforhold(bgps, avkortetBrukersAndel, resultater);
}
}
return beregnet(resultater);
}

private List<BeregningsgrunnlagPrStatus> finnAlleBGUtenArbeidsForholdSorterte(BeregningsgrunnlagPeriode grunnlag) {
return grunnlag.getBeregningsgrunnlagPrStatusSomSkalBrukes().stream()
.filter(bgps -> !bgps.erArbeidstakerEllerFrilanser())
.sorted(Comparator.comparingInt(bgps -> bgps.getAktivitetStatus().getAvkortingPrioritet()))
.toList();
}
private List<BeregningsgrunnlagPrStatus> finnAlleBGUtenArbeidsForholdSorterte(BeregningsgrunnlagPeriode grunnlag) {
return grunnlag.getBeregningsgrunnlagPrStatus().stream()
.filter(bgps -> !bgps.erArbeidstakerEllerFrilanser())
.sorted(Comparator.comparingInt(bgps -> bgps.getAktivitetStatus().getAvkortingPrioritet()))
.toList();
}

private void lagResultaterFrilanser(BeregningsgrunnlagPrArbeidsforhold af, BigDecimal avkortetBrukersAndel, Map<String, Object> resultater) {
BeregningsgrunnlagPrArbeidsforhold.builder(af).medAvkortetRefusjonPrÅr(BigDecimal.ZERO).medAvkortetBrukersAndelPrÅr(avkortetBrukersAndel).medAvkortetPrÅr(avkortetBrukersAndel).build();
resultater.put("avkortetPrÅr.arbeidsforhold." + af.getArbeidsgiverId(), af.getAvkortetBrukersAndelPrÅr());
}
private void lagResultaterFrilanser(BeregningsgrunnlagPrArbeidsforhold af, BigDecimal avkortetBrukersAndel, Map<String, Object> resultater) {
BeregningsgrunnlagPrArbeidsforhold.builder(af).medAvkortetRefusjonPrÅr(BigDecimal.ZERO).medAvkortetBrukersAndelPrÅr(avkortetBrukersAndel).medAvkortetPrÅr(avkortetBrukersAndel).build();
resultater.put("avkortetPrÅr.arbeidsforhold." + af.getArbeidsgiverId(), af.getAvkortetBrukersAndelPrÅr());
}

private void lagResultaterUtenArbeidsforhold(BeregningsgrunnlagPrStatus bgps, BigDecimal avkortetBrukersAndel, Map<String, Object> resultater) {
BeregningsgrunnlagPrStatus.builder(bgps).medAvkortetPrÅr(avkortetBrukersAndel).build();
resultater.put("avkortetPrÅr.status." + bgps.getAktivitetStatus().name(), bgps.getAvkortetPrÅr());
}
private void lagResultaterUtenArbeidsforhold(BeregningsgrunnlagPrStatus bgps, BigDecimal avkortetBrukersAndel, Map<String, Object> resultater) {
BeregningsgrunnlagPrStatus.builder(bgps).medAvkortetPrÅr(avkortetBrukersAndel).build();
resultater.put("avkortetPrÅr.status." + bgps.getAktivitetStatus().name(), bgps.getAvkortetPrÅr());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class AvkortBGAndelerSomIkkeGjelderArbeidsforholdTil0 extends LeafSpecification<
public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {

Map<String, Object> resultater = new HashMap<>();
grunnlag.getBeregningsgrunnlagPrStatusSomSkalBrukes().stream()
grunnlag.getBeregningsgrunnlagPrStatus().stream()
.filter(bgps -> !bgps.erArbeidstakerEllerFrilanser())
.forEach(bgps -> {
BeregningsgrunnlagPrStatus.builder(bgps).medAvkortetPrÅr(BigDecimal.ZERO).build();
Expand All @@ -34,7 +34,7 @@ public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {

BeregningsgrunnlagPrStatus atfl = grunnlag.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL);
if (atfl != null) {
atfl.getFrilansArbeidsforholdSomSkalBrukes().ifPresent(af -> {
atfl.getFrilansArbeidsforhold().ifPresent(af -> {
BeregningsgrunnlagPrArbeidsforhold.builder(af).medAvkortetPrÅr(BigDecimal.ZERO).medAvkortetRefusjonPrÅr(BigDecimal.ZERO).medAvkortetBrukersAndelPrÅr(BigDecimal.ZERO).build();
resultater.put("avkortetPrÅr.status." + atfl.getAktivitetStatus().name() + "." + af.getArbeidsgiverId(), af.getAvkortetPrÅr());
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
if (atfl != null) {
Map<String, Object> resultater = new HashMap<>();
resultat.setEvaluationProperties(resultater);
atfl.getArbeidsforholdSomSkalBrukes().forEach(af ->
atfl.getArbeidsforhold().forEach(af ->
resultater.put("avkortetRefusjonPrÅr" + "." + af.getArbeidsgiverId(), af.getMaksimalRefusjonPrÅr())
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
if (atfl != null) {
Map<String, Object> resultater = new HashMap<>();
resultat.setEvaluationProperties(resultater);
atfl.getArbeidsforholdSomSkalBrukesIkkeFrilans().forEach(arbeidsforhold -> {
atfl.getArbeidsforholdIkkeFrilans().forEach(arbeidsforhold -> {
BigDecimal avkortetRefusjonPrÅr = arbeidsforhold.getMaksimalRefusjonPrÅr() == null ? BigDecimal.ZERO : arbeidsforhold.getMaksimalRefusjonPrÅr();
BigDecimal avkortetBrukersAndel = arbeidsforhold.getAktivitetsgradertBruttoInkludertNaturalytelsePrÅr().orElse(BigDecimal.ZERO).subtract(avkortetRefusjonPrÅr);
BeregningsgrunnlagPrArbeidsforhold.builder(arbeidsforhold)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
SingleEvaluation resultat = ja();
resultat.setEvaluationProperties(resultater);

List<BeregningsgrunnlagPrArbeidsforhold> arbeidsforholdene = grunnlag.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforholdSomSkalBrukes();
List<BeregningsgrunnlagPrArbeidsforhold> arbeidsforholdene = grunnlag.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold();
arbeidsforholdene.stream()
.filter(af -> af.getMaksimalRefusjonPrÅr() != null)
.filter(af -> af.getAvkortetRefusjonPrÅr() != null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,18 @@ public Specification<BeregningsgrunnlagPeriode> getSpecification() {
//FP_BR_29.8.4 Avkort alle beregningsgrunnlagsander som ikke gjelder arbeidsforhold andelsmessig
Specification<BeregningsgrunnlagPeriode> avkortAndelerAndelsmessigOgFastsettBrukersAndel = rs.beregningsRegel(AvkortBGAndelerSomIkkeGjelderArbeidsforholdAndelsmessig.ID,
AvkortBGAndelerSomIkkeGjelderArbeidsforholdAndelsmessig.BESKRIVELSE,
new AvkortBGAndelerSomIkkeGjelderArbeidsforholdAndelsmessig(), new FastsettBrukersAndelForBGAndelerSomGjelderArbeidsforhold());
new FastsettBrukersAndelForBGAndelerSomGjelderArbeidsforhold(),
new AvkortBGAndelerSomIkkeGjelderArbeidsforholdAndelsmessig());

Specification<BeregningsgrunnlagPeriode> avkortAndelerSomIkkegjelderAFtil0 = new Fastsatt();

if (bgpsa != null) {

//FP_BR_29.8.6-9 Fastsett andel til fordeling - Itereres over like mange ganger som antall arbeidsforhold.
int antallKjøringer = bgpsa.getArbeidsforholdSomSkalBrukes().size();
int antallKjøringer = bgpsa.getArbeidsforhold().size();
if (antallKjøringer > 0) {
List<Specification<BeregningsgrunnlagPeriode>> prArbeidsforhold = new ArrayList<>();
bgpsa.getArbeidsforholdSomSkalBrukes().forEach(af -> prArbeidsforhold.add(opprettRegelFastsettUtbetalingsbeløpTilBruker()));
bgpsa.getArbeidsforhold().forEach(af -> prArbeidsforhold.add(opprettRegelFastsettUtbetalingsbeløpTilBruker()));
Specification<BeregningsgrunnlagPeriode> fastsettUtbetalingsbeløpTilBrukerChain = rs.beregningsRegel(ID, BESKRIVELSE, prArbeidsforhold, new Fastsatt());

//FP_BR_29.8.3 Avkort alle beregningsgrunnlagsandeler som ikke gjelder arbeidsforhold til 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class SjekkOmTotaltBGForArbeidsforholdStørreEnnGrenseverdi extends LeafSpecific
public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
BigDecimal grenseverdi = grunnlag.getGrenseverdi();
BeregningsgrunnlagPrStatus atfl = grunnlag.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL);
BigDecimal totaltBG = atfl == null ? BigDecimal.ZERO : atfl.getArbeidsforholdSomSkalBrukesIkkeFrilans().stream()
BigDecimal totaltBG = atfl == null ? BigDecimal.ZERO : atfl.getArbeidsforholdIkkeFrilans().stream()
.map(af -> af.getAktivitetsgradertBruttoInkludertNaturalytelsePrÅr().orElse(BigDecimal.ZERO))
.reduce(BigDecimal.ZERO, BigDecimal::add);
SingleEvaluation resultat = totaltBG.compareTo(grenseverdi) > 0 ? ja() : nei();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class VurderOmAndelerErFerdigFordeltOgOppdaterFordeltTilBruker extends LeafSpeci
public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {
SingleEvaluation resultat = ja();

List<BeregningsgrunnlagPrArbeidsforhold> arbeidsforholdene = grunnlag.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforholdSomSkalBrukes();
List<BeregningsgrunnlagPrArbeidsforhold> arbeidsforholdene = grunnlag.getBeregningsgrunnlagPrStatus(AktivitetStatus.ATFL).getArbeidsforhold();

// Er det arbeidsforhold som ikke er fastsatt i tidligere runder?
List<BeregningsgrunnlagPrArbeidsforhold> ikkeFastsattAf = arbeidsforholdene.stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public class FastsettIkkeSøktForTil0 extends LeafSpecification<Beregningsgrunnl
public Evaluation evaluate(BeregningsgrunnlagPeriode grunnlag) {

Map<String, Object> resultater = new HashMap<>();
grunnlag.getBeregningsgrunnlagPrStatusSomSkalBrukes().stream()
grunnlag.getBeregningsgrunnlagPrStatus().stream()
.flatMap(bgs -> bgs.getArbeidsforhold().stream())
.filter(af -> !af.getErSøktYtelseFor())
.forEach(af -> {
Expand Down
Loading

0 comments on commit 64b21ed

Please sign in to comment.