Skip to content

Commit

Permalink
Send varselbrev dersom bruker har 10% eller mer endring i inntekt (#2765
Browse files Browse the repository at this point in the history
)

* Send varselbrev dersom bruker har 10% eller mer endring i inntekt
* Fjerner brevtype da den er deprecated fordi det er lagt opp til at man skal sette tittel manuelt.
Lagt til enhetstest som tester at brev som skal sendes av iverksett inneholder riktige verdier.
* Kommentar på at det ikke er sikkert brev skal sendes. Det avhenger av avklaringer og testing når inntekt for selvstendig næringsdrivende er tilgjengelige.
  • Loading branch information
olekvernberg authored Feb 4, 2025
1 parent cb0cb7e commit 28d828a
Show file tree
Hide file tree
Showing 5 changed files with 201 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package no.nav.familie.ef.sak.selvstendig

import no.nav.familie.ef.sak.arbeidsfordeling.ArbeidsfordelingService
import no.nav.familie.ef.sak.behandling.BehandlingService
import no.nav.familie.ef.sak.behandling.Saksbehandling
import no.nav.familie.ef.sak.brev.BrevClient
import no.nav.familie.ef.sak.brev.FamilieDokumentClient
import no.nav.familie.ef.sak.brev.VedtaksbrevService
import no.nav.familie.ef.sak.felles.util.norskFormat
import no.nav.familie.ef.sak.infrastruktur.config.ObjectMapperProvider.objectMapper
import no.nav.familie.ef.sak.iverksett.IverksettClient
import no.nav.familie.ef.sak.opplysninger.personopplysninger.PersonopplysningerService
import no.nav.familie.kontrakter.ef.felles.FrittståendeBrevDto
import no.nav.familie.kontrakter.ef.iverksett.Brevmottaker
import org.springframework.stereotype.Service
import java.time.LocalDate

@Service
class NæringsinntektKontrollBrev(
val behandlingService: BehandlingService,
val personopplysningerService: PersonopplysningerService,
val arbeidsfordelingService: ArbeidsfordelingService,
val brevClient: BrevClient,
val familieDokumentClient: FamilieDokumentClient,
val iverksettClient: IverksettClient,
) {
fun sendBrev(næringsinntektDataForBeregning: NæringsinntektDataForBeregning) {
val saksbehandling = behandlingService.hentSaksbehandling(næringsinntektDataForBeregning.behandlingId)
val journalførendeEnhet = arbeidsfordelingService.hentNavEnhetIdEllerBrukMaskinellEnhetHvisNull(saksbehandling.ident)
val brevPdf = genererVarselbrevInntekt(næringsinntektDataForBeregning)
val varselbrevInntektDto =
FrittståendeBrevDto(
personIdent = saksbehandling.ident,
eksternFagsakId = saksbehandling.eksternFagsakId,
stønadType = saksbehandling.stønadstype,
tittel = "Inntekt endret for selvstendig næringsdrivende",
fil = brevPdf,
journalførendeEnhet = journalførendeEnhet,
saksbehandlerIdent = "VL",
mottakere = lagBrevMottaker(saksbehandling),
)
iverksettClient.sendFrittståendeBrev(frittståendeBrevDto = varselbrevInntektDto)
}

fun genererVarselbrevInntekt(
ringsinntektDataForBeregning: NæringsinntektDataForBeregning,
): ByteArray {
val varselbrevEndretInntekt =
VarselbrevEndretInntekt(
lagFlettefelt(næringsinntektDataForBeregning.personIdent, næringsinntektDataForBeregning.forventetInntektIFjor),
)

val html =
brevClient
.genererHtml(
brevmal = "varselbrevInntekt",
saksbehandlersignatur = "Vedtaksløsningen",
saksbehandlerBrevrequest = objectMapper.valueToTree(varselbrevEndretInntekt),
enhet = "NAV Arbeid og ytelser",
skjulBeslutterSignatur = true,
).replace(VedtaksbrevService.BESLUTTER_VEDTAKSDATO_PLACEHOLDER, LocalDate.now().norskFormat())
return familieDokumentClient.genererPdfFraHtml(html)
}

private fun lagFlettefelt(
personIdent: String,
forventetInntekt: Int,
): Flettefelter {
val visningsNavn = personopplysningerService.hentGjeldeneNavn(listOf(personIdent)).getValue(personIdent)
val navnOgIdentFlettefelt = Flettefelter(navn = listOf(visningsNavn), fodselsnummer = listOf(personIdent), forventetInntekt = listOf(forventetInntekt))
return navnOgIdentFlettefelt
}

private fun lagBrevMottaker(saksbehandling: Saksbehandling) =
listOf(
Brevmottaker(
ident = "VL",
navn = personopplysningerService.hentGjeldeneNavn(listOf(saksbehandling.ident)).getValue(saksbehandling.ident),
mottakerRolle = Brevmottaker.MottakerRolle.BRUKER,
identType = Brevmottaker.IdentType.PERSONIDENT,
),
)
}

