Skip to content

Commit

Permalink
Api for gebyr og lagre om rolle har gebyrsøknad (#614)
Browse files Browse the repository at this point in the history
* Lagre om rolle har gebyrsøknad

* Lagre om rolle har gebyrsøknad

* Lagre om rolle har gebyrsøknad

* Gebyr api

* Oppgrader felles for endringer i beregninger

* Oppgrader felles for endringer i beregninger

* Gebyr service WIP

* Gebyr api

* Gebyr api

* Gebyr api

* Fiks gebyr grunnlagsliste

* Lagt til flere tester

* Lagt til flere tester og diverse justeringer

* Lagt til flere tester og diverse justeringer

* Lagt til flere tester og diverse justeringer
  • Loading branch information
ugur93 authored Nov 29, 2024
1 parent 57c6c9b commit d68e30a
Show file tree
Hide file tree
Showing 40 changed files with 1,883 additions and 93 deletions.
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
<properties>
<java.version>21</java.version>
<kotlin.version>2.0.21</kotlin.version>
<bidrag-felles.version>2024.11.25.120349</bidrag-felles.version>
<bidrag-beregn-felles.version>2024.11.25.120521</bidrag-beregn-felles.version>
<bidrag-felles.version>2024.11.28.115919</bidrag-felles.version>
<bidrag-beregn-felles.version>2024.11.29.125938</bidrag-beregn-felles.version>
<h2.version>2.3.232</h2.version>
<logback-encoder.version>8.0</logback-encoder.version>
<token-support.version>3.2.0</token-support.version>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package no.nav.bidrag.behandling.controller.v2

import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.security.SecurityRequirement
import jakarta.validation.Valid
import no.nav.bidrag.behandling.dto.v2.gebyr.OppdaterGebyrResponsDto
import no.nav.bidrag.behandling.dto.v2.gebyr.OppdaterManueltGebyrDto
import no.nav.bidrag.behandling.service.BehandlingService
import no.nav.bidrag.behandling.service.GebyrService
import no.nav.bidrag.behandling.transformers.behandling.tilDto
import no.nav.bidrag.behandling.transformers.gebyr.tilDto
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.RequestBody

@BehandlingRestControllerV2
class GebyrController(
private val gebyrService: GebyrService,
private val behandlingService: BehandlingService,
) {
@Suppress("unused")
@PutMapping("/behandling/{behandlingsid}/gebyr")
@Operation(
description =
"Oppdater manuelt overstyr gebyr for en behandling.",
security = [SecurityRequirement(name = "bearer-key")],
)
fun oppdaterManueltOverstyrtGebyr(
@PathVariable behandlingsid: Long,
@Valid
@RequestBody(required = true)
request: OppdaterManueltGebyrDto,
): OppdaterGebyrResponsDto {
gebyrService.oppdaterManueltOverstyrtGebyr(behandlingService.hentBehandlingById(behandlingsid), request)
return tilRespons(behandlingsid, request.rolleId)
}

private fun tilRespons(
behandlingsId: Long,
rolleId: Long,
): OppdaterGebyrResponsDto {
val behandling = behandlingService.hentBehandlingById(behandlingsId)
return behandling.roller.find { it.id == rolleId }!!.let { rolle ->
OppdaterGebyrResponsDto(
rolle.tilDto(),
rolle.manueltOverstyrtGebyr?.tilDto(),
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,10 @@ import no.nav.bidrag.domene.enums.rolle.Rolletype
import no.nav.bidrag.domene.ident.Personident
import no.nav.bidrag.transport.felles.commonObjectmapper
import org.hibernate.annotations.ColumnTransformer
import org.hibernate.annotations.JdbcTypeCode
import org.hibernate.annotations.SQLDelete
import org.hibernate.annotations.SQLRestriction
import org.hibernate.type.SqlTypes
import java.math.BigDecimal
import java.time.LocalDate
import java.time.LocalDateTime
Expand Down Expand Up @@ -52,6 +54,11 @@ open class Rolle(
@Deprecated("Migrere til Person.navn")
open val navn: String? = null,
open val deleted: Boolean = false,
open var harGebyrsøknad: Boolean = false,
@Column(columnDefinition = "jsonb")
@ColumnTransformer(write = "?::jsonb")
@JdbcTypeCode(SqlTypes.JSON)
open var manueltOverstyrtGebyr: RolleManueltOverstyrtGebyr? = null,
open var innbetaltBeløp: BigDecimal? = null,
@Column(name = "forrige_sivilstandshistorikk", columnDefinition = "jsonb")
@ColumnTransformer(write = "?::jsonb")
Expand Down Expand Up @@ -87,6 +94,12 @@ open class Rolle(
"Rolle(id=$id, behandling=${behandling.id}, rolletype=$rolletype, ident=$ident, fødselsdato=$fødselsdato, opprettet=$opprettet, navn=$navn, deleted=$deleted, innbetaltBeløp=$innbetaltBeløp)"
}

data class RolleManueltOverstyrtGebyr(
val overstyrGebyr: Boolean = true,
val ilagtGebyr: Boolean? = false,
val begrunnelse: String? = null,
)

fun Rolle.tilPersonident() = ident?.let { Personident(it) }

fun Rolle.tilNyestePersonident() = ident?.let { hentNyesteIdent(it) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,5 @@ data class OpprettRolleDto(
val innbetaltBeløp: BigDecimal? = null,
val erSlettet: Boolean = false,
val erUkjent: Boolean = false,
val harGebyrsøknad: Boolean = false,
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import no.nav.bidrag.behandling.dto.v1.behandling.RolleDto
import no.nav.bidrag.behandling.dto.v1.behandling.SivilstandDto
import no.nav.bidrag.behandling.dto.v1.behandling.VirkningstidspunktDto
import no.nav.bidrag.behandling.dto.v2.boforhold.BoforholdDtoV2
import no.nav.bidrag.behandling.dto.v2.gebyr.GebyrValideringsfeilDto
import no.nav.bidrag.behandling.dto.v2.gebyr.ManueltOverstyrGebyrDto
import no.nav.bidrag.behandling.dto.v2.inntekt.InntekterDtoV2
import no.nav.bidrag.behandling.dto.v2.inntekt.InntektspostDtoV2
import no.nav.bidrag.behandling.dto.v2.samvær.SamværDto
Expand Down Expand Up @@ -112,6 +114,7 @@ data class BehandlingDtoV2(
val virkningstidspunkt: VirkningstidspunktDto,
val inntekter: InntekterDtoV2,
val boforhold: BoforholdDtoV2,
val gebyr: GebyrDto? = null,
val aktiveGrunnlagsdata: AktiveGrunnlagsdata,
val ikkeAktiverteEndringerIGrunnlagsdata: IkkeAktiveGrunnlagsdata,
val feilOppståttVedSisteGrunnlagsinnhenting: Set<Grunnlagsinnhentingsfeil>? = null,
Expand All @@ -124,6 +127,25 @@ data class BehandlingDtoV2(
val vedtakstypeVisningsnavn get() = vedtakstype.visningsnavnIntern(opprinneligVedtakstype)
}

data class GebyrDto(
val gebyrRoller: List<GebyrRolleDto>,
val valideringsfeil: List<GebyrValideringsfeilDto>? = null,
)

data class GebyrRolleDto(
val inntekt: GebyrInntektDto,
val manueltOverstyrtGebyr: ManueltOverstyrGebyrDto? = null,
val beregnetIlagtGebyr: Boolean,
val rolle: RolleDto,
) {
data class GebyrInntektDto(
val skattepliktigInntekt: BigDecimal,
val maksBarnetillegg: BigDecimal? = null,
) {
val totalInntekt get() = skattepliktigInntekt + (maksBarnetillegg ?: BigDecimal.ZERO)
}
}

data class PersoninfoDto(
val id: Long? = null,
val ident: Personident? = null,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package no.nav.bidrag.behandling.dto.v2.gebyr

import com.fasterxml.jackson.annotation.JsonIgnore
import no.nav.bidrag.behandling.database.datamodell.Behandling
import no.nav.bidrag.behandling.dto.v1.behandling.RolleDto
import no.nav.bidrag.behandling.transformers.behandling.tilDto

fun Behandling.validerGebyr() =
roller
.filter { it.harGebyrsøknad }
.map {
GebyrValideringsfeilDto(
gjelder = it.tilDto(),
BestemmeGebyr = avslag != null && it.manueltOverstyrtGebyr?.ilagtGebyr == null,
manglerBegrunnelse =
if (it.manueltOverstyrtGebyr?.overstyrGebyr == true) {
it.manueltOverstyrtGebyr?.begrunnelse.isNullOrEmpty()
} else {
false
},
)
}.filter { it.harFeil }

data class GebyrValideringsfeilDto(
val gjelder: RolleDto,
valBestemmeGebyr: Boolean,
val manglerBegrunnelse: Boolean,
) {
@get:JsonIgnore
val harFeil
get() = manglerBegrunnelse ||BestemmeGebyr
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package no.nav.bidrag.behandling.dto.v2.gebyr

import io.swagger.v3.oas.annotations.media.Schema
import no.nav.bidrag.behandling.dto.v1.behandling.RolleDto

data class OppdaterManueltGebyrDto(
val rolleId: Long,
val overstyrtGebyr: ManueltOverstyrGebyrDto?,
)

data class OppdaterGebyrResponsDto(
val rolle: RolleDto,
val overstyrtGebyr: ManueltOverstyrGebyrDto?,
)

data class ManueltOverstyrGebyrDto(
val begrunnelse: String? = null,
@Schema(description = "Skal bare settes hvis det er avslag")
val ilagtGebyr: Boolean? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema
import no.nav.bidrag.behandling.database.datamodell.Husstandsmedlem
import no.nav.bidrag.behandling.dto.v1.behandling.RolleDto
import no.nav.bidrag.behandling.dto.v2.behandling.Grunnlagsdatatype
import no.nav.bidrag.behandling.dto.v2.gebyr.GebyrValideringsfeilDto
import no.nav.bidrag.behandling.dto.v2.samvær.SamværValideringsfeilDto
import no.nav.bidrag.behandling.dto.v2.underhold.ValideringsfeilUnderhold
import no.nav.bidrag.behandling.service.hentPersonVisningsnavn
Expand Down Expand Up @@ -217,6 +218,7 @@ data class BeregningValideringsfeil(
val andreVoksneIHusstanden: AndreVoksneIHusstandenPeriodeseringsfeil? = null,
val sivilstand: SivilstandPeriodeseringsfeil? = null,
val samvær: Set<SamværValideringsfeilDto>? = null,
val gebyr: Set<GebyrValideringsfeilDto>? = null,
val underholdskostnad: Set<ValideringsfeilUnderhold>? = null,
valBekrefteNyeOpplysninger: Set<MåBekrefteNyeOpplysninger> = emptySet(),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ class BehandlingService(
private val mapper: Dtomapper,
private val validerBehandlingService: ValiderBehandlingService,
private val underholdService: UnderholdService,
private val gebyrService: GebyrService,
) {
@Transactional
fun slettBehandling(behandlingId: Long) {
Expand Down Expand Up @@ -254,8 +255,7 @@ class BehandlingService(
log.info { "Oppdaterer informasjon om virkningstidspunkt for behandling $behandlingsid" }
secureLogger.info { "Oppdaterer informasjon om virkningstidspunkt for behandling $behandlingsid, forespørsel=$request" }
request.valider(it)
it.årsak = if (request.avslag != null) null else request.årsak ?: it.årsak
it.avslag = if (request.årsak != null) null else request.avslag ?: it.avslag
oppdaterAvslagÅrsak(it, request)
request.henteOppdatereNotat()?.let { n ->
notatService.oppdatereNotat(
it,
Expand All @@ -268,6 +268,30 @@ class BehandlingService(
it
}

@Transactional
fun oppdaterAvslagÅrsak(
behandling: Behandling,
request: OppdatereVirkningstidspunkt,
) {
fun oppdaterGebyr() {
log.info { "Virkningstidspunkt årsak/avslag er endret. Oppdaterer gebyr detaljer ${behandling.id}" }
gebyrService.oppdaterGebyrEtterEndringÅrsakAvslag(behandling)
}
val erAvslagÅrsakEndret = request.årsak != behandling.årsak || request.avslag != behandling.avslag

if (erAvslagÅrsakEndret) {
behandling.årsak = if (request.avslag != null) null else request.årsak ?: behandling.årsak
behandling.avslag = if (request.årsak != null) null else request.avslag ?: behandling.avslag

when (behandling.tilType()) {
TypeBehandling.BIDRAG -> {
oppdaterGebyr()
}
else -> {}
}
}
}

@Transactional
fun oppdaterVirkningstidspunkt(
request: OppdatereVirkningstidspunkt,
Expand Down Expand Up @@ -458,6 +482,8 @@ class BehandlingService(
oppdatereHusstandsmedlemmerForRoller(behandling, rollerSomLeggesTil)
oppdatereSamværForRoller(behandling, rollerSomLeggesTil)

// TODO oppdater underholdskostnader ( legge til når ny barn legges til )

behandlingRepository.save(behandling)

if (behandling.søknadsbarn.isEmpty()) {
Expand All @@ -476,6 +502,7 @@ class BehandlingService(
.forEach {
roller.find { br -> br.ident == it.ident?.verdi }?.let { eksisterendeRolle ->
eksisterendeRolle.innbetaltBeløp = it.innbetaltBeløp
eksisterendeRolle.harGebyrsøknad = it.harGebyrsøknad
}
}
}
Expand Down
84 changes: 84 additions & 0 deletions src/main/kotlin/no/nav/bidrag/behandling/service/GebyrService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package no.nav.bidrag.behandling.service

import no.nav.bidrag.behandling.database.datamodell.Behandling
import no.nav.bidrag.behandling.database.datamodell.RolleManueltOverstyrtGebyr
import no.nav.bidrag.behandling.dto.v2.gebyr.OppdaterManueltGebyrDto
import no.nav.bidrag.behandling.transformers.tilType
import no.nav.bidrag.behandling.transformers.validerSann
import no.nav.bidrag.behandling.transformers.vedtak.mapping.tilvedtak.VedtakGrunnlagMapper
import no.nav.bidrag.behandling.ugyldigForespørsel
import no.nav.bidrag.domene.enums.behandling.TypeBehandling
import no.nav.bidrag.transport.felles.ifTrue
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

@Service
class GebyrService(
private val vedtakGrunnlagMapper: VedtakGrunnlagMapper,
) {
@Transactional
fun oppdaterGebyrEtterEndringÅrsakAvslag(behandling: Behandling) {
behandling
.roller
.filter { it.harGebyrsøknad }
.forEach { rolle ->
rolle.manueltOverstyrtGebyr =
(rolle.manueltOverstyrtGebyr ?: RolleManueltOverstyrtGebyr()).let {
it.copy(
overstyrGebyr = behandling.avslag != null,
ilagtGebyr =
(behandling.avslag == null).ifTrue {
val beregning = vedtakGrunnlagMapper.beregnGebyr(behandling, rolle)
!beregning.ilagtGebyr
},
)
}
}
}

@Transactional
fun oppdaterManueltOverstyrtGebyr(
behandling: Behandling,
request: OppdaterManueltGebyrDto,
) {
val rolle =
behandling.roller.find { it.id == request.rolleId }
?: ugyldigForespørsel("Fant ikke rolle ${request.rolleId} i behandling ${behandling.id}")
val beregning = vedtakGrunnlagMapper.beregnGebyr(behandling, rolle)
behandling.validerOppdatering(request)
rolle.manueltOverstyrtGebyr =
(rolle.manueltOverstyrtGebyr ?: RolleManueltOverstyrtGebyr()).let {
it.copy(
overstyrGebyr = request.overstyrtGebyr != null,
ilagtGebyr = request.overstyrtGebyr?.ilagtGebyr ?: (behandling.avslag == null).ifTrue { !beregning.ilagtGebyr },
begrunnelse = request.overstyrtGebyr?.begrunnelse ?: it.begrunnelse,
)
}
}

private fun Behandling.validerOppdatering(request: OppdaterManueltGebyrDto) {
val feilListe = mutableSetOf<String>()

feilListe.validerSann(tilType() == TypeBehandling.BIDRAG, "Kan bare oppdatere gebyr på en bidragsbehandling")

val rolle =
roller.find { it.id == request.rolleId }
?: ugyldigForespørsel("Fant ikke rolle ${request.rolleId} i behandling $id")

feilListe.validerSann(
rolle.harGebyrsøknad,
"Kan ikke endre gebyr på en rolle som ikke har gebyrsøknad",
)

if (avslag == null) {
feilListe.validerSann(
request.overstyrtGebyr?.ilagtGebyr == null,
"Kan ikke sette gebyr til samme som beregnet gebyr når det ikke er avslag",
)
}

if (feilListe.isNotEmpty()) {
ugyldigForespørsel(feilListe.toSet().joinToString("\n"))
}
}
}
Loading

0 comments on commit d68e30a

Please sign in to comment.