Skip to content

Commit

Permalink
Fuse omsorgsmåneder for barnetrygd and hjelpestønad
Browse files Browse the repository at this point in the history
  • Loading branch information
jacob-meidell committed Nov 8, 2024
1 parent 78795bc commit e905745
Show file tree
Hide file tree
Showing 14 changed files with 437 additions and 229 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.per
import java.time.YearMonth

sealed class Omsorgsmåneder {
protected abstract val måneder: Set<YearMonth>
abstract val omsorgsmåneder: Set<Omsorgsmåned>

fun alle(): Set<YearMonth> {
return måneder
return omsorgsmåneder.map { it.måned }.toSortedSet()
}

fun antall(): Int {
Expand All @@ -18,55 +18,49 @@ sealed class Omsorgsmåneder {
fun omsorgstype(): DomainOmsorgskategori {
return when (this) {
is Barnetrygd -> DomainOmsorgskategori.BARNETRYGD
is Hjelpestønad -> DomainOmsorgskategori.HJELPESTØNAD
is BarnetrygdOgHjelpestønad -> DomainOmsorgskategori.HJELPESTØNAD
}
}

abstract fun kvalifisererForAutomatiskBehandling(): Omsorgsmåneder
fun erKvalifisertForAutomatiskBehandling(antallMånederRegel: AntallMånederRegel): Boolean {
return kvalifisererForAutomatiskBehandling().antall().oppfyller(antallMånederRegel)
}

abstract fun kvalifisererForManuellBehandling(): Omsorgsmåneder
fun erKvalifisertForManuellBehandling(antallMånederRegel: AntallMånederRegel): Boolean {
return kvalifisererForManuellBehandling().antall().oppfyller(antallMånederRegel)
}

data class Barnetrygd(
val omsorgsmåneder: Set<Omsorgsmåned>
) : Omsorgsmåneder() {
init {
require(omsorgsmåneder.all { it.omsorgstype.omsorgskategori() == DomainOmsorgskategori.BARNETRYGD })
}
fun kvalifisererForAutomatiskBehandling(): Omsorgsmåneder {
return Barnetrygd(full())
}

override val måneder: Set<YearMonth> = omsorgsmåneder.map { it.måned }.toSortedSet()
fun kvalifisererForManuellBehandling(): Omsorgsmåneder {
return Barnetrygd(full() + delt())
}

override fun kvalifisererForAutomatiskBehandling(): Omsorgsmåneder {
return Barnetrygd(full())
}

override fun kvalifisererForManuellBehandling(): Omsorgsmåneder {
return Barnetrygd(full() + delt())
}
fun full(): Set<Omsorgsmåned> {
return omsorgsmåneder.filter { it.omsorgstype is DomainOmsorgstype.Barnetrygd.Full }.toSet()
}

fun merge(other: Barnetrygd): Barnetrygd {
return Barnetrygd((omsorgsmåneder + other.omsorgsmåneder).toSet())
}
fun antallFull(): Int {
return full().count()
}

fun full(): Set<Omsorgsmåned> {
return omsorgsmåneder.filter { it.omsorgstype is DomainOmsorgstype.Barnetrygd.Full }.toSet()
}
fun delt(): Set<Omsorgsmåned> {
return omsorgsmåneder.filter { it.omsorgstype is DomainOmsorgstype.Barnetrygd.Delt }.toSet()
}

fun antallFull(): Int {
return full().count()
}
fun antallDelt(): Int {
return delt().count()
}

fun delt(): Set<Omsorgsmåned> {
return omsorgsmåneder.filter { it.omsorgstype is DomainOmsorgstype.Barnetrygd.Delt }.toSet()
}
data class Barnetrygd(
override val omsorgsmåneder: Set<Omsorgsmåned>
) : Omsorgsmåneder() {

fun antallDelt(): Int {
return delt().count()
fun merge(other: Barnetrygd): Barnetrygd {
return Barnetrygd((omsorgsmåneder + other.omsorgsmåneder).toSet())
}

companion object {
Expand All @@ -76,33 +70,17 @@ sealed class Omsorgsmåneder {
}
}

data class Hjelpestønad(
val omsorgsmåneder: Set<Omsorgsmåned>,
data class BarnetrygdOgHjelpestønad(
override val omsorgsmåneder: Set<Omsorgsmåned>,
) : Omsorgsmåneder() {
init {
require(omsorgsmåneder.all { it.omsorgstype.omsorgskategori() == DomainOmsorgskategori.HJELPESTØNAD })
}

override val måneder = omsorgsmåneder.map { it.måned }.toSortedSet()

//TODO et hull her ift full vs delt barnetrygd
override fun kvalifisererForAutomatiskBehandling(): Omsorgsmåneder {
return this
}

//TODO et hull her ift full vs delt barnetrygd
override fun kvalifisererForManuellBehandling(): Omsorgsmåneder {
return this
}


fun merge(other: Hjelpestønad): Hjelpestønad {
return Hjelpestønad((omsorgsmåneder + other.omsorgsmåneder).toSet())
fun merge(other: BarnetrygdOgHjelpestønad): BarnetrygdOgHjelpestønad {
return BarnetrygdOgHjelpestønad((omsorgsmåneder + other.omsorgsmåneder).toSet())
}

companion object {
fun none(): Hjelpestønad {
return Hjelpestønad(emptySet())
fun none(): BarnetrygdOgHjelpestønad {
return BarnetrygdOgHjelpestønad(emptySet())
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,36 +32,27 @@ sealed class OmsorgsopptjeningGrunnlag {
}
}

private fun omsorgsmånederForOmsorgsmottakerPerOmsorgsyter(): Map<Person, Omsorgsmåneder> {
return (grunnlag.omsorgsmånederPerOmsorgsyter(omsorgsmottaker) to grunnlag.hjelpestønadMånederPerOmsorgsyter(
omsorgsmottaker
)).let { (bt, hs) ->
//disse skal i utgangspunktet være 1-1
(bt.keys + hs.keys).distinct().associate { p ->
Triple(p, bt[p]!!, hs[p]!!).let { (person, barnetrygd, hjelpestønad) ->
when (omsorgstype) {
DomainOmsorgskategori.BARNETRYGD -> {
person to barnetrygd
}

DomainOmsorgskategori.HJELPESTØNAD -> {
person to hjelpestønad
}
}
}
fun omsorgsmånederForOmsorgsmottakerPerOmsorgsyter(): Map<Person, Omsorgsmåneder> {
return when (omsorgstype) {
DomainOmsorgskategori.BARNETRYGD -> {
grunnlag.omsorgsmånederPerOmsorgsyter(omsorgsmottaker)
}

DomainOmsorgskategori.HJELPESTØNAD -> {
grunnlag.omsorgsmånederPerOmsorgsyterHjelpestønad(omsorgsmottaker)
}
}
}

private fun utbetalingsmånederForOmsorgsmottakerPerOmsorgsyter(): Map<Person, Utbetalingsmåneder> {
fun utbetalingsmånederForOmsorgsmottakerPerOmsorgsyter(): Map<Person, Utbetalingsmåneder> {
return grunnlag.utbetalingsmånederPerOmsorgsyter(omsorgsmottaker)
}

private fun landstilknytningForOmsorgsmottakerPerOmsorgsyter(): Map<Person, Landstilknytningmåneder> {
fun landstilknytningForOmsorgsmottakerPerOmsorgsyter(): Map<Person, Landstilknytningmåneder> {
return grunnlag.landstilknytningMånederPerOmsorgsyter(omsorgsmottaker)
}

private fun omsorgsytersYtelsemåneder(): Ytelsemåneder {
fun omsorgsytersYtelsemåneder(): Ytelsemåneder {
return grunnlag.omsorgsytersPersongrunnlag.ytelsegrunnlag.ytelsesmåneder()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,9 @@ object OmsorgsyterHarMestOmsorgAvAlleOmsorgsytere :
.filter { it.key > 0 }

val omsorgsytereMedFlestOmsorgsmånederFull = if (omsorgsytereGruppertEtterOmsorgsmånederMedFull.isNotEmpty()) {
omsorgsytereGruppertEtterOmsorgsmånederMedFull.let { map -> map[map.maxOf { it.key }]!! }.toSet()
omsorgsytereGruppertEtterOmsorgsmånederMedFull
.let { map -> map[map.maxOf { it.key }]!! }
.toSet()
} else {
emptySet()
}
Expand All @@ -141,7 +143,8 @@ object OmsorgsyterHarMestOmsorgAvAlleOmsorgsytere :

val omsorgsytereMedFlestOmsorgsmånederFullEllerDelt =
if (omsorgsytereGruppertEtterOmsorgsmånederMedFullEllerDelt.isNotEmpty()) {
omsorgsytereGruppertEtterOmsorgsmånederMedFullEllerDelt.let { map -> map[map.maxOf { it.key }]!! }
omsorgsytereGruppertEtterOmsorgsmånederMedFullEllerDelt
.let { map -> map[map.maxOf { it.key }]!! }
.toSet()
} else {
emptySet()
Expand Down Expand Up @@ -183,21 +186,15 @@ object OmsorgsyterHarMestOmsorgAvAlleOmsorgsytere :
val omsorgsår: Int
) {
fun antallFull(): Int {
return when (omsorgsmåneder) {
is Omsorgsmåneder.Barnetrygd -> omsorgsmåneder.antallFull()
is Omsorgsmåneder.Hjelpestønad -> omsorgsmåneder.antall() //TODO hull for hjelpestønad med delt barnetrygd
}
return omsorgsmåneder.antallFull()
}

fun haddeOmsorgIDesember(): Boolean {
return omsorgsmåneder.alle().contains(YearMonth.of(omsorgsår, Month.DECEMBER))
}

fun antallDelt(): Int {
return when (omsorgsmåneder) {
is Omsorgsmåneder.Barnetrygd -> omsorgsmåneder.antallDelt()
is Omsorgsmåneder.Hjelpestønad -> omsorgsmåneder.antall() //TODO hull for hjelpestønad med delt barnetrygd
}
return omsorgsmåneder.antallDelt()
}

fun antall(): Int {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,17 +98,8 @@ object OmsorgsyterHarTilstrekkeligOmsorgsarbeid : ParagrafVilkår<OmsorgsyterHar

fun erManuell(): Boolean {
require(!erOppfyllt()) { "Rekkefølgeavhengig" }
return when (omsorgsmåneder) {
is Omsorgsmåneder.Barnetrygd -> {
omsorgsmåneder = omsorgsmåneder.kvalifisererForManuellBehandling()
omsorgsmåneder.alle().oppfyller(antallMånederRegel)
}

is Omsorgsmåneder.Hjelpestønad -> {
//TODO et hull her ift full vs delt barnetrygd
false
}
}
omsorgsmåneder = omsorgsmåneder.kvalifisererForManuellBehandling()
return omsorgsmåneder.alle().oppfyller(antallMånederRegel)
}

fun omsorgstype(): DomainOmsorgskategori {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,20 @@ internal fun Omsorgsmåneder.toDb(): OmsorgsmånederDb {
OmsorgsmånederDb(omsorgsmåneder = omsorgsmåneder.toDb(), type = omsorgstype().toDb())
}

is Omsorgsmåneder.Hjelpestønad -> {
toDb()
is Omsorgsmåneder.BarnetrygdOgHjelpestønad -> {
OmsorgsmånederDb(omsorgsmåneder = omsorgsmåneder.toDb(), type = omsorgstype().toDb())
}
}
}

internal fun OmsorgsmånederDb.toDomain(): Omsorgsmåneder {
return when (this.type) {
return when (type) {
OmsorgskategoriDb.BARNETRYGD -> {
Omsorgsmåneder.Barnetrygd(omsorgsmåneder.toDomain())
}

OmsorgskategoriDb.HJELPESTØNAD -> {
Omsorgsmåneder.Hjelpestønad(omsorgsmåneder.toDomain())
Omsorgsmåneder.BarnetrygdOgHjelpestønad(omsorgsmåneder.toDomain())
}
}
}
Expand All @@ -55,11 +55,4 @@ internal fun Set<Omsorgsmåneder.Omsorgsmåned>.toDb(): Set<OmsorgsmånedDb> {

internal fun Omsorgsmåneder.Omsorgsmåned.toDb(): OmsorgsmånedDb {
return OmsorgsmånedDb(måned, omsorgstype.toDb())
}

internal fun Omsorgsmåneder.Hjelpestønad.toDb(): OmsorgsmånederDb {
return OmsorgsmånederDb(
omsorgsmåneder = alle().map { OmsorgsmånedDb(it, OmsorgstypeDb.HJELPESTØNAD) }.toSet(),
type = omsorgstype().toDb()
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oms
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.Omsorgsmåneder
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.Person
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.Utbetalingsmåneder
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.persongrunnlag.model.Hjelpestønadperiode.Companion.omsorgsmåneder
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.persongrunnlag.model.Omsorgsperiode.Companion.landstilknytningsmåneder
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.persongrunnlag.model.Omsorgsperiode.Companion.omsorgsmåneder
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.persongrunnlag.model.Omsorgsperiode.Companion.omsorgsmånederHjelpestønad
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.persongrunnlag.model.Omsorgsperiode.Companion.utbetalingsmåneder
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.CorrelationId
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.InnlesingId
Expand All @@ -32,17 +32,23 @@ data class BeriketDatagrunnlag(
val alleMåneder: Set<YearMonth> = persongrunnlag.flatMap { it.måneder() }.distinct().toSet()
val alleOmsorgsmottakere = persongrunnlag.flatMap { it.omsorgsmottakere() }.distinct()

fun omsorgsmånederPerOmsorgsyter(omsorgsmottaker: Person): Map<Person, Omsorgsmåneder.Barnetrygd> {
fun omsorgsmånederPerOmsorgsyter(omsorgsmottaker: Person): Map<Person, Omsorgsmåneder> {
return persongrunnlag.associate { pg ->
pg.omsorgsyter to pg.omsorgsperioder.filter { it.omsorgsmottaker == omsorgsmottaker }
.omsorgsmåneder()
}
}

fun hjelpestønadMånederPerOmsorgsyter(omsorgsmottaker: Person): Map<Person, Omsorgsmåneder.Hjelpestønad> {
fun omsorgsmånederPerOmsorgsyterHjelpestønad(omsorgsmottaker: Person): Map<Person, Omsorgsmåneder> {
return persongrunnlag.associate { pg ->
pg.omsorgsyter to pg.omsorgsperioder.filter { it.omsorgsmottaker == omsorgsmottaker }
.omsorgsmånederHjelpestønad(hjelpestønadMånederPerOmsorgsyter(omsorgsmottaker)[omsorgsyter]!!)
}
}

private fun hjelpestønadMånederPerOmsorgsyter(omsorgsmottaker: Person): Map<Person, List<Hjelpestønadperiode>> {
return persongrunnlag.associate { pg ->
pg.omsorgsyter to pg.hjelpestønadperioder.filter { it.omsorgsmottaker == omsorgsmottaker }
.omsorgsmåneder(omsorgsmånederPerOmsorgsyter(omsorgsmottaker)[pg.omsorgsyter]!!)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.persongrunnlag.model

import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.Omsorgsmåneder
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.omsorgsopptjening.model.Person
import no.nav.pensjon.opptjening.omsorgsopptjening.felles.domene.periode.Periode
import java.time.YearMonth
Expand All @@ -13,29 +12,4 @@ data class Hjelpestønadperiode(
val kilde: DomainKilde,
) {
val periode = Periode(fom, tom)

fun alleMåneder(): Set<YearMonth> {
return periode.alleMåneder().distinct().toSet()
}

/**
* Tell alle måneder hvor barnetrygd og hjelpestønad overlapper
*/
fun omsorgsmåneder(omsorgsmåneder: Omsorgsmåneder.Barnetrygd): Omsorgsmåneder.Hjelpestønad {
return Omsorgsmåneder.Hjelpestønad(
alleMåneder().intersect(omsorgsmåneder.alle()).map { Omsorgsmåneder.Omsorgsmåned(it, omsorgstype) }.toSet()
)
}

companion object {
@JvmName("alleMndHjelp")
fun List<Hjelpestønadperiode>.alleMåneder(): Set<YearMonth> {
return flatMap { it.alleMåneder() }.distinct().toSet()
}

fun List<Hjelpestønadperiode>.omsorgsmåneder(omsorgsmåneder: Omsorgsmåneder.Barnetrygd): Omsorgsmåneder.Hjelpestønad {
return map { it.omsorgsmåneder(omsorgsmåneder) }.reduceOrNull { acc, o -> acc.merge(o) }
?: Omsorgsmåneder.Hjelpestønad.none()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,32 @@ data class Omsorgsperiode(
)
}

fun omsorgsmånederHjelpestønad(hjelpestønadperioder: List<Hjelpestønadperiode>): Omsorgsmåneder.BarnetrygdOgHjelpestønad {
require(hjelpestønadperioder.all { it.omsorgsmottaker.fnr == omsorgsmottaker.fnr }) { "Hjelpestønadsperioder må tilhøre samme omsorgsmottaker som barnetrgyd!" }
return Omsorgsmåneder.BarnetrygdOgHjelpestønad(
alleMåneder().intersect(hjelpestønadperioder.flatMap { it.periode.alleMåneder() }.toSortedSet())
.map { it to omsorgstype }
.map { (mnd, type) -> Omsorgsmåneder.Omsorgsmåned(mnd, type) }
.toSet()
)
}

companion object {
fun List<Omsorgsperiode>.alleMåneder(): Set<YearMonth> {
return flatMap { it.alleMåneder() }.distinct().toSet()
}

fun List<Omsorgsperiode>.omsorgsmåneder(): Omsorgsmåneder.Barnetrygd {
return map { it.omsorgsmåneder() }.reduceOrNull { acc, o -> acc.merge(o) }
return map { it.omsorgsmåneder() }.reduceOrNull { acc, barnetrygd -> acc.merge(barnetrygd) }
?: Omsorgsmåneder.Barnetrygd.none()
}

fun List<Omsorgsperiode>.omsorgsmånederHjelpestønad(hjelpestønadperiode: List<Hjelpestønadperiode>): Omsorgsmåneder.BarnetrygdOgHjelpestønad {
return map { it.omsorgsmånederHjelpestønad(hjelpestønadperiode) }.reduceOrNull { acc, barnetrygd ->
acc.merge(barnetrygd)
} ?: Omsorgsmåneder.BarnetrygdOgHjelpestønad.none()
}

fun List<Omsorgsperiode>.utbetalingsmåneder(): Utbetalingsmåneder {
return map { it.utbetalingsmåneder() }.reduceOrNull { acc, o -> acc.merge(o) }
?: Utbetalingsmåneder.none()
Expand Down
Loading

0 comments on commit e905745

Please sign in to comment.