Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/rbuc #325

Merged
merged 11 commits into from
Jan 15, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ class HentSakService(private val etterlatteService: EtterlatteService, private v
}

fun String?.erGyldigPesysNummer(): Boolean {
return this?.let { it.length == 8 && it.first() in listOf('1', '2') && it.all { char -> char.isDigit() } } ?: false
return this?.let { pesysSakId -> pesysSakId.length == 8 && pesysSakId.first() in listOf('1', '2') && pesysSakId.all { char -> char.isDigit() } }
.also { logger.info("PesysSakId er gyldig") } ?: false
.also { logger.info("PesysSakId er ikke gyldig ifht valideringsregler") }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ abstract class SedListenerBase(
alleSedIBucList
)
}
val saktype = populerSaktype(sakTypeFraSED, sakInformasjon, bucType)
return SaksInfoSamlet(saksIdFraSed, sakInformasjon, saktype)
val saktypeFraSedEllerPesys = populerSaktype(sakTypeFraSED, sakInformasjon, bucType)
return SaksInfoSamlet(saksIdFraSed, sakInformasjon, saktypeFraSedEllerPesys)
}

fun skippingOffsett(offset: Long, offsetsToSkip : List<Long>): Boolean {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ import no.nav.eessi.pensjon.oppgaverouting.SakInformasjon

data class SaksInfoSamlet(
val saksIdFraSed: String? = null,
val sakInformasjon: SakInformasjon? = null,
val saktype: SakType? = null
val sakInformasjon: SakInformasjon? = null, // Kommer fra Pesys
val saktype: SakType? = null // Kommer fra SED
MariamPervez marked this conversation as resolved.
Show resolved Hide resolved
)
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ class PersonidentifiseringService(
val identifisertPerson = try {
identifisertPersonUtvelger(identifisertePersoner, bucType, sedType, potensiellePersonRelasjoner)
} catch (fppbe: FlerePersonPaaBucException) {
logger.warn("Flere personer funnet i $bucType, returnerer null")
logger.error("Flere personer funnet i $bucType, returnerer null")
return null
}
secureLog.info("Identifisert person: $identifisertPerson")
Expand Down Expand Up @@ -198,23 +198,25 @@ class PersonidentifiseringService(

return when {
identifisertePersoner.isEmpty() -> null
bucType == R_BUC_02 -> identifisertePersoner.first().apply { personListe = identifisertePersoner.filterIndexed{ index, _ -> index != 0 } }
bucType in listOf(R_BUC_02) -> {
if(identifisertePersoner.size > 2) throw FlerePersonPaaBucException()
MariamPervez marked this conversation as resolved.
Show resolved Hide resolved
val erGjenlevendeRelasjon = potensielleSEDPersonRelasjoner.any { it.relasjon == GJENLEVENDE }
utvelgerPersonOgGjenlevForRBUC(identifisertePersoner, erGjenlevendeRelasjon)
}
bucType == P_BUC_02 -> identifisertePersoner.firstOrNull { it.personRelasjon?.relasjon == GJENLEVENDE }
bucType == P_BUC_05 -> {
val erGjenlevendeRelasjon = potensielleSEDPersonRelasjoner.any { it.relasjon == GJENLEVENDE }
utvelgerPersonOgGjenlev(identifisertePersoner, erGjenlevendeRelasjon)
}

}
bucType == P_BUC_06 -> {
val erGjenlevendeRelasjon = potensielleSEDPersonRelasjoner.any { it.relasjon in listOf(GJENLEVENDE, ANNET, BARN, FORSORGER) }
utvelgerPersonOgGjenlev(identifisertePersoner, erGjenlevendeRelasjon)
}

bucType == P_BUC_10 -> {
val erGjenlevendeYtelse = potensielleSEDPersonRelasjoner.any { it.saktype == GJENLEV }
utvelgerPersonOgGjenlev(identifisertePersoner, erGjenlevendeYtelse)
}

bucType == P_BUC_07 && (identifisertePersoner.size > 1) -> {
identifisertePersoner.firstOrNull { it.personRelasjon?.relasjon == GJENLEVENDE }
}
Expand Down Expand Up @@ -247,12 +249,34 @@ class PersonidentifiseringService(
erGjenlevende -> null
else -> {
forsikretPerson?.apply {
//TODO Fjerne personListe da den ikke er i bruk
personListe = identifisertePersoner.filterNot { it.personRelasjon?.relasjon == FORSIKRET }
}
}
}
}

//Gjelder kun for R_BUC_02
private fun utvelgerPersonOgGjenlevForRBUC(
identifisertePersoner: List<IdentifisertPDLPerson>,
erGjenlevende: Boolean
): IdentifisertPDLPerson? {
val forsikretPerson = identifisertePersoner.firstOrNull { it.personRelasjon?.relasjon == FORSIKRET }
val gjenlevendePerson = identifisertePersoner.firstOrNull { it.personRelasjon?.relasjon == GJENLEVENDE }
logger.info("Rbuc med forsikretAktoerid: ${forsikretPerson?.aktoerId}, gjenlevAktoerid: ${gjenlevendePerson?.aktoerId}, harGjenlvRelasjon: $erGjenlevende")

return when {
gjenlevendePerson != null -> gjenlevendePerson.apply { personListe = identifisertePersoner.filterNot { it.personRelasjon?.relasjon == GJENLEVENDE } }
erGjenlevende -> null
else -> {
forsikretPerson?.apply {
//TODO Fjerne personListe da den ikke er i bruk
personListe = identifisertePersoner.filterNot { it.personRelasjon?.relasjon in listOf(FORSIKRET, ANNET) }
}
}
}
}

/**
* Noen Seder kan kun inneholde forsikret person i de tilfeller benyttes den forsikrede selv om andre Sed i Buc inneholder andre personer
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ internal open class JournalforingTestBase {

protected val personService: PersonService = mockk(relaxed = true)
private val personSok = PersonSok(personService)
private val personidentifiseringService = PersonidentifiseringService(personSok, personService)
val personidentifiseringService = PersonidentifiseringService(personSok, personService)


protected val bestemSakKlient: BestemSakKlient = mockk(relaxed = true)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,249 @@
package no.nav.eessi.pensjon.integrasjonstest.saksflyt

import io.mockk.*
import no.nav.eessi.pensjon.eux.model.BucType
import no.nav.eessi.pensjon.eux.model.BucType.R_BUC_02
import no.nav.eessi.pensjon.eux.model.SedHendelse
import no.nav.eessi.pensjon.eux.model.SedType
import no.nav.eessi.pensjon.eux.model.SedType.R005
import no.nav.eessi.pensjon.eux.model.buc.SakStatus.*
import no.nav.eessi.pensjon.eux.model.buc.SakType.GJENLEV
import no.nav.eessi.pensjon.eux.model.document.SedDokumentfiler
import no.nav.eessi.pensjon.journalforing.OpprettJournalPostResponse
import no.nav.eessi.pensjon.journalforing.OpprettJournalpostRequest
import no.nav.eessi.pensjon.models.SaksInfoSamlet
import no.nav.eessi.pensjon.models.Tema.PENSJON
import no.nav.eessi.pensjon.oppgaverouting.Enhet
import no.nav.eessi.pensjon.oppgaverouting.HendelseType.MOTTATT
import no.nav.eessi.pensjon.oppgaverouting.SakInformasjon
import no.nav.eessi.pensjon.personidentifisering.IdentifisertPDLPerson
import no.nav.eessi.pensjon.personidentifisering.PersonidentifiseringService
import no.nav.eessi.pensjon.personidentifisering.relasjoner.RelasjonTestBase
import no.nav.eessi.pensjon.personoppslag.pdl.model.*
import no.nav.eessi.pensjon.shared.person.Fodselsnummer
import no.nav.eessi.pensjon.utils.mapJsonToAny
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.CsvSource
import java.time.LocalDate

@DisplayName("R_BUC_01 – IntegrationTest")
internal class RBuc02IntegrationTest : JournalforingTestBase() {

@BeforeEach
fun beforetest() {
every { etterlatteService.hentGjennySak(any()) } returns Result.failure(IllegalStateException("Uventet statuskode: 500 for sakId"))
every { gcpStorageService.hentFraGjenny(any()) } returns null

}

//I denne testen har vi alle verdier som trengs for å automatisk journalføre sed R005. Vi oppretter en BEHANDLE_SED oppgave siden hendelsestypen er MOTTATT
@Test
fun `Gitt at det kommer inn en R005 og det finnes en GJENLEVENDE på sed så skal seden journalføres på den gjenlevende`() {
val pdlPerson = IdentifisertPDLPerson(
aktoerId = "123654987321",
landkode = "NOR",
geografiskTilknytning = null,
personRelasjon = sedPersonRelasjon(Relasjon.GJENLEVENDE, "11067122781")
)

val forsoekFerdigstillSlot = slot<Boolean>()
val journalpostSlot = slot<OpprettJournalpostRequest>()

every { euxKlient.hentAlleDokumentfiler(any(), any()) } returns getDokfilerUtenVedlegg()
every { personService.hentPerson(NorskIdent(FNR_VOKSEN_UNDER_62)) } returns
JournalforingTestBase().createBrukerWith(
FNR_VOKSEN_UNDER_62,
aktorId = AKTOER_ID
)

every { journalpostKlient.opprettJournalpost(capture(journalpostSlot), capture(forsoekFerdigstillSlot), any()) } returns mockk<OpprettJournalPostResponse>()
.apply {
every { journalpostferdigstilt } returns true
every { journalpostId } returns "123456789"
}

val capturedMelding = slot<String>()
every { oppgaveHandlerKafka.sendDefault(any(), capture(capturedMelding)).get() } returns mockk()

journalforingService.journalfor(
sedHendelse = sedHendelse(),
hendelseType = MOTTATT,
identifisertPerson = pdlPerson,
fdato = LocalDate.of(1971, 6, 11),
saksInfoSamlet = SaksInfoSamlet(
saksIdFraSed = "25432122",
sakInformasjon = SakInformasjon(
sakId = "654321",
sakType = GJENLEV,
sakStatus = LOPENDE,
saksbehandlendeEnhetId = "4812",
nyopprettet = false,
tilknyttedeSaker = emptyList()
),
saktype = GJENLEV
),
harAdressebeskyttelse = false,
identifisertePersoner = 2,
navAnsattInfo = null,
currentSed = RelasjonTestBase().createR005(
forsikretFnr = null,
forsikretTilbakekreving = "forsikret_person",
annenPersonFnr = FNR_VOKSEN_UNDER_62,
)
)

verify(exactly = 1) { oppgaveHandlerKafka.sendDefault(any(), any()) }

capturedMelding.captured
assertEquals(
"""
{
"sedType" : "R005",
"journalpostId" : "123456789",
"tildeltEnhetsnr" : "4862",
"aktoerId" : "123654987321",
"rinaSakId" : "123456",
"hendelseType" : "MOTTATT",
"filnavn" : null,
"oppgaveType" : "BEHANDLE_SED",
"tema" : "PEN"
}
""".trimIndent(), capturedMelding.captured)

assertEquals(PENSJON, journalpostSlot.captured.tema)
assertEquals(FNR_VOKSEN_UNDER_62, journalpostSlot.captured.bruker?.id)
assertEquals(Enhet.NFP_UTLAND_AALESUND, journalpostSlot.captured.journalfoerendeEnhet)

}

//I denne testen mangler det verdier som trengs for å automatisk journalføre sed R005. Vi oppretter derfor en JOURNALFORINGs oppgave
@Test
fun `Gitt at det kommer inn en R005 og det finnes en FORSIKRET og en GJENLEVENDE på sed så skal seden journalføres på den gjenlevende`() {
val pdlPerson = IdentifisertPDLPerson(
aktoerId = "123654987321",
landkode = "NOR",
geografiskTilknytning = null,
personRelasjon = sedPersonRelasjon(Relasjon.GJENLEVENDE, "11067122781")
)

val forsoekFerdigstillSlot = slot<Boolean>()
val journalpostSlot = slot<OpprettJournalpostRequest>()

every { euxKlient.hentAlleDokumentfiler(any(), any()) } returns getDokfilerUtenVedlegg()
every { personService.hentPerson(NorskIdent(FNR_VOKSEN_UNDER_62)) } returns
JournalforingTestBase().createBrukerWith(
FNR_VOKSEN_UNDER_62,
aktorId = AKTOER_ID
)
every { journalpostKlient.opprettJournalpost(capture(journalpostSlot), capture(forsoekFerdigstillSlot), any()) } returns mockk<OpprettJournalPostResponse>()
.apply {
every { journalpostferdigstilt } returns false
every { journalpostId } returns "123456789"
}

val capturedMelding = slot<String>()
every { oppgaveHandlerKafka.sendDefault(any(), capture(capturedMelding)).get() } returns mockk()

journalforingService.journalfor(
sedHendelse = sedHendelse(),
hendelseType = MOTTATT,
identifisertPerson = pdlPerson,
fdato = LocalDate.of(1971, 6, 11),
saksInfoSamlet = SaksInfoSamlet(
saksIdFraSed = "25432122",
sakInformasjon = SakInformasjon(
sakId = "654321",
sakType = GJENLEV,
sakStatus = LOPENDE,
saksbehandlendeEnhetId = "4812",
nyopprettet = false,
tilknyttedeSaker = emptyList()
),
saktype = GJENLEV
),
harAdressebeskyttelse = false,
identifisertePersoner = 2,
navAnsattInfo = null,
currentSed = RelasjonTestBase().createR005(
forsikretFnr = null,
forsikretTilbakekreving = "forsikret_person",
annenPersonFnr = FNR_VOKSEN_UNDER_62,
)
)

verify(exactly = 1) { oppgaveHandlerKafka.sendDefault(any(), any()) }

capturedMelding.captured
assertEquals(
"""
{
"sedType" : "R005",
"journalpostId" : "123456789",
"tildeltEnhetsnr" : "4862",
"aktoerId" : "123654987321",
"rinaSakId" : "123456",
"hendelseType" : "MOTTATT",
"filnavn" : null,
"oppgaveType" : "JOURNALFORING",
"tema" : "PEN"
}
""".trimIndent(), capturedMelding.captured)

assertEquals(PENSJON, journalpostSlot.captured.tema)
assertEquals(FNR_VOKSEN_UNDER_62, journalpostSlot.captured.bruker?.id)
assertEquals(Enhet.NFP_UTLAND_AALESUND, journalpostSlot.captured.journalfoerendeEnhet)


}

@ParameterizedTest
@DisplayName("hentIdentfisertPerson skal returnere riktig relasjon å journalføre på for R_BUC_02")
@CsvSource(
"FORSIKRET, 09035225916, GJENLEVENDE, 11067122781, 11067122781, GJENLEVENDE",
"FORSIKRET, 09035225916, FORSIKRET, 22117320034, 09035225916, FORSIKRET"
)
fun `Gitt at det kommer en R004, R005 eller R006 i R_BUC_02 så skal identifisert person returnere gjenlevende`(personRelasjon: Relasjon, fnr: String, personRelasjonGjenlev: Relasjon, fnrGjenlev: String, forventetFnr: String, forventetRelasjon: String) {
val identifisertePersonerISed = listOf(
IdentifisertPDLPerson(AKTOER_ID, "NO", personRelasjon = sedPersonRelasjon(personRelasjon, fnr),fnr = Fodselsnummer.fra(fnr), geografiskTilknytning = null),
IdentifisertPDLPerson(AKTOER_ID_2, "NO", personRelasjon = sedPersonRelasjon(personRelasjonGjenlev, fnrGjenlev), fnr = Fodselsnummer.fra(fnrGjenlev), geografiskTilknytning = null)
)

val sedRelasjoner = listOf(
sedPersonRelasjon(personRelasjon, fnr),
sedPersonRelasjon(personRelasjonGjenlev, fnrGjenlev)
)

val actual = personidentifiseringService.hentIdentifisertPerson(R_BUC_02, R005, MOTTATT, "123456", identifisertePersonerISed, sedRelasjoner)
println("actual: $actual")

assertEquals(forventetFnr, actual?.fnr?.value)
assertEquals(forventetRelasjon, actual?.personRelasjon?.relasjon?.name)
}

private fun sedPersonRelasjon(relasjon: Relasjon, fnr: String) = SEDPersonRelasjon(
fnr = Fodselsnummer.fra(fnr),
relasjon = relasjon,
saktype = GJENLEV,
sedType = R005,
sokKriterier = null,
fdato = Fodselsnummer.fra(fnr)?.getBirthDate(),
rinaDocumentId = "654321"
)


private fun sedHendelse(sektorkode: String? = "R", bucType: BucType? = R_BUC_02, sedType: SedType? = R005) : SedHendelse {
return SedHendelse(rinaSakId = "123456", rinaDokumentId = "1234", sektorKode = sektorkode!!,
bucType = bucType, rinaDokumentVersjon = "1", sedType = sedType
)
}

private fun getDokfilerUtenVedlegg(): SedDokumentfiler {
val dokumentfilerJson = javaClass.getResource("/pdf/pdfResponseUtenVedlegg.json")!!.readText()
return mapJsonToAny(dokumentfilerJson)
}

}
Loading
Loading