Skip to content

Commit

Permalink
Merge branch 'main' into grunnlag-barnetilsyn
Browse files Browse the repository at this point in the history
  • Loading branch information
s148719 committed Dec 5, 2024
2 parents 80e3440 + 863d316 commit ed25478
Show file tree
Hide file tree
Showing 21 changed files with 386 additions and 146 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ 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.dto.v2.behandling.GebyrRolleDto
import no.nav.bidrag.behandling.dto.v2.gebyr.OppdaterGebyrDto
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 no.nav.bidrag.behandling.transformers.tilDto
import no.nav.bidrag.behandling.transformers.vedtak.mapping.tilvedtak.VedtakGrunnlagMapper
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PutMapping
import org.springframework.web.bind.annotation.RequestBody
Expand All @@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestBody
class GebyrController(
private val gebyrService: GebyrService,
private val behandlingService: BehandlingService,
private val vedtakGrunnlagMapper: VedtakGrunnlagMapper,
) {
@Suppress("unused")
@PutMapping("/behandling/{behandlingsid}/gebyr")
Expand All @@ -29,22 +30,21 @@ class GebyrController(
@PathVariable behandlingsid: Long,
@Valid
@RequestBody(required = true)
request: OppdaterManueltGebyrDto,
): OppdaterGebyrResponsDto {
request: OppdaterGebyrDto,
): GebyrRolleDto {
gebyrService.oppdaterManueltOverstyrtGebyr(behandlingService.hentBehandlingById(behandlingsid), request)
return tilRespons(behandlingsid, request.rolleId)
}

private fun tilRespons(
behandlingsId: Long,
rolleId: Long,
): OppdaterGebyrResponsDto {
): GebyrRolleDto {
val behandling = behandlingService.hentBehandlingById(behandlingsId)
return behandling.roller.find { it.id == rolleId }!!.let { rolle ->
OppdaterGebyrResponsDto(
rolle.tilDto(),
rolle.manueltOverstyrtGebyr?.tilDto(),
)
vedtakGrunnlagMapper
.beregnGebyr(behandling, rolle)
.tilDto(rolle)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ open class Inntekt(
open var taMed: Boolean,
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
open val id: Long? = null,
open var id: Long? = null,
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "behandling_id", nullable = false)
open val behandling: Behandling? = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ data class RolleManueltOverstyrtGebyr(
val overstyrGebyr: Boolean = true,
val ilagtGebyr: Boolean? = false,
val begrunnelse: String? = null,
val beregnetIlagtGebyr: Boolean? = false,
)

fun Rolle.tilPersonident() = ident?.let { Personident(it) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ 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 @@ -139,10 +138,13 @@ data class GebyrDto(
data class GebyrRolleDto(
val inntekt: GebyrInntektDto,
val beløpGebyrsats: BigDecimal,
val manueltOverstyrtGebyr: ManueltOverstyrGebyrDto? = null,
val beregnetIlagtGebyr: Boolean,
val endeligIlagtGebyr: Boolean,
val begrunnelse: String? = null,
val rolle: RolleDto,
) {
val erManueltOverstyrt get() = beregnetIlagtGebyr != endeligIlagtGebyr

data class GebyrInntektDto(
val skattepliktigInntekt: BigDecimal,
val maksBarnetillegg: BigDecimal? = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ fun Behandling.validerGebyr() =
.map {
GebyrValideringsfeilDto(
gjelder = it.tilDto(),
BestemmeGebyr = avslag != null && it.manueltOverstyrtGebyr?.ilagtGebyr == null,
manglerBegrunnelse =
if (it.manueltOverstyrtGebyr?.overstyrGebyr == true) {
it.manueltOverstyrtGebyr?.begrunnelse.isNullOrEmpty()
Expand All @@ -23,10 +22,9 @@ fun Behandling.validerGebyr() =

data class GebyrValideringsfeilDto(
val gjelder: RolleDto,
valBestemmeGebyr: Boolean,
val manglerBegrunnelse: Boolean,
) {
@get:JsonIgnore
val harFeil
get() = manglerBegrunnelse ||BestemmeGebyr
get() = manglerBegrunnelse
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
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(
data class OppdaterGebyrDto(
val rolleId: Long,
val overstyrtGebyr: ManueltOverstyrGebyrDto?,
)

data class OppdaterGebyrResponsDto(
val rolle: RolleDto,
val overstyrtGebyr: ManueltOverstyrGebyrDto?,
@Schema(description = "Om gebyr skal overstyres. Settes til motsatte verdi av beregnet verdi")
val overstyrGebyr: Boolean = false,
val begrunnelse: String? = null,
)

data class ManueltOverstyrGebyrDto(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ data class OppdatereInntektRequest(
data class OppdatereInntektResponse(
@Schema(description = "Inntekt som ble oppdatert")
val inntekt: InntektDtoV2?,
val beregnetGebyrErEndret: Boolean = false,
@Schema(description = "Periodiserte inntekter")
val beregnetInntekter: List<BeregnetInntekterDto> = emptyList(),
@Schema(description = "Oppdatert begrunnelse")
Expand Down
61 changes: 37 additions & 24 deletions src/main/kotlin/no/nav/bidrag/behandling/service/GebyrService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,44 +2,59 @@ 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.dto.v2.gebyr.OppdaterGebyrDto
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 rekalkulerGebyr(behandling: Behandling): Boolean =
behandling
.roller
.filter { it.harGebyrsøknad }
.map { rolle ->
val beregning = vedtakGrunnlagMapper.beregnGebyr(behandling, rolle)
val manueltOverstyrtGebyr = rolle.manueltOverstyrtGebyr ?: RolleManueltOverstyrtGebyr()
val beregnetGebyrErEndret = manueltOverstyrtGebyr.beregnetIlagtGebyr != beregning.ilagtGebyr
if (beregnetGebyrErEndret) {
rolle.manueltOverstyrtGebyr =
manueltOverstyrtGebyr.copy(
overstyrGebyr = false,
ilagtGebyr = beregning.ilagtGebyr,
beregnetIlagtGebyr = beregning.ilagtGebyr,
)
}
beregnetGebyrErEndret
}.any { it }

@Transactional
fun oppdaterGebyrEtterEndringÅrsakAvslag(behandling: Behandling) {
behandling
.roller
.filter { it.harGebyrsøknad }
.forEach { rolle ->
val beregning = vedtakGrunnlagMapper.beregnGebyr(behandling, 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
},
)
}
(rolle.manueltOverstyrtGebyr ?: RolleManueltOverstyrtGebyr()).copy(
overstyrGebyr = false,
ilagtGebyr = beregning.ilagtGebyr,
beregnetIlagtGebyr = beregning.ilagtGebyr,
)
}
}

@Transactional
fun oppdaterManueltOverstyrtGebyr(
behandling: Behandling,
request: OppdaterManueltGebyrDto,
request: OppdaterGebyrDto,
) {
val rolle =
behandling.roller.find { it.id == request.rolleId }
Expand All @@ -49,14 +64,15 @@ class GebyrService(
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,
overstyrGebyr = request.overstyrGebyr,
ilagtGebyr = request.overstyrGebyr != beregning.ilagtGebyr,
beregnetIlagtGebyr = beregning.ilagtGebyr,
begrunnelse = request.begrunnelse ?: it.begrunnelse,
)
}
}

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

feilListe.validerSann(tilType() == TypeBehandling.BIDRAG, "Kan bare oppdatere gebyr på en bidragsbehandling")
Expand All @@ -69,13 +85,10 @@ class GebyrService(
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",
)
}
feilListe.validerSann(
request.overstyrGebyr || request.begrunnelse.isNullOrEmpty(),
"Kan ikke sette begrunnelse hvis gebyr ikke er overstyrt",
)

if (feilListe.isNotEmpty()) {
ugyldigForespørsel(feilListe.toSet().joinToString("\n"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ class InntektService(
private val behandlingRepository: BehandlingRepository,
private val inntektRepository: InntektRepository,
private val notatService: NotatService,
private val gebyrService: GebyrService,
) {
@Transactional
fun rekalkulerPerioderInntekter(behandlingsid: Long) {
Expand Down Expand Up @@ -174,8 +175,10 @@ class InntektService(
behandling.validerKanOppdatere()

val oppdatertInntekt = oppdatereInntekt(oppdatereInntektRequest, behandling)
val beregnetGebyrErEndret = gebyrService.rekalkulerGebyr(behandling)
return OppdatereInntektResponse(
inntekt = oppdatertInntekt,
beregnetGebyrErEndret = beregnetGebyrErEndret,
beregnetInntekter =
behandling.roller
.filter { it.ident == oppdatertInntekt?.ident?.verdi }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -297,11 +297,13 @@ class NotatOpplysningerService(
beregnetIlagtGebyr = it.beregnetIlagtGebyr,
beløpGebyrsats = it.beløpGebyrsats,
manueltOverstyrtGebyr =
it.manueltOverstyrtGebyr?.let {
if (it.erManueltOverstyrt) {
NotatGebyrRolleDto.NotatManueltOverstyrGebyrDto(
ilagtGebyr = it.ilagtGebyr,
ilagtGebyr = it.endeligIlagtGebyr,
begrunnelse = it.begrunnelse,
)
} else {
null
},
)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,18 +75,27 @@ import java.math.BigDecimal
import java.math.RoundingMode
import java.time.LocalDate

fun BeregnGebyrResultat.tilDto(rolle: Rolle) =
GebyrRolleDto(
fun BeregnGebyrResultat.tilDto(rolle: Rolle): GebyrRolleDto {
val erManueltOverstyrt = rolle.manueltOverstyrtGebyr?.overstyrGebyr == true

return GebyrRolleDto(
inntekt =
GebyrRolleDto.GebyrInntektDto(
skattepliktigInntekt = skattepliktigInntekt,
maksBarnetillegg = maksBarnetillegg,
),
manueltOverstyrtGebyr = rolle.manueltOverstyrtGebyr?.tilDto(),
beregnetIlagtGebyr = ilagtGebyr,
begrunnelse = if (erManueltOverstyrt) rolle.manueltOverstyrtGebyr?.begrunnelse else null,
endeligIlagtGebyr =
if (erManueltOverstyrt) {
rolle.manueltOverstyrtGebyr!!.ilagtGebyr == true
} else {
ilagtGebyr
},
beløpGebyrsats = beløpGebyrsats,
rolle = rolle.tilDto(),
)
}

fun Behandling.tilInntektberegningDto(rolle: Rolle): BeregnValgteInntekterGrunnlag =
BeregnValgteInntekterGrunnlag(
Expand Down
20 changes: 16 additions & 4 deletions src/main/kotlin/no/nav/bidrag/behandling/transformers/Dtomapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ import no.nav.bidrag.behandling.transformers.behandling.tilKanBehandlesINyLøsni
import no.nav.bidrag.behandling.transformers.behandling.toSivilstand
import no.nav.bidrag.behandling.transformers.beregning.ValiderBeregning
import no.nav.bidrag.behandling.transformers.boforhold.tilBostatusperiode
import no.nav.bidrag.behandling.transformers.gebyr.tilDto
import no.nav.bidrag.behandling.transformers.grunnlag.tilGrunnlagsreferanse
import no.nav.bidrag.behandling.transformers.samvær.tilDto
import no.nav.bidrag.behandling.transformers.underhold.tilStønadTilBarnetilsynDtos
Expand Down Expand Up @@ -410,6 +409,7 @@ class Dtomapper(
grunnlag
.find { Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN == it.type && it.erBearbeidet }
.konvertereData<Set<Bostatus>>()
?.sortedBy { it.periodeFom }
?.map {
val periode = ÅrMånedsperiode(it.periodeFom!!, it.periodeTom)
OpplysningerFraFolkeregisteretMedDetaljer(
Expand Down Expand Up @@ -632,7 +632,7 @@ class Dtomapper(
if (roller.filter { it.harGebyrsøknad }.isNotEmpty()) {
GebyrDto(
gebyrRoller =
roller.filter { it.harGebyrsøknad }.map { rolle ->
roller.sortedBy { it.rolletype }.filter { it.harGebyrsøknad }.map { rolle ->
vedtakGrunnlagMapper
.beregnGebyr(this, rolle)
.tilDto(rolle)
Expand Down Expand Up @@ -765,6 +765,7 @@ class Dtomapper(
erAktivert: Boolean = true,
): List<AndreVoksneIHusstandenDetaljerDto> {
val grunnlag = if (erAktivert) hentSisteAktiv() else hentSisteIkkeAktiv()
val behandling = firstOrNull()?.behandling ?: return emptyList()

val boforholdAndreVoksneIHusstanden =
grunnlag.find { it.type == Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN && !it.erBearbeidet }
Expand All @@ -773,9 +774,19 @@ class Dtomapper(
.konvertereData<List<RelatertPersonGrunnlagDto>>()
?.filter { it.relasjon != Familierelasjon.BARN }
?.filter {
it.fødselsdato == null ||
it.fødselsdato!!.withDayOfMonth(1).isBefore(behandling.virkningstidspunktEllerSøktFomDato.minusYears(18))
}?.filter {
it.borISammeHusstandDtoListe.any { p ->
val periodeBorHosBP = ÅrMånedsperiode(p.periodeFra!!, p.periodeTil?.plusMonths(1))
periodeBorHosBP.fom <= periode.fom && periodeBorHosBP.tilEllerMax() <= periode.tilEllerMax()
val periodeBorHosBP = ÅrMånedsperiode(p.periodeFra!!.withDayOfMonth(1), p.periodeTil?.withDayOfMonth(1)?.minusDays(1))
val periodeBPErInnenfor =
periodeBorHosBP.fom >= periode.fom &&
periodeBorHosBP.til != null &&
periode.til != null &&
periodeBorHosBP.tilEllerMax() <= periode.tilEllerMax()
val periodeBPLøpendeErInnenfor =
periodeBorHosBP.fom >= periode.fom && periodeBorHosBP.til == null && periode.til == null
periode.omsluttesAv(periodeBorHosBP) || periodeBPErInnenfor || periodeBPLøpendeErInnenfor
}
}?.map { it.tilAndreVoksneIHusstandenDetaljerDto(Saksnummer(boforholdAndreVoksneIHusstanden?.behandling?.saksnummer!!)) }
?.sorter() ?: emptyList()
Expand Down Expand Up @@ -824,6 +835,7 @@ class Dtomapper(
private fun List<Grunnlag>.tilPeriodeAndreVoksneIHusstanden(erAktivert: Boolean = true): Set<PeriodeAndreVoksneIHusstanden> =
find { Grunnlagsdatatype.BOFORHOLD_ANDRE_VOKSNE_I_HUSSTANDEN == it.type && it.erBearbeidet }
.konvertereData<Set<Bostatus>>()
?.sortedBy { it.periodeFom }
?.map {
val periode = ÅrMånedsperiode(it.periodeFom!!, it.periodeTom)
PeriodeAndreVoksneIHusstanden(
Expand Down
Loading

0 comments on commit ed25478

Please sign in to comment.