data class VarselbrevEndretInntekt(
val flettefelter: Flettefelter,
)

data class Flettefelter(
val navn: List<String>,
val fodselsnummer: List<String>,
val forventetInntekt: List<Int>,
)
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class NæringsinntektKontrollService(
valringsinntektDataForBeregningService: NæringsinntektDataForBeregningService,
valringsinntektBrukernotifikasjonService: NæringsinntektBrukernotifikasjonService,
valringsinntektNotatService: NæringsinntektNotatService,
valringsinntektKontrollBrev: NæringsinntektKontrollBrev,
val taskService: TaskService,
) {
private val secureLogger = LoggerFactory.getLogger("secureLogger")
Expand Down Expand Up @@ -57,6 +58,7 @@ class NæringsinntektKontrollService(
giVarselOmNyVurderingAvInntekt(næringsinntektDataForBeregning.behandlingId, næringsinntektDataForBeregning.personIdent, årstallIFjor)
val oppgaveMedUtsattFrist = næringsinntektDataForBeregning.oppgave.copy(fristFerdigstillelse = LocalDate.of(årstallIFjor + 2, 1, 11).toString())
oppgaveService.oppdaterOppgave(oppgaveMedUtsattFrist)
næringsinntektKontrollBrev.sendBrev(næringsinntektDataForBeregning) // Vurderes om skal tas i bruk eller ikke høst 2025. Favro: NAV-24146
} else {
giBeskjedOmKontrollertInntektVedLøpendeOvergangsstønad(næringsinntektDataForBeregning.behandlingId, næringsinntektDataForBeregning.personIdent, årstallIFjor)
val avsluttOppgaveMedOppdatertBeskrivelse = næringsinntektDataForBeregning.oppgave.copy(beskrivelse = næringsinntektDataForBeregning.oppgave.beskrivelse + "\nAutomatisk avsluttet oppgave: Ingen endring i inntekt.", status = StatusEnum.FERDIGSTILT)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,15 +159,15 @@ class PdlClientConfig {
const val ANNEN_FORELDER_FNR = "17097926735"
const val FNR_PÅ_ADRESSE_SØK = "01012067050"

fun lagPersonKort(it: String) =
fun lagPersonKort(fornavn: String = "Fornavn") =
PdlPersonKort(
listOf(
Adressebeskyttelse(
gradering = AdressebeskyttelseGradering.UGRADERT,
metadata = metadataGjeldende,
),
),
listOf(lagNavn(fornavn = it)),
listOf(lagNavn(fornavn = fornavn)),
emptyList(),
)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package no.nav.familie.ef.sak.selvstendig

import io.mockk.every
import io.mockk.just
import io.mockk.runs
import io.mockk.slot
import no.nav.familie.ef.sak.OppslagSpringRunnerTest
import no.nav.familie.ef.sak.behandling.BehandlingRepository
import no.nav.familie.ef.sak.beregning.Grunnbeløpsperioder
import no.nav.familie.ef.sak.fagsak.domain.Fagsak
import no.nav.familie.ef.sak.fagsak.domain.PersonIdent
import no.nav.familie.ef.sak.iverksett.IverksettClient
import no.nav.familie.ef.sak.repository.behandling
import no.nav.familie.ef.sak.repository.fagsak
import no.nav.familie.ef.sak.tilkjentytelse.TilkjentYtelseRepository
import no.nav.familie.ef.sak.økonomi.lagAndelTilkjentYtelse
import no.nav.familie.ef.sak.økonomi.lagTilkjentYtelse
import no.nav.familie.kontrakter.ef.felles.FrittståendeBrevDto
import no.nav.familie.kontrakter.ef.iverksett.Brevmottaker
import no.nav.familie.kontrakter.felles.ef.StønadType
import no.nav.familie.kontrakter.felles.oppgave.IdentGruppe
import no.nav.familie.kontrakter.felles.oppgave.OppgaveIdentV2
import org.assertj.core.api.Assertions
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import java.time.LocalDate

class NæringsinntektKontrollBrevTest : OppslagSpringRunnerTest() {
@Autowired
private lateinit var næringsinntektKontrollBrev: NæringsinntektKontrollBrev

@Autowired
private lateinit var behandlingRepository: BehandlingRepository

@Autowired
private lateinit var tilkjentYtelseRepository: TilkjentYtelseRepository

@Autowired
private lateinit var iverksettClient: IverksettClient

private val frittståendeBrevSlot = slot<FrittståendeBrevDto>()

@Test
fun `Send varselbrev til selvstendig næringsdrivende med 10 prosent endring eller mer`() {
every {
iverksettClient.sendFrittståendeBrev(capture(frittståendeBrevSlot))
} just runs

val oppgave = lagTestOppgave()
val personIdent = "01010199999"
val fagsak = testoppsettService.lagreFagsak(fagsak(identer = setOf(PersonIdent(personIdent))))

val behandling = behandlingRepository.insert(behandling(fagsak))

val aty =
lagAndelTilkjentYtelse(
10000,
LocalDate.of(2025, 1, 1),
LocalDate.of(2025, 12, 31),
kildeBehandlingId = behandling.id,
)
val ty = lagTilkjentYtelse(listOf(aty), behandlingId = behandling.id, grunnbeløpsmåned = Grunnbeløpsperioder.forrigeGrunnbeløp.periode.fom)
tilkjentYtelseRepository.insert(ty)

val næringsinntektForBeregning = NæringsinntektDataForBeregning(oppgave, personIdent, fagsak, behandling.id, ty, 100_000, 100_000, 150_000)
næringsinntektKontrollBrev.sendBrev(næringsinntektForBeregning)

Assertions.assertThat(frittståendeBrevSlot.captured.personIdent).isEqualTo(forventetFrittståendeBrevDto(fagsak).personIdent)
Assertions.assertThat(frittståendeBrevSlot.captured.tittel).isEqualTo(forventetFrittståendeBrevDto(fagsak).tittel)
Assertions.assertThat(frittståendeBrevSlot.captured.eksternFagsakId).isEqualTo(forventetFrittståendeBrevDto(fagsak).eksternFagsakId)
Assertions.assertThat(frittståendeBrevSlot.captured.stønadType).isEqualTo(forventetFrittståendeBrevDto(fagsak).stønadType)
Assertions.assertThat(frittståendeBrevSlot.captured.saksbehandlerIdent).isEqualTo(forventetFrittståendeBrevDto(fagsak).saksbehandlerIdent)
Assertions.assertThat(frittståendeBrevSlot.captured.journalførendeEnhet).isEqualTo(forventetFrittståendeBrevDto(fagsak).journalførendeEnhet)
Assertions.assertThat(frittståendeBrevSlot.captured.mottakere).isEqualTo(forventetFrittståendeBrevDto(fagsak).mottakere)
Assertions.assertThat(frittståendeBrevSlot.captured.fil).isEqualTo(forventetFrittståendeBrevDto(fagsak).fil)
}

private fun forventetFrittståendeBrevDto(
fagsak: Fagsak,
): FrittståendeBrevDto {
val forventetBrevMottaker =
Brevmottaker(
ident = "VL",
navn = "01010199999 mellomnavn Etternavn",
mottakerRolle = Brevmottaker.MottakerRolle.BRUKER,
identType = Brevmottaker.IdentType.PERSONIDENT,
)
val forventetPdf =
this::class.java.classLoader
.getResource("dummy/pdf_dummy.pdf")!!
.readBytes()

return FrittståendeBrevDto("01010199999", fagsak.eksternId, StønadType.OVERGANGSSTØNAD, null, "Inntekt endret for selvstendig næringsdrivende", forventetPdf, "4489", saksbehandlerIdent = "VL", listOf(forventetBrevMottaker))
}

private fun lagTestOppgave() =
no.nav.familie.kontrakter.felles.oppgave
.Oppgave(identer = listOf(OppgaveIdentV2(ident = "01010199999", gruppe = IdentGruppe.FOLKEREGISTERIDENT)))
}
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,11 @@ internal class NæringsinntektKontrollServiceTest : OppslagSpringRunnerTest() {
}
}

@Test
fun `Påminnelse om testing av selvstendig næringsdrivende (se favrokort NAV-24146)`() {
assertThat(LocalDate.now()).isBefore(LocalDate.of(2025, 10, 2))
}

private fun lagreTestdataForPersonIdent(personIdent: String) {
val fagsakTilknyttetPersonIdent = fagsak(setOf(PersonIdent(personIdent)))
testoppsettService.lagreFagsak(fagsakTilknyttetPersonIdent)
Expand Down

0 comments on commit 28d828a

Please sign in to comment.