From cfba2d14231a65f0576c206d4662d2d1d3ea6f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Andreas=20S=C3=B8rs=C3=A6ther?= Date: Tue, 17 Dec 2024 15:38:57 +0100 Subject: [PATCH 1/7] Flytt EnableXYZ-annotasjoner til applikasjonsklasse --- .../no/nav/arbeidsgiver/tiltakrefusjon/RetryConfig.kt | 9 --------- .../tiltakrefusjon/TiltakRefusjonApplication.kt | 6 +++++- .../arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt | 4 +--- .../arbeidsgiver/tiltakrefusjon/varsling/VarslingJobb.kt | 4 +--- 4 files changed, 7 insertions(+), 16 deletions(-) delete mode 100644 src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/RetryConfig.kt diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/RetryConfig.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/RetryConfig.kt deleted file mode 100644 index 868faa23..00000000 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/RetryConfig.kt +++ /dev/null @@ -1,9 +0,0 @@ -package no.nav.arbeidsgiver.tiltakrefusjon - -import org.springframework.context.annotation.Configuration -import org.springframework.retry.annotation.EnableRetry - -@Configuration -@EnableRetry -class RetryConfig { -} \ No newline at end of file diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/TiltakRefusjonApplication.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/TiltakRefusjonApplication.kt index 55c7e1e7..3ae4059c 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/TiltakRefusjonApplication.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/TiltakRefusjonApplication.kt @@ -2,9 +2,13 @@ package no.nav.arbeidsgiver.tiltakrefusjon import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication +import org.springframework.retry.annotation.EnableRetry +import org.springframework.scheduling.annotation.EnableScheduling import kotlin.system.exitProcess @SpringBootApplication +@EnableScheduling +@EnableRetry class TiltakRefusjonApplication fun main(args: Array) { @@ -15,4 +19,4 @@ fun main(args: Array) { } setAdditionalProfiles(System.getenv("MILJO")) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt index 453969cd..3769471c 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt @@ -3,12 +3,10 @@ package no.nav.arbeidsgiver.tiltakrefusjon.refusjon import no.nav.arbeidsgiver.tiltakrefusjon.leader.LeaderPodCheck import no.nav.arbeidsgiver.tiltakrefusjon.utils.Now import org.slf4j.LoggerFactory -import org.springframework.scheduling.annotation.EnableScheduling import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component @Component -@EnableScheduling class StatusJobb( val refusjonRepository: RefusjonRepository, val leaderPodCheck: LeaderPodCheck, @@ -61,4 +59,4 @@ class StatusJobb( } logger.info("Endret status til UTGÅTT på $antallEndretTilUtgått refusjoner") } -} \ No newline at end of file +} diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/varsling/VarslingJobb.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/varsling/VarslingJobb.kt index 59318e1d..8a8af00c 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/varsling/VarslingJobb.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/varsling/VarslingJobb.kt @@ -6,14 +6,12 @@ import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonStatus import no.nav.arbeidsgiver.tiltakrefusjon.utils.Now import org.slf4j.LoggerFactory import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty -import org.springframework.scheduling.annotation.EnableScheduling import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component import java.time.Duration import java.time.LocalDate @Component -@EnableScheduling @ConditionalOnProperty("tiltak-refusjon.kafka.enabled") class VarslingJobb( val refusjonRepository: RefusjonRepository, @@ -74,4 +72,4 @@ class VarslingJobb( return Duration.between(nyesteVarsling.varselTidspunkt, Now.localDateTime()).toDays() } -} \ No newline at end of file +} From 1fda819970a4142a36b8c0c68ea896ef739d18cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Andreas=20S=C3=B8rs=C3=A6ther?= Date: Wed, 18 Dec 2024 15:50:06 +0100 Subject: [PATCH 2/7] Automatisk utbetaling av VTAO-refusjoner --- .../tiltakrefusjon/AdminController.kt | 6 ++- .../AutomatiskUtbetaling.kt | 41 +++++++++++++++++++ .../refusjon/RefusjonRepository.kt | 5 ++- .../tiltakrefusjon/refusjon/StatusJobb.kt | 20 +++++---- .../tiltakrefusjon/refusjon/Tiltakstype.kt | 8 +++- 5 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetaling.kt diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt index 8643cb18..8c084fa7 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt @@ -1,5 +1,6 @@ package no.nav.arbeidsgiver.tiltakrefusjon +import no.nav.arbeidsgiver.tiltakrefusjon.automatisk_utbetaling.AutomatiskUtbetaling import no.nav.arbeidsgiver.tiltakrefusjon.autorisering.ADMIN_BRUKER import no.nav.arbeidsgiver.tiltakrefusjon.leader.LeaderPodCheck import no.nav.arbeidsgiver.tiltakrefusjon.okonomi.KontoregisterServiceImpl @@ -40,6 +41,7 @@ class AdminController( val leaderPodCheck: LeaderPodCheck, val refusjonKafkaProducer: RefusjonKafkaProducer?, val kontoregisterService: KontoregisterServiceImpl?, + val automatiskUtbetaling: AutomatiskUtbetaling ) { val logger = LoggerFactory.getLogger(javaClass) @@ -184,13 +186,13 @@ class AdminController( @Unprotected @PostMapping("sjekk-for-klar-for-innsending") fun sjekkForKlarforInnsending() { - StatusJobb(refusjonRepository, leaderPodCheck).sjekkOmKlarForInnsending() + StatusJobb(refusjonRepository, leaderPodCheck, automatiskUtbetaling).fraForTidligTilKlarForInnsending() } @Unprotected @PostMapping("sjekk-for-utgått") fun sjekkForUtgått() { - StatusJobb(refusjonRepository, leaderPodCheck).sjekkOmUtgått() + StatusJobb(refusjonRepository, leaderPodCheck, automatiskUtbetaling).fraKlarForInnsendingTilUtgått() } @Unprotected diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetaling.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetaling.kt new file mode 100644 index 00000000..02354d88 --- /dev/null +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetaling.kt @@ -0,0 +1,41 @@ +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 refusjonService: RefusjonService +) { + val log = LoggerFactory.getLogger(AutomatiskUtbetaling::class.java.name) + + fun utførAutomatiskUtbetaling() { + 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) + } +} diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonRepository.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonRepository.kt index c898a7c4..3141624d 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonRepository.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonRepository.kt @@ -74,6 +74,9 @@ interface RefusjonRepository : JpaRepository { pageable: Pageable ): Page + fun findAllByStatusAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn(status: RefusjonStatus, tiltakstype: Collection): List + fun findAllByStatusAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeNotIn(status: RefusjonStatus, tiltakstype: Collection): List + fun findAllByRefusjonsgrunnlag_Tilskuddsgrunnlag_AvtaleNrAndStatusIn(avtaleNr: Int, status: List): List -} \ No newline at end of file +} diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt index 3769471c..800552b2 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt @@ -1,5 +1,6 @@ package no.nav.arbeidsgiver.tiltakrefusjon.refusjon +import no.nav.arbeidsgiver.tiltakrefusjon.automatisk_utbetaling.AutomatiskUtbetaling import no.nav.arbeidsgiver.tiltakrefusjon.leader.LeaderPodCheck import no.nav.arbeidsgiver.tiltakrefusjon.utils.Now import org.slf4j.LoggerFactory @@ -10,6 +11,7 @@ import org.springframework.stereotype.Component class StatusJobb( val refusjonRepository: RefusjonRepository, val leaderPodCheck: LeaderPodCheck, + private val automatiskUtbetaling: AutomatiskUtbetaling, ) { private val logger = LoggerFactory.getLogger(javaClass) @@ -20,14 +22,18 @@ class StatusJobb( logger.info("Pod er ikke leader, så kjører ikke jobb for å finne refusjoner med statusendring") return } - sjekkOmUtgått() - sjekkOmKlarForInnsending() + fraKlarForInnsendingTilUtgått() + fraForTidligTilKlarForInnsending() + automatiskUtbetaling.utførAutomatiskUtbetaling() } - fun sjekkOmKlarForInnsending() { - logger.info("Sjekker statuser som skal får KLAR_FOR_INNSENDING") - val refusjoner = refusjonRepository.findAllByStatus(RefusjonStatus.FOR_TIDLIG) - var antallEndretTilKlarForInnsending: Int = 0; + fun fraForTidligTilKlarForInnsending() { + logger.info("Sjekker for tidliger refusjoner som skal settes til KLAR_FOR_INNSENDING") + 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)) { @@ -43,7 +49,7 @@ class StatusJobb( logger.info("Endret til KLAR_FOR_INNSENDING på $antallEndretTilKlarForInnsending refusjoner") } - fun sjekkOmUtgått() { + fun fraKlarForInnsendingTilUtgått() { val refusjoner = refusjonRepository.findAllByStatus(RefusjonStatus.KLAR_FOR_INNSENDING) var antallEndretTilUtgått: Int = 0 refusjoner.forEach { diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt index 1eeeed3d..2dfbce67 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt @@ -1,5 +1,9 @@ package no.nav.arbeidsgiver.tiltakrefusjon.refusjon enum class Tiltakstype { - MIDLERTIDIG_LONNSTILSKUDD, VARIG_LONNSTILSKUDD, SOMMERJOBB, VTAO -} \ No newline at end of file + MIDLERTIDIG_LONNSTILSKUDD, VARIG_LONNSTILSKUDD, SOMMERJOBB, VTAO; + + companion object { + fun somUtbetalesAutomatisk() = setOf(VTAO) + } +} From 6e79878ffec942e09592ab6e0fb42d7c25c3982d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Andreas=20S=C3=B8rs=C3=A6ther?= Date: Wed, 18 Dec 2024 15:59:45 +0100 Subject: [PATCH 3/7] VTAO-avtaler har en enkel beregning --- .../tiltakrefusjon/AdminController.kt | 4 +-- .../tiltakrefusjon/refusjon/Refusjon.kt | 6 ++-- .../refusjon/RefusjonService.kt | 13 ++------ .../refusjon/Refusjonsberegner.kt | 30 +++++++++++++++---- .../refusjon/Refusjonsgrunnlag.kt | 21 +++++++++---- .../tiltakrefusjon/refusjon/Tiltakstype.kt | 2 ++ 6 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt index 8c084fa7..91647f37 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt @@ -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 { @@ -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 { diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt index 839b1a87..304fb5ba 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt @@ -88,7 +88,7 @@ class Refusjon( @JsonProperty fun måTaStillingTilInntekter(): Boolean = - refusjonsgrunnlag.tilskuddsgrunnlag.tiltakstype != Tiltakstype.VTAO + refusjonsgrunnlag.tilskuddsgrunnlag.tiltakstype.harFastUtbetaling() private fun krevStatus(vararg gyldigeStatuser: RefusjonStatus) { if (status !in gyldigeStatuser) throw FeilkodeException(Feilkode.UGYLDIG_STATUS) @@ -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) { @@ -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 { diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonService.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonService.kt index 6940bcae..3c0bb98a 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonService.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/RefusjonService.kt @@ -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, @@ -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, @@ -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) } diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsberegner.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsberegner.kt index 0a16a7bd..9e6e154b 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsberegner.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsberegner.kt @@ -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, tilskuddsgrunnlag: Tilskuddsgrunnlag, @@ -50,7 +67,9 @@ fun beregnRefusjonsbeløp( harFerietrekkForSammeMåned: Boolean, ekstraFerietrekk: Int? = null, -): Beregning { + ): Beregning { + if (tilskuddsgrunnlag.tiltakstype.harFastUtbetaling()) 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() @@ -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) { @@ -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, 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 @@ -112,4 +132,4 @@ fun kalkulerBruttoLønn( inntekter: List, ): Double = inntekter.filter { it.erMedIInntektsgrunnlag() && it.erOpptjentIPeriode != null && it.erOpptjentIPeriode!! } - .sumOf { it.beløp } \ No newline at end of file + .sumOf { it.beløp } diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsgrunnlag.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsgrunnlag.kt index d87fc6f5..0bce3b8e 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsgrunnlag.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsgrunnlag.kt @@ -46,7 +46,7 @@ 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 @@ -54,7 +54,7 @@ class Refusjonsgrunnlag( fun finnInntektslinjeIListeMedInntekter(linje1: Inntektslinje, inntektslinjer: Set): 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 && @@ -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 { @@ -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 @@ -126,4 +126,13 @@ class Refusjonsgrunnlag( this.fratrekkRefunderbarBeløp = fratrekkRefunderbarBeløp this.refunderbarBeløp = refunderbarBeløp } + + fun erAltOppgitt(): Boolean { + if (tilskuddsgrunnlag.tiltakstype.harFastUtbetaling()) 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)) + } } diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt index 2dfbce67..c4549988 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt @@ -3,6 +3,8 @@ package no.nav.arbeidsgiver.tiltakrefusjon.refusjon enum class Tiltakstype { MIDLERTIDIG_LONNSTILSKUDD, VARIG_LONNSTILSKUDD, SOMMERJOBB, VTAO; + fun harFastUtbetaling() = this == VTAO + companion object { fun somUtbetalesAutomatisk() = setOf(VTAO) } From 3e3a46a1e252c10bf937a50350854097ac132e90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Andreas=20S=C3=B8rs=C3=A6ther?= Date: Wed, 18 Dec 2024 16:00:43 +0100 Subject: [PATCH 4/7] =?UTF-8?q?Admin-endepunkt:=20utf=C3=B8ring=20automati?= =?UTF-8?q?sk=20utbetaling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arbeidsgiver/tiltakrefusjon/AdminController.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt index 91647f37..e9c405ff 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt @@ -47,13 +47,13 @@ class AdminController( @Unprotected @GetMapping("kontoregister/{orgnr}") - fun kontoregisterKall(@PathVariable orgnr: String): String{ + fun kontoregisterKall(@PathVariable orgnr: String): String { return "Bank kontonummer: " + kontoregisterService?.hentBankkontonummer(orgnr) } @Unprotected @GetMapping("/") - fun hjem(): String?{ + fun hjem(): String? { return "Velkommen til Refusjon Admin API" } @@ -306,6 +306,13 @@ class AdminController( return ResponseEntity.ok("Kunne ikke annullere refusjon ${refusjon.id}") } } + + @Unprotected + @PostMapping("utfoer-automatisk-utbetaling") + @Transactional + fun manuellAutomatiskUtbetaling() { + automatiskUtbetaling.utførAutomatiskUtbetaling() + } } data class ReberegnRequest(val harFerietrekkForSammeMåned: Boolean, val minusBeløp: Int, val ferieTrekk: Int) From 168eecb15e604ab3795cd8e46f372b3659902b58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Andreas=20S=C3=B8rs=C3=A6ther?= Date: Thu, 19 Dec 2024 10:45:26 +0100 Subject: [PATCH 5/7] Testdekning for AutomatiskUtbetaling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test avslørte en bug, så dette var en fin investering --- .../AutomatiskUtbetaling.kt | 16 ++++-- .../tiltakrefusjon/refusjon/Refusjon.kt | 2 +- .../tiltakrefusjon/refusjon/StatusJobb.kt | 7 +-- .../AutomatiskUtbetalingTest.kt | 50 +++++++++++++++++++ src/test/resources/application-local.yml | 2 +- 5 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetalingTest.kt diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetaling.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetaling.kt index 02354d88..19ddd80f 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetaling.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetaling.kt @@ -20,9 +20,13 @@ class AutomatiskUtbetaling( refusjonRepository.findAllByStatusAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( RefusjonStatus.FOR_TIDLIG, Tiltakstype.somUtbetalesAutomatisk() - ).forEach { refusjon -> - utførAutomatiskUtbetaling(refusjon) - } + ) + .forEach { refusjon -> + refusjon.gjørKlarTilInnsending() + if (refusjon.status == RefusjonStatus.KLAR_FOR_INNSENDING) { + utførAutomatiskUtbetaling(refusjon) + } + } } fun utførAutomatiskUtbetaling(refusjon: Refusjon) { @@ -30,10 +34,12 @@ class AutomatiskUtbetaling( if (!Tiltakstype.somUtbetalesAutomatisk().contains(refusjonensTiltaktstype)) { throw IllegalStateException("Refusjon ${refusjon.id} hadde ikke riktig tiltakstype (${refusjonensTiltaktstype})") } - log.info("Utfører automatisk utbetaling for refusjon {}-{} ({})", + log.info( + "Utfører automatisk utbetaling for refusjon {}-{} ({})", refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.avtaleNr, refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.løpenummer, - refusjon.id) + refusjon.id + ) refusjonService.gjørBeregning(refusjon, SYSTEM_BRUKER) refusjon.godkjennForArbeidsgiver(utførtAv = SYSTEM_BRUKER) refusjonRepository.save(refusjon) diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt index 304fb5ba..ed862725 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt @@ -88,7 +88,7 @@ class Refusjon( @JsonProperty fun måTaStillingTilInntekter(): Boolean = - refusjonsgrunnlag.tilskuddsgrunnlag.tiltakstype.harFastUtbetaling() + !refusjonsgrunnlag.tilskuddsgrunnlag.tiltakstype.harFastUtbetaling() private fun krevStatus(vararg gyldigeStatuser: RefusjonStatus) { if (status !in gyldigeStatuser) throw FeilkodeException(Feilkode.UGYLDIG_STATUS) diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt index 800552b2..0892c2f3 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt @@ -36,8 +36,8 @@ class StatusJobb( var antallEndretTilKlarForInnsending = 0; refusjoner.forEach { try { - if (Now.localDate().isAfter(it.refusjonsgrunnlag.tilskuddsgrunnlag.tilskuddTom)) { - it.gjørKlarTilInnsending() + it.gjørKlarTilInnsending() + if (it.status == RefusjonStatus.KLAR_FOR_INNSENDING) { antallEndretTilKlarForInnsending++ refusjonRepository.save(it) } @@ -54,7 +54,8 @@ class StatusJobb( var antallEndretTilUtgått: Int = 0 refusjoner.forEach { try { - if (Now.localDate().isAfter(it.fristForGodkjenning)) { + it.gjørRefusjonUtgått() + if (it.status == RefusjonStatus.UTGÅTT) { it.gjørRefusjonUtgått() antallEndretTilUtgått++ refusjonRepository.save(it) diff --git a/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetalingTest.kt b/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetalingTest.kt new file mode 100644 index 00000000..45882741 --- /dev/null +++ b/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetalingTest.kt @@ -0,0 +1,50 @@ +package no.nav.arbeidsgiver.tiltakrefusjon.automatisk_utbetaling + +import no.nav.arbeidsgiver.tiltakrefusjon.`Vidar Fortidlig` +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonRepository +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.RefusjonStatus +import no.nav.arbeidsgiver.tiltakrefusjon.refusjon.StatusJobb +import no.nav.arbeidsgiver.tiltakrefusjon.utils.Now +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.annotation.DirtiesContext +import org.springframework.test.context.ActiveProfiles +import java.time.LocalDate + +@ActiveProfiles("local") +@SpringBootTest +class AutomatiskUtbetalingTest { + @Autowired + private lateinit var statusJobb: StatusJobb + + @Autowired + lateinit var refusjonRepository: RefusjonRepository + + @Test + @DirtiesContext + fun `vtao-avtale utbetales automatisk`() { + val vtaoRefusjon = refusjonRepository.save(`Vidar Fortidlig`()) + + statusJobb.sjekkForStatusEndring() + + val oppdatertRefusjon = refusjonRepository.findById(vtaoRefusjon.id).get() + assertEquals(RefusjonStatus.SENDT_KRAV, oppdatertRefusjon.status) + } + + @Test + @DirtiesContext + fun `vtao-avtale utbetales ikke automatisk hvis den er for tidlig`() { + Now.fixedDate(LocalDate.now().plusMonths(6)) + val forTidligRefusjon = refusjonRepository.save(`Vidar Fortidlig`()) + Now.resetClock() + println(forTidligRefusjon.refusjonsgrunnlag.tilskuddsgrunnlag.tilskuddFom) + println(forTidligRefusjon.refusjonsgrunnlag.tilskuddsgrunnlag.tilskuddTom) + + statusJobb.sjekkForStatusEndring() + + val oppdatertRefusjon = refusjonRepository.findById(forTidligRefusjon.id).get() + assertEquals(RefusjonStatus.FOR_TIDLIG, oppdatertRefusjon.status) + } +} diff --git a/src/test/resources/application-local.yml b/src/test/resources/application-local.yml index ba079d17..f5b7e096 100644 --- a/src/test/resources/application-local.yml +++ b/src/test/resources/application-local.yml @@ -14,7 +14,7 @@ spring: value-deserializer: org.apache.kafka.common.serialization.StringDeserializer datasource: - url: jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;MODE=PostgreSQL + url: jdbc:h2:mem:${random.uuid};DB_CLOSE_DELAY=-1;MODE=PostgreSQL username: sa password: sa driver-class-name: org.h2.Driver From 721113672bad73bc7004018ba52239b63493c928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Andreas=20S=C3=B8rs=C3=A6ther?= Date: Thu, 19 Dec 2024 10:55:44 +0100 Subject: [PATCH 6/7] AutomatiskUtbetaling -> AutomatiskInnsendingService --- .../tiltakrefusjon/AdminController.kt | 12 ++++----- ...ling.kt => AutomatiskInnsendingService.kt} | 26 +++++++++++-------- .../tiltakrefusjon/refusjon/StatusJobb.kt | 9 +++---- .../tiltakrefusjon/refusjon/Tiltakstype.kt | 4 --- ....kt => AutomatiskInnsendingServiceTest.kt} | 2 +- 5 files changed, 26 insertions(+), 27 deletions(-) rename src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/{AutomatiskUtbetaling.kt => AutomatiskInnsendingService.kt} (65%) rename src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/{AutomatiskUtbetalingTest.kt => AutomatiskInnsendingServiceTest.kt} (97%) diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt index e9c405ff..2ffb3559 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/AdminController.kt @@ -1,6 +1,6 @@ package no.nav.arbeidsgiver.tiltakrefusjon -import no.nav.arbeidsgiver.tiltakrefusjon.automatisk_utbetaling.AutomatiskUtbetaling +import no.nav.arbeidsgiver.tiltakrefusjon.automatisk_utbetaling.AutomatiskInnsendingService import no.nav.arbeidsgiver.tiltakrefusjon.autorisering.ADMIN_BRUKER import no.nav.arbeidsgiver.tiltakrefusjon.leader.LeaderPodCheck import no.nav.arbeidsgiver.tiltakrefusjon.okonomi.KontoregisterServiceImpl @@ -41,7 +41,7 @@ class AdminController( val leaderPodCheck: LeaderPodCheck, val refusjonKafkaProducer: RefusjonKafkaProducer?, val kontoregisterService: KontoregisterServiceImpl?, - val automatiskUtbetaling: AutomatiskUtbetaling + val automatiskInnsendingService: AutomatiskInnsendingService ) { val logger = LoggerFactory.getLogger(javaClass) @@ -186,13 +186,13 @@ class AdminController( @Unprotected @PostMapping("sjekk-for-klar-for-innsending") fun sjekkForKlarforInnsending() { - StatusJobb(refusjonRepository, leaderPodCheck, automatiskUtbetaling).fraForTidligTilKlarForInnsending() + StatusJobb(refusjonRepository, leaderPodCheck, automatiskInnsendingService).fraForTidligTilKlarForInnsending() } @Unprotected @PostMapping("sjekk-for-utgått") fun sjekkForUtgått() { - StatusJobb(refusjonRepository, leaderPodCheck, automatiskUtbetaling).fraKlarForInnsendingTilUtgått() + StatusJobb(refusjonRepository, leaderPodCheck, automatiskInnsendingService).fraKlarForInnsendingTilUtgått() } @Unprotected @@ -308,10 +308,10 @@ class AdminController( } @Unprotected - @PostMapping("utfoer-automatisk-utbetaling") + @PostMapping("utfoer-automatisk-innsending") @Transactional fun manuellAutomatiskUtbetaling() { - automatiskUtbetaling.utførAutomatiskUtbetaling() + automatiskInnsendingService.utførAutomatiskInnsending() } } diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetaling.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskInnsendingService.kt similarity index 65% rename from src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetaling.kt rename to src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskInnsendingService.kt index 19ddd80f..9b179245 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetaling.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskInnsendingService.kt @@ -7,35 +7,39 @@ 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 +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional -@Component -class AutomatiskUtbetaling( +@Service +class AutomatiskInnsendingService( private val refusjonRepository: RefusjonRepository, private val refusjonService: RefusjonService ) { - val log = LoggerFactory.getLogger(AutomatiskUtbetaling::class.java.name) + val log = LoggerFactory.getLogger(AutomatiskInnsendingService::class.java.name) - fun utførAutomatiskUtbetaling() { + val tiltakstyperSomKanSendesInnAutomatisk = Tiltakstype.entries.filter { it.harFastUtbetaling() }.toSet() + + @Transactional + fun utførAutomatiskInnsending() { refusjonRepository.findAllByStatusAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeIn( RefusjonStatus.FOR_TIDLIG, - Tiltakstype.somUtbetalesAutomatisk() + tiltakstyperSomKanSendesInnAutomatisk ) .forEach { refusjon -> refusjon.gjørKlarTilInnsending() if (refusjon.status == RefusjonStatus.KLAR_FOR_INNSENDING) { - utførAutomatiskUtbetaling(refusjon) + utførAutomatiskInnsending(refusjon) } } } - fun utførAutomatiskUtbetaling(refusjon: Refusjon) { + fun utførAutomatiskInnsending(refusjon: Refusjon) { val refusjonensTiltaktstype = refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.tiltakstype - if (!Tiltakstype.somUtbetalesAutomatisk().contains(refusjonensTiltaktstype)) { - throw IllegalStateException("Refusjon ${refusjon.id} hadde ikke riktig tiltakstype (${refusjonensTiltaktstype})") + if (!refusjonensTiltaktstype.harFastUtbetaling()) { + throw IllegalStateException("Refusjon ${refusjon.id} kan ikke sendes inn automatisk (tiltakstype ${refusjonensTiltaktstype})") } log.info( - "Utfører automatisk utbetaling for refusjon {}-{} ({})", + "Utfører automatisk innsending av refusjon {}-{} ({})", refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.avtaleNr, refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.løpenummer, refusjon.id diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt index 0892c2f3..a68e41ae 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/StatusJobb.kt @@ -1,8 +1,7 @@ package no.nav.arbeidsgiver.tiltakrefusjon.refusjon -import no.nav.arbeidsgiver.tiltakrefusjon.automatisk_utbetaling.AutomatiskUtbetaling +import no.nav.arbeidsgiver.tiltakrefusjon.automatisk_utbetaling.AutomatiskInnsendingService import no.nav.arbeidsgiver.tiltakrefusjon.leader.LeaderPodCheck -import no.nav.arbeidsgiver.tiltakrefusjon.utils.Now import org.slf4j.LoggerFactory import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Component @@ -11,7 +10,7 @@ import org.springframework.stereotype.Component class StatusJobb( val refusjonRepository: RefusjonRepository, val leaderPodCheck: LeaderPodCheck, - private val automatiskUtbetaling: AutomatiskUtbetaling, + private val automatiskInnsendingService: AutomatiskInnsendingService, ) { private val logger = LoggerFactory.getLogger(javaClass) @@ -24,14 +23,14 @@ class StatusJobb( } fraKlarForInnsendingTilUtgått() fraForTidligTilKlarForInnsending() - automatiskUtbetaling.utførAutomatiskUtbetaling() + automatiskInnsendingService.utførAutomatiskInnsending() } fun fraForTidligTilKlarForInnsending() { logger.info("Sjekker for tidliger refusjoner som skal settes til KLAR_FOR_INNSENDING") val refusjoner = refusjonRepository.findAllByStatusAndRefusjonsgrunnlag_Tilskuddsgrunnlag_TiltakstypeNotIn( RefusjonStatus.FOR_TIDLIG, - Tiltakstype.somUtbetalesAutomatisk() + automatiskInnsendingService.tiltakstyperSomKanSendesInnAutomatisk ) var antallEndretTilKlarForInnsending = 0; refusjoner.forEach { diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt index c4549988..a3a90774 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt @@ -4,8 +4,4 @@ enum class Tiltakstype { MIDLERTIDIG_LONNSTILSKUDD, VARIG_LONNSTILSKUDD, SOMMERJOBB, VTAO; fun harFastUtbetaling() = this == VTAO - - companion object { - fun somUtbetalesAutomatisk() = setOf(VTAO) - } } diff --git a/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetalingTest.kt b/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskInnsendingServiceTest.kt similarity index 97% rename from src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetalingTest.kt rename to src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskInnsendingServiceTest.kt index 45882741..e2ca3a5d 100644 --- a/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskUtbetalingTest.kt +++ b/src/test/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskInnsendingServiceTest.kt @@ -15,7 +15,7 @@ import java.time.LocalDate @ActiveProfiles("local") @SpringBootTest -class AutomatiskUtbetalingTest { +class AutomatiskInnsendingServiceTest { @Autowired private lateinit var statusJobb: StatusJobb From 13e9ba705e7ef06e33d55483f62b14b82493a432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Andreas=20S=C3=B8rs=C3=A6ther?= Date: Thu, 19 Dec 2024 15:14:18 +0100 Subject: [PATCH 7/7] harFastUtbetaling -> utbetalesAutomatisk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sindre Dahl Løken --- .../automatisk_utbetaling/AutomatiskInnsendingService.kt | 4 ++-- .../no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt | 2 +- .../arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsberegner.kt | 2 +- .../arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsgrunnlag.kt | 2 +- .../nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskInnsendingService.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskInnsendingService.kt index 9b179245..9d977263 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskInnsendingService.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/automatisk_utbetaling/AutomatiskInnsendingService.kt @@ -17,7 +17,7 @@ class AutomatiskInnsendingService( ) { val log = LoggerFactory.getLogger(AutomatiskInnsendingService::class.java.name) - val tiltakstyperSomKanSendesInnAutomatisk = Tiltakstype.entries.filter { it.harFastUtbetaling() }.toSet() + val tiltakstyperSomKanSendesInnAutomatisk = Tiltakstype.entries.filter { it.utbetalesAutomatisk() }.toSet() @Transactional fun utførAutomatiskInnsending() { @@ -35,7 +35,7 @@ class AutomatiskInnsendingService( fun utførAutomatiskInnsending(refusjon: Refusjon) { val refusjonensTiltaktstype = refusjon.refusjonsgrunnlag.tilskuddsgrunnlag.tiltakstype - if (!refusjonensTiltaktstype.harFastUtbetaling()) { + if (!refusjonensTiltaktstype.utbetalesAutomatisk()) { throw IllegalStateException("Refusjon ${refusjon.id} kan ikke sendes inn automatisk (tiltakstype ${refusjonensTiltaktstype})") } log.info( diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt index ed862725..48d9cf6a 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjon.kt @@ -88,7 +88,7 @@ class Refusjon( @JsonProperty fun måTaStillingTilInntekter(): Boolean = - !refusjonsgrunnlag.tilskuddsgrunnlag.tiltakstype.harFastUtbetaling() + !refusjonsgrunnlag.tilskuddsgrunnlag.tiltakstype.utbetalesAutomatisk() private fun krevStatus(vararg gyldigeStatuser: RefusjonStatus) { if (status !in gyldigeStatuser) throw FeilkodeException(Feilkode.UGYLDIG_STATUS) diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsberegner.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsberegner.kt index 9e6e154b..c2ea2492 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsberegner.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsberegner.kt @@ -68,7 +68,7 @@ fun beregnRefusjonsbeløp( ekstraFerietrekk: Int? = null, ): Beregning { - if (tilskuddsgrunnlag.tiltakstype.harFastUtbetaling()) return fastBeløpBeregning(tilskuddsgrunnlag, tidligereUtbetalt) + if (tilskuddsgrunnlag.tiltakstype.utbetalesAutomatisk()) 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 diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsgrunnlag.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsgrunnlag.kt index 0bce3b8e..5a541d3e 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsgrunnlag.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Refusjonsgrunnlag.kt @@ -128,7 +128,7 @@ class Refusjonsgrunnlag( } fun erAltOppgitt(): Boolean { - if (tilskuddsgrunnlag.tiltakstype.harFastUtbetaling()) return true + if (tilskuddsgrunnlag.tiltakstype.utbetalesAutomatisk()) return true val inntektsgrunnlag = inntektsgrunnlag if (inntektsgrunnlag == null || inntektsgrunnlag.inntekter.none { it.erMedIInntektsgrunnlag() }) return false diff --git a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt index a3a90774..2955021b 100644 --- a/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt +++ b/src/main/kotlin/no/nav/arbeidsgiver/tiltakrefusjon/refusjon/Tiltakstype.kt @@ -3,5 +3,5 @@ package no.nav.arbeidsgiver.tiltakrefusjon.refusjon enum class Tiltakstype { MIDLERTIDIG_LONNSTILSKUDD, VARIG_LONNSTILSKUDD, SOMMERJOBB, VTAO; - fun harFastUtbetaling() = this == VTAO + fun utbetalesAutomatisk() = this == VTAO }