Skip to content

Commit

Permalink
Feature/nytt endepunkt hent vedtak for skyldner (#346)
Browse files Browse the repository at this point in the history
* Nytt endepunkt for å hente alle endringsvedtak for en stønad - barnebidrag- 18årsbidrag og oppfostringsbidrag

* Rydder litt

* Lagt til søknadsid i respons

* Transportklasser flyttet til bidrag-felles

* Endre respons dto for stønadsendring HentVedtakForStønadResponse

* Endre respons dto for stønadsendring HentVedtakForStønadResponse

* Endre respons dto for stønadsendring HentVedtakForStønadResponse

* Endre respons dto for stønadsendring HentVedtakForStønadResponse

* Fikset tester

* Ktlint fiks

---------

Co-authored-by: Ugur Alpay Cenar <[email protected]>
  • Loading branch information
rinnan17 and ugur93 authored Sep 20, 2024
1 parent f477f96 commit fcc1480
Show file tree
Hide file tree
Showing 8 changed files with 551 additions and 194 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
<token-support.version>3.2.0</token-support.version>

<!-- dependencies -->
<bidrag-felles.version>2024.09.10.152208</bidrag-felles.version>
<bidrag-felles.version>2024.09.17.154043</bidrag-felles.version>
<bidrag-tilgangskontroll.version>1.9.22</bidrag-tilgangskontroll.version>
<mockito-kotlin.version>5.3.1</mockito-kotlin.version>
<nimbus-jose-jwt.version>9.40</nimbus-jose-jwt.version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses
import io.swagger.v3.oas.annotations.security.SecurityRequirement
import jakarta.validation.Valid
import jakarta.validation.constraints.NotNull
import no.nav.bidrag.transport.behandling.vedtak.request.HentVedtakForStønadRequest
import no.nav.bidrag.transport.behandling.vedtak.request.OpprettVedtakRequestDto
import no.nav.bidrag.transport.behandling.vedtak.response.HentVedtakForStønadResponse
import no.nav.bidrag.transport.behandling.vedtak.response.OpprettVedtakResponseDto
import no.nav.bidrag.transport.behandling.vedtak.response.VedtakDto
import no.nav.bidrag.vedtak.SECURE_LOGGER
Expand Down Expand Up @@ -113,10 +115,36 @@ class VedtakController(private val vedtakService: VedtakService) {
return ResponseEntity(vedtakOppdatert, HttpStatus.OK)
}

@PostMapping(HENT_VEDTAK_FOR_SAK)
@Operation(security = [SecurityRequirement(name = "bearer-key")], summary = "Henter endringsvedtak for angitt sak, skyldner, kravhaver og type")
@ApiResponses(
value = [
ApiResponse(responseCode = "200", description = "Vedtak hentet"),
ApiResponse(responseCode = "400", description = "Feil opplysinger oppgitt", content = [Content(schema = Schema(hidden = true))]),
ApiResponse(
responseCode = "401",
description = "Sikkerhetstoken mangler, er utløpt, eller av andre årsaker ugyldig",
content = [Content(schema = Schema(hidden = true))],
),
ApiResponse(responseCode = "500", description = "Serverfeil", content = [Content(schema = Schema(hidden = true))]),
ApiResponse(responseCode = "503", description = "Tjeneste utilgjengelig", content = [Content(schema = Schema(hidden = true))]),
],
)
fun hentVedtakForSak(
@Valid @RequestBody
request: HentVedtakForStønadRequest,
): ResponseEntity<HentVedtakForStønadResponse>? {
SECURE_LOGGER.info("Følgende request for å hente vedtak for sak ble mottatt: ${tilJson(request)}")
val respons = vedtakService.hentEndringsvedtakForStønad(request)
SECURE_LOGGER.info("Følgende endringsvedtak ble hentet for request: $request")
return ResponseEntity(respons, HttpStatus.OK)
}

companion object {
const val OPPRETT_VEDTAK = "/vedtak/"
const val HENT_VEDTAK = "/vedtak/{vedtaksid}"
const val OPPDATER_VEDTAK = "/vedtak/oppdater/{vedtaksid}"
const val HENT_VEDTAK_FOR_SAK = "/vedtak/hent-vedtak"
private val LOGGER = LoggerFactory.getLogger(VedtakController::class.java)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,10 @@ interface StønadsendringRepository : CrudRepository<Stønadsendring, Int?> {
"select st from Stønadsendring st where st.vedtak.id = :vedtaksid order by st.id",
)
fun hentAlleStønadsendringerForVedtak(vedtaksid: Int): List<Stønadsendring>

@Query(
"select st from Stønadsendring st where st.sak = :saksnr and st.type = :type and st.skyldner = :skyldner and st.kravhaver = :kravhaver " +
"order by st.vedtak.id",
)
fun hentVedtakForStønad(saksnr: String, type: String, skyldner: String, kravhaver: String): List<Stønadsendring>
}
60 changes: 24 additions & 36 deletions src/main/kotlin/no/nav/bidrag/vedtak/service/PersistenceService.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.bidrag.vedtak.service

import io.micrometer.core.annotation.Timed
import no.nav.bidrag.transport.behandling.vedtak.request.HentVedtakForStønadRequest
import no.nav.bidrag.vedtak.SECURE_LOGGER
import no.nav.bidrag.vedtak.bo.EngangsbeløpGrunnlagBo
import no.nav.bidrag.vedtak.bo.PeriodeGrunnlagBo
Expand Down Expand Up @@ -40,38 +41,30 @@ class PersistenceService(
) {

@Timed
fun opprettVedtak(vedtak: Vedtak): Vedtak {
return vedtakRepository.save(vedtak)
}
fun opprettVedtak(vedtak: Vedtak): Vedtak = vedtakRepository.save(vedtak)

@Timed
fun hentVedtak(id: Int): Vedtak {
return vedtakRepository.findById(id).orElseThrow { IllegalArgumentException(String.format("Fant ikke vedtak med id %d i databasen", id)) }
}
fun hentVedtak(id: Int): Vedtak =
vedtakRepository.findById(id).orElseThrow { IllegalArgumentException(String.format("Fant ikke vedtak med id %d i databasen", id)) }

fun opprettStønadsendring(stønadsendring: Stønadsendring): Stønadsendring {
vedtakRepository.findById(stønadsendring.vedtak.id)
.orElseThrow { IllegalArgumentException(String.format("Fant ikke vedtak med id %d i databasen", stønadsendring.vedtak.id)) }
return stønadsendringRepository.save(stønadsendring)
}

fun hentAlleStønadsendringerForVedtak(id: Int): List<Stønadsendring> {
return stønadsendringRepository.hentAlleStønadsendringerForVedtak(id)
}
fun hentAlleStønadsendringerForVedtak(id: Int): List<Stønadsendring> = stønadsendringRepository.hentAlleStønadsendringerForVedtak(id)

fun opprettPeriode(periode: Periode): Periode {
stønadsendringRepository.findById(periode.stønadsendring.id)
.orElseThrow { IllegalArgumentException(String.format("Fant ikke stønadsendring med id %d i databasen", periode.stønadsendring.id)) }
return periodeRepository.save(periode)
}

fun hentAllePerioderForStønadsendring(id: Int): List<Periode> {
return periodeRepository.hentAllePerioderForStønadsendring(id)
}
fun hentAllePerioderForStønadsendring(id: Int): List<Periode> = periodeRepository.hentAllePerioderForStønadsendring(id)

fun hentAlleGrunnlagForStønadsendring(stønadsendringId: Int): List<StønadsendringGrunnlag> {
return stønadsendringGrunnlagRepository.hentAlleGrunnlagForStønadsendring(stønadsendringId)
}
fun hentAlleGrunnlagForStønadsendring(stønadsendringId: Int): List<StønadsendringGrunnlag> =
stønadsendringGrunnlagRepository.hentAlleGrunnlagForStønadsendring(stønadsendringId)

fun opprettGrunnlag(grunnlag: Grunnlag): Grunnlag {
vedtakRepository.findById(grunnlag.vedtak.id)
Expand All @@ -85,13 +78,9 @@ class PersistenceService(
return grunnlag
}

fun hentAlleGrunnlagForVedtak(id: Int): List<Grunnlag> {
return grunnlagRepository.hentAlleGrunnlagForVedtak(id)
}
fun hentAlleGrunnlagForVedtak(id: Int): List<Grunnlag> = grunnlagRepository.hentAlleGrunnlagForVedtak(id)

fun slettAlleGrunnlagForVedtak(vedtakId: Int): Int {
return grunnlagRepository.slettAlleGrunnlagForVedtak(vedtakId)
}
fun slettAlleGrunnlagForVedtak(vedtakId: Int): Int = grunnlagRepository.slettAlleGrunnlagForVedtak(vedtakId)

fun opprettStønadsendringGrunnlag(stønadsendringGrunnlagBo: StønadsendringGrunnlagBo): StønadsendringGrunnlag {
val eksisterendeStønadsendring = stønadsendringRepository.findById(stønadsendringGrunnlagBo.stønadsendringsid)
Expand All @@ -117,19 +106,15 @@ class PersistenceService(
return periodeGrunnlagRepository.save(nyttPeriodeGrunnlag)
}

fun hentAlleGrunnlagForPeriode(periodeId: Int): List<PeriodeGrunnlag> {
return periodeGrunnlagRepository.hentAlleGrunnlagForPeriode(periodeId)
}
fun hentAlleGrunnlagForPeriode(periodeId: Int): List<PeriodeGrunnlag> = periodeGrunnlagRepository.hentAlleGrunnlagForPeriode(periodeId)

fun opprettEngangsbeløp(engangsbeløp: Engangsbeløp): Engangsbeløp {
vedtakRepository.findById(engangsbeløp.vedtak.id)
.orElseThrow { IllegalArgumentException(String.format("Fant ikke vedtak med id %d i databasen", engangsbeløp.vedtak.id)) }
return engangsbeløpRepository.save(engangsbeløp)
}

fun hentAlleEngangsbeløpForVedtak(id: Int): List<Engangsbeløp> {
return engangsbeløpRepository.hentAlleEngangsbeløpForVedtak(id)
}
fun hentAlleEngangsbeløpForVedtak(id: Int): List<Engangsbeløp> = engangsbeløpRepository.hentAlleEngangsbeløpForVedtak(id)

fun opprettEngangsbeløpGrunnlag(engangsbeløpGrunnlagBo: EngangsbeløpGrunnlagBo): EngangsbeløpGrunnlag {
val eksisterendeEngangsbeløp = engangsbeløpRepository.findById(engangsbeløpGrunnlagBo.engangsbeløpsid)
Expand All @@ -145,21 +130,24 @@ class PersistenceService(
return engangsbeløpGrunnlagRepository.save(nyttEngangsbeløpGrunnlag)
}

fun hentAlleGrunnlagForEngangsbeløp(engangsbeløpId: Int): List<EngangsbeløpGrunnlag> {
return engangsbeløpGrunnlagRepository.hentAlleGrunnlagForEngangsbeløp(engangsbeløpId)
}
fun hentAlleGrunnlagForEngangsbeløp(engangsbeløpId: Int): List<EngangsbeløpGrunnlag> =
engangsbeløpGrunnlagRepository.hentAlleGrunnlagForEngangsbeløp(engangsbeløpId)

fun opprettBehandlingsreferanse(behandlingsreferanse: Behandlingsreferanse): Behandlingsreferanse {
vedtakRepository.findById(behandlingsreferanse.vedtak.id)
.orElseThrow { IllegalArgumentException(String.format("Fant ikke vedtak med id %d i databasen", behandlingsreferanse.vedtak.id)) }
return behandlingsreferanseRepository.save(behandlingsreferanse)
}

fun hentAlleBehandlingsreferanserForVedtak(id: Int): List<Behandlingsreferanse> {
return behandlingsreferanseRepository.hentAlleBehandlingsreferanserForVedtak(id)
}
fun hentAlleBehandlingsreferanserForVedtak(id: Int): List<Behandlingsreferanse> =
behandlingsreferanseRepository.hentAlleBehandlingsreferanserForVedtak(id)

fun referanseErUnik(vedtaksid: Int, referanse: String): Boolean {
return engangsbeløpRepository.sjekkReferanse(vedtaksid, referanse).isNullOrBlank()
}
fun referanseErUnik(vedtaksid: Int, referanse: String): Boolean = engangsbeløpRepository.sjekkReferanse(vedtaksid, referanse).isNullOrBlank()

fun hentStønadsendringForStønad(request: HentVedtakForStønadRequest): List<Stønadsendring> = stønadsendringRepository.hentVedtakForStønad(
request.sak.toString(),
request.type.toString(),
request.skyldner.verdi,
request.kravhaver.verdi,
)
}
94 changes: 57 additions & 37 deletions src/main/kotlin/no/nav/bidrag/vedtak/service/VedtakService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import no.nav.bidrag.domene.sak.Saksnummer
import no.nav.bidrag.domene.tid.ÅrMånedsperiode
import no.nav.bidrag.domene.util.trimToNull
import no.nav.bidrag.transport.behandling.felles.grunnlag.GrunnlagDto
import no.nav.bidrag.transport.behandling.vedtak.request.HentVedtakForStønadRequest
import no.nav.bidrag.transport.behandling.vedtak.request.OpprettBehandlingsreferanseRequestDto
import no.nav.bidrag.transport.behandling.vedtak.request.OpprettEngangsbeløpRequestDto
import no.nav.bidrag.transport.behandling.vedtak.request.OpprettGrunnlagRequestDto
Expand All @@ -25,9 +26,11 @@ import no.nav.bidrag.transport.behandling.vedtak.request.OpprettStønadsendringR
import no.nav.bidrag.transport.behandling.vedtak.request.OpprettVedtakRequestDto
import no.nav.bidrag.transport.behandling.vedtak.response.BehandlingsreferanseDto
import no.nav.bidrag.transport.behandling.vedtak.response.EngangsbeløpDto
import no.nav.bidrag.transport.behandling.vedtak.response.HentVedtakForStønadResponse
import no.nav.bidrag.transport.behandling.vedtak.response.OpprettVedtakResponseDto
import no.nav.bidrag.transport.behandling.vedtak.response.StønadsendringDto
import no.nav.bidrag.transport.behandling.vedtak.response.VedtakDto
import no.nav.bidrag.transport.behandling.vedtak.response.VedtakForStønad
import no.nav.bidrag.transport.behandling.vedtak.response.VedtakPeriodeDto
import no.nav.bidrag.vedtak.SECURE_LOGGER
import no.nav.bidrag.vedtak.bo.EngangsbeløpGrunnlagBo
Expand Down Expand Up @@ -226,58 +229,51 @@ class VedtakService(val persistenceService: PersistenceService, val hendelserSer
innkrevingUtsattTilDato = vedtak.innkrevingUtsattTilDato,
fastsattILand = vedtak.fastsattILand,
grunnlagListe = grunnlagDtoListe,
stønadsendringListe = hentStønadsendringerTilVedtak(stønadsendringListe),
stønadsendringListe = stønadsendringListe.map { it.tilDto() },
engangsbeløpListe = hentEngangsbeløpTilVedtak(engangsbeløpListe),
behandlingsreferanseListe = behandlingsreferanseResponseListe,
)
}

private fun hentStønadsendringerTilVedtak(stønadsendringListe: List<Stønadsendring>): List<StønadsendringDto> {
val stønadsendringDtoListe = ArrayList<StønadsendringDto>()
stønadsendringListe.forEach { stønadsendring ->
val grunnlagReferanseResponseListe = ArrayList<String>()
val stønadsendringGrunnlagListe = persistenceService.hentAlleGrunnlagForStønadsendring(stønadsendring.id)
stønadsendringGrunnlagListe.forEach {
val grunnlag = persistenceService.hentGrunnlag(it.grunnlag.id)
grunnlagReferanseResponseListe.add(grunnlag.referanse)
}
val periodeListe = persistenceService.hentAllePerioderForStønadsendring(stønadsendring.id)
stønadsendringDtoListe.add(
StønadsendringDto(
type = Stønadstype.valueOf(stønadsendring.type),
sak = Saksnummer(stønadsendring.sak),
skyldner = Personident(stønadsendring.skyldner),
kravhaver = Personident(stønadsendring.kravhaver),
mottaker = Personident(stønadsendring.mottaker),
førsteIndeksreguleringsår = stønadsendring.førsteIndeksreguleringsår,
innkreving = Innkrevingstype.valueOf(stønadsendring.innkreving),
beslutning = Beslutningstype.valueOf(stønadsendring.beslutning),
omgjørVedtakId = stønadsendring.omgjørVedtakId,
eksternReferanse = stønadsendring.eksternReferanse,
grunnlagReferanseListe = grunnlagReferanseResponseListe,
periodeListe = hentPerioderTilVedtak(periodeListe),
),
)
}
return stønadsendringDtoListe
private fun Stønadsendring.tilDto(): StønadsendringDto {
val grunnlagReferanseResponseListe = ArrayList<String>()
val stønadsendringGrunnlagListe = persistenceService.hentAlleGrunnlagForStønadsendring(id)
stønadsendringGrunnlagListe.forEach {
val grunnlag = persistenceService.hentGrunnlag(it.grunnlag.id)
grunnlagReferanseResponseListe.add(grunnlag.referanse)
}
val periodeListe = persistenceService.hentAllePerioderForStønadsendring(id)
return StønadsendringDto(
type = Stønadstype.valueOf(type),
sak = Saksnummer(sak),
skyldner = Personident(skyldner),
kravhaver = Personident(kravhaver),
mottaker = Personident(mottaker),
førsteIndeksreguleringsår = førsteIndeksreguleringsår,
innkreving = Innkrevingstype.valueOf(innkreving),
beslutning = Beslutningstype.valueOf(beslutning),
omgjørVedtakId = omgjørVedtakId,
eksternReferanse = eksternReferanse,
grunnlagReferanseListe = grunnlagReferanseResponseListe,
periodeListe = hentPerioderTilVedtak(periodeListe),
)
}

private fun hentPerioderTilVedtak(periodeListe: List<Periode>): List<VedtakPeriodeDto> {
val periodeResponseListe = ArrayList<VedtakPeriodeDto>()
periodeListe.forEach { dto ->
periodeListe.forEach { periode ->
val grunnlagReferanseResponseListe = ArrayList<String>()
val periodeGrunnlagListe = persistenceService.hentAlleGrunnlagForPeriode(dto.id)
val periodeGrunnlagListe = persistenceService.hentAlleGrunnlagForPeriode(periode.id)
periodeGrunnlagListe.forEach {
val grunnlag = persistenceService.hentGrunnlag(it.grunnlag.id)
grunnlagReferanseResponseListe.add(grunnlag.referanse)
}
periodeResponseListe.add(
VedtakPeriodeDto(
periode = ÅrMånedsperiode(dto.fom, dto.til),
beløp = dto.beløp,
valutakode = dto.valutakode?.trimEnd(),
resultatkode = dto.resultatkode,
delytelseId = dto.delytelseId,
periode = ÅrMånedsperiode(periode.fom, periode.til),
beløp = periode.beløp,
valutakode = periode.valutakode?.trimEnd(),
resultatkode = periode.resultatkode,
delytelseId = periode.delytelseId,
grunnlagReferanseListe = grunnlagReferanseResponseListe,
),
)
Expand Down Expand Up @@ -340,6 +336,30 @@ class VedtakService(val persistenceService: PersistenceService, val hendelserSer
return vedtakId
}

// Hent alle endringsvedtak for stønad
fun hentEndringsvedtakForStønad(request: HentVedtakForStønadRequest): HentVedtakForStønadResponse {
val stønadsendringer = persistenceService.hentStønadsendringForStønad(request)
return HentVedtakForStønadResponse(
stønadsendringer.filter {
it.innkreving == Innkrevingstype.MED_INNKREVING.toString() &&
it.beslutning == Beslutningstype.ENDRING.toString()
}
.map { stønadsendring ->
val vedtak = stønadsendring.vedtak
VedtakForStønad(
vedtaksid = vedtak.id.toLong(),
vedtakstidspunkt = vedtak.vedtakstidspunkt,
type = Vedtakstype.valueOf(vedtak.type),
stønadsendring = stønadsendring.tilDto(),
behandlingsreferanser = persistenceService.hentAlleBehandlingsreferanserForVedtak(vedtak.id).map {
BehandlingsreferanseDto(BehandlingsrefKilde.valueOf(it.kilde), it.referanse)
},
kilde = Vedtakskilde.valueOf(vedtak.kilde),
)
},
)
}

private fun alleVedtaksdataMatcher(vedtakId: Int, vedtakRequest: OpprettVedtakRequestDto): Boolean = vedtakMatcher(vedtakId, vedtakRequest) &&
stønadsendringerOgPerioderMatcher(vedtakId, vedtakRequest) &&
engangsbeløpMatcher(vedtakId, vedtakRequest) &&
Expand Down
Loading

0 comments on commit fcc1480

Please sign in to comment.