Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 5 additions & 12 deletions src/main/kotlin/no/nav/helse/flex/domene/RSVedtak.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package no.nav.helse.flex.domene

import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.databind.JsonNode
import no.nav.helse.flex.logger
import java.time.Instant
Expand All @@ -16,14 +15,8 @@ data class RSVedtakWrapper(
val orgnavn: String,
val annullert: Boolean = false,
val revurdert: Boolean = false,
@JsonIgnore
val dagerArbeidsgiver: List<RSDag> = emptyList(),
@JsonIgnore
val dagerPerson: List<RSDag> = emptyList(),
@JsonIgnore
val sykepengebelopArbeidsgiver: Int = 0,
@JsonIgnore
val sykepengebelopPerson: Int = 0,
val sykepengebelopSykmeldt: Int = 0,
val daglisteArbeidsgiver: List<RSDag> = emptyList(),
val daglisteSykmeldt: List<RSDag> = emptyList(),
val andreArbeidsgivere: Map<String, Double>?,
Expand All @@ -33,15 +26,15 @@ data class RSVedtakWrapper(
val log = logger()

fun dagerTilUtbetalingsdager(
dagerPerson: List<RSDag>,
dagerSykmeldt: List<RSDag>,
dagerArbeidsgiver: List<RSDag>,
): List<RSUtbetalingdag> {
val fom = (dagerPerson + dagerArbeidsgiver).minByOrNull { it.dato }?.dato ?: return emptyList()
val tom = (dagerPerson + dagerArbeidsgiver).maxByOrNull { it.dato }?.dato ?: return emptyList()
val fom = (dagerSykmeldt + dagerArbeidsgiver).minByOrNull { it.dato }?.dato ?: return emptyList()
val tom = (dagerSykmeldt + dagerArbeidsgiver).maxByOrNull { it.dato }?.dato ?: return emptyList()
val utbetalingsdager = mutableListOf<RSUtbetalingdag>()

for (dato in fom.datesUntil(tom.plusDays(1))) {
val dagPerson = dagerPerson.find { it.dato.equals(dato) }
val dagPerson = dagerSykmeldt.find { it.dato.equals(dato) }
val dagArbeidsgiver = dagerArbeidsgiver.find { it.dato.equals(dato) }

if (dagPerson == null && dagArbeidsgiver == null) {
Expand Down
48 changes: 0 additions & 48 deletions src/main/kotlin/no/nav/helse/flex/service/BrukerVedtak.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import no.nav.helse.flex.domene.*
import no.nav.helse.flex.kafka.VedtakStatusKafkaProducer
import no.nav.helse.flex.logger
import no.nav.helse.flex.organisasjon.LeggTilOrganisasjonnavn
import no.nav.helse.flex.secure
import no.nav.helse.flex.util.*
import org.springframework.http.HttpStatus
import org.springframework.stereotype.Service
Expand Down Expand Up @@ -51,7 +50,6 @@ class BrukerVedtak(
.map { it.fjernArbeidIkkeGjenopptattDager() }
.leggTilOrgnavn()
.leggTilArbeidsgivere()
.sammenlignDaglister()
}

fun lesVedtak(
Expand Down Expand Up @@ -206,49 +204,3 @@ class BrukerVedtak(

private fun List<RSVedtakWrapper>.leggTilArbeidsgivere(): List<RSVedtakWrapper> = leggTilOrganisasjonavn.leggTilAndreArbeidsgivere(this)
}

private fun List<RSVedtakWrapper>.sammenlignDaglister(): List<RSVedtakWrapper> {
this.forEach {
val personDiff = it.dagerPerson.finnForskjeller(it.daglisteSykmeldt)
if (personDiff != null) {
logger().secure("Diff i sykmeldt dagliste for vedtak ${it.vedtak.utbetaling.utbetalingId}: $personDiff")
}
val arbeidsgiverDiff = it.dagerArbeidsgiver.finnForskjeller(it.daglisteArbeidsgiver)
if (arbeidsgiverDiff != null) {
logger().secure("Diff i arbeidsgiver dagliste for vedtak ${it.vedtak.utbetaling.utbetalingId}: $arbeidsgiverDiff")
}
}
return this
}

private fun List<RSDag>.finnForskjeller(annen: List<RSDag>): String? {
if (this.size != annen.size) {
return "Ulik størrelse: ${this.size} vs ${annen.size}"
}

val forskjeller = mutableListOf<String>()
this.forEachIndexed { index, it ->
val dagDiff = mutableListOf<String>()

if (it.dato != annen[index].dato) {
dagDiff.add("dato: ${it.dato} vs ${annen[index].dato}")
}
if (it.belop != annen[index].belop) {
dagDiff.add("belop: ${it.belop} vs ${annen[index].belop}")
}
if (it.begrunnelser.toSet() != annen[index].begrunnelser.toSet()) {
dagDiff.add("begrunnelser: ${it.begrunnelser} vs ${annen[index].begrunnelser}")
}
if (it.dagtype != annen[index].dagtype) {
dagDiff.add("dagtype: ${it.dagtype} vs ${annen[index].dagtype}")
}
if (it.grad != annen[index].grad) {
dagDiff.add("grad: ${it.grad} vs ${annen[index].grad}")
}
if (dagDiff.isNotEmpty()) {
forskjeller.add("Index $index (${it.dato}): ${dagDiff.joinToString(", ")}")
}
}

return if (forskjeller.isEmpty()) null else forskjeller.joinToString("; ")
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,27 @@ package no.nav.helse.flex.service

import no.nav.helse.flex.domene.RSDag
import no.nav.helse.flex.domene.RSVedtakWrapper
import no.nav.helse.flex.logger
import java.time.LocalDate

fun RSVedtakWrapper.fjernArbeidIkkeGjenopptattDager(): RSVedtakWrapper {
val dagerArbeidsgiver = this.dagerArbeidsgiver.filter { it.dagtype != "ArbeidIkkeGjenopptattDag" }
val dagerPerson = this.dagerPerson.filter { it.dagtype != "ArbeidIkkeGjenopptattDag" }

val daglisteSykmeldt = this.daglisteSykmeldt.filter { it.dagtype != "ArbeidIkkeGjenopptattDag" }
val daglisteArbeidsgiver = this.daglisteArbeidsgiver.filter { it.dagtype != "ArbeidIkkeGjenopptattDag" }

val faktiskFomGammel = finnFaktiskFom(dagerArbeidsgiver, dagerPerson, this.vedtak.fom)
val faktiskFomNy = finnFaktiskFom(daglisteArbeidsgiver, daglisteSykmeldt, this.vedtak.fom)

if (faktiskFomNy != faktiskFomGammel) {
logger().warn(
"Fant ulik fom i daglisteArbeidsgiver og daglisteSykmeldt: $faktiskFomNy og $faktiskFomGammel. ${this.vedtak.utbetaling.utbetalingId}",
)
}

return this.copy(
dagerArbeidsgiver = dagerArbeidsgiver,
dagerPerson = dagerPerson,
daglisteArbeidsgiver = daglisteArbeidsgiver,
daglisteSykmeldt = daglisteSykmeldt,
vedtak = this.vedtak.copy(fom = faktiskFomGammel),
vedtak = this.vedtak.copy(fom = faktiskFomNy),
)
}

fun finnFaktiskFom(
dagerArbeidsgiver: List<RSDag>,
dagerPerson: List<RSDag>,
dagerSykmeldt: List<RSDag>,
fom: LocalDate,
): LocalDate {
val tidligsteDagerDag = (dagerArbeidsgiver + dagerPerson).minByOrNull { it.dato }
val tidligsteDagerDag = (dagerArbeidsgiver + dagerSykmeldt).minByOrNull { it.dato }
if (tidligsteDagerDag != null) {
if (tidligsteDagerDag.dato.isAfter(fom)) {
return tidligsteDagerDag.dato
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ class SendVedtakStatus(
hentSomBruker = false,
).first { it.id == id }

val skalIkkeVisesFordi = sjekkDager(vedtakWrapper.dagerArbeidsgiver + vedtakWrapper.dagerPerson)
val skalIkkeVisesFordi = sjekkDager(vedtakWrapper.daglisteArbeidsgiver + vedtakWrapper.daglisteSykmeldt)
if (skalIkkeVisesFordi.isNotBlank()) {
log.info("Utbetaling $utbetalingId inneholder bare $skalIkkeVisesFordi og vises ikke til bruker")
skalIkkeVises(id, skalIkkeVisesFordi)
Expand Down
158 changes: 8 additions & 150 deletions src/main/kotlin/no/nav/helse/flex/util/VedtakUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,45 +14,27 @@ fun RSVedtakWrapper.leggTilDagerIVedtakPeriode(): RSVedtakWrapper {
val fom = this.vedtak.fom
val tom = this.vedtak.tom

var dagerArbeidsgiver =
hentDager(fom, tom, this.vedtak.utbetaling.arbeidsgiverOppdrag, this.vedtak.utbetaling.utbetalingsdager)
val sykepengebelopArbeidsgiver = dagerArbeidsgiver.sumOf { it.belop }

var dagerPerson =
hentDager(fom, tom, this.vedtak.utbetaling.personOppdrag, this.vedtak.utbetaling.utbetalingsdager)
val sykepengebelopPerson = dagerPerson.sumOf { it.belop }

if (sykepengebelopPerson == 0 && sykepengebelopArbeidsgiver == 0) {
dagerArbeidsgiver = emptyList() // Helt avvist vedtak vises bare i dagerPerson
} else if (sykepengebelopPerson == 0) {
dagerPerson = emptyList() // Refusjonutbetaling
} else if (sykepengebelopArbeidsgiver == 0) {
dagerArbeidsgiver = emptyList() // Brukerutbetaling
}

var dagerArbeidsgiverNy =
hentDagerNy(fom, tom, this.vedtak.utbetaling.utbetalingsdager, false)
val sykepengebelopArbeidsgiverNy = dagerArbeidsgiverNy.sumOf { it.belop }

var dagerPersonNy =
var dagerSykmeldtNy =
hentDagerNy(fom, tom, this.vedtak.utbetaling.utbetalingsdager, true)
val sykepengebelopPersonNy = dagerPersonNy.sumOf { it.belop }
val sykepengebelopSykmeldtNy = dagerSykmeldtNy.sumOf { it.belop }

if (sykepengebelopPersonNy == 0 && sykepengebelopArbeidsgiverNy == 0) {
if (sykepengebelopSykmeldtNy == 0 && sykepengebelopArbeidsgiverNy == 0) {
dagerArbeidsgiverNy = emptyList() // Helt avvist vedtak vises bare i dagerPerson
} else if (sykepengebelopPersonNy == 0) {
dagerPersonNy = emptyList() // Refusjonutbetaling
} else if (sykepengebelopSykmeldtNy == 0) {
dagerSykmeldtNy = emptyList() // Refusjonutbetaling
} else if (sykepengebelopArbeidsgiverNy == 0) {
dagerArbeidsgiverNy = emptyList() // Brukerutbetaling
}

return this.copy(
dagerArbeidsgiver = dagerArbeidsgiver,
dagerPerson = dagerPerson,
sykepengebelopArbeidsgiver = sykepengebelopArbeidsgiver,
sykepengebelopPerson = sykepengebelopPerson,
sykepengebelopArbeidsgiver = sykepengebelopArbeidsgiverNy,
sykepengebelopSykmeldt = sykepengebelopSykmeldtNy,
daglisteArbeidsgiver = dagerArbeidsgiverNy,
daglisteSykmeldt = dagerPersonNy,
daglisteSykmeldt = dagerSykmeldtNy,
)
}

Expand Down Expand Up @@ -187,130 +169,6 @@ private fun RSUtbetalingdag.getBeløp(erSykmeldt: Boolean): Int =
private fun finnPerioder(dager: List<RSUtbetalingdag>): PeriodeImpl =
PeriodeImpl(dager.minBy { it.dato }.dato, dager.maxBy { it.dato }.dato)

fun hentDager(
fom: LocalDate,
tom: LocalDate,
oppdragDto: RSOppdrag?,
utbetalingsdager: List<RSUtbetalingdag>?,
): List<RSDag> {
// Setter opp alle dager i perioden
var dager =
fom
.datesUntil(tom.plusDays(1))
.asSequence()
.map { dato ->
RSDag(
dato = dato,
belop = 0,
grad = 0.0,
dagtype = if (dato.dayOfWeek in helg) "NavHelgDag" else "NavDag",
begrunnelser = emptyList(),
)
}
// Oppdaterer med beløp
.map { dag ->
val overlappendeLinjer =
oppdragDto
?.utbetalingslinjer
?.filter { linje -> linje.overlapperMed(dag.dato) } // alle linjer som overlapper
?: emptyList()

overlappendeLinjer.fold(dag) { dagen, linjen ->
val utbetalingslinjeUtenUtbetaling = linjen.stønadsdager == 0
dagen.copy(
belop = if (utbetalingslinjeUtenUtbetaling) 0 else linjen.dagsats,
grad = if (utbetalingslinjeUtenUtbetaling) 0.0 else linjen.grad,
)
}
}
// Slår sammen med dager fra bømlo
.associateWith { dag -> utbetalingsdager?.find { it.dato == dag.dato } }
// Oppdaterer dager med dagtype og begrunnelser
.map { (dag, utbetalingsdagen) ->
when (utbetalingsdagen) {
null -> {
dag
}

else -> {
dag.copy(
begrunnelser = utbetalingsdagen.begrunnelser,
dagtype =
when (utbetalingsdagen.type) {
"NavDag" -> {
when {
dag.grad < 100 -> "NavDagDelvisSyk"
else -> "NavDagSyk"
}
}

"ArbeidsgiverperiodeDag" -> {
when {
dag.belop == 0 -> "ArbeidsgiverperiodeDag"

// NAV betaler ikke arbeidsgiverperiode i helg
dag.dato.dayOfWeek in helg -> "NavHelgDag"

// Vises som gradert syk
dag.grad < 100 -> "NavDagDelvisSyk"

// Vises som 100% syk
else -> "NavDagSyk"
}
}

else -> {
utbetalingsdagen.type
}
},
belop = if (dag.dato.dayOfWeek in helg) 0 else dag.belop,
grad = if (dag.dato.dayOfWeek in helg) 0.0 else dag.grad,
)
}
}
}.toList()

val sisteArbeidsgiverperiodeDag = dager.lastOrNull { it.dagtype == "ArbeidsgiverperiodeDag" }
if (sisteArbeidsgiverperiodeDag?.dato?.dayOfWeek == DayOfWeek.SUNDAY) {
val overtagelseMandag = utbetalingsdager?.find { it.dato == sisteArbeidsgiverperiodeDag.dato.plusDays(1) }
if (overtagelseMandag?.type == "ArbeidsgiverperiodeDag") {
// Dersom nav overtar på mandag så skal ikke helgen før vises som arbeidsgiverperiode
dager =
dager.map { dag ->
when (dag.dato) {
overtagelseMandag.dato.minusDays(2) -> dag.copy(dagtype = "NavHelgDag")
overtagelseMandag.dato.minusDays(1) -> dag.copy(dagtype = "NavHelgDag")
else -> dag
}
}
}
}

val sisteUtbetalteDag = dager.indexOfLast { it.belop > 0 }
if (sisteUtbetalteDag == -1) {
return dager // Ingen dager med utbetaling
}

val annenUtbetalingISlutten =
dager.subList(sisteUtbetalteDag, dager.size).indexOfFirst {
it.belop == 0 && it.dagtype in dagtyperMedUtbetaling
}
if (annenUtbetalingISlutten > -1) {
// Ligger en person/refusjon utbetaling senere så vi stanser visningen her.
dager = dager.subList(0, sisteUtbetalteDag + annenUtbetalingISlutten).toList()
}

val forsteUtbetalteDag = dager.indexOfFirst { it.belop > 0 }
val annenUtbetalingIStarten =
dager.subList(0, forsteUtbetalteDag).indexOfLast { it.belop == 0 && it.dagtype in dagtyperMedUtbetaling }
if (annenUtbetalingIStarten > -1) {
// Ligger en person/refusjon utbetaling tidligere så vi starter visningen her.
dager = dager.subList(forsteUtbetalteDag, dager.size).toList()
}

return dager
}

fun List<RSVedtakWrapper>.markerRevurderte(): List<RSVedtakWrapper> {
val revurderinger = this.filter { it.vedtak.utbetaling.utbetalingType == "REVURDERING" }

Expand Down
4 changes: 2 additions & 2 deletions src/main/kotlin/no/nav/helse/flex/vedtaktype/Vedtaktype.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ import org.springframework.stereotype.Component
class Vedtaktype {
private fun RSVedtakWrapper.erRefusjon() = this.sykepengebelopArbeidsgiver > 0

private fun RSVedtakWrapper.erBrukerutbetaling() = this.sykepengebelopPerson > 0
private fun RSVedtakWrapper.erBrukerutbetaling() = this.sykepengebelopSykmeldt > 0

private fun RSVedtakWrapper.erKombinasjonutbetaling() = erRefusjon() && erBrukerutbetaling()

private fun RSVedtakWrapper.erAvvist() = (dagerPerson + dagerArbeidsgiver).any { it.dagtype == "AvvistDag" }
private fun RSVedtakWrapper.erAvvist() = (daglisteSykmeldt + daglisteArbeidsgiver).any { it.dagtype == "AvvistDag" }

private fun RSVedtakWrapper.erDelvisAvvist() = (erRefusjon() || erBrukerutbetaling()) && erAvvist()

Expand Down
3 changes: 3 additions & 0 deletions src/test/kotlin/no/nav/helse/flex/VedtakStatusTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,9 @@ class VedtakStatusTest : FellesTestOppsett() {
dato = now,
type = "ArbeidsgiverperiodeDag",
begrunnelser = emptyList(),
beløpTilArbeidsgiver = 0,
beløpTilSykmeldt = 0,
sykdomsgrad = 100,
),
),
).serialisertTilString(),
Expand Down
6 changes: 3 additions & 3 deletions src/test/kotlin/no/nav/helse/flex/VedtakTestdata.kt
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ fun vedtakTestdata(yrkesaktivitetstype: String = "ARBEIDSTAKER") =
andreArbeidsgivere = mapOf("123456547" to 500000.0, "547123456" to 300000.0, "5678" to 100000.0),
annullert = false,
revurdert = false,
dagerArbeidsgiver = emptyList(),
dagerPerson = emptyList(),
daglisteArbeidsgiver = emptyList(),
daglisteSykmeldt = emptyList(),
sykepengebelopArbeidsgiver = 0,
sykepengebelopPerson = 0,
sykepengebelopSykmeldt = 0,
)
Loading