Skip to content

Commit

Permalink
VTAO-avtaler har også en beregning
Browse files Browse the repository at this point in the history
  • Loading branch information
Oddsor committed Dec 18, 2024
1 parent 6a119db commit 53e340c
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ class AdminController(
if (refusjon.refusjonsgrunnlag.refusjonsgrunnlagetErNullSomIZero()) {
refusjonKafkaProducer!!.annullerTilskuddsperiodeEtterNullEllerMinusBeløp(refusjon, MidlerFrigjortÅrsak.REFUSJON_GODKJENT_NULL_BELØP)
return ResponseEntity.ok("Sendt godkjent nullbeløp-melding for ${refusjon.id}")
} else if (!refusjon.refusjonsgrunnlag.refusjonsgrunnlagetErPositivt()) {
} else if (refusjon.refusjonsgrunnlag.refusjonsgrunnlagetErNegativt()) {
refusjonKafkaProducer!!.annullerTilskuddsperiodeEtterNullEllerMinusBeløp(refusjon, MidlerFrigjortÅrsak.REFUSJON_MINUS_BELØP)
return ResponseEntity.ok("Sendt godkjent minusbeløp-melding for ${refusjon.id}")
} else {
Expand All @@ -299,7 +299,7 @@ class AdminController(
if (refusjon.refusjonsgrunnlag.refusjonsgrunnlagetErNullSomIZero()) {
refusjonKafkaProducer!!.annullerTilskuddsperiodeEtterNullEllerMinusBeløp(refusjon, MidlerFrigjortÅrsak.REFUSJON_GODKJENT_NULL_BELØP)
return ResponseEntity.ok("Sendt godkjent nullbeløp-melding for ${refusjon.id}")
} else if (!refusjon.refusjonsgrunnlag.refusjonsgrunnlagetErPositivt()) {
} else if (refusjon.refusjonsgrunnlag.refusjonsgrunnlagetErNegativt()) {
refusjonKafkaProducer!!.annullerTilskuddsperiodeEtterNullEllerMinusBeløp(refusjon, MidlerFrigjortÅrsak.REFUSJON_MINUS_BELØP)
return ResponseEntity.ok("Sendt godkjent minusbeløp-melding for ${refusjon.id}")
} else {
Expand All @@ -308,10 +308,10 @@ class AdminController(
}

@Unprotected
@PostMapping("manuell-automatisk-utbetaling")
@PostMapping("utfoer-automatisk-utbetaling")
@Transactional
fun manuellAutomatiskUtbetaling(@RequestBody refusjonVedIdRequest: RefusjonVedIdRequest): Boolean {
automatiskUtbetaling.utførAutomatiskUtbetaling(refusjonRepository.findById(refusjonVedIdRequest.refusjonId).get())
fun manuellAutomatiskUtbetaling(): Boolean {
automatiskUtbetaling.utførAutomatiskUtbetaling()
return true
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,38 @@ package no.nav.arbeidsgiver.tiltakrefusjon.automatisk_utbetaling
import no.nav.arbeidsgiver.tiltakrefusjon.autorisering.SYSTEM_BRUKER
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Refusjon
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonRepository
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonService
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonStatus
import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.Tiltakstype
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Component

@Component
class AutomatiskUtbetaling(
private val refusjonRepository: RefusjonRepository
private val refusjonRepository: RefusjonRepository,
private val refusjonService: RefusjonService
) {
val log = LoggerFactory.getLogger(AutomatiskUtbetaling::class.java.name)

fun utførAutomatiskUtbetaling() {
val vtaoRefusjoner = refusjonRepository.findAllByStatusAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn(RefusjonStatus.KLAR_FOR_INNSENDING, Tiltakstype.somUtbetalesAutomatisk())

vtaoRefusjoner.forEach { refusjon ->
refusjonRepository.findAllByStatusAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn(
RefusjonStatus.FOR_TIDLIG,
Tiltakstype.somUtbetalesAutomatisk()
).forEach { refusjon ->
utførAutomatiskUtbetaling(refusjon)
}
}

fun utførAutomatiskUtbetaling(refusjon: Refusjon) {
val refusjonensTiltaktstype = refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.tiltakstype
if (!Tiltakstype.somUtbetalesAutomatisk().contains(refusjonensTiltaktstype)) {
throw IllegalStateException("Refusjon ${refusjon.id} hadde ikke riktig tiltakstype (${refusjonensTiltaktstype})")
}
log.info("Utfører automatisk utbetaling for refusjon {}-{} ({})",
refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.avtaleNr,
refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.løpenummer,
refusjon.id)
refusjonService.gjørBeregning(refusjon, SYSTEM_BRUKER)
refusjon.godkjennForArbeidsgiver(utførtAv = SYSTEM_BRUKER)
refusjonRepository.save(refusjon)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ class Refusjon(
if (!refusjonsgrunnlag.bedriftKid?.trim().isNullOrEmpty()) {
KidValidator(refusjonsgrunnlag.bedriftKid)
}
if (refusjonsgrunnlag.inntektsgrunnlag == null || refusjonsgrunnlag.inntektsgrunnlag!!.inntekter.isEmpty()) {
if (this.måTaStillingTilInntekter() && (refusjonsgrunnlag.inntektsgrunnlag == null || refusjonsgrunnlag.inntektsgrunnlag!!.inntekter.isEmpty())) {
throw FeilkodeException(Feilkode.INGEN_INNTEKTER)
}
if (refusjonsgrunnlag.bedriftKontonummer == null) {
Expand All @@ -168,7 +168,7 @@ class Refusjon(
if (this.måTaStillingTilInntekter() && !this.harTattStillingTilAlleInntektslinjer()) {
throw FeilkodeException(Feilkode.IKKE_TATT_STILLING_TIL_ALLE_INNTEKTSLINJER)
}
if (refusjonsgrunnlag.beregning == null) {
if (refusjonsgrunnlag.beregning == null && refusjonsgrunnlag.tilskuddsgrunnlag.tiltakstype != Tiltakstype.VTAO) {
throw FeilkodeException(Feilkode.INGEN_BEREGNING)
}
godkjentAvArbeidsgiver = Now.instant()
Expand All @@ -177,7 +177,7 @@ class Refusjon(
if (refusjonsgrunnlag.refusjonsgrunnlagetErNullSomIZero()) {
status = RefusjonStatus.GODKJENT_NULLBELØP
registerEvent(RefusjonGodkjentNullBeløp(this, utførtAv))
} else if (!refusjonsgrunnlag.refusjonsgrunnlagetErPositivt()) {
} else if (refusjonsgrunnlag.refusjonsgrunnlagetErNegativt()) {
status = RefusjonStatus.GODKJENT_MINUSBELØP
registerEvent(RefusjonGodkjentMinusBeløp(this, utførtAv))
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ interface RefusjonRepository : JpaRepository<Refusjon, String> {
): Page<Refusjon>

fun findAllByStatusAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn(status: RefusjonStatus, tiltakstype: Collection<Tiltakstype>): List<Refusjon>
fun findAllByStatusAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeNotIn(status: RefusjonStatus, tiltakstype: Collection<Tiltakstype>): List<Refusjon>

fun findAllByRefusjonsgrunnlag_Tilskuddsgrunnlag_AvtaleNrAndStatusIn(avtaleNr: Int, status: List<RefusjonStatus>): List<Refusjon>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -303,9 +303,9 @@ class RefusjonService(
}

fun gjørBeregning(refusjon: Refusjon, utførtAv: InnloggetBruker) {
if (erAltOppgitt(refusjon.refusjonsgrunnlag)) {
if (refusjon.refusjonsgrunnlag.erAltOppgitt()) {
val beregning = beregnRefusjonsbeløp(
inntekter = refusjon.refusjonsgrunnlag.inntektsgrunnlag!!.inntekter.toList(),
inntekter = refusjon.refusjonsgrunnlag.inntektsgrunnlag?.inntekter?.toList() ?: emptyList(),
tilskuddsgrunnlag = refusjon.refusjonsgrunnlag.tilskuddsgrunnlag,
tidligereUtbetalt = refusjon.refusjonsgrunnlag.tidligereUtbetalt,
korrigertBruttoLønn = refusjon.refusjonsgrunnlag.endretBruttoLønn,
Expand All @@ -322,7 +322,7 @@ class RefusjonService(
}

fun gjørKorreksjonBeregning(korreksjon: Korreksjon, utførtAv: InnloggetBruker) {
if (erAltOppgitt(korreksjon.refusjonsgrunnlag)) {
if (korreksjon.refusjonsgrunnlag.erAltOppgitt()) {
val beregning = beregnRefusjonsbeløp(
inntekter = korreksjon.refusjonsgrunnlag.inntektsgrunnlag!!.inntekter.toList(),
tilskuddsgrunnlag = korreksjon.refusjonsgrunnlag.tilskuddsgrunnlag,
Expand All @@ -339,13 +339,6 @@ class RefusjonService(
}
}

private fun erAltOppgitt(refusjonsgrunnlag: Refusjonsgrunnlag): Boolean {
val inntektsgrunnlag = refusjonsgrunnlag.inntektsgrunnlag
if (inntektsgrunnlag == null || inntektsgrunnlag.inntekter.none { it.erMedIInntektsgrunnlag() }) return false
return refusjonsgrunnlag.bedriftKontonummer != null && (refusjonsgrunnlag.inntekterKunFraTiltaket == true && refusjonsgrunnlag.endretBruttoLønn == null ||
((refusjonsgrunnlag.inntekterKunFraTiltaket == false || refusjonsgrunnlag.inntekterKunFraTiltaket == null) && refusjonsgrunnlag.endretBruttoLønn != null))
}

fun endreBruttolønn(refusjon: Refusjon, inntekterKunFraTiltaket: Boolean?, bruttoLønn: Int?) {
refusjon.endreBruttolønn(inntekterKunFraTiltaket, bruttoLønn)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,23 @@ private fun antallDager(
tom: LocalDate,
) = fom.datesUntil(tom.plusDays(1)).count().toInt()

fun fastBeløpBeregning(tilskuddsgrunnlag: Tilskuddsgrunnlag, tidligereUtbetalt: Int) = Beregning(
lønn = 0,
lønnFratrukketFerie = 0,
feriepenger = 0,
tjenestepensjon = 0,
arbeidsgiveravgift = 0,
sumUtgifter = 0,
beregnetBeløp = tilskuddsgrunnlag.tilskuddsbeløp,
refusjonsbeløp = tilskuddsgrunnlag.tilskuddsbeløp,
overTilskuddsbeløp = false,
tidligereUtbetalt = tidligereUtbetalt,
fratrekkLønnFerie = 0,
tidligereRefundertBeløp = 0,
overFemGrunnbeløp = false,
sumUtgifterFratrukketRefundertBeløp = 0
)

fun beregnRefusjonsbeløp(
inntekter: List<Inntektslinje>,
tilskuddsgrunnlag: Tilskuddsgrunnlag,
Expand All @@ -50,7 +67,9 @@ fun beregnRefusjonsbeløp(
harFerietrekkForSammeMåned: Boolean,
ekstraFerietrekk: Int? = null,

): Beregning {
): Beregning {
if (tilskuddsgrunnlag.tiltakstype == Tiltakstype.VTAO) return fastBeløpBeregning(tilskuddsgrunnlag, tidligereUtbetalt)

val kalkulertBruttoLønn = kalkulerBruttoLønn(inntekter).roundToInt()
val lønn = if (korrigertBruttoLønn != null) minOf(korrigertBruttoLønn, kalkulertBruttoLønn) else kalkulertBruttoLønn
val trekkgrunnlagFerie = if (harFerietrekkForSammeMåned) 0 else leggSammenTrekkGrunnlag(inntekter, tilskuddFom, ekstraFerietrekk).roundToInt()
Expand All @@ -61,7 +80,7 @@ fun beregnRefusjonsbeløp(
val arbeidsgiveravgift = (lønnFratrukketFerie + tjenestepensjon + feriepenger) * tilskuddsgrunnlag.arbeidsgiveravgiftSats
val sumUtgifter = lønnFratrukketFerie + tjenestepensjon + feriepenger + arbeidsgiveravgift
val sumUtgifterFratrukketRefundertBeløp = sumUtgifter - fratrekkRefunderbarBeløp
val beregnetBeløpUtenFratrukketRefundertBeløp = sumUtgifter * (tilskuddsgrunnlag.lønnstilskuddsprosent / 100.0)
val beregnetBeløpUtenFratrukketRefundertBeløp = sumUtgifter * (tilskuddsgrunnlag.lønnstilskuddsprosent / 100.0)
var beregnetBeløp = sumUtgifterFratrukketRefundertBeløp * (tilskuddsgrunnlag.lønnstilskuddsprosent / 100.0)

if (beregnetBeløpUtenFratrukketRefundertBeløp > 0 && beregnetBeløp < 0) {
Expand Down Expand Up @@ -96,11 +115,12 @@ fun beregnRefusjonsbeløp(
fratrekkLønnFerie = trekkgrunnlagFerie,
tidligereRefundertBeløp = fratrekkRefunderbarBeløp,
overFemGrunnbeløp = overFemGrunnbeløp,
sumUtgifterFratrukketRefundertBeløp = sumUtgifterFratrukketRefundertBeløp.roundToInt())
sumUtgifterFratrukketRefundertBeløp = sumUtgifterFratrukketRefundertBeløp.roundToInt()
)
}

fun leggSammenTrekkGrunnlag(inntekter: List<Inntektslinje>, tilskuddFom: LocalDate, ekstraFerietrekk: Int? = null): Double {
var ferieTrekkGrunnlag = inntekter.filter { it.skalTrekkesIfraInntektsgrunnlag(tilskuddFom) }
var ferieTrekkGrunnlag = inntekter.filter { it.skalTrekkesIfraInntektsgrunnlag(tilskuddFom) }
.sumOf { it.beløp }
if (ekstraFerietrekk != null) {
ferieTrekkGrunnlag += ekstraFerietrekk
Expand All @@ -112,4 +132,4 @@ fun kalkulerBruttoLønn(
inntekter: List<Inntektslinje>,
): Double =
inntekter.filter { it.erMedIInntektsgrunnlag() && it.erOpptjentIPeriode != null && it.erOpptjentIPeriode!! }
.sumOf { it.beløp }
.sumOf { it.beløp }
Original file line number Diff line number Diff line change
Expand Up @@ -46,15 +46,15 @@ class Refusjonsgrunnlag(
}
}
}
if(inntektsgrunnlag.inntekter.filter { it.erMedIInntektsgrunnlag() }.find { it.erOpptjentIPeriode === null } !== null) {
if (inntektsgrunnlag.inntekter.filter { it.erMedIInntektsgrunnlag() }.find { it.erOpptjentIPeriode === null } !== null) {
this.resetEndreBruttolønn()
}
this.inntektsgrunnlag = inntektsgrunnlag
}

fun finnInntektslinjeIListeMedInntekter(linje1: Inntektslinje, inntektslinjer: Set<Inntektslinje>): Inntektslinje? {
return inntektslinjer.find {
it.inntektType == linje1.inntektType &&
it.inntektType == linje1.inntektType &&
it.beskrivelse == linje1.beskrivelse &&
it.beløp == linje1.beløp &&
it.måned == linje1.måned &&
Expand Down Expand Up @@ -88,8 +88,8 @@ class Refusjonsgrunnlag(
this.endretBruttoLønn = bruttoLønn
}

fun refusjonsgrunnlagetErPositivt(): Boolean {
return this.beregning?.refusjonsbeløp != null && this.beregning!!.refusjonsbeløp > 0
fun refusjonsgrunnlagetErNegativt(): Boolean {
return this.beregning?.refusjonsbeløp != null && this.beregning!!.refusjonsbeløp < 0
}

fun refusjonsgrunnlagetErNullSomIZero(): Boolean {
Expand All @@ -106,12 +106,12 @@ class Refusjonsgrunnlag(

var erNoenOpptjentIPerioden = false
inntektsgrunnlag?.inntekter?.forEach {
if(it.erOpptjentIPeriode == true) {
if (it.erOpptjentIPeriode == true) {
erNoenOpptjentIPerioden = true
}
}

if(!erNoenOpptjentIPerioden) {
if (!erNoenOpptjentIPerioden) {
beregning = null
endretBruttoLønn = null
fratrekkRefunderbarBeløp = null
Expand All @@ -126,4 +126,13 @@ class Refusjonsgrunnlag(
this.fratrekkRefunderbarBeløp = fratrekkRefunderbarBeløp
this.refunderbarBeløp = refunderbarBeløp
}

fun erAltOppgitt(): Boolean {
if (tilskuddsgrunnlag.tiltakstype == Tiltakstype.VTAO) return true

val inntektsgrunnlag = inntektsgrunnlag
if (inntektsgrunnlag == null || inntektsgrunnlag.inntekter.none { it.erMedIInntektsgrunnlag() }) return false
return bedriftKontonummer != null && (inntekterKunFraTiltaket == true && endretBruttoLønn == null ||
((inntekterKunFraTiltaket == false || inntekterKunFraTiltaket == null) && endretBruttoLønn != null))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,11 @@ class StatusJobb(

fun fraForTidligTilKlarForInnsending() {
logger.info("Sjekker for tidliger refusjoner som skal settes til KLAR_FOR_INNSENDING")
val refusjoner = refusjonRepository.findAllByStatus(RefusjonStatus.FOR_TIDLIG)
var antallEndretTilKlarForInnsending: Int = 0;
val refusjoner = refusjonRepository.findAllByStatusAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeNotIn(
RefusjonStatus.FOR_TIDLIG,
Tiltakstype.somUtbetalesAutomatisk()
)
var antallEndretTilKlarForInnsending = 0;
refusjoner.forEach {
try {
if (Now.localDate().isAfter(it.refusjonsgrunnlag.tilskuddsgrunnlag.tilskuddTom)) {
Expand Down

0 comments on commit 53e340c

Please sign in to comment.