Skip to content
Open
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
Expand Up @@ -140,6 +140,7 @@ data class InnloggetArbeidsgiver(
fun finnRefusjon(id: String): Refusjon {
val refusjon: Refusjon = refusjonRepository.findByIdOrNull(id) ?: throw RessursFinnesIkkeException()
sjekkHarTilgangTilRefusjonerForBedrift(refusjon.bedriftNr, refusjon.deltakerFnr)
refusjonService.oppdaterRefusjon(refusjon, this) // Trigge beregning på automatisk innsendte refusjoner (mentor/VTAO)
return refusjon
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,7 @@ class RefusjonService(
fun godkjennForArbeidsgiver(refusjon: Refusjon, utførtAv: InnloggetBruker) {
val alleMinusBeløp = minusbelopRepository.findAllByAvtaleNr(refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.avtaleNr)
val sumMinusbelop = alleMinusBeløp
.filter { !it.gjortOpp }
.map { minusbelop -> minusbelop.beløp }
.filterNotNull()
.filter { !it.gjortOpp }.mapNotNull { minusbelop -> minusbelop.beløp }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice

.reduceOrNull { sum, beløp -> sum + beløp }
// Om det er et gammelt minusbeløp, men alle minusbeløp er gjort opp må refusjonen lastes på ny for å reberegnes
if (sumMinusbelop != null && sumMinusbelop != 0 && refusjon.refusjonsgrunnlag.forrigeRefusjonMinusBeløp != sumMinusbelop) {
Expand Down Expand Up @@ -309,29 +307,17 @@ class RefusjonService(
oppdaterSistEndret(refusjon)
gjørBeregning(refusjon, utførtAv)
}
if (refusjon.tiltakstype().utbetalesAutomatisk()) {
gjørBeregning(refusjon, utførtAv)
}
}

fun oppdaterSistEndret(refusjon: Refusjon) {
refusjon.sistEndret = Instant.now()
}

fun gjørBeregning(refusjon: Refusjon, utførtAv: InnloggetBruker) {
var beregning: Beregning? = null
if (refusjon.refusjonsgrunnlag.erAltOppgitt()) {
beregning = beregnRefusjonsbeløp(
inntekter = refusjon.refusjonsgrunnlag.inntektsgrunnlag?.inntekter?.toList() ?: emptyList(),
tilskuddsgrunnlag = refusjon.refusjonsgrunnlag.tilskuddsgrunnlag,
tidligereUtbetalt = refusjon.refusjonsgrunnlag.tidligereUtbetalt,
korrigertBruttoLønn = refusjon.refusjonsgrunnlag.endretBruttoLønn,
fratrekkRefunderbarSum = refusjon.refusjonsgrunnlag.refunderbarBeløp,
forrigeRefusjonMinusBeløp = refusjon.refusjonsgrunnlag.forrigeRefusjonMinusBeløp,
tilskuddFom = refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.tilskuddFom,
sumUtbetaltVarig = refusjon.refusjonsgrunnlag.sumUtbetaltVarig,
harFerietrekkForSammeMåned = refusjon.refusjonsgrunnlag.harFerietrekkForSammeMåned
)
} else if (refusjon.tiltakstype().harFastUtbetalingssum()) {
beregning = fastBeløpBeregning(refusjon.refusjonsgrunnlag.tilskuddsgrunnlag, refusjon.refusjonsgrunnlag.tidligereUtbetalt)
}
val beregning: Beregning? = beregnRefusjon(refusjon)
if (beregning != null) {
refusjon.refusjonsgrunnlag.beregning = beregning
log.info("Oppdatert beregning på refusjon ${refusjon.id} til ${beregning.id}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,34 @@ fun fastBeløpBeregning(tilskuddsgrunnlag: Tilskuddsgrunnlag, tidligereUtbetalt:
)
}

fun mentorBeregning(tilskuddsgrunnlag: Tilskuddsgrunnlag): Beregning? {
if (tilskuddsgrunnlag.mentorTimelonn == null || tilskuddsgrunnlag.mentorAntallTimer == null) {
return null
}
val lonn = tilskuddsgrunnlag.mentorAntallTimer * tilskuddsgrunnlag.mentorTimelonn
val feriepenger = lonn * tilskuddsgrunnlag.feriepengerSats
val tjenestepensjon = (lonn + feriepenger) * tilskuddsgrunnlag.otpSats
val arbeidsgiveravgift = (lonn + tjenestepensjon + feriepenger) * tilskuddsgrunnlag.arbeidsgiveravgiftSats
val beregnetBeløp = (lonn + tjenestepensjon + feriepenger + arbeidsgiveravgift).roundToInt()

return Beregning(
lønn = lonn.roundToInt(),
lønnFratrukketFerie = 0,
feriepenger = feriepenger.roundToInt(),
tjenestepensjon = tjenestepensjon.roundToInt(),
arbeidsgiveravgift = arbeidsgiveravgift.roundToInt(),
sumUtgifter = beregnetBeløp,
Copy link
Contributor

@Majjki Majjki Nov 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hva er forskjellen på tilskuddsbeløp og beregnetBeløp? i

beregnetBeløp = tilskuddsgrunnlag.tilskuddsbeløp,
sumUtgifter = beregnetBeløp,

beregnetBeløp = tilskuddsgrunnlag.tilskuddsbeløp,
refusjonsbeløp = tilskuddsgrunnlag.tilskuddsbeløp,
overTilskuddsbeløp = false,
tidligereUtbetalt = 0,
fratrekkLønnFerie = 0,
tidligereRefundertBeløp = 0,
overFemGrunnbeløp = false,
sumUtgifterFratrukketRefundertBeløp = 0
)
}

fun beregnRefusjonsbeløp(
inntekter: List<Inntektslinje>,
tilskuddsgrunnlag: Tilskuddsgrunnlag,
Expand Down Expand Up @@ -123,6 +151,32 @@ fun beregnRefusjonsbeløp(
)
}

fun beregnRefusjon(refusjon: Refusjon) =
if (refusjon.tiltakstype().harFastUtbetalingssum()) {
if (refusjon.tiltakstype() == Tiltakstype.VTAO) {
fastBeløpBeregning(refusjon.refusjonsgrunnlag.tilskuddsgrunnlag, refusjon.refusjonsgrunnlag.tidligereUtbetalt)
} else if (refusjon.tiltakstype() == Tiltakstype.MENTOR) {
mentorBeregning(refusjon.refusjonsgrunnlag.tilskuddsgrunnlag)
} else {
throw Exception("Ukjent tiltakstype med fast sum: ${refusjon.tiltakstype()}")
}
} else if (refusjon.refusjonsgrunnlag.erAltOppgitt()) {
beregnRefusjonsbeløp(
inntekter = refusjon.refusjonsgrunnlag.inntektsgrunnlag?.inntekter?.toList() ?: emptyList(),
tilskuddsgrunnlag = refusjon.refusjonsgrunnlag.tilskuddsgrunnlag,
tidligereUtbetalt = refusjon.refusjonsgrunnlag.tidligereUtbetalt,
korrigertBruttoLønn = refusjon.refusjonsgrunnlag.endretBruttoLønn,
fratrekkRefunderbarSum = refusjon.refusjonsgrunnlag.refunderbarBeløp,
forrigeRefusjonMinusBeløp = refusjon.refusjonsgrunnlag.forrigeRefusjonMinusBeløp,
tilskuddFom = refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.tilskuddFom,
sumUtbetaltVarig = refusjon.refusjonsgrunnlag.sumUtbetaltVarig,
harFerietrekkForSammeMåned = refusjon.refusjonsgrunnlag.harFerietrekkForSammeMåned
)
} else {
null
}


fun leggSammenTrekkGrunnlag(inntekter: List<Inntektslinje>, tilskuddFom: LocalDate, ekstraFerietrekk: Int? = null): Double {
var ferieTrekkGrunnlag = inntekter.filter { it.skalTrekkesIfraInntektsgrunnlag(tilskuddFom) }
.sumOf { it.beløp }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package no.nav.arbeidsgiver.tiltakrefusjon.refusjon

enum class Tiltakstype {
MIDLERTIDIG_LONNSTILSKUDD, VARIG_LONNSTILSKUDD, SOMMERJOBB, VTAO;
MIDLERTIDIG_LONNSTILSKUDD, VARIG_LONNSTILSKUDD, SOMMERJOBB, VTAO, MENTOR;

fun utbetalesAutomatisk() = this == VTAO
fun harFastUtbetalingssum() = this == VTAO
fun utbetalesAutomatisk() = this == VTAO || this == MENTOR
fun harFastUtbetalingssum() = this == VTAO || this == MENTOR
}
133 changes: 118 additions & 15 deletions src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/TestData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.BrukerRolle
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Inntektsgrunnlag
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Inntektslinje
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Refusjon
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonService
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonStatus
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Tilskuddsgrunnlag
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Tiltakstype
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.beregnRefusjon
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.beregnRefusjonsbeløp
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.fastBeløpBeregning
import no.nav.arbeidsgiver.tiltakrefusjon.utils.Now
Expand Down Expand Up @@ -465,6 +467,9 @@ fun refusjoner(): List<Refusjon> {
`Vidar Fortidlig`(),
`Vidar SendKrav`(),
`Vidar Utbetalt`(),
`Ole-Johnny Fortidlig`(),
`Ole-Johnny SendKrav`(),
`Ole-Johnny Utbetalt`(),
`Camilla Collett`(),
`Snorre Sturlason`(),
`Sigrid Undset`(),
Expand Down Expand Up @@ -899,6 +904,118 @@ fun `Vidar Utbetalt`(): Refusjon {
return refusjon
}

fun `Ole-Johnny Fortidlig`(): Refusjon {
val deltakerFnr = "23119409195"
val bedriftNr = "999999999"
val refusjon = Refusjon(
tilskuddsgrunnlag = etTilskuddsgrunnlag().copy(
avtaleId = UUID.randomUUID().toString(),
avtaleNr = 4414,
tilskuddsperiodeId = UUID.randomUUID().toString(),
tiltakstype = Tiltakstype.MENTOR,
deltakerFornavn = "Ole-Johnny",
deltakerEtternavn = "Person",
deltakerFnr = deltakerFnr,
bedriftNr = bedriftNr,
tilskuddsbeløp = 3369,
mentorTimelonn = 250,
mentorAntallTimer = 10.5,
arbeidsgiveravgiftSats = 0.102,
otpSats = 0.02,
feriepengerSats = 0.142,
veilederNavIdent = "X123456",
avtaleFom = Now.localDate().minusMonths(4).withDayOfMonth(1),
avtaleTom = Now.localDate().plusYears(2).withDayOfMonth(1),
),
bedriftNr = bedriftNr, deltakerFnr = deltakerFnr,
)

refusjon.status = RefusjonStatus.FOR_TIDLIG

return refusjon
}

fun `Ole-Johnny SendKrav`(): Refusjon {
val deltakerFnr = "23119409195"
val bedriftNr = "999999999"
val refusjon = Refusjon(
tilskuddsgrunnlag = etTilskuddsgrunnlag().copy(
avtaleId = UUID.randomUUID().toString(),
avtaleNr = 4414,
tilskuddsperiodeId = UUID.randomUUID().toString(),
tiltakstype = Tiltakstype.MENTOR,
deltakerFornavn = "Ole-Johnny",
deltakerEtternavn = "Person",
deltakerFnr = deltakerFnr,
bedriftNr = bedriftNr,
tilskuddsbeløp = 3369,
mentorTimelonn = 250,
mentorAntallTimer = 10.5,
arbeidsgiveravgiftSats = 0.102,
otpSats = 0.02,
feriepengerSats = 0.142,
veilederNavIdent = "X123456",
avtaleFom = Now.localDate().minusMonths(3).withDayOfMonth(1),
avtaleTom = Now.localDate().plusYears(2).withDayOfMonth(1),
), bedriftNr = bedriftNr, deltakerFnr = deltakerFnr
)

refusjon.let {
it.medBeregning()
it.medBedriftKontonummer()
it.status = RefusjonStatus.SENDT_KRAV
it.godkjentAvArbeidsgiver = Now.localDate()
.with(firstDayOfMonth())
.atStartOfDay(ZoneId.of("Europe/Oslo"))
.toInstant()
}

return refusjon
}

fun `Ole-Johnny Utbetalt`(): Refusjon {
val deltakerFnr = "23119409195"
val bedriftNr = "999999999"
val refusjon = Refusjon(
tilskuddsgrunnlag = etTilskuddsgrunnlag().copy(
avtaleId = UUID.randomUUID().toString(),
avtaleNr = 4414,
tilskuddsperiodeId = UUID.randomUUID().toString(),
tiltakstype = Tiltakstype.MENTOR,
deltakerFornavn = "Ole-Johnny",
deltakerEtternavn = "Person",
deltakerFnr = deltakerFnr,
bedriftNr = bedriftNr,
tilskuddsbeløp = 3369,
mentorTimelonn = 250,
mentorAntallTimer = 10.5,
arbeidsgiveravgiftSats = 0.102,
otpSats = 0.02,
feriepengerSats = 0.142,
veilederNavIdent = "X123456",
avtaleFom = Now.localDate().minusMonths(3).withDayOfMonth(1),
avtaleTom = Now.localDate().plusYears(2).withDayOfMonth(1),
), bedriftNr = bedriftNr, deltakerFnr = deltakerFnr
)

refusjon.let {
it.medBeregning()
it.medBedriftKontonummer()
it.status = RefusjonStatus.UTBETALT
it.godkjentAvArbeidsgiver = Now.localDate()
.with(firstDayOfMonth())
.atStartOfDay(ZoneId.of("Europe/Oslo"))
.toInstant()
it.utbetaltTidspunkt = Now.localDate()
.with(firstDayOfMonth())
.plusDays(2)
.atStartOfDay(ZoneId.of("Europe/Oslo"))
.toInstant()
}

return refusjon
}

fun dodsfallUnderTiltakRefusjon(): Refusjon {
val deltakerFnrMedMasseUtbetalt = "30038738743"
val bedriftNr = "999999999"
Expand Down Expand Up @@ -926,21 +1043,7 @@ fun Refusjon.medInntektsgrunnlag(

fun Refusjon.medBeregning(
): Refusjon {
if (this.tiltakstype().harFastUtbetalingssum()) {
this.refusjonsgrunnlag.beregning = fastBeløpBeregning(this.refusjonsgrunnlag.tilskuddsgrunnlag, 0)
} else {
this.refusjonsgrunnlag.beregning = beregnRefusjonsbeløp(
inntekter = this.refusjonsgrunnlag.inntektsgrunnlag?.inntekter?.toList() ?: emptyList(),
tilskuddsgrunnlag = this.refusjonsgrunnlag.tilskuddsgrunnlag,
tidligereUtbetalt = this.refusjonsgrunnlag.tidligereUtbetalt,
korrigertBruttoLønn = this.refusjonsgrunnlag.endretBruttoLønn,
fratrekkRefunderbarSum = this.refusjonsgrunnlag.refunderbarBeløp,
forrigeRefusjonMinusBeløp = this.refusjonsgrunnlag.forrigeRefusjonMinusBeløp,
tilskuddFom = this.refusjonsgrunnlag.tilskuddsgrunnlag.tilskuddFom,
sumUtbetaltVarig = this.refusjonsgrunnlag.sumUtbetaltVarig,
harFerietrekkForSammeMåned = this.refusjonsgrunnlag.harFerietrekkForSammeMåned
)
}
this.refusjonsgrunnlag.beregning = beregnRefusjon(this)
return this
}

Expand Down
Loading