From 33dd5c2853ae124925080395a55b69f48753096f Mon Sep 17 00:00:00 2001 From: tnarland <47184872+tnarland@users.noreply.github.com> Date: Wed, 8 Nov 2023 10:15:09 +0100 Subject: [PATCH] =?UTF-8?q?Feature=20foresp=C3=B8rsel=20ang.=20sending=20a?= =?UTF-8?q?v=20relaterte=20saker=20i=20infotrygd=20ogs=C3=A5=20(#413)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender med barnetrygdperioder fra relaterte saker på ca. samme måte som vi gjør i ba-sak, etter feature request fra pensjon --- .../repository/St\303\270nadRepository.kt" | 10 ++++- .../ba/infotrygd/service/BarnetrygdService.kt | 45 ++++++++++++++----- .../service/BarnetrygdServiceTest.kt | 7 +-- 3 files changed, 47 insertions(+), 15 deletions(-) diff --git "a/src/main/kotlin/no/nav/familie/ba/infotrygd/repository/St\303\270nadRepository.kt" "b/src/main/kotlin/no/nav/familie/ba/infotrygd/repository/St\303\270nadRepository.kt" index 68535fce..7315a2b1 100644 --- "a/src/main/kotlin/no/nav/familie/ba/infotrygd/repository/St\303\270nadRepository.kt" +++ "b/src/main/kotlin/no/nav/familie/ba/infotrygd/repository/St\303\270nadRepository.kt" @@ -26,10 +26,16 @@ interface StønadRepository : JpaRepository { INNER JOIN Person p ON (s.personKey = p.personKey and s.region = p.region) - WHERE p.fnr IN :fnr + WHERE p.fnr = :fnr AND s.antallBarn > 0 + AND EXISTS (SELECT u FROM Utbetaling u + WHERE u.personKey = s.personKey + AND u.startUtbetalingMåned = s.iverksattFom + AND u.virksomFom = s.virkningFom + AND u.utbetalingstype = 'M' + AND (u.utbetalingTom = '000000' or CAST(substring(u.utbetalingTom, 3, 4) as integer) >= :år)) """) - fun findTrunkertStønadByFnr(fnr: List): List + fun findTrunkertStønadMedUtbetalingÅrByFnr(fnr: FoedselsNr, år: Int): List @Query("SELECT new no.nav.familie.ba.infotrygd.model.dl1.TrunkertStønad(s.id, s.personKey, s.fnr, s.sakNr, s.saksblokk, s.status, s.region, s.virkningFom, s.opphørtFom, s.iverksattFom, s.antallBarn, '') FROM Stønad s " + "WHERE (s.opphørtFom='000000' or CAST(substring(s.opphørtFom, 3, 4) as integer) >= :år) " + diff --git a/src/main/kotlin/no/nav/familie/ba/infotrygd/service/BarnetrygdService.kt b/src/main/kotlin/no/nav/familie/ba/infotrygd/service/BarnetrygdService.kt index 8a644f88..0e267eea 100644 --- a/src/main/kotlin/no/nav/familie/ba/infotrygd/service/BarnetrygdService.kt +++ b/src/main/kotlin/no/nav/familie/ba/infotrygd/service/BarnetrygdService.kt @@ -103,8 +103,7 @@ class BarnetrygdService( opphørtIver = stønad.opphørtIver, opphørtFom = stønad.opphørtFom, opphørsgrunn = stønad.opphørsgrunn, - barn = barnRepository.findBarnByPersonkey(stønad.personKey).filter { it.stønadstype.isNullOrBlank() || it.stønadstype?.trim() !in listOf("N", "FJ", "IN") } - .map { it.toBarnDto() }, + barn = hentBarnMedGyldigStønadstypeTilknyttetPerson(stønad.personKey).map { it.toBarnDto() }, delytelse = vedtakRepository.hentVedtak(stønad.fnr.asString, stønad.sakNr.trim().toLong(), stønad.saksblokk) .sortedBy { it.vedtakId } .lastOrNull()?.delytelse?.sortedBy { it.id.linjeId }?.map { it.toDelytelseDto() } ?: emptyList(), @@ -113,6 +112,14 @@ class BarnetrygdService( ) } + private fun hentBarnMedGyldigStønadstypeTilknyttetPerson(personKey: Long) = + barnRepository.findBarnByPersonkey(personKey).filter { it.harGyldigStønadstype } + + private val Barn.harGyldigStønadstype + get() = + stønadstype.isNullOrBlank() || stønadstype?.trim() !in listOf("N", "FJ", "IN") + + private fun hentMottakerNummer(stønad: Stønad): Long? { val mottakerNummer = personRepository.findMottakerNummerByPersonkey(stønad.personKey) return if (mottakerNummer == 0L) null else mottakerNummer @@ -162,19 +169,37 @@ class BarnetrygdService( brukerFnr: FoedselsNr, fraDato: YearMonth ): List { - val barnetrygdStønader = stonadRepository.findTrunkertStønadByFnr(listOf(brukerFnr)) + val barnetrygdStønader = stonadRepository.findTrunkertStønadMedUtbetalingÅrByFnr(brukerFnr, fraDato.year) .filter { erRelevantStønadForPensjon(it) } .filter { filtrerStønaderSomErFeilregistrert(it) } - val perioder = konverterTilDtoForPensjon(barnetrygdStønader, fraDato.year).filter { - it.stønadTom.isSameOrAfter(fraDato) - } + val perioder = konverterTilDtoForPensjon(barnetrygdStønader, fraDato) if (perioder.isEmpty()) { return emptyList() } - return listOf( + // Sjekk om det finnes relaterte saker, dvs om barna finnes i andre stønader + val barna = barnetrygdStønader.flatMap { + hentBarnMedGyldigStønadstypeTilknyttetPerson(it.personKey) + } + + val barnetrygdFraRelaterteSaker = barnRepository.findBarnByFnrList(barna.map { it.barnFnr }) + .filter { it.fnr != brukerFnr && it.harGyldigStønadstype } + .map { it.fnr }.distinct() + .mapNotNull { relatertBrukerFnr -> + BarnetrygdTilPensjon( + fnr = relatertBrukerFnr.asString, + barnetrygdPerioder = stonadRepository.findTrunkertStønadMedUtbetalingÅrByFnr(relatertBrukerFnr, fraDato.year) + .filter { erRelevantStønadForPensjon(it) } + .filter { filtrerStønaderSomErFeilregistrert(it) } + .let { relaterteBarnetrygdStønader -> + konverterTilDtoForPensjon(relaterteBarnetrygdStønader, fraDato) + } + ).takeIf { it.barnetrygdPerioder.isNotEmpty() } + } + + return barnetrygdFraRelaterteSaker.plus( BarnetrygdTilPensjon( fnr = brukerFnr.asString, barnetrygdPerioder = perioder @@ -441,7 +466,7 @@ class BarnetrygdService( private fun konverterTilDtoForPensjon( barnetrygdStønader: List, - år: Int + fraDato: YearMonth ): List { if (barnetrygdStønader.isEmpty()) { return emptyList() @@ -464,7 +489,7 @@ class BarnetrygdService( stønadFom = utbetaling.fom()!!, stønadTom = utbetaling.tom() ?: YearMonth.from(LocalDate.MAX), personIdent = utbetaling.fnr.asString, - delingsprosentYtelse = ytelseProsent(it, undervalg, år), + delingsprosentYtelse = ytelseProsent(it, undervalg, fraDato.year), sakstypeEkstern = when (undervalg) { "EU", "ME" -> EØS else -> NASJONAL @@ -493,7 +518,7 @@ class BarnetrygdService( .flatMap(::slåSammenSammenhengende) ) - return perioder + return perioder.filter { it.stønadTom.isSameOrAfter(fraDato) } } private fun delingsprosent(stønad: TrunkertStønad, år: Int): SkatteetatenPeriode.Delingsprosent { diff --git a/src/test/kotlin/no/nav/familie/ba/infotrygd/service/BarnetrygdServiceTest.kt b/src/test/kotlin/no/nav/familie/ba/infotrygd/service/BarnetrygdServiceTest.kt index 3bf4f5e1..256c485d 100644 --- a/src/test/kotlin/no/nav/familie/ba/infotrygd/service/BarnetrygdServiceTest.kt +++ b/src/test/kotlin/no/nav/familie/ba/infotrygd/service/BarnetrygdServiceTest.kt @@ -185,7 +185,7 @@ internal class BarnetrygdServiceTest { @Test fun `finn barnetrygd for pensjon - finner løpende småbarnstillegg, og løpende utvidet fra og med dato gitt av foregående periode`() { val person = settOppLøpendeUtvidetBarnetrygd(MANUELT_BEREGNET_STATUS) - leggTilUtgåttUtvidetBarnetrygdSak(person) //2019-05 - 2020-04 + leggTilUtgåttUtvidetBarnetrygdSak(person, opphørtFom = YearMonth.now().format(DateTimeFormatter.ofPattern("MMyyyy"))) val response = barnetrygdService.finnBarnetrygdForPensjon(person.fnr, YearMonth.now()).single() @@ -788,12 +788,13 @@ internal class BarnetrygdServiceTest { beløp: Double? = null, stønadStatus: String = "0", iverksattFom: String = (999999 - 201905).toString(), - virkningFom: String = iverksattFom) { + virkningFom: String = iverksattFom, + opphørtFom: String = "042020") { val opphørtStønad = stonadRepository.save( TestData.stønad( person, status = stønadStatus, - opphørtFom = "042020", + opphørtFom = opphørtFom, iverksattFom = iverksattFom, virkningFom = virkningFom )