Skip to content

Commit

Permalink
Merge pull request #260 from navikt/feature/beregn-særtilskudd
Browse files Browse the repository at this point in the history
Feature/beregn særtilskudd
  • Loading branch information
LarsOttoHaugen committed Jul 17, 2024
2 parents a82b0cf + 607084c commit b787a77
Show file tree
Hide file tree
Showing 70 changed files with 9,784 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package no.nav.bidrag.beregn.core.periode
import no.nav.bidrag.beregn.core.bo.Periode
import no.nav.bidrag.beregn.core.bo.PeriodisertGrunnlag
import java.time.LocalDate
import java.util.stream.Collectors

class Periodiserer {
private val bruddpunkter: MutableSet<LocalDate> = HashSet()
Expand Down Expand Up @@ -40,10 +39,10 @@ class Periodiserer {
// Setter perioder basert på fra- og til-dato
fun finnPerioder(beregnDatoFom: LocalDate, beregnDatoTil: LocalDate): List<Periode> {
val sortertBruddpunktListe =
bruddpunkter.stream()
.filter { dato: LocalDate -> dato.isAfter(beregnDatoFom.minusDays(1)) }
.filter { dato: LocalDate -> dato.isBefore(beregnDatoTil.plusDays(1)) }
.sorted().collect(Collectors.toList())
bruddpunkter
.filter { it.isAfter(beregnDatoFom.minusDays(1)) }
.filter { it.isBefore(beregnDatoTil.plusDays(1)) }
.sorted()

val perioder: MutableList<Periode> = ArrayList()
val bruddpunktIt = sortertBruddpunktListe.iterator()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,16 +195,18 @@ internal class ForskuddCore(private val forskuddPeriode: ForskuddPeriode = Forsk
return referanseListe.distinct().sorted()
}

private fun mapSjablonGrunnlagListe(periodeResultatListe: List<ResultatPeriode>) = periodeResultatListe.stream()
.map { mapSjablonListe(it.resultat.sjablonListe) }
.flatMap { it.stream() }
private fun mapSjablonGrunnlagListe(periodeResultatListe: List<ResultatPeriode>) = periodeResultatListe
.map { it.resultat.sjablonListe }
.flatMap { mapSjablonListe(it) }
.distinct()
.toList()

private fun mapSjablonListe(sjablonListe: List<SjablonPeriodeNavnVerdi>) = sjablonListe
.map {
SjablonResultatGrunnlagCore(
referanse = opprettSjablonreferanse(navn = it.navn, periode = ÅrMånedsperiode(fom = it.periode.datoFom, til = it.periode.datoTil)),
referanse = opprettSjablonreferanse(
navn = it.navn,
periode = ÅrMånedsperiode(fom = it.periode.datoFom, til = it.periode.datoTil),
),
periode = PeriodeCore(datoFom = it.periode.datoFom, datoTil = it.periode.datoTil),
navn = it.navn,
verdi = it.verdi,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ internal class ForskuddPeriode(private val forskuddBeregning: ForskuddBeregning
return BeregnForskuddResultat(grunnlagTilBeregning.periodeResultatListe)
}

// Lag
// Lager grunnlag til beregning
private fun lagGrunnlagTilBeregning(periodeGrunnlag: BeregnForskuddGrunnlag, grunnlagTilBeregning: GrunnlagTilBeregning) {
grunnlagTilBeregning.inntektPeriodeListe = periodeGrunnlag.inntektPeriodeListe.map { it }
grunnlagTilBeregning.sivilstandPeriodeListe = periodeGrunnlag.sivilstandPeriodeListe.map { it }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ internal class BeregnForskuddService(private val forskuddCore: ForskuddCore = Fo
},
)

// Mapper ut DelberegningBarnIHusstand.
// Mapper ut DelberegningBarnIHusstand
resultatGrunnlagListe.addAll(
sumAntallBarnListe
.map {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,6 @@ internal class BeregnForskuddApiTest {
private fun utførBeregningerOgEvaluerResultat() {
val request = lesFilOgByggRequest(filnavn)

// Kall rest-API for forskudd
val forskuddResultat = beregnForskuddService.beregn(request)

TestUtil.printJson(forskuddResultat)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class SjablonApiStub {
}

private fun settOppSjablonSjablontallStub() {
val url = "/bidrag-sjablon/sjablontall/all"
mockkObject(SjablonProvider.Companion)
val sjablonliste =
" [ " +
"{\"typeSjablon\": \"0005\"," +
Expand Down Expand Up @@ -121,7 +121,6 @@ class SjablonApiStub {
"\"brukerid\": \"A100364 \"," +
"\"tidspktEndret\": \"2020-05-17T14:15:49.233\"}]"

mockkObject(SjablonProvider.Companion)
every {
SjablonProvider.hentSjablontall()
} returns ObjectMapper().findAndRegisterModules().readValue(sjablonliste, object : TypeReference<List<Sjablontall>>() {})
Expand Down
104 changes: 104 additions & 0 deletions bidrag-beregn-særtilskudd/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>no.nav.bidrag</groupId>
<artifactId>bidrag-beregn-felles</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>

<artifactId>bidrag-beregn-saertilskudd</artifactId>

<properties>
<revision>1.0-SNAPSHOT</revision>
<guava.version>33.2.0-jre</guava.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
</dependency>

<dependency>
<groupId>no.nav.bidrag</groupId>
<artifactId>bidrag-beregn-core</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>io.github.oshai</groupId>
<artifactId>kotlin-logging-jvm</artifactId>
</dependency>
<dependency>
<groupId>no.nav.bidrag</groupId>
<artifactId>bidrag-domene-felles</artifactId>
</dependency>
<dependency>
<groupId>no.nav.bidrag</groupId>
<artifactId>bidrag-commons-felles</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito.kotlin</groupId>
<artifactId>mockito-kotlin</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit5</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.mockk</groupId>
<artifactId>mockk-jvm</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>

<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package no.nav.bidrag.beregn.særbidrag

import no.nav.bidrag.beregn.særbidrag.service.BeregnSærbidragService
import no.nav.bidrag.commons.service.sjablon.EnableSjablonProvider
import no.nav.bidrag.transport.behandling.beregning.felles.BeregnGrunnlag
import no.nav.bidrag.transport.behandling.beregning.særbidrag.BeregnetSærbidragResultat
import org.springframework.stereotype.Service

/**
* BeregnSærbidragApi eksponerer api for å beregne særbidrag.
*
* For å ta i bruk beregnings-apiet må følgende gjøres:
*
* Legg til Import-annotering i konfigurasjonen for å initalisere BeregnSærbidragApi-bønnen
* ```kotlin
* @Import(BeregnSærbidragApi::class)
* ```
*
* Definer BIDRAG_SJABLON_URL miljøvariabler i naiskonfigurasjonen.
* ```yaml
* BIDRAG_SJABLON_URL: https://bidrag-sjablon.<prod-fss|dev-fss>-pub.nais.io/bidrag-sjablon
* ```
*
* Åpne outbound traffik for `BIDRAG_SJABLON_URL` i naiskonfigurasjonen
*/
@EnableSjablonProvider
@Service
class BeregnSærbidragApi {
private val service = BeregnSærbidragService()

fun beregn(beregnSærbidragGrunnlag: BeregnGrunnlag): BeregnetSærbidragResultat = service.beregn(beregnSærbidragGrunnlag)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package no.nav.bidrag.beregn.særbidrag.core.bidragsevne

import no.nav.bidrag.beregn.core.bo.Avvik
import no.nav.bidrag.beregn.core.bo.Periode
import no.nav.bidrag.beregn.core.dto.PeriodeCore
import no.nav.bidrag.beregn.særbidrag.core.bidragsevne.bo.BarnIHusstandPeriode
import no.nav.bidrag.beregn.særbidrag.core.bidragsevne.bo.BeregnBidragsevneGrunnlag
import no.nav.bidrag.beregn.særbidrag.core.bidragsevne.bo.BeregnBidragsevneResultat
import no.nav.bidrag.beregn.særbidrag.core.bidragsevne.bo.InntektPeriode
import no.nav.bidrag.beregn.særbidrag.core.bidragsevne.bo.ResultatPeriode
import no.nav.bidrag.beregn.særbidrag.core.bidragsevne.bo.VoksneIHusstandPeriode
import no.nav.bidrag.beregn.særbidrag.core.bidragsevne.dto.BeregnBidragsevneGrunnlagCore
import no.nav.bidrag.beregn.særbidrag.core.bidragsevne.dto.BeregnBidragsevneResultatCore
import no.nav.bidrag.beregn.særbidrag.core.bidragsevne.dto.ResultatBeregningCore
import no.nav.bidrag.beregn.særbidrag.core.bidragsevne.dto.ResultatPeriodeCore
import no.nav.bidrag.beregn.særbidrag.core.bidragsevne.periode.BidragsevnePeriode
import no.nav.bidrag.beregn.særbidrag.core.felles.FellesCore
import no.nav.bidrag.beregn.særbidrag.core.felles.dto.BarnIHusstandenPeriodeCore
import no.nav.bidrag.beregn.særbidrag.core.felles.dto.InntektPeriodeCore
import no.nav.bidrag.beregn.særbidrag.core.felles.dto.VoksneIHusstandenPeriodeCore

internal class BidragsevneCore(private val bidragsevnePeriode: BidragsevnePeriode = BidragsevnePeriode()) : FellesCore() {

fun beregnBidragsevne(grunnlag: BeregnBidragsevneGrunnlagCore): BeregnBidragsevneResultatCore {
val beregnBidragsevneGrunnlag = mapTilBusinessObject(grunnlag)
val avvikListe = bidragsevnePeriode.validerInput(beregnBidragsevneGrunnlag)
val beregnBidragsevneResultat =
if (avvikListe.isEmpty()) {
bidragsevnePeriode.beregnPerioder(beregnBidragsevneGrunnlag)
} else {
BeregnBidragsevneResultat(emptyList())
}
return mapFraBusinessObject(avvikListe = avvikListe, resultat = beregnBidragsevneResultat)
}

private fun mapTilBusinessObject(grunnlag: BeregnBidragsevneGrunnlagCore) = BeregnBidragsevneGrunnlag(
beregnDatoFra = grunnlag.beregnDatoFra,
beregnDatoTil = grunnlag.beregnDatoTil,
inntektPeriodeListe = mapInntektPeriodeListe(grunnlag.inntektPeriodeListe),
barnIHusstandPeriodeListe = mapBarnIHusstandPeriodeListe(grunnlag.barnIHusstandenPeriodeListe),
voksneIHusstandPeriodeListe = mapVoksneIHusstandPeriodeListe(grunnlag.voksneIHusstandenPeriodeListe),
sjablonPeriodeListe = mapSjablonPeriodeListe(grunnlag.sjablonPeriodeListe),
)

private fun mapFraBusinessObject(avvikListe: List<Avvik>, resultat: BeregnBidragsevneResultat) = BeregnBidragsevneResultatCore(
resultatPeriodeListe = mapResultatPeriode(resultat.resultatPeriodeListe),
sjablonListe = mapSjablonGrunnlagListe(resultat.resultatPeriodeListe).toMutableList(),
avvikListe = mapAvvik(avvikListe),
)

private fun mapInntektPeriodeListe(inntektPeriodeListeCore: List<InntektPeriodeCore>) = inntektPeriodeListeCore.map {
InntektPeriode(
referanse = it.referanse,
periode = Periode(datoFom = it.periode.datoFom, datoTil = it.periode.datoTil),
beløp = it.beløp,
)
}

private fun mapBarnIHusstandPeriodeListe(antallBarnIHusstandenPeriodeListeCore: List<BarnIHusstandenPeriodeCore>) =
antallBarnIHusstandenPeriodeListeCore.map {
BarnIHusstandPeriode(
referanse = it.referanse,
periode = Periode(datoFom = it.periode.datoFom, datoTil = it.periode.datoTil),
antall = it.antall,
)
}

private fun mapVoksneIHusstandPeriodeListe(bostatusVoksneIHusstandenPeriodeListeCore: List<VoksneIHusstandenPeriodeCore>) =
bostatusVoksneIHusstandenPeriodeListeCore.map {
VoksneIHusstandPeriode(
referanse = it.referanse,
periode = Periode(datoFom = it.periode.datoFom, datoTil = it.periode.datoTil),
borMedAndre = it.borMedAndre,
)
}

private fun mapResultatPeriode(resultatPeriodeListe: List<ResultatPeriode>) = resultatPeriodeListe.map {
ResultatPeriodeCore(
periode = PeriodeCore(datoFom = it.periode.datoFom, datoTil = it.periode.datoTil),
resultat = ResultatBeregningCore(it.resultat.beløp),
grunnlagsreferanseListe = mapReferanseListe(it).sorted().toMutableList(),
)
}

private fun mapReferanseListe(resultatPeriode: ResultatPeriode): List<String> {
val (inntekt, antallBarnIHusstand, antallVoksneIHusstand) = resultatPeriode.grunnlag
val sjablonListe = resultatPeriode.resultat.sjablonListe
val referanseListe = mutableListOf<String>()
if (inntekt != null) referanseListe.add(inntekt.referanse)
referanseListe.add(antallBarnIHusstand.referanse)
referanseListe.add(antallVoksneIHusstand.referanse)
referanseListe.addAll(sjablonListe.map { lagSjablonReferanse(it) }.distinct())
return referanseListe.sorted()
}

private fun mapSjablonGrunnlagListe(resultatPeriodeListe: List<ResultatPeriode>) = resultatPeriodeListe
.map { it.resultat.sjablonListe }
.flatMap { mapSjablonListe(it) }
.distinct()
}
Loading

0 comments on commit b787a77

Please sign in to comment